From 8d7854999b2d852d4b818d30db67661a737b350b Mon Sep 17 00:00:00 2001 From: root Date: Fri, 5 Jun 2020 11:34:16 +0100 Subject: [PATCH 01/11] Updating to add the extra user configurable fields --- DMR2YSF/Conf.cpp | 91 +++++++++++++++++++++++++++++++++++ DMR2YSF/Conf.h | 22 +++++++++ DMR2YSF/DMR2YSF.cpp | 104 ++++++++++++++++++++-------------------- DMR2YSF/DMR2YSF.ini | 12 +++++ DMR2YSF/Version.h | 2 +- DMR2YSF/YSFFICH.cpp | 6 +++ YSF2DMR/Conf.cpp | 91 +++++++++++++++++++++++++++++++++++ YSF2DMR/Conf.h | 24 +++++++++- YSF2DMR/Version.h | 2 +- YSF2DMR/YSF2DMR.cpp | 112 +++++++++++++++++--------------------------- YSF2DMR/YSF2DMR.ini | 12 +++++ 11 files changed, 352 insertions(+), 126 deletions(-) diff --git a/DMR2YSF/Conf.cpp b/DMR2YSF/Conf.cpp index 1858a65..0f8cdbf 100644 --- a/DMR2YSF/Conf.cpp +++ b/DMR2YSF/Conf.cpp @@ -107,6 +107,8 @@ bool CConf::read() // Remove quotes from the value size_t len = ::strlen(value); + char *t; + unsigned char tokencnt = 0; if (len > 1U && *value == '"' && value[len - 1U] == '"') { value[len - 1U] = '\0'; value++; @@ -132,6 +134,40 @@ bool CConf::read() m_daemon = ::atoi(value) == 1; else if (::strcmp(key, "Debug") == 0) m_debug = ::atoi(value) == 1; + else if (::strcmp(key, "RadioID") == 0) + ::memcpy(m_ysfRadioID, value, 5); + else if (::strcmp(key, "FICHCallsign") == 0) + m_fichCallSign = ::atoi(value); + else if (::strcmp(key, "FICHCallMode") == 0) + m_fichCallMode = ::atoi(value); + else if (::strcmp(key, "FICHFrameTotal") == 0) + m_fichFrameTotal = ::atoi(value); + else if (::strcmp(key, "FICHMessageRoute") == 0) + m_fichMessageRoute = ::atoi(value); + else if (::strcmp(key, "FICHVOIP") == 0) + m_fichVOIP = ::atoi(value); + else if (::strcmp(key, "FICHDataType") == 0) + m_fichDataType = ::atoi(value); + else if (::strcmp(key, "FICHSQLType") == 0) + m_fichSQLType = ::atoi(value); + else if (::strcmp(key, "FICHSQLCode") == 0) + m_fichSQLCode = ::atoi(value); + else if (::strcmp(key, "DT1") == 0){ + tokencnt = 0; + while((t = strtok_r(value, ",", &value)) != NULL){ + if(tokencnt < 10){ + m_ysfDT1[tokencnt++] = atoi(t); + } + } + } + else if (::strcmp(key, "DT2") == 0){ + tokencnt = 0; + while((t = strtok_r(value, ",", &value)) != NULL){ + if(tokencnt < 10){ + m_ysfDT2[tokencnt++] = atoi(t); + } + } + } } else if (section == SECTION_DMR_NETWORK) { if (::strcmp(key, "Id") == 0) m_dmrId = (unsigned int)::atoi(value); @@ -213,6 +249,61 @@ bool CConf::getDebug() const return m_debug; } +unsigned char CConf::getFICHCallSign() const +{ + return m_fichCallSign; +} + +unsigned char CConf::getFICHCallMode() const +{ + return m_fichCallMode; +} + +unsigned char CConf::getFICHFrameTotal() const +{ + return m_fichFrameTotal; +} + +unsigned char CConf::getFICHMessageRoute() const +{ + return m_fichMessageRoute; +} + +unsigned char CConf::getFICHVOIP() const +{ + return m_fichVOIP; +} + +unsigned char CConf::getFICHDataType() const +{ + return m_fichDataType; +} + +unsigned char CConf::getFICHSQLType() const +{ + return m_fichSQLType; +} + +unsigned char CConf::getFICHSQLCode() const +{ + return m_fichSQLCode; +} + +unsigned char* CConf::getYsfDT1() +{ + return m_ysfDT1; +} + +unsigned char* CConf::getYsfDT2() +{ + return m_ysfDT2; +} + +char* CConf::getYsfRadioID() +{ + return m_ysfRadioID; +} + unsigned int CConf::getDMRId() const { return m_dmrId; diff --git a/DMR2YSF/Conf.h b/DMR2YSF/Conf.h index a41854e..c816fff 100644 --- a/DMR2YSF/Conf.h +++ b/DMR2YSF/Conf.h @@ -40,6 +40,17 @@ public: std::string getFCSFile() const; bool getDaemon() const; bool getDebug() const; + unsigned char getFICHCallSign() const; + unsigned char getFICHCallMode() const; + unsigned char getFICHFrameTotal() const; + unsigned char getFICHMessageRoute() const; + unsigned char getFICHVOIP() const; + unsigned char getFICHDataType() const; + unsigned char getFICHSQLType() const; + unsigned char getFICHSQLCode() const; + unsigned char* getYsfDT1(); + unsigned char* getYsfDT2(); + char* getYsfRadioID(); // The DMR Network section unsigned int getDMRId() const; @@ -91,6 +102,17 @@ private: std::string m_logFilePath; std::string m_logFileRoot; + unsigned char m_fichCallSign; + unsigned char m_fichCallMode; + unsigned char m_fichFrameTotal; + unsigned char m_fichMessageRoute; + unsigned char m_fichVOIP; + unsigned char m_fichDataType; + unsigned char m_fichSQLType; + unsigned char m_fichSQLCode; + unsigned char m_ysfDT1[10]; + unsigned char m_ysfDT2[10]; + char m_ysfRadioID[5]; }; #endif diff --git a/DMR2YSF/DMR2YSF.cpp b/DMR2YSF/DMR2YSF.cpp index cd922dd..8b5814e 100644 --- a/DMR2YSF/DMR2YSF.cpp +++ b/DMR2YSF/DMR2YSF.cpp @@ -33,9 +33,6 @@ const unsigned char dt1_temp[] = {0x31, 0x22, 0x62, 0x5F, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00}; const unsigned char dt2_temp[] = {0x00, 0x00, 0x00, 0x00, 0x6C, 0x20, 0x1C, 0x20, 0x03, 0x08}; -// Added by AD8DP for FICH FT=6 transmissions -const uint8_t dt1[10] = {0x01, 0x22, 0x61, 0x5f, 0x2b, 0x03, 0x11, 0x00, 0x00, 0x00}; - const unsigned char CONN_RESP[] = {0x5DU, 0x41U, 0x5FU, 0x26U}; #define DMR_FRAME_PER 55U @@ -652,23 +649,24 @@ int CDMR2YSF::run() // Set the FICH CYSFFICH fich; fich.setFI(YSF_FI_HEADER); - fich.setCS(2U); - fich.setCM(1U); - fich.setBN(0U); - fich.setBT(0U); + fich.setCS(m_conf.getFICHCallSign()); + fich.setCM(m_conf.getFICHCallMode()); + fich.setBN(0U); + fich.setBT(0U); fich.setFN(0U); - fich.setFT(6U); + fich.setFT(m_conf.getFICHFrameTotal()); fich.setDev(0U); - fich.setMR(0U); - fich.setVoIP(false); - fich.setDT(YSF_DT_VD_MODE2); - fich.setSQL(0U); - fich.setSQ(0U); + fich.setMR(m_conf.getFICHMessageRoute()); + fich.setVoIP(m_conf.getFICHVOIP()); + fich.setDT(m_conf.getFICHDataType()); + fich.setSQL(m_conf.getFICHSQLType()); + fich.setSQ(m_conf.getFICHSQLCode()); fich.encode(m_ysfFrame + 35U); unsigned char csd1[20U], csd2[20U]; - memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); + memset(csd1, '*', YSF_CALLSIGN_LENGTH); + memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -676,7 +674,7 @@ int CDMR2YSF::run() payload.writeHeader(m_ysfFrame + 35U, csd1, csd2); m_ysfNetwork->write(m_ysfFrame); - + ysf_cnt++; ysfWatch.start(); } @@ -693,23 +691,23 @@ int CDMR2YSF::run() // Set the FICH CYSFFICH fich; fich.setFI(YSF_FI_TERMINATOR); - fich.setCS(2U); - fich.setCM(1U); - fich.setBN(0U); - fich.setBT(0U); - fich.setFN(0U); - fich.setFT(6U); - fich.setDev(0U); - fich.setMR(0U); - fich.setVoIP(false); - fich.setDT(YSF_DT_VD_MODE2); - fich.setSQL(0U); - fich.setSQ(0U); + fich.setCS(m_conf.getFICHCallSign()); + fich.setCM(m_conf.getFICHCallMode()); + fich.setBN(0U); + fich.setBT(0U); + fich.setFN(0U); + fich.setFT(m_conf.getFICHFrameTotal()); + fich.setDev(0U); + fich.setMR(m_conf.getFICHMessageRoute()); + fich.setVoIP(m_conf.getFICHVOIP()); + fich.setDT(m_conf.getFICHDataType()); + fich.setSQL(m_conf.getFICHSQLType()); + fich.setSQ(m_conf.getFICHSQLCode()); fich.encode(m_ysfFrame + 35U); unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -724,7 +722,7 @@ int CDMR2YSF::run() CYSFPayload ysfPayload; unsigned char dch[10U]; - unsigned int fn = (ysf_cnt - 1U) % 7U; + unsigned int fn = (ysf_cnt - 1U) % (m_conf.getFICHFrameTotal() + 1); ::memcpy(m_ysfFrame + 0U, "YSFD", 4U); ::memcpy(m_ysfFrame + 4U, m_ysfNetwork->getCallsign().c_str(), YSF_CALLSIGN_LENGTH); @@ -737,8 +735,8 @@ int CDMR2YSF::run() switch (fn) { case 0: memset(dch, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(dch + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); + memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); break; case 1: ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netSrc.c_str()); @@ -748,33 +746,33 @@ int CDMR2YSF::run() break; case 5: memset(dch, ' ', YSF_CALLSIGN_LENGTH/2); - memcpy(dch + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); // Rem3/4 - break; + memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); // Rem3/4 + break; case 6: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt1); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, m_conf.getYsfDT1()); break; case 7: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt2_temp); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, m_conf.getYsfDT2()); break; default: ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)" "); } - + // Set the FICH fich.setFI(YSF_FI_COMMUNICATIONS); - fich.setCS(2U); - fich.setCM(1U); - fich.setBN(0U); - fich.setBT(0U); - fich.setFN(fn); - fich.setFT(6U); + fich.setCS(m_conf.getFICHCallSign()); + fich.setCM(m_conf.getFICHCallMode()); + fich.setBN(0U); + fich.setBT(0U); + fich.setFN(fn); + fich.setFT(m_conf.getFICHFrameTotal()); fich.setDev(0U); - fich.setMR(0U); - fich.setVoIP(false); - fich.setDT(YSF_DT_VD_MODE2); - fich.setSQL(0U); - fich.setSQ(0U); + fich.setMR(m_conf.getFICHMessageRoute()); + fich.setVoIP(m_conf.getFICHVOIP()); + fich.setDT(m_conf.getFICHDataType()); + fich.setSQL(m_conf.getFICHSQLType()); + fich.setSQ(m_conf.getFICHSQLCode()); fich.encode(m_ysfFrame + 35U); // Net frame counter @@ -782,7 +780,7 @@ int CDMR2YSF::run() // Send data m_ysfNetwork->write(m_ysfFrame); - + ysf_cnt++; ysfWatch.start(); } @@ -901,7 +899,7 @@ unsigned int CDMR2YSF::findYSFID(std::string cs, bool showdst) int mid1 = cs.find_last_of('-'); int mid2 = cs.find_last_of('/'); int last = cs.find_last_not_of(' '); - + if (mid1 == -1 && mid2 == -1 && first == -1 && last == -1) cstrim = "N0CALL"; else if (mid1 == -1 && mid2 == -1) @@ -943,10 +941,10 @@ std::string CDMR2YSF::getSrcYSF(const unsigned char* buffer) ::memcpy(temp, buffer + 14U, YSF_CALLSIGN_LENGTH); temp[YSF_CALLSIGN_LENGTH] = 0U; - + std::string trimmed = reinterpret_cast(temp); trimmed.erase(std::find_if(trimmed.rbegin(), trimmed.rend(), std::not1(std::ptr_fun(std::isspace))).base(), trimmed.end()); - + return trimmed; } diff --git a/DMR2YSF/DMR2YSF.ini b/DMR2YSF/DMR2YSF.ini index 7382bd6..d81fdfa 100644 --- a/DMR2YSF/DMR2YSF.ini +++ b/DMR2YSF/DMR2YSF.ini @@ -5,6 +5,18 @@ GatewayPort=4200 LocalAddress=127.0.0.1 LocalPort=3200 FCSRooms=FCSRooms.txt +#RadioID=***** +#FICHCallsign=2 +#FICHCallMode=0 +#FICHBlockTotal=0 +#FICHFrameTotal=7 +#FICHMessageRoute=0 +#FICHVOIP=0 +#FICHDataType=2 +#FICHSQLType=0 +#FICHSQLCode=0 +#DT1=49,34,98,95,41,0,0,0,0,0 +#DT2=0,0,0,0,108,32,28,32,3,8 Daemon=0 Debug=0 diff --git a/DMR2YSF/Version.h b/DMR2YSF/Version.h index 673e6a0..36efd6b 100644 --- a/DMR2YSF/Version.h +++ b/DMR2YSF/Version.h @@ -20,6 +20,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20200503"; +const char* VERSION = "20200605"; #endif diff --git a/DMR2YSF/YSFFICH.cpp b/DMR2YSF/YSFFICH.cpp index 07b07da..8579379 100644 --- a/DMR2YSF/YSFFICH.cpp +++ b/DMR2YSF/YSFFICH.cpp @@ -238,6 +238,12 @@ void CYSFFICH::setCM(unsigned char cm) m_fich[0U] |= (cm << 2) & 0x0CU; } +void CYSFFICH::setCM(unsigned char cm) +{ + m_fich[0U] &= 0xF3U; + m_fich[0U] |= (cm << 2) & 0x0CU; +} + void CYSFFICH::setFN(unsigned char fn) { m_fich[1U] &= 0xC7U; diff --git a/YSF2DMR/Conf.cpp b/YSF2DMR/Conf.cpp index 8ed8ad8..178a656 100644 --- a/YSF2DMR/Conf.cpp +++ b/YSF2DMR/Conf.cpp @@ -142,6 +142,8 @@ bool CConf::read() // Remove quotes from the value size_t len = ::strlen(value); + char *t; + unsigned char tokencnt = 0; if (len > 1U && *value == '"' && value[len - 1U] == '"') { value[len - 1U] = '\0'; value++; @@ -176,6 +178,40 @@ bool CConf::read() m_wiresXMakeUpper = ::atoi(value) == 1; else if (::strcmp(key, "Daemon") == 0) m_daemon = ::atoi(value) == 1; + else if (::strcmp(key, "RadioID") == 0) + ::memcpy(m_ysfRadioID, value, 5); + else if (::strcmp(key, "FICHCallsign") == 0) + m_fichCallSign = ::atoi(value); + else if (::strcmp(key, "FICHCallMode") == 0) + m_fichCallMode = ::atoi(value); + else if (::strcmp(key, "FICHFrameTotal") == 0) + m_fichFrameTotal = ::atoi(value); + else if (::strcmp(key, "FICHMessageRoute") == 0) + m_fichMessageRoute = ::atoi(value); + else if (::strcmp(key, "FICHVOIP") == 0) + m_fichVOIP = ::atoi(value); + else if (::strcmp(key, "FICHDataType") == 0) + m_fichDataType = ::atoi(value); + else if (::strcmp(key, "FICHSQLType") == 0) + m_fichSQLType = ::atoi(value); + else if (::strcmp(key, "FICHSQLCode") == 0) + m_fichSQLCode = ::atoi(value); + else if (::strcmp(key, "DT1") == 0){ + tokencnt = 0; + while((t = strtok_r(value, ",", &value)) != NULL){ + if(tokencnt < 10){ + m_ysfDT1[tokencnt++] = atoi(t); + } + } + } + else if (::strcmp(key, "DT2") == 0){ + tokencnt = 0; + while((t = strtok_r(value, ",", &value)) != NULL){ + if(tokencnt < 10){ + m_ysfDT2[tokencnt++] = atoi(t); + } + } + } } else if (section == SECTION_INFO) { if (::strcmp(key, "TXFrequency") == 0) m_txFrequency = (unsigned int)::atoi(value); @@ -334,6 +370,61 @@ bool CConf::getDaemon() const return m_daemon; } +unsigned char CConf::getFICHCallSign() const +{ + return m_fichCallSign; +} + +unsigned char CConf::getFICHCallMode() const +{ + return m_fichCallMode; +} + +unsigned char CConf::getFICHFrameTotal() const +{ + return m_fichFrameTotal; +} + +unsigned char CConf::getFICHMessageRoute() const +{ + return m_fichMessageRoute; +} + +unsigned char CConf::getFICHVOIP() const +{ + return m_fichVOIP; +} + +unsigned char CConf::getFICHDataType() const +{ + return m_fichDataType; +} + +unsigned char CConf::getFICHSQLType() const +{ + return m_fichSQLType; +} + +unsigned char CConf::getFICHSQLCode() const +{ + return m_fichSQLCode; +} + +unsigned char* CConf::getYsfDT1() +{ + return m_ysfDT1; +} + +unsigned char* CConf::getYsfDT2() +{ + return m_ysfDT2; +} + +char* CConf::getYsfRadioID() +{ + return m_ysfRadioID; +} + unsigned int CConf::getRxFrequency() const { return m_rxFrequency; diff --git a/YSF2DMR/Conf.h b/YSF2DMR/Conf.h index 4f1faa7..a8b17ff 100644 --- a/YSF2DMR/Conf.h +++ b/YSF2DMR/Conf.h @@ -44,6 +44,17 @@ public: unsigned int getHangTime() const; bool getWiresXMakeUpper() const; bool getDaemon() const; + unsigned char getFICHCallSign() const; + unsigned char getFICHCallMode() const; + unsigned char getFICHFrameTotal() const; + unsigned char getFICHMessageRoute() const; + unsigned char getFICHVOIP() const; + unsigned char getFICHDataType() const; + unsigned char getFICHSQLType() const; + unsigned char getFICHSQLCode() const; + unsigned char* getYsfDT1(); + unsigned char* getYsfDT2(); + char* getYsfRadioID(); // The Info section unsigned int getRxFrequency() const; @@ -148,7 +159,7 @@ private: unsigned int m_logFileLevel; std::string m_logFilePath; std::string m_logFileRoot; - + bool m_aprsEnabled; std::string m_aprsServer; unsigned int m_aprsPort; @@ -158,6 +169,17 @@ private: unsigned int m_aprsRefresh; std::string m_aprsDescription; + unsigned char m_fichCallSign; + unsigned char m_fichCallMode; + unsigned char m_fichFrameTotal; + unsigned char m_fichMessageRoute; + unsigned char m_fichVOIP; + unsigned char m_fichDataType; + unsigned char m_fichSQLType; + unsigned char m_fichSQLCode; + unsigned char m_ysfDT1[10]; + unsigned char m_ysfDT2[10]; + char m_ysfRadioID[5]; }; #endif diff --git a/YSF2DMR/Version.h b/YSF2DMR/Version.h index 673e6a0..36efd6b 100644 --- a/YSF2DMR/Version.h +++ b/YSF2DMR/Version.h @@ -20,6 +20,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20200503"; +const char* VERSION = "20200605"; #endif diff --git a/YSF2DMR/YSF2DMR.cpp b/YSF2DMR/YSF2DMR.cpp index 163c4da..fe95747 100644 --- a/YSF2DMR/YSF2DMR.cpp +++ b/YSF2DMR/YSF2DMR.cpp @@ -33,7 +33,6 @@ // DT1 and DT2, suggested by Manuel EA7EE const unsigned char dt1_temp[] = {0x31, 0x22, 0x62, 0x5F, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00}; const unsigned char dt2_temp[] = {0x00, 0x00, 0x00, 0x00, 0x6C, 0x20, 0x1C, 0x20, 0x03, 0x08}; -const uint8_t dt1[10] = {0x01, 0x22, 0x61, 0x5f, 0x2b, 0x03, 0x11, 0x00, 0x00, 0x00}; #define DMR_FRAME_PER 55U #define YSF_FRAME_PER 90U @@ -943,32 +942,23 @@ int CYSF2DMR::run() // Set the FICH CYSFFICH fich; fich.setFI(YSF_FI_HEADER); - fich.setCS(2U); - fich.setCM(1U); + fich.setCS(m_conf.getFICHCallSign()); + fich.setCM(m_conf.getFICHCallMode()); fich.setBN(0U); fich.setBT(0U); - fich.setFN(0U); - fich.setFT(6U); - fich.setDev(0U); - fich.setMR(0U); - fich.setVoIP(false); - fich.setDT(YSF_DT_VD_MODE2); - fich.setSQL(false); - fich.setSQ(0U); - - if (m_remoteGateway) { - fich.setVoIP(false); - fich.setMR(YSF_MR_DIRECT); - } else { - fich.setVoIP(true); - fich.setMR(YSF_MR_BUSY); - } - + fich.setFN(0U); + fich.setFT(m_conf.getFICHFrameTotal()); + fich.setDev(0U); + fich.setMR(m_conf.getFICHMessageRoute()); + fich.setVoIP(m_conf.getFICHVOIP()); + fich.setDT(m_conf.getFICHDataType()); + fich.setSQL(m_conf.getFICHSQLType()); + fich.setSQ(m_conf.getFICHSQLCode()); fich.encode(m_ysfFrame + 35U); unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -976,7 +966,7 @@ int CYSF2DMR::run() payload.writeHeader(m_ysfFrame + 35U, csd1, csd2); m_ysfNetwork->write(m_ysfFrame); - + ysf_cnt++; ysfWatch.start(); } @@ -992,32 +982,23 @@ int CYSF2DMR::run() // Set the FICH CYSFFICH fich; fich.setFI(YSF_FI_TERMINATOR); - fich.setCS(2U); - fich.setCM(1U); + fich.setCS(m_conf.getFICHCallSign()); + fich.setCM(m_conf.getFICHCallMode()); fich.setBN(0U); fich.setBT(0U); - fich.setFN(0U); - fich.setFT(6U); - fich.setDev(0U); - fich.setMR(0U); - fich.setVoIP(false); - fich.setDT(YSF_DT_VD_MODE2); - fich.setSQL(false); - fich.setSQ(0U); - - if (m_remoteGateway) { - fich.setVoIP(false); - fich.setMR(YSF_MR_DIRECT); - } else { - fich.setVoIP(true); - fich.setMR(YSF_MR_BUSY); - } - + fich.setFN(0U); + fich.setFT(m_conf.getFICHFrameTotal()); + fich.setDev(0U); + fich.setMR(m_conf.getFICHMessageRoute()); + fich.setVoIP(m_conf.getFICHVOIP()); + fich.setDT(m_conf.getFICHDataType()); + fich.setSQL(m_conf.getFICHSQLType()); + fich.setSQ(m_conf.getFICHSQLCode()); fich.encode(m_ysfFrame + 35U); unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -1031,7 +1012,7 @@ int CYSF2DMR::run() CYSFPayload ysfPayload; unsigned char dch[10U]; - unsigned int fn = (ysf_cnt - 1U) % 7U; + unsigned int fn = (ysf_cnt - 1U) % (m_conf.getFICHFrameTotal() + 1); ::memcpy(m_ysfFrame + 0U, "YSFD", 4U); ::memcpy(m_ysfFrame + 4U, m_ysfNetwork->getCallsign().c_str(), YSF_CALLSIGN_LENGTH); @@ -1044,7 +1025,7 @@ int CYSF2DMR::run() switch (fn) { case 0: memset(dch, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(dch + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); + memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); break; case 1: @@ -1054,51 +1035,42 @@ int CYSF2DMR::run() ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netDst.c_str()); break; case 5: - memset(dch, ' ', YSF_CALLSIGN_LENGTH/2); - memcpy(dch + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); + memset(dch, ' ', YSF_CALLSIGN_LENGTH/2); + memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); // Rem3/4 break; case 6: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt1); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, m_conf.getYsfDT1()); break; case 7: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt2_temp); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, m_conf.getYsfDT2()); break; default: ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)" "); } - + // Set the FICH fich.setFI(YSF_FI_COMMUNICATIONS); - fich.setCS(2U); - fich.setCM(1U); + fich.setCS(m_conf.getFICHCallSign()); + fich.setCM(m_conf.getFICHCallMode()); fich.setBN(0U); fich.setBT(0U); - fich.setFN(fn); - fich.setFT(6U); - fich.setDev(0U); - fich.setMR(0U); - fich.setVoIP(false); - fich.setDT(YSF_DT_VD_MODE2); - fich.setSQL(false); - fich.setSQ(0U); - - if (m_remoteGateway) { - fich.setVoIP(false); - fich.setMR(YSF_MR_DIRECT); - } else { - fich.setVoIP(true); - fich.setMR(YSF_MR_BUSY); - } - - fich.encode(m_ysfFrame + 35U); + fich.setFN(fn); + fich.setFT(m_conf.getFICHFrameTotal()); + fich.setDev(0U); + fich.setMR(m_conf.getFICHMessageRoute()); + fich.setVoIP(m_conf.getFICHVOIP()); + fich.setDT(m_conf.getFICHDataType()); + fich.setSQL(m_conf.getFICHSQLType()); + fich.setSQ(m_conf.getFICHSQLCode()); + fich.encode(m_ysfFrame + 35U); // Net frame counter m_ysfFrame[34U] = (ysf_cnt & 0x7FU) << 1; // Send data to MMDVMHost m_ysfNetwork->write(m_ysfFrame); - + ysf_cnt++; ysfWatch.start(); } diff --git a/YSF2DMR/YSF2DMR.ini b/YSF2DMR/YSF2DMR.ini index 60c25a3..38f0ca7 100644 --- a/YSF2DMR/YSF2DMR.ini +++ b/YSF2DMR/YSF2DMR.ini @@ -21,6 +21,18 @@ EnableWiresX=1 RemoteGateway=0 HangTime=1000 WiresXMakeUpper=1 +#RadioID=***** +#FICHCallsign=2 +#FICHCallMode=0 +#FICHBlockTotal=0 +#FICHFrameTotal=7 +#FICHMessageRoute=0 +#FICHVOIP=0 +#FICHDataType=2 +#FICHSQLType=0 +#FICHSQLCode=0 +#DT1=49,34,98,95,41,0,0,0,0,0 +#DT2=0,0,0,0,108,32,28,32,3,8 Daemon=0 [DMR Network] From 00606bb544a8f160f37d1afa54de5adda971a0d2 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 5 Jun 2020 16:02:20 +0100 Subject: [PATCH 02/11] Minor fixes --- DMR2YSF/Conf.h | 4 ++-- DMR2YSF/DMR2YSF.cpp | 1 - DMR2YSF/DMR2YSF.ini | 24 ++++++++++++------------ YSF2DMR/Conf.h | 4 ++-- YSF2DMR/YSF2DMR.cpp | 1 - YSF2DMR/YSF2DMR.ini | 24 ++++++++++++------------ 6 files changed, 28 insertions(+), 30 deletions(-) diff --git a/DMR2YSF/Conf.h b/DMR2YSF/Conf.h index c816fff..d6a7f4e 100644 --- a/DMR2YSF/Conf.h +++ b/DMR2YSF/Conf.h @@ -110,8 +110,8 @@ private: unsigned char m_fichDataType; unsigned char m_fichSQLType; unsigned char m_fichSQLCode; - unsigned char m_ysfDT1[10]; - unsigned char m_ysfDT2[10]; + unsigned char m_ysfDT1[10U]; + unsigned char m_ysfDT2[10U]; char m_ysfRadioID[5]; }; diff --git a/DMR2YSF/DMR2YSF.cpp b/DMR2YSF/DMR2YSF.cpp index 8b5814e..a292bac 100644 --- a/DMR2YSF/DMR2YSF.cpp +++ b/DMR2YSF/DMR2YSF.cpp @@ -48,7 +48,6 @@ const char* HEADER1 = "This software is for use on amateur radio networks only," const char* HEADER2 = "it is to be used for educational purposes only. Its use on"; const char* HEADER3 = "commercial networks is strictly prohibited."; const char* HEADER4 = "Copyright(C) 2018 by CA6JAU, G4KLX and others"; -const char ysf_radioid[] = {'H', '5', '0', '0', '0'}; #include #include diff --git a/DMR2YSF/DMR2YSF.ini b/DMR2YSF/DMR2YSF.ini index d81fdfa..ed24d34 100644 --- a/DMR2YSF/DMR2YSF.ini +++ b/DMR2YSF/DMR2YSF.ini @@ -5,18 +5,18 @@ GatewayPort=4200 LocalAddress=127.0.0.1 LocalPort=3200 FCSRooms=FCSRooms.txt -#RadioID=***** -#FICHCallsign=2 -#FICHCallMode=0 -#FICHBlockTotal=0 -#FICHFrameTotal=7 -#FICHMessageRoute=0 -#FICHVOIP=0 -#FICHDataType=2 -#FICHSQLType=0 -#FICHSQLCode=0 -#DT1=49,34,98,95,41,0,0,0,0,0 -#DT2=0,0,0,0,108,32,28,32,3,8 +RadioID=***** +FICHCallsign=2 +FICHCallMode=0 +FICHBlockTotal=0 +FICHFrameTotal=7 +FICHMessageRoute=0 +FICHVOIP=0 +FICHDataType=2 +FICHSQLType=0 +FICHSQLCode=0 +DT1=49,34,98,95,41,0,0,0,0,0 +DT2=0,0,0,0,108,32,28,32,3,8 Daemon=0 Debug=0 diff --git a/YSF2DMR/Conf.h b/YSF2DMR/Conf.h index a8b17ff..472141e 100644 --- a/YSF2DMR/Conf.h +++ b/YSF2DMR/Conf.h @@ -177,8 +177,8 @@ private: unsigned char m_fichDataType; unsigned char m_fichSQLType; unsigned char m_fichSQLCode; - unsigned char m_ysfDT1[10]; - unsigned char m_ysfDT2[10]; + unsigned char m_ysfDT1[10U]; + unsigned char m_ysfDT2[10U]; char m_ysfRadioID[5]; }; diff --git a/YSF2DMR/YSF2DMR.cpp b/YSF2DMR/YSF2DMR.cpp index fe95747..f21018a 100644 --- a/YSF2DMR/YSF2DMR.cpp +++ b/YSF2DMR/YSF2DMR.cpp @@ -50,7 +50,6 @@ const char* HEADER1 = "This software is for use on amateur radio networks only," const char* HEADER2 = "it is to be used for educational purposes only. Its use on"; const char* HEADER3 = "commercial networks is strictly prohibited."; const char* HEADER4 = "Copyright(C) 2018,2019 by CA6JAU, EA7EE, G4KLX and others"; -const char ysf_radioid[] = {'H', '5', '0', '0', '0'}; #include #include diff --git a/YSF2DMR/YSF2DMR.ini b/YSF2DMR/YSF2DMR.ini index 38f0ca7..f8341a5 100644 --- a/YSF2DMR/YSF2DMR.ini +++ b/YSF2DMR/YSF2DMR.ini @@ -21,18 +21,18 @@ EnableWiresX=1 RemoteGateway=0 HangTime=1000 WiresXMakeUpper=1 -#RadioID=***** -#FICHCallsign=2 -#FICHCallMode=0 -#FICHBlockTotal=0 -#FICHFrameTotal=7 -#FICHMessageRoute=0 -#FICHVOIP=0 -#FICHDataType=2 -#FICHSQLType=0 -#FICHSQLCode=0 -#DT1=49,34,98,95,41,0,0,0,0,0 -#DT2=0,0,0,0,108,32,28,32,3,8 +RadioID=***** +FICHCallsign=2 +FICHCallMode=0 +FICHBlockTotal=0 +FICHFrameTotal=7 +FICHMessageRoute=0 +FICHVOIP=0 +FICHDataType=2 +FICHSQLType=0 +FICHSQLCode=0 +DT1=49,34,98,95,41,0,0,0,0,0 +DT2=0,0,0,0,108,32,28,32,3,8 Daemon=0 [DMR Network] From 73f0829136187f66880529cc8d6e7a10cc3d1e73 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 5 Jun 2020 16:43:13 +0100 Subject: [PATCH 03/11] Update YSF2NXDN and YSF2P25 for new YSF code --- DMR2YSF/Conf.h | 29 ++++++------ YSF2DMR/Conf.h | 27 +++++------ YSF2NXDN/Conf.cpp | 91 +++++++++++++++++++++++++++++++++++ YSF2NXDN/Conf.h | 22 +++++++++ YSF2NXDN/Version.h | 2 +- YSF2NXDN/YSF2NXDN.cpp | 107 ++++++++++++++++++++---------------------- YSF2NXDN/YSF2NXDN.ini | 12 +++++ YSF2P25/Conf.cpp | 91 +++++++++++++++++++++++++++++++++++ YSF2P25/Conf.h | 22 +++++++++ YSF2P25/Version.h | 2 +- YSF2P25/YSF2P25.cpp | 69 +++++++++++++-------------- YSF2P25/YSF2P25.ini | 12 +++++ 12 files changed, 363 insertions(+), 123 deletions(-) diff --git a/DMR2YSF/Conf.h b/DMR2YSF/Conf.h index d6a7f4e..cef1052 100644 --- a/DMR2YSF/Conf.h +++ b/DMR2YSF/Conf.h @@ -38,8 +38,6 @@ public: std::string getLocalAddress() const; unsigned int getLocalPort() const; std::string getFCSFile() const; - bool getDaemon() const; - bool getDebug() const; unsigned char getFICHCallSign() const; unsigned char getFICHCallMode() const; unsigned char getFICHFrameTotal() const; @@ -50,7 +48,9 @@ public: unsigned char getFICHSQLCode() const; unsigned char* getYsfDT1(); unsigned char* getYsfDT2(); - char* getYsfRadioID(); + char* getYsfRadioID(); + bool getDaemon() const; + bool getDebug() const; // The DMR Network section unsigned int getDMRId() const; @@ -81,6 +81,17 @@ private: std::string m_localAddress; unsigned int m_localPort; std::string m_fcsFile; + unsigned char m_fichCallSign; + unsigned char m_fichCallMode; + unsigned char m_fichFrameTotal; + unsigned char m_fichMessageRoute; + unsigned char m_fichVOIP; + unsigned char m_fichDataType; + unsigned char m_fichSQLType; + unsigned char m_fichSQLCode; + unsigned char m_ysfDT1[10U]; + unsigned char m_ysfDT2[10U]; + char m_ysfRadioID[5]; bool m_daemon; bool m_debug; @@ -101,18 +112,6 @@ private: unsigned int m_logFileLevel; std::string m_logFilePath; std::string m_logFileRoot; - - unsigned char m_fichCallSign; - unsigned char m_fichCallMode; - unsigned char m_fichFrameTotal; - unsigned char m_fichMessageRoute; - unsigned char m_fichVOIP; - unsigned char m_fichDataType; - unsigned char m_fichSQLType; - unsigned char m_fichSQLCode; - unsigned char m_ysfDT1[10U]; - unsigned char m_ysfDT2[10U]; - char m_ysfRadioID[5]; }; #endif diff --git a/YSF2DMR/Conf.h b/YSF2DMR/Conf.h index 472141e..cac66bd 100644 --- a/YSF2DMR/Conf.h +++ b/YSF2DMR/Conf.h @@ -43,7 +43,6 @@ public: bool getRemoteGateway() const; unsigned int getHangTime() const; bool getWiresXMakeUpper() const; - bool getDaemon() const; unsigned char getFICHCallSign() const; unsigned char getFICHCallMode() const; unsigned char getFICHFrameTotal() const; @@ -54,7 +53,8 @@ public: unsigned char getFICHSQLCode() const; unsigned char* getYsfDT1(); unsigned char* getYsfDT2(); - char* getYsfRadioID(); + char* getYsfRadioID(); + bool getDaemon() const; // The Info section unsigned int getRxFrequency() const; @@ -120,6 +120,17 @@ private: bool m_remoteGateway; unsigned int m_hangTime; bool m_wiresXMakeUpper; + unsigned char m_fichCallSign; + unsigned char m_fichCallMode; + unsigned char m_fichFrameTotal; + unsigned char m_fichMessageRoute; + unsigned char m_fichVOIP; + unsigned char m_fichDataType; + unsigned char m_fichSQLType; + unsigned char m_fichSQLCode; + unsigned char m_ysfDT1[10U]; + unsigned char m_ysfDT2[10U]; + char m_ysfRadioID[5]; bool m_daemon; unsigned int m_rxFrequency; @@ -168,18 +179,6 @@ private: std::string m_aprsAPIKey; unsigned int m_aprsRefresh; std::string m_aprsDescription; - - unsigned char m_fichCallSign; - unsigned char m_fichCallMode; - unsigned char m_fichFrameTotal; - unsigned char m_fichMessageRoute; - unsigned char m_fichVOIP; - unsigned char m_fichDataType; - unsigned char m_fichSQLType; - unsigned char m_fichSQLCode; - unsigned char m_ysfDT1[10U]; - unsigned char m_ysfDT2[10U]; - char m_ysfRadioID[5]; }; #endif diff --git a/YSF2NXDN/Conf.cpp b/YSF2NXDN/Conf.cpp index 454a234..9619e35 100644 --- a/YSF2NXDN/Conf.cpp +++ b/YSF2NXDN/Conf.cpp @@ -126,6 +126,8 @@ bool CConf::read() // Remove quotes from the value size_t len = ::strlen(value); + char *t; + unsigned char tokencnt = 0; if (len > 1U && *value == '"' && value[len - 1U] == '"') { value[len - 1U] = '\0'; value++; @@ -167,6 +169,40 @@ bool CConf::read() m_enableWiresX = ::atoi(value) == 1; else if (::strcmp(key, "WiresXMakeUpper") == 0) m_wiresXMakeUpper = ::atoi(value) == 1; + else if (::strcmp(key, "RadioID") == 0) + ::memcpy(m_ysfRadioID, value, 5); + else if (::strcmp(key, "FICHCallsign") == 0) + m_fichCallSign = ::atoi(value); + else if (::strcmp(key, "FICHCallMode") == 0) + m_fichCallMode = ::atoi(value); + else if (::strcmp(key, "FICHFrameTotal") == 0) + m_fichFrameTotal = ::atoi(value); + else if (::strcmp(key, "FICHMessageRoute") == 0) + m_fichMessageRoute = ::atoi(value); + else if (::strcmp(key, "FICHVOIP") == 0) + m_fichVOIP = ::atoi(value); + else if (::strcmp(key, "FICHDataType") == 0) + m_fichDataType = ::atoi(value); + else if (::strcmp(key, "FICHSQLType") == 0) + m_fichSQLType = ::atoi(value); + else if (::strcmp(key, "FICHSQLCode") == 0) + m_fichSQLCode = ::atoi(value); + else if (::strcmp(key, "DT1") == 0){ + tokencnt = 0; + while((t = strtok_r(value, ",", &value)) != NULL){ + if(tokencnt < 10){ + m_ysfDT1[tokencnt++] = atoi(t); + } + } + } + else if (::strcmp(key, "DT2") == 0){ + tokencnt = 0; + while((t = strtok_r(value, ",", &value)) != NULL){ + if(tokencnt < 10){ + m_ysfDT2[tokencnt++] = atoi(t); + } + } + } else if (::strcmp(key, "Daemon") == 0) m_daemon = ::atoi(value) == 1; } else if (section == SECTION_NXDN_NETWORK) { @@ -293,6 +329,61 @@ bool CConf::getWiresXMakeUpper() const return m_wiresXMakeUpper; } +unsigned char CConf::getFICHCallSign() const +{ + return m_fichCallSign; +} + +unsigned char CConf::getFICHCallMode() const +{ + return m_fichCallMode; +} + +unsigned char CConf::getFICHFrameTotal() const +{ + return m_fichFrameTotal; +} + +unsigned char CConf::getFICHMessageRoute() const +{ + return m_fichMessageRoute; +} + +unsigned char CConf::getFICHVOIP() const +{ + return m_fichVOIP; +} + +unsigned char CConf::getFICHDataType() const +{ + return m_fichDataType; +} + +unsigned char CConf::getFICHSQLType() const +{ + return m_fichSQLType; +} + +unsigned char CConf::getFICHSQLCode() const +{ + return m_fichSQLCode; +} + +unsigned char* CConf::getYsfDT1() +{ + return m_ysfDT1; +} + +unsigned char* CConf::getYsfDT2() +{ + return m_ysfDT2; +} + +char* CConf::getYsfRadioID() +{ + return m_ysfRadioID; +} + bool CConf::getDaemon() const { return m_daemon; diff --git a/YSF2NXDN/Conf.h b/YSF2NXDN/Conf.h index 5e4ad21..3e05096 100644 --- a/YSF2NXDN/Conf.h +++ b/YSF2NXDN/Conf.h @@ -48,6 +48,17 @@ public: unsigned int getLocalPort() const; bool getEnableWiresX() const; bool getWiresXMakeUpper() const; + unsigned char getFICHCallSign() const; + unsigned char getFICHCallMode() const; + unsigned char getFICHFrameTotal() const; + unsigned char getFICHMessageRoute() const; + unsigned char getFICHVOIP() const; + unsigned char getFICHDataType() const; + unsigned char getFICHSQLType() const; + unsigned char getFICHSQLCode() const; + unsigned char* getYsfDT1(); + unsigned char* getYsfDT2(); + char* getYsfRadioID(); bool getDaemon() const; // The NXDN Network section @@ -90,6 +101,17 @@ private: unsigned int m_localPort; bool m_enableWiresX; bool m_wiresXMakeUpper; + unsigned char m_fichCallSign; + unsigned char m_fichCallMode; + unsigned char m_fichFrameTotal; + unsigned char m_fichMessageRoute; + unsigned char m_fichVOIP; + unsigned char m_fichDataType; + unsigned char m_fichSQLType; + unsigned char m_fichSQLCode; + unsigned char m_ysfDT1[10U]; + unsigned char m_ysfDT2[10U]; + char m_ysfRadioID[5]; bool m_daemon; unsigned int m_rxFrequency; diff --git a/YSF2NXDN/Version.h b/YSF2NXDN/Version.h index 673e6a0..36efd6b 100644 --- a/YSF2NXDN/Version.h +++ b/YSF2NXDN/Version.h @@ -20,6 +20,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20200503"; +const char* VERSION = "20200605"; #endif diff --git a/YSF2NXDN/YSF2NXDN.cpp b/YSF2NXDN/YSF2NXDN.cpp index 59aebc8..9af99cc 100644 --- a/YSF2NXDN/YSF2NXDN.cpp +++ b/YSF2NXDN/YSF2NXDN.cpp @@ -33,7 +33,6 @@ // DT1 and DT2, suggested by Manuel EA7EE const unsigned char dt1_temp[] = {0x31, 0x22, 0x62, 0x5F, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00}; const unsigned char dt2_temp[] = {0x00, 0x00, 0x00, 0x00, 0x6C, 0x20, 0x1C, 0x20, 0x03, 0x08}; -const uint8_t dt1[10] = {0x01, 0x22, 0x61, 0x5f, 0x2b, 0x03, 0x11, 0x00, 0x00, 0x00}; #define NXDN_FRAME_PER 75U #define YSF_FRAME_PER 90U @@ -48,7 +47,6 @@ const char* HEADER1 = "This software is for use on amateur radio networks only," const char* HEADER2 = "it is to be used for educational purposes only. Its use on"; const char* HEADER3 = "commercial networks is strictly prohibited."; const char* HEADER4 = "Copyright(C) 2018,2019 by CA6JAU, G4KLX and others"; -const char ysf_radioid[] = {'H', '5', '0', '0', '0'}; #include #include @@ -397,7 +395,7 @@ int CYSF2NXDN::run() if (m_gps != NULL) m_gps->data(buffer + 14U, buffer + 35U, fi, dt, fn, ft); - + } if ((buffer[34U] & 0x01U) == 0x01U) { @@ -519,7 +517,7 @@ int CYSF2NXDN::run() // Send data to MMDVMHost m_nxdnNetwork->write(m_nxdnFrame, false); - + nxdn_cnt++; nxdnWatch.start(); } @@ -539,7 +537,7 @@ int CYSF2NXDN::run() dstId = (m_nxdnFrame[10U] << 8) & 0xFF00U; dstId |= (m_nxdnFrame[11U] << 0) & 0x00FFU; - + if (grp && m_dstid == dstId) { if (m_nxdnFrame[5U] == 0x01) { // DT1 & DT2 without GPS info @@ -588,7 +586,7 @@ int CYSF2NXDN::run() m_nxdnFrames++; } } - + if (ysfWatch.elapsed() > YSF_FRAME_PER) { unsigned int ysfFrameType = m_conv.getYSF(m_ysfFrame + 35U); @@ -606,24 +604,23 @@ int CYSF2NXDN::run() // Set the FICH CYSFFICH fich; fich.setFI(YSF_FI_HEADER); - fich.setCS(2U); - fich.setCM(1U); + fich.setCS(m_conf.getFICHCallSign()); + fich.setCM(m_conf.getFICHCallMode()); fich.setBN(0U); fich.setBT(0U); fich.setFN(0U); - fich.setFT(6U); + fich.setFT(m_conf.getFICHFrameTotal()); fich.setDev(0U); - fich.setMR(0U); - fich.setVoIP(false); - fich.setDT(YSF_DT_VD_MODE2); - fich.setSQL(0U); - fich.setSQ(0U); + fich.setMR(m_conf.getFICHMessageRoute()); + fich.setVoIP(m_conf.getFICHVOIP()); + fich.setDT(m_conf.getFICHDataType()); + fich.setSQL(m_conf.getFICHSQLType()); + fich.setSQ(m_conf.getFICHSQLCode()); fich.encode(m_ysfFrame + 35U); unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); - //memset(csd1, '*', YSF_CALLSIGN_LENGTH); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -646,27 +643,26 @@ int CYSF2NXDN::run() // Set the FICH CYSFFICH fich; - fich.setFI(YSF_FI_TERMINATOR); - fich.setCS(2U); - fich.setCM(1U); - fich.setBN(0U); - fich.setBT(0U); - fich.setFN(0U); - fich.setFT(6U); - fich.setDev(0U); - fich.setMR(0U); - fich.setVoIP(false); - fich.setDT(YSF_DT_VD_MODE2); - fich.setSQL(0U); - fich.setSQ(0U); - fich.encode(m_ysfFrame + 35U); + fich.setFI(YSF_FI_HEADER); + fich.setCS(m_conf.getFICHCallSign()); + fich.setCM(m_conf.getFICHCallMode()); + fich.setBN(0U); + fich.setBT(0U); + fich.setFN(0U); + fich.setFT(m_conf.getFICHFrameTotal()); + fich.setDev(0U); + fich.setMR(m_conf.getFICHMessageRoute()); + fich.setVoIP(m_conf.getFICHVOIP()); + fich.setDT(m_conf.getFICHDataType()); + fich.setSQL(m_conf.getFICHSQLType()); + fich.setSQ(m_conf.getFICHSQLCode()); + fich.encode(m_ysfFrame + 35U); - unsigned char csd1[20U], csd2[20U]; - memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); - //memset(csd1, '*', YSF_CALLSIGN_LENGTH); - memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); - memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); + unsigned char csd1[20U], csd2[20U]; + memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); + memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); CYSFPayload payload; payload.writeHeader(m_ysfFrame + 35U, csd1, csd2); @@ -691,9 +687,8 @@ int CYSF2NXDN::run() switch (fn) { case 0: memset(dch, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(dch + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); + memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); - //ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)"**********"); break; case 1: ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netSrc.c_str()); @@ -702,34 +697,34 @@ int CYSF2NXDN::run() ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netDst.c_str()); break; case 5: - memset(dch, ' ', YSF_CALLSIGN_LENGTH/2); - memcpy(dch + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); + memset(dch, ' ', YSF_CALLSIGN_LENGTH/2); + memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); // Rem3/4 break; case 6: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt1); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, m_conf.getYsfDT1()); break; case 7: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt2_temp); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, m_conf.getYsfDT2()); break; default: ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)" "); } - + // Set the FICH fich.setFI(YSF_FI_COMMUNICATIONS); - fich.setCS(2U); - fich.setCM(1U); + fich.setCS(m_conf.getFICHCallSign()); + fich.setCM(m_conf.getFICHCallMode()); fich.setBN(0U); fich.setBT(0U); - fich.setFN(fn); - fich.setFT(6U); + fich.setFN(fn); + fich.setFT(m_conf.getFICHFrameTotal()); fich.setDev(0U); - fich.setMR(0U); - fich.setVoIP(false); - fich.setDT(YSF_DT_VD_MODE2); - fich.setSQL(0U); - fich.setSQ(0U); + fich.setMR(m_conf.getFICHMessageRoute()); + fich.setVoIP(m_conf.getFICHVOIP()); + fich.setDT(m_conf.getFICHDataType()); + fich.setSQL(m_conf.getFICHSQLType()); + fich.setSQ(m_conf.getFICHSQLCode()); fich.encode(m_ysfFrame + 35U); // Net frame counter @@ -737,7 +732,7 @@ int CYSF2NXDN::run() // Send data to MMDVMHost m_ysfNetwork->write(m_ysfFrame); - + ysf_cnt++; ysfWatch.start(); } @@ -766,17 +761,17 @@ int CYSF2NXDN::run() m_ysfNetwork->close(); m_nxdnNetwork->close(); - + if (m_APRS != NULL) { m_APRS->stop(); delete m_APRS; } - + if (m_gps != NULL) { m_gps->close(); delete m_gps; } - + delete m_nxdnNetwork; delete m_ysfNetwork; diff --git a/YSF2NXDN/YSF2NXDN.ini b/YSF2NXDN/YSF2NXDN.ini index 0d9218f..702ee58 100644 --- a/YSF2NXDN/YSF2NXDN.ini +++ b/YSF2NXDN/YSF2NXDN.ini @@ -16,6 +16,18 @@ LocalAddress=127.0.0.1 LocalPort=42014 EnableWiresX=1 WiresXMakeUpper=1 +RadioID=***** +FICHCallsign=2 +FICHCallMode=0 +FICHBlockTotal=0 +FICHFrameTotal=7 +FICHMessageRoute=0 +FICHVOIP=0 +FICHDataType=2 +FICHSQLType=0 +FICHSQLCode=0 +DT1=49,34,98,95,41,0,0,0,0,0 +DT2=0,0,0,0,108,32,28,32,3,8 Daemon=0 [NXDN Network] diff --git a/YSF2P25/Conf.cpp b/YSF2P25/Conf.cpp index 27ed043..208967b 100644 --- a/YSF2P25/Conf.cpp +++ b/YSF2P25/Conf.cpp @@ -114,6 +114,8 @@ bool CConf::read() // Remove quotes from the value size_t len = ::strlen(value); + char *t; + unsigned char tokencnt = 0; if (len > 1U && *value == '"' && value[len - 1U] == '"') { value[len - 1U] = '\0'; value++; @@ -149,6 +151,40 @@ bool CConf::read() m_enableWiresX = ::atoi(value) == 1; else if (::strcmp(key, "WiresXMakeUpper") == 0) m_wiresXMakeUpper = ::atoi(value) == 1; + else if (::strcmp(key, "RadioID") == 0) + ::memcpy(m_ysfRadioID, value, 5); + else if (::strcmp(key, "FICHCallsign") == 0) + m_fichCallSign = ::atoi(value); + else if (::strcmp(key, "FICHCallMode") == 0) + m_fichCallMode = ::atoi(value); + else if (::strcmp(key, "FICHFrameTotal") == 0) + m_fichFrameTotal = ::atoi(value); + else if (::strcmp(key, "FICHMessageRoute") == 0) + m_fichMessageRoute = ::atoi(value); + else if (::strcmp(key, "FICHVOIP") == 0) + m_fichVOIP = ::atoi(value); + else if (::strcmp(key, "FICHDataType") == 0) + m_fichDataType = ::atoi(value); + else if (::strcmp(key, "FICHSQLType") == 0) + m_fichSQLType = ::atoi(value); + else if (::strcmp(key, "FICHSQLCode") == 0) + m_fichSQLCode = ::atoi(value); + else if (::strcmp(key, "DT1") == 0){ + tokencnt = 0; + while((t = strtok_r(value, ",", &value)) != NULL){ + if(tokencnt < 10){ + m_ysfDT1[tokencnt++] = atoi(t); + } + } + } + else if (::strcmp(key, "DT2") == 0){ + tokencnt = 0; + while((t = strtok_r(value, ",", &value)) != NULL){ + if(tokencnt < 10){ + m_ysfDT2[tokencnt++] = atoi(t); + } + } + } else if (::strcmp(key, "Daemon") == 0) m_daemon = ::atoi(value) == 1; else if (::strcmp(key, "Debug") == 0) @@ -247,6 +283,61 @@ bool CConf::getWiresXMakeUpper() const return m_wiresXMakeUpper; } +unsigned char CConf::getFICHCallSign() const +{ + return m_fichCallSign; +} + +unsigned char CConf::getFICHCallMode() const +{ + return m_fichCallMode; +} + +unsigned char CConf::getFICHFrameTotal() const +{ + return m_fichFrameTotal; +} + +unsigned char CConf::getFICHMessageRoute() const +{ + return m_fichMessageRoute; +} + +unsigned char CConf::getFICHVOIP() const +{ + return m_fichVOIP; +} + +unsigned char CConf::getFICHDataType() const +{ + return m_fichDataType; +} + +unsigned char CConf::getFICHSQLType() const +{ + return m_fichSQLType; +} + +unsigned char CConf::getFICHSQLCode() const +{ + return m_fichSQLCode; +} + +unsigned char* CConf::getYsfDT1() +{ + return m_ysfDT1; +} + +unsigned char* CConf::getYsfDT2() +{ + return m_ysfDT2; +} + +char* CConf::getYsfRadioID() +{ + return m_ysfRadioID; +} + bool CConf::getDaemon() const { return m_daemon; diff --git a/YSF2P25/Conf.h b/YSF2P25/Conf.h index ff50c09..b0556c5 100644 --- a/YSF2P25/Conf.h +++ b/YSF2P25/Conf.h @@ -45,6 +45,17 @@ public: unsigned int getLocalPort() const; bool getEnableWiresX() const; bool getWiresXMakeUpper() const; + unsigned char getFICHCallSign() const; + unsigned char getFICHCallMode() const; + unsigned char getFICHFrameTotal() const; + unsigned char getFICHMessageRoute() const; + unsigned char getFICHVOIP() const; + unsigned char getFICHDataType() const; + unsigned char getFICHSQLType() const; + unsigned char getFICHSQLCode() const; + unsigned char* getYsfDT1(); + unsigned char* getYsfDT2(); + char* getYsfRadioID(); bool getDaemon() const; bool getNetworkDebug() const; @@ -78,6 +89,17 @@ private: unsigned int m_localPort; bool m_enableWiresX; bool m_wiresXMakeUpper; + unsigned char m_fichCallSign; + unsigned char m_fichCallMode; + unsigned char m_fichFrameTotal; + unsigned char m_fichMessageRoute; + unsigned char m_fichVOIP; + unsigned char m_fichDataType; + unsigned char m_fichSQLType; + unsigned char m_fichSQLCode; + unsigned char m_ysfDT1[10]; + unsigned char m_ysfDT2[10]; + char m_ysfRadioID[5]; bool m_daemon; bool m_networkDebug; diff --git a/YSF2P25/Version.h b/YSF2P25/Version.h index 673e6a0..36efd6b 100644 --- a/YSF2P25/Version.h +++ b/YSF2P25/Version.h @@ -20,6 +20,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20200503"; +const char* VERSION = "20200605"; #endif diff --git a/YSF2P25/YSF2P25.cpp b/YSF2P25/YSF2P25.cpp index 95bf2ee..2e2635b 100644 --- a/YSF2P25/YSF2P25.cpp +++ b/YSF2P25/YSF2P25.cpp @@ -92,8 +92,6 @@ const unsigned char REC73[] = { const unsigned char REC80[] = { 0x80U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U}; -const uint8_t dt1[10] = {0x01, 0x22, 0x61, 0x5f, 0x2b, 0x03, 0x11, 0x00, 0x00, 0x00}; - #define P25_FRAME_PER 15U #define YSF_FRAME_PER 90U @@ -107,7 +105,6 @@ const char* HEADER1 = "This software is for use on amateur radio networks only," const char* HEADER2 = "it is to be used for educational purposes only. Its use on"; const char* HEADER3 = "commercial networks is strictly prohibited."; const char* HEADER4 = "Copyright(C) 2018,2019 by CA6JAU, G4KLX and others"; -const char ysf_radioid[] = {'H', '5', '0', '0', '0'}; #include #include @@ -451,7 +448,7 @@ int CYSF2P25::run() m_conv.putYSF(buffer + 35U); m_ysfFrames++; } - } + } } } @@ -623,23 +620,23 @@ int CYSF2P25::run() // Set the FICH CYSFFICH fich; fich.setFI(YSF_FI_HEADER); - fich.setCS(2U); - fich.setCM(1U); + fich.setCS(m_conf.getFICHCallSign()); + fich.setCM(m_conf.getFICHCallMode()); fich.setBN(0U); fich.setBT(0U); fich.setFN(0U); - fich.setFT(6U); + fich.setFT(m_conf.getFICHFrameTotal()); fich.setDev(0U); - fich.setMR(0U); - fich.setVoIP(false); - fich.setDT(YSF_DT_VOICE_FR_MODE); - fich.setSQL(0U); - fich.setSQ(0U); + fich.setMR(m_conf.getFICHMessageRoute()); + fich.setVoIP(m_conf.getFICHVOIP()); + fich.setDT(m_conf.getFICHDataType()); + fich.setSQL(m_conf.getFICHSQLType()); + fich.setSQ(m_conf.getFICHSQLCode()); fich.encode(m_ysfFrame + 35U); unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -647,7 +644,7 @@ int CYSF2P25::run() payload.writeHeader(m_ysfFrame + 35U, csd1, csd2); m_ysfNetwork->write(m_ysfFrame); - + ysf_cnt++; ysfWatch.start(); } @@ -663,23 +660,23 @@ int CYSF2P25::run() // Set the FICH CYSFFICH fich; fich.setFI(YSF_FI_TERMINATOR); - fich.setCS(2U); - fich.setCM(1U); + fich.setCS(m_conf.getFICHCallSign()); + fich.setCM(m_conf.getFICHCallMode()); fich.setBN(0U); fich.setBT(0U); - fich.setFN(0U); - fich.setFT(6U); - fich.setDev(0U); - fich.setMR(0U); - fich.setVoIP(false); - fich.setDT(YSF_DT_VOICE_FR_MODE); - fich.setSQL(0U); - fich.setSQ(0U); + fich.setFN(0U); + fich.setFT(m_conf.getFICHFrameTotal()); + fich.setDev(0U); + fich.setMR(m_conf.getFICHMessageRoute()); + fich.setVoIP(m_conf.getFICHVOIP()); + fich.setDT(m_conf.getFICHDataType()); + fich.setSQL(m_conf.getFICHSQLType()); + fich.setSQ(m_conf.getFICHSQLCode()); fich.encode(m_ysfFrame + 35U); unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, ysf_radioid, YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -705,18 +702,18 @@ int CYSF2P25::run() // Set the FICH fich.setFI(YSF_FI_COMMUNICATIONS); - fich.setCS(2U); - fich.setCM(1U); + fich.setCS(m_conf.getFICHCallSign()); + fich.setCM(m_conf.getFICHCallMode()); fich.setBN(0U); fich.setBT(0U); - fich.setFN(fn); - fich.setFT(6U); + fich.setFN(fn); + fich.setFT(m_conf.getFICHFrameTotal()); fich.setDev(0U); - fich.setMR(0U); - fich.setVoIP(false); - fich.setDT(YSF_DT_VOICE_FR_MODE); - fich.setSQL(0U); - fich.setSQ(0U); + fich.setMR(m_conf.getFICHMessageRoute()); + fich.setVoIP(m_conf.getFICHVOIP()); + fich.setDT(m_conf.getFICHDataType()); + fich.setSQL(m_conf.getFICHSQLType()); + fich.setSQ(m_conf.getFICHSQLCode()); fich.encode(m_ysfFrame + 35U); // Net frame counter @@ -724,7 +721,7 @@ int CYSF2P25::run() // Send data to MMDVMHost m_ysfNetwork->write(m_ysfFrame); - + ysf_cnt++; ysfWatch.start(); } @@ -749,7 +746,7 @@ int CYSF2P25::run() m_ysfNetwork->close(); m_p25Network->close(); - + delete m_p25Network; delete m_ysfNetwork; diff --git a/YSF2P25/YSF2P25.ini b/YSF2P25/YSF2P25.ini index 63d3ae0..7cd5c60 100644 --- a/YSF2P25/YSF2P25.ini +++ b/YSF2P25/YSF2P25.ini @@ -13,6 +13,18 @@ LocalAddress=127.0.0.1 LocalPort=42015 EnableWiresX=1 WiresXMakeUpper=1 +RadioID=***** +FICHCallsign=2 +FICHCallMode=0 +FICHBlockTotal=0 +FICHFrameTotal=7 +FICHMessageRoute=0 +FICHVOIP=0 +FICHDataType=2 +FICHSQLType=0 +FICHSQLCode=0 +DT1=49,34,98,95,41,0,0,0,0,0 +DT2=0,0,0,0,108,32,28,32,3,8 Daemon=0 Debug=0 From a6aa187a22626a7347cd948757ad4965e3397815 Mon Sep 17 00:00:00 2001 From: Andy Taylor Date: Fri, 5 Jun 2020 16:51:25 +0100 Subject: [PATCH 04/11] Update YSFFICH.cpp removed duplicate lines --- DMR2YSF/YSFFICH.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/DMR2YSF/YSFFICH.cpp b/DMR2YSF/YSFFICH.cpp index 8579379..07b07da 100644 --- a/DMR2YSF/YSFFICH.cpp +++ b/DMR2YSF/YSFFICH.cpp @@ -238,12 +238,6 @@ void CYSFFICH::setCM(unsigned char cm) m_fich[0U] |= (cm << 2) & 0x0CU; } -void CYSFFICH::setCM(unsigned char cm) -{ - m_fich[0U] &= 0xF3U; - m_fich[0U] |= (cm << 2) & 0x0CU; -} - void CYSFFICH::setFN(unsigned char fn) { m_fich[1U] &= 0xC7U; From 81b4b93e507c013e92ea2bec25082117a329735f Mon Sep 17 00:00:00 2001 From: root Date: Fri, 5 Jun 2020 19:14:20 +0100 Subject: [PATCH 05/11] Small Fixes to DMR2YSF --- DMR2YSF/Conf.cpp | 11 +++++++++++ DMR2YSF/DMR2YSF.cpp | 4 ++-- DMR2YSF/DMR2YSF.ini | 17 ++++++++--------- DMR2YSF/YSFPayload.cpp | 4 ++-- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/DMR2YSF/Conf.cpp b/DMR2YSF/Conf.cpp index 0f8cdbf..4297c56 100644 --- a/DMR2YSF/Conf.cpp +++ b/DMR2YSF/Conf.cpp @@ -43,6 +43,17 @@ m_dstPort(0U), m_localAddress(), m_localPort(0U), m_fcsFile(), +m_fichCallSign(2U), +m_fichCallMode(0U), +m_fichFrameTotal(7U), +m_fichMessageRoute(0U), +m_fichVOIP(0U), +m_fichDataType(2U), +m_fichSQLType(0U), +m_fichSQLCode(0U), +m_ysfDT1(), +m_ysfDT2(), +m_ysfRadioID(), m_daemon(false), m_debug(false), m_dmrId(0U), diff --git a/DMR2YSF/DMR2YSF.cpp b/DMR2YSF/DMR2YSF.cpp index a292bac..1face91 100644 --- a/DMR2YSF/DMR2YSF.cpp +++ b/DMR2YSF/DMR2YSF.cpp @@ -920,9 +920,9 @@ unsigned int CDMR2YSF::findYSFID(std::string cs, bool showdst) if (id == 0) { id = m_defsrcid; if (showdst) - LogMessage("Not DMR ID found, using default ID: %u, DstID: %s%u", id, dmrpc ? "" : "TG ", m_dstid); + LogMessage("DMR ID not found, using default ID: %u, DstID: %s%u", id, dmrpc ? "" : "TG ", m_dstid); else - LogMessage("Not DMR ID found, using default ID: %u", id); + LogMessage("DMR ID not found, using default ID: %u", id); } else { if (showdst) diff --git a/DMR2YSF/DMR2YSF.ini b/DMR2YSF/DMR2YSF.ini index ed24d34..be20a7a 100644 --- a/DMR2YSF/DMR2YSF.ini +++ b/DMR2YSF/DMR2YSF.ini @@ -6,15 +6,14 @@ LocalAddress=127.0.0.1 LocalPort=3200 FCSRooms=FCSRooms.txt RadioID=***** -FICHCallsign=2 -FICHCallMode=0 -FICHBlockTotal=0 -FICHFrameTotal=7 -FICHMessageRoute=0 -FICHVOIP=0 -FICHDataType=2 -FICHSQLType=0 -FICHSQLCode=0 +# FICHCallsign=2 +# FICHCallMode=0 +# FICHFrameTotal=7 +# FICHMessageRoute=0 +# FICHVOIP=0 +# FICHDataType=2 +# FICHSQLType=0 +# FICHSQLCode=0 DT1=49,34,98,95,41,0,0,0,0,0 DT2=0,0,0,0,108,32,28,32,3,8 Daemon=0 diff --git a/DMR2YSF/YSFPayload.cpp b/DMR2YSF/YSFPayload.cpp index adc868d..2f07b63 100644 --- a/DMR2YSF/YSFPayload.cpp +++ b/DMR2YSF/YSFPayload.cpp @@ -25,7 +25,7 @@ #include const unsigned int INTERLEAVE_TABLE_9_20[] = { - 0U, 40U, 80U, 120U, 160U, 200U, 240U, 280U, 320U, + 0U, 40U, 80U, 120U, 160U, 200U, 240U, 280U, 320U, 2U, 42U, 82U, 122U, 162U, 202U, 242U, 282U, 322U, 4U, 44U, 84U, 124U, 164U, 204U, 244U, 284U, 324U, 6U, 46U, 86U, 126U, 166U, 206U, 246U, 286U, 326U, @@ -609,7 +609,7 @@ std::string CYSFPayload::getDest() std::string tmp; if (m_dest) - tmp.assign((const char *)m_dest, YSF_CALLSIGN_LENGTH); + tmp.assign((const char *)m_dest, 5); else tmp = ""; From 04f71ac0d527744c4ebea18ca4c23da5185e3a5d Mon Sep 17 00:00:00 2001 From: root Date: Fri, 5 Jun 2020 22:45:14 +0100 Subject: [PATCH 06/11] Update configuration defaults --- YSF2DMR/Conf.cpp | 11 +++++++++++ YSF2DMR/YSF2DMR.ini | 18 +++++++++--------- YSF2NXDN/Conf.cpp | 11 +++++++++++ YSF2NXDN/YSF2NXDN.ini | 18 +++++++++--------- YSF2P25/Conf.cpp | 11 +++++++++++ YSF2P25/YSF2P25.ini | 18 +++++++++--------- 6 files changed, 60 insertions(+), 27 deletions(-) diff --git a/YSF2DMR/Conf.cpp b/YSF2DMR/Conf.cpp index 178a656..0684252 100644 --- a/YSF2DMR/Conf.cpp +++ b/YSF2DMR/Conf.cpp @@ -50,6 +50,17 @@ m_enableWiresX(false), m_remoteGateway(false), m_hangTime(1000U), m_wiresXMakeUpper(true), +m_fichCallSign(2U), +m_fichCallMode(0U), +m_fichFrameTotal(7U), +m_fichMessageRoute(0U), +m_fichVOIP(0U), +m_fichDataType(2U), +m_fichSQLType(0U), +m_fichSQLCode(0U), +m_ysfDT1(), +m_ysfDT2(), +m_ysfRadioID(), m_daemon(false), m_rxFrequency(0U), m_txFrequency(0U), diff --git a/YSF2DMR/YSF2DMR.ini b/YSF2DMR/YSF2DMR.ini index f8341a5..57c0e0d 100644 --- a/YSF2DMR/YSF2DMR.ini +++ b/YSF2DMR/YSF2DMR.ini @@ -22,15 +22,15 @@ RemoteGateway=0 HangTime=1000 WiresXMakeUpper=1 RadioID=***** -FICHCallsign=2 -FICHCallMode=0 -FICHBlockTotal=0 -FICHFrameTotal=7 -FICHMessageRoute=0 -FICHVOIP=0 -FICHDataType=2 -FICHSQLType=0 -FICHSQLCode=0 +# FICHCallsign=2 +# FICHCallMode=0 +# FICHBlockTotal=0 +# FICHFrameTotal=7 +# FICHMessageRoute=0 +# FICHVOIP=0 +# FICHDataType=2 +# FICHSQLType=0 +# FICHSQLCode=0 DT1=49,34,98,95,41,0,0,0,0,0 DT2=0,0,0,0,108,32,28,32,3,8 Daemon=0 diff --git a/YSF2NXDN/Conf.cpp b/YSF2NXDN/Conf.cpp index 9619e35..55535e4 100644 --- a/YSF2NXDN/Conf.cpp +++ b/YSF2NXDN/Conf.cpp @@ -47,6 +47,17 @@ m_localAddress(), m_localPort(0U), m_enableWiresX(false), m_wiresXMakeUpper(true), +m_fichCallSign(2U), +m_fichCallMode(0U), +m_fichFrameTotal(7U), +m_fichMessageRoute(0U), +m_fichVOIP(0U), +m_fichDataType(2U), +m_fichSQLType(0U), +m_fichSQLCode(0U), +m_ysfDT1(), +m_ysfDT2(), +m_ysfRadioID(), m_daemon(false), m_rxFrequency(0U), m_txFrequency(0U), diff --git a/YSF2NXDN/YSF2NXDN.ini b/YSF2NXDN/YSF2NXDN.ini index 702ee58..afd745f 100644 --- a/YSF2NXDN/YSF2NXDN.ini +++ b/YSF2NXDN/YSF2NXDN.ini @@ -17,15 +17,15 @@ LocalPort=42014 EnableWiresX=1 WiresXMakeUpper=1 RadioID=***** -FICHCallsign=2 -FICHCallMode=0 -FICHBlockTotal=0 -FICHFrameTotal=7 -FICHMessageRoute=0 -FICHVOIP=0 -FICHDataType=2 -FICHSQLType=0 -FICHSQLCode=0 +# FICHCallsign=2 +# FICHCallMode=0 +# FICHBlockTotal=0 +# FICHFrameTotal=7 +# FICHMessageRoute=0 +# FICHVOIP=0 +# FICHDataType=2 +# FICHSQLType=0 +# FICHSQLCode=0 DT1=49,34,98,95,41,0,0,0,0,0 DT2=0,0,0,0,108,32,28,32,3,8 Daemon=0 diff --git a/YSF2P25/Conf.cpp b/YSF2P25/Conf.cpp index 208967b..49eda7c 100644 --- a/YSF2P25/Conf.cpp +++ b/YSF2P25/Conf.cpp @@ -46,6 +46,17 @@ m_localAddress(), m_localPort(0U), m_enableWiresX(false), m_wiresXMakeUpper(true), +m_fichCallSign(2U), +m_fichCallMode(0U), +m_fichFrameTotal(7U), +m_fichMessageRoute(0U), +m_fichVOIP(0U), +m_fichDataType(2U), +m_fichSQLType(0U), +m_fichSQLCode(0U), +m_ysfDT1(), +m_ysfDT2(), +m_ysfRadioID(), m_daemon(false), m_networkDebug(false), m_rxFrequency(0U), diff --git a/YSF2P25/YSF2P25.ini b/YSF2P25/YSF2P25.ini index 7cd5c60..88c184e 100644 --- a/YSF2P25/YSF2P25.ini +++ b/YSF2P25/YSF2P25.ini @@ -14,15 +14,15 @@ LocalPort=42015 EnableWiresX=1 WiresXMakeUpper=1 RadioID=***** -FICHCallsign=2 -FICHCallMode=0 -FICHBlockTotal=0 -FICHFrameTotal=7 -FICHMessageRoute=0 -FICHVOIP=0 -FICHDataType=2 -FICHSQLType=0 -FICHSQLCode=0 +# FICHCallsign=2 +# FICHCallMode=0 +# FICHBlockTotal=0 +# FICHFrameTotal=7 +# FICHMessageRoute=0 +# FICHVOIP=0 +# FICHDataType=2 +# FICHSQLType=0 +# FICHSQLCode=0 DT1=49,34,98,95,41,0,0,0,0,0 DT2=0,0,0,0,108,32,28,32,3,8 Daemon=0 From ffd8b2c7e15e4c897451d02c91483b6425a5fa38 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Sat, 6 Jun 2020 15:08:57 +0100 Subject: [PATCH 07/11] Use std::vector and std::string. --- DMR2YSF/Conf.cpp | 30 ++++++++++-------------------- DMR2YSF/Conf.h | 12 ++++++------ DMR2YSF/DMR2YSF.cpp | 28 ++++++++++++++++++---------- 3 files changed, 34 insertions(+), 36 deletions(-) diff --git a/DMR2YSF/Conf.cpp b/DMR2YSF/Conf.cpp index 4297c56..251c02d 100644 --- a/DMR2YSF/Conf.cpp +++ b/DMR2YSF/Conf.cpp @@ -119,7 +119,6 @@ bool CConf::read() // Remove quotes from the value size_t len = ::strlen(value); char *t; - unsigned char tokencnt = 0; if (len > 1U && *value == '"' && value[len - 1U] == '"') { value[len - 1U] = '\0'; value++; @@ -146,7 +145,7 @@ bool CConf::read() else if (::strcmp(key, "Debug") == 0) m_debug = ::atoi(value) == 1; else if (::strcmp(key, "RadioID") == 0) - ::memcpy(m_ysfRadioID, value, 5); + m_ysfRadioID = value; else if (::strcmp(key, "FICHCallsign") == 0) m_fichCallSign = ::atoi(value); else if (::strcmp(key, "FICHCallMode") == 0) @@ -164,22 +163,13 @@ bool CConf::read() else if (::strcmp(key, "FICHSQLCode") == 0) m_fichSQLCode = ::atoi(value); else if (::strcmp(key, "DT1") == 0){ - tokencnt = 0; - while((t = strtok_r(value, ",", &value)) != NULL){ - if(tokencnt < 10){ - m_ysfDT1[tokencnt++] = atoi(t); - } - } + while ((t = strtok_r(value, ",", &value)) != NULL) + m_ysfDT1.push_back(::atoi(t)); + } else if (::strcmp(key, "DT2") == 0){ + while ((t = strtok_r(value, ",", &value)) != NULL) + m_ysfDT2.push_back(::atoi(t)); } - else if (::strcmp(key, "DT2") == 0){ - tokencnt = 0; - while((t = strtok_r(value, ",", &value)) != NULL){ - if(tokencnt < 10){ - m_ysfDT2[tokencnt++] = atoi(t); - } - } - } - } else if (section == SECTION_DMR_NETWORK) { + } else if (section == SECTION_DMR_NETWORK) { if (::strcmp(key, "Id") == 0) m_dmrId = (unsigned int)::atoi(value); else if (::strcmp(key, "RptAddress") == 0) @@ -300,17 +290,17 @@ unsigned char CConf::getFICHSQLCode() const return m_fichSQLCode; } -unsigned char* CConf::getYsfDT1() +std::vector CConf::getYsfDT1() { return m_ysfDT1; } -unsigned char* CConf::getYsfDT2() +std::vector CConf::getYsfDT2() { return m_ysfDT2; } -char* CConf::getYsfRadioID() +std::string CConf::getYsfRadioID() { return m_ysfRadioID; } diff --git a/DMR2YSF/Conf.h b/DMR2YSF/Conf.h index cef1052..cf9af24 100644 --- a/DMR2YSF/Conf.h +++ b/DMR2YSF/Conf.h @@ -46,9 +46,9 @@ public: unsigned char getFICHDataType() const; unsigned char getFICHSQLType() const; unsigned char getFICHSQLCode() const; - unsigned char* getYsfDT1(); - unsigned char* getYsfDT2(); - char* getYsfRadioID(); + std::vector getYsfDT1(); + std::vector getYsfDT2(); + std::string getYsfRadioID(); bool getDaemon() const; bool getDebug() const; @@ -89,9 +89,9 @@ private: unsigned char m_fichDataType; unsigned char m_fichSQLType; unsigned char m_fichSQLCode; - unsigned char m_ysfDT1[10U]; - unsigned char m_ysfDT2[10U]; - char m_ysfRadioID[5]; + std::vector m_ysfDT1; + std::vector m_ysfDT2; + std::string m_ysfRadioID; bool m_daemon; bool m_debug; diff --git a/DMR2YSF/DMR2YSF.cpp b/DMR2YSF/DMR2YSF.cpp index 1face91..9e34c81 100644 --- a/DMR2YSF/DMR2YSF.cpp +++ b/DMR2YSF/DMR2YSF.cpp @@ -665,7 +665,7 @@ int CDMR2YSF::run() unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH); memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -706,7 +706,7 @@ int CDMR2YSF::run() unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -734,25 +734,33 @@ int CDMR2YSF::run() switch (fn) { case 0: memset(dch, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); break; case 1: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netSrc.c_str()); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (unsigned char*)m_netSrc.c_str()); break; case 2: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netDst.c_str()); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (unsigned char*)m_netDst.c_str()); break; case 5: memset(dch, ' ', YSF_CALLSIGN_LENGTH/2); - memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); // Rem3/4 break; - case 6: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, m_conf.getYsfDT1()); + case 6: { + unsigned char dt1[10U] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U}; + for (unsigned int i = 0U; i < m_conf.getYsfDT1().size() && i < 10U; i++) + dt1[i] = m_conf.getYsfDT1()[i]; + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt1); + } break; - case 7: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, m_conf.getYsfDT2()); + case 7: { + unsigned char dt2[10U] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U}; + for (unsigned int i = 0U; i < m_conf.getYsfDT2().size() && i < 10U; i++) + dt2[i] = m_conf.getYsfDT2()[i]; + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt2); + } break; default: ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)" "); From b4f762dca14180e4f790b2401bed3f1f539ed855 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 6 Jun 2020 19:22:56 +0100 Subject: [PATCH 08/11] Replicate G4KLX patch against YSF2DMR --- YSF2DMR/Conf.cpp | 30 ++++++++++-------------------- YSF2DMR/Conf.h | 13 ++++++++----- YSF2DMR/YSF2DMR.cpp | 28 ++++++++++++++++++---------- 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/YSF2DMR/Conf.cpp b/YSF2DMR/Conf.cpp index 0684252..7cb61ab 100644 --- a/YSF2DMR/Conf.cpp +++ b/YSF2DMR/Conf.cpp @@ -154,7 +154,6 @@ bool CConf::read() // Remove quotes from the value size_t len = ::strlen(value); char *t; - unsigned char tokencnt = 0; if (len > 1U && *value == '"' && value[len - 1U] == '"') { value[len - 1U] = '\0'; value++; @@ -190,7 +189,7 @@ bool CConf::read() else if (::strcmp(key, "Daemon") == 0) m_daemon = ::atoi(value) == 1; else if (::strcmp(key, "RadioID") == 0) - ::memcpy(m_ysfRadioID, value, 5); + m_ysfRadioID = value; else if (::strcmp(key, "FICHCallsign") == 0) m_fichCallSign = ::atoi(value); else if (::strcmp(key, "FICHCallMode") == 0) @@ -207,21 +206,12 @@ bool CConf::read() m_fichSQLType = ::atoi(value); else if (::strcmp(key, "FICHSQLCode") == 0) m_fichSQLCode = ::atoi(value); - else if (::strcmp(key, "DT1") == 0){ - tokencnt = 0; - while((t = strtok_r(value, ",", &value)) != NULL){ - if(tokencnt < 10){ - m_ysfDT1[tokencnt++] = atoi(t); - } - } - } - else if (::strcmp(key, "DT2") == 0){ - tokencnt = 0; - while((t = strtok_r(value, ",", &value)) != NULL){ - if(tokencnt < 10){ - m_ysfDT2[tokencnt++] = atoi(t); - } - } + else if (::strcmp(key, "DT1") == 0){ + while ((t = strtok_r(value, ",", &value)) != NULL) + m_ysfDT1.push_back(::atoi(t)); + } else if (::strcmp(key, "DT2") == 0){ + while ((t = strtok_r(value, ",", &value)) != NULL) + m_ysfDT2.push_back(::atoi(t)); } } else if (section == SECTION_INFO) { if (::strcmp(key, "TXFrequency") == 0) @@ -421,17 +411,17 @@ unsigned char CConf::getFICHSQLCode() const return m_fichSQLCode; } -unsigned char* CConf::getYsfDT1() +std::vector CConf::getYsfDT1() { return m_ysfDT1; } -unsigned char* CConf::getYsfDT2() +std::vector CConf::getYsfDT2() { return m_ysfDT2; } -char* CConf::getYsfRadioID() +std::string CConf::getYsfRadioID() { return m_ysfRadioID; } diff --git a/YSF2DMR/Conf.h b/YSF2DMR/Conf.h index cac66bd..63308f1 100644 --- a/YSF2DMR/Conf.h +++ b/YSF2DMR/Conf.h @@ -51,10 +51,13 @@ public: unsigned char getFICHDataType() const; unsigned char getFICHSQLType() const; unsigned char getFICHSQLCode() const; + std::vector getYsfDT1(); + std::vector getYsfDT2(); + std::string getYsfRadioID(); unsigned char* getYsfDT1(); unsigned char* getYsfDT2(); - char* getYsfRadioID(); - bool getDaemon() const; + char* getYsfRadioID(); + bool getDaemon() const; // The Info section unsigned int getRxFrequency() const; @@ -128,9 +131,9 @@ private: unsigned char m_fichDataType; unsigned char m_fichSQLType; unsigned char m_fichSQLCode; - unsigned char m_ysfDT1[10U]; - unsigned char m_ysfDT2[10U]; - char m_ysfRadioID[5]; + std::vector m_ysfDT1; + std::vector m_ysfDT2; + std::string m_ysfRadioID; bool m_daemon; unsigned int m_rxFrequency; diff --git a/YSF2DMR/YSF2DMR.cpp b/YSF2DMR/YSF2DMR.cpp index f21018a..a73b99c 100644 --- a/YSF2DMR/YSF2DMR.cpp +++ b/YSF2DMR/YSF2DMR.cpp @@ -957,7 +957,7 @@ int CYSF2DMR::run() unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -997,7 +997,7 @@ int CYSF2DMR::run() unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -1024,25 +1024,33 @@ int CYSF2DMR::run() switch (fn) { case 0: memset(dch, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); break; case 1: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netSrc.c_str()); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (unsigned char*)m_netSrc.c_str()); break; case 2: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netDst.c_str()); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (unsigned char*)m_netDst.c_str()); break; case 5: memset(dch, ' ', YSF_CALLSIGN_LENGTH/2); - memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); // Rem3/4 break; - case 6: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, m_conf.getYsfDT1()); + case 6: { + unsigned char dt1[10U] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U}; + for (unsigned int i = 0U; i < m_conf.getYsfDT1().size() && i < 10U; i++) + dt1[i] = m_conf.getYsfDT1()[i]; + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt1); + } break; - case 7: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, m_conf.getYsfDT2()); + case 7: { + unsigned char dt2[10U] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U}; + for (unsigned int i = 0U; i < m_conf.getYsfDT2().size() && i < 10U; i++) + dt2[i] = m_conf.getYsfDT2()[i]; + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt2); + } break; default: ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)" "); From 0570756044e7304a3301a88b00d81ab5692af718 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 6 Jun 2020 19:52:21 +0100 Subject: [PATCH 09/11] Patching YSF2NXDN matching G4KLX code --- YSF2NXDN/Conf.cpp | 32 +++++++++++--------------------- YSF2NXDN/Conf.h | 12 ++++++------ YSF2NXDN/YSF2NXDN.cpp | 28 ++++++++++++++++++---------- 3 files changed, 35 insertions(+), 37 deletions(-) diff --git a/YSF2NXDN/Conf.cpp b/YSF2NXDN/Conf.cpp index 55535e4..c37e6ac 100644 --- a/YSF2NXDN/Conf.cpp +++ b/YSF2NXDN/Conf.cpp @@ -138,7 +138,6 @@ bool CConf::read() // Remove quotes from the value size_t len = ::strlen(value); char *t; - unsigned char tokencnt = 0; if (len > 1U && *value == '"' && value[len - 1U] == '"') { value[len - 1U] = '\0'; value++; @@ -181,7 +180,7 @@ bool CConf::read() else if (::strcmp(key, "WiresXMakeUpper") == 0) m_wiresXMakeUpper = ::atoi(value) == 1; else if (::strcmp(key, "RadioID") == 0) - ::memcpy(m_ysfRadioID, value, 5); + m_ysfRadioID = value; else if (::strcmp(key, "FICHCallsign") == 0) m_fichCallSign = ::atoi(value); else if (::strcmp(key, "FICHCallMode") == 0) @@ -198,22 +197,13 @@ bool CConf::read() m_fichSQLType = ::atoi(value); else if (::strcmp(key, "FICHSQLCode") == 0) m_fichSQLCode = ::atoi(value); - else if (::strcmp(key, "DT1") == 0){ - tokencnt = 0; - while((t = strtok_r(value, ",", &value)) != NULL){ - if(tokencnt < 10){ - m_ysfDT1[tokencnt++] = atoi(t); - } - } - } - else if (::strcmp(key, "DT2") == 0){ - tokencnt = 0; - while((t = strtok_r(value, ",", &value)) != NULL){ - if(tokencnt < 10){ - m_ysfDT2[tokencnt++] = atoi(t); - } - } - } + else if (::strcmp(key, "DT1") == 0){ + while ((t = strtok_r(value, ",", &value)) != NULL) + m_ysfDT1.push_back(::atoi(t)); + } else if (::strcmp(key, "DT2") == 0){ + while ((t = strtok_r(value, ",", &value)) != NULL) + m_ysfDT2.push_back(::atoi(t)); + } else if (::strcmp(key, "Daemon") == 0) m_daemon = ::atoi(value) == 1; } else if (section == SECTION_NXDN_NETWORK) { @@ -380,17 +370,17 @@ unsigned char CConf::getFICHSQLCode() const return m_fichSQLCode; } -unsigned char* CConf::getYsfDT1() +std::vector CConf::getYsfDT1() { return m_ysfDT1; } -unsigned char* CConf::getYsfDT2() +std::vector CConf::getYsfDT2() { return m_ysfDT2; } -char* CConf::getYsfRadioID() +std::string CConf::getYsfRadioID() { return m_ysfRadioID; } diff --git a/YSF2NXDN/Conf.h b/YSF2NXDN/Conf.h index 3e05096..7f697ea 100644 --- a/YSF2NXDN/Conf.h +++ b/YSF2NXDN/Conf.h @@ -56,9 +56,9 @@ public: unsigned char getFICHDataType() const; unsigned char getFICHSQLType() const; unsigned char getFICHSQLCode() const; - unsigned char* getYsfDT1(); - unsigned char* getYsfDT2(); - char* getYsfRadioID(); + std::vector getYsfDT1(); + std::vector getYsfDT2(); + std::string getYsfRadioID(); bool getDaemon() const; // The NXDN Network section @@ -109,9 +109,9 @@ private: unsigned char m_fichDataType; unsigned char m_fichSQLType; unsigned char m_fichSQLCode; - unsigned char m_ysfDT1[10U]; - unsigned char m_ysfDT2[10U]; - char m_ysfRadioID[5]; + std::vector m_ysfDT1; + std::vector m_ysfDT2; + std::string m_ysfRadioID; bool m_daemon; unsigned int m_rxFrequency; diff --git a/YSF2NXDN/YSF2NXDN.cpp b/YSF2NXDN/YSF2NXDN.cpp index 9af99cc..a72bd8d 100644 --- a/YSF2NXDN/YSF2NXDN.cpp +++ b/YSF2NXDN/YSF2NXDN.cpp @@ -620,7 +620,7 @@ int CYSF2NXDN::run() unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -660,7 +660,7 @@ int CYSF2NXDN::run() unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -687,25 +687,33 @@ int CYSF2NXDN::run() switch (fn) { case 0: memset(dch, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); break; case 1: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netSrc.c_str()); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (unsigned char*)m_netSrc.c_str()); break; case 2: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)m_netDst.c_str()); + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (unsigned char*)m_netDst.c_str()); break; case 5: memset(dch, ' ', YSF_CALLSIGN_LENGTH/2); - memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(dch + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dch); // Rem3/4 break; - case 6: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, m_conf.getYsfDT1()); + case 6: { + unsigned char dt1[10U] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U}; + for (unsigned int i = 0U; i < m_conf.getYsfDT1().size() && i < 10U; i++) + dt1[i] = m_conf.getYsfDT1()[i]; + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt1); + } break; - case 7: - ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, m_conf.getYsfDT2()); + case 7: { + unsigned char dt2[10U] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U}; + for (unsigned int i = 0U; i < m_conf.getYsfDT2().size() && i < 10U; i++) + dt2[i] = m_conf.getYsfDT2()[i]; + ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, dt2); + } break; default: ysfPayload.writeVDMode2Data(m_ysfFrame + 35U, (const unsigned char*)" "); From 258a2cd5649120dab852ab38cebbf5aa2b75f7a8 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 6 Jun 2020 19:53:00 +0100 Subject: [PATCH 10/11] Patching YSF2P25 matching G4KLX code --- YSF2P25/Conf.cpp | 32 +++++++++++--------------------- YSF2P25/Conf.h | 12 ++++++------ YSF2P25/YSF2P25.cpp | 4 ++-- 3 files changed, 19 insertions(+), 29 deletions(-) diff --git a/YSF2P25/Conf.cpp b/YSF2P25/Conf.cpp index 49eda7c..e25286b 100644 --- a/YSF2P25/Conf.cpp +++ b/YSF2P25/Conf.cpp @@ -126,7 +126,6 @@ bool CConf::read() // Remove quotes from the value size_t len = ::strlen(value); char *t; - unsigned char tokencnt = 0; if (len > 1U && *value == '"' && value[len - 1U] == '"') { value[len - 1U] = '\0'; value++; @@ -163,7 +162,7 @@ bool CConf::read() else if (::strcmp(key, "WiresXMakeUpper") == 0) m_wiresXMakeUpper = ::atoi(value) == 1; else if (::strcmp(key, "RadioID") == 0) - ::memcpy(m_ysfRadioID, value, 5); + m_ysfRadioID = value; else if (::strcmp(key, "FICHCallsign") == 0) m_fichCallSign = ::atoi(value); else if (::strcmp(key, "FICHCallMode") == 0) @@ -180,22 +179,13 @@ bool CConf::read() m_fichSQLType = ::atoi(value); else if (::strcmp(key, "FICHSQLCode") == 0) m_fichSQLCode = ::atoi(value); - else if (::strcmp(key, "DT1") == 0){ - tokencnt = 0; - while((t = strtok_r(value, ",", &value)) != NULL){ - if(tokencnt < 10){ - m_ysfDT1[tokencnt++] = atoi(t); - } - } - } - else if (::strcmp(key, "DT2") == 0){ - tokencnt = 0; - while((t = strtok_r(value, ",", &value)) != NULL){ - if(tokencnt < 10){ - m_ysfDT2[tokencnt++] = atoi(t); - } - } - } + else if (::strcmp(key, "DT1") == 0){ + while ((t = strtok_r(value, ",", &value)) != NULL) + m_ysfDT1.push_back(::atoi(t)); + } else if (::strcmp(key, "DT2") == 0){ + while ((t = strtok_r(value, ",", &value)) != NULL) + m_ysfDT2.push_back(::atoi(t)); + } else if (::strcmp(key, "Daemon") == 0) m_daemon = ::atoi(value) == 1; else if (::strcmp(key, "Debug") == 0) @@ -334,17 +324,17 @@ unsigned char CConf::getFICHSQLCode() const return m_fichSQLCode; } -unsigned char* CConf::getYsfDT1() +std::vector CConf::getYsfDT1() { return m_ysfDT1; } -unsigned char* CConf::getYsfDT2() +std::vector CConf::getYsfDT2() { return m_ysfDT2; } -char* CConf::getYsfRadioID() +std::string CConf::getYsfRadioID() { return m_ysfRadioID; } diff --git a/YSF2P25/Conf.h b/YSF2P25/Conf.h index b0556c5..d95d1c3 100644 --- a/YSF2P25/Conf.h +++ b/YSF2P25/Conf.h @@ -53,9 +53,9 @@ public: unsigned char getFICHDataType() const; unsigned char getFICHSQLType() const; unsigned char getFICHSQLCode() const; - unsigned char* getYsfDT1(); - unsigned char* getYsfDT2(); - char* getYsfRadioID(); + std::vector getYsfDT1(); + std::vector getYsfDT2(); + std::string getYsfRadioID(); bool getDaemon() const; bool getNetworkDebug() const; @@ -97,9 +97,9 @@ private: unsigned char m_fichDataType; unsigned char m_fichSQLType; unsigned char m_fichSQLCode; - unsigned char m_ysfDT1[10]; - unsigned char m_ysfDT2[10]; - char m_ysfRadioID[5]; + std::vector m_ysfDT1; + std::vector m_ysfDT2; + std::string m_ysfRadioID; bool m_daemon; bool m_networkDebug; diff --git a/YSF2P25/YSF2P25.cpp b/YSF2P25/YSF2P25.cpp index 2e2635b..966b8d9 100644 --- a/YSF2P25/YSF2P25.cpp +++ b/YSF2P25/YSF2P25.cpp @@ -636,7 +636,7 @@ int CYSF2P25::run() unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); @@ -676,7 +676,7 @@ int CYSF2P25::run() unsigned char csd1[20U], csd2[20U]; memset(csd1, '*', YSF_CALLSIGN_LENGTH/2); - memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID(), YSF_CALLSIGN_LENGTH/2); + memcpy(csd1 + YSF_CALLSIGN_LENGTH/2, m_conf.getYsfRadioID().c_str(), YSF_CALLSIGN_LENGTH/2); memcpy(csd1 + YSF_CALLSIGN_LENGTH, m_netSrc.c_str(), YSF_CALLSIGN_LENGTH); memset(csd2, ' ', YSF_CALLSIGN_LENGTH + YSF_CALLSIGN_LENGTH); From 1c6e37618b1a68cf35d9250b3cbb87ca998b1b46 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 6 Jun 2020 20:00:10 +0100 Subject: [PATCH 11/11] Add default RadioID --- DMR2YSF/Conf.cpp | 2 +- DMR2YSF/DMR2YSF.ini | 2 +- YSF2DMR/Conf.cpp | 2 +- YSF2DMR/YSF2DMR.ini | 2 +- YSF2NXDN/Conf.cpp | 2 +- YSF2NXDN/YSF2NXDN.ini | 2 +- YSF2P25/Conf.cpp | 2 +- YSF2P25/YSF2P25.ini | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/DMR2YSF/Conf.cpp b/DMR2YSF/Conf.cpp index 251c02d..c31d0a8 100644 --- a/DMR2YSF/Conf.cpp +++ b/DMR2YSF/Conf.cpp @@ -53,7 +53,7 @@ m_fichSQLType(0U), m_fichSQLCode(0U), m_ysfDT1(), m_ysfDT2(), -m_ysfRadioID(), +m_ysfRadioID("*****"), m_daemon(false), m_debug(false), m_dmrId(0U), diff --git a/DMR2YSF/DMR2YSF.ini b/DMR2YSF/DMR2YSF.ini index be20a7a..dce0064 100644 --- a/DMR2YSF/DMR2YSF.ini +++ b/DMR2YSF/DMR2YSF.ini @@ -5,7 +5,7 @@ GatewayPort=4200 LocalAddress=127.0.0.1 LocalPort=3200 FCSRooms=FCSRooms.txt -RadioID=***** +# RadioID=***** # FICHCallsign=2 # FICHCallMode=0 # FICHFrameTotal=7 diff --git a/YSF2DMR/Conf.cpp b/YSF2DMR/Conf.cpp index 7cb61ab..4a21ad3 100644 --- a/YSF2DMR/Conf.cpp +++ b/YSF2DMR/Conf.cpp @@ -60,7 +60,7 @@ m_fichSQLType(0U), m_fichSQLCode(0U), m_ysfDT1(), m_ysfDT2(), -m_ysfRadioID(), +m_ysfRadioID("*****"), m_daemon(false), m_rxFrequency(0U), m_txFrequency(0U), diff --git a/YSF2DMR/YSF2DMR.ini b/YSF2DMR/YSF2DMR.ini index 57c0e0d..a40ef4a 100644 --- a/YSF2DMR/YSF2DMR.ini +++ b/YSF2DMR/YSF2DMR.ini @@ -21,7 +21,7 @@ EnableWiresX=1 RemoteGateway=0 HangTime=1000 WiresXMakeUpper=1 -RadioID=***** +# RadioID=***** # FICHCallsign=2 # FICHCallMode=0 # FICHBlockTotal=0 diff --git a/YSF2NXDN/Conf.cpp b/YSF2NXDN/Conf.cpp index c37e6ac..753dc7e 100644 --- a/YSF2NXDN/Conf.cpp +++ b/YSF2NXDN/Conf.cpp @@ -57,7 +57,7 @@ m_fichSQLType(0U), m_fichSQLCode(0U), m_ysfDT1(), m_ysfDT2(), -m_ysfRadioID(), +m_ysfRadioID("*****"), m_daemon(false), m_rxFrequency(0U), m_txFrequency(0U), diff --git a/YSF2NXDN/YSF2NXDN.ini b/YSF2NXDN/YSF2NXDN.ini index afd745f..c067601 100644 --- a/YSF2NXDN/YSF2NXDN.ini +++ b/YSF2NXDN/YSF2NXDN.ini @@ -16,7 +16,7 @@ LocalAddress=127.0.0.1 LocalPort=42014 EnableWiresX=1 WiresXMakeUpper=1 -RadioID=***** +# RadioID=***** # FICHCallsign=2 # FICHCallMode=0 # FICHBlockTotal=0 diff --git a/YSF2P25/Conf.cpp b/YSF2P25/Conf.cpp index e25286b..fbbf99b 100644 --- a/YSF2P25/Conf.cpp +++ b/YSF2P25/Conf.cpp @@ -56,7 +56,7 @@ m_fichSQLType(0U), m_fichSQLCode(0U), m_ysfDT1(), m_ysfDT2(), -m_ysfRadioID(), +m_ysfRadioID("*****"), m_daemon(false), m_networkDebug(false), m_rxFrequency(0U), diff --git a/YSF2P25/YSF2P25.ini b/YSF2P25/YSF2P25.ini index 88c184e..f75e2ac 100644 --- a/YSF2P25/YSF2P25.ini +++ b/YSF2P25/YSF2P25.ini @@ -13,7 +13,7 @@ LocalAddress=127.0.0.1 LocalPort=42015 EnableWiresX=1 WiresXMakeUpper=1 -RadioID=***** +# RadioID=***** # FICHCallsign=2 # FICHCallMode=0 # FICHBlockTotal=0