Work in progress.

merge-requests/1/head
Teuniz 2015-06-28 11:30:25 +02:00
rodzic 6e8e11f8cd
commit 797d3374d5
6 zmienionych plików z 422 dodań i 269 usunięć

Wyświetl plik

@ -29,17 +29,11 @@
#include "connection.h"
#define TMC_LAN_TIMEOUT 5000
#define MAX_CMD_LEN (255)
#define MAX_RESP_LEN (1024 * 1024 * 2)
int tmc_connection_type;
struct tmcdev *tmc_device;
QTcpSocket *sck;
@ -53,303 +47,61 @@ struct tmcdev * tmc_open_usb(const char *device)
}
struct tmcdev * tmc_open_lan(const char *address)
{
tmc_connection_type = 1;
tmc_device = tmclan_open(address);
return tmc_device;
}
void tmc_close(void)
{
if(tmc_connection_type == 0)
{
tmcdev_close(tmc_device);
tmc_device = NULL;
}
else
{
if(sck != NULL)
{
sck->abort();
delete sck;
sck = NULL;
}
if(tmc_device != NULL)
{
free(tmc_device->hdrbuf);
free(tmc_device);
tmc_device = NULL;
}
tmclan_close(tmc_device);
}
tmc_device = NULL;
}
int tmc_write(const char *cmd)
{
int qry=0;
char buf[MAX_CMD_LEN + 16],
str[256];
if(tmc_connection_type == 0)
{
return tmcdev_write(tmc_device, cmd);
}
else
{
if(sck == NULL)
{
return -1;
}
if(strlen(cmd) > MAX_CMD_LEN)
{
printf("tmc_lan error: command too long\n");
return -1;
}
if(strlen(cmd) < 2)
{
printf("tmc_lan error: command too short\n");
return -1;
}
if(cmd[strlen(cmd) - 1] == '?')
{
qry = 1;
}
strncpy(buf, cmd, MAX_CMD_LEN);
buf[MAX_CMD_LEN] = 0;
strcat(buf, "\n");
if(!(!strncmp(buf, ":TRIG:STAT?", 11) ||
!strncmp(buf, ":TRIG:SWE?", 10) ||
!strncmp(buf, ":WAV:DATA?", 10) ||
!strncmp(buf, ":WAV:MODE NORM", 14) ||
!strncmp(buf, ":WAV:FORM BYTE", 14) ||
!strncmp(buf, ":WAV:SOUR CHAN", 14) ||
!strncmp(buf, ":TRIG:SWE?", 10) ||
!strncmp(buf, ":ACQ:SRAT?", 10) ||
!strncmp(buf, ":ACQ:MDEP?", 10) ||
!strncmp(buf, ":MEAS:COUN:VAL?", 15)))
{
printf("tmc_lan write: %s", buf);
}
sck->write(buf);
if(sck->waitForBytesWritten(TMC_LAN_TIMEOUT) == false)
{
return -1;
}
if(!qry)
{
for(int i=0; i<20; i++)
{
usleep(50000);
sck->write("*OPC?\n");
if(sck->waitForBytesWritten(TMC_LAN_TIMEOUT) == false)
{
return -1;
}
if(sck->waitForReadyRead(TMC_LAN_TIMEOUT) == false)
{
return -1;
}
if(sck->read(str, 128) == 2)
{
if(str[0] == '1')
{
break;
}
}
}
}
return strlen(cmd);
return tmclan_write(tmc_device, cmd);
}
return -1;
}
/*
* TMC Blockheader ::= #NXXXXXX: is used to describe
* the length of the data stream, wherein, # is the start denoter of
* the data stream; N is less than or equal to 9; the N figures
* followed N represents the length of the data stream in bytes.
* For example, #9001152054. Wherein, N is 9 and 001152054
* represents that the data stream contains 1152054 bytes
* effective data.
*/
int tmc_read(void)
{
int size, size2, len;
char blockhdr[32];
if(tmc_connection_type == 0)
{
return tmcdev_read(tmc_device);
}
else
{
if(sck == NULL)
{
return -1;
}
tmc_device->hdrbuf[0] = 0;
tmc_device->sz = 0;
size = 0;
while(1)
{
if(sck->waitForReadyRead(TMC_LAN_TIMEOUT) == false)
{
return -1;
}
size += sck->read(tmc_device->hdrbuf + size, MAX_RESP_LEN - size);
if(tmc_device->hdrbuf[size - 1] == '\n')
{
break;
}
}
if((size < 2) || (size > MAX_RESP_LEN))
{
tmc_device->hdrbuf[0] = 0;
tmc_device->buf[0] = 0;
return -1;
}
if(size >= 0)
{
tmc_device->hdrbuf[size] = 0;
}
if(size == 0)
{
return 0;
}
if(tmc_device->hdrbuf[0] != '#')
{
if(tmc_device->hdrbuf[size - 1] == '\n')
{
tmc_device->hdrbuf[--size] = 0;
}
tmc_device->buf = tmc_device->hdrbuf;
tmc_device->sz = size;
return tmc_device->sz;
}
strncpy(blockhdr, tmc_device->hdrbuf, 16);
len = blockhdr[1] - '0';
if((len < 1) || (len > 9))
{
blockhdr[31] = 0;
return -1;
}
blockhdr[len + 2] = 0;
size2 = atoi(blockhdr + 2);
size--; // remove the last character
if(size < size2)
{
blockhdr[31] = 0;
return -1;
}
tmc_device->buf = tmc_device->hdrbuf + len + 2;
tmc_device->sz = size2;
return tmc_device->sz;
return tmclan_read(tmc_device);
}
return -1;
}
struct tmcdev * tmc_open_lan(const char *address)
{
tmc_connection_type = 1;
sck = new QTcpSocket;
QApplication::setOverrideCursor(Qt::WaitCursor);
qApp->processEvents();
sck->connectToHost(address, 5555);
qApp->processEvents();
if(sck->waitForConnected(TMC_LAN_TIMEOUT) == false)
{
sck->abort();
delete sck;
sck = NULL;
QApplication::restoreOverrideCursor();
return NULL;
}
QApplication::restoreOverrideCursor();
qApp->processEvents();
tmc_device = (struct tmcdev *)calloc(1, sizeof(struct tmcdev));
if(tmc_device == NULL)
{
sck->abort();
delete sck;
sck = NULL;
return NULL;
}
tmc_device->hdrbuf = (char *)calloc(1, MAX_RESP_LEN + 1024);
if(tmc_device->hdrbuf == NULL)
{
free(tmc_device);
sck->abort();
delete sck;
sck = NULL;
return NULL;
}
tmc_device->buf = tmc_device->hdrbuf;
return tmc_device;
}

