add support for adjusting the discriminator BW and post demod BW for hotspots;

pull/12/head
Bryan Biedenkapp 4 years ago
parent c0bac0024a
commit a441d468c6

@ -1491,6 +1491,10 @@ bool Host::createModem()
int rxTuning = modemConf["rxTuning"].as<int>(0);
int txTuning = modemConf["txTuning"].as<int>(0);
uint8_t rfPower = (uint8_t)modemConf["rfPower"].as<uint32_t>(100U);
int dmrDiscBWAdj = modemConf["dmrDiscBWAdj"].as<int>(0);
int p25DiscBWAdj = modemConf["p25DiscBWAdj"].as<int>(0);
int dmrPostBWAdj = modemConf["dmrPostBWAdj"].as<int>(0);
int p25PostBWAdj = modemConf["p25PostBWAdj"].as<int>(0);
int dmrSymLevel3Adj = modemConf["dmrSymLvl3Adj"].as<int>(0);
int dmrSymLevel1Adj = modemConf["dmrSymLvl1Adj"].as<int>(0);
int p25SymLevel3Adj = modemConf["p25SymLvl3Adj"].as<int>(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);

@ -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<bool>(false);
m_txInvert = modemConf["txInvert"].as<bool>(false);
m_pttInvert = modemConf["pttInvert"].as<bool>(false);
@ -381,6 +384,11 @@ int HostCal::run()
m_rxLevel = modemConf["rxLevel"].as<float>(50.0F);
m_txLevel = modemConf["txLevel"].as<float>(50.0F);
m_dmrDiscBWAdj = modemConf["dmrDiscBWAdj"].as<int>(0);
m_p25DiscBWAdj = modemConf["p25DiscBWAdj"].as<int>(0);
m_dmrPostBWAdj = modemConf["dmrPostBWAdj"].as<int>(0);
m_p25PostBWAdj = modemConf["p25PostBWAdj"].as<int>(0);
m_dmrSymLevel3Adj = modemConf["dmrSymLvl3Adj"].as<int>(0);
m_dmrSymLevel1Adj = modemConf["dmrSymLvl1Adj"].as<int>(0);
m_p25SymLevel3Adj = modemConf["p25SymLvl3Adj"].as<int>(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!)");
}
}
/// <summary>
@ -1768,10 +1899,10 @@ bool HostCal::writeConfig(uint8_t modeOverride)
/// <returns></returns>
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;

@ -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;

@ -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
/// <param name="rxFreq"></param>
/// <param name="txFreq"></param>
/// <param name="rfPower"></param>
void Modem::setRFParams(uint32_t rxFreq, uint32_t txFreq, uint8_t rfPower)
/// <param name="dmrDiscBWAdj"></param>
/// <param name="p25DiscBWAdj"></param>
/// <param name="dmrPostBWAdj"></param>
/// <param name="p25PostBWAdj"></param>
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;
}
/// <summary>
@ -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()
/// <returns></returns>
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;

@ -193,7 +193,7 @@ namespace modem
/// <summary>Sets the symbol adjustment levels.</summary>
void setSymbolAdjust(int dmrSymLevel3Adj, int dmrSymLevel1Adj, int p25SymLevel3Adj, int p25SymLevel1Adj);
/// <summary>Sets the RF parameters.</summary>
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);
/// <summary>Sets the DMR color code.</summary>
void setDMRColorCode(uint32_t colorCode);
/// <summary>Sets the P25 NAC.</summary>
@ -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;

Loading…
Cancel
Save

Powered by TurnKey Linux.