From 3acd89fe9d3a087b9cae0e342f7d635aa8af4694 Mon Sep 17 00:00:00 2001 From: Andy CA6JAU Date: Sat, 28 Jul 2018 22:09:51 -0400 Subject: [PATCH] Fill with silence YSF frames for short YSF transmissions --- YSF2DMR/Conf.cpp | 16 ++++++++-------- YSF2DMR/Conf.h | 4 ++-- YSF2DMR/ModeConv.cpp | 11 +++++++++++ YSF2DMR/ModeConv.h | 1 + YSF2DMR/YSF2DMR.cpp | 11 ++++++++++- YSF2DMR/YSF2DMR.h | 1 + YSF2DMR/YSF2DMR.ini | 2 +- 7 files changed, 34 insertions(+), 12 deletions(-) diff --git a/YSF2DMR/Conf.cpp b/YSF2DMR/Conf.cpp index e41d7f7..43886a5 100644 --- a/YSF2DMR/Conf.cpp +++ b/YSF2DMR/Conf.cpp @@ -48,6 +48,7 @@ m_localAddress(), m_localPort(0U), m_enableWiresX(false), m_remoteGateway(false), +m_hangTime(1000U), m_daemon(false), m_rxFrequency(0U), m_txFrequency(0U), @@ -72,7 +73,6 @@ m_dmrNetworkOptions(), m_dmrNetworkDebug(false), m_dmrNetworkJitterEnabled(true), m_dmrNetworkJitter(500U), -m_dmrHangTime(1000U), m_dmrNetworkEnableUnlink(true), m_dmrNetworkIDUnlink(4000U), m_dmrNetworkPCUnlink(false), @@ -168,6 +168,8 @@ bool CConf::read() m_enableWiresX = ::atoi(value) == 1; else if (::strcmp(key, "RemoteGateway") == 0) m_remoteGateway = ::atoi(value) == 1; + else if (::strcmp(key, "HangTime") == 0) + m_hangTime = (unsigned int)::atoi(value); else if (::strcmp(key, "Daemon") == 0) m_daemon = ::atoi(value) == 1; } else if (section == SECTION_INFO) { @@ -221,8 +223,6 @@ bool CConf::read() m_dmrNetworkJitterEnabled = ::atoi(value) == 1; else if (::strcmp(key, "Jitter") == 0) m_dmrNetworkJitter = (unsigned int)::atoi(value); - else if (::strcmp(key, "HangTime") == 0) - m_dmrHangTime = (unsigned int)::atoi(value); else if (::strcmp(key, "EnableUnlink") == 0) m_dmrNetworkEnableUnlink = ::atoi(value) == 1; else if (::strcmp(key, "TGUnlink") == 0) @@ -308,6 +308,11 @@ bool CConf::getRemoteGateway() const return m_remoteGateway; } +unsigned int CConf::getHangTime() const +{ + return m_hangTime; +} + bool CConf::getDaemon() const { return m_daemon; @@ -463,11 +468,6 @@ unsigned int CConf::getDMRNetworkJitter() const return m_dmrNetworkJitter; } -unsigned int CConf::getDMRHangTime() const -{ - return m_dmrHangTime; -} - bool CConf::getDMRNetworkEnableUnlink() const { return m_dmrNetworkEnableUnlink; diff --git a/YSF2DMR/Conf.h b/YSF2DMR/Conf.h index 032f85f..c7f0214 100644 --- a/YSF2DMR/Conf.h +++ b/YSF2DMR/Conf.h @@ -41,6 +41,7 @@ public: unsigned int getLocalPort() const; bool getEnableWiresX() const; bool getRemoteGateway() const; + unsigned int getHangTime() const; bool getDaemon() const; // The Info section @@ -69,7 +70,6 @@ public: bool getDMRNetworkDebug() const; bool getDMRNetworkJitterEnabled() const; unsigned int getDMRNetworkJitter() const; - unsigned int getDMRHangTime() const; bool getDMRNetworkEnableUnlink() const; unsigned int getDMRNetworkIDUnlink() const; bool getDMRNetworkPCUnlink() const; @@ -104,6 +104,7 @@ private: unsigned int m_localPort; bool m_enableWiresX; bool m_remoteGateway; + unsigned int m_hangTime; bool m_daemon; unsigned int m_rxFrequency; @@ -130,7 +131,6 @@ private: bool m_dmrNetworkDebug; bool m_dmrNetworkJitterEnabled; unsigned int m_dmrNetworkJitter; - unsigned int m_dmrHangTime; bool m_dmrNetworkEnableUnlink; unsigned int m_dmrNetworkIDUnlink; bool m_dmrNetworkPCUnlink; diff --git a/YSF2DMR/ModeConv.cpp b/YSF2DMR/ModeConv.cpp index 5c9c358..6041425 100644 --- a/YSF2DMR/ModeConv.cpp +++ b/YSF2DMR/ModeConv.cpp @@ -687,6 +687,17 @@ void CModeConv::putAMBE2DMR(unsigned int dat_a, unsigned int dat_b, unsigned int m_dmrN += 1U; } +void CModeConv::putDummyYSF() +{ + // We have a total of 5 VCH sections + for (unsigned int j = 0U; j < 5U; j++) { + m_DMR.addData(&TAG_DATA, 1U); + m_DMR.addData(DMR_SILENCE, 9U); + + m_dmrN += 1U; + } +} + void CModeConv::putDMRHeader() { unsigned char vch[13U]; diff --git a/YSF2DMR/ModeConv.h b/YSF2DMR/ModeConv.h index e0bab8c..ef65930 100644 --- a/YSF2DMR/ModeConv.h +++ b/YSF2DMR/ModeConv.h @@ -34,6 +34,7 @@ public: void putDMREOT(); void putYSF(unsigned char* bytes); + void putDummyYSF(); void putYSFHeader(); void putYSFEOT(); diff --git a/YSF2DMR/YSF2DMR.cpp b/YSF2DMR/YSF2DMR.cpp index 07a7e8f..d795e66 100644 --- a/YSF2DMR/YSF2DMR.cpp +++ b/YSF2DMR/YSF2DMR.cpp @@ -115,7 +115,8 @@ m_dmrinfo(false), m_idUnlink(4000U), m_flcoUnlink(FLCO_GROUP), m_enableWiresX(false), -m_remoteGateway(false) +m_remoteGateway(false), +m_hangTime(1000U) { ::memset(m_ysfFrame, 0U, 200U); ::memset(m_dmrFrame, 0U, 50U); @@ -214,6 +215,7 @@ int CYSF2DMR::run() m_suffix = m_conf.getSuffix(); m_remoteGateway = m_conf.getRemoteGateway(); + m_hangTime = m_conf.getHangTime(); bool debug = m_conf.getDMRNetworkDebug(); in_addr dstAddress = CUDPSocket::lookup(m_conf.getDstAddress()); @@ -228,6 +230,10 @@ int CYSF2DMR::run() m_ysfNetwork = new CYSFNetwork(localAddress, localPort, m_callsign, debug); m_ysfNetwork->setDestination(dstAddress, dstPort); + LogInfo("General Parameters"); + LogInfo(" Remote Gateway: %s", m_remoteGateway ? "yes" : "no"); + LogInfo(" Hang Time: %u ms", m_hangTime); + ret = m_ysfNetwork->open(); if (!ret) { ::LogError("Cannot open the YSF network port"); @@ -529,6 +535,9 @@ int CYSF2DMR::run() m_ysfFrames = 0U; } } else if (fi == YSF_FI_TERMINATOR) { + int extraFrames = (m_hangTime / 100U) - m_ysfFrames - 2U; + for (int i = 0U; i < extraFrames; i++) + m_conv.putDummyYSF(); LogMessage("YSF received end of voice transmission, %.1f seconds", float(m_ysfFrames) / 10.0F); m_conv.putYSFEOT(); m_ysfFrames = 0U; diff --git a/YSF2DMR/YSF2DMR.h b/YSF2DMR/YSF2DMR.h index 79d9221..d299e51 100644 --- a/YSF2DMR/YSF2DMR.h +++ b/YSF2DMR/YSF2DMR.h @@ -105,6 +105,7 @@ private: CReflectors* m_xlxReflectors; unsigned int m_xlxrefl; bool m_remoteGateway; + unsigned int m_hangTime; bool createDMRNetwork(); void createGPS(); diff --git a/YSF2DMR/YSF2DMR.ini b/YSF2DMR/YSF2DMR.ini index 3004475..bbc1bd7 100644 --- a/YSF2DMR/YSF2DMR.ini +++ b/YSF2DMR/YSF2DMR.ini @@ -19,6 +19,7 @@ LocalAddress=127.0.0.1 LocalPort=42013 EnableWiresX=1 RemoteGateway=0 +HangTime=1000 Daemon=0 [DMR Network] @@ -32,7 +33,6 @@ StartupPC=1 Address=44.131.4.1 Port=62031 Jitter=500 -HangTime=1000 EnableUnlink=1 TGUnlink=4000 PCUnlink=0