CUnixDgramReader::Read and CQnetModem::ProcessGateway improvements

pull/14/head
Tom Early 7 years ago
parent 4b510bc682
commit f6635edbb7

@ -42,10 +42,9 @@
#include <chrono> #include <chrono>
#include "QnetModem.h" #include "QnetModem.h"
#include "QnetTypeDefs.h"
#include "QnetConfigure.h" #include "QnetConfigure.h"
#define MODEM_VERSION "QnetModem-0.1.1" #define MODEM_VERSION "QnetModem-0.1.2"
#define MAX_RESPONSES 30 #define MAX_RESPONSES 30
std::atomic<bool> CQnetModem::keep_running(true); std::atomic<bool> CQnetModem::keep_running(true);
@ -513,17 +512,20 @@ void CQnetModem::Run(const char *cfgfile)
} }
if (keep_running && FD_ISSET(ug2m, &readfds)) { if (keep_running && FD_ISSET(ug2m, &readfds)) {
unsigned char buf[100]; SDSVT dsvt;
ssize_t len = Gate2Modem.Read(buf, 100); ssize_t len = Gate2Modem.Read(dsvt.title, sizeof(SDSVT));
if (len < 0) { if (len <= 0) {
printf("ERROR: Run: recvfrom(gsock) returned error %d, %s\n", errno, strerror(errno));
break; break;
} }
if (0 == memcmp(buf, "DSVT", 4)) { if (0 == memcmp(dsvt.title, "DSVT", 4) && dsvt.id==0x20U && (dsvt.config==0x10U || dsvt.config==0x20U) && (len==56 || len==27)) {
//printf("read %d bytes from QnetGateway\n", (int)len); ProcessGateway(dsvt);
if (ProcessGateway(len, buf)) } else {
fprintf(stderr, "Unexpected data, returned %d bytes from the gateway: %02x", int(len), *dsvt.title);
for (ssize_t i=1; i<len; i++)
fprintf(stderr, " %02x", *(dsvt.title + int(i)));
fprintf(stderr, "\n");
break; break;
} }
FD_CLR(ug2m, &readfds); FD_CLR(ug2m, &readfds);
@ -581,16 +583,12 @@ int CQnetModem::SendToModem(const unsigned char *buf)
return length; return length;
} }
bool CQnetModem::ProcessGateway(const int len, const unsigned char *raw) void CQnetModem::ProcessGateway(const SDSVT &dsvt)
{ {
static std::string superframe; static std::string superframe;
if (27==len || 56==len) { //here is dstar data
SDSVT dsvt;
memcpy(dsvt.title, raw, len); // transfer raw data to SDSVT struct
SMODEM frame; // destination SMODEM frame; // destination
frame.start = FRAME_START; frame.start = FRAME_START;
if (56 == len) { // write a Header packet if (0x10U == dsvt.config) { // write a Header packet
superframe.clear(); superframe.clear();
frame.length = 44U; frame.length = 44U;
frame.type = TYPE_HEADER; frame.type = TYPE_HEADER;
@ -640,11 +638,6 @@ bool CQnetModem::ProcessGateway(const int len, const unsigned char *raw)
PacketWait.start(); PacketWait.start();
} }
} }
} else {
if (LOG_DEBUG)
printf("From gateway: unusual packet size len=%d\n", len);
}
return false;
} }
bool CQnetModem::ProcessModem(const SMODEM &frame) bool CQnetModem::ProcessModem(const SMODEM &frame)

@ -26,6 +26,7 @@
#include <netinet/in.h> #include <netinet/in.h>
#include "Random.h" // for streamid generation #include "Random.h" // for streamid generation
#include "UnixDgramSocket.h" #include "UnixDgramSocket.h"
#include "QnetTypeDefs.h"
#define CALL_SIZE 8 #define CALL_SIZE 8
#define IP_SIZE 15 #define IP_SIZE 15
@ -213,7 +214,7 @@ private:
bool VoicePacketIsSync(const unsigned char *); bool VoicePacketIsSync(const unsigned char *);
bool Initialize(const char *cfgfile); bool Initialize(const char *cfgfile);
static void SignalCatch(const int signum); static void SignalCatch(const int signum);
bool ProcessGateway(const int len, const unsigned char *raw); void ProcessGateway(const SDSVT &dsvt);
bool ProcessModem(const SMODEM &frame); bool ProcessModem(const SMODEM &frame);
int OpenModem(); int OpenModem();
int SendToModem(const unsigned char *buf); int SendToModem(const unsigned char *buf);

@ -62,9 +62,12 @@ bool CUnixDgramReader::Open(const char *path) // returns true on failure
ssize_t CUnixDgramReader::Read(void *buf, size_t size) ssize_t CUnixDgramReader::Read(void *buf, size_t size)
{ {
if (fd >= 0) if (fd < 0)
return read(fd, buf, size);
return -1; return -1;
ssize_t len = read(fd, buf, size);
if (len < 1)
fprintf(stderr, "CUnixDgramReader::Read read() returned %d: %s\n", int(len), strerror(errno));
return len;
} }
void CUnixDgramReader::Close() void CUnixDgramReader::Close()

Loading…
Cancel
Save

Powered by TurnKey Linux.