From d038cad5e3b4e1b088d7d9780d6d7395a82939c3 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Tue, 4 Oct 2022 22:45:05 -0400 Subject: [PATCH] expose hotspot AFC functionality; remove display of date/time from calibration mode; --- config.example.yml | 8 ++- host/Host.cpp | 20 +++--- host/calibrate/HostCal.cpp | 121 +++++++++++++++++++++++++++++++------ host/calibrate/HostCal.h | 5 ++ modem/Modem.cpp | 27 +++++++-- modem/Modem.h | 7 ++- 6 files changed, 154 insertions(+), 34 deletions(-) diff --git a/config.example.yml b/config.example.yml index 590a6f68..e81b2a9a 100644 --- a/config.example.yml +++ b/config.example.yml @@ -154,6 +154,12 @@ system: nxdnDiscBWAdj: 0 # Valid values between -128 and 128 nxdnPostBWAdj: 0 # Valid values between -128 and 128 adfGainMode: 0 # 0 - Auto, 1 - Auto High Lin, 2 - Low, 3 - High + afcEnable: false + afcKI: 11 + afcKP: 4 + afcRange: 1 + txTuning: 0 # Freq offset for the hotspot, in hz + rxTuning: 0 repeater: dmrSymLvl3Adj: 0 # Valid values between -128 and 128 dmrSymLvl1Adj: 0 # Valid values between -128 and 128 @@ -170,8 +176,6 @@ system: rssiFine: 127 rxDCOffset: 0 # Valid values between -128 and 128 txDCOffset: 0 # Valid values between -128 and 128 - txTuning: 0 # Freq offset for the hotspot, in hz - rxTuning: 0 rxLevel: 50 txLevel: 50 # cwIdTxLevel: 50 diff --git a/host/Host.cpp b/host/Host.cpp index 83e3bf36..1b87a6c7 100644 --- a/host/Host.cpp +++ b/host/Host.cpp @@ -1793,11 +1793,11 @@ bool Host::readParams() removeLockFile(); LogInfo("General Parameters"); - LogInfo(" DMR: %s", m_dmrEnabled ? "enabled" : "disabled"); - LogInfo(" P25: %s", m_p25Enabled ? "enabled" : "disabled"); - LogInfo(" NXDN: %s", m_nxdnEnabled ? "enabled" : "disabled"); - LogInfo(" Duplex: %s", m_duplex ? "yes" : "no"); if (!udpMasterMode) { + LogInfo(" DMR: %s", m_dmrEnabled ? "enabled" : "disabled"); + LogInfo(" P25: %s", m_p25Enabled ? "enabled" : "disabled"); + LogInfo(" NXDN: %s", m_nxdnEnabled ? "enabled" : "disabled"); + LogInfo(" Duplex: %s", m_duplex ? "yes" : "no"); if (!m_duplex) { LogInfo(" Simplex Same Frequency: %s", simplexSameFreq ? "yes" : "no"); } @@ -2000,9 +2000,6 @@ bool Host::createModem() uint8_t p25CorrCount = (uint8_t)modemConf["p25CorrCount"].as(4U); int rxDCOffset = modemConf["rxDCOffset"].as(0); int txDCOffset = modemConf["txDCOffset"].as(0); - int rxTuning = modemConf["rxTuning"].as(0); - int txTuning = modemConf["txTuning"].as(0); - uint8_t rfPower = (uint8_t)modemConf["rfPower"].as(100U); yaml::Node hotspotParams = modemConf["hotspot"]; @@ -2013,6 +2010,13 @@ bool Host::createModem() int p25PostBWAdj = hotspotParams["p25PostBWAdj"].as(0); int nxdnPostBWAdj = hotspotParams["nxdnPostBWAdj"].as(0); ADF_GAIN_MODE adfGainMode = (ADF_GAIN_MODE)hotspotParams["adfGainMode"].as(0U); + bool afcEnable = hotspotParams["afcEnable"].as(false); + uint8_t afcKI = (uint8_t)hotspotParams["afcKI"].as(11U); + uint8_t afcKP = (uint8_t)hotspotParams["afcKP"].as(4U); + uint8_t afcRange = (uint8_t)hotspotParams["afcRange"].as(1U); + int rxTuning = hotspotParams["rxTuning"].as(0); + int txTuning = hotspotParams["txTuning"].as(0); + uint8_t rfPower = (uint8_t)hotspotParams["rfPower"].as(100U); yaml::Node repeaterParams = modemConf["repeater"]; @@ -2194,7 +2198,7 @@ bool Host::createModem() m_modem->setSymbolAdjust(dmrSymLevel3Adj, dmrSymLevel1Adj, p25SymLevel3Adj, p25SymLevel1Adj, nxdnSymLevel3Adj, nxdnSymLevel1Adj); m_modem->setDCOffsetParams(txDCOffset, rxDCOffset); m_modem->setRFParams(m_rxFrequency, m_txFrequency, rxTuning, txTuning, rfPower, dmrDiscBWAdj, p25DiscBWAdj, nxdnDiscBWAdj, dmrPostBWAdj, - p25PostBWAdj, nxdnPostBWAdj, adfGainMode); + p25PostBWAdj, nxdnPostBWAdj, adfGainMode, afcEnable, afcKI, afcKP, afcRange); m_modem->setSoftPot(rxCoarse, rxFine, txCoarse, txFine, rssiCoarse, rssiFine); m_modem->setDMRColorCode(m_dmrColorCode); m_modem->setP25NAC(m_p25NAC); diff --git a/host/calibrate/HostCal.cpp b/host/calibrate/HostCal.cpp index b19acecc..55ca87ee 100644 --- a/host/calibrate/HostCal.cpp +++ b/host/calibrate/HostCal.cpp @@ -160,6 +160,10 @@ HostCal::HostCal(const std::string& confFile) : m_dmrPostBWAdj(0), m_p25PostBWAdj(0), m_adfGainMode(ADF_GAIN_AUTO), + m_afcEnable(false), + m_afcKI(11U), + m_afcKP(4U), + m_afcRange(1U), m_dmrSymLevel3Adj(0), m_dmrSymLevel1Adj(0), m_p25SymLevel3Adj(0), @@ -173,7 +177,7 @@ HostCal::HostCal(const std::string& confFile) : m_fdmaPreamble(80U), m_dmrRxDelay(7U), m_p25CorrCount(5U), - m_debug(false), + m_debug(true), m_mode(STATE_DMR_CAL), m_modeStr(DMR_CAL_STR), m_rxTuning(0), @@ -218,7 +222,7 @@ int HostCal::run() } // initialize system logging - ret = ::LogInitialise("", "", 0U, 1U); + ret = ::LogInitialise("", "", 0U, 1U, true); if (!ret) { ::fprintf(stderr, "unable to open the log file\n"); return 1; @@ -299,15 +303,6 @@ int HostCal::run() yaml::Node modemConf = systemConf["modem"]; - m_debug = modemConf["debug"].as(false); - - m_rxTuning = modemConf["rxTuning"].as(0); - m_txTuning = modemConf["txTuning"].as(0); - - // apply the frequency tuning offsets - m_rxAdjustedFreq = m_rxFrequency + m_rxTuning; - m_txAdjustedFreq = m_txFrequency + m_txTuning; - m_rxInvert = modemConf["rxInvert"].as(false); m_txInvert = modemConf["txInvert"].as(false); m_pttInvert = modemConf["pttInvert"].as(false); @@ -329,6 +324,18 @@ int HostCal::run() m_adfGainMode = (ADF_GAIN_MODE)hotspotParams["adfGainMode"].as(0U); + m_afcEnable = hotspotParams["afcEnable"].as(false); + m_afcKI = (uint8_t)hotspotParams["afcKI"].as(11U); + m_afcKP = (uint8_t)hotspotParams["afcKP"].as(4U); + m_afcRange = (uint8_t)hotspotParams["afcRange"].as(1U); + + m_rxTuning = hotspotParams["rxTuning"].as(0); + m_txTuning = hotspotParams["txTuning"].as(0); + + // apply the frequency tuning offsets + m_rxAdjustedFreq = m_rxFrequency + m_rxTuning; + m_txAdjustedFreq = m_txFrequency + m_txTuning; + yaml::Node repeaterParams = modemConf["repeater"]; m_dmrSymLevel3Adj = repeaterParams["dmrSymLvl3Adj"].as(0); @@ -444,7 +451,8 @@ int HostCal::run() m_modem->setLevels(m_rxLevel, m_txLevel, m_txLevel, m_txLevel, m_txLevel); m_modem->setSymbolAdjust(m_dmrSymLevel3Adj, m_dmrSymLevel1Adj, m_p25SymLevel3Adj, m_p25SymLevel1Adj, m_nxdnSymLevel3Adj, m_nxdnSymLevel1Adj); m_modem->setDCOffsetParams(m_txDCOffset, m_rxDCOffset); - m_modem->setRFParams(m_rxFrequency, m_txFrequency, m_rxTuning, m_txTuning, 100U, m_dmrDiscBWAdj, m_p25DiscBWAdj, m_nxdnDiscBWAdj, m_dmrPostBWAdj, m_p25PostBWAdj, m_nxdnPostBWAdj, m_adfGainMode); + m_modem->setRFParams(m_rxFrequency, m_txFrequency, m_rxTuning, m_txTuning, 100U, m_dmrDiscBWAdj, m_p25DiscBWAdj, m_nxdnDiscBWAdj, m_dmrPostBWAdj, m_p25PostBWAdj, m_nxdnPostBWAdj, m_adfGainMode, + m_afcEnable, m_afcKI, m_afcKP, m_afcRange); m_modem->setSoftPot(m_rxCoarsePot, m_rxFinePot, m_txCoarsePot, m_txFinePot, m_rssiCoarsePot, m_rssiFinePot); m_modem->setOpenHandler(MODEM_OC_PORT_HANDLER_BIND(HostCal::portModemOpen, this)); @@ -637,7 +645,7 @@ int HostCal::run() sscanf(value, "%d", &rxTuning); m_rxTuning = rxTuning; - m_conf["system"]["modem"]["rxTuning"] = __INT_STR(m_rxTuning); + m_conf["system"]["modem"]["hotspot"]["rxTuning"] = __INT_STR(m_rxTuning); m_rxAdjustedFreq = m_rxFrequency + m_rxTuning; writeRFParams(); @@ -657,7 +665,7 @@ int HostCal::run() sscanf(value, "%d", &txTuning); m_txTuning = txTuning; - m_conf["system"]["modem"]["txTuning"] = __INT_STR(m_txTuning); + m_conf["system"]["modem"]["hotspot"]["txTuning"] = __INT_STR(m_txTuning); m_txAdjustedFreq = m_txFrequency + m_txTuning; writeRFParams(); @@ -888,6 +896,68 @@ int HostCal::run() } break; + case '8': + { + if (m_isHotspot && m_modem->getVersion() >= 3U) { + char value[5] = { '\0' }; + ::fprintf(stdout, "> ADF7021 AFC Enabled [%u] (Y/N) ? ", m_afcEnable); + ::fflush(stdout); + + m_console.getLine(value, 2, 0); + if (toupper(value[0]) == 'Y' || toupper(value[0]) == 'N') { + m_afcEnable = value[0] == 'Y' ? true : false; + } + + ::fprintf(stdout, "> AFC Range [%u] ? ", m_afcRange); + ::fflush(stdout); + + m_console.getLine(value, 4, 0); + if (value[0] != '\0') { + uint32_t afcRange = m_afcRange; + sscanf(value, "%u", &afcRange); + + if (afcRange >= 0U && afcRange < 256U) + m_afcRange = (uint8_t)afcRange; + else + m_afcRange = 4U; + } + + ::fprintf(stdout, "> AFC KI Parameter [%u] ? ", m_afcKI); + ::fflush(stdout); + + m_console.getLine(value, 3, 0); + if (value[0] != '\0') { + uint32_t afcKI = m_afcKI; + sscanf(value, "%u", &afcKI); + + if (afcKI >= 0U && afcKI < 16U) + m_afcKI = (uint8_t)afcKI; + else + m_afcKI = 11U; + } + + ::fprintf(stdout, "> AFC KP Parameter [%u] ? ", m_afcKP); + ::fflush(stdout); + + m_console.getLine(value, 2, 0); + if (value[0] != '\0') { + uint32_t afcKP = m_afcKP; + sscanf(value, "%u", &afcKP); + + if (afcKP >= 0U && afcKP < 8U) + m_afcKP = (uint8_t)afcKP; + else + m_afcKP = 1U; + } + + writeRFParams(); + } + else { + LogWarning(LOG_CAL, "ADF7021 AFC alignment is not supported on your firmware!"); + } + } + break; + /** Mode Commands */ case 'Z': { @@ -1463,6 +1533,7 @@ void HostCal::displayHelp() LogMessage(LOG_CAL, " 5 Set P25 Post Demod Bandwidth Offset"); LogMessage(LOG_CAL, " 6 Set NXDN Post Demod Bandwidth Offset"); LogMessage(LOG_CAL, " 7 Set ADF7021 Rx Auto. Gain Mode"); + LogMessage(LOG_CAL, " 8 Set ADF7021 AFC Settings"); } if (!m_modem->m_flashDisabled) { LogMessage(LOG_CAL, " E Erase modem configuration area"); @@ -2366,8 +2437,8 @@ bool HostCal::writeConfig(uint8_t modeOverride) /// bool HostCal::writeRFParams() { - uint8_t buffer[20U]; - ::memset(buffer, 0x00U, 20U); + uint8_t buffer[22U]; + ::memset(buffer, 0x00U, 22U); uint8_t lengthToWrite = 18U; buffer[0U] = DVM_FRAME_START; @@ -2401,12 +2472,21 @@ bool HostCal::writeRFParams() // are we on a protocol version 3 firmware? if (m_modem->getVersion() >= 3U) { - lengthToWrite = 20U; + lengthToWrite = 22U; m_conf["system"]["modem"]["hotspot"]["nxdnDiscBWAdj"] = __INT_STR(m_nxdnDiscBWAdj); buffer[18U] = (uint8_t)(m_nxdnDiscBWAdj + 128); m_conf["system"]["modem"]["hotspot"]["nxdnPostBWAdj"] = __INT_STR(m_nxdnPostBWAdj); buffer[19U] = (uint8_t)(m_nxdnPostBWAdj + 128); + + // support optional AFC parameters + m_conf["system"]["modem"]["hotspot"]["afcEnable"] = __BOOL_STR(m_afcEnable); + m_conf["system"]["modem"]["hotspot"]["afcKI"] = __INT_STR(m_afcKI); + m_conf["system"]["modem"]["hotspot"]["afcKP"] = __INT_STR(m_afcKP); + buffer[20U] = (m_afcEnable ? 0x80 : 0x00) + + (m_afcKP << 4) + (m_afcKI); + m_conf["system"]["modem"]["hotspot"]["afcRange"] = __INT_STR(m_afcRange); + buffer[21U] = m_afcRange; } buffer[1U] = lengthToWrite; @@ -2592,10 +2672,10 @@ void HostCal::processFlashConfig(const uint8_t *buffer) } m_txTuning = int(buffer[25U]) - 128; - m_conf["system"]["modem"]["txTuning"] = __INT_STR(m_txTuning); + m_conf["system"]["modem"]["hotspot"]["txTuning"] = __INT_STR(m_txTuning); m_txAdjustedFreq = m_txFrequency + m_txTuning; m_rxTuning = int(buffer[26U]) - 128; - m_conf["system"]["modem"]["rxTuning"] = __INT_STR(m_rxTuning); + m_conf["system"]["modem"]["hotspot"]["rxTuning"] = __INT_STR(m_rxTuning); m_rxAdjustedFreq = m_rxFrequency + m_rxTuning; // are we on a protocol version 3 firmware? @@ -2868,6 +2948,9 @@ void HostCal::printStatus() if (m_modem->getVersion() >= 3U) { LogMessage(LOG_CAL, " - NXDN Disc. BW: %d, NXDN Post Demod BW: %d", m_nxdnDiscBWAdj, m_nxdnPostBWAdj); + + LogMessage(LOG_CAL, " - AFC Enabled: %u, AFC KI: %u, AFC KP: %u, AFC Range: %u", + m_afcEnable, m_afcKI, m_afcKP, m_afcRange); } switch (m_adfGainMode) { diff --git a/host/calibrate/HostCal.h b/host/calibrate/HostCal.h index 82bc6d84..c85f7082 100644 --- a/host/calibrate/HostCal.h +++ b/host/calibrate/HostCal.h @@ -97,6 +97,11 @@ private: modem::ADF_GAIN_MODE m_adfGainMode; // hotspot modem - ADF7021 Rx gain + bool m_afcEnable; // hotspot modem - ADF7021 AFC enable + uint8_t m_afcKI; // hotspot modem - AFC KI (affects AFC settling time) + uint8_t m_afcKP; // hotspot modem - AFC KP (affects AFC settling time) + uint8_t m_afcRange; // hotspot modem - AFC Maximum Range (m_afcRange * 500hz) + int m_dmrSymLevel3Adj; // dedicated modem - +3/-3 DMR symbol adjustment int m_dmrSymLevel1Adj; // dedicated modem - +1/-1 DMR symbol adjustment int m_p25SymLevel3Adj; // dedicated modem - +3/-3 P25 symbol adjustment diff --git a/modem/Modem.cpp b/modem/Modem.cpp index 6a56a102..557937c8 100644 --- a/modem/Modem.cpp +++ b/modem/Modem.cpp @@ -151,6 +151,10 @@ Modem::Modem(port::IModemPort* port, bool duplex, bool rxInvert, bool txInvert, m_p25PostBWAdj(0), m_nxdnPostBWAdj(0), m_adfGainMode(ADF_GAIN_AUTO), + m_afcEnable(false), + m_afcKI(11U), + m_afcKP(4U), + m_afcRange(1U), m_dmrSymLevel3Adj(0), m_dmrSymLevel1Adj(0), m_p25SymLevel3Adj(0), @@ -317,10 +321,15 @@ void Modem::setSymbolAdjust(int dmrSymLevel3Adj, int dmrSymLevel1Adj, int p25Sym /// /// /// +/// +/// +/// +/// void Modem::setRFParams(uint32_t rxFreq, uint32_t txFreq, int rxTuning, int txTuning, uint8_t rfPower, int8_t dmrDiscBWAdj, int8_t p25DiscBWAdj, int8_t nxdnDiscBWAdj, int8_t dmrPostBWAdj, int8_t p25PostBWAdj, int8_t nxdnPostBWAdj, - ADF_GAIN_MODE gainMode) + ADF_GAIN_MODE gainMode, + bool afcEnable, uint8_t afcKI, uint8_t afcKP, uint8_t afcRange) { m_adfGainMode = gainMode; m_rfPower = rfPower; @@ -335,6 +344,11 @@ void Modem::setRFParams(uint32_t rxFreq, uint32_t txFreq, int rxTuning, int txTu m_dmrPostBWAdj = dmrPostBWAdj; m_p25PostBWAdj = p25PostBWAdj; m_nxdnPostBWAdj = nxdnPostBWAdj; + + m_afcEnable = afcEnable; + m_afcKI = afcKI; + m_afcKP = afcKP; + m_afcRange = afcRange; } /// @@ -2058,8 +2072,8 @@ bool Modem::writeSymbolAdjust() /// bool Modem::writeRFParams() { - uint8_t buffer[20U]; - ::memset(buffer, 0x00U, 20U); + uint8_t buffer[22U]; + ::memset(buffer, 0x00U, 22U); uint8_t lengthToWrite = 18U; buffer[0U] = DVM_FRAME_START; @@ -2090,10 +2104,15 @@ bool Modem::writeRFParams() // are we on a protocol version 3 firmware? if (m_protoVer >= 3U) { - lengthToWrite = 20U; + lengthToWrite = 22U; buffer[18U] = (uint8_t)(m_nxdnDiscBWAdj + 128); buffer[19U] = (uint8_t)(m_nxdnPostBWAdj + 128); + + // support optional AFC parameters + buffer[20U] = (m_afcEnable ? 0x80 : 0x00) + + (m_afcKP << 4) + (m_afcKI); + buffer[21U] = m_afcRange; } buffer[1U] = lengthToWrite; diff --git a/modem/Modem.h b/modem/Modem.h index 8246af19..f4881eda 100644 --- a/modem/Modem.h +++ b/modem/Modem.h @@ -231,7 +231,7 @@ namespace modem void setSymbolAdjust(int dmrSymLevel3Adj, int dmrSymLevel1Adj, int p25SymLevel3Adj, int p25SymLevel1Adj, int nxdnSymLevel3Adj, int ndxnSymLevel1Adj); /// Sets the RF parameters. void setRFParams(uint32_t rxFreq, uint32_t txFreq, int rxTuning, int txTuning, uint8_t rfPower, int8_t dmrDiscBWAdj, int8_t p25DiscBWAdj, int8_t nxdnDiscBWAdj, - int8_t dmrPostBWAdj, int8_t p25PostBWAdj, int8_t nxdnPostBWAdj, ADF_GAIN_MODE gainMode); + int8_t dmrPostBWAdj, int8_t p25PostBWAdj, int8_t nxdnPostBWAdj, ADF_GAIN_MODE gainMode, bool afcEnable, uint8_t afcKI, uint8_t afcKP, uint8_t afcRange); /// Sets the softpot parameters. void setSoftPot(uint8_t rxCoarse, uint8_t rxFine, uint8_t txCoarse, uint8_t txFine, uint8_t rssiCoarse, uint8_t rssiFine); /// Sets the DMR color code. @@ -400,6 +400,11 @@ namespace modem ADF_GAIN_MODE m_adfGainMode; // hotspot modem - ADF7021 Rx gain + bool m_afcEnable; // hotspot modem - ADF7021 AFC enable + uint8_t m_afcKI; // hotspot modem - AFC KI (affects AFC settling time) + uint8_t m_afcKP; // hotspot modem - AFC KP (affects AFC settling time) + uint8_t m_afcRange; // hotspot modem - AFC Maximum Range (m_afcRange * 500hz) + int m_dmrSymLevel3Adj; // dedicated modem - +3/-3 DMR symbol adjustment int m_dmrSymLevel1Adj; // dedicated modem - +1/-1 DMR symbol adjustment int m_p25SymLevel3Adj; // dedicated modem - +3/-3 P25 symbol adjustment