Wyświetl plik

@ -29,11 +29,6 @@
#ifndef DSR_CONNECTION_H
#define DSR_CONNECTION_H
#include <QtGlobal>
#include <QApplication>
#include <QObject>
#include <QTcpSocket>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -45,6 +40,7 @@
#include "global.h"
#include "tmc_dev.h"
#include "tmc_lan.h"
#include "utils.h"

Wyświetl plik

@ -24,6 +24,7 @@ HEADERS += about_dialog.h
HEADERS += utils.h
HEADERS += connection.h
HEADERS += tmc_dev.h
HEADERS += tmc_lan.h
HEADERS += tled.h
HEADERS += edflib.h
HEADERS += signalcurve.h
@ -39,6 +40,7 @@ SOURCES += about_dialog.cpp
SOURCES += utils.c
SOURCES += connection.cpp
SOURCES += tmc_dev.c
SOURCES += tmc_lan.cpp
SOURCES += tled.cpp
SOURCES += edflib.c
SOURCES += signalcurve.cpp

Wyświetl plik

@ -31,7 +31,7 @@
#define PROGRAM_NAME "DSRemote"
#define PROGRAM_VERSION "0.20_1506272330"
#define PROGRAM_VERSION "0.20_1506281129"
#define MAX_PATHLEN 4096

324
tmc_lan.cpp 100644
Wyświetl plik

