properly handle swapping between Rx and Tx antennas for BER operations on hotspots (this requires updated firmware);

pull/48/head
Bryan Biedenkapp 2 years ago
parent 105b0d1e7d
commit ddfb6aaedc

@ -109,7 +109,7 @@ typedef unsigned long long ulong64_t;
#define __PROG_NAME__ "" #define __PROG_NAME__ ""
#define __NET_NAME__ "DVM_DMR_P25" #define __NET_NAME__ "DVM_DMR_P25"
#define __EXE_NAME__ "" #define __EXE_NAME__ ""
#define __VER__ "D03.60.00-alpha (" __GIT_VER__ ")" #define __VER__ "D03.60.00 (" __GIT_VER__ ")"
#define __BUILD__ __DATE__ " " __TIME__ #define __BUILD__ __DATE__ " " __TIME__
#define HOST_SW_API #define HOST_SW_API

@ -93,7 +93,7 @@ int HostCal::run(int argc, char **argv)
::LogInfo(">> Modem Calibration"); ::LogInfo(">> Modem Calibration");
yaml::Node systemConf = m_conf["system"]; yaml::Node systemConf = m_conf["system"];
m_duplex = systemConf["duplex"].as<bool>(true); m_startupDuplex = m_duplex = systemConf["duplex"].as<bool>(true);
// try to load bandplan identity table // try to load bandplan identity table
std::string idenLookupFile = systemConf["iden_table"]["file"].as<std::string>(); std::string idenLookupFile = systemConf["iden_table"]["file"].as<std::string>();
@ -428,6 +428,13 @@ int HostCal::run(int argc, char **argv)
} }
break; break;
case ')':
{
m_duplex = !m_duplex;
writeConfig();
}
break;
/** Mode Commands */ /** Mode Commands */
case 'Z': case 'Z':
{ {
@ -549,7 +556,6 @@ int HostCal::run(int argc, char **argv)
break; break;
case 'B': case 'B':
case 'J': case 'J':
case ')':
{ {
m_mode = STATE_DMR; m_mode = STATE_DMR;
if (c == 'J') { if (c == 'J') {
@ -560,11 +566,8 @@ int HostCal::run(int argc, char **argv)
m_modeStr = DMR_FEC_STR; m_modeStr = DMR_FEC_STR;
m_dmrRx1K = false; m_dmrRx1K = false;
} }
if (c == ')') {
m_duplex = true; m_duplex = m_startupDuplex;
} else {
m_duplex = false;
}
m_dmrEnabled = true; m_dmrEnabled = true;
m_p25Enabled = false; m_p25Enabled = false;
m_nxdnEnabled = false; m_nxdnEnabled = false;
@ -585,7 +588,8 @@ int HostCal::run(int argc, char **argv)
m_modeStr = P25_FEC_STR; m_modeStr = P25_FEC_STR;
m_p25Rx1K = false; m_p25Rx1K = false;
} }
m_duplex = false;
m_duplex = m_startupDuplex;
m_dmrEnabled = false; m_dmrEnabled = false;
m_p25Enabled = true; m_p25Enabled = true;
m_p25TduTest = false; m_p25TduTest = false;
@ -601,7 +605,8 @@ int HostCal::run(int argc, char **argv)
if (m_modem->getVersion() >= 3U) { if (m_modem->getVersion() >= 3U) {
m_mode = STATE_NXDN; m_mode = STATE_NXDN;
m_modeStr = NXDN_FEC_STR; m_modeStr = NXDN_FEC_STR;
m_duplex = false;
m_duplex = m_startupDuplex;
m_dmrEnabled = false; m_dmrEnabled = false;
m_p25Enabled = false; m_p25Enabled = false;
m_p25Rx1K = false; m_p25Rx1K = false;
@ -620,6 +625,7 @@ int HostCal::run(int argc, char **argv)
{ {
m_mode = STATE_RSSI_CAL; m_mode = STATE_RSSI_CAL;
m_modeStr = RSSI_CAL_STR; m_modeStr = RSSI_CAL_STR;
m_duplex = true; m_duplex = true;
m_dmrEnabled = false; m_dmrEnabled = false;
m_dmrRx1K = false; m_dmrRx1K = false;
@ -720,6 +726,7 @@ void HostCal::displayHelp()
if (!m_modem->m_flashDisabled) { if (!m_modem->m_flashDisabled) {
LogMessage(LOG_CAL, " U Read modem configuration area and reset local configuration"); LogMessage(LOG_CAL, " U Read modem configuration area and reset local configuration");
} }
LogMessage(LOG_CAL, " ) Swap Duplex Flag (depending on mode this will enable/disable duplex)");
LogMessage(LOG_CAL, " Q/q Quit"); LogMessage(LOG_CAL, " Q/q Quit");
LogMessage(LOG_CAL, "Level Adjustment Commands:"); LogMessage(LOG_CAL, "Level Adjustment Commands:");
if (!m_isHotspot) { if (!m_isHotspot) {

@ -211,8 +211,7 @@ int HostSetup::run(int argc, char** argv)
yaml::Node logConf = m_conf["log"]; yaml::Node logConf = m_conf["log"];
yaml::Node systemConf = m_conf["system"]; yaml::Node systemConf = m_conf["system"];
yaml::Node modemConfig = systemConf["modem"]; yaml::Node modemConfig = systemConf["modem"];
m_duplex = systemConf["duplex"].as<bool>(true); m_startupDuplex = m_duplex = systemConf["duplex"].as<bool>(true);
m_startupDuplex = m_duplex;
// try to load bandplan identity table // try to load bandplan identity table
std::string idenLookupFile = systemConf["iden_table"]["file"].as<std::string>(); std::string idenLookupFile = systemConf["iden_table"]["file"].as<std::string>();
@ -1508,6 +1507,7 @@ bool HostSetup::writeConfig(uint8_t modeOverride)
buffer[3U] |= 0x04U; buffer[3U] |= 0x04U;
if (m_debug) if (m_debug)
buffer[3U] |= 0x10U; buffer[3U] |= 0x10U;
buffer[3U] |= 0x40U; // force DMO for calibration
if (!m_duplex) if (!m_duplex)
buffer[3U] |= 0x80U; buffer[3U] |= 0x80U;

@ -121,6 +121,7 @@ public:
// calibrate menu // calibrate menu
m_calibrateMenuSeparator1.setSeparator(); m_calibrateMenuSeparator1.setSeparator();
m_calibrateMenuSeparator2.setSeparator(); m_calibrateMenuSeparator2.setSeparator();
m_calibrateMenuSeparator3.setSeparator();
m_dmrCal.addCallback("toggled", [&]() { m_dmrCal.addCallback("toggled", [&]() {
m_setup->m_mode = STATE_DMR_CAL; m_setup->m_mode = STATE_DMR_CAL;
m_setup->m_modeStr = DMR_CAL_STR; m_setup->m_modeStr = DMR_CAL_STR;
@ -132,6 +133,7 @@ public:
m_setup->m_p25TduTest = false; m_setup->m_p25TduTest = false;
m_setup->m_nxdnEnabled = false; m_setup->m_nxdnEnabled = false;
updateDuplexState();
resetBERWnd(); resetBERWnd();
LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str()); LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str());
@ -148,6 +150,7 @@ public:
m_setup->m_p25TduTest = false; m_setup->m_p25TduTest = false;
m_setup->m_nxdnEnabled = false; m_setup->m_nxdnEnabled = false;
updateDuplexState();
resetBERWnd(); resetBERWnd();
LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str()); LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str());
@ -164,6 +167,7 @@ public:
m_setup->m_p25TduTest = false; m_setup->m_p25TduTest = false;
m_setup->m_nxdnEnabled = false; m_setup->m_nxdnEnabled = false;
updateDuplexState();
resetBERWnd(); resetBERWnd();
LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str()); LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str());
@ -180,6 +184,7 @@ public:
m_setup->m_p25TduTest = false; m_setup->m_p25TduTest = false;
m_setup->m_nxdnEnabled = false; m_setup->m_nxdnEnabled = false;
updateDuplexState();
resetBERWnd(); resetBERWnd();
LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str()); LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str());
@ -196,6 +201,7 @@ public:
m_setup->m_p25TduTest = false; m_setup->m_p25TduTest = false;
m_setup->m_nxdnEnabled = false; m_setup->m_nxdnEnabled = false;
updateDuplexState();
resetBERWnd(); resetBERWnd();
LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str()); LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str());
@ -212,6 +218,7 @@ public:
m_setup->m_p25TduTest = false; m_setup->m_p25TduTest = false;
m_setup->m_nxdnEnabled = false; m_setup->m_nxdnEnabled = false;
updateDuplexState();
resetBERWnd(); resetBERWnd();
LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str()); LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str());
@ -226,6 +233,7 @@ public:
m_setup->m_p25TduTest = true; m_setup->m_p25TduTest = true;
m_setup->m_nxdnEnabled = false; m_setup->m_nxdnEnabled = false;
updateDuplexState();
resetBERWnd(); resetBERWnd();
m_setup->m_queue.clear(); m_setup->m_queue.clear();
@ -246,6 +254,7 @@ public:
m_setup->m_p25TduTest = false; m_setup->m_p25TduTest = false;
m_setup->m_nxdnEnabled = false; m_setup->m_nxdnEnabled = false;
updateDuplexState();
resetBERWnd(); resetBERWnd();
LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str()); LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str());
@ -259,18 +268,12 @@ public:
m_setup->m_mode = STATE_DMR; m_setup->m_mode = STATE_DMR;
m_setup->m_modeStr = DMR_FEC_STR; m_setup->m_modeStr = DMR_FEC_STR;
m_setup->m_dmrRx1K = false; m_setup->m_dmrRx1K = false;
/* m_setup->m_duplex = m_setup->m_startupDuplex;
if (c == ')') {
m_setup->m_duplex = true;
} else {
m_setup->m_duplex = false;
}
*/
m_setup->m_duplex = false;
m_setup->m_dmrEnabled = true; m_setup->m_dmrEnabled = true;
m_setup->m_p25Enabled = false; m_setup->m_p25Enabled = false;
m_setup->m_nxdnEnabled = false; m_setup->m_nxdnEnabled = false;
updateDuplexState();
resetBERWnd(true); resetBERWnd(true);
LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str()); LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str());
@ -280,18 +283,12 @@ public:
m_setup->m_mode = STATE_DMR; m_setup->m_mode = STATE_DMR;
m_setup->m_modeStr = DMR_FEC_1K_STR; m_setup->m_modeStr = DMR_FEC_1K_STR;
m_setup->m_dmrRx1K = true; m_setup->m_dmrRx1K = true;
/* m_setup->m_duplex = m_setup->m_startupDuplex;
if (c == ')') {
m_setup->m_duplex = true;
} else {
m_setup->m_duplex = false;
}
*/
m_setup->m_duplex = false;
m_setup->m_dmrEnabled = true; m_setup->m_dmrEnabled = true;
m_setup->m_p25Enabled = false; m_setup->m_p25Enabled = false;
m_setup->m_nxdnEnabled = false; m_setup->m_nxdnEnabled = false;
updateDuplexState();
resetBERWnd(true); resetBERWnd(true);
LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str()); LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str());
@ -301,12 +298,13 @@ public:
m_setup->m_mode = STATE_P25; m_setup->m_mode = STATE_P25;
m_setup->m_modeStr = P25_FEC_STR; m_setup->m_modeStr = P25_FEC_STR;
m_setup->m_p25Rx1K = false; m_setup->m_p25Rx1K = false;
m_setup->m_duplex = false; m_setup->m_duplex = m_setup->m_startupDuplex;
m_setup->m_dmrEnabled = false; m_setup->m_dmrEnabled = false;
m_setup->m_p25Enabled = true; m_setup->m_p25Enabled = true;
m_setup->m_p25TduTest = false; m_setup->m_p25TduTest = false;
m_setup->m_nxdnEnabled = false; m_setup->m_nxdnEnabled = false;
updateDuplexState();
resetBERWnd(true); resetBERWnd(true);
LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str()); LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str());
@ -316,12 +314,13 @@ public:
m_setup->m_mode = STATE_P25; m_setup->m_mode = STATE_P25;
m_setup->m_modeStr = P25_FEC_1K_STR; m_setup->m_modeStr = P25_FEC_1K_STR;
m_setup->m_p25Rx1K = true; m_setup->m_p25Rx1K = true;
m_setup->m_duplex = false; m_setup->m_duplex = m_setup->m_startupDuplex;
m_setup->m_dmrEnabled = false; m_setup->m_dmrEnabled = false;
m_setup->m_p25Enabled = true; m_setup->m_p25Enabled = true;
m_setup->m_p25TduTest = false; m_setup->m_p25TduTest = false;
m_setup->m_nxdnEnabled = false; m_setup->m_nxdnEnabled = false;
updateDuplexState();
resetBERWnd(true); resetBERWnd(true);
LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str()); LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str());
@ -332,13 +331,14 @@ public:
if (m_setup->m_modem->getVersion() >= 3U) { if (m_setup->m_modem->getVersion() >= 3U) {
m_setup->m_mode = STATE_NXDN; m_setup->m_mode = STATE_NXDN;
m_setup->m_modeStr = NXDN_FEC_STR; m_setup->m_modeStr = NXDN_FEC_STR;
m_setup->m_duplex = false; m_setup->m_duplex = m_setup->m_startupDuplex;
m_setup->m_dmrEnabled = false; m_setup->m_dmrEnabled = false;
m_setup->m_p25Enabled = false; m_setup->m_p25Enabled = false;
m_setup->m_p25Rx1K = false; m_setup->m_p25Rx1K = false;
m_setup->m_p25TduTest = false; m_setup->m_p25TduTest = false;
m_setup->m_nxdnEnabled = true; m_setup->m_nxdnEnabled = true;
updateDuplexState();
resetBERWnd(true); resetBERWnd(true);
LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str()); LogMessage(LOG_CAL, " - %s", m_setup->m_modeStr.c_str());
@ -392,6 +392,13 @@ public:
m_setup->writeConfig(); m_setup->writeConfig();
} }
}); });
m_toggleDuplex.addCallback("toggled", this, [&]() {
if (m_setup->m_isHotspot && m_setup->m_isConnected) {
m_setup->m_duplex = !m_setup->m_duplex;
LogMessage(LOG_CAL, "Hotspot Rx: %s", m_setup->m_duplex ? "Rx Antenna" : "Tx Antenna");
m_setup->writeConfig();
}
});
m_adjustLevel.addAccelerator(FKey::Meta_l); // Meta/Alt + L m_adjustLevel.addAccelerator(FKey::Meta_l); // Meta/Alt + L
m_adjustLevel.addCallback("clicked", this, [&]() { m_adjustLevel.addCallback("clicked", this, [&]() {
@ -472,7 +479,7 @@ public:
const FString line(2, UniChar::BoxDrawingsHorizontal); const FString line(2, UniChar::BoxDrawingsHorizontal);
FMessageBox info("About", line + __PROG_NAME__ + line + L"\n\n" FMessageBox info("About", line + __PROG_NAME__ + line + L"\n\n"
L"Version " + __VER__ + L"\n\n" L"Version " + __VER__ + L"\n\n"
L"Copyright (c) 2017-2023 Bryan Biedenkapp, N2PLL and DVMProject (https://github.com/dvmproject) Authors." + L"\n" L"Copyright (c) 2017-2024 Bryan Biedenkapp, N2PLL and DVMProject (https://github.com/dvmproject) Authors." + L"\n"
L"Portions Copyright (c) 2015-2021 by Jonathan Naylor, G4KLX and others", L"Portions Copyright (c) 2015-2021 by Jonathan Naylor, G4KLX and others",
FMessageBox::ButtonType::Ok, FMessageBox::ButtonType::Reject, FMessageBox::ButtonType::Reject, this); FMessageBox::ButtonType::Ok, FMessageBox::ButtonType::Reject, FMessageBox::ButtonType::Reject, this);
info.setCenterText(); info.setCenterText();
@ -506,9 +513,20 @@ public:
m_toggleDCBlocker.setChecked(); m_toggleDCBlocker.setChecked();
} }
updateDuplexState();
updateMenuStates(); updateMenuStates();
} }
/// <summary>
/// Helper to update duplex toggle menu state.
/// </summary>
void updateDuplexState()
{
if (m_setup->m_duplex) {
m_toggleDuplex.setChecked();
}
}
/// <summary> /// <summary>
/// Helper to update menu states. /// Helper to update menu states.
/// </summary> /// </summary>
@ -530,6 +548,8 @@ public:
m_togglePTTInvert.setDisable(); m_togglePTTInvert.setDisable();
m_toggleDCBlocker.setDisable(); m_toggleDCBlocker.setDisable();
m_toggleDuplex.setEnable();
m_adjSymLevel.setDisable(); m_adjSymLevel.setDisable();
m_adjHSBandwidth.setEnable(); m_adjHSBandwidth.setEnable();
m_adjHSGain.setEnable(); m_adjHSGain.setEnable();
@ -540,6 +560,8 @@ public:
m_togglePTTInvert.setEnable(); m_togglePTTInvert.setEnable();
m_toggleDCBlocker.setEnable(); m_toggleDCBlocker.setEnable();
m_toggleDuplex.setDisable();
m_adjSymLevel.setEnable(); m_adjSymLevel.setEnable();
m_adjHSBandwidth.setDisable(); m_adjHSBandwidth.setDisable();
m_adjHSGain.setDisable(); m_adjHSGain.setDisable();
@ -601,6 +623,8 @@ private:
FCheckMenuItem m_togglePTTInvert{"PTT Invert", &m_calibrateMenu}; FCheckMenuItem m_togglePTTInvert{"PTT Invert", &m_calibrateMenu};
FCheckMenuItem m_toggleDCBlocker{"DC Blocker", &m_calibrateMenu}; FCheckMenuItem m_toggleDCBlocker{"DC Blocker", &m_calibrateMenu};
FMenuItem m_calibrateMenuSeparator2{&m_calibrateMenu}; FMenuItem m_calibrateMenuSeparator2{&m_calibrateMenu};
FCheckMenuItem m_toggleDuplex{"Rx on Hotspot Rx Antenna", &m_calibrateMenu};
FMenuItem m_calibrateMenuSeparator3{&m_calibrateMenu};
FMenuItem m_adjustLevel{"&Level Adjustment", &m_calibrateMenu}; FMenuItem m_adjustLevel{"&Level Adjustment", &m_calibrateMenu};
FMenu m_engineeringMenu{"&Engineering", &m_menuBar}; FMenu m_engineeringMenu{"&Engineering", &m_menuBar};
@ -678,6 +702,14 @@ private:
void cb_connectToModemClick() void cb_connectToModemClick()
{ {
if (!m_setup->m_isConnected) { if (!m_setup->m_isConnected) {
bool modemDebugState = g_modemDebug;
if (g_modemDebug) {
g_modemDebug = false;
}
m_setup->m_debug = false;
m_setup->m_modem->m_debug = false;
FMessageBox wait("Wait", L"Please wait...\nConnecting to modem...", FMessageBox wait("Wait", L"Please wait...\nConnecting to modem...",
FMessageBox::ButtonType::Reject, FMessageBox::ButtonType::Reject, FMessageBox::ButtonType::Reject, this); FMessageBox::ButtonType::Reject, FMessageBox::ButtonType::Reject, FMessageBox::ButtonType::Reject, this);
wait.setCenterText(); wait.setCenterText();
@ -727,6 +759,13 @@ private:
return; return;
} }
if (g_modemDebug != modemDebugState) {
g_modemDebug = modemDebugState;
m_setup->m_debug = g_modemDebug;
m_setup->m_modem->m_debug = g_modemDebug;
m_setup->writeConfig();
}
m_setup->m_isConnected = true; m_setup->m_isConnected = true;
m_connectToModemItem.setDisable(); m_connectToModemItem.setDisable();

Loading…
Cancel
Save

Powered by TurnKey Linux.