diff --git a/config.yml b/config.yml index aade37a1..3ba20f8c 100644 --- a/config.yml +++ b/config.yml @@ -118,9 +118,18 @@ system: fdmaPreamble: 80 dmrRxDelay: 7 p25CorrCount: 8 - rxDCOffset: 0 - txDCOffset: 0 - txTuning: 0 # freq offset for the hotspot, in hz + dmrDiscBWAdj: 0 # Valid values between -128 and 128 + dmrPostBWAdj: 0 # Valid values between -128 and 128 + p25DiscBWAdj: 0 # Valid values between -128 and 128 + p25PostBWAdj: 0 # Valid values between -128 and 128 + adfGainMode: 0 # 0 - Auto, 1 - Auto High Lin, 2 - Low, 3 - High + dmrSymLvl3Adj: 0 # Valid values between -128 and 128 + dmrSymLvl1Adj: 0 # Valid values between -128 and 128 + p25SymLvl3Adj: 0 # Valid values between -128 and 128 + p25SymLvl1Adj: 0 # Valid values between -128 and 128 + 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 diff --git a/host/Host.cpp b/host/Host.cpp index db40181b..fe2d3222 100644 --- a/host/Host.cpp +++ b/host/Host.cpp @@ -1512,6 +1512,7 @@ bool Host::createModem() int p25DiscBWAdj = modemConf["p25DiscBWAdj"].as(0); int dmrPostBWAdj = modemConf["dmrPostBWAdj"].as(0); int p25PostBWAdj = modemConf["p25PostBWAdj"].as(0); + ADF_GAIN_MODE adfGainMode = (ADF_GAIN_MODE)modemConf["adfGainMode"].as(0U); int dmrSymLevel3Adj = modemConf["dmrSymLvl3Adj"].as(0); int dmrSymLevel1Adj = modemConf["dmrSymLvl1Adj"].as(0); int p25SymLevel3Adj = modemConf["p25SymLvl3Adj"].as(0); @@ -1649,7 +1650,7 @@ bool Host::createModem() m_modem->setLevels(rxLevel, cwIdTXLevel, dmrTXLevel, p25TXLevel); m_modem->setSymbolAdjust(dmrSymLevel3Adj, dmrSymLevel1Adj, p25SymLevel3Adj, p25SymLevel1Adj); m_modem->setDCOffsetParams(txDCOffset, rxDCOffset); - m_modem->setRFParams(rxActualFreq, txActualFreq, rfPower, dmrDiscBWAdj, p25DiscBWAdj, dmrPostBWAdj, p25PostBWAdj); + m_modem->setRFParams(rxActualFreq, txActualFreq, rfPower, dmrDiscBWAdj, p25DiscBWAdj, dmrPostBWAdj, p25PostBWAdj, adfGainMode); m_modem->setDMRColorCode(m_dmrColorCode); m_modem->setP25NAC(m_p25NAC); diff --git a/host/calibrate/HostCal.cpp b/host/calibrate/HostCal.cpp index 4f2df984..1266dfac 100644 --- a/host/calibrate/HostCal.cpp +++ b/host/calibrate/HostCal.cpp @@ -130,23 +130,24 @@ HostCal::HostCal(const std::string& confFile) : m_fec(), m_transmit(false), m_duplex(true), - m_txInvert(false), m_rxInvert(false), + m_txInvert(false), m_pttInvert(false), m_dcBlocker(true), - m_txLevel(50.0F), m_rxLevel(50.0F), + m_txLevel(50.0F), m_dmrEnabled(false), m_dmrRx1K(false), m_p25Enabled(false), m_p25Rx1K(false), - m_txDCOffset(0), m_rxDCOffset(0), + m_txDCOffset(0), m_isHotspot(false), m_dmrDiscBWAdj(0), m_p25DiscBWAdj(0), m_dmrPostBWAdj(0), m_p25PostBWAdj(0), + m_adfGainMode(ADF_GAIN_AUTO), m_dmrSymLevel3Adj(0), m_dmrSymLevel1Adj(0), m_p25SymLevel3Adj(0), @@ -391,6 +392,8 @@ int HostCal::run() m_dmrPostBWAdj = modemConf["dmrPostBWAdj"].as(0); m_p25PostBWAdj = modemConf["p25PostBWAdj"].as(0); + m_adfGainMode = (ADF_GAIN_MODE)modemConf["adfGainMode"].as(0U); + m_dmrSymLevel3Adj = modemConf["dmrSymLvl3Adj"].as(0); m_dmrSymLevel1Adj = modemConf["dmrSymLvl1Adj"].as(0); m_p25SymLevel3Adj = modemConf["p25SymLvl3Adj"].as(0); @@ -704,6 +707,32 @@ int HostCal::run() printStatus(); } } + break; + + case '5': + { + if (m_isHotspot) { + char value[2] = { '\0' }; + ::fprintf(stdout, "> ADF7021 Gain Mode (0 - Auto, 1 - Auto High Lin., 2 - Low, 3 - High) [%u] ? ", m_adfGainMode); + ::fflush(stdout); + + m_console.getLine(value, 2, 0); + if (value[0] != '\0') { + uint8_t gainMode = (uint8_t)m_adfGainMode; + sscanf(value, "%c", &gainMode); + + if (gainMode > 0U && gainMode < 4U) { + m_adfGainMode = (ADF_GAIN_MODE)gainMode; + writeRFParams(); + } else { + m_adfGainMode = ADF_GAIN_AUTO; + writeRFParams(); + } + } + + printStatus(); + } + } break; /** Mode Commands */ @@ -1137,6 +1166,7 @@ void HostCal::displayHelp() LogMessage(LOG_CAL, " 2 Set P25 Disc. Bandwidth Offset"); LogMessage(LOG_CAL, " 3 Set DMR Post Demod Bandwidth Offset"); LogMessage(LOG_CAL, " 4 Set P25 Post Demod Bandwidth Offset"); + LogMessage(LOG_CAL, " 5 Set ADF7021 Rx Auto. Gain Mode"); } } @@ -1912,10 +1942,10 @@ bool HostCal::writeConfig(uint8_t modeOverride) /// bool HostCal::writeRFParams() { - unsigned char buffer[17U]; + unsigned char buffer[18U]; buffer[0U] = DVM_FRAME_START; - buffer[1U] = 17U; + buffer[1U] = 18U; buffer[2U] = CMD_SET_RFPARAMS; buffer[3U] = 0x00U; @@ -1941,9 +1971,11 @@ bool HostCal::writeRFParams() m_conf["system"]["modem"]["p25PostBWAdj"] = __INT_STR(m_p25PostBWAdj); buffer[16U] = (uint8_t)(m_p25PostBWAdj + 128); + buffer[17U] = (uint8_t)m_adfGainMode; + // CUtils::dump(1U, "Written", buffer, len); - int ret = m_modem->write(buffer, 17U); + int ret = m_modem->write(buffer, 18U); if (ret <= 0) return false; @@ -2086,6 +2118,21 @@ void HostCal::printStatus() if (m_isHotspot) { LogMessage(LOG_CAL, " - DMR Disc. BW: %d, P25 Disc. BW: %d, DMR Post Demod BW: %d, P25 Post Demod BW: %d", m_dmrDiscBWAdj, m_p25DiscBWAdj, m_dmrPostBWAdj, m_p25PostBWAdj); + switch (m_adfGainMode) { + case ADF_GAIN_AUTO_LIN: + LogMessage(LOG_CAL, " - ADF7021 Gain Mode: Auto High Linearity"); + break; + case ADF_GAIN_LOW: + LogMessage(LOG_CAL, " - ADF7021 Gain Mode: Low"); + break; + case ADF_GAIN_HIGH: + LogMessage(LOG_CAL, " - ADF7021 Gain Mode: High"); + break; + case ADF_GAIN_AUTO: + default: + LogMessage(LOG_CAL, " - ADF7021 Gain Mode: Auto"); + break; + } } LogMessage(LOG_CAL, " - FDMA Preambles: %u (%.1fms), DMR Rx Delay: %u (%.1fms), P25 Corr. Count: %u (%.1fms)", m_fdmaPreamble, float(m_fdmaPreamble) * 0.2083F, m_dmrRxDelay, float(m_dmrRxDelay) * 0.0416666F, m_p25CorrCount, float(m_p25CorrCount) * 0.667F); diff --git a/host/calibrate/HostCal.h b/host/calibrate/HostCal.h index 313afaf6..faa822e4 100644 --- a/host/calibrate/HostCal.h +++ b/host/calibrate/HostCal.h @@ -69,33 +69,35 @@ private: bool m_duplex; - bool m_txInvert; - bool m_rxInvert; - bool m_pttInvert; + bool m_rxInvert; // dedicated modem - Rx signal inversion + bool m_txInvert; // dedicated modem - Tx signal inversion + bool m_pttInvert; // dedicated modem - PTT signal inversion - bool m_dcBlocker; + bool m_dcBlocker; // dedicated modem - DC blocker - float m_txLevel; - float m_rxLevel; + float m_rxLevel; // dedicated/hotspot modem - Rx modulation level + float m_txLevel; // dedicated/hotspot modem - Tx modulation level bool m_dmrEnabled; bool m_dmrRx1K; bool m_p25Enabled; bool m_p25Rx1K; - int m_txDCOffset; - int m_rxDCOffset; + int m_rxDCOffset; // dedicated modem - Rx signal DC offset + int m_txDCOffset; // dedicated modem - Tx signal DC offset bool m_isHotspot; - int8_t m_dmrDiscBWAdj; - int8_t m_p25DiscBWAdj; - int8_t m_dmrPostBWAdj; - int8_t m_p25PostBWAdj; + int8_t m_dmrDiscBWAdj; // hotspot modem - DMR discriminator BW adjustment + int8_t m_p25DiscBWAdj; // hotspot modem - P25 discriminator BW adjustment + int8_t m_dmrPostBWAdj; // hotspot modem - DMR post demod BW adjustment + int8_t m_p25PostBWAdj; // hotspot modem - P25 post demod BW adjustment - int m_dmrSymLevel3Adj; - int m_dmrSymLevel1Adj; - int m_p25SymLevel3Adj; - int m_p25SymLevel1Adj; + modem::ADF_GAIN_MODE m_adfGainMode; // hotspot modem - ADF7021 Rx gain + + 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 + int m_p25SymLevel1Adj; // dedicated modem - +1/-1 P25 symbol adjustment uint8_t m_fdmaPreamble; uint8_t m_dmrRxDelay; @@ -109,9 +111,9 @@ private: int m_rxTuning; int m_txTuning; - uint32_t m_rxFrequency; + uint32_t m_rxFrequency; // hotspot modem - Rx Frequency uint32_t m_rxAdjustedFreq; - uint32_t m_txFrequency; + uint32_t m_txFrequency; // hotspot modem - Tx Frequency uint32_t m_txAdjustedFreq; uint8_t m_channelId; uint32_t m_channelNo; diff --git a/modem/Modem.cpp b/modem/Modem.cpp index 381810b8..d710136a 100644 --- a/modem/Modem.cpp +++ b/modem/Modem.cpp @@ -103,6 +103,7 @@ Modem::Modem(port::IModemPort* port, bool duplex, bool rxInvert, bool txInvert, m_p25DiscBWAdj(0), m_dmrPostBWAdj(0), m_p25PostBWAdj(0), + m_adfGainMode(ADF_GAIN_AUTO), m_dmrSymLevel3Adj(0), m_dmrSymLevel1Adj(0), m_p25SymLevel3Adj(0), @@ -233,8 +234,11 @@ void Modem::setSymbolAdjust(int dmrSymLevel3Adj, int dmrSymLevel1Adj, int p25Sym /// /// /// -void Modem::setRFParams(uint32_t rxFreq, uint32_t txFreq, uint8_t rfPower, int8_t dmrDiscBWAdj, int8_t p25DiscBWAdj, int8_t dmrPostBWAdj, int8_t p25PostBWAdj) +/// +void Modem::setRFParams(uint32_t rxFreq, uint32_t txFreq, uint8_t rfPower, int8_t dmrDiscBWAdj, int8_t p25DiscBWAdj, + int8_t dmrPostBWAdj, int8_t p25PostBWAdj, ADF_GAIN_MODE gainMode) { + m_adfGainMode = gainMode; m_rfPower = rfPower; m_rxFrequency = rxFreq; m_txFrequency = txFreq; @@ -1498,10 +1502,10 @@ bool Modem::writeSymbolAdjust() /// bool Modem::writeRFParams() { - unsigned char buffer[17U]; + unsigned char buffer[18U]; buffer[0U] = DVM_FRAME_START; - buffer[1U] = 17U; + buffer[1U] = 18U; buffer[2U] = CMD_SET_RFPARAMS; buffer[3U] = 0x00U; @@ -1523,9 +1527,11 @@ bool Modem::writeRFParams() buffer[15U] = (uint8_t)(m_dmrPostBWAdj + 128); buffer[16U] = (uint8_t)(m_p25PostBWAdj + 128); + buffer[17U] = (uint8_t)m_adfGainMode; + // CUtils::dump(1U, "Written", buffer, len); - int ret = m_port->write(buffer, 17U); + int ret = m_port->write(buffer, 18U); if (ret <= 0) return false; diff --git a/modem/Modem.h b/modem/Modem.h index 85b0a783..f6a46434 100644 --- a/modem/Modem.h +++ b/modem/Modem.h @@ -163,6 +163,13 @@ namespace modem RESP_DATA }; + enum ADF_GAIN_MODE { + ADF_GAIN_AUTO = 0U, + ADF_GAIN_AUTO_LIN = 1U, + ADF_GAIN_LOW = 2U, + ADF_GAIN_HIGH = 3U + }; + const uint8_t DVM_FRAME_START = 0xFEU; const uint8_t MAX_FDMA_PREAMBLE = 255U; @@ -195,7 +202,8 @@ namespace modem /// Sets the symbol adjustment levels. void setSymbolAdjust(int dmrSymLevel3Adj, int dmrSymLevel1Adj, int p25SymLevel3Adj, int p25SymLevel1Adj); /// Sets the RF parameters. - void setRFParams(uint32_t rxFreq, uint32_t txFreq, uint8_t rfPower, int8_t dmrDiscBWAdj, int8_t p25DiscBWAdj, int8_t dmrPostBWAdj, int8_t p25PostBWAdj); + void setRFParams(uint32_t rxFreq, uint32_t txFreq, uint8_t rfPower, int8_t dmrDiscBWAdj, int8_t p25DiscBWAdj, + int8_t dmrPostBWAdj, int8_t p25PostBWAdj, ADF_GAIN_MODE gainMode); /// Sets the DMR color code. void setDMRColorCode(uint32_t colorCode); /// Sets the P25 NAC. @@ -298,47 +306,49 @@ namespace modem bool m_duplex; - bool m_rxInvert; - bool m_txInvert; - bool m_pttInvert; + bool m_rxInvert; // dedicated modem - Rx signal inversion + bool m_txInvert; // dedicated modem - Tx signal inversion + bool m_pttInvert; // dedicated modem - PTT signal inversion - bool m_dcBlocker; - bool m_cosLockout; + bool m_dcBlocker; // dedicated modem - DC blocker + bool m_cosLockout; // dedicated modem - COS lockout uint8_t m_fdmaPreamble; uint8_t m_dmrRxDelay; uint8_t m_p25CorrCount; - float m_rxLevel; - float m_cwIdTXLevel; - float m_dmrTXLevel; - float m_p25TXLevel; + float m_rxLevel; // dedicated/hotspot modem - Rx modulation level + float m_cwIdTXLevel; // dedicated/hotspot modem - CW ID Tx modulation level + float m_dmrTXLevel; // dedicated/hotspot modem - DMR Tx modulation level + float m_p25TXLevel; // dedicated/hotspot modem - P25 Tx modulation level bool m_disableOFlowReset; bool m_dmrEnabled; bool m_p25Enabled; - int m_rxDCOffset; - int m_txDCOffset; + int m_rxDCOffset; // dedicated modem - Rx signal DC offset + int m_txDCOffset; // dedicated modem - Tx signal DC offset bool m_isHotspot; - uint32_t m_rxFrequency; - uint32_t m_txFrequency; - uint8_t m_rfPower; + uint32_t m_rxFrequency; // hotspot modem - Rx Frequency + uint32_t m_txFrequency; // hotspot modem - Tx Frequency + uint8_t m_rfPower; // hotspot modem - RF power + + int8_t m_dmrDiscBWAdj; // hotspot modem - DMR discriminator BW adjustment + int8_t m_p25DiscBWAdj; // hotspot modem - P25 discriminator BW adjustment + int8_t m_dmrPostBWAdj; // hotspot modem - DMR post demod BW adjustment + int8_t m_p25PostBWAdj; // hotspot modem - P25 post demod BW adjustment - int8_t m_dmrDiscBWAdj; - int8_t m_p25DiscBWAdj; - int8_t m_dmrPostBWAdj; - int8_t m_p25PostBWAdj; + ADF_GAIN_MODE m_adfGainMode; // hotspot modem - ADF7021 Rx gain - int m_dmrSymLevel3Adj; - int m_dmrSymLevel1Adj; - int m_p25SymLevel3Adj; - int m_p25SymLevel1Adj; + 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 + int m_p25SymLevel1Adj; // dedicated modem - +1/-1 P25 symbol adjustment - uint32_t m_adcOverFlowCount; - uint32_t m_dacOverFlowCount; + uint32_t m_adcOverFlowCount; // dedicated modem - ADC overflow count + uint32_t m_dacOverFlowCount; // dedicated modem - DAC overflow count DVM_STATE m_modemState;