mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-11-02 10:51:57 +00:00
fix(companion): CLI NaN, APC on TX changes, tz-aware alarm, late ACKs, ping timeout and widths, TX limits
- set af / dutycycle / rxdelay reject nan. - A TX power change from the app or CLI re-baselines APC. - CMD_SET_RADIO_PARAMS stores repeat as 0/1. - The alarm reschedules itself when the time zone changes. - A late ACK for an earlier DM attempt marks it delivered. - A new auto-advert interval counts from the last advert. - Both UIs take the TX power range from radioctl, up to MAX_LORA_TX_POWER (30 dBm on the GAT562 30S). - The ping timeout comes from the airtime; 3-byte path hash mode pings with 4-byte trace hashes, and trace flags are right for width 4. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -66,7 +66,6 @@ class NearbyScreen : public UIScreen, protected NearbyModel {
|
||||
char _ping_snr_back_str[24];
|
||||
bool _pinging;
|
||||
unsigned long _ping_started_ms;
|
||||
static const unsigned long PING_TIMEOUT_MS = 3000UL;
|
||||
|
||||
// ── helpers ──────────────────────────────────────────────────────────────────
|
||||
static void pubKeyToBase64(const uint8_t* key, char* out, int out_len) {
|
||||
@@ -266,7 +265,7 @@ class NearbyScreen : public UIScreen, protected NearbyModel {
|
||||
if (snr_back != 0)
|
||||
snprintf(_ping_snr_back_str, sizeof(_ping_snr_back_str), "SNR back: %.1f", snr_back / 4.0f);
|
||||
_pinging = false;
|
||||
} else if (_pinging && millis() - _ping_started_ms >= PING_TIMEOUT_MS) {
|
||||
} else if (_pinging && millis() - _ping_started_ms >= _task->pingTimeoutMs()) {
|
||||
snprintf(_ping_time_str, sizeof(_ping_time_str), "RTT: timeout");
|
||||
_ping_snr_out_str[0] = '\0';
|
||||
_ping_snr_back_str[0] = '\0';
|
||||
|
||||
@@ -1036,8 +1036,8 @@ public:
|
||||
return enter;
|
||||
}
|
||||
if (_selected == TX_POWER && p) {
|
||||
if (right && p->tx_power_dbm < 22) { p->tx_power_dbm++; _task->applyTxPower(); _dirty = true; return true; }
|
||||
if (left && p->tx_power_dbm > 2) { p->tx_power_dbm--; _task->applyTxPower(); _dirty = true; return true; }
|
||||
if (right && p->tx_power_dbm < radioctl::TX_MAX_DBM) { p->tx_power_dbm++; _task->applyTxPower(); _dirty = true; return true; }
|
||||
if (left && p->tx_power_dbm > radioctl::TX_MIN_DBM) { p->tx_power_dbm--; _task->applyTxPower(); _dirty = true; return true; }
|
||||
}
|
||||
if (_selected == RADIO_PRESET && p && enter) {
|
||||
_picker.open(p, radioTarget(p), "Radio Preset");
|
||||
|
||||
@@ -356,10 +356,9 @@ void UITask::gotoAutoAdvertScreen() { setCurrScreen(auto_advert_screen); }
|
||||
void UITask::gotoBatteryCurve() { setCurrScreen(batt_curve_screen); }
|
||||
|
||||
bool UITask::startPing(const uint8_t* pub_key) {
|
||||
PingEngine::StartResult r = _core->ping.start(pub_key);
|
||||
if (r == PingEngine::UNSUPPORTED) showAlert("Ping not supported with 3-byte path hashes", 3000);
|
||||
return r == PingEngine::STARTED;
|
||||
return _core->ping.start(pub_key) == PingEngine::STARTED;
|
||||
}
|
||||
uint32_t UITask::pingTimeoutMs() const { return _core->ping.timeoutMs(); }
|
||||
bool UITask::isPingActive() const { return _core->ping.isActive(); }
|
||||
void UITask::getPingResult(int16_t& snr_out_x4, int16_t& snr_back_x4, uint32_t& rtt_ms) const {
|
||||
_core->ping.getResult(snr_out_x4, snr_back_x4, rtt_ms);
|
||||
|
||||
@@ -473,6 +473,7 @@ public:
|
||||
// Ping helpers (engine in ui-core/PingEngine.h)
|
||||
bool startPing(const uint8_t* pub_key);
|
||||
bool isPingActive() const;
|
||||
uint32_t pingTimeoutMs() const;
|
||||
void getPingResult(int16_t& snr_out_x4, int16_t& snr_back_x4, uint32_t& rtt_ms) const;
|
||||
void clearPing();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user