Refresh AP safety fixture for ESP-NOW diagnostics

This commit is contained in:
mikecarper committed 2026-10-22 16:03:09 -07:00
1 parent 8da70b84d0
commit 52a36c89dc
1 file changed
+10 -3
+10 -3
View File
@@ -18,13 +18,16 @@ public:
int _tx_callback_status=0,_tx_dropped=0,_tx_dropped_reported=0;
uint32_t _tx_started_at=0,_tx_retry_at=0;
bool _sdk_teardown_failed=false;
mesh::bridge::diag::Stats _stats;
std::atomic<bool> _debug_dirty{false};
mesh::espnow::ESPNowRawReassembler _raw_reassembler;
struct QueuedTransmit {bool started=false;int packet=0;};
struct QueuedTransmit {bool started=false,diagnostic=false;int packet=0;};
static constexpr int TX_QUEUE_DEPTH=2;
QueuedTransmit _tx_queue[TX_QUEUE_DEPTH];
struct {void clear(const int*){}} _seen_packets;
static void recv_cb(){}static void send_cb(){}
void begin();void end();
void recordError(mesh::bridge::diag::Stage,int32_t);void emitDebug();
};
"""
WEB_CLASS = r"""
@@ -75,6 +78,8 @@ int main(int argc,char** argv){
Bridge bridge;sdk_mode=WIFI_AP_STA;WiFi.facade_started=false;
assert(mesh::wifi::accessPointCompatibleWithLongRange());
bridge.begin();assert(!bridge._initialized&&!sdk_active&&init_calls==0);
assert(bridge._stats.error.stage==mesh::bridge::diag::Stage::WiFiProtocol);
assert(bridge._stats.error.code==ESP_ERR_INVALID_STATE&&bridge._debug_dirty.load());
assert(sdk_mode==WIFI_AP_STA&&station_writes==0&&storage_writes==0);check_ap();
// Saved raw intent is unchanged; the normal retry can start after AP stops.
sdk_mode=WIFI_STA;bridge.begin();
@@ -174,7 +179,8 @@ def build_and_run(scenario, *, mutation=None, full=True):
bridge_source = (ROOT / 'src/helpers/bridges/ESPNowBridge.cpp').read_text()
bridge = method(bridge_source, 'static void stopBridgeWiFiIfUnused(') + '\n'
bridge += '\n'.join(method(bridge_source, f'void ESPNowBridge::{name}(')
.replace('ESPNowBridge::', 'Bridge::') for name in ('begin', 'end'))
.replace('ESPNowBridge::', 'Bridge::')
for name in ('begin', 'end', 'recordError', 'emitDebug'))
stop = method((ROOT / 'src/helpers/esp32/WiFiAccessPointPolicy.h').read_text(),
'inline void stopTemporaryAccessPointRadio(')
web_source = (ROOT / 'src/helpers/esp32/WebConfigServer.cpp').read_text()
@@ -209,7 +215,8 @@ def build_and_run(scenario, *, mutation=None, full=True):
for name in ('esp_err.h', 'esp_wifi.h', 'WiFi.h', 'Preferences.h'):
(folder / name).write_text('#pragma once\n')
fixture = (ROOT / 'test/fixtures/wifi_ap_shared_lr_sdk.h').read_text()
source = fixture + '\n#include <helpers/esp32/WiFiRadioPolicy.h>\n'
source = fixture + '\n#include <atomic>\n#include <helpers/bridges/ESPNowBridgeDiagnostics.h>\n'
source += 'constexpr int ESP_ERR_INVALID_ARG=-4;\n#include <helpers/esp32/WiFiRadioPolicy.h>\n'
source += '#include <helpers/esp32/WiFiStationPolicy.h>\n'
source += 'namespace mesh {namespace wifi {\n' + stop + '\n}}\n'
web = WEB_CLASS.replace('@PROMOTE@', promotion).replace('@IDLE@', idle)