Add WiFi companion support for Pico W

SerialWifiInterface has no ESP32-specific code, so move it to
helpers/wifi and reuse it on RP2040. Guard the ESP32-only WiFi
event/auto-reconnect calls and poll link state on RP2040 instead.
This commit is contained in:
Michael Graff
2026-09-05 23:15:13 -05:00
parent 65aa1138ae
commit 0b2c47a932
5 changed files with 34 additions and 21 deletions
+17 -7
View File
@@ -36,9 +36,8 @@ MultiSerialInterface interface_manager;
#ifndef TCP_PORT #ifndef TCP_PORT
#define TCP_PORT 5000 #define TCP_PORT 5000
#endif #endif
#ifdef ESP32 #if defined(ESP32) || defined(RP2040_PLATFORM)
// include esp32 wifi interface #include <helpers/wifi/SerialWifiInterface.h>
#include <helpers/esp32/SerialWifiInterface.h>
SerialWifiInterface wifi_interface; SerialWifiInterface wifi_interface;
#else #else
#error "SerialWifiInterface is not defined for this platform" #error "SerialWifiInterface is not defined for this platform"
@@ -108,7 +107,7 @@ void halt() {
} }
/* WIFI RECONNECT TRACKERS */ /* WIFI RECONNECT TRACKERS */
#if defined(ESP32) && defined(WIFI_SSID) #ifdef WIFI_SSID
bool wifi_needs_reconnect = false; bool wifi_needs_reconnect = false;
unsigned long last_wifi_reconnect_attempt = 0; unsigned long last_wifi_reconnect_attempt = 0;
#endif #endif
@@ -192,6 +191,7 @@ void setup() {
// add wifi interface // add wifi interface
#ifdef WIFI_SSID #ifdef WIFI_SSID
#if defined(ESP32)
board.setInhibitSleep(true); // prevent sleep when WiFi is active board.setInhibitSleep(true); // prevent sleep when WiFi is active
WiFi.setAutoReconnect(true); WiFi.setAutoReconnect(true);
@@ -204,6 +204,7 @@ void setup() {
wifi_needs_reconnect = false; wifi_needs_reconnect = false;
} }
}); });
#endif
WiFi.begin(WIFI_SSID, WIFI_PWD); WiFi.begin(WIFI_SSID, WIFI_PWD);
wifi_interface.begin(TCP_PORT); wifi_interface.begin(TCP_PORT);
@@ -262,12 +263,21 @@ void loop() {
#endif #endif
} }
#if defined(ESP32) && defined(WIFI_SSID) #ifdef WIFI_SSID
// RP2040 has no WiFi event callbacks, so poll the link state instead
#if defined(RP2040_PLATFORM)
wifi_needs_reconnect = (WiFi.status() != WL_CONNECTED);
#endif
// Safely attempt to reconnect every 10 seconds if flagged // Safely attempt to reconnect every 10 seconds if flagged
if (wifi_needs_reconnect && (millis() - last_wifi_reconnect_attempt > 10000)) { if (wifi_needs_reconnect && (millis() - last_wifi_reconnect_attempt > 10000)) {
WIFI_DEBUG_PRINTLN("Attempting manual WiFi reconnect..."); WIFI_DEBUG_PRINTLN("Attempting manual WiFi reconnect...");
WiFi.disconnect(); #if defined(RP2040_PLATFORM)
WiFi.reconnect(); WiFi.begin(WIFI_SSID, WIFI_PWD); // no reconnect() on this platform
#else
WiFi.disconnect();
WiFi.reconnect();
#endif
last_wifi_reconnect_attempt = millis(); last_wifi_reconnect_attempt = millis();
} }
#endif #endif
+1
View File
@@ -64,6 +64,7 @@ build_flags = ${arduino_base.build_flags}
-D ESP32_PLATFORM -D ESP32_PLATFORM
; -D ESP32_CPU_FREQ=80 ; change it to your need ; -D ESP32_CPU_FREQ=80 ; change it to your need
build_src_filter = ${arduino_base.build_src_filter} build_src_filter = ${arduino_base.build_src_filter}
+<helpers/wifi/*.cpp>
[esp32_ota] [esp32_ota]
lib_deps = lib_deps =
+16 -14
View File
@@ -81,20 +81,22 @@ lib_ignore = BLE
; lib_deps = ${rpi_picow.lib_deps} ; lib_deps = ${rpi_picow.lib_deps}
; densaugeo/base64 @ ~1.4.0 ; densaugeo/base64 @ ~1.4.0
; [env:PicoW_companion_radio_wifi] [env:PicoW_companion_radio_wifi]
; extends = rpi_picow extends = rpi_picow
; build_flags = ${rpi_picow.build_flags} build_flags = ${rpi_picow.build_flags}
; -D MAX_CONTACTS=100 -D MAX_CONTACTS=100
; -D MAX_GROUP_CHANNELS=8 -D MAX_GROUP_CHANNELS=8
; -D WIFI_DEBUG_LOGGING=1 -D WIFI_DEBUG_LOGGING=1
; -D WIFI_SSID='"myssid"' -D WIFI_SSID='"myssid"'
; -D WIFI_PWD='"mypwd"' -D WIFI_PWD='"mypwd"'
; ; -D MESH_PACKET_LOGGING=1 ; -D MESH_PACKET_LOGGING=1
; ; -D MESH_DEBUG=1 ; -D MESH_DEBUG=1
; build_src_filter = ${rpi_picow.build_src_filter} build_src_filter = ${rpi_picow.build_src_filter}
; +<../examples/companion_radio/*.cpp> +<helpers/wifi/*.cpp>
; lib_deps = ${rpi_picow.lib_deps} +<../examples/companion_radio/*.cpp>
; densaugeo/base64 @ ~1.4.0 lib_deps = ${rpi_picow.lib_deps}
densaugeo/base64 @ ~1.4.0
lib_ignore = BLE
[env:PicoW_terminal_chat] [env:PicoW_terminal_chat]
extends = rpi_picow extends = rpi_picow