@ -0,0 +1,324 @@
/*
***************************************************************************
*
* Author: Teunis van Beelen
*
* Copyright (C) 2015 Teunis van Beelen
*
* Email: teuniz@gmail.com
*
***************************************************************************
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
***************************************************************************
*/
#include "tmc_lan.h"
#define TMC_LAN_TIMEOUT 5000
#define MAX_CMD_LEN (255)
#define MAX_RESP_LEN (1024 * 1024 * 2)
QTcpSocket *sck;
struct tmcdev * tmclan_open(const char *address)
{
struct tmcdev *tmc_device;
sck = new QTcpSocket;
QApplication::setOverrideCursor(Qt::WaitCursor);
qApp->processEvents();
sck->connectToHost(address, 5555);
qApp->processEvents();
if(sck->waitForConnected(TMC_LAN_TIMEOUT) == false)
{
sck->abort();
delete sck;
sck = NULL;
QApplication::restoreOverrideCursor();
return NULL;
}
QApplication::restoreOverrideCursor();
qApp->processEvents();
tmc_device = (struct tmcdev *)calloc(1, sizeof(struct tmcdev));
if(tmc_device == NULL)
{
sck->abort();
delete sck;
sck = NULL;
return NULL;
}
tmc_device->hdrbuf = (char *)calloc(1, MAX_RESP_LEN + 1024);
if(tmc_device->hdrbuf == NULL)
{
free(tmc_device);
sck->abort();
delete sck;
sck = NULL;
return NULL;
}
tmc_device->buf = tmc_device->hdrbuf;
return tmc_device;
}
void tmclan_close(struct tmcdev *tmc_device)
{
if(sck != NULL)
{
sck->abort();
delete sck;
sck = NULL;
}
if(tmc_device != NULL)
{
free(tmc_device->hdrbuf);
free(tmc_device);
tmc_device = NULL;
}
}
int tmclan_write(struct tmcdev *tmc_device __attribute__ ((unused)), const char *cmd)
{
int qry=0;
char buf[MAX_CMD_LEN + 16],
str[256];
if(sck == NULL)
{
return -1;
}
if(strlen(cmd) > MAX_CMD_LEN)
{
printf("tmc_lan error: command too long\n");
return -1;
}
if(strlen(cmd) < 2)
{
printf("tmc_lan error: command too short\n");
return -1;
}
if(cmd[strlen(cmd) - 1] == '?')
{
qry = 1;
}
strncpy(buf, cmd, MAX_CMD_LEN);
buf[MAX_CMD_LEN] = 0;
strcat(buf, "\n");
if(!(!strncmp(buf, ":TRIG:STAT?", 11) ||
!strncmp(buf, ":TRIG:SWE?", 10) ||
!strncmp(buf, ":WAV:DATA?", 10) ||
!strncmp(buf, ":WAV:MODE NORM", 14) ||
!strncmp(buf, ":WAV:FORM BYTE", 14) ||
!strncmp(buf, ":WAV:SOUR CHAN", 14) ||
!strncmp(buf, ":TRIG:SWE?", 10) ||
!strncmp(buf, ":ACQ:SRAT?", 10) ||
!strncmp(buf, ":ACQ:MDEP?", 10) ||
!strncmp(buf, ":MEAS:COUN:VAL?", 15)))
{
printf("tmc_lan write: %s", buf);
}
sck->write(buf);
if(sck->waitForBytesWritten(TMC_LAN_TIMEOUT) == false)
{
return -1;
}
if(!qry)
{
for(int i=0; i<20; i++)
{
usleep(50000);
sck->write("*OPC?\n");
if(sck->waitForBytesWritten(TMC_LAN_TIMEOUT) == false)
{
return -1;
}
if(sck->waitForReadyRead(TMC_LAN_TIMEOUT) == false)
{
return -1;
}
if(sck->read(str, 128) == 2)
{
if(str[0] == '1')
{
break;
}
}
}
}
return strlen(cmd);
}
/*
* TMC Blockheader ::= #NXXXXXX: is used to describe
* the length of the data stream, wherein, # is the start denoter of
* the data stream; N is less than or equal to 9; the N figures
* followed N represents the length of the data stream in bytes.
* For example, #9001152054. Wherein, N is 9 and 001152054
* represents that the data stream contains 1152054 bytes
* effective data.
*/
int tmclan_read(struct tmcdev *tmc_device)
{
int size, size2, len;
char blockhdr[32];
if(sck == NULL)
{
return -1;
}
tmc_device->hdrbuf[0] = 0;
tmc_device->sz = 0;
size = 0;
while(1)
{
if(sck->waitForReadyRead(TMC_LAN_TIMEOUT) == false)
{
return -1;
}
size += sck->read(tmc_device->hdrbuf + size, MAX_RESP_LEN - size);
if(tmc_device->hdrbuf[size - 1] == '\n')
{
break;
}
}
if((size < 2) || (size > MAX_RESP_LEN))
{
tmc_device->hdrbuf[0] = 0;
tmc_device->buf[0] = 0;
return -1;
}
if(size >= 0)
{
tmc_device->hdrbuf[size] = 0;
}
if(size == 0)
{
return 0;
}
if(tmc_device->hdrbuf[0] != '#')
{
if(tmc_device->hdrbuf[size - 1] == '\n')
{
tmc_device->hdrbuf[--size] = 0;
}
tmc_device->buf = tmc_device->hdrbuf;
tmc_device->sz = size;
return tmc_device->sz;
}
strncpy(blockhdr, tmc_device->hdrbuf, 16);
len = blockhdr[1] - '0';
if((len < 1) || (len > 9))
{
blockhdr[31] = 0;
return -1;
}
blockhdr[len + 2] = 0;
size2 = atoi(blockhdr + 2);
size--; // remove the last character
if(size < size2)
{
blockhdr[31] = 0;
return -1;
}
tmc_device->buf = tmc_device->hdrbuf + len + 2;
tmc_device->sz = size2;
return tmc_device->sz;
}

79
tmc_lan.h 100644
Wyświetl plik

@ -0,0 +1,79 @@
/*
***************************************************************************
*
* Author: Teunis van Beelen
*
* Copyright (C) 2015 Teunis van Beelen
*
* Email: teuniz@gmail.com
*
***************************************************************************
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
***************************************************************************
*/
#ifndef TMC_LAN_H
#define TMC_LAN_H
#include <QtGlobal>
#include <QApplication>
#include <QObject>
#include <QTcpSocket>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "global.h"
#include "tmc_dev.h"
#include "utils.h"
struct tmcdev * tmclan_open(const char *);
void tmclan_close(struct tmcdev *);
int tmclan_write(struct tmcdev *, const char *);
int tmclan_read(struct tmcdev *);
#endif