diff --git a/host/Host.cpp b/host/Host.cpp index 67f0831c..e4b53a23 100644 --- a/host/Host.cpp +++ b/host/Host.cpp @@ -1491,6 +1491,10 @@ bool Host::createModem() int rxTuning = modemConf["rxTuning"].as(0); int txTuning = modemConf["txTuning"].as(0); uint8_t rfPower = (uint8_t)modemConf["rfPower"].as(100U); + int dmrDiscBWAdj = modemConf["dmrDiscBWAdj"].as(0); + int p25DiscBWAdj = modemConf["p25DiscBWAdj"].as(0); + int dmrPostBWAdj = modemConf["dmrPostBWAdj"].as(0); + int p25PostBWAdj = modemConf["p25PostBWAdj"].as(0); int dmrSymLevel3Adj = modemConf["dmrSymLvl3Adj"].as(0); int dmrSymLevel1Adj = modemConf["dmrSymLvl1Adj"].as(0); int p25SymLevel3Adj = modemConf["p25SymLvl3Adj"].as(0); @@ -1628,7 +1632,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); + m_modem->setRFParams(rxActualFreq, txActualFreq, rfPower, dmrDiscBWAdj, p25DiscBWAdj, dmrPostBWAdj, p25PostBWAdj); m_modem->setDMRColorCode(m_dmrColorCode); m_modem->setP25NAC(m_p25NAC); diff --git a/host/calibrate/HostCal.cpp b/host/calibrate/HostCal.cpp index f682254f..2b9157b5 100644 --- a/host/calibrate/HostCal.cpp +++ b/host/calibrate/HostCal.cpp @@ -142,6 +142,11 @@ HostCal::HostCal(const std::string& confFile) : m_p25Rx1K(false), m_txDCOffset(0), m_rxDCOffset(0), + m_isHotspot(false), + m_dmrDiscBWAdj(0), + m_p25DiscBWAdj(0), + m_dmrPostBWAdj(0), + m_p25PostBWAdj(0), m_dmrSymLevel3Adj(0), m_dmrSymLevel1Adj(0), m_p25SymLevel3Adj(0), @@ -369,8 +374,6 @@ int HostCal::run() return 1; } - displayHelp(); - m_rxInvert = modemConf["rxInvert"].as(false); m_txInvert = modemConf["txInvert"].as(false); m_pttInvert = modemConf["pttInvert"].as(false); @@ -381,6 +384,11 @@ int HostCal::run() m_rxLevel = modemConf["rxLevel"].as(50.0F); m_txLevel = modemConf["txLevel"].as(50.0F); + m_dmrDiscBWAdj = modemConf["dmrDiscBWAdj"].as(0); + m_p25DiscBWAdj = modemConf["p25DiscBWAdj"].as(0); + m_dmrPostBWAdj = modemConf["dmrPostBWAdj"].as(0); + m_p25PostBWAdj = modemConf["p25PostBWAdj"].as(0); + m_dmrSymLevel3Adj = modemConf["dmrSymLvl3Adj"].as(0); m_dmrSymLevel1Adj = modemConf["dmrSymLvl1Adj"].as(0); m_p25SymLevel3Adj = modemConf["p25SymLvl3Adj"].as(0); @@ -392,6 +400,8 @@ int HostCal::run() writeConfig(); + displayHelp(); + printStatus(); bool end = false; @@ -401,30 +411,38 @@ int HostCal::run() /** Level Adjustment Commands */ case 'I': { - m_txInvert = !m_txInvert; - LogMessage(LOG_CAL, " - TX Invert: %s", m_txInvert ? "On" : "Off"); - writeConfig(); + if (!m_isHotspot) { + m_txInvert = !m_txInvert; + LogMessage(LOG_CAL, " - TX Invert: %s", m_txInvert ? "On" : "Off"); + writeConfig(); + } } break; case 'i': { - m_rxInvert = !m_rxInvert; - LogMessage(LOG_CAL, " - RX Invert: %s", m_rxInvert ? "On" : "Off"); - writeConfig(); + if (!m_isHotspot) { + m_rxInvert = !m_rxInvert; + LogMessage(LOG_CAL, " - RX Invert: %s", m_rxInvert ? "On" : "Off"); + writeConfig(); + } } break; case 'p': { - m_pttInvert = !m_pttInvert; - LogMessage(LOG_CAL, " - PTT Invert: %s", m_pttInvert ? "On" : "Off"); - writeConfig(); + if (!m_isHotspot) { + m_pttInvert = !m_pttInvert; + LogMessage(LOG_CAL, " - PTT Invert: %s", m_pttInvert ? "On" : "Off"); + writeConfig(); + } } break; case 'd': { - m_dcBlocker = !m_dcBlocker; - LogMessage(LOG_CAL, " - DC Blocker: %s", m_dcBlocker ? "On" : "Off"); - writeConfig(); + if (!m_isHotspot) { + m_dcBlocker = !m_dcBlocker; + LogMessage(LOG_CAL, " - DC Blocker: %s", m_dcBlocker ? "On" : "Off"); + writeConfig(); + } } break; case 'D': @@ -560,31 +578,127 @@ int HostCal::run() /** Engineering Commands */ case '-': - setDMRSymLevel3Adj(-1); + if (!m_isHotspot) + setDMRSymLevel3Adj(-1); break; case '=': - setDMRSymLevel3Adj(1); + if (!m_isHotspot) + setDMRSymLevel3Adj(1); break; case '_': - setDMRSymLevel1Adj(-1); + if (!m_isHotspot) + setDMRSymLevel1Adj(-1); break; case '+': - setDMRSymLevel1Adj(1); + if (!m_isHotspot) + setDMRSymLevel1Adj(1); break; case '[': - setP25SymLevel3Adj(-1); + if (!m_isHotspot) + setP25SymLevel3Adj(-1); break; case ']': - setP25SymLevel3Adj(1); + if (!m_isHotspot) + setP25SymLevel3Adj(1); break; case '{': - setP25SymLevel1Adj(-1); + if (!m_isHotspot) + setP25SymLevel1Adj(-1); break; case '}': - setP25SymLevel1Adj(1); + if (!m_isHotspot) + setP25SymLevel1Adj(1); break; + case '1': + { + if (m_isHotspot) { + char value[5] = { '\0' }; + ::fprintf(stdout, "> DMR Discriminator BW Offset [%d] ? ", m_dmrDiscBWAdj); + ::fflush(stdout); + + m_console.getLine(value, 5, 0); + if (value[0] != '\0') { + int bwAdj = m_dmrDiscBWAdj; + sscanf(value, "%d", &bwAdj); + + m_dmrDiscBWAdj = bwAdj; + + writeRFParams(); + } + + printStatus(); + } + } + break; + + case '2': + { + if (m_isHotspot) { + char value[5] = { '\0' }; + ::fprintf(stdout, "> P25 Discriminator BW Offset [%d] ? ", m_p25DiscBWAdj); + ::fflush(stdout); + + m_console.getLine(value, 5, 0); + if (value[0] != '\0') { + int bwAdj = m_p25DiscBWAdj; + sscanf(value, "%d", &bwAdj); + + m_p25DiscBWAdj = bwAdj; + + writeRFParams(); + } + + printStatus(); + } + } + break; + + case '3': + { + if (m_isHotspot) { + char value[5] = { '\0' }; + ::fprintf(stdout, "> DMR Post Demodulation BW Offset [%d] ? ", m_dmrPostBWAdj); + ::fflush(stdout); + + m_console.getLine(value, 5, 0); + if (value[0] != '\0') { + int bwAdj = m_dmrPostBWAdj; + sscanf(value, "%d", &bwAdj); + + m_dmrPostBWAdj = bwAdj; + + writeRFParams(); + } + + printStatus(); + } + } + break; + + case '4': + { + if (m_isHotspot) { + char value[5] = { '\0' }; + ::fprintf(stdout, "> P25 Post Demodulation BW Offset [%d] ? ", m_p25PostBWAdj); + ::fflush(stdout); + + m_console.getLine(value, 5, 0); + if (value[0] != '\0') { + int bwAdj = m_p25PostBWAdj; + sscanf(value, "%d", &bwAdj); + + m_p25PostBWAdj = bwAdj; + + writeRFParams(); + } + + printStatus(); + } + } + break; + /** Mode Commands */ case 'Z': { @@ -912,7 +1026,10 @@ bool HostCal::portModemHandler(Modem* modem, uint32_t ms, RESP_TYPE_DVM rspType, case CMD_GET_STATUS: { + m_isHotspot = (buffer[3U] & 0x01U) == 0x01U; + uint8_t modemState = buffer[4U]; + bool tx = (buffer[5U] & 0x01U) == 0x01U; bool adcOverflow = (buffer[5U] & 0x02U) == 0x02U; @@ -920,8 +1037,8 @@ bool HostCal::portModemHandler(Modem* modem, uint32_t ms, RESP_TYPE_DVM rspType, bool txOverflow = (buffer[5U] & 0x08U) == 0x08U; bool dacOverflow = (buffer[5U] & 0x20U) == 0x20U; - LogMessage(LOG_CAL, " - Diagnostic Values [Modem State: %u, Transmitting: %d, ADC Overflow: %d, Rx Overflow: %d, Tx Overflow: %d, DAC Overflow: %d]", - modemState, tx, adcOverflow, rxOverflow, txOverflow, dacOverflow); + LogMessage(LOG_CAL, " - Diagnostic Values [Modem State: %u, Transmitting: %d, ADC Overflow: %d, Rx Overflow: %d, Tx Overflow: %d, DAC Overflow: %d, HS: %u]", + modemState, tx, adcOverflow, rxOverflow, txOverflow, dacOverflow, m_isHotspot); } break; @@ -967,19 +1084,25 @@ void HostCal::displayHelp() LogMessage(LOG_CAL, " S/s Save calibration settings to configuration file"); LogMessage(LOG_CAL, " Q/q Quit"); LogMessage(LOG_CAL, "Level Adjustment Commands:"); - LogMessage(LOG_CAL, " I Toggle transmit inversion"); - LogMessage(LOG_CAL, " i Toggle receive inversion"); - LogMessage(LOG_CAL, " p Toggle PTT inversion"); - LogMessage(LOG_CAL, " d Toggle DC blocker"); + if (!m_isHotspot) { + LogMessage(LOG_CAL, " I Toggle transmit inversion"); + LogMessage(LOG_CAL, " i Toggle receive inversion"); + LogMessage(LOG_CAL, " p Toggle PTT inversion"); + LogMessage(LOG_CAL, " d Toggle DC blocker"); + } LogMessage(LOG_CAL, " R/r Increase/Decrease receive level"); LogMessage(LOG_CAL, " T/t Increase/Decrease transmit level"); - LogMessage(LOG_CAL, " C/c Increase/Decrease RX DC offset level"); - LogMessage(LOG_CAL, " O/o Increase/Decrease TX DC offset level"); + if (!m_isHotspot) { + LogMessage(LOG_CAL, " C/c Increase/Decrease RX DC offset level"); + LogMessage(LOG_CAL, " O/o Increase/Decrease TX DC offset level"); + } LogMessage(LOG_CAL, " N Set FDMA Preambles"); LogMessage(LOG_CAL, " W Set DMR Rx Delay"); LogMessage(LOG_CAL, " w Set P25 Correlation Count"); - LogMessage(LOG_CAL, " F Set Rx Frequency Adjustment (affects hotspots only!)"); - LogMessage(LOG_CAL, " f Set Tx Frequency Adjustment (affects hotspots only!)"); + if (m_isHotspot) { + LogMessage(LOG_CAL, " F Set Rx Frequency Adjustment (hotspot modems only!)"); + LogMessage(LOG_CAL, " f Set Tx Frequency Adjustment (hotspot modems only!)"); + } LogMessage(LOG_CAL, "Mode Commands:"); LogMessage(LOG_CAL, " Z %s", DMR_CAL_STR); LogMessage(LOG_CAL, " z %s", P25_CAL_STR); @@ -994,10 +1117,18 @@ void HostCal::displayHelp() LogMessage(LOG_CAL, " j %s", P25_FEC_1K_STR); LogMessage(LOG_CAL, " x %s", RSSI_CAL_STR); LogMessage(LOG_CAL, "Engineering Commands:"); - LogMessage(LOG_CAL, " -/= Increase/Decrease DMR +/- 3 Symbol Level"); - LogMessage(LOG_CAL, " _/+ Increase/Decrease DMR +/- 1 Symbol Level"); - LogMessage(LOG_CAL, " [/] Increase/Decrease P25 +/- 3 Symbol Level"); - LogMessage(LOG_CAL, " {/} Increase/Decrease P25 +/- 1 Symbol Level"); + if (!m_isHotspot) { + LogMessage(LOG_CAL, " -/= Inc/Dec DMR +/- 3 Symbol Level (dedicated modems only!)"); + LogMessage(LOG_CAL, " _/+ Inc/Dec DMR +/- 1 Symbol Level (dedicated modems only!)"); + LogMessage(LOG_CAL, " [/] Inc/Dec P25 +/- 3 Symbol Level (dedicated modems only!)"); + LogMessage(LOG_CAL, " {/} Inc/Dec P25 +/- 1 Symbol Level (dedicated modems only!)"); + } + else { + LogMessage(LOG_CAL, " 1 Set DMR Disc. Bandwidth Offset (hotspot modems only!)"); + LogMessage(LOG_CAL, " 2 Set P25 Disc. Bandwidth Offset (hotspot modems only!)"); + LogMessage(LOG_CAL, " 3 Set DMR Post Demod Bandwidth Offset (hotspot modems only!)"); + LogMessage(LOG_CAL, " 4 Set P25 Post Demod Bandwidth Offset (hotspot modems only!)"); + } } /// @@ -1768,10 +1899,10 @@ bool HostCal::writeConfig(uint8_t modeOverride) /// bool HostCal::writeRFParams() { - unsigned char buffer[13U]; + unsigned char buffer[17U]; buffer[0U] = DVM_FRAME_START; - buffer[1U] = 13U; + buffer[1U] = 17U; buffer[2U] = CMD_SET_RFPARAMS; buffer[3U] = 0x00U; @@ -1788,9 +1919,18 @@ bool HostCal::writeRFParams() buffer[12U] = (unsigned char)(100 * 2.55F + 0.5F); // cal sets power fixed to 100 + m_conf["system"]["modem"]["m_dmrDiscBWAdj"] = __INT_STR(m_dmrDiscBWAdj); + buffer[13U] = (uint8_t)(m_dmrDiscBWAdj + 128); + m_conf["system"]["modem"]["m_p25DiscBWAdj"] = __INT_STR(m_p25DiscBWAdj); + buffer[14U] = (uint8_t)(m_p25DiscBWAdj + 128); + m_conf["system"]["modem"]["m_dmrPostBWAdj"] = __INT_STR(m_dmrPostBWAdj); + buffer[15U] = (uint8_t)(m_dmrPostBWAdj + 128); + m_conf["system"]["modem"]["m_p25PostBWAdj"] = __INT_STR(m_p25PostBWAdj); + buffer[16U] = (uint8_t)(m_p25PostBWAdj + 128); + // CUtils::dump(1U, "Written", buffer, len); - int ret = m_modem->write(buffer, 13U); + int ret = m_modem->write(buffer, 17U); if (ret <= 0) return false; diff --git a/host/calibrate/HostCal.h b/host/calibrate/HostCal.h index 2d57b2c5..05964212 100644 --- a/host/calibrate/HostCal.h +++ b/host/calibrate/HostCal.h @@ -85,6 +85,13 @@ private: int m_txDCOffset; int m_rxDCOffset; + bool m_isHotspot; + + int8_t m_dmrDiscBWAdj; + int8_t m_p25DiscBWAdj; + int8_t m_dmrPostBWAdj; + int8_t m_p25PostBWAdj; + int m_dmrSymLevel3Adj; int m_dmrSymLevel1Adj; int m_p25SymLevel3Adj; diff --git a/modem/Modem.cpp b/modem/Modem.cpp index d6845e16..0378584d 100644 --- a/modem/Modem.cpp +++ b/modem/Modem.cpp @@ -95,9 +95,14 @@ Modem::Modem(port::IModemPort* port, bool duplex, bool rxInvert, bool txInvert, m_p25Enabled(false), m_rxDCOffset(0), m_txDCOffset(0), + m_isHotspot(false), m_rxFrequency(0U), m_txFrequency(0U), m_rfPower(0U), + m_dmrDiscBWAdj(0), + m_p25DiscBWAdj(0), + m_dmrPostBWAdj(0), + m_p25PostBWAdj(0), m_dmrSymLevel3Adj(0), m_dmrSymLevel1Adj(0), m_p25SymLevel3Adj(0), @@ -224,11 +229,20 @@ void Modem::setSymbolAdjust(int dmrSymLevel3Adj, int dmrSymLevel1Adj, int p25Sym /// /// /// -void Modem::setRFParams(uint32_t rxFreq, uint32_t txFreq, uint8_t rfPower) +/// +/// +/// +/// +void Modem::setRFParams(uint32_t rxFreq, uint32_t txFreq, uint8_t rfPower, int8_t dmrDiscBWAdj, int8_t p25DiscBWAdj, int8_t dmrPostBWAdj, int8_t p25PostBWAdj) { m_rfPower = rfPower; m_rxFrequency = rxFreq; m_txFrequency = txFreq; + + m_dmrDiscBWAdj = dmrDiscBWAdj; + m_p25DiscBWAdj = p25DiscBWAdj; + m_dmrPostBWAdj = dmrPostBWAdj; + m_p25PostBWAdj = p25PostBWAdj; } /// @@ -584,6 +598,8 @@ void Modem::clock(uint32_t ms) //if (m_trace) // Utils::dump(1U, "Get Status", m_buffer, m_length); + m_isHotspot = (m_buffer[3U] & 0x01U) == 0x01U; + m_modemState = (DVM_STATE)m_buffer[4U]; m_tx = (m_buffer[5U] & 0x01U) == 0x01U; @@ -1473,10 +1489,10 @@ bool Modem::writeSymbolAdjust() /// bool Modem::writeRFParams() { - unsigned char buffer[13U]; + unsigned char buffer[17U]; buffer[0U] = DVM_FRAME_START; - buffer[1U] = 13U; + buffer[1U] = 17U; buffer[2U] = CMD_SET_RFPARAMS; buffer[3U] = 0x00U; @@ -1493,9 +1509,14 @@ bool Modem::writeRFParams() buffer[12U] = (unsigned char)(m_rfPower * 2.55F + 0.5F); + buffer[13U] = (uint8_t)(m_dmrDiscBWAdj + 128); + buffer[14U] = (uint8_t)(m_p25DiscBWAdj + 128); + buffer[15U] = (uint8_t)(m_dmrPostBWAdj + 128); + buffer[16U] = (uint8_t)(m_p25PostBWAdj + 128); + // CUtils::dump(1U, "Written", buffer, len); - int ret = m_port->write(buffer, 13U); + int ret = m_port->write(buffer, 17U); if (ret <= 0) return false; diff --git a/modem/Modem.h b/modem/Modem.h index 2a30ac33..8267cc7f 100644 --- a/modem/Modem.h +++ b/modem/Modem.h @@ -193,7 +193,7 @@ 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); + void setRFParams(uint32_t rxFreq, uint32_t txFreq, uint8_t rfPower, int8_t dmrDiscBWAdj, int8_t p25DiscBWAdj, int8_t dmrPostBWAdj, int8_t p25PostBWAdj); /// Sets the DMR color code. void setDMRColorCode(uint32_t colorCode); /// Sets the P25 NAC. @@ -316,10 +316,17 @@ namespace modem int m_rxDCOffset; int m_txDCOffset; + bool m_isHotspot; + uint32_t m_rxFrequency; uint32_t m_txFrequency; uint8_t m_rfPower; + int8_t m_dmrDiscBWAdj; + int8_t m_p25DiscBWAdj; + int8_t m_dmrPostBWAdj; + int8_t m_p25PostBWAdj; + int m_dmrSymLevel3Adj; int m_dmrSymLevel1Adj; int m_p25SymLevel3Adj;