From 5291a6427c61dd394dba0ed52cd519423d32bffe Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Wed, 17 Jan 2018 21:21:25 +0000 Subject: [PATCH] Add more NXDN support files. --- Conf.cpp | 20 ++ Conf.h | 7 + DMRLookup.cpp | 4 +- MMDVM.ini | 4 + MMDVMHost.cpp | 31 ++- MMDVMHost.h | 4 +- MMDVMHost.vcxproj | 6 + MMDVMHost.vcxproj.filters | 18 ++ Makefile | 8 +- Makefile.Pi | 8 +- Makefile.Pi.Adafruit | 6 +- Makefile.Pi.HD44780 | 6 +- Makefile.Pi.OLED | 6 +- Makefile.Pi.PCF8574 | 6 +- Makefile.Solaris | 6 +- NXDNCRC.cpp | 240 ++++++++++++++++++++++ NXDNCRC.h | 37 ++++ NXDNControl.cpp | 4 +- NXDNControl.h | 5 +- NXDNConvolution.cpp | 141 +++++++++++++ NXDNConvolution.h | 45 +++++ NXDNLookup.cpp | 158 +++++++++++++++ NXDNLookup.h | 53 +++++ YSFConvolution.h | 2 - nxuid_export.csv | 404 ++++++++++++++++++++++++++++++++++++++ 25 files changed, 1190 insertions(+), 39 deletions(-) create mode 100644 NXDNCRC.cpp create mode 100644 NXDNCRC.h create mode 100644 NXDNConvolution.cpp create mode 100644 NXDNConvolution.h create mode 100644 NXDNLookup.cpp create mode 100644 NXDNLookup.h create mode 100644 nxuid_export.csv diff --git a/Conf.cpp b/Conf.cpp index b36aca7..7e68f9d 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -34,6 +34,7 @@ enum SECTION { SECTION_LOG, SECTION_CWID, SECTION_DMRID_LOOKUP, + SECTION_NXDNID_LOOKUP, SECTION_MODEM, SECTION_UMP, SECTION_DSTAR, @@ -80,6 +81,8 @@ m_cwIdTime(10U), m_cwIdCallsign(), m_dmrIdLookupFile(), m_dmrIdLookupTime(0U), +m_nxdnIdLookupFile(), +m_nxdnIdLookupTime(0U), m_modemPort(), m_modemRXInvert(false), m_modemTXInvert(false), @@ -246,6 +249,8 @@ bool CConf::read() section = SECTION_CWID; else if (::strncmp(buffer, "[DMR Id Lookup]", 15U) == 0) section = SECTION_DMRID_LOOKUP; + else if (::strncmp(buffer, "[NXDN Id Lookup]", 16U) == 0) + section = SECTION_NXDNID_LOOKUP; else if (::strncmp(buffer, "[Modem]", 7U) == 0) section = SECTION_MODEM; else if (::strncmp(buffer, "[UMP]", 5U) == 0) @@ -361,6 +366,11 @@ bool CConf::read() m_dmrIdLookupFile = value; else if (::strcmp(key, "Time") == 0) m_dmrIdLookupTime = (unsigned int)::atoi(value); + } else if (section == SECTION_NXDNID_LOOKUP) { + if (::strcmp(key, "File") == 0) + m_nxdnIdLookupFile = value; + else if (::strcmp(key, "Time") == 0) + m_nxdnIdLookupTime = (unsigned int)::atoi(value); } else if (section == SECTION_MODEM) { if (::strcmp(key, "Port") == 0) m_modemPort = value; @@ -824,6 +834,16 @@ unsigned int CConf::getDMRIdLookupTime() const return m_dmrIdLookupTime; } +std::string CConf::getNXDNIdLookupFile() const +{ + return m_nxdnIdLookupFile; +} + +unsigned int CConf::getNXDNIdLookupTime() const +{ + return m_nxdnIdLookupTime; +} + std::string CConf::getModemPort() const { return m_modemPort; diff --git a/Conf.h b/Conf.h index 4f580d0..016f77c 100644 --- a/Conf.h +++ b/Conf.h @@ -64,6 +64,10 @@ public: std::string getDMRIdLookupFile() const; unsigned int getDMRIdLookupTime() const; + // The NXDN Id section + std::string getNXDNIdLookupFile() const; + unsigned int getNXDNIdLookupTime() const; + // The Modem section std::string getModemPort() const; bool getModemRXInvert() const; @@ -263,6 +267,9 @@ private: std::string m_dmrIdLookupFile; unsigned int m_dmrIdLookupTime; + std::string m_nxdnIdLookupFile; + unsigned int m_nxdnIdLookupTime; + std::string m_modemPort; bool m_modemRXInvert; bool m_modemTXInvert; diff --git a/DMRLookup.cpp b/DMRLookup.cpp index 29aa66f..d41df5d 100644 --- a/DMRLookup.cpp +++ b/DMRLookup.cpp @@ -118,7 +118,7 @@ bool CDMRLookup::load() { FILE* fp = ::fopen(m_filename.c_str(), "rt"); if (fp == NULL) { - LogWarning("Cannot open the Id lookup file - %s", m_filename.c_str()); + LogWarning("Cannot open the DMR Id lookup file - %s", m_filename.c_str()); return false; } @@ -152,7 +152,7 @@ bool CDMRLookup::load() if (size == 0U) return false; - LogInfo("Loaded %u Ids to the callsign lookup table", size); + LogInfo("Loaded %u Ids to the DMR callsign lookup table", size); return true; } \ No newline at end of file diff --git a/MMDVM.ini b/MMDVM.ini index 168b3bd..d08272e 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -36,6 +36,10 @@ Time=10 File=DMRIds.dat Time=24 +[NXDN Id Lookup] +File=nxuid_export.csv +Time=24 + [Modem] # Port=/dev/ttyACM0 Port=\\.\COM3 diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 112d192..d7e87be 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -158,7 +158,8 @@ m_ysfEnabled(false), m_p25Enabled(false), m_nxdnEnabled(false), m_cwIdTime(0U), -m_lookup(NULL), +m_dmrLookup(NULL), +m_nxdnLookup(NULL), m_callsign(), m_id(0U), m_cwCallsign() @@ -341,8 +342,8 @@ int CMMDVMHost::run() if (reloadTime > 0U) LogInfo(" Reload: %u hours", reloadTime); - m_lookup = new CDMRLookup(lookupFile, reloadTime); - m_lookup->read(); + m_dmrLookup = new CDMRLookup(lookupFile, reloadTime); + m_dmrLookup->read(); } CStopWatch stopWatch; @@ -439,7 +440,7 @@ int CMMDVMHost::run() dmrBeaconIntervalTimer.start(); } - dmr = new CDMRControl(id, colorCode, callHang, selfOnly, embeddedLCOnly, dumpTAData, prefixes, blackList, whiteList, slot1TGWhiteList, slot2TGWhiteList, m_timeout, m_modem, m_dmrNetwork, m_display, m_duplex, m_lookup, rssi); + dmr = new CDMRControl(id, colorCode, callHang, selfOnly, embeddedLCOnly, dumpTAData, prefixes, blackList, whiteList, slot1TGWhiteList, slot2TGWhiteList, m_timeout, m_modem, m_dmrNetwork, m_display, m_duplex, m_dmrLookup, rssi); m_dmrTXTimer.setTimeout(txHang); } @@ -483,11 +484,22 @@ int CMMDVMHost::run() LogInfo(" Remote Gateway: %s", remoteGateway ? "yes" : "no"); LogInfo(" Mode Hang: %us", m_p25RFModeHang); - p25 = new CP25Control(nac, id, selfOnly, uidOverride, m_p25Network, m_display, m_timeout, m_duplex, m_lookup, remoteGateway, rssi); + p25 = new CP25Control(nac, id, selfOnly, uidOverride, m_p25Network, m_display, m_timeout, m_duplex, m_dmrLookup, remoteGateway, rssi); } CNXDNControl* nxdn = NULL; if (m_nxdnEnabled) { + std::string lookupFile = m_conf.getNXDNIdLookupFile(); + unsigned int reloadTime = m_conf.getNXDNIdLookupTime(); + + LogInfo("NXDN Id Lookups"); + LogInfo(" File: %s", lookupFile.length() > 0U ? lookupFile.c_str() : "None"); + if (reloadTime > 0U) + LogInfo(" Reload: %u hours", reloadTime); + + m_nxdnLookup = new CNXDNLookup(lookupFile, reloadTime); + m_nxdnLookup->read(); + unsigned int id = m_conf.getNXDNId(); unsigned int ran = m_conf.getNXDNRAN(); bool selfOnly = m_conf.getNXDNSelfOnly(); @@ -501,7 +513,7 @@ int CMMDVMHost::run() LogInfo(" Remote Gateway: %s", remoteGateway ? "yes" : "no"); LogInfo(" Mode Hang: %us", m_nxdnRFModeHang); - nxdn = new CNXDNControl(ran, id, selfOnly, m_nxdnNetwork, m_display, m_timeout, m_duplex, remoteGateway, rssi); + nxdn = new CNXDNControl(ran, id, selfOnly, m_nxdnNetwork, m_display, m_timeout, m_duplex, remoteGateway, m_nxdnLookup, rssi); } setMode(MODE_IDLE); @@ -881,8 +893,11 @@ int CMMDVMHost::run() delete m_ump; } - if (m_lookup != NULL) - m_lookup->stop(); + if (m_dmrLookup != NULL) + m_dmrLookup->stop(); + + if (m_nxdnLookup != NULL) + m_nxdnLookup->stop(); if (m_dstarNetwork != NULL) { m_dstarNetwork->close(); diff --git a/MMDVMHost.h b/MMDVMHost.h index c0faa1b..787df39 100644 --- a/MMDVMHost.h +++ b/MMDVMHost.h @@ -21,6 +21,7 @@ #include "DStarNetwork.h" #include "NXDNNetwork.h" +#include "NXDNLookup.h" #include "YSFNetwork.h" #include "P25Network.h" #include "DMRNetwork.h" @@ -73,7 +74,8 @@ private: bool m_p25Enabled; bool m_nxdnEnabled; unsigned int m_cwIdTime; - CDMRLookup* m_lookup; + CDMRLookup* m_dmrLookup; + CNXDNLookup* m_nxdnLookup; std::string m_callsign; unsigned int m_id; std::string m_cwCallsign; diff --git a/MMDVMHost.vcxproj b/MMDVMHost.vcxproj index 5a66b6f..d6ffade 100644 --- a/MMDVMHost.vcxproj +++ b/MMDVMHost.vcxproj @@ -194,8 +194,11 @@ + + + @@ -270,7 +273,10 @@ + + + diff --git a/MMDVMHost.vcxproj.filters b/MMDVMHost.vcxproj.filters index ba4a45d..b2da8d4 100644 --- a/MMDVMHost.vcxproj.filters +++ b/MMDVMHost.vcxproj.filters @@ -242,6 +242,15 @@ Header Files + + Header Files + + + Header Files + + + Header Files + @@ -451,5 +460,14 @@ Source Files + + Source Files + + + Source Files + + + Source Files + \ No newline at end of file diff --git a/Makefile b/Makefile index b414d09..268ca00 100644 --- a/Makefile +++ b/Makefile @@ -9,10 +9,10 @@ LDFLAGS = -g OBJECTS = \ AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \ DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \ - Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o NXDNLICH.o \ - NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o \ - SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o \ - YSFNetwork.o YSFPayload.o + Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \ + NXDNConvolution.o NXDNCRC.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o \ + P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o \ + UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost diff --git a/Makefile.Pi b/Makefile.Pi index 8934c4f..ae6ca5f 100644 --- a/Makefile.Pi +++ b/Makefile.Pi @@ -9,10 +9,10 @@ LDFLAGS = -g -L/usr/local/lib OBJECTS = \ AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \ DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \ - Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o NXDNLICH.o \ - NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o \ - SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \ - YSFPayload.o + Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \ + NXDNConvolution.o NXDNCRC.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o \ + P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o \ + UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost diff --git a/Makefile.Pi.Adafruit b/Makefile.Pi.Adafruit index 25d6aef..5a8c469 100644 --- a/Makefile.Pi.Adafruit +++ b/Makefile.Pi.Adafruit @@ -10,9 +10,9 @@ OBJECTS = \ AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \ DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \ Golay24128.o Hamming.o HD44780.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \ - NXDNLICH.o NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o \ - SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \ - YSFPayload.o + NXDNConvolution.o NXDNCRC.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o \ + QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o \ + YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost diff --git a/Makefile.Pi.HD44780 b/Makefile.Pi.HD44780 index 7d5e7b5..9b9f93e 100644 --- a/Makefile.Pi.HD44780 +++ b/Makefile.Pi.HD44780 @@ -10,9 +10,9 @@ OBJECTS = \ AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \ DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \ Golay24128.o Hamming.o HD44780.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \ - NXDNLICH.o NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o \ - SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \ - YSFPayload.o + NXDNConvolution.o NXDNCRC.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o \ + QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o \ + YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost diff --git a/Makefile.Pi.OLED b/Makefile.Pi.OLED index 7ef9f81..a1f0a79 100644 --- a/Makefile.Pi.OLED +++ b/Makefile.Pi.OLED @@ -10,9 +10,9 @@ OBJECTS = \ AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \ DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \ Golay24128.o Hamming.o JitterBuffer.o OLED.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \ - NXDNLICH.o NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o \ - SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \ - YSFPayload.o + NXDNConvolution.o NXDNCRC.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o \ + QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o \ + YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost diff --git a/Makefile.Pi.PCF8574 b/Makefile.Pi.PCF8574 index 8bd0b64..c649e3f 100644 --- a/Makefile.Pi.PCF8574 +++ b/Makefile.Pi.PCF8574 @@ -10,9 +10,9 @@ OBJECTS = \ AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \ DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \ Golay24128.o Hamming.o HD44780.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \ - NXDNLICH.o NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o \ - SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o \ - YSFPayload.o + NXDNConvolution.o NXDNCRC.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o \ + QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o \ + YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost diff --git a/Makefile.Solaris b/Makefile.Solaris index 831c097..d156696 100644 --- a/Makefile.Solaris +++ b/Makefile.Solaris @@ -10,9 +10,9 @@ OBJECTS = \ AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \ DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \ Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \ - NXDNLICH.o NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o \ - RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o \ - YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + NXDNConvolution.o NXDNCRC.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o \ + P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o \ + UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o all: MMDVMHost diff --git a/NXDNCRC.cpp b/NXDNCRC.cpp new file mode 100644 index 0000000..2a2a9e1 --- /dev/null +++ b/NXDNCRC.cpp @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2015,2016,2018 by Jonathan Naylor G4KLX + * + * 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 "NXDNCRC.h" + +#include "Utils.h" +#include "Log.h" + +#include +#include +#include +#include + +const uint8_t CRC8_TABLE[] = { + 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, + 0x24, 0x23, 0x2A, 0x2D, 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, + 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, 0xE0, 0xE7, 0xEE, 0xE9, + 0xFC, 0xFB, 0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, + 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1, + 0xB4, 0xB3, 0xBA, 0xBD, 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, + 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, 0xB7, 0xB0, 0xB9, 0xBE, + 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, + 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16, + 0x03, 0x04, 0x0D, 0x0A, 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, + 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, 0x89, 0x8E, 0x87, 0x80, + 0x95, 0x92, 0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, + 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, + 0xDD, 0xDA, 0xD3, 0xD4, 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, + 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, 0x19, 0x1E, 0x17, 0x10, + 0x05, 0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, + 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78, 0x7F, + 0x6A, 0x6D, 0x64, 0x63, 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, + 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, 0xAE, 0xA9, 0xA0, 0xA7, + 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, + 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1, 0xE8, 0xEF, + 0xFA, 0xFD, 0xF4, 0xF3, 0x01 }; + +const uint16_t CCITT16_TABLE1[] = { + 0x0000U, 0x1189U, 0x2312U, 0x329bU, 0x4624U, 0x57adU, 0x6536U, 0x74bfU, + 0x8c48U, 0x9dc1U, 0xaf5aU, 0xbed3U, 0xca6cU, 0xdbe5U, 0xe97eU, 0xf8f7U, + 0x1081U, 0x0108U, 0x3393U, 0x221aU, 0x56a5U, 0x472cU, 0x75b7U, 0x643eU, + 0x9cc9U, 0x8d40U, 0xbfdbU, 0xae52U, 0xdaedU, 0xcb64U, 0xf9ffU, 0xe876U, + 0x2102U, 0x308bU, 0x0210U, 0x1399U, 0x6726U, 0x76afU, 0x4434U, 0x55bdU, + 0xad4aU, 0xbcc3U, 0x8e58U, 0x9fd1U, 0xeb6eU, 0xfae7U, 0xc87cU, 0xd9f5U, + 0x3183U, 0x200aU, 0x1291U, 0x0318U, 0x77a7U, 0x662eU, 0x54b5U, 0x453cU, + 0xbdcbU, 0xac42U, 0x9ed9U, 0x8f50U, 0xfbefU, 0xea66U, 0xd8fdU, 0xc974U, + 0x4204U, 0x538dU, 0x6116U, 0x709fU, 0x0420U, 0x15a9U, 0x2732U, 0x36bbU, + 0xce4cU, 0xdfc5U, 0xed5eU, 0xfcd7U, 0x8868U, 0x99e1U, 0xab7aU, 0xbaf3U, + 0x5285U, 0x430cU, 0x7197U, 0x601eU, 0x14a1U, 0x0528U, 0x37b3U, 0x263aU, + 0xdecdU, 0xcf44U, 0xfddfU, 0xec56U, 0x98e9U, 0x8960U, 0xbbfbU, 0xaa72U, + 0x6306U, 0x728fU, 0x4014U, 0x519dU, 0x2522U, 0x34abU, 0x0630U, 0x17b9U, + 0xef4eU, 0xfec7U, 0xcc5cU, 0xddd5U, 0xa96aU, 0xb8e3U, 0x8a78U, 0x9bf1U, + 0x7387U, 0x620eU, 0x5095U, 0x411cU, 0x35a3U, 0x242aU, 0x16b1U, 0x0738U, + 0xffcfU, 0xee46U, 0xdcddU, 0xcd54U, 0xb9ebU, 0xa862U, 0x9af9U, 0x8b70U, + 0x8408U, 0x9581U, 0xa71aU, 0xb693U, 0xc22cU, 0xd3a5U, 0xe13eU, 0xf0b7U, + 0x0840U, 0x19c9U, 0x2b52U, 0x3adbU, 0x4e64U, 0x5fedU, 0x6d76U, 0x7cffU, + 0x9489U, 0x8500U, 0xb79bU, 0xa612U, 0xd2adU, 0xc324U, 0xf1bfU, 0xe036U, + 0x18c1U, 0x0948U, 0x3bd3U, 0x2a5aU, 0x5ee5U, 0x4f6cU, 0x7df7U, 0x6c7eU, + 0xa50aU, 0xb483U, 0x8618U, 0x9791U, 0xe32eU, 0xf2a7U, 0xc03cU, 0xd1b5U, + 0x2942U, 0x38cbU, 0x0a50U, 0x1bd9U, 0x6f66U, 0x7eefU, 0x4c74U, 0x5dfdU, + 0xb58bU, 0xa402U, 0x9699U, 0x8710U, 0xf3afU, 0xe226U, 0xd0bdU, 0xc134U, + 0x39c3U, 0x284aU, 0x1ad1U, 0x0b58U, 0x7fe7U, 0x6e6eU, 0x5cf5U, 0x4d7cU, + 0xc60cU, 0xd785U, 0xe51eU, 0xf497U, 0x8028U, 0x91a1U, 0xa33aU, 0xb2b3U, + 0x4a44U, 0x5bcdU, 0x6956U, 0x78dfU, 0x0c60U, 0x1de9U, 0x2f72U, 0x3efbU, + 0xd68dU, 0xc704U, 0xf59fU, 0xe416U, 0x90a9U, 0x8120U, 0xb3bbU, 0xa232U, + 0x5ac5U, 0x4b4cU, 0x79d7U, 0x685eU, 0x1ce1U, 0x0d68U, 0x3ff3U, 0x2e7aU, + 0xe70eU, 0xf687U, 0xc41cU, 0xd595U, 0xa12aU, 0xb0a3U, 0x8238U, 0x93b1U, + 0x6b46U, 0x7acfU, 0x4854U, 0x59ddU, 0x2d62U, 0x3cebU, 0x0e70U, 0x1ff9U, + 0xf78fU, 0xe606U, 0xd49dU, 0xc514U, 0xb1abU, 0xa022U, 0x92b9U, 0x8330U, + 0x7bc7U, 0x6a4eU, 0x58d5U, 0x495cU, 0x3de3U, 0x2c6aU, 0x1ef1U, 0x0f78U }; + +const uint16_t CCITT16_TABLE2[] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, + 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, + 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, + 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, + 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, + 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, + 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, + 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, + 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, + 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, + 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, + 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, + 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, + 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, + 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, + 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, + 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, + 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, + 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, + 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, + 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, + 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 }; + + +bool CNXDNCRC::checkFiveBit(bool* in, unsigned int tcrc) +{ + assert(in != NULL); + + unsigned int crc; + encodeFiveBit(in, crc); + + return crc == tcrc; +} + +void CNXDNCRC::encodeFiveBit(const bool* in, unsigned int& tcrc) +{ + assert(in != NULL); + + unsigned short total = 0U; + for (unsigned int i = 0U; i < 72U; i += 8U) { + unsigned char c; + CUtils::bitsToByteBE(in + i, c); + total += c; + } + + total %= 31U; + + tcrc = total; +} + +void CNXDNCRC::addCCITT162(unsigned char *in, unsigned int length) +{ + assert(in != NULL); + assert(length > 2U); + + union { + uint16_t crc16; + uint8_t crc8[2U]; + }; + + crc16 = 0U; + + for (unsigned i = 0U; i < (length - 2U); i++) + crc16 = (uint16_t(crc8[0U]) << 8) ^ CCITT16_TABLE2[crc8[1U] ^ in[i]]; + + crc16 = ~crc16; + + in[length - 1U] = crc8[0U]; + in[length - 2U] = crc8[1U]; +} + +bool CNXDNCRC::checkCCITT162(const unsigned char *in, unsigned int length) +{ + assert(in != NULL); + assert(length > 2U); + + union { + uint16_t crc16; + uint8_t crc8[2U]; + }; + + crc16 = 0U; + + for (unsigned i = 0U; i < (length - 2U); i++) + crc16 = (uint16_t(crc8[0U]) << 8) ^ CCITT16_TABLE2[crc8[1U] ^ in[i]]; + + crc16 = ~crc16; + + return crc8[0U] == in[length - 1U] && crc8[1U] == in[length - 2U]; +} + +void CNXDNCRC::addCCITT161(unsigned char *in, unsigned int length) +{ + assert(in != NULL); + assert(length > 2U); + + union { + uint16_t crc16; + uint8_t crc8[2U]; + }; + + crc16 = 0xFFFFU; + + for (unsigned int i = 0U; i < (length - 2U); i++) + crc16 = uint16_t(crc8[1U]) ^ CCITT16_TABLE1[crc8[0U] ^ in[i]]; + + crc16 = ~crc16; + + in[length - 2U] = crc8[0U]; + in[length - 1U] = crc8[1U]; +} + +bool CNXDNCRC::checkCCITT161(const unsigned char *in, unsigned int length) +{ + assert(in != NULL); + assert(length > 2U); + + union { + uint16_t crc16; + uint8_t crc8[2U]; + }; + + crc16 = 0xFFFFU; + + for (unsigned int i = 0U; i < (length - 2U); i++) + crc16 = uint16_t(crc8[1U]) ^ CCITT16_TABLE1[crc8[0U] ^ in[i]]; + + crc16 = ~crc16; + + return crc8[0U] == in[length - 2U] && crc8[1U] == in[length - 1U]; +} + +unsigned char CNXDNCRC::crc8(const unsigned char *in, unsigned int length) +{ + assert(in != NULL); + + uint8_t crc = 0U; + + for (unsigned int i = 0U; i < length; i++) + crc = CRC8_TABLE[crc ^ in[i]]; + + return crc; +} diff --git a/NXDNCRC.h b/NXDNCRC.h new file mode 100644 index 0000000..55390bc --- /dev/null +++ b/NXDNCRC.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2015,2016,2018 by Jonathan Naylor G4KLX + * + * 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(NXDNCRC_H) +#define NXDNCRC_H + +class CNXDNCRC +{ +public: + static bool checkFiveBit(bool* in, unsigned int tcrc); + static void encodeFiveBit(const bool* in, unsigned int& tcrc); + + static void addCCITT161(unsigned char* in, unsigned int length); + static void addCCITT162(unsigned char* in, unsigned int length); + + static bool checkCCITT161(const unsigned char* in, unsigned int length); + static bool checkCCITT162(const unsigned char* in, unsigned int length); + + static unsigned char crc8(const unsigned char* in, unsigned int length); +}; + +#endif diff --git a/NXDNControl.cpp b/NXDNControl.cpp index aaebec9..bf98c4d 100644 --- a/NXDNControl.cpp +++ b/NXDNControl.cpp @@ -28,7 +28,7 @@ const unsigned char SCRAMBLER[] = { // #define DUMP_NXDN -CNXDNControl::CNXDNControl(unsigned int ran, unsigned int id, bool selfOnly, CNXDNNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper) : +CNXDNControl::CNXDNControl(unsigned int ran, unsigned int id, bool selfOnly, CNXDNNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CNXDNLookup* lookup, CRSSIInterpolator* rssiMapper) : m_ran(ran), m_id(id), m_selfOnly(selfOnly), @@ -36,6 +36,7 @@ m_network(network), m_display(display), m_duplex(duplex), m_remoteGateway(remoteGateway), +m_lookup(lookup), m_queue(5000U, "NXDN Control"), m_rfState(RS_RF_LISTENING), m_netState(RS_NET_IDLE), @@ -62,6 +63,7 @@ m_rssiCount(0U), m_fp(NULL) { assert(display != NULL); + assert(lookup != NULL); assert(rssiMapper != NULL); } diff --git a/NXDNControl.h b/NXDNControl.h index 935110a..aaeb1dc 100644 --- a/NXDNControl.h +++ b/NXDNControl.h @@ -22,7 +22,7 @@ #include "RSSIInterpolator.h" #include "NXDNNetwork.h" #include "NXDNDefines.h" -// #include "YSFPayload.h" +#include "NXDNLookup.h" #include "RingBuffer.h" #include "StopWatch.h" #include "NXDNLICH.h" @@ -35,7 +35,7 @@ class CNXDNControl { public: - CNXDNControl(unsigned int ran, unsigned int id, bool selfOnly, CNXDNNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper); + CNXDNControl(unsigned int ran, unsigned int id, bool selfOnly, CNXDNNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CNXDNLookup* lookup, CRSSIInterpolator* rssiMapper); ~CNXDNControl(); bool writeModem(unsigned char* data, unsigned int len); @@ -52,6 +52,7 @@ private: CDisplay* m_display; bool m_duplex; bool m_remoteGateway; + CNXDNLookup* m_lookup; CRingBuffer m_queue; RPT_RF_STATE m_rfState; RPT_NET_STATE m_netState; diff --git a/NXDNConvolution.cpp b/NXDNConvolution.cpp new file mode 100644 index 0000000..7120d6b --- /dev/null +++ b/NXDNConvolution.cpp @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2009-2016,2018 by Jonathan Naylor G4KLX + * + * 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 "NXDNConvolution.h" + +#include +#include +#include + +const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U}; + +#define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7]) +#define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) + +const uint8_t BRANCH_TABLE1[] = {0U, 0U, 0U, 0U, 1U, 1U, 1U, 1U}; +const uint8_t BRANCH_TABLE2[] = {0U, 1U, 1U, 0U, 0U, 1U, 1U, 0U}; + +const unsigned int NUM_OF_STATES_D2 = 8U; +const unsigned int NUM_OF_STATES = 16U; +const uint32_t M = 2U; +const unsigned int K = 5U; + +CNXDNConvolution::CNXDNConvolution() : +m_metrics1(NULL), +m_metrics2(NULL), +m_oldMetrics(NULL), +m_newMetrics(NULL), +m_decisions(NULL), +m_dp(NULL) +{ + m_metrics1 = new uint16_t[16U]; + m_metrics2 = new uint16_t[16U]; + m_decisions = new uint64_t[180U]; +} + +CNXDNConvolution::~CNXDNConvolution() +{ + delete[] m_metrics1; + delete[] m_metrics2; + delete[] m_decisions; +} + +void CNXDNConvolution::start() +{ + ::memset(m_metrics1, 0x00U, NUM_OF_STATES * sizeof(uint16_t)); + ::memset(m_metrics2, 0x00U, NUM_OF_STATES * sizeof(uint16_t)); + + m_oldMetrics = m_metrics1; + m_newMetrics = m_metrics2; + m_dp = m_decisions; +} + +void CNXDNConvolution::decode(uint8_t s0, uint8_t s1) +{ + *m_dp = 0U; + + for (uint8_t i = 0U; i < NUM_OF_STATES_D2; i++) { + uint8_t j = i * 2U; + + uint16_t metric = (BRANCH_TABLE1[i] ^ s0) + (BRANCH_TABLE2[i] ^ s1); + + uint16_t m0 = m_oldMetrics[i] + metric; + uint16_t m1 = m_oldMetrics[i + NUM_OF_STATES_D2] + (M - metric); + uint8_t decision0 = (m0 >= m1) ? 1U : 0U; + m_newMetrics[j + 0U] = decision0 != 0U ? m1 : m0; + + m0 = m_oldMetrics[i] + (M - metric); + m1 = m_oldMetrics[i + NUM_OF_STATES_D2] + metric; + uint8_t decision1 = (m0 >= m1) ? 1U : 0U; + m_newMetrics[j + 1U] = decision1 != 0U ? m1 : m0; + + *m_dp |= (uint64_t(decision1) << (j + 1U)) | (uint64_t(decision0) << (j + 0U)); + } + + ++m_dp; + + assert((m_dp - m_decisions) <= 180); + + uint16_t* tmp = m_oldMetrics; + m_oldMetrics = m_newMetrics; + m_newMetrics = tmp; +} + +void CNXDNConvolution::chainback(unsigned char* out, unsigned int nBits) +{ + assert(out != NULL); + + uint32_t state = 0U; + + while (nBits-- > 0) { + --m_dp; + + uint32_t i = state >> (9 - K); + uint8_t bit = uint8_t(*m_dp >> i) & 1; + state = (bit << 7) | (state >> 1); + + WRITE_BIT1(out, nBits, bit != 0U); + } +} + +void CNXDNConvolution::encode(const unsigned char* in, unsigned char* out, unsigned int nBits) const +{ + assert(in != NULL); + assert(out != NULL); + assert(nBits > 0U); + + uint8_t d1 = 0U, d2 = 0U, d3 = 0U, d4 = 0U; + uint32_t k = 0U; + for (unsigned int i = 0U; i < nBits; i++) { + uint8_t d = READ_BIT1(in, i) ? 1U : 0U; + + uint8_t g1 = (d + d3 + d4) & 1; + uint8_t g2 = (d + d1 + d2 + d4) & 1; + + d4 = d3; + d3 = d2; + d2 = d1; + d1 = d; + + WRITE_BIT1(out, k, g1 != 0U); + k++; + + WRITE_BIT1(out, k, g2 != 0U); + k++; + } +} diff --git a/NXDNConvolution.h b/NXDNConvolution.h new file mode 100644 index 0000000..d6171c9 --- /dev/null +++ b/NXDNConvolution.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2015,2016,2018 by Jonathan Naylor G4KLX + * + * 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(NXDNConvolution_H) +#define NXDNConvolution_H + +#include + +class CNXDNConvolution { +public: + CNXDNConvolution(); + ~CNXDNConvolution(); + + void start(); + void decode(uint8_t s0, uint8_t s1); + void chainback(unsigned char* out, unsigned int nBits); + + void encode(const unsigned char* in, unsigned char* out, unsigned int nBits) const; + +private: + uint16_t* m_metrics1; + uint16_t* m_metrics2; + uint16_t* m_oldMetrics; + uint16_t* m_newMetrics; + uint64_t* m_decisions; + uint64_t* m_dp; +}; + +#endif + diff --git a/NXDNLookup.cpp b/NXDNLookup.cpp new file mode 100644 index 0000000..7cfc152 --- /dev/null +++ b/NXDNLookup.cpp @@ -0,0 +1,158 @@ +/* +* Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX +* +* 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 "NXDNLookup.h" +#include "Timer.h" +#include "Log.h" + +#include +#include +#include +#include + +CNXDNLookup::CNXDNLookup(const std::string& filename, unsigned int reloadTime) : +CThread(), +m_filename(filename), +m_reloadTime(reloadTime), +m_table(), +m_mutex(), +m_stop(false) +{ +} + +CNXDNLookup::~CNXDNLookup() +{ +} + +bool CNXDNLookup::read() +{ + bool ret = load(); + + if (m_reloadTime > 0U) + run(); + + return ret; +} + +void CNXDNLookup::entry() +{ + LogInfo("Started the NXDN Id lookup reload thread"); + + CTimer timer(1U, 3600U * m_reloadTime); + timer.start(); + + while (!m_stop) { + sleep(1000U); + + timer.clock(); + if (timer.hasExpired()) { + load(); + timer.start(); + } + } + + LogInfo("Stopped the NXDN Id lookup reload thread"); +} + +void CNXDNLookup::stop() +{ + if (m_reloadTime == 0U) { + delete this; + return; + } + + m_stop = true; + + wait(); +} + +std::string CNXDNLookup::find(unsigned int id) +{ + std::string callsign; + + if (id == 0xFFFFU) + return std::string("ALL"); + + m_mutex.lock(); + + try { + callsign = m_table.at(id); + } catch (...) { + char text[10U]; + ::sprintf(text, "%u", id); + callsign = std::string(text); + } + + m_mutex.unlock(); + + return callsign; +} + +bool CNXDNLookup::exists(unsigned int id) +{ + m_mutex.lock(); + + bool found = m_table.count(id) == 1U; + + m_mutex.unlock(); + + return found; +} + +bool CNXDNLookup::load() +{ + FILE* fp = ::fopen(m_filename.c_str(), "rt"); + if (fp == NULL) { + LogWarning("Cannot open the NXDN Id lookup file - %s", m_filename.c_str()); + return false; + } + + m_mutex.lock(); + + // Remove the old entries + m_table.clear(); + + char buffer[100U]; + while (::fgets(buffer, 100U, fp) != NULL) { + if (buffer[0U] == '#') + continue; + + char* p1 = ::strtok(buffer, ",\t\r\n"); + char* p2 = ::strtok(NULL, ",\t\r\n"); + + if (p1 != NULL && p2 != NULL) { + unsigned int id = (unsigned int)::atoi(p1); + for (char* p = p2; *p != 0x00U; p++) + *p = ::toupper(*p); + + m_table[id] = std::string(p2); + } + } + + m_mutex.unlock(); + + ::fclose(fp); + + size_t size = m_table.size(); + if (size == 0U) + return false; + + LogInfo("Loaded %u Ids to the NXDN callsign lookup table", size); + + return true; +} \ No newline at end of file diff --git a/NXDNLookup.h b/NXDNLookup.h new file mode 100644 index 0000000..d7b0486 --- /dev/null +++ b/NXDNLookup.h @@ -0,0 +1,53 @@ +/* +* Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX +* +* 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. +*/ + +#ifndef NXDNLookup_H +#define NXDNLookup_H + +#include "Thread.h" +#include "Mutex.h" + +#include +#include + +class CNXDNLookup : public CThread { +public: + CNXDNLookup(const std::string& filename, unsigned int reloadTime); + virtual ~CNXDNLookup(); + + bool read(); + + virtual void entry(); + + std::string find(unsigned int id); + + bool exists(unsigned int id); + + void stop(); + +private: + std::string m_filename; + unsigned int m_reloadTime; + std::unordered_map m_table; + CMutex m_mutex; + bool m_stop; + + bool load(); +}; + +#endif diff --git a/YSFConvolution.h b/YSFConvolution.h index 3fc4956..457103c 100644 --- a/YSFConvolution.h +++ b/YSFConvolution.h @@ -19,8 +19,6 @@ #if !defined(YSFConvolution_H) #define YSFConvolution_H -#include "YSFConvolution.h" - #include class CYSFConvolution { diff --git a/nxuid_export.csv b/nxuid_export.csv new file mode 100644 index 0000000..d1e2d1a --- /dev/null +++ b/nxuid_export.csv @@ -0,0 +1,404 @@ +UID,Call,Name,Location,Notes,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12246,KD4ACG,Jason,"Hudson, FL",Icom Portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12245,KD4ACG,Jason,"Hudson, FL",Icom Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25068,N1QD,Joe,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12204,WX3C,Juan Arias,Florida,Orlando metro,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6801,hb9vsd,relais de verbier,verbier,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57035,VA3RQ,Jon,Oakville ON,Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +74,N2IXC,Ed,Chatsworth NJ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3452,K0KAD,CHAD TAYLOR,"SPOKANE VALLEY, WA",Mobile Radio,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3451,K0KAD,CHAD TAYLOR,"SPOKANE VALLEY, WA",My Base Station,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3450,K0KAD,CHAD TAYLOR,"SPOKANE VALLEY, WA",My Portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12016,K4NBC,Miguel,"Palm Bay, Florida",M2 Icom F6061D,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57034,VE3DJZ,Huey,"Hamilton, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57033,VE3DJZ,Huey,"Hamilton, ON",mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57032,VE3AEP,Dom 2,"Toronto, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57031,VE3KFQ,Doug,"Toronto, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57030,VE3KFQ,Doug,"Toronto, ON",mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57029,VA3KY,Shelly,"Thornhill, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57028,VA3KY,Shelly,"Thornhill, ON",mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57027,VA3VAD,Arpad,"Hamilton, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57026,VA3PAD,Andrew,"Scarborough, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57025,VA3PAD,Andrew,"Scarborough, ON",mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57024,VA3CQA,Brian,"Scarborough, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57023,ve3ips,John,"Toronto, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57022,ve3fkn,Tom,"Stoney Creek, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57021,va3wjo,Walter,"Toronto, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57020,VA3PEO,Adrian,"Toronto, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57019,VE3AEP,Dom,"Toronto, ON",mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57018,VE3RZR,Richard,"Toronto, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57017,VE3UBI,Paul,"Scarborough, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57016,VE3UBI,Paul,"Scarborough, ON",mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57015,VE3HY,Frank,"Caledon, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57014,VE3BWP,Brian,"Caledon, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57013,VA3AGV,cottage,"Toronto, ON",mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57012,VA3WZW,Andre,"Durham, ON",mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57011,VA3WZW,Andre,"Durham, ON",mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57010,va3mk,Mark,"Oakville, ON",mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57009,va3mk,Mark,"Oakville, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57008,ve3ogb,Randy,"Toronto, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57007,va3rq,Jon,"Oakville, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57006,VE3JLU,Sherwin,"Scarborough, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57005,VE3NBI,Anoop,"Scarborough, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57004,VE3CCD,Curtis,"Scarborough, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57003,VE3OKZ,Janusz,"Toronto, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57002,VE3OKZ,Janusz,"Toronto, ON",mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57001,VE3SP,Andre,"Toronto, ON",handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57000,VE3SP,Andre,"Toronto, ON",mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25901,N1MRC,Matt,"Bridgewater, MA",N1MRC P-1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +4020,K4XXX,Ed,"London, KY",NX820 Base,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +24020,K4XXX,Ed,"London, KY",NX5800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +24021,K4XXX,Ed,"London, KY",NX5700,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +14020,K4XXX,Ed,"London, KY",NX5300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +14021,K4XXX,Ed,"London, KY",NX5200,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1066,KM4JXP,Peter Tasker,Longboat Key,NX5300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +995,K1IFF/Base,Cliff,"Brsitol, CT",NXR710 link radio,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +28001,K3KRS,rYAN,CLEVLAND,OHIO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1954,W4BPT,BILLY TAYLOR,"RINGGOLD,GA.",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5101,KC5YQB,Paul Blair,"Fayetteville, AR",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5100,K5SRS,Michael Smith,"Fayetteville, AR",NX-5800 Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +40124,N5YEI,Jeff Dalrymple,"Jay, Oklahoma",NX-5300 Portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +40024,N5YEI,Jeff Dalrymple,"Jay, Oklahoma",NX-5800 Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1997,KC1AJR,Giovanni,East Hampton CT,kenwood NX800 K2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9,KE8BGA,Lowell Katz,"Cleveland, Ohio","on the north shore, NX-800",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12015,K4NBC,K4NBC-Miguel UHF Mobile,"Palm Bay, Florida",Future UHF Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12014,K4NBC,Miguel Orama,"Palm Bay, Florida",Kenwood NX200 VHF HT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12013,K4NBC,Miguel Orama,"Palm Bay, Florida",Icom F4146DS UHF Portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +30571,WX4RCF,Ryan F.,"Tampa, FL",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +27202,KP4OO,Carlos,"Palm Bay, FL",Icom Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +27102,KP4OO,Carlos,"Palm Bay, FL",Icom Portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +27201,KI4SWB,Mark,"Melbourne Beach, FL",Icom Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +27101,KI4SWB,Mark,"Melbourne Beach, FL",Icom Portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +49106,WX7Y-6,Bret Mills,Castle Dale,WX7Y-6 Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +49104,WX7Y-4,Bret Mills,"Castle Dale, Utah",WX7Y-4 Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +49102,WX7Y-2,Bret Mills,"Caslte Dale, Utah",WX7Y-2 Hand held,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +49101,WX7Y-1,Bret Mills,Castle Dale Utah,WX7y-1 Hand Held 1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6802,HB9YRB,Alex,Verbier,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6804,HB9FMF,Didier,Rougemont,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12234,KD4TWJ,Dean,EL98,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +980,W1RHS,Rick,Connecticut,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3112205,N2HUC,Phil Roberts,"Port St. Lucie, FL",DV4MINI AMBE voice,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +31146,KD2KWD,Michael Santamaria,"Brandon, FL",Kenwood,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +4804,hb9fmf,Didier,Rougemont,NX5300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +4802,hb3yrb,Alex,Verbier,nx5300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1966,ZS6IIX,Henry,Petit South Africa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5151,KC6HFJ,Tamara,"Los Angeles, CA",NX-300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5150,WY6NN,Doug,"Los Angeles, CA",NX-300/5300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5125,AE5OQ,Armstead,"Higden, AR",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3280,KD4EFM,Evans,"Lakeland, Florida",work radio,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25585,N1AVA,Ken Howland,"DARTMOUTH,MA",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25582,N1KXJ,Ray,"E. Bridgewater, MA.",Port.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3118365,NA9VY,Chris Gilbert,"New Palestine, IN",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3142058,N3BAH,L. Abraham Smith,Southwestern Pennsylvania,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3118366,N9UMJ,Rick Nicholson,Buddha Indiana,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3106418,N5ICK,Nicholas Nixon,"Rialto, Ca",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +141,KF2M,Greg Popovich,"Mt Laurel, NJ",IC-F4161DT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +37009,KA4YMY,Steve,"Charlotte, NC",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +37010,KA4YMY,Steve,"Charlotte, NC",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25022,KE5UZU,Raymond Prince,"England, AR",Icom Handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25021,KE5UZU,Raymond Prince,"England, AR",Kenwood Handheld,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3079,NN4TT,Dave,Orlando,NX300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25125,N1TI,Tim,"Mattapoisett, MA",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25246,WG1U,Ken,"Assonet, MA",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25125,N1TI,Tim,"Mattapoisett, MA",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +37010,KA4YMY,Steve,"Charlotte, NC",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7,F1PRY,Emmanuel,BEAUVAIS FR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25700,NN1D,Tony Souza,"Swansea, MA",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1008,DK6PX,Stefan,Germany nr Bad Toelz,Coming up FR6000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25582,N1KXJ,Ray Wall,East Bridgewater,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17,KC2SNI,Jim Hannon,"West Berlin, New Jersey",My Radio is an Icom IC-3161DT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +80,W2FLY/M,Harry,Southern NJ,VHF NX-5700 mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +88,W2FLY/P,Harry,Southern NJ,VHF NX-220 portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +85,W2FLY/M,Harry,Southern NJ,VHF NX_700 van,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +86,W2FLY,Harry,"Mullica Hill, NJ",VHF NX-700 base,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +87,W2FLY/M,Harry,Southern NJ,VHF NX-700 mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +82,W2FLY/P,Harry,"Somers Point, NJ",VHF NX-700 Shore Base,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +89,WB2RUH,Bruce,Vineland NJ,VHF NX-700 base,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +26,WB2RUH/M,Bruce,Southern NJ,UHF NX-800 mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25,WB2RUH/P,Bruce,Southern NJ,UHF NX-320,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8,W2FLY/P,Harry,Southern NJ,UHF NX-820 Port 2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +4,W2FLY/M,Harry,Southern NJ,UHF NX-800 Van,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2,W2FLY/M,Harry,Southern NJ,UHF NX-800 mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3,WB2OOM/M,Tina,Southern NJ,UHF NX-800 Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +76,W2FLY/P,Harry,Southern NJ,UFH NX5300 Port 1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +77,W2FLY/P,Harry,"Somers Point, NJ",UHF NX-800 Shore Base,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +78,W2FLY,Harry,"Mullica Hill, NJ",UHF NX-800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +79,W2FLY/M,Harry,Southern NJ,UHF NX-5800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +36134,N2SRO,Mike,"Pitman, NJ",Portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +134,N2SRO,Mike,Pitman,Mobile Radio,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5125,AE5OQ,Armstead,AR,entered by k1iff,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25830,KB1CHU,Steve,MA,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12010,kd4dwp,Ben,Orlando,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +972,N1ODJ,Kenny Schmitz,Middletown,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +909,AB1UB V,Woody,"Bristol, CT",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1956,KC7SDD,Dana Hanford,"Bainbridge Island, WA","Member BARC, W7NPC.org",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1963,N5JRN,David Barts,"Bainbridge Island, WA","Handheld, Icom 4161",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +44002,K2BUI,Eric,"Providence, RI",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +30505,KG6MQE,Jim,MT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17855,AG6RN,Demian,CA,NX-210,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13815,KG4BKO,Bill,GA,nx320,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +973,W1VLF,Paul,CT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1010,KE4GWW,James,AL,NX800 Mobile#2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1009,KE4GWW,James,AL,NX800 Mobile#1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1008,KE4GWW,James,AL,NX700 Mobile#2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1006,KE4GWW,James,AL,NX800 Base,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1005,KE4GWW,James,AL,NX700 Base,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1004,KE4GWW,James,AL,NX300 Portable #2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1003,KE4GWW,James,AL,NX300 Portable #1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1002,KE4GWW,James,AL,NX200 Portable #2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1001,KE4GWW,James,AL,NX200 Portable #1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +971,N1ELE,Paul,CT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +970,KB1VRI,Nick,CT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1007,KE4GWW,James M. Nelson,"Dothan, AL",NX700 Mobile#1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +909,AB1UB,Woody,"Bristol, CT",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +952,K1KGQ,Joel,CT,Truck radio,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +134,N2SRO,Mike,NJ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +55704,WB9HKE,Rick,WI,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +55700,WB9HKE,Rick,WI,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +44001,K2BUI,Eric,RI,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57002,VE3EI,Eric,,Eric - Dongle,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +57001,VE3EI,Eric,,Eric - Portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +44298,N1JBC,Jed,,JED,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +44007,W2DAN,Dave,,Dave - NX700,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +43751,N4IRS,Steve,,Steve,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +37001,KA4YMY,Steve,NC,"Steve, Charlotte, NC NX320",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +36003,KC2VOB,Asad,NY,"Asad, NYC, NX-300GK",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +36002,KC2VOB,Asad,NY,"Asad, NYC, NX-5800",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +36001,W2CCR,Chris,NY,"Chris, Galway, NY NX300",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +34002,N2WNS,Bill,NJ,N2WNS Base,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +34001,N2WNS,Bill,NJ,N2WNS Portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +33002,N1PA,Paul,NH,PAUL - NEW HAMPSHIRE,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +33001,N1PA,Paul,NH,PAUL - NEW HAMPSHIRE,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +33000,N1PA-R,Paul,NH,PAUL - NEW HAMPSHIRE REPEATER,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +31117,K4QHR,Pete,,Pete,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25957,KC1HO,Steve,,STEVE,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25901,N1ZZR,Matt,,Matt,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25900,N1ZZR,Matt,,Matt - mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25889,AB1CQ,Gary,,Gary,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25888,K1WGU,Bob,,Bob,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25874,KB1KVD,Jason,,Jason - Icom Mob & Port,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25863,N1ZZN,Jeff,,JEFF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25777,W1BON,Bump,,Bump,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25746,N1OTY,John,,JOHN,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25743,WG1U,Kenny,,KEN,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25740,WG1U,Kenny,,KEN,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25555,WA1MNQ,Mike,,Mike,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25444,W1TAV,Steve,,Steve,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25390,KC1JET,Jim,,JIM (MOBILE),,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25390,KC1JET,Jim,,JIM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25333,W1AKN,Jack,,Jack Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25222,KE4SDC,Ron,,Ron - Portable NX300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25221,N0XIA,James,,James - Kenwood Mobile and Portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25144,W1WCF,Walter,,Walter,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25070,WD1L,John,,John,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25069,N1COP,Bob,,Bob,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25039,KC1JET,Jim,,JIM (BASE),,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25035,KG5BMB,Glenda,AR,"KG5BMB, Glenda McCord, Searcy, AR, Icom F4161DS",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25034,KF5TPF,Ryan,AR,"KF5TPF, Ryan Nelson, Edgemont, AR - ICOM 4161",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25033,AF5OD,Landon,AR,"AF5OD, Landon McCord, Searcy, AR, Icom F4161DS",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25032,KC5DFH,Kirk,AR,"KC5DFH, Kirk Williams, Searcy, AR - Kenwood NX-340",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25031,KJ5SF,Stan,AR,"KJ5SF, Stan Rongey, Searcy, AR - Kenwood NX-340",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25030,AC5AV,Larry,AR,"AC5AV, Larry Sicks, Searcy, AR",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25029,KF5WHX,Trey,AR,"KF5WHX, Trey Ferguson, Searcy, AR - Kenwood NX-320",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25028,WA8UBL,Allen,AR,"WA8UBL, Allen Herrick, Beebe, AR - Kenwood NX-220",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25027,KF5TPF,Ryan,AR,"KF5TPF, Ryan Nelson, Edgemont, AR - Kenwood NX-200",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25026,WA8UBL,Allen,AR,"WA8UBL, Allen Herrick, Beebe, AR - Kenwood NX-320",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25025,KJ5ORD,John,AR,"KJ5ORD, John Ord, Searcy, AR - Kenwood NX-xxx VHF",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25024,KG5CHM,Colt,AR,"KG5CHM, Colt Boyd, Searcy, AR - Kenwood NX-300",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25023,KE5YZP,Ryan,AR,"KE5YZP, Ryan A Schwarck, Batesville, AR - Icom",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25022,KE5YZP,Ryan,AR,"KE5YZP, Ryan A Schwarck, Batesville, AR - Icom",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25021,AF5OD,Landon,AR,"AF5OD, Landon McCord, Searcy, AR",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25020,KB5ZUH,Todd,AR,"KB5ZUH, Todd Williams, Searcy, AR - Kenwood NX-320",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25019,KB5ZUH,Todd,AR,"KB5ZUH, Todd Williams, Searcy, AR - Kenwood NX-340",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25018,KB5ZUH,Todd,AR,"KB5ZUH, Todd Williams, Searcy, AR - Kenwood NX-340",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25017,KB5ZUH,Todd,AR,"KB5ZUH, Todd Williams, Searcy, AR - Kenwood NX-320",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25016,KB5RFF,Scott,AR,"KB5RFF, Scott Gray, Searcy, AR - Kenwood NX-300",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25015,KJ5ORD,John,AR,"KJ5ORD, John Ord, Searcy, AR - Kenwood NX-300",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25014,N5LKE,James,AR,"N5LKE, James Ferguson, Searcy, AR - Kenwood NX-5300",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25013,KK5WA,Darin,AR,"KK5WA, Darin Dykes, Beebe, AR - Kenwood NX-320",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25012,KD5HRT,Heath,AR,"KD5HRT, Heath Taylor, McRae, AR - Kenwood NX-300",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25011,W5ZN,Joel,AR,"W5ZN, Joel Harrison, Judsonia, AR - Kenwood NX-300",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25010,KD5OOW,Tom,AR,"KD5OOW, Tom McGee, Searcy, AR - Kenwood NX-300",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25009,AC5AV,Larry,AR,"AC5AV, Larry Sicks, Searcy, AR - Kenwood NX-300",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25008,N5QT,Dawn,AR,"N5QT, Dawn Gray, Searcy, AR - Kenwood NX-200",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25007,N5QT,Dawn,AR,"N5QT, Dawn Gray, Searcy, AR - Kenwood NX-300",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25006,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR - Kenwood NX-340U",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25005,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR - Kenwood NX-320",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25004,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR - Kenwood NX-200",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25003,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR - Kenwood NX-300",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25002,N5QZ,Ryan,AR,"N5QZ, Ryan McAfee, Searcy, AR - Kenwood NX-200",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +25001,N5QZ,Ryan,AR,"N5QZ, Ryan McAfee, Searcy, AR - Kenwood NX-300",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +21014,K2BUI,Eric,,Eric,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +21007,WA1LMV,Rick,,Rick,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17011,N9BRG,Dan,,Dan kenwood nx800k2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17009,KC9PHK,Michael,,F4061DS,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17008,KC9RHH,Jesse,,F4101D,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17007,KC9NPJ,Jarrett,,Jarrett F4231DS,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17006,KC9GMX,Stephen,,Stephen - F4161DS,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17005,KC9NPJ,Jarrett,,Jarrett F6121D,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17004,KC9GMX,Stephen,,Stephen - F6061D,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +17002,KC9GMX,Stephen,,Stephen - Base F6121D,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15027,KB5RFF,Scott,AR,"KB5RFF, Scott Gray, Searcy, AR - Kenwood NX-800",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15026,AF5OD,Landon,AR,"AF5OD, Landon McCord, Searcy, AR",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15025,KE5YZP,Ryan,AR,"KE5YZP, Ryan Schwarck, Batesville, AR NX-700",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15024,KF5TPF,Ryan,AR,"KF5TPF, Ryan Nelson, Edgemont, AR NX-700",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15023,N5ZA,Joel,AR,"N5ZA, Joe Belew, Beebe, AR - Kenwood NX-700",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15022,WA8UBL,Allen,AR,"WA8UBL, Allen Herrick, Beebe, AR - Kenwood NX-800",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15021,KD5HRT,Heath,AR,"KD5HRT, Heath Taylor, McRae, AR, Kenwood NX-800",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15020,WA8UBL,Allen,AR,"WA8UBL, Allen Herrick, Beebe, AR, Kenwood NX-700",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15019,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR ATV Mobile",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15018,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR ATV Mobile",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15017,KG5KS,Kenny,,"KG5KS, Kenny Thompson - Kenwood NX-800HK",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15016,KG5KS,Kenny,,"KG5KS, Kenny Thompson - Kenwood NX-700HK",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15015,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR Motorcycle Mobile",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15014,N5QT,Dawn,AR,"N5QT, Dawn Gray, Searcy, AR - Kenwood NX-700",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15013,AC5AV,Larry,AR,"AC5AV, Larry Sicks, Searcy, AR - Kenwood NX-700",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15012,AC5AV,Larry,AR,"AC5AV, Larry Sicks, Searcy, AR - Kenwood NX-800",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15011,N5QT,Dawn,AR,"N5QT, Dawn Gray, Searcy, AR - Kenwood NX-800",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15010,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR - Kenwood NX-700 (Vehicle 3)",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15009,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR - Kenwood NX-800 (Vehicle 3)",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15008,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR - Kenwood NX-700 (Vehicle 2)",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15007,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR - Kenwood NX-800 (Vehicle 2)",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15006,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR - Kenwood NX-700 (Vehicle 1)",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15005,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR - Kenwood NX-800 (Vehicle 1)",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15004,N5QZ,Ryan,AR,"N5QZ, Ryan McAfee, Searcy, AR - Kenwood NX-700 (Vehicle 2)",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15003,N5QZ,Ryan,AR,"N5QZ, Ryan McAfee, Searcy, AR - Kenwood NX-800 (Vehicle 2)",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15002,N5QZ,Ryan,AR,"N5QZ, Ryan McAfee, Searcy, AR - Kenwood NX-700 (Vehicle 1)",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +15001,N5QZ,Ryan,AR,"N5QZ, Ryan McAfee, Searcy, AR - Kenwood NX-800H (Vehicle 1)",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13401,W1KFR,Bill,,Bill,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13132,W5JR,Mike,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13131,W5JR,Mike,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13127,KD4APP,Don,,Don - NX200,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13126,KD4APP,Don,,Don - F6061D,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13125,KD4APP,Don,,Don - NX300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13122,W4CML,Chuck,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13121,W4CML,Chuck,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13107,W7QO,Alan,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13106,W7QO,Alan,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +13105,W7QO,Alan,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12780,KC4YUA,Brett,,BRETT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12691,KE3WDW,Sam,,Sam,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12666,KI4SWY,William,,William Stillwel ( All Radios ),,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12608,K4CBN,Greg,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12607,K4CBN,Greg,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12606,K4CBN,Greg,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12605,K4CBN,Greg,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12604,K4CBN,Greg,,GREG,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12577,N2DLX,Richard,,Rich Dunajewski NX-5800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12523,KM4JVE,Ana,,Ana - IC-F4161,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12375,KF4I,Thom,,Thom Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12374,KF4I,Thom,,Thom Base,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12273,KE4OSL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12272,KE4OSL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12250,KE4GYX,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12247,K2MCI,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12246,KD4ACG,Jason,,JASON,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12245,KD4ACG,Jason,,JASON,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12241,KR4X,Larry,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12240,KR4X,Larry,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12236,N1IC,Nick,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12235,N1IC,Nick,,Nic,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12231,KQ4KX,Richard,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12230,KQ4KX,Richard,,Richard Sharp,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12226,KI4SWY,William,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12223,W4PJT,Paul,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12222,W4PJT,Paul,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12221,N4PK,Paul,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12220,N4PK,Paul,,PAUK K.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12216,WA4ISB,Ed,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12215,WA4ISB,Ed,,ED Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12214,N4APG,Bill,,Bill Pfost,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12213,N4APG,Bill,,Bill Pfost,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12212,N4APG,Bill,,Bill Pfost,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12211,N4APG,Bill,,Bill Pfost,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12210,N4APG,Bill,,Bill Pfost,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12204,NB9X,Paul,FL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12203,NB9X,Paul,FL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12202,NB9X,Paul,FL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12201,NB9X,Paul,FL,PAUL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12200,NB9X,Paul,FL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12136,WA4KWK,John,,John F6121,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12127,W4KDM,Rick,,Rick - Portable NX300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12023,KD4NWL,John,,JOHN,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12021,W4PJT,Paul,,Paul,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12017,N4JFZ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12007,W4MO,Stewart,,STEWART NX800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12006,W4MO,Stewart,,STEWART NX300 / 320,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12005,KD4TWJ,Dean,,Dean - Portable IC-F4161,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12002,W4KJP,Kevin,,KEVIN,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9834,VA7NY,PJ,,PJ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7737,N4NKV,George,,George,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6439,N4NKV,George,,George,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6432,K4GFD,Norm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6431,K4GFD,Norm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6430,K4GFD,Norm,FL,Norm Greensboro Fla,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5987,W5ZN,Joel,AR,"W5ZN, Joel Harrison, Judsonia, AR - Kenwood NX-800",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5599,W1ZM,Ryan,,"W1ZM, Ryan Nelson, NX-5300",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5170,K5WMZ,Gary,AR,"K5WMZ, Gary D Partlow, Ward, AR - Kenwood NX-700",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5134,AE5OQ,Armstead,AR,"AE5OQ, Armstead M Feland, IV, Higdon, AR - Kenwood NX-200",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5009,KJ5SF,Stan,AR,"KJ5SF, Stan Rongey, Searcy, AR - Kenwood NX-800",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5008,AF5WN,Mason,AR,"AF5WN, Mason Creager, Cabot, AR - Kenwood NX-700H",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5007,N5LKE,James,AR,"N5LKE, James Ferguson, Searcy, AR - Kenwood NX-800",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5006,AC5AV,Larry,AR,"AC5AV, Larry Sicks, Searcy, AR",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5005,AC5AV,Larry,AR,"AC5AV, Larry Sicks, Searcy, AR",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5004,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR - Kenwood NX-720",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5003,N5QS,Roger,AR,"N5QS, Roger Gray, Searcy, AR - Kenwood NX-820",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5002,N5QZ,Ryan,AR,"N5QZ, Ryan McAfee, Searcy, AR - Kenwood NX-720",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5001,N5QZ,Ryan,AR,"N5QZ, Ryan McAfee, Searcy, AR - Kenwood NX-820",,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3281,N4KEG,Richard,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3280,KD4EFM,Evans,FL,Evans Mobile(s),,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3280,KD4EFM,Evans,FL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3279,N4KEG,Richard,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3278,KD4EFM,Evans,FL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3275,KD4EFM,Evans,FL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3274,KD4EFM,Evans,FL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3271,N4KEG,Richard,,RICHARD - Mobile and or ht's N4KEG (UHF),,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3083,KD4TWJ,Dean,,Dean - Mobile NX800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3082,W4LOV,Mike,,Mike - Portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3081,W4MCA,Michael,,Michael - NX800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3079,W4ORL,Ralph,,Ralph - Portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3075,W4LOV,Mike,,Mike - NX800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3074,W4MCA,Michael,,Michael - NX300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3072,N4JTK,John,,John - NX800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3071,W4LOV,Mike,,Mike - NX800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +3070,W4ORL,Ralph,,Ralph - Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +970,KB1VRI,Nick,,Nick,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +963,N1MAT,Dennis,,Dennis F4161,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +962,N1MAT,Dennis,,Dennis F4161,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +961,WA1SSB,Joe,,Joe NX800H,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +960,K1ZXX,Gary,,Gary - Icom All radios,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +959,K1KGQ,Joel,,Future,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +958,K1KGQ,Joel,,Joel F4161,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +957,K1KGQ,Joel,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +956,K1KGQ,Joel,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +955,K1KGQ,Joel,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +954,K1KGQ,Joel,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +953,K1KGQ,Joel,,Joel NX320-1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +952,K1GML,Gail,,Gail NX800H,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +951,K1KGQ,Joel,,Joel NX800H,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +936,W1GPO,John,,NX300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +931,K1IFF,Cliff,CT,NX300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +930,K1IFF,Cliff,CT,NX300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +928,N1XDN,Bob,CT,Icom portable,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +926,N1XDN,Bob,CT,Bob M1 UHF NX-5800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +925,N1XDN,Bob,CT,Bob P2 VHF NX-5200,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +924,N1XDN,Bob,CT,Bob P3 UHF NX-5300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +923,N1XDN,Bob,CT,Bob M1 VHF NX700,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +922,N1XDN,Bob,CT,Bob P2 UHF NX300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +921,N1XDN,Bob,CT,Bob P1 VHF NX220,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +920,N1XDN,Bob,CT,Bob P1 UHF NX300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +912,W4CCL,Chuck,,CHUCK,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +911,W4CLL,Chuck,,CHUCK,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +910,W4CLL,Chuck,,CHUCK,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +909,AB1UB,Woody,,Woody NX300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +909,W4CCL,Chuck,,CHUCK,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +908,W4CLL,Chuck,,CHUCK,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +907,K1IFF,Cliff,CT,Future,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +906,K1IFF,Cliff,CT,Cliff NX200,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +905,WA1LMV,Rick,,Rick NX320,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +903,K1IFF,Cliff,CT,Cliff NX800H,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +902,K1IFF,Cliff,CT,Cliff NX320 - demo,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +901,K1IFF,Cliff,CT,Cliff NX320,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +401,W1KFR,Bill,,Bill,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +99,K1ZSG,Don,,Mobile,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +30,KD4MOJ,Doug,,Doug,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,