| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- #include <Arduino.h> // needed for PlatformIO
- #include <Mesh.h>
- #include "MyMesh.h"
- // Believe it or not, this std C function is busted on some platforms!
- static uint32_t _atoi(const char* sp) {
- uint32_t n = 0;
- while (*sp && *sp >= '0' && *sp <= '9') {
- n *= 10;
- n += (*sp++ - '0');
- }
- return n;
- }
- #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
- #include <InternalFileSystem.h>
- #if defined(QSPIFLASH)
- #include <CustomLFS_QSPIFlash.h>
- DataStore store(InternalFS, QSPIFlash, rtc_clock);
- #else
- #if defined(EXTRAFS)
- #include <CustomLFS.h>
- CustomLFS ExtraFS(0xD4000, 0x19000, 128);
- DataStore store(InternalFS, ExtraFS, rtc_clock);
- #else
- DataStore store(InternalFS, rtc_clock);
- #endif
- #endif
- #elif defined(RP2040_PLATFORM)
- #include <LittleFS.h>
- DataStore store(LittleFS, rtc_clock);
- #elif defined(ESP32)
- #include <SPIFFS.h>
- DataStore store(SPIFFS, rtc_clock);
- #endif
- #ifdef ESP32
- #ifdef WIFI_SSID
- #include <helpers/esp32/SerialWifiInterface.h>
- SerialWifiInterface serial_interface;
- #ifndef TCP_PORT
- #define TCP_PORT 5000
- #endif
- #elif defined(BLE_PIN_CODE)
- #include <helpers/esp32/SerialBLEInterface.h>
- SerialBLEInterface serial_interface;
- #elif defined(SERIAL_RX)
- #include <helpers/ArduinoSerialInterface.h>
- ArduinoSerialInterface serial_interface;
- HardwareSerial companion_serial(1);
- #else
- #include <helpers/ArduinoSerialInterface.h>
- ArduinoSerialInterface serial_interface;
- #endif
- #elif defined(RP2040_PLATFORM)
- //#ifdef WIFI_SSID
- // #include <helpers/rp2040/SerialWifiInterface.h>
- // SerialWifiInterface serial_interface;
- // #ifndef TCP_PORT
- // #define TCP_PORT 5000
- // #endif
- // #elif defined(BLE_PIN_CODE)
- // #include <helpers/rp2040/SerialBLEInterface.h>
- // SerialBLEInterface serial_interface;
- #if defined(SERIAL_RX)
- #include <helpers/ArduinoSerialInterface.h>
- ArduinoSerialInterface serial_interface;
- HardwareSerial companion_serial(1);
- #else
- #include <helpers/ArduinoSerialInterface.h>
- ArduinoSerialInterface serial_interface;
- #endif
- #elif defined(NRF52_PLATFORM)
- #ifdef BLE_PIN_CODE
- #include <helpers/nrf52/SerialBLEInterface.h>
- SerialBLEInterface serial_interface;
- #else
- #include <helpers/ArduinoSerialInterface.h>
- ArduinoSerialInterface serial_interface;
- #endif
- #elif defined(STM32_PLATFORM)
- #include <helpers/ArduinoSerialInterface.h>
- ArduinoSerialInterface serial_interface;
- #else
- #error "need to define a serial interface"
- #endif
- /* GLOBAL OBJECTS */
- #ifdef DISPLAY_CLASS
- #include "UITask.h"
- UITask ui_task(&board, &serial_interface);
- #endif
- StdRNG fast_rng;
- SimpleMeshTables tables;
- MyMesh the_mesh(radio_driver, fast_rng, rtc_clock, tables, store
- #ifdef DISPLAY_CLASS
- , &ui_task
- #endif
- );
- /* END GLOBAL OBJECTS */
- void halt() {
- while (1) ;
- }
- /* WIFI RECONNECT TRACKERS */
- #if defined(ESP32) && defined(WIFI_SSID)
- bool wifi_needs_reconnect = false;
- unsigned long last_wifi_reconnect_attempt = 0;
- #endif
- void setup() {
- Serial.begin(115200);
- board.begin();
- #ifdef DISPLAY_CLASS
- DisplayDriver* disp = NULL;
- if (display.begin()) {
- disp = &display;
- disp->startFrame();
- #ifdef ST7789
- disp->setTextSize(2);
- #endif
- disp->drawTextCentered(disp->width() / 2, 28, "Loading...");
- disp->endFrame();
- }
- #endif
- if (!radio_init()) { halt(); }
- fast_rng.begin(radio_driver.getRngSeed());
- #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
- InternalFS.begin();
- #if defined(QSPIFLASH)
- if (!QSPIFlash.begin()) {
- // debug output might not be available at this point, might be too early. maybe should fall back to InternalFS here?
- MESH_DEBUG_PRINTLN("CustomLFS_QSPIFlash: failed to initialize");
- } else {
- MESH_DEBUG_PRINTLN("CustomLFS_QSPIFlash: initialized successfully");
- }
- #else
- #if defined(EXTRAFS)
- ExtraFS.begin();
- #endif
- #endif
- store.begin();
- the_mesh.begin(
- #ifdef DISPLAY_CLASS
- disp != NULL
- #else
- false
- #endif
- );
- #ifdef BLE_PIN_CODE
- serial_interface.begin(BLE_NAME_PREFIX, the_mesh.getNodePrefs()->node_name, the_mesh.getBLEPin());
- #else
- serial_interface.begin(Serial);
- #endif
- the_mesh.startInterface(serial_interface);
- #elif defined(RP2040_PLATFORM)
- LittleFS.begin();
- store.begin();
- the_mesh.begin(
- #ifdef DISPLAY_CLASS
- disp != NULL
- #else
- false
- #endif
- );
- //#ifdef WIFI_SSID
- // WiFi.begin(WIFI_SSID, WIFI_PWD);
- // serial_interface.begin(TCP_PORT);
- // #elif defined(BLE_PIN_CODE)
- // char dev_name[32+16];
- // sprintf(dev_name, "%s%s", BLE_NAME_PREFIX, the_mesh.getNodeName());
- // serial_interface.begin(dev_name, the_mesh.getBLEPin());
- #if defined(SERIAL_RX)
- companion_serial.setPins(SERIAL_RX, SERIAL_TX);
- companion_serial.begin(115200);
- serial_interface.begin(companion_serial);
- #else
- serial_interface.begin(Serial);
- #endif
- the_mesh.startInterface(serial_interface);
- #elif defined(ESP32)
- SPIFFS.begin(true);
- store.begin();
- the_mesh.begin(
- #ifdef DISPLAY_CLASS
- disp != NULL
- #else
- false
- #endif
- );
- #ifdef WIFI_SSID
- board.setInhibitSleep(true); // prevent sleep when WiFi is active
- WiFi.setAutoReconnect(true);
- WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info){
- if (event == ARDUINO_EVENT_WIFI_STA_DISCONNECTED) {
- WIFI_DEBUG_PRINTLN("WiFi disconnected. Flagging for reconnect...");
- wifi_needs_reconnect = true;
- } else if (event == ARDUINO_EVENT_WIFI_STA_GOT_IP) {
- WIFI_DEBUG_PRINTLN("WiFi connected successfully!");
- wifi_needs_reconnect = false;
- }
- });
- WiFi.begin(WIFI_SSID, WIFI_PWD);
- serial_interface.begin(TCP_PORT);
- #elif defined(BLE_PIN_CODE)
- serial_interface.begin(BLE_NAME_PREFIX, the_mesh.getNodePrefs()->node_name, the_mesh.getBLEPin());
- #elif defined(SERIAL_RX)
- companion_serial.setPins(SERIAL_RX, SERIAL_TX);
- companion_serial.begin(115200);
- serial_interface.begin(companion_serial);
- #else
- serial_interface.begin(Serial);
- #endif
- the_mesh.startInterface(serial_interface);
- #else
- #error "need to define filesystem"
- #endif
- sensors.begin();
- #if ENV_INCLUDE_GPS == 1
- the_mesh.applyGpsPrefs();
- #endif
- #ifdef DISPLAY_CLASS
- ui_task.begin(disp, &sensors, the_mesh.getNodePrefs()); // still want to pass this in as dependency, as prefs might be moved
- #endif
- board.onBootComplete();
- }
- void loop() {
- the_mesh.loop();
- sensors.loop();
- #ifdef DISPLAY_CLASS
- ui_task.loop();
- #endif
- rtc_clock.tick();
- if (!the_mesh.hasPendingWork()) {
- #if defined(NRF52_PLATFORM)
- board.sleep(0); // nrf ignores seconds param, sleeps whenever possible
- #endif
- }
- #if defined(ESP32) && defined(WIFI_SSID)
- // Safely attempt to reconnect every 10 seconds if flagged
- if (wifi_needs_reconnect && (millis() - last_wifi_reconnect_attempt > 10000)) {
- WIFI_DEBUG_PRINTLN("Attempting manual WiFi reconnect...");
- WiFi.disconnect();
- WiFi.reconnect();
- last_wifi_reconnect_attempt = millis();
- }
- #endif
- }
|