SmartCAD p1

This commit is contained in:
liquidraver committed 2026-07-12 10:48:37 +02:00
1 parent 0d70256d2e
commit dc1239537e
36 files changed
+1154 -24

No files matched your search

+8
View File
@@ -353,6 +353,14 @@ protected:
uint8_t getDutyCyclePercent() const override;
uint8_t getExtraAckTransmitCount() const override;
/* Adaptive CAD: persist the staircase's learned offset */
void onCadOffsetChanged(int8_t offset) override {
prefs.cad_offset = offset;
if (_store) {
_store->savePrefs(prefs);
}
}
/* Auto-add filtering overrides */
bool isAutoAddEnabled() const override;
bool shouldAutoAddContactType(uint8_t type) const override;
+12
View File
@@ -203,6 +203,11 @@ bool RepeaterDataStore::loadPrefs(NodePrefs& prefs) {
fs_read(&file, &prefs.flood_max_advert, sizeof(prefs.flood_max_advert));
/* Mesh time sync (absent in <297-byte files; no-op EOF read keeps default 0 = off) */
fs_read(&file, &prefs.meshtimesync, sizeof(prefs.meshtimesync));
/* Adaptive CAD (absent in <300-byte files; no-op EOF reads keep defaults
* auto=0, offset=0, probe_interval=60) */
fs_read(&file, &prefs.cad_auto, sizeof(prefs.cad_auto));
fs_read(&file, &prefs.cad_offset, sizeof(prefs.cad_offset));
fs_read(&file, &prefs.cad_probe_interval, sizeof(prefs.cad_probe_interval));
fs_close(&file);
@@ -234,6 +239,9 @@ bool RepeaterDataStore::loadPrefs(NodePrefs& prefs) {
if (prefs.apc_enabled > 1) prefs.apc_enabled = 0;
if (prefs.apc_margin < 6 || prefs.apc_margin > 30) prefs.apc_margin = 16;
if (prefs.meshtimesync > 1) prefs.meshtimesync = 0;
if (prefs.cad_auto > 1) prefs.cad_auto = 0;
if (prefs.cad_offset < -4 || prefs.cad_offset > 4) prefs.cad_offset = 0;
if (prefs.cad_probe_interval != 0 && prefs.cad_probe_interval < 10) prefs.cad_probe_interval = 10;
/* One-time format upgrade: old files (< 294 bytes) never saved the ZephCore
* extension fields, and stored path_hash_mode/loop_detect as zero padding.
@@ -333,6 +341,10 @@ bool RepeaterDataStore::savePrefs(const NodePrefs& prefs) {
fs_write(&file, &prefs.flood_max_advert, sizeof(prefs.flood_max_advert));
/* Mesh time sync on/off (offset 296) */
fs_write(&file, &prefs.meshtimesync, sizeof(prefs.meshtimesync));
/* Adaptive CAD (offsets 297-299) */
fs_write(&file, &prefs.cad_auto, sizeof(prefs.cad_auto));
fs_write(&file, &prefs.cad_offset, sizeof(prefs.cad_offset));
fs_write(&file, &prefs.cad_probe_interval, sizeof(prefs.cad_probe_interval));
ret = fs_sync(&file);
fs_close(&file);
+18
View File
@@ -179,6 +179,24 @@ protected:
return _prefs.multi_acks;
}
/* Adaptive CAD */
int formatCadStatus(char* buf, int cap) override {
return _radio->formatCadStatus(buf, cap);
}
void applyCadPrefs() override {
_radio->setCadParams(_prefs.cad_auto != 0, _prefs.cad_offset,
_prefs.cad_probe_interval);
}
void resetCadStats() override {
_radio->resetCadStats();
}
void onCadOffsetChanged(int8_t offset) override {
/* Staircase steps are hours apart — persisting immediately is
* fine for flash wear and survives unexpected reboots. */
_prefs.cad_offset = offset;
savePrefs();
}
mesh::DispatcherAction onRecvPacket(mesh::Packet* pkt) override;
void onAnonDataRecv(mesh::Packet* packet, const uint8_t* secret, const mesh::Identity& sender, uint8_t* data, size_t len) override;
+16
View File
@@ -148,6 +148,22 @@ protected:
return _prefs.multi_acks;
}
/* Adaptive CAD */
int formatCadStatus(char* buf, int cap) override {
return _radio->formatCadStatus(buf, cap);
}
void applyCadPrefs() override {
_radio->setCadParams(_prefs.cad_auto != 0, _prefs.cad_offset,
_prefs.cad_probe_interval);
}
void resetCadStats() override {
_radio->resetCadStats();
}
void onCadOffsetChanged(int8_t offset) override {
_prefs.cad_offset = offset;
savePrefs();
}
mesh::DispatcherAction onRecvPacket(mesh::Packet* pkt) override;
void onAdvertRecv(mesh::Packet* packet, const mesh::Identity& id, uint32_t timestamp, const uint8_t* app_data, size_t app_data_len) override;