diff --git a/QnetModem.cpp b/QnetModem.cpp index 5c1a4c1..da6be97 100644 --- a/QnetModem.cpp +++ b/QnetModem.cpp @@ -42,10 +42,9 @@ #include #include "QnetModem.h" -#include "QnetTypeDefs.h" #include "QnetConfigure.h" -#define MODEM_VERSION "QnetModem-0.1.1" +#define MODEM_VERSION "QnetModem-0.1.2" #define MAX_RESPONSES 30 std::atomic CQnetModem::keep_running(true); @@ -513,18 +512,21 @@ void CQnetModem::Run(const char *cfgfile) } if (keep_running && FD_ISSET(ug2m, &readfds)) { - unsigned char buf[100]; - ssize_t len = Gate2Modem.Read(buf, 100); + SDSVT dsvt; + ssize_t len = Gate2Modem.Read(dsvt.title, sizeof(SDSVT)); - if (len < 0) { - printf("ERROR: Run: recvfrom(gsock) returned error %d, %s\n", errno, strerror(errno)); + if (len <= 0) { break; } - if (0 == memcmp(buf, "DSVT", 4)) { - //printf("read %d bytes from QnetGateway\n", (int)len); - if (ProcessGateway(len, buf)) - break; + if (0 == memcmp(dsvt.title, "DSVT", 4) && dsvt.id==0x20U && (dsvt.config==0x10U || dsvt.config==0x20U) && (len==56 || len==27)) { + ProcessGateway(dsvt); + } else { + fprintf(stderr, "Unexpected data, returned %d bytes from the gateway: %02x", int(len), *dsvt.title); + for (ssize_t i=1; i 65) { - printf("Frame order: %s\n", superframe.c_str()); - superframe.clear(); - } - const char *ch = "#abcdefghijklmnopqrstuvwxyz"; - superframe.append(1, (ctrl<27U) ? ch[ctrl] : '%'); - } else { - const char *ch = "!ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - superframe.append(1, (ctrl<27U) ? ch[ctrl] : '*'); + SMODEM frame; // destination + frame.start = FRAME_START; + if (0x10U == dsvt.config) { // write a Header packet + superframe.clear(); + frame.length = 44U; + frame.type = TYPE_HEADER; + memcpy(frame.header.flag, dsvt.hdr.flag, 3); + memcpy(frame.header.r1, dsvt.hdr.rpt2, 8); + memcpy(frame.header.r2, dsvt.hdr.rpt1, 8); + memcpy(frame.header.ur, dsvt.hdr.urcall, 8); + memcpy(frame.header.my, dsvt.hdr.mycall, 8); + memcpy(frame.header.nm, dsvt.hdr.sfx, 4); + memcpy(frame.header.pfcs, dsvt.hdr.pfcs, 2); + queue.push(CFrame(&frame.start)); + PacketWait.start(); + g2_is_active = true; + if (LOG_QSO) + printf("Queued to %s flags=%02x:%02x:%02x ur=%.8s r1=%.8s r2=%.8s my=%.8s/%.4s\n", MODEM_DEVICE.c_str(), frame.header.flag[0], frame.header.flag[1], frame.header.flag[2], frame.header.ur, frame.header.r2, frame.header.r1, frame.header.my, frame.header.nm); + } else { // write a voice data packet + if (g2_is_active) { + //const unsigned char sdsync[3] = { 0x55U, 0x2DU, 0x16U }; + if (dsvt.ctrl & 0x40U) { + if (LOG_DEBUG && superframe.size()) + printf("Final order: %s\n", superframe.c_str()); + frame.length = 3U; + frame.type = TYPE_EOT; + g2_is_active = false; + if (LOG_QSO) + printf("Queued modem end of transmission\n"); + } else { + frame.length = 15U; + frame.type = TYPE_DATA; + memcpy(frame.voice.ambe, dsvt.vasd.voice, 12); + if (LOG_DEBUG) { + const unsigned int ctrl = dsvt.ctrl & 0x3FU; + if (VoicePacketIsSync(dsvt.vasd.text)) { + if (superframe.size() > 65) { + printf("Frame order: %s\n", superframe.c_str()); + superframe.clear(); } + const char *ch = "#abcdefghijklmnopqrstuvwxyz"; + superframe.append(1, (ctrl<27U) ? ch[ctrl] : '%'); + } else { + const char *ch = "!ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + superframe.append(1, (ctrl<27U) ? ch[ctrl] : '*'); } } - queue.push(CFrame(&frame.start)); - PacketWait.start(); } + queue.push(CFrame(&frame.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) diff --git a/QnetModem.h b/QnetModem.h index 3b87534..5b55559 100644 --- a/QnetModem.h +++ b/QnetModem.h @@ -26,6 +26,7 @@ #include #include "Random.h" // for streamid generation #include "UnixDgramSocket.h" +#include "QnetTypeDefs.h" #define CALL_SIZE 8 #define IP_SIZE 15 @@ -213,7 +214,7 @@ private: bool VoicePacketIsSync(const unsigned char *); bool Initialize(const char *cfgfile); 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); int OpenModem(); int SendToModem(const unsigned char *buf); diff --git a/UnixDgramSocket.cpp b/UnixDgramSocket.cpp index d0eb516..e494619 100644 --- a/UnixDgramSocket.cpp +++ b/UnixDgramSocket.cpp @@ -62,9 +62,12 @@ bool CUnixDgramReader::Open(const char *path) // returns true on failure ssize_t CUnixDgramReader::Read(void *buf, size_t size) { - if (fd >= 0) - return read(fd, buf, size); - return -1; + if (fd < 0) + 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()