main.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. #include <Arduino.h> // needed for PlatformIO
  2. #include <Mesh.h>
  3. #include "MyMesh.h"
  4. // Believe it or not, this std C function is busted on some platforms!
  5. static uint32_t _atoi(const char* sp) {
  6. uint32_t n = 0;
  7. while (*sp && *sp >= '0' && *sp <= '9') {
  8. n *= 10;
  9. n += (*sp++ - '0');
  10. }
  11. return n;
  12. }
  13. #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
  14. #include <InternalFileSystem.h>
  15. #if defined(QSPIFLASH)
  16. #include <CustomLFS_QSPIFlash.h>
  17. DataStore store(InternalFS, QSPIFlash, rtc_clock);
  18. #else
  19. #if defined(EXTRAFS)
  20. #include <CustomLFS.h>
  21. CustomLFS ExtraFS(0xD4000, 0x19000, 128);
  22. DataStore store(InternalFS, ExtraFS, rtc_clock);
  23. #else
  24. DataStore store(InternalFS, rtc_clock);
  25. #endif
  26. #endif
  27. #elif defined(RP2040_PLATFORM)
  28. #include <LittleFS.h>
  29. DataStore store(LittleFS, rtc_clock);
  30. #elif defined(ESP32)
  31. #include <SPIFFS.h>
  32. DataStore store(SPIFFS, rtc_clock);
  33. #endif
  34. #ifdef ESP32
  35. #ifdef WIFI_SSID
  36. #include <helpers/esp32/SerialWifiInterface.h>
  37. SerialWifiInterface serial_interface;
  38. #ifndef TCP_PORT
  39. #define TCP_PORT 5000
  40. #endif
  41. #elif defined(BLE_PIN_CODE)
  42. #include <helpers/esp32/SerialBLEInterface.h>
  43. SerialBLEInterface serial_interface;
  44. #elif defined(SERIAL_RX)
  45. #include <helpers/ArduinoSerialInterface.h>
  46. ArduinoSerialInterface serial_interface;
  47. HardwareSerial companion_serial(1);
  48. #else
  49. #include <helpers/ArduinoSerialInterface.h>
  50. ArduinoSerialInterface serial_interface;
  51. #endif
  52. #elif defined(RP2040_PLATFORM)
  53. //#ifdef WIFI_SSID
  54. // #include <helpers/rp2040/SerialWifiInterface.h>
  55. // SerialWifiInterface serial_interface;
  56. // #ifndef TCP_PORT
  57. // #define TCP_PORT 5000
  58. // #endif
  59. // #elif defined(BLE_PIN_CODE)
  60. // #include <helpers/rp2040/SerialBLEInterface.h>
  61. // SerialBLEInterface serial_interface;
  62. #if defined(SERIAL_RX)
  63. #include <helpers/ArduinoSerialInterface.h>
  64. ArduinoSerialInterface serial_interface;
  65. HardwareSerial companion_serial(1);
  66. #else
  67. #include <helpers/ArduinoSerialInterface.h>
  68. ArduinoSerialInterface serial_interface;
  69. #endif
  70. #elif defined(NRF52_PLATFORM)
  71. #ifdef BLE_PIN_CODE
  72. #include <helpers/nrf52/SerialBLEInterface.h>
  73. SerialBLEInterface serial_interface;
  74. #else
  75. #include <helpers/ArduinoSerialInterface.h>
  76. ArduinoSerialInterface serial_interface;
  77. #endif
  78. #elif defined(STM32_PLATFORM)
  79. #include <helpers/ArduinoSerialInterface.h>
  80. ArduinoSerialInterface serial_interface;
  81. #else
  82. #error "need to define a serial interface"
  83. #endif
  84. /* GLOBAL OBJECTS */
  85. #ifdef DISPLAY_CLASS
  86. #include "UITask.h"
  87. UITask ui_task(&board, &serial_interface);
  88. #endif
  89. StdRNG fast_rng;
  90. SimpleMeshTables tables;
  91. MyMesh the_mesh(radio_driver, fast_rng, rtc_clock, tables, store
  92. #ifdef DISPLAY_CLASS
  93. , &ui_task
  94. #endif
  95. );
  96. /* END GLOBAL OBJECTS */
  97. void halt() {
  98. while (1) ;
  99. }
  100. /* WIFI RECONNECT TRACKERS */
  101. #if defined(ESP32) && defined(WIFI_SSID)
  102. bool wifi_needs_reconnect = false;
  103. unsigned long last_wifi_reconnect_attempt = 0;
  104. #endif
  105. void setup() {
  106. Serial.begin(115200);
  107. board.begin();
  108. #ifdef DISPLAY_CLASS
  109. DisplayDriver* disp = NULL;
  110. if (display.begin()) {
  111. disp = &display;
  112. disp->startFrame();
  113. #ifdef ST7789
  114. disp->setTextSize(2);
  115. #endif
  116. disp->drawTextCentered(disp->width() / 2, 28, "Loading...");
  117. disp->endFrame();
  118. }
  119. #endif
  120. if (!radio_init()) { halt(); }
  121. fast_rng.begin(radio_driver.getRngSeed());
  122. #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
  123. InternalFS.begin();
  124. #if defined(QSPIFLASH)
  125. if (!QSPIFlash.begin()) {
  126. // debug output might not be available at this point, might be too early. maybe should fall back to InternalFS here?
  127. MESH_DEBUG_PRINTLN("CustomLFS_QSPIFlash: failed to initialize");
  128. } else {
  129. MESH_DEBUG_PRINTLN("CustomLFS_QSPIFlash: initialized successfully");
  130. }
  131. #else
  132. #if defined(EXTRAFS)
  133. ExtraFS.begin();
  134. #endif
  135. #endif
  136. store.begin();
  137. the_mesh.begin(
  138. #ifdef DISPLAY_CLASS
  139. disp != NULL
  140. #else
  141. false
  142. #endif
  143. );
  144. #ifdef BLE_PIN_CODE
  145. serial_interface.begin(BLE_NAME_PREFIX, the_mesh.getNodePrefs()->node_name, the_mesh.getBLEPin());
  146. #else
  147. serial_interface.begin(Serial);
  148. #endif
  149. the_mesh.startInterface(serial_interface);
  150. #elif defined(RP2040_PLATFORM)
  151. LittleFS.begin();
  152. store.begin();
  153. the_mesh.begin(
  154. #ifdef DISPLAY_CLASS
  155. disp != NULL
  156. #else
  157. false
  158. #endif
  159. );
  160. //#ifdef WIFI_SSID
  161. // WiFi.begin(WIFI_SSID, WIFI_PWD);
  162. // serial_interface.begin(TCP_PORT);
  163. // #elif defined(BLE_PIN_CODE)
  164. // char dev_name[32+16];
  165. // sprintf(dev_name, "%s%s", BLE_NAME_PREFIX, the_mesh.getNodeName());
  166. // serial_interface.begin(dev_name, the_mesh.getBLEPin());
  167. #if defined(SERIAL_RX)
  168. companion_serial.setPins(SERIAL_RX, SERIAL_TX);
  169. companion_serial.begin(115200);
  170. serial_interface.begin(companion_serial);
  171. #else
  172. serial_interface.begin(Serial);
  173. #endif
  174. the_mesh.startInterface(serial_interface);
  175. #elif defined(ESP32)
  176. SPIFFS.begin(true);
  177. store.begin();
  178. the_mesh.begin(
  179. #ifdef DISPLAY_CLASS
  180. disp != NULL
  181. #else
  182. false
  183. #endif
  184. );
  185. #ifdef WIFI_SSID
  186. board.setInhibitSleep(true); // prevent sleep when WiFi is active
  187. WiFi.setAutoReconnect(true);
  188. WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info){
  189. if (event == ARDUINO_EVENT_WIFI_STA_DISCONNECTED) {
  190. WIFI_DEBUG_PRINTLN("WiFi disconnected. Flagging for reconnect...");
  191. wifi_needs_reconnect = true;
  192. } else if (event == ARDUINO_EVENT_WIFI_STA_GOT_IP) {
  193. WIFI_DEBUG_PRINTLN("WiFi connected successfully!");
  194. wifi_needs_reconnect = false;
  195. }
  196. });
  197. WiFi.begin(WIFI_SSID, WIFI_PWD);
  198. serial_interface.begin(TCP_PORT);
  199. #elif defined(BLE_PIN_CODE)
  200. serial_interface.begin(BLE_NAME_PREFIX, the_mesh.getNodePrefs()->node_name, the_mesh.getBLEPin());
  201. #elif defined(SERIAL_RX)
  202. companion_serial.setPins(SERIAL_RX, SERIAL_TX);
  203. companion_serial.begin(115200);
  204. serial_interface.begin(companion_serial);
  205. #else
  206. serial_interface.begin(Serial);
  207. #endif
  208. the_mesh.startInterface(serial_interface);
  209. #else
  210. #error "need to define filesystem"
  211. #endif
  212. sensors.begin();
  213. #if ENV_INCLUDE_GPS == 1
  214. the_mesh.applyGpsPrefs();
  215. #endif
  216. #ifdef DISPLAY_CLASS
  217. ui_task.begin(disp, &sensors, the_mesh.getNodePrefs()); // still want to pass this in as dependency, as prefs might be moved
  218. #endif
  219. board.onBootComplete();
  220. }
  221. void loop() {
  222. the_mesh.loop();
  223. sensors.loop();
  224. #ifdef DISPLAY_CLASS
  225. ui_task.loop();
  226. #endif
  227. rtc_clock.tick();
  228. if (!the_mesh.hasPendingWork()) {
  229. #if defined(NRF52_PLATFORM)
  230. board.sleep(0); // nrf ignores seconds param, sleeps whenever possible
  231. #endif
  232. }
  233. #if defined(ESP32) && defined(WIFI_SSID)
  234. // Safely attempt to reconnect every 10 seconds if flagged
  235. if (wifi_needs_reconnect && (millis() - last_wifi_reconnect_attempt > 10000)) {
  236. WIFI_DEBUG_PRINTLN("Attempting manual WiFi reconnect...");
  237. WiFi.disconnect();
  238. WiFi.reconnect();
  239. last_wifi_reconnect_attempt = millis();
  240. }
  241. #endif
  242. }