fix cross-thread ARM shennigans (this should resolve #78);

pull/79/head
Bryan Biedenkapp 1 year ago
parent 5dce90b6d0
commit 28153fbab9

@ -149,6 +149,9 @@ private:
m_channelNo.setRange(0, 4095); m_channelNo.setRange(0, 4095);
m_channelNo.setShadow(false); m_channelNo.setShadow(false);
m_channelNo.addCallback("changed", [&]() { m_channelNo.addCallback("changed", [&]() {
if (!m_radioChNo.isChecked())
return;
m_setup->m_conf["system"]["config"]["channelNo"] = __INT_HEX_STR(m_channelNo.getValue()); m_setup->m_conf["system"]["config"]["channelNo"] = __INT_HEX_STR(m_channelNo.getValue());
m_setup->calculateRxTxFreq(); m_setup->calculateRxTxFreq();
m_channelFreq.setValue(m_setup->m_txFrequency); m_channelFreq.setValue(m_setup->m_txFrequency);
@ -167,34 +170,17 @@ private:
m_channelFreq.setValue(m_setup->m_txFrequency); m_channelFreq.setValue(m_setup->m_txFrequency);
m_channelFreq.setShadow(false); m_channelFreq.setShadow(false);
m_channelFreq.addCallback("changed", [&]() { m_channelFreq.addCallback("changed", [&]() {
entry = m_setup->m_idenTable->find(m_setup->m_channelId); if (!m_radioChFreq.isChecked())
return;
uint32_t txFrequency = m_channelFreq.getValue();
uint32_t prevTxFrequency = m_setup->m_txFrequency;
m_setup->m_txFrequency = txFrequency;
uint32_t prevRxFrequency = m_setup->m_rxFrequency;
m_setup->m_rxFrequency = m_setup->m_txFrequency + (uint32_t)(entry.txOffsetMhz() * 1000000);
float spaceHz = entry.chSpaceKhz() * 1000;
uint32_t rootFreq = m_setup->m_txFrequency - entry.baseFrequency(); uint32_t txFrequency = (uint32_t)(m_channelFreq.getValue());
uint8_t prevChannelNo = m_setup->m_channelNo; m_setup->calculateRxTxFreq(false, txFrequency);
m_setup->m_channelNo = (uint32_t)(rootFreq / spaceHz);
if (m_setup->m_channelNo < 0 || m_setup->m_channelNo > 4096) {
m_setup->m_channelNo = prevChannelNo;
m_setup->m_txFrequency = prevTxFrequency;
m_setup->m_rxFrequency = prevRxFrequency;
}
m_setup->m_conf["system"]["config"]["channelNo"] = __INT_HEX_STR(m_setup->m_channelNo);
m_setup->calculateRxTxFreq();
m_channelNo.setValue(m_setup->m_channelNo); m_channelNo.setValue(m_setup->m_channelNo);
if (m_setup->m_isConnected) { if (m_setup->m_isConnected) {
m_setup->writeRFParams(); m_setup->writeRFParams();
} }
}); });
m_hzLabel.setGeometry(FPoint(40, 12), FSize(5, 1)); m_hzLabel.setGeometry(FPoint(40, 12), FSize(5, 1));
} }

@ -598,7 +598,7 @@ void HostSetup::saveConfig()
/* Helper to calculate the Rx/Tx frequencies. */ /* Helper to calculate the Rx/Tx frequencies. */
bool HostSetup::calculateRxTxFreq(bool consoleDisplay) bool HostSetup::calculateRxTxFreq(bool consoleDisplay, uint32_t txFrequency)
{ {
IdenTable entry = m_idenTable->find(m_channelId); IdenTable entry = m_idenTable->find(m_channelId);
if (entry.baseFrequency() == 0U) { if (entry.baseFrequency() == 0U) {
@ -610,37 +610,57 @@ bool HostSetup::calculateRxTxFreq(bool consoleDisplay)
return false; return false;
} }
yaml::Node systemConf = m_conf["system"]; if (txFrequency > 0U) {
yaml::Node rfssConfig = systemConf["config"]; uint32_t prevTxFrequency = m_txFrequency;
m_channelNo = (uint32_t)::strtoul(rfssConfig["channelNo"].as<std::string>("1").c_str(), NULL, 16); m_txFrequency = txFrequency;
if (m_channelNo == 0U) { // clamp to 1 uint32_t prevRxFrequency = m_rxFrequency;
m_channelNo = 1U; m_rxFrequency = m_txFrequency + (uint32_t)(entry.txOffsetMhz() * 1000000);
}
if (m_channelNo > 4095U) { // clamp to 4095
m_channelNo = 4095U;
}
if (m_startupDuplex) { float spaceHz = entry.chSpaceKhz() * 1000.0;
if (entry.txOffsetMhz() == 0U) {
if (consoleDisplay) {
g_logDisplayLevel = 1U;
}
::LogError(LOG_HOST, "Channel Id %u has an invalid Tx offset.", m_channelId); uint32_t rootFreq = m_txFrequency - entry.baseFrequency();
return false; uint8_t prevChannelNo = m_channelNo;
} m_channelNo = (uint32_t)(rootFreq / spaceHz);
uint32_t calcSpace = (uint32_t)(entry.chSpaceKhz() / 0.125);
float calcTxOffset = entry.txOffsetMhz() * 1000000.0;
m_rxFrequency = (uint32_t)((entry.baseFrequency() + ((calcSpace * 125) * m_channelNo)) + (int32_t)calcTxOffset); if (m_channelNo < 0 || m_channelNo > 4096) {
m_txFrequency = (uint32_t)((entry.baseFrequency() + ((calcSpace * 125) * m_channelNo))); m_channelNo = prevChannelNo;
m_txFrequency = prevTxFrequency;
m_rxFrequency = prevRxFrequency;
}
} }
else { else {
uint32_t calcSpace = (uint32_t)(entry.chSpaceKhz() / 0.125); yaml::Node systemConf = m_conf["system"];
yaml::Node rfssConfig = systemConf["config"];
m_channelNo = (uint32_t)::strtoul(rfssConfig["channelNo"].as<std::string>("1").c_str(), NULL, 16);
if (m_channelNo == 0U) { // clamp to 1
m_channelNo = 1U;
}
if (m_channelNo > 4095U) { // clamp to 4095
m_channelNo = 4095U;
}
if (m_startupDuplex) {
if (entry.txOffsetMhz() == 0U) {
if (consoleDisplay) {
g_logDisplayLevel = 1U;
}
::LogError(LOG_HOST, "Channel Id %u has an invalid Tx offset.", m_channelId);
return false;
}
m_rxFrequency = (uint32_t)((entry.baseFrequency() + ((calcSpace * 125) * m_channelNo))); uint32_t calcSpace = (uint32_t)(entry.chSpaceKhz() / 0.125);
m_txFrequency = m_rxFrequency; float calcTxOffset = entry.txOffsetMhz() * 1000000.0;
m_rxFrequency = (uint32_t)((entry.baseFrequency() + ((calcSpace * 125) * m_channelNo)) + (int32_t)calcTxOffset);
m_txFrequency = (uint32_t)((entry.baseFrequency() + ((calcSpace * 125) * m_channelNo)));
}
else {
uint32_t calcSpace = (uint32_t)(entry.chSpaceKhz() / 0.125);
m_rxFrequency = (uint32_t)((entry.baseFrequency() + ((calcSpace * 125) * m_channelNo)));
m_txFrequency = m_rxFrequency;
}
} }
if (m_isHotspot) { if (m_isHotspot) {

@ -218,9 +218,10 @@ protected:
/** /**
* @brief Helper to calculate the Rx/Tx frequencies. * @brief Helper to calculate the Rx/Tx frequencies.
* @param consoleDisplay Flag indicating output should goto the console log. * @param consoleDisplay Flag indicating output should goto the console log.
* @param txFrequency Transmit frequency to use (this will auto calculate the Rx frequency from Tx frequency).
* @returns bool True, if Rx/Tx frequencies are calculated, otherwise false. * @returns bool True, if Rx/Tx frequencies are calculated, otherwise false.
*/ */
bool calculateRxTxFreq(bool consoleDisplay = false); bool calculateRxTxFreq(bool consoleDisplay = false, uint32_t txFrequency = 0U);
/** /**
* @brief Helper to log the system configuration parameters. * @brief Helper to log the system configuration parameters.
*/ */

Loading…
Cancel
Save

Powered by TurnKey Linux.