From 14f36a175d3d041d12579d122c5db38d226f4a4a Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Thu, 19 May 2016 19:08:48 +0100 Subject: [PATCH] Update the display and logging on incoming YSF network data. --- Display.cpp | 5 +- Display.h | 4 +- HD44780.cpp | 3 +- HD44780.h | 2 +- Nextion.cpp | 21 ++++++- Nextion.h | 2 +- NullDisplay.cpp | 2 +- NullDisplay.h | 2 +- OLED.cpp | 2 +- OLED.h | 2 +- TFTSerial.cpp | 27 ++++++--- TFTSerial.h | 2 +- YSFControl.cpp | 158 ++++++++++++++++++++++++++++++------------------ YSFControl.h | 6 +- YSFNetwork.cpp | 9 +-- 15 files changed, 158 insertions(+), 89 deletions(-) diff --git a/Display.cpp b/Display.cpp index c19f8ac..ec525ea 100644 --- a/Display.cpp +++ b/Display.cpp @@ -131,16 +131,17 @@ void CDisplay::clearDMR(unsigned int slotNo) } } -void CDisplay::writeFusion(const char* source, const char* dest, const char* type) +void CDisplay::writeFusion(const char* source, const char* dest, const char* type, const char* origin) { assert(source != NULL); assert(dest != NULL); assert(type != NULL); + assert(origin != NULL); m_timer1.start(); m_mode1 = MODE_IDLE; - writeFusionInt(source, dest, type); + writeFusionInt(source, dest, type, origin); } void CDisplay::clearFusion() diff --git a/Display.h b/Display.h index 431a534..f6c9274 100644 --- a/Display.h +++ b/Display.h @@ -41,7 +41,7 @@ public: void writeDMR(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); void clearDMR(unsigned int slotNo); - void writeFusion(const char* source, const char* dest, const char* type); + void writeFusion(const char* source, const char* dest, const char* type, const char* origin); void clearFusion(); virtual void close() = 0; @@ -59,7 +59,7 @@ protected: virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type) = 0; virtual void clearDMRInt(unsigned int slotNo) = 0; - virtual void writeFusionInt(const char* source, const char* dest, const char* type) = 0; + virtual void writeFusionInt(const char* source, const char* dest, const char* type, const char* origin) = 0; virtual void clearFusionInt() = 0; private: diff --git a/HD44780.cpp b/HD44780.cpp index a18e098..383d8a8 100644 --- a/HD44780.cpp +++ b/HD44780.cpp @@ -593,11 +593,12 @@ void CHD44780::clearDMRInt(unsigned int slotNo) } } -void CHD44780::writeFusionInt(const char* source, const char* dest, const char* type) +void CHD44780::writeFusionInt(const char* source, const char* dest, const char* type, const char* origin) { assert(source != NULL); assert(dest != NULL); assert(type != NULL); + assert(origin != NULL); #ifdef ADAFRUIT_DISPLAY adafruitLCDColour(AC_RED); diff --git a/HD44780.h b/HD44780.h index 9f8ff3f..e37ee97 100644 --- a/HD44780.h +++ b/HD44780.h @@ -70,7 +70,7 @@ protected: virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); virtual void clearDMRInt(unsigned int slotNo); - virtual void writeFusionInt(const char* source, const char* dest, const char* type); + virtual void writeFusionInt(const char* source, const char* dest, const char* type, const char* origin); virtual void clearFusionInt(); private: diff --git a/Nextion.cpp b/Nextion.cpp index 62e255f..88371f4 100644 --- a/Nextion.cpp +++ b/Nextion.cpp @@ -181,11 +181,12 @@ void CNextion::clearDMRInt(unsigned int slotNo) } } -void CNextion::writeFusionInt(const char* source, const char* dest, const char* type) +void CNextion::writeFusionInt(const char* source, const char* dest, const char* type, const char* origin) { assert(source != NULL); assert(dest != NULL); assert(type != NULL); + assert(origin != NULL); if (m_mode != MODE_YSF) sendCommand("page YSF"); @@ -194,8 +195,20 @@ void CNextion::writeFusionInt(const char* source, const char* dest, const char* ::sprintf(text, "t0.txt=\"%s %.10s\"", type, source); sendCommand(text); - ::sprintf(text, "t1.txt=\" %.10s\"", dest); - sendCommand(text); + if (m_size == "2.4" || m_size == "3.2") { + ::sprintf(text, "t1.txt=\"%.10s\"", dest); + sendCommand(text); + if (::strcmp(origin, " ") != 0) { + ::sprintf(text, "t2.txt=\"via %.10s\"", origin); + sendCommand(text); + } + } else if (m_size == "3.5") { + if (::strcmp(origin, " ") == 0) + ::sprintf(text, "t1.txt=\"%.10s\"", dest); + else + ::sprintf(text, "t1.txt=\"%.10s <- %-10s\"", dest, origin); + sendCommand(text); + } m_mode = MODE_YSF; } @@ -204,6 +217,8 @@ void CNextion::clearFusionInt() { sendCommand("t0.txt=\"Listening\""); sendCommand("t1.txt=\"\""); + if (m_size == "2.4" || m_size == "3.2") + sendCommand("t2.txt=\"\""); } void CNextion::close() diff --git a/Nextion.h b/Nextion.h index c4221af..350d3ac 100644 --- a/Nextion.h +++ b/Nextion.h @@ -46,7 +46,7 @@ protected: virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); virtual void clearDMRInt(unsigned int slotNo); - virtual void writeFusionInt(const char* source, const char* dest, const char* type); + virtual void writeFusionInt(const char* source, const char* dest, const char* type, const char* origin); virtual void clearFusionInt(); private: diff --git a/NullDisplay.cpp b/NullDisplay.cpp index ef1e330..9eb3059 100644 --- a/NullDisplay.cpp +++ b/NullDisplay.cpp @@ -60,7 +60,7 @@ void CNullDisplay::clearDMRInt(unsigned int slotNo) { } -void CNullDisplay::writeFusionInt(const char* source, const char* dest, const char* type) +void CNullDisplay::writeFusionInt(const char* source, const char* dest, const char* type, const char* origin) { } diff --git a/NullDisplay.h b/NullDisplay.h index 880b1a6..7040157 100644 --- a/NullDisplay.h +++ b/NullDisplay.h @@ -44,7 +44,7 @@ protected: virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); virtual void clearDMRInt(unsigned int slotNo); - virtual void writeFusionInt(const char* source, const char* dest, const char* type); + virtual void writeFusionInt(const char* source, const char* dest, const char* type, const char* origin); virtual void clearFusionInt(); private: diff --git a/OLED.cpp b/OLED.cpp index 8ae707d..5efbbee 100644 --- a/OLED.cpp +++ b/OLED.cpp @@ -187,7 +187,7 @@ void COLED::clearDMRInt(unsigned int slotNo) display.display(); } -void COLED::writeFusionInt(const char* source, const char* dest, const char* type) +void COLED::writeFusionInt(const char* source, const char* dest, const char* type, const char* origin) { m_mode = MODE_YSF; display.fillRect(0, OLED_LINE1, display.width(), 10, BLACK); diff --git a/OLED.h b/OLED.h index 7e903b2..014d1fb 100644 --- a/OLED.h +++ b/OLED.h @@ -91,7 +91,7 @@ public: virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); virtual void clearDMRInt(unsigned int slotNo); - virtual void writeFusionInt(const char* source, const char* dest, const char* type); + virtual void writeFusionInt(const char* source, const char* dest, const char* type, const char* origin); virtual void clearFusionInt(); virtual void close(); diff --git a/TFTSerial.cpp b/TFTSerial.cpp index 56cc856..92e1f47 100644 --- a/TFTSerial.cpp +++ b/TFTSerial.cpp @@ -259,11 +259,12 @@ void CTFTSerial::clearDMRInt(unsigned int slotNo) } } -void CTFTSerial::writeFusionInt(const char* source, const char* dest, const char* type) +void CTFTSerial::writeFusionInt(const char* source, const char* dest, const char* type, const char* origin) { assert(source != NULL); assert(dest != NULL); assert(type != NULL); + assert(origin != NULL); if (m_mode != MODE_YSF) { // Clear the screen @@ -278,24 +279,36 @@ void CTFTSerial::writeFusionInt(const char* source, const char* dest, const char char text[30U]; ::sprintf(text, "%s %.10s", type, source); - gotoPosPixel(5U, 80U); + gotoPosPixel(5U, 70U); displayText(text); ::sprintf(text, " %.10s", dest); - gotoPosPixel(5U, 100U); + gotoPosPixel(5U, 90U); displayText(text); + if (::strcmp(origin, " ") != 0) { + ::sprintf(text, "via %.10s", origin); + gotoPosPixel(5U, 110U); + displayText(text); + } else { + gotoPosPixel(5U, 110U); + displayText(" "); + } + m_mode = MODE_YSF; } void CTFTSerial::clearFusionInt() { - gotoPosPixel(5U, 80U); - displayText(" Listening "); + gotoPosPixel(5U, 70U); + displayText(" Listening "); - gotoPosPixel(5U, 100U); - displayText(" "); + gotoPosPixel(5U, 90U); + displayText(" "); + + gotoPosPixel(5U, 110U); + displayText(" "); } void CTFTSerial::close() diff --git a/TFTSerial.h b/TFTSerial.h index 6bcf036..00e60fc 100644 --- a/TFTSerial.h +++ b/TFTSerial.h @@ -46,7 +46,7 @@ protected: virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); virtual void clearDMRInt(unsigned int slotNo); - virtual void writeFusionInt(const char* source, const char* dest, const char* type); + virtual void writeFusionInt(const char* source, const char* dest, const char* type, const char* origin); virtual void clearFusionInt(); private: diff --git a/YSFControl.cpp b/YSFControl.cpp index a15dfba..bcdc9b3 100644 --- a/YSFControl.cpp +++ b/YSFControl.cpp @@ -39,8 +39,10 @@ m_rfFrames(0U), m_netFrames(0U), m_rfErrs(0U), m_rfBits(0U), -m_source(NULL), -m_dest(NULL), +m_rfSource(NULL), +m_rfDest(NULL), +m_netSource(NULL), +m_netDest(NULL), m_payload(), m_fp(NULL) { @@ -48,10 +50,15 @@ m_fp(NULL) m_payload.setUplink(callsign); m_payload.setDownlink(callsign); + + m_netSource = new unsigned char[YSF_CALLSIGN_LENGTH]; + m_netDest = new unsigned char[YSF_CALLSIGN_LENGTH]; } CYSFControl::~CYSFControl() { + delete[] m_netSource; + delete[] m_netDest; } bool CYSFControl::writeModem(unsigned char *data) @@ -102,44 +109,44 @@ bool CYSFControl::writeModem(unsigned char *data) valid = m_payload.processHeaderData(data + 2U); + if (valid) + m_rfSource = m_payload.getSource(); + + unsigned char cm = fich.getCM(); + if (cm == YSF_CM_GROUP) { + m_rfDest = (unsigned char*)"ALL "; + } else { + if (valid) + m_rfDest = m_payload.getDest(); + } + + if (m_rfSource != NULL && m_rfDest != NULL) { + m_display->writeFusion((char*)m_rfSource, (char*)m_rfDest, " ", "R"); + LogMessage("YSF, received RF header from %10.10s to %10.10s", m_rfSource, m_rfDest); + } else if (m_rfSource == NULL && m_rfDest != NULL) { + m_display->writeFusion("??????????", (char*)m_rfDest, " ", "R"); + LogMessage("YSF, received RF header from ?????????? to %10.10s", m_rfDest); + } else if (m_rfSource != NULL && m_rfDest == NULL) { + m_display->writeFusion((char*)m_rfSource, "??????????", " ", "R"); + LogMessage("YSF, received RF header from %10.10s to ??????????", m_rfSource); + } else { + m_display->writeFusion("??????????", "??????????", " ", "R"); + LogMessage("YSF, received RF header from ?????????? to ??????????"); + } + data[0U] = TAG_DATA; data[1U] = 0x00U; writeNetwork(data); - if (m_duplex) { - fich.setMR(YSF_MR_BUSY); - fich.encode(data + 2U); - writeQueueRF(data); - } - - if (valid) - m_source = m_payload.getSource(); - - unsigned char cm = fich.getCM(); - if (cm == YSF_CM_GROUP) { - m_dest = (unsigned char*)"ALL "; - } else { - if (valid) - m_dest = m_payload.getDest(); - } - #if defined(DUMP_YSF) writeFile(data + 2U); #endif - if (m_source != NULL && m_dest != NULL) { - m_display->writeFusion((char*)m_source, (char*)m_dest, "R"); - LogMessage("YSF, received RF header from %10.10s to %10.10s", m_source, m_dest); - } else if (m_source == NULL && m_dest != NULL) { - m_display->writeFusion("??????????", (char*)m_dest, "R"); - LogMessage("YSF, received RF header from ?????????? to %10.10s", m_dest); - } else if (m_source != NULL && m_dest == NULL) { - m_display->writeFusion((char*)m_source, "??????????", "R"); - LogMessage("YSF, received RF header from %10.10s to ??????????", m_source); - } else { - m_display->writeFusion("??????????", "??????????", "R"); - LogMessage("YSF, received RF header from ?????????? to ??????????"); + if (m_duplex) { + fich.setMR(YSF_MR_BUSY); + fich.encode(data + 2U); + writeQueueRF(data); } } else if (valid && fi == YSF_FI_TERMINATOR) { CSync::addYSFSync(data + 2U); @@ -153,16 +160,16 @@ bool CYSFControl::writeModem(unsigned char *data) writeNetwork(data); +#if defined(DUMP_YSF) + writeFile(data + 2U); +#endif + if (m_duplex) { fich.setMR(YSF_MR_BUSY); fich.encode(data + 2U); writeQueueRF(data); } -#if defined(DUMP_YSF) - writeFile(data + 2U); -#endif - LogMessage("YSF, received RF end of transmission, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits)); writeEndRF(); @@ -208,36 +215,36 @@ bool CYSFControl::writeModem(unsigned char *data) bool change = false; - if (m_dest == NULL) { + if (m_rfDest == NULL) { unsigned char cm = fich.getCM(); if (cm == YSF_CM_GROUP) { - m_dest = (unsigned char*)"ALL "; + m_rfDest = (unsigned char*)"ALL "; change = true; } else if (valid) { - m_dest = m_payload.getDest(); - if (m_dest != NULL) + m_rfDest = m_payload.getDest(); + if (m_rfDest != NULL) change = true; } } - if (valid && m_source == NULL) { - m_source = m_payload.getSource(); - if (m_source != NULL) + if (valid && m_rfSource == NULL) { + m_rfSource = m_payload.getSource(); + if (m_rfSource != NULL) change = true; } if (change) { - if (m_source != NULL && m_dest != NULL) { - m_display->writeFusion((char*)m_source, (char*)m_dest, "R"); - LogMessage("YSF, received RF data from %10.10s to %10.10s", m_source, m_dest); + if (m_rfSource != NULL && m_rfDest != NULL) { + m_display->writeFusion((char*)m_rfSource, (char*)m_rfDest, " ", "R"); + LogMessage("YSF, received RF data from %10.10s to %10.10s", m_rfSource, m_rfDest); } - if (m_source != NULL && m_dest == NULL) { - m_display->writeFusion((char*)m_source, "??????????", "R"); - LogMessage("YSF, received RF data from %10.10s to ??????????", m_source); + if (m_rfSource != NULL && m_rfDest == NULL) { + m_display->writeFusion((char*)m_rfSource, "??????????", " ", "R"); + LogMessage("YSF, received RF data from %10.10s to ??????????", m_rfSource); } - if (m_source == NULL && m_dest != NULL) { - m_display->writeFusion("??????????", (char*)m_dest, "R"); - LogMessage("YSF, received RF data from ?????????? to %10.10s", m_dest); + if (m_rfSource == NULL && m_rfDest != NULL) { + m_display->writeFusion("??????????", (char*)m_rfDest, " ", "R"); + LogMessage("YSF, received RF data from ?????????? to %10.10s", m_rfDest); } } @@ -303,8 +310,8 @@ void CYSFControl::writeEndRF() m_payload.reset(); // These variables are free'd by YSFPayload - m_source = NULL; - m_dest = NULL; + m_rfSource = NULL; + m_rfDest = NULL; if (m_netState == RS_NET_IDLE) { m_display->clearFusion(); @@ -344,18 +351,51 @@ void CYSFControl::writeNetwork() m_networkWatchdog.start(); if (!m_netTimeoutTimer.isRunning()) { - m_display->writeFusion("??????????", "??????????", "N"); - LogMessage("YSF, received network data from ?????????? to ??????????"); + if (::memcmp(data + 14U, " ", YSF_CALLSIGN_LENGTH) != 0) + ::memcpy(m_netSource, data + 14U, YSF_CALLSIGN_LENGTH); + else + ::memcpy(m_netSource, "??????????", YSF_CALLSIGN_LENGTH); + + if (::memcmp(data + 24U, " ", YSF_CALLSIGN_LENGTH) != 0) + ::memcpy(m_netDest, data + 24U, YSF_CALLSIGN_LENGTH); + else + ::memcpy(m_netDest, "??????????", YSF_CALLSIGN_LENGTH); + + m_display->writeFusion((char*)m_netSource, (char*)m_netDest, (char*)(data + 4U), "N"); + LogMessage("YSF, received network data from %10.10s to %10.10s at %10.10s", m_netSource, m_netDest, data + 4U); + m_netTimeoutTimer.start(); m_holdoffTimer.start(); m_netState = RS_NET_AUDIO; m_netFrames = 0U; + } else { + bool changed = false; + + if (::memcmp(data + 14U, " ", YSF_CALLSIGN_LENGTH) != 0 && ::memcmp(m_netSource, "??????????", YSF_CALLSIGN_LENGTH) == 0) { + ::memcpy(m_netSource, data + 14U, YSF_CALLSIGN_LENGTH); + changed = true; + } + + if (::memcmp(data + 24U, " ", YSF_CALLSIGN_LENGTH) != 0 && ::memcmp(m_netDest, "??????????", YSF_CALLSIGN_LENGTH) == 0) { + ::memcpy(m_netDest, data + 24U, YSF_CALLSIGN_LENGTH); + changed = true; + } + + if (changed) { + m_display->writeFusion((char*)m_netSource, (char*)m_netDest, (char*)(data + 4U), "N"); + LogMessage("YSF, received network data from %10.10s to %10.10s from %10.10s", m_netSource, m_netDest, data + 4U); + } } m_netFrames++; + bool end = data[34U] == 0x01U; + + data[33U] = end ? TAG_EOT : TAG_DATA; + data[34U] = 0x00U; + CYSFFICH fich; - bool valid = fich.decode(data + 2U); + bool valid = fich.decode(data + 35U); if (valid) { // XXX Should set the downlink callsign fich.setVoIP(true); @@ -363,9 +403,9 @@ void CYSFControl::writeNetwork() fich.encode(data + 2U); } - writeQueueNet(data); + writeQueueNet(data + 33U); - if (data[0U] == TAG_EOT) { + if (end) { LogMessage("YSF, received network end of transmission, %.1f seconds", float(m_netFrames) / 10.0F); writeEndNet(); } @@ -446,7 +486,7 @@ void CYSFControl::writeNetwork(const unsigned char *data) if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired()) return; - m_network->write(m_source, m_dest, data + 2U, data[0U] == TAG_EOT); + m_network->write(m_rfSource, m_rfDest, data + 2U, data[0U] == TAG_EOT); } bool CYSFControl::openFile() diff --git a/YSFControl.h b/YSFControl.h index 251c646..0ac2a3d 100644 --- a/YSFControl.h +++ b/YSFControl.h @@ -56,8 +56,10 @@ private: unsigned int m_netFrames; unsigned int m_rfErrs; unsigned int m_rfBits; - unsigned char* m_source; - unsigned char* m_dest; + unsigned char* m_rfSource; + unsigned char* m_rfDest; + unsigned char* m_netSource; + unsigned char* m_netDest; CYSFPayload m_payload; FILE* m_fp; diff --git a/YSFNetwork.cpp b/YSFNetwork.cpp index 3e3be7c..874600a 100644 --- a/YSFNetwork.cpp +++ b/YSFNetwork.cpp @@ -164,10 +164,7 @@ void CYSFNetwork::clock(unsigned int ms) if (end) ::memset(m_tag, ' ', YSF_CALLSIGN_LENGTH); - buffer[33U] = end ? TAG_EOT : TAG_DATA; - buffer[34U] = 0x00U; - - m_buffer.addData(buffer + 33U, YSF_FRAME_LENGTH_BYTES + 2U); + m_buffer.addData(buffer, 155U); } unsigned int CYSFNetwork::read(unsigned char* data) @@ -177,9 +174,9 @@ unsigned int CYSFNetwork::read(unsigned char* data) if (m_buffer.isEmpty()) return 0U; - m_buffer.getData(data, YSF_FRAME_LENGTH_BYTES + 2U); + m_buffer.getData(data, 155U); - return YSF_FRAME_LENGTH_BYTES + 2U; + return 155U; } void CYSFNetwork::reset()