diff --git a/Conf.cpp b/Conf.cpp index 4870a03..6369ed3 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -139,7 +139,7 @@ m_dstarBlackList(), m_dstarWhiteList(), m_dstarAckReply(true), m_dstarAckTime(750U), -m_dstarAckMessage(false), +m_dstarAckMessage(DSTAR_ACK_BER), m_dstarErrorReply(true), m_dstarRemoteGateway(false), m_dstarModeHang(10U), @@ -644,9 +644,11 @@ bool CConf::read() m_dstarAckReply = ::atoi(value) == 1; else if (::strcmp(key, "AckTime") == 0) m_dstarAckTime = (unsigned int)::atoi(value); - else if (::strcmp(key, "AckMessage") == 0) - m_dstarAckMessage = ::atoi(value) == 1; - else if (::strcmp(key, "ErrorReply") == 0) + else if (::strcmp(key, "AckMessage") == 0) { + m_dstarAckMessage = (DSTAR_ACK_MESSAGE)::atoi(value); + if (m_dstarAckMessage != DSTAR_ACK_BER && m_dstarAckMessage != DSTAR_ACK_RSSI && m_dstarAckMessage != DSTAR_ACK_SMETER) + m_dstarAckMessage = DSTAR_ACK_BER; + } else if (::strcmp(key, "ErrorReply") == 0) m_dstarErrorReply = ::atoi(value) == 1; else if (::strcmp(key, "RemoteGateway") == 0) m_dstarRemoteGateway = ::atoi(value) == 1; @@ -1504,7 +1506,7 @@ unsigned int CConf::getDStarAckTime() const return m_dstarAckTime; } -bool CConf::getDStarAckMessage() const +DSTAR_ACK_MESSAGE CConf::getDStarAckMessage() const { return m_dstarAckMessage; } diff --git a/Conf.h b/Conf.h index 3fde503..bb98457 100644 --- a/Conf.h +++ b/Conf.h @@ -120,7 +120,7 @@ public: std::vector getDStarWhiteList() const; bool getDStarAckReply() const; unsigned int getDStarAckTime() const; - bool getDStarAckMessage() const; + DSTAR_ACK_MESSAGE getDStarAckMessage() const; bool getDStarErrorReply() const; bool getDStarRemoteGateway() const; unsigned int getDStarModeHang() const; @@ -452,7 +452,7 @@ private: std::vector m_dstarWhiteList; bool m_dstarAckReply; unsigned int m_dstarAckTime; - bool m_dstarAckMessage; + DSTAR_ACK_MESSAGE m_dstarAckMessage; bool m_dstarErrorReply; bool m_dstarRemoteGateway; unsigned int m_dstarModeHang; diff --git a/DStarControl.cpp b/DStarControl.cpp index 61837db..bd414c7 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -15,6 +15,7 @@ #include "Utils.h" #include "Sync.h" #include "Log.h" +#include "SMeter.h" #include #include @@ -37,7 +38,7 @@ bool CallsignCompare(const std::string& arg, const unsigned char* my) // #define DUMP_DSTAR -CDStarControl::CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, bool ackMessage, bool errorReply, const std::vector& blackList, const std::vector& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper) : +CDStarControl::CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, DSTAR_ACK_MESSAGE ackMessage, bool errorReply, const std::vector& blackList, const std::vector& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper) : m_callsign(NULL), m_gateway(NULL), m_selfOnly(selfOnly), @@ -139,9 +140,9 @@ unsigned int CDStarControl::maybeFixupVoiceFrame( unsigned char n, bool blank_dtmf, unsigned char* voice_sync_data, - unsigned int* voice_sync_data_len, - bool* next_frame_is_fast_data, - unsigned int* skip_dtmf_blanking_frames + unsigned int& voice_sync_data_len, + bool& next_frame_is_fast_data, + unsigned int& skip_dtmf_blanking_frames ) { unsigned int errors = 0U; @@ -151,37 +152,40 @@ unsigned int CDStarControl::maybeFixupVoiceFrame( if (n == 0U) { ::memcpy(voice_sync_data, data, DSTAR_MODEM_DATA_LEN); - *voice_sync_data_len = len; + voice_sync_data_len = len; } else if ((n % 2U != 0U) && ((mini_header_type == DSTAR_SLOW_DATA_TYPE_FASTDATA01) || (mini_header_type == DSTAR_SLOW_DATA_TYPE_FASTDATA16))) { - *next_frame_is_fast_data = true; + next_frame_is_fast_data = true; if (blank_dtmf) - *skip_dtmf_blanking_frames = FAST_DATA_BEEP_GRACE_FRAMES; + skip_dtmf_blanking_frames = FAST_DATA_BEEP_GRACE_FRAMES; if (n == 1U) - LogDebug("D-Star, %s fastdata sequence no. 0", log_prefix); + LogDebug("D-Star, %s fastdata sequence no. 0", log_prefix); LogDebug("D-Star, %s fastdata sequence no. %2u", log_prefix, n); - } else if (*next_frame_is_fast_data == true) { - *next_frame_is_fast_data = false; + } else if (next_frame_is_fast_data) { + next_frame_is_fast_data = false; if (blank_dtmf) - *skip_dtmf_blanking_frames = FAST_DATA_BEEP_GRACE_FRAMES; + skip_dtmf_blanking_frames = FAST_DATA_BEEP_GRACE_FRAMES; LogDebug("D-Star, %s fastdata sequence no. %2u", log_prefix, n); } else { bool voice_sync_data_is_null_ambe_data = false; bool data_is_null_ambe_data = false; + if ((n == 1U) && (::memcmp(voice_sync_data + offset, DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0)) voice_sync_data_is_null_ambe_data = true; + if (::memcmp(data + offset, DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0) data_is_null_ambe_data = true; if ((n == 1U) && !voice_sync_data_is_null_ambe_data) voice_sync_errors += m_fec.regenerateDStar(voice_sync_data + offset); + if (!data_is_null_ambe_data) errors += m_fec.regenerateDStar(data + offset); - if (blank_dtmf && (*skip_dtmf_blanking_frames > 0U)) { - (*skip_dtmf_blanking_frames)--; - } else if (blank_dtmf && (*skip_dtmf_blanking_frames == 0U)) { + if (blank_dtmf && skip_dtmf_blanking_frames > 0U) { + skip_dtmf_blanking_frames--; + } else if (blank_dtmf && skip_dtmf_blanking_frames == 0U) { if ((n == 1U) && !voice_sync_data_is_null_ambe_data) blankDTMF(voice_sync_data + offset); if (!data_is_null_ambe_data) @@ -190,17 +194,16 @@ unsigned int CDStarControl::maybeFixupVoiceFrame( if (n == 1U) { if (voice_sync_data_is_null_ambe_data) - LogDebug("D-Star, %s nullaudio sequence no. 0", log_prefix); + LogDebug("D-Star, %s nullaudio sequence no. 0", log_prefix); else - LogDebug("D-Star, %s audio sequence no. 0, errs: %2u/48 (%5.1f%%)", log_prefix, voice_sync_errors, - float(voice_sync_errors) / 0.48F); + LogDebug("D-Star, %s audio sequence no. 0, errs: %2u/48 (%5.1f%%)", log_prefix, voice_sync_errors, float(voice_sync_errors) / 0.48F); } + if (data_is_null_ambe_data) LogDebug("D-Star, %s nullaudio sequence no. %2u", log_prefix, n); else - LogDebug("D-Star, %s audio sequence no. %2u, errs: %2u/48 (%5.1f%%)", log_prefix, n, errors, - float(errors) / 0.48F); - } + LogDebug("D-Star, %s audio sequence no. %2u, errs: %2u/48 (%5.1f%%)", log_prefix, n, errors, float(errors) / 0.48F); + } return voice_sync_errors + errors; } @@ -455,8 +458,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) unsigned int errors = 0U; if (!m_rfHeader.isDataPacket()) { - errors = maybeFixupVoiceFrame(data, len, 1U, "RF", m_rfN, m_duplex, m_rfVoiceSyncData, &m_rfVoiceSyncDataLen, - &m_rfNextFrameIsFastData, &m_rfSkipDTMFBlankingFrames); + errors = maybeFixupVoiceFrame(data, len, 1U, "RF", m_rfN, m_duplex, m_rfVoiceSyncData, m_rfVoiceSyncDataLen, m_rfNextFrameIsFastData, m_rfSkipDTMFBlankingFrames); m_display->writeDStarBER(float(errors) / 0.48F); m_rfErrs += errors; } @@ -588,8 +590,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) unsigned int errors = 0U; if (!m_rfHeader.isDataPacket()) { - errors = maybeFixupVoiceFrame(data, len, 1U, "RF", m_rfN, m_duplex, m_rfVoiceSyncData, &m_rfVoiceSyncDataLen, - &m_rfNextFrameIsFastData, &m_rfSkipDTMFBlankingFrames); + errors = maybeFixupVoiceFrame(data, len, 1U, "RF", m_rfN, m_duplex, m_rfVoiceSyncData, m_rfVoiceSyncDataLen, m_rfNextFrameIsFastData, m_rfSkipDTMFBlankingFrames); m_rfErrs += errors; } @@ -789,8 +790,7 @@ void CDStarControl::writeNetwork() unsigned int errors = 0U; if (!m_netHeader.isDataPacket()) - errors = maybeFixupVoiceFrame(data, length, 2U, "Net", n, true, m_netVoiceSyncData, &m_netVoiceSyncDataLen, - &m_netNextFrameIsFastData, &m_netSkipDTMFBlankingFrames); + errors = maybeFixupVoiceFrame(data, length, 2U, "Net", n, true, m_netVoiceSyncData, m_netVoiceSyncDataLen, m_netNextFrameIsFastData, m_netSkipDTMFBlankingFrames); // Insert silence and reject if in the past bool ret = insertSilence(data + 1U, n); @@ -1182,18 +1182,33 @@ void CDStarControl::sendAck() m_network->getStatus(status, reflector); char text[40U]; - if (m_ackMessage && m_rssi != 0) { - if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) - ::sprintf(text, "%-8.8s -%udBm ", reflector, m_aveRSSI / m_rssiCount); - else + if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0) { + if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) { + CUtils::removeChar(reflector, ' ');//remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm + ::sprintf(text, "%-8.8s %.1f%% -%udBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount); + } else { ::sprintf(text, "BER:%.1f%% -%udBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount); - } - else { + } + } else if (m_ackMessage == DSTAR_ACK_SMETER && m_rssi != 0) { + unsigned int signal, plus; + char signalText[10U]; + CSMeter::getSignal(m_aveRSSI / m_rssiCount, signal, plus); + if (plus != 0U) + ::sprintf(signalText, "S%u+%02u", signal, plus); + else + ::sprintf(signalText, "S%u", signal); + + if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) + ::sprintf(text, "%-8.8s %.1f%% %s ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), signalText); + else + ::sprintf(text, "BER:%.1f%% %s ", float(m_rfErrs * 100U) / float(m_rfBits), signalText); + } else { if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) ::sprintf(text, "%-8.8s BER: %.1f%% ", reflector, float(m_rfErrs * 100U) / float(m_rfBits)); else ::sprintf(text, "BER: %.1f%% ", float(m_rfErrs * 100U) / float(m_rfBits)); } + m_slowData.setText(text); ::memcpy(data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U); @@ -1232,18 +1247,33 @@ void CDStarControl::sendError() m_network->getStatus(status, reflector); char text[40U]; - if (m_ackMessage && m_rssi != 0) { - if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) - ::sprintf(text, "%-8.8s -%udBm ", reflector, m_aveRSSI / m_rssiCount); - else + if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0) { + if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) { + CUtils::removeChar(reflector, ' ');//remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm + ::sprintf(text, "%-8.8s %.1f%% -%udBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount); + } else { ::sprintf(text, "BER:%.1f%% -%udBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount); - } - else { + } + } else if (m_ackMessage == DSTAR_ACK_SMETER && m_rssi != 0) { + unsigned int signal, plus; + char signalText[10U]; + CSMeter::getSignal(m_aveRSSI / m_rssiCount, signal, plus); + if (plus != 0U) + ::sprintf(signalText, "S%u+%02u", signal, plus); + else + ::sprintf(signalText, "S%u", signal); + + if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) + ::sprintf(text, "%-8.8s %.1f%% %s ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), signalText); + else + ::sprintf(text, "BER:%.1f%% %s ", float(m_rfErrs * 100U) / float(m_rfBits), signalText); + } else { if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) ::sprintf(text, "%-8.8s BER: %.1f%% ", reflector, float(m_rfErrs * 100U) / float(m_rfBits)); else ::sprintf(text, "BER: %.1f%% ", float(m_rfErrs * 100U) / float(m_rfBits)); } + m_slowData.setText(text); ::memcpy(data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U); diff --git a/DStarControl.h b/DStarControl.h index 1378c87..d899c68 100644 --- a/DStarControl.h +++ b/DStarControl.h @@ -37,7 +37,7 @@ class CDStarControl { public: - CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, bool ackMessage, bool errorReply, const std::vector& blackList, const std::vector& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper); + CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, DSTAR_ACK_MESSAGE ackMessage, bool errorReply, const std::vector& blackList, const std::vector& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper); ~CDStarControl(); bool writeModem(unsigned char* data, unsigned int len); @@ -55,7 +55,7 @@ private: unsigned char* m_gateway; bool m_selfOnly; bool m_ackReply; - bool m_ackMessage; + DSTAR_ACK_MESSAGE m_ackMessage; bool m_errorReply; bool m_remoteGateway; std::vector m_blackList; @@ -107,7 +107,6 @@ private: unsigned int m_rfSkipDTMFBlankingFrames; unsigned int m_netSkipDTMFBlankingFrames; - unsigned int maybeFixupVoiceFrame( unsigned char* data, unsigned int len, @@ -116,9 +115,9 @@ private: unsigned char n, bool blank_dtmf, unsigned char* voice_sync_data, - unsigned int* voice_sync_data_len, - bool* next_frame_is_fast_data, - unsigned int* skip_dtmf_blanking_frames + unsigned int& voice_sync_data_len, + bool& next_frame_is_fast_data, + unsigned int& skip_dtmf_blanking_frames ); void writeNetwork(); diff --git a/Defines.h b/Defines.h index 58f4348..7c2eb13 100644 --- a/Defines.h +++ b/Defines.h @@ -87,4 +87,10 @@ enum DMR_OVCM_TYPES { DMR_OVCM_FORCE_OFF }; +enum DSTAR_ACK_MESSAGE { + DSTAR_ACK_BER, + DSTAR_ACK_RSSI, + DSTAR_ACK_SMETER +}; + #endif diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 969f949..7f66f32 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -488,7 +488,7 @@ int CMMDVMHost::run() std::vector whiteList = m_conf.getDStarWhiteList(); bool ackReply = m_conf.getDStarAckReply(); unsigned int ackTime = m_conf.getDStarAckTime(); - bool ackMessage = m_conf.getDStarAckMessage(); + DSTAR_ACK_MESSAGE ackMessage = m_conf.getDStarAckMessage(); bool errorReply = m_conf.getDStarErrorReply(); bool remoteGateway = m_conf.getDStarRemoteGateway(); m_dstarRFModeHang = m_conf.getDStarModeHang(); @@ -497,7 +497,7 @@ int CMMDVMHost::run() LogInfo(" Module: %s", module.c_str()); LogInfo(" Self Only: %s", selfOnly ? "yes" : "no"); LogInfo(" Ack Reply: %s", ackReply ? "yes" : "no"); - LogInfo(" Ack message: %s", ackMessage ? "RSSI" : "BER"); + LogInfo(" Ack message: %s", ackMessage == DSTAR_ACK_RSSI? "RSSI" : (ackMessage == DSTAR_ACK_SMETER ? "SMETER" : "BER")); LogInfo(" Ack Time: %ums", ackTime); LogInfo(" Error Reply: %s", errorReply ? "yes" : "no"); LogInfo(" Remote Gateway: %s", remoteGateway ? "yes" : "no"); diff --git a/MMDVMHost.vcxproj b/MMDVMHost.vcxproj index bebf213..dc7a76b 100644 --- a/MMDVMHost.vcxproj +++ b/MMDVMHost.vcxproj @@ -247,6 +247,7 @@ + @@ -352,6 +353,7 @@ + diff --git a/MMDVMHost.vcxproj.filters b/MMDVMHost.vcxproj.filters index 77f0c68..3b74c31 100644 --- a/MMDVMHost.vcxproj.filters +++ b/MMDVMHost.vcxproj.filters @@ -347,6 +347,9 @@ Header Files + + Header Files + @@ -652,5 +655,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/Makefile b/Makefile index 1fcdddb..bac0711 100644 --- a/Makefile +++ b/Makefile @@ -14,8 +14,8 @@ OBJECTS = \ Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o NXDNControl.o \ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \ NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \ - POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o Timer.o \ - UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o SMeter.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o \ + Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost RemoteCommand diff --git a/Makefile.Pi b/Makefile.Pi index 4a97617..18b2bb6 100644 --- a/Makefile.Pi +++ b/Makefile.Pi @@ -14,8 +14,8 @@ OBJECTS = \ Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o NXDNControl.o \ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \ NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \ - POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o Timer.o \ - UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o SMeter.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o Thread.o \ + Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost RemoteCommand diff --git a/Makefile.Pi.Adafruit b/Makefile.Pi.Adafruit index 74177bd..5569a89 100644 --- a/Makefile.Pi.Adafruit +++ b/Makefile.Pi.Adafruit @@ -15,9 +15,9 @@ OBJECTS = \ MMDVMHost.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o \ NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \ NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \ - POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o \ - Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \ - YSFPayload.o + POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o SMeter.o StopWatch.o Sync.o SHA256.o \ + TFTSurenoo.o Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o \ + YSFNetwork.o YSFPayload.o all: MMDVMHost RemoteCommand diff --git a/Makefile.Pi.HD44780 b/Makefile.Pi.HD44780 index 27a14a8..4a48db6 100644 --- a/Makefile.Pi.HD44780 +++ b/Makefile.Pi.HD44780 @@ -14,9 +14,9 @@ OBJECTS = \ MMDVMHost.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o \ NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \ NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \ - POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o \ - Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \ - YSFPayload.o + POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o SMeter.o StopWatch.o Sync.o SHA256.o \ + TFTSurenoo.o Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o \ + YSFNetwork.o YSFPayload.o all: MMDVMHost RemoteCommand diff --git a/Makefile.Pi.OLED b/Makefile.Pi.OLED index 1464eeb..dbb0805 100644 --- a/Makefile.Pi.OLED +++ b/Makefile.Pi.OLED @@ -18,9 +18,8 @@ OBJECTS = \ Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o NXDNControl.o \ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \ NXDNUDCH.o OLED.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \ - POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o \ - Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \ - YSFPayload.o + POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o SMeter.o StopWatch.o Sync.o SHA256.o \ + TFTSurenoo.o Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o \ YSFNetwork.o YSFPayload.o all: MMDVMHost RemoteCommand diff --git a/Makefile.Pi.PCF8574 b/Makefile.Pi.PCF8574 index 824d365..18e975f 100644 --- a/Makefile.Pi.PCF8574 +++ b/Makefile.Pi.PCF8574 @@ -15,9 +15,9 @@ OBJECTS = \ MMDVMHost.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o \ NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \ NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \ - POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o TFTSurenoo.o \ - Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \ - YSFPayload.o + POCSAGControl.o POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o SMeter.o StopWatch.o Sync.o SHA256.o \ + TFTSurenoo.o Thread.o Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o \ + YSFNetwork.o YSFPayload.o all: MMDVMHost RemoteCommand diff --git a/SMeter.cpp b/SMeter.cpp new file mode 100644 index 0000000..75b36f8 --- /dev/null +++ b/SMeter.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2015-2021 by Jonathan Naylor G4KLX + * Copyright (C) 2021 by Geoffrey Merck F4FXL / KC3FRA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "SMeter.h" + +const unsigned int RSSI_S1 = 141U; +const unsigned int RSSI_S9 = 93U; + +void CSMeter::getSignal(unsigned int rssi, unsigned int& signal, unsigned int& plus) +{ + if (rssi > RSSI_S1) { + signal = 0U; + plus = rssi - RSSI_S1; + } else if (rssi > RSSI_S9 && rssi <= RSSI_S1) { + signal = ((RSSI_S1 - rssi) / 6U) + 1U; + plus = (RSSI_S1 - rssi) % 6U; + } else { + signal = 9U; + plus = RSSI_S9 - rssi; + } +} diff --git a/SMeter.h b/SMeter.h new file mode 100644 index 0000000..76c4d60 --- /dev/null +++ b/SMeter.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2015-2021 by Jonathan Naylor G4KLX + * Copyright (C) 2021 by Geoffrey Merck F4FXL / KC3FRA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#if !defined(SMETER_H) +#define SMETER_H + +class CSMeter +{ +public: + static void getSignal(unsigned int rssi, unsigned int& signal, unsigned int& plus); +}; + +#endif \ No newline at end of file diff --git a/Utils.cpp b/Utils.cpp index 3ecdf60..091ebf8 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -156,3 +156,17 @@ unsigned int CUtils::countBits(unsigned int v) return count; } + +void CUtils::removeChar(unsigned char * haystack, char needdle) +{ + unsigned int i = 0; + unsigned int j = 0; + + while (haystack[i] != '\0') { + if (haystack[i] != needdle) + haystack[j++] = haystack[i]; + i++; + } + + haystack[j] = '\0'; +} diff --git a/Utils.h b/Utils.h index 1929aa0..1e2ee9e 100644 --- a/Utils.h +++ b/Utils.h @@ -32,6 +32,8 @@ public: static unsigned int countBits(unsigned int v); + static void removeChar(unsigned char * haystack, char needdle); + private: }; diff --git a/Version.h b/Version.h index a62e8cd..39e7d8e 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20210508"; +const char* VERSION = "20210518"; #endif