| 
									
										
										
										
											2021-03-15 02:00:20 +00:00
										 |  |  | #include "GPS.h"
 | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  | #include "MeshRadio.h"
 | 
					
						
							| 
									
										
										
										
											2020-02-02 20:45:32 +00:00
										 |  |  | #include "MeshService.h"
 | 
					
						
							| 
									
										
										
										
											2020-02-08 04:59:21 +00:00
										 |  |  | #include "NodeDB.h"
 | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  | #include "PowerFSM.h"
 | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  | #include "ReliableRouter.h"
 | 
					
						
							| 
									
										
										
										
											2020-12-27 06:39:43 +00:00
										 |  |  | #include "airtime.h"
 | 
					
						
							| 
									
										
										
										
											2021-03-15 02:00:20 +00:00
										 |  |  | #include "buzz.h"
 | 
					
						
							| 
									
										
										
										
											2022-05-07 10:31:21 +00:00
										 |  |  | #include "configuration.h"
 | 
					
						
							| 
									
										
										
										
											2020-04-14 18:40:49 +00:00
										 |  |  | #include "error.h"
 | 
					
						
							| 
									
										
										
										
											2020-03-26 16:24:53 +00:00
										 |  |  | #include "power.h"
 | 
					
						
							| 
									
										
										
										
											2020-07-10 02:57:55 +00:00
										 |  |  | // #include "debug.h"
 | 
					
						
							| 
									
										
										
										
											2020-11-19 01:25:02 +00:00
										 |  |  | #include "FSCommon.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-07 23:28:57 +00:00
										 |  |  | #include "RTC.h"
 | 
					
						
							| 
									
										
										
										
											2020-08-29 00:38:23 +00:00
										 |  |  | #include "SPILock.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-10 00:28:00 +00:00
										 |  |  | #include "concurrency/OSThread.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-09 06:16:51 +00:00
										 |  |  | #include "concurrency/Periodic.h"
 | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  | #include "detect/ScanI2C.h"
 | 
					
						
							|  |  |  | #include "detect/ScanI2CTwoWire.h"
 | 
					
						
							| 
									
										
										
										
											2022-08-10 09:31:29 +00:00
										 |  |  | #include "detect/axpDebug.h"
 | 
					
						
							|  |  |  | #include "detect/einkScan.h"
 | 
					
						
							| 
									
										
										
										
											2020-07-07 08:46:49 +00:00
										 |  |  | #include "graphics/Screen.h"
 | 
					
						
							| 
									
										
										
										
											2020-07-08 01:33:33 +00:00
										 |  |  | #include "main.h"
 | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  | #include "mesh/generated/meshtastic/config.pb.h"
 | 
					
						
							| 
									
										
										
										
											2022-02-27 08:18:35 +00:00
										 |  |  | #include "modules/Modules.h"
 | 
					
						
							| 
									
										
										
										
											2022-02-28 21:19:38 +00:00
										 |  |  | #include "shutdown.h"
 | 
					
						
							| 
									
										
										
										
											2022-05-07 10:31:21 +00:00
										 |  |  | #include "sleep.h"
 | 
					
						
							| 
									
										
										
										
											2020-09-06 16:24:08 +00:00
										 |  |  | #include "target_specific.h"
 | 
					
						
							| 
									
										
										
										
											2020-07-01 17:08:38 +00:00
										 |  |  | #include <Wire.h>
 | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  | #include <memory>
 | 
					
						
							| 
									
										
										
										
											2020-04-15 03:22:27 +00:00
										 |  |  | // #include <driver/rtc_io.h>
 | 
					
						
							| 
									
										
										
										
											2020-02-01 16:30:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-22 14:29:50 +00:00
										 |  |  | #include "mesh/eth/ethClient.h"
 | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  | #include "mesh/http/WiFiAPClient.h"
 | 
					
						
							| 
									
										
										
										
											2021-08-18 16:25:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #ifdef ARCH_ESP32
 | 
					
						
							| 
									
										
										
										
											2022-05-07 10:31:21 +00:00
										 |  |  | #include "mesh/http/WebServer.h"
 | 
					
						
							| 
									
										
										
										
											2022-08-22 21:41:23 +00:00
										 |  |  | #include "nimble/NimbleBluetooth.h"
 | 
					
						
							| 
									
										
										
										
											2023-02-03 14:50:10 +00:00
										 |  |  | NimbleBluetooth *nimbleBluetooth; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef ARCH_NRF52
 | 
					
						
							|  |  |  | #include "NRF52Bluetooth.h"
 | 
					
						
							|  |  |  | NRF52Bluetooth *nrf52Bluetooth; | 
					
						
							| 
									
										
										
										
											2020-04-10 19:18:48 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-04 18:56:44 +00:00
										 |  |  | #if HAS_WIFI
 | 
					
						
							| 
									
										
										
										
											2023-01-09 16:03:52 +00:00
										 |  |  | #include "mesh/api/WiFiServerAPI.h"
 | 
					
						
							| 
									
										
										
										
											2021-04-03 06:54:10 +00:00
										 |  |  | #include "mqtt/MQTT.h"
 | 
					
						
							| 
									
										
										
										
											2021-02-07 01:17:46 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-25 22:07:02 +00:00
										 |  |  | #if HAS_ETHERNET
 | 
					
						
							| 
									
										
										
										
											2023-01-09 16:03:52 +00:00
										 |  |  | #include "mesh/api/ethServerAPI.h"
 | 
					
						
							| 
									
										
										
										
											2022-10-25 22:07:02 +00:00
										 |  |  | #include "mqtt/MQTT.h"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-07 10:31:21 +00:00
										 |  |  | #include "LLCC68Interface.h"
 | 
					
						
							| 
									
										
										
										
											2020-06-17 00:01:50 +00:00
										 |  |  | #include "RF95Interface.h"
 | 
					
						
							|  |  |  | #include "SX1262Interface.h"
 | 
					
						
							| 
									
										
										
										
											2021-09-03 14:15:58 +00:00
										 |  |  | #include "SX1268Interface.h"
 | 
					
						
							| 
									
										
										
										
											2022-11-02 12:12:15 +00:00
										 |  |  | #include "SX1280Interface.h"
 | 
					
						
							| 
									
										
										
										
											2022-10-01 15:01:25 +00:00
										 |  |  | #if !HAS_RADIO && defined(ARCH_PORTDUINO)
 | 
					
						
							|  |  |  | #include "platform/portduino/SimRadio.h"
 | 
					
						
							| 
									
										
										
										
											2022-10-01 10:03:35 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-06-17 00:01:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #if HAS_BUTTON
 | 
					
						
							| 
									
										
										
										
											2022-03-01 18:40:21 +00:00
										 |  |  | #include "ButtonThread.h"
 | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2022-03-01 18:40:21 +00:00
										 |  |  | #include "PowerFSMThread.h"
 | 
					
						
							| 
									
										
										
										
											2020-06-17 00:01:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-23 16:32:04 +00:00
										 |  |  | #if !defined(ARCH_PORTDUINO)
 | 
					
						
							|  |  |  | #include "AccelerometerThread.h"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-10 01:57:57 +00:00
										 |  |  | using namespace concurrency; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-23 20:56:15 +00:00
										 |  |  | // We always create a screen object, but we only init it if we find the hardware
 | 
					
						
							| 
									
										
										
										
											2020-10-10 01:57:57 +00:00
										 |  |  | graphics::Screen *screen; | 
					
						
							| 
									
										
										
										
											2020-03-15 23:47:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-28 04:19:49 +00:00
										 |  |  | // Global power status
 | 
					
						
							| 
									
										
										
										
											2020-06-29 01:17:52 +00:00
										 |  |  | meshtastic::PowerStatus *powerStatus = new meshtastic::PowerStatus(); | 
					
						
							| 
									
										
										
										
											2020-06-28 04:19:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Global GPS status
 | 
					
						
							| 
									
										
										
										
											2020-06-29 01:17:52 +00:00
										 |  |  | meshtastic::GPSStatus *gpsStatus = new meshtastic::GPSStatus(); | 
					
						
							| 
									
										
										
										
											2020-06-28 04:19:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Global Node status
 | 
					
						
							| 
									
										
										
										
											2020-06-29 01:17:52 +00:00
										 |  |  | meshtastic::NodeStatus *nodeStatus = new meshtastic::NodeStatus(); | 
					
						
							| 
									
										
										
										
											2020-02-23 18:49:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  | // Scan for I2C Devices
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-23 10:00:43 +00:00
										 |  |  | /// The I2C address of our display (if found)
 | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  | ScanI2C::DeviceAddress screen_found = ScanI2C::ADDRESS_NONE; | 
					
						
							| 
									
										
										
										
											2020-10-23 10:00:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-13 13:56:52 +00:00
										 |  |  | // The I2C address of the cardkb or RAK14004 (if found)
 | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  | ScanI2C::DeviceAddress cardkb_found = ScanI2C::ADDRESS_NONE; | 
					
						
							| 
									
										
										
										
											2022-05-09 18:12:49 +00:00
										 |  |  | // 0x02 for RAK14004 and 0x00 for cardkb
 | 
					
						
							|  |  |  | uint8_t kb_model; | 
					
						
							| 
									
										
										
										
											2022-03-28 14:55:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-13 13:56:52 +00:00
										 |  |  | // The I2C address of the RTC Module (if found)
 | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  | ScanI2C::DeviceAddress rtc_found = ScanI2C::ADDRESS_NONE; | 
					
						
							| 
									
										
										
										
											2023-03-23 16:32:04 +00:00
										 |  |  | // The I2C address of the Accelerometer (if found)
 | 
					
						
							|  |  |  | ScanI2C::DeviceAddress accelerometer_found = ScanI2C::ADDRESS_NONE; | 
					
						
							| 
									
										
										
										
											2023-05-06 12:17:40 +00:00
										 |  |  | // The I2C address of the RGB LED (if found)
 | 
					
						
							|  |  |  | ScanI2C::FoundDevice rgb_found = ScanI2C::FoundDevice(ScanI2C::DeviceType::NONE, ScanI2C::ADDRESS_NONE); | 
					
						
							| 
									
										
										
										
											2022-11-13 13:56:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-19 01:24:18 +00:00
										 |  |  | #if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
 | 
					
						
							| 
									
										
										
										
											2022-10-13 10:55:28 +00:00
										 |  |  | ATECCX08A atecc; | 
					
						
							| 
									
										
										
										
											2022-10-13 11:01:24 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2022-10-13 10:55:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-25 05:13:41 +00:00
										 |  |  | bool eink_found = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-02 14:02:26 +00:00
										 |  |  | uint32_t serialSinceMsec; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-08 02:32:12 +00:00
										 |  |  | bool pmu_found; | 
					
						
							| 
									
										
										
										
											2020-02-23 18:49:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-05 14:50:06 +00:00
										 |  |  | // Array map of sensor types (as array index) and i2c address as value we'll find in the i2c scan
 | 
					
						
							| 
									
										
										
										
											2023-01-21 17:22:19 +00:00
										 |  |  | uint8_t nodeTelemetrySensorsMap[_meshtastic_TelemetrySensorType_MAX + 1] = { | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |     0}; // one is enough, missing elements will be initialized to 0 anyway.
 | 
					
						
							| 
									
										
										
										
											2020-02-23 18:49:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-10 01:57:57 +00:00
										 |  |  | Router *router = NULL; // Users of router don't care what sort of subclass implements that API
 | 
					
						
							| 
									
										
										
										
											2020-04-17 18:52:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 20:55:26 +00:00
										 |  |  | const char *getDeviceName() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  |     uint8_t dmac[6]; | 
					
						
							| 
									
										
										
										
											2020-04-15 03:22:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     getMacAddr(dmac); | 
					
						
							| 
									
										
										
										
											2020-02-02 20:55:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-16 18:54:50 +00:00
										 |  |  |     // Meshtastic_ab3c or Shortname_abcd
 | 
					
						
							|  |  |  |     static char name[20]; | 
					
						
							| 
									
										
										
										
											2023-01-16 09:55:40 +00:00
										 |  |  |     snprintf(name, sizeof(name), "%02x%02x", dmac[4], dmac[5]); | 
					
						
							| 
									
										
										
										
											2022-06-16 18:54:50 +00:00
										 |  |  |     // if the shortname exists and is NOT the new default of ab3c, use it for BLE name.
 | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |     if ((owner.short_name != NULL) && (strcmp(owner.short_name, name) != 0)) { | 
					
						
							| 
									
										
										
										
											2023-01-16 09:55:40 +00:00
										 |  |  |         snprintf(name, sizeof(name), "%s_%02x%02x", owner.short_name, dmac[4], dmac[5]); | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2023-01-16 09:55:40 +00:00
										 |  |  |         snprintf(name, sizeof(name), "Meshtastic_%02x%02x", dmac[4], dmac[5]); | 
					
						
							| 
									
										
										
										
											2022-04-30 21:48:31 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  |     return name; | 
					
						
							| 
									
										
										
										
											2020-02-02 20:55:26 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-10 01:57:57 +00:00
										 |  |  | static int32_t ledBlinker() | 
					
						
							| 
									
										
										
										
											2020-04-25 17:59:40 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     static bool ledOn; | 
					
						
							|  |  |  |     ledOn ^= 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setLed(ledOn); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // have a very sparse duty cycle of LED being on, unless charging, then blink 0.5Hz square wave rate to indicate that
 | 
					
						
							| 
									
										
										
										
											2020-10-10 01:57:57 +00:00
										 |  |  |     return powerStatus->getIsCharging() ? 1000 : (ledOn ? 1 : 1000); | 
					
						
							| 
									
										
										
										
											2020-04-25 17:59:40 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-06 02:37:35 +00:00
										 |  |  | uint32_t timeLastPowered = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #if HAS_BUTTON
 | 
					
						
							| 
									
										
										
										
											2021-03-15 02:00:20 +00:00
										 |  |  | bool ButtonThread::shutdown_on_long_stop = false; | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2021-03-15 02:00:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-12 00:25:17 +00:00
										 |  |  | static Periodic *ledPeriodic; | 
					
						
							| 
									
										
										
										
											2022-11-25 13:17:24 +00:00
										 |  |  | static OSThread *powerFSMthread; | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #if HAS_BUTTON
 | 
					
						
							| 
									
										
										
										
											2022-11-25 13:17:24 +00:00
										 |  |  | static OSThread *buttonThread; | 
					
						
							| 
									
										
										
										
											2020-11-23 02:50:14 +00:00
										 |  |  | uint32_t ButtonThread::longPressTime = 0; | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2023-03-23 16:32:04 +00:00
										 |  |  | static OSThread *accelerometerThread; | 
					
						
							| 
									
										
										
										
											2023-05-08 12:03:03 +00:00
										 |  |  | SPISettings spiSettings(4000000, MSBFIRST, SPI_MODE0); | 
					
						
							| 
									
										
										
										
											2020-10-12 00:25:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-07 22:23:05 +00:00
										 |  |  | RadioInterface *rIf = NULL; | 
					
						
							| 
									
										
										
										
											2020-04-29 21:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-28 07:11:55 +00:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Some platforms (nrf52) might provide an alterate version that supresses calling delay from sleep. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2022-05-07 10:31:21 +00:00
										 |  |  | __attribute__((weak, noinline)) bool loopCanSleep() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-04-28 07:11:55 +00:00
										 |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 00:14:34 +00:00
										 |  |  | void setup() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-01-08 05:15:49 +00:00
										 |  |  |     concurrency::hasBeenSetup = true; | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  |     meshtastic_Config_DisplayConfig_OledType screen_model = | 
					
						
							|  |  |  |         meshtastic_Config_DisplayConfig_OledType::meshtastic_Config_DisplayConfig_OledType_OLED_AUTO; | 
					
						
							|  |  |  |     OLEDDISPLAY_GEOMETRY screen_geometry = GEOMETRY_128_64; | 
					
						
							| 
									
										
										
										
											2021-01-08 05:15:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-12 23:48:25 +00:00
										 |  |  | #ifdef SEGGER_STDOUT_CH
 | 
					
						
							| 
									
										
										
										
											2021-03-11 02:00:08 +00:00
										 |  |  |     auto mode = false ? SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL : SEGGER_RTT_MODE_NO_BLOCK_TRIM; | 
					
						
							| 
									
										
										
										
											2021-03-08 09:10:48 +00:00
										 |  |  | #ifdef NRF52840_XXAA
 | 
					
						
							|  |  |  |     auto buflen = 4096; // this board has a fair amount of ram
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     auto buflen = 256; // this board has a fair amount of ram
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     SEGGER_RTT_ConfigUpBuffer(SEGGER_STDOUT_CH, NULL, NULL, buflen, mode); | 
					
						
							| 
									
										
										
										
											2020-04-24 15:06:29 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-04-24 15:52:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 00:14:34 +00:00
										 |  |  | #ifdef DEBUG_PORT
 | 
					
						
							| 
									
										
										
										
											2023-01-19 01:24:18 +00:00
										 |  |  |     consoleInit(); // Set serial baud rate and init our mesh console
 | 
					
						
							| 
									
										
										
										
											2020-02-02 00:14:34 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2022-05-07 10:31:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-02 14:02:26 +00:00
										 |  |  |     serialSinceMsec = millis(); | 
					
						
							| 
									
										
										
										
											2020-02-01 16:30:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-30 02:41:37 +00:00
										 |  |  |     LOG_INFO("\n\n//\\ E S H T /\\ S T / C\n\n"); | 
					
						
							| 
									
										
										
										
											2022-01-10 15:57:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  |     initDeepSleep(); | 
					
						
							| 
									
										
										
										
											2022-04-27 13:30:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-13 13:56:52 +00:00
										 |  |  |     // Testing this fix für erratic T-Echo boot behaviour
 | 
					
						
							| 
									
										
										
										
											2022-04-27 13:30:27 +00:00
										 |  |  | #if defined(TTGO_T_ECHO) && defined(PIN_EINK_PWR_ON)
 | 
					
						
							| 
									
										
										
										
											2022-04-26 09:43:32 +00:00
										 |  |  |     pinMode(PIN_EINK_PWR_ON, OUTPUT); | 
					
						
							|  |  |  |     digitalWrite(PIN_EINK_PWR_ON, HIGH); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-02-01 16:30:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-01 22:23:21 +00:00
										 |  |  | #ifdef VEXT_ENABLE
 | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  |     pinMode(VEXT_ENABLE, OUTPUT); | 
					
						
							|  |  |  |     digitalWrite(VEXT_ENABLE, 0); // turn on the display power
 | 
					
						
							| 
									
										
										
										
											2020-02-02 00:14:34 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-02-01 22:23:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef RESET_OLED
 | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  |     pinMode(RESET_OLED, OUTPUT); | 
					
						
							|  |  |  |     digitalWrite(RESET_OLED, 1); | 
					
						
							| 
									
										
										
										
											2020-02-02 00:14:34 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-02-01 22:23:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-18 18:43:15 +00:00
										 |  |  | #ifdef BUTTON_PIN
 | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #ifdef ARCH_ESP32
 | 
					
						
							| 
									
										
										
										
											2021-02-20 08:34:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // If the button is connected to GPIO 12, don't enable the ability to use
 | 
					
						
							|  |  |  |     // meshtasticAdmin on the device.
 | 
					
						
							| 
									
										
										
										
											2023-04-18 12:22:37 +00:00
										 |  |  |     pinMode(config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN, INPUT); | 
					
						
							| 
									
										
										
										
											2021-02-20 08:34:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-18 18:43:15 +00:00
										 |  |  | #ifdef BUTTON_NEED_PULLUP
 | 
					
						
							| 
									
										
										
										
											2023-04-18 12:22:37 +00:00
										 |  |  |     gpio_pullup_en((gpio_num_t)(config.device.button_gpio ? config.device.button_gpio : BUTTON_PIN)); | 
					
						
							| 
									
										
										
										
											2021-02-20 08:34:25 +00:00
										 |  |  |     delay(10); | 
					
						
							| 
									
										
										
										
											2021-01-18 18:43:15 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-12-12 21:54:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-10 01:57:57 +00:00
										 |  |  |     OSThread::setup(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ledPeriodic = new Periodic("Blink", ledBlinker); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-19 01:25:02 +00:00
										 |  |  |     fsInit(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-07 11:57:55 +00:00
										 |  |  | #ifdef I2C_SDA1
 | 
					
						
							|  |  |  |     Wire1.begin(I2C_SDA1, I2C_SCL1); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-04 15:31:32 +00:00
										 |  |  | #ifdef I2C_SDA
 | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  |     Wire.begin(I2C_SDA, I2C_SCL); | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #elif HAS_WIRE
 | 
					
						
							| 
									
										
										
										
											2020-04-23 20:53:51 +00:00
										 |  |  |     Wire.begin(); | 
					
						
							| 
									
										
										
										
											2020-02-04 15:31:32 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-10-17 05:15:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef PIN_LCD_RESET
 | 
					
						
							| 
									
										
										
										
											2020-10-23 10:00:43 +00:00
										 |  |  |     // FIXME - move this someplace better, LCD is at address 0x3F
 | 
					
						
							| 
									
										
										
										
											2020-10-17 05:15:12 +00:00
										 |  |  |     pinMode(PIN_LCD_RESET, OUTPUT); | 
					
						
							|  |  |  |     digitalWrite(PIN_LCD_RESET, 0); | 
					
						
							| 
									
										
										
										
											2020-10-24 00:16:15 +00:00
										 |  |  |     delay(1); | 
					
						
							| 
									
										
										
										
											2020-10-23 09:10:48 +00:00
										 |  |  |     digitalWrite(PIN_LCD_RESET, 1); | 
					
						
							| 
									
										
										
										
											2020-10-24 00:16:15 +00:00
										 |  |  |     delay(1); | 
					
						
							| 
									
										
										
										
											2020-06-15 21:43:16 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-04-23 20:53:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 00:55:34 +00:00
										 |  |  | #ifdef RAK4630
 | 
					
						
							|  |  |  |     // We need to enable 3.3V periphery in order to scan it
 | 
					
						
							|  |  |  |     pinMode(PIN_3V3_EN, OUTPUT); | 
					
						
							| 
									
										
										
										
											2023-01-10 13:36:19 +00:00
										 |  |  |     digitalWrite(PIN_3V3_EN, HIGH); | 
					
						
							| 
									
										
										
										
											2022-10-23 00:55:34 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-12 12:09:25 +00:00
										 |  |  |     // Currently only the tbeam has a PMU
 | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  |     // PMU initialization needs to be placed before i2c scanning
 | 
					
						
							| 
									
										
										
										
											2022-11-12 12:09:25 +00:00
										 |  |  |     power = new Power(); | 
					
						
							|  |  |  |     power->setStatusHandler(powerStatus); | 
					
						
							|  |  |  |     powerStatus->observe(&power->newStatus); | 
					
						
							|  |  |  |     power->setup(); // Must be after status handler is installed, so that handler gets notified of the initial configuration
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  |     // We need to scan here to decide if we have a screen for nodeDB.init() and because power has been applied to
 | 
					
						
							|  |  |  |     // accessories
 | 
					
						
							|  |  |  |     auto i2cScanner = std::unique_ptr<ScanI2CTwoWire>(new ScanI2CTwoWire()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     LOG_INFO("Scanning for i2c devices...\n"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef I2C_SDA1
 | 
					
						
							|  |  |  |     Wire1.begin(I2C_SDA1, I2C_SCL1); | 
					
						
							|  |  |  |     i2cScanner->scanPort(ScanI2C::I2CPort::WIRE1); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef I2C_SDA
 | 
					
						
							|  |  |  |     Wire.begin(I2C_SDA, I2C_SCL); | 
					
						
							|  |  |  |     i2cScanner->scanPort(ScanI2C::I2CPort::WIRE); | 
					
						
							|  |  |  | #elif HAS_WIRE
 | 
					
						
							|  |  |  |     i2cScanner->scanPort(ScanI2C::I2CPort::WIRE); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto i2cCount = i2cScanner->countDevices(); | 
					
						
							|  |  |  |     if (i2cCount == 0) { | 
					
						
							|  |  |  |         LOG_INFO("No I2C devices found\n"); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         LOG_INFO("%i I2C devices found\n", i2cCount); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef ARCH_ESP32
 | 
					
						
							|  |  |  |     // Don't init display if we don't have one or we are waking headless due to a timer event
 | 
					
						
							|  |  |  |     if (wakeCause == ESP_SLEEP_WAKEUP_TIMER) { | 
					
						
							|  |  |  |         LOG_DEBUG("suppress screen wake because this is a headless timer wakeup"); | 
					
						
							|  |  |  |         i2cScanner->setSuppressScreen(); | 
					
						
							| 
									
										
										
										
											2022-11-13 13:56:52 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-11-12 08:01:30 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     auto screenInfo = i2cScanner->firstScreen(); | 
					
						
							|  |  |  |     screen_found = screenInfo.type != ScanI2C::DeviceType::NONE ? screenInfo.address : ScanI2C::ADDRESS_NONE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (screen_found.port != ScanI2C::I2CPort::NO_I2C) { | 
					
						
							|  |  |  |         switch (screenInfo.type) { | 
					
						
							|  |  |  |         case ScanI2C::DeviceType::SCREEN_SH1106: | 
					
						
							|  |  |  |             screen_model = meshtastic_Config_DisplayConfig_OledType::meshtastic_Config_DisplayConfig_OledType_OLED_SH1106; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case ScanI2C::DeviceType::SCREEN_SSD1306: | 
					
						
							|  |  |  |             screen_model = meshtastic_Config_DisplayConfig_OledType::meshtastic_Config_DisplayConfig_OledType_OLED_SSD1306; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case ScanI2C::DeviceType::SCREEN_ST7567: | 
					
						
							|  |  |  |         case ScanI2C::DeviceType::SCREEN_UNKNOWN: | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             screen_model = meshtastic_Config_DisplayConfig_OledType::meshtastic_Config_DisplayConfig_OledType_OLED_AUTO; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define UPDATE_FROM_SCANNER(FIND_FN)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto rtc_info = i2cScanner->firstRTC(); | 
					
						
							|  |  |  |     rtc_found = rtc_info.type != ScanI2C::DeviceType::NONE ? rtc_info.address : rtc_found; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto kb_info = i2cScanner->firstKeyboard(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (kb_info.type != ScanI2C::DeviceType::NONE) { | 
					
						
							|  |  |  |         cardkb_found = kb_info.address; | 
					
						
							|  |  |  |         switch (kb_info.type) { | 
					
						
							|  |  |  |         case ScanI2C::DeviceType::RAK14004: | 
					
						
							|  |  |  |             kb_model = 0x02; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case ScanI2C::DeviceType::CARDKB: | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             // use this as default since it's also just zero
 | 
					
						
							|  |  |  |             kb_model = 0x00; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pmu_found = i2cScanner->exists(ScanI2C::DeviceType::PMU_AXP192_AXP2101); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * There are a bunch of sensors that have no further logic than to be found and stuffed into the | 
					
						
							|  |  |  |      * nodeTelemetrySensorsMap singleton. This wraps that logic in a temporary scope to declare the temporary field | 
					
						
							|  |  |  |      * "found". | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-05-06 12:17:40 +00:00
										 |  |  |     // Only one supported RGB LED currently
 | 
					
						
							|  |  |  |     rgb_found = i2cScanner->find(ScanI2C::DeviceType::NCP5623); | 
					
						
							| 
									
										
										
										
											2023-03-29 18:04:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-23 16:32:04 +00:00
										 |  |  | #if !defined(ARCH_PORTDUINO)
 | 
					
						
							|  |  |  |     auto acc_info = i2cScanner->firstAccelerometer(); | 
					
						
							|  |  |  |     accelerometer_found = acc_info.type != ScanI2C::DeviceType::NONE ? acc_info.address : accelerometer_found; | 
					
						
							|  |  |  |     LOG_DEBUG("acc_info = %i\n", acc_info.type); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define STRING(S) #S
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define SCANNER_TO_SENSORS_MAP(SCANNER_T, PB_T)                                                                                  \
 | 
					
						
							|  |  |  |     {                                                                                                                            \ | 
					
						
							|  |  |  |         auto found = i2cScanner->find(SCANNER_T);                                                                                \ | 
					
						
							|  |  |  |         if (found.type != ScanI2C::DeviceType::NONE) {                                                                           \ | 
					
						
							|  |  |  |             nodeTelemetrySensorsMap[PB_T] = found.address.address;                                                               \ | 
					
						
							|  |  |  |             LOG_DEBUG("found i2c sensor %s\n", STRING(PB_T));                                                                    \ | 
					
						
							|  |  |  |         }                                                                                                                        \ | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::BME_680, meshtastic_TelemetrySensorType_BME680) | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::BME_280, meshtastic_TelemetrySensorType_BME280) | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::BMP_280, meshtastic_TelemetrySensorType_BMP280) | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::INA260, meshtastic_TelemetrySensorType_INA260) | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::INA219, meshtastic_TelemetrySensorType_INA219) | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::MCP9808, meshtastic_TelemetrySensorType_MCP9808) | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::MCP9808, meshtastic_TelemetrySensorType_MCP9808) | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::SHT31, meshtastic_TelemetrySensorType_SHT31) | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::SHTC3, meshtastic_TelemetrySensorType_SHTC3) | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::LPS22HB, meshtastic_TelemetrySensorType_LPS22) | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::QMC6310, meshtastic_TelemetrySensorType_QMC6310) | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::QMI8658, meshtastic_TelemetrySensorType_QMI8658) | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::QMC5883L, meshtastic_TelemetrySensorType_QMC5883L) | 
					
						
							|  |  |  |     SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::PMSA0031, meshtastic_TelemetrySensorType_PMSA003I) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     i2cScanner.reset(); | 
					
						
							| 
									
										
										
										
											2022-11-13 13:56:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-12 07:14:13 +00:00
										 |  |  | #ifdef HAS_SDCARD
 | 
					
						
							|  |  |  |     setupSDCard(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2022-11-25 13:17:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-25 05:13:41 +00:00
										 |  |  | #ifdef RAK4630
 | 
					
						
							|  |  |  |     // scanEInkDevice();
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-10-17 05:15:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-18 12:22:37 +00:00
										 |  |  |     // LED init
 | 
					
						
							| 
									
										
										
										
											2020-10-29 01:38:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-01 16:30:53 +00:00
										 |  |  | #ifdef LED_PIN
 | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  |     pinMode(LED_PIN, OUTPUT); | 
					
						
							| 
									
										
										
										
											2020-04-15 03:22:27 +00:00
										 |  |  |     digitalWrite(LED_PIN, 1 ^ LED_INVERTED); // turn on for now
 | 
					
						
							| 
									
										
										
										
											2020-02-01 16:30:53 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  |     // Hello
 | 
					
						
							| 
									
										
										
										
											2022-12-30 02:41:37 +00:00
										 |  |  |     LOG_INFO("Meshtastic hwvendor=%d, swver=%s\n", HW_VENDOR, optstr(APP_VERSION)); | 
					
						
							| 
									
										
										
										
											2020-02-01 16:30:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #ifdef ARCH_ESP32
 | 
					
						
							| 
									
										
										
										
											2020-04-24 15:52:49 +00:00
										 |  |  |     esp32Setup(); | 
					
						
							| 
									
										
										
										
											2020-04-17 16:48:54 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-02-01 16:30:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #ifdef ARCH_NRF52
 | 
					
						
							| 
									
										
										
										
											2020-09-24 23:36:07 +00:00
										 |  |  |     nrf52Setup(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-12-26 05:36:21 +00:00
										 |  |  |     // We do this as early as possible because this loads preferences from flash
 | 
					
						
							|  |  |  |     // but we need to do this after main cpu iniot (esp32setup), because we need the random seed set
 | 
					
						
							|  |  |  |     nodeDB.init(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-28 14:03:32 +00:00
										 |  |  |     // If we're taking on the repeater role, use flood router
 | 
					
						
							|  |  |  |     if (config.device.role == meshtastic_Config_DeviceConfig_Role_REPEATER) | 
					
						
							|  |  |  |         router = new FloodingRouter(); | 
					
						
							| 
									
										
										
										
											2023-05-04 07:55:12 +00:00
										 |  |  |     else | 
					
						
							|  |  |  |         router = new ReliableRouter(); | 
					
						
							| 
									
										
										
										
											2023-01-28 14:03:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-18 12:22:37 +00:00
										 |  |  | #if HAS_BUTTON
 | 
					
						
							|  |  |  |     // Buttons. Moved here cause we need NodeDB to be initialized
 | 
					
						
							|  |  |  |     buttonThread = new ButtonThread(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-25 22:07:02 +00:00
										 |  |  |     playStartMelody(); | 
					
						
							| 
									
										
										
										
											2022-11-25 13:17:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-04 18:56:44 +00:00
										 |  |  |     // fixed screen override?
 | 
					
						
							| 
									
										
										
										
											2023-01-21 17:22:19 +00:00
										 |  |  |     if (config.display.oled != meshtastic_Config_DisplayConfig_OledType_OLED_AUTO) | 
					
						
							| 
									
										
										
										
											2022-11-04 18:56:44 +00:00
										 |  |  |         screen_model = config.display.oled; | 
					
						
							| 
									
										
										
										
											2022-11-25 13:17:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-19 07:49:19 +00:00
										 |  |  | #if defined(USE_SH1107)
 | 
					
						
							| 
									
										
										
										
											2023-03-08 13:49:30 +00:00
										 |  |  |     screen_model = meshtastic_Config_DisplayConfig_OledType_OLED_SH1107; // set dimension of 128x128
 | 
					
						
							|  |  |  |     display_geometry = GEOMETRY_128_128; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(USE_SH1107_128_64)
 | 
					
						
							|  |  |  |     screen_model = meshtastic_Config_DisplayConfig_OledType_OLED_SH1107; // keep dimension of 128x64
 | 
					
						
							| 
									
										
										
										
											2023-01-19 07:49:19 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-29 18:04:02 +00:00
										 |  |  | #if !defined(ARCH_PORTDUINO)
 | 
					
						
							|  |  |  |     if (acc_info.type != ScanI2C::DeviceType::NONE) { | 
					
						
							|  |  |  |         accelerometerThread = new AccelerometerThread(acc_info.type); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-29 00:38:23 +00:00
										 |  |  |     // Init our SPI controller (must be before screen and lora)
 | 
					
						
							|  |  |  |     initSPI(); | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #ifndef ARCH_ESP32
 | 
					
						
							| 
									
										
										
										
											2020-08-29 00:38:23 +00:00
										 |  |  |     SPI.begin(); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     // ESP32
 | 
					
						
							|  |  |  |     SPI.begin(RF95_SCK, RF95_MISO, RF95_MOSI, RF95_NSS); | 
					
						
							|  |  |  |     SPI.setFrequency(4000000); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  |     // Initialize the screen first so we can show the logo while we start up everything else.
 | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  |     screen = new graphics::Screen(screen_found, screen_model, screen_geometry); | 
					
						
							| 
									
										
										
										
											2020-02-01 16:30:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-04 18:15:05 +00:00
										 |  |  |     readFromRTC(); // read the main CPU RTC at first (in case we can't get GPS time)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-15 02:00:20 +00:00
										 |  |  |     gps = createGps(); | 
					
						
							| 
									
										
										
										
											2020-10-13 06:43:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-13 10:33:14 +00:00
										 |  |  |     if (gps) { | 
					
						
							| 
									
										
										
										
											2020-09-06 21:45:43 +00:00
										 |  |  |         gpsStatus->observe(&gps->newStatus); | 
					
						
							| 
									
										
										
										
											2023-05-13 10:33:14 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2022-12-30 02:41:37 +00:00
										 |  |  |         LOG_WARN("No GPS found - running without GPS\n"); | 
					
						
							| 
									
										
										
										
											2023-05-13 10:33:14 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-23 10:00:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-29 01:17:52 +00:00
										 |  |  |     nodeStatus->observe(&nodeDB.newStatus); | 
					
						
							| 
									
										
										
										
											2020-03-18 22:00:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  |     service.init(); | 
					
						
							| 
									
										
										
										
											2020-06-21 21:11:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 08:29:05 +00:00
										 |  |  |     // Now that the mesh service is created, create any modules
 | 
					
						
							| 
									
										
										
										
											2022-02-27 09:49:24 +00:00
										 |  |  |     setupModules(); | 
					
						
							| 
									
										
										
										
											2021-01-08 05:15:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-23 16:32:04 +00:00
										 |  |  | // Do this after service.init (because that clears error_code)
 | 
					
						
							| 
									
										
										
										
											2022-09-08 02:36:53 +00:00
										 |  |  | #ifdef HAS_PMU
 | 
					
						
							| 
									
										
										
										
											2022-11-13 13:56:52 +00:00
										 |  |  |     if (!pmu_found) | 
					
						
							| 
									
										
										
										
											2023-01-21 17:22:19 +00:00
										 |  |  |         RECORD_CRITICALERROR(meshtastic_CriticalErrorCode_NO_AXP192); // Record a hardware fault for missing hardware
 | 
					
						
							| 
									
										
										
										
											2021-01-08 05:15:49 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-12-26 05:36:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-23 16:32:04 +00:00
										 |  |  | // Don't call screen setup until after nodedb is setup (because we need
 | 
					
						
							|  |  |  | // the current region name)
 | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #if defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER)
 | 
					
						
							| 
									
										
										
										
											2020-10-21 09:27:13 +00:00
										 |  |  |     screen->setup(); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2023-03-09 03:13:46 +00:00
										 |  |  |     if (screen_found.port != ScanI2C::I2CPort::NO_I2C) | 
					
						
							| 
									
										
										
										
											2020-10-21 09:27:13 +00:00
										 |  |  |         screen->setup(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-23 10:00:43 +00:00
										 |  |  |     screen->print("Started...\n"); | 
					
						
							| 
									
										
										
										
											2020-10-21 09:27:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-21 17:14:03 +00:00
										 |  |  |     // We have now loaded our saved preferences from flash
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // ONCE we will factory reset the GPS for bug #327
 | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |     if (gps && !devicestate.did_gps_reset) { | 
					
						
							| 
									
										
										
										
											2022-12-30 02:41:37 +00:00
										 |  |  |         LOG_WARN("GPS FactoryReset requested\n"); | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |         if (gps->factoryReset()) { // If we don't succeed try again next time
 | 
					
						
							| 
									
										
										
										
											2020-08-21 17:14:03 +00:00
										 |  |  |             devicestate.did_gps_reset = true; | 
					
						
							| 
									
										
										
										
											2022-10-04 12:32:07 +00:00
										 |  |  |             nodeDB.saveToDisk(SEGMENT_DEVICESTATE); | 
					
						
							| 
									
										
										
										
											2020-08-21 17:14:03 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-14 09:25:25 +00:00
										 |  |  | #ifdef SX126X_ANT_SW
 | 
					
						
							|  |  |  |     // make analog PA vs not PA switch on SX126x eval board work properly
 | 
					
						
							|  |  |  |     pinMode(SX126X_ANT_SW, OUTPUT); | 
					
						
							|  |  |  |     digitalWrite(SX126X_ANT_SW, 1); | 
					
						
							| 
									
										
										
										
											2021-09-03 14:15:58 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 11:18:28 +00:00
										 |  |  |     // Init LockingHAL first, to use it for radio init
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     LockingArduinoHal *RadioLibHAL = new LockingArduinoHal(SPI, spiSettings); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-07 22:23:05 +00:00
										 |  |  |     // radio init MUST BE AFTER service.init, so we have our radio config settings (from nodedb init)
 | 
					
						
							| 
									
										
										
										
											2020-08-20 22:42:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-11 09:00:19 +00:00
										 |  |  | #if !HAS_RADIO && defined(ARCH_PORTDUINO)
 | 
					
						
							|  |  |  |     if (!rIf) { | 
					
						
							|  |  |  |         rIf = new SimRadio; | 
					
						
							|  |  |  |         if (!rIf->init()) { | 
					
						
							|  |  |  |             LOG_WARN("Failed to find simulated radio\n"); | 
					
						
							|  |  |  |             delete rIf; | 
					
						
							|  |  |  |             rIf = NULL; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             LOG_INFO("Using SIMULATED radio!\n"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-10 21:37:01 +00:00
										 |  |  | #if defined(RF95_IRQ)
 | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |     if (!rIf) { | 
					
						
							| 
									
										
										
										
											2023-05-08 11:18:28 +00:00
										 |  |  |         rIf = new RF95Interface(RadioLibHAL, RF95_NSS, RF95_IRQ, RF95_RESET, RF95_DIO1); | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |         if (!rIf->init()) { | 
					
						
							| 
									
										
										
										
											2022-12-30 02:41:37 +00:00
										 |  |  |             LOG_WARN("Failed to find RF95 radio\n"); | 
					
						
							| 
									
										
										
										
											2020-08-20 22:42:36 +00:00
										 |  |  |             delete rIf; | 
					
						
							|  |  |  |             rIf = NULL; | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2022-12-30 16:27:07 +00:00
										 |  |  |             LOG_INFO("RF95 Radio init succeeded, using RF95 radio\n"); | 
					
						
							| 
									
										
										
										
											2020-08-20 22:42:36 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-12 10:58:56 +00:00
										 |  |  | #if defined(USE_SX1262)
 | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |     if (!rIf) { | 
					
						
							| 
									
										
										
										
											2023-05-08 11:18:28 +00:00
										 |  |  |         rIf = new SX1262Interface(RadioLibHAL, SX126X_CS, SX126X_DIO1, SX126X_RESET, SX126X_BUSY); | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |         if (!rIf->init()) { | 
					
						
							| 
									
										
										
										
											2022-12-30 02:41:37 +00:00
										 |  |  |             LOG_WARN("Failed to find SX1262 radio\n"); | 
					
						
							| 
									
										
										
										
											2020-08-20 22:42:36 +00:00
										 |  |  |             delete rIf; | 
					
						
							|  |  |  |             rIf = NULL; | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2022-12-30 16:27:07 +00:00
										 |  |  |             LOG_INFO("SX1262 Radio init succeeded, using SX1262 radio\n"); | 
					
						
							| 
									
										
										
										
											2020-08-20 22:42:36 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-12 10:58:56 +00:00
										 |  |  | #if defined(USE_SX1268)
 | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |     if (!rIf) { | 
					
						
							| 
									
										
										
										
											2023-05-08 11:18:28 +00:00
										 |  |  |         rIf = new SX1268Interface(RadioLibHAL, SX126X_CS, SX126X_DIO1, SX126X_RESET, SX126X_BUSY); | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |         if (!rIf->init()) { | 
					
						
							| 
									
										
										
										
											2022-12-30 02:41:37 +00:00
										 |  |  |             LOG_WARN("Failed to find SX1268 radio\n"); | 
					
						
							| 
									
										
										
										
											2021-09-03 14:15:58 +00:00
										 |  |  |             delete rIf; | 
					
						
							|  |  |  |             rIf = NULL; | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2022-12-30 16:27:07 +00:00
										 |  |  |             LOG_INFO("SX1268 Radio init succeeded, using SX1268 radio\n"); | 
					
						
							| 
									
										
										
										
											2021-09-03 14:15:58 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-17 10:28:08 +00:00
										 |  |  | #if defined(USE_LLCC68)
 | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |     if (!rIf) { | 
					
						
							| 
									
										
										
										
											2023-05-08 11:18:28 +00:00
										 |  |  |         rIf = new LLCC68Interface(RadioLibHAL, SX126X_CS, SX126X_DIO1, SX126X_RESET, SX126X_BUSY); | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |         if (!rIf->init()) { | 
					
						
							| 
									
										
										
										
											2022-12-30 02:41:37 +00:00
										 |  |  |             LOG_WARN("Failed to find LLCC68 radio\n"); | 
					
						
							| 
									
										
										
										
											2021-11-17 10:28:08 +00:00
										 |  |  |             delete rIf; | 
					
						
							|  |  |  |             rIf = NULL; | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2022-12-30 16:27:07 +00:00
										 |  |  |             LOG_INFO("LLCC68 Radio init succeeded, using LLCC68 radio\n"); | 
					
						
							| 
									
										
										
										
											2021-11-17 10:28:08 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-28 13:45:10 +00:00
										 |  |  | #if defined(USE_SX1280)
 | 
					
						
							|  |  |  |     if (!rIf) { | 
					
						
							| 
									
										
										
										
											2023-05-08 11:18:28 +00:00
										 |  |  |         rIf = new SX1280Interface(RadioLibHAL, SX128X_CS, SX128X_DIO1, SX128X_RESET, SX128X_BUSY); | 
					
						
							| 
									
										
										
										
											2023-02-28 13:45:10 +00:00
										 |  |  |         if (!rIf->init()) { | 
					
						
							|  |  |  |             LOG_WARN("Failed to find SX1280 radio\n"); | 
					
						
							|  |  |  |             delete rIf; | 
					
						
							|  |  |  |             rIf = NULL; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             LOG_INFO("SX1280 Radio init succeeded, using SX1280 radio\n"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-19 01:24:18 +00:00
										 |  |  |     // check if the radio chip matches the selected region
 | 
					
						
							| 
									
										
										
										
											2022-11-27 13:03:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-21 17:22:19 +00:00
										 |  |  |     if ((config.lora.region == meshtastic_Config_LoRaConfig_RegionCode_LORA_24) && (!rIf->wideLora())) { | 
					
						
							| 
									
										
										
										
											2023-01-19 01:24:18 +00:00
										 |  |  |         LOG_WARN("Radio chip does not support 2.4GHz LoRa. Reverting to unset.\n"); | 
					
						
							| 
									
										
										
										
											2023-01-21 17:22:19 +00:00
										 |  |  |         config.lora.region = meshtastic_Config_LoRaConfig_RegionCode_UNSET; | 
					
						
							| 
									
										
										
										
											2023-01-19 01:24:18 +00:00
										 |  |  |         nodeDB.saveToDisk(SEGMENT_CONFIG); | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |         if (!rIf->reconfigure()) { | 
					
						
							| 
									
										
										
										
											2023-01-19 01:24:18 +00:00
										 |  |  |             LOG_WARN("Reconfigure failed, rebooting\n"); | 
					
						
							|  |  |  |             screen->startRebootScreen(); | 
					
						
							|  |  |  |             rebootAtMsec = millis() + 5000; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-11-27 13:03:50 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-25 22:07:02 +00:00
										 |  |  | #if HAS_WIFI || HAS_ETHERNET
 | 
					
						
							| 
									
										
										
										
											2021-08-18 02:59:56 +00:00
										 |  |  |     mqttInit(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-22 14:53:57 +00:00
										 |  |  | #ifndef ARCH_PORTDUINO
 | 
					
						
							| 
									
										
										
										
											2020-09-13 04:43:41 +00:00
										 |  |  |     // Initialize Wifi
 | 
					
						
							| 
									
										
										
										
											2022-10-25 09:53:22 +00:00
										 |  |  |     initWifi(); | 
					
						
							| 
									
										
										
										
											2020-09-13 04:43:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-22 14:29:50 +00:00
										 |  |  |     // Initialize Ethernet
 | 
					
						
							|  |  |  |     initEthernet(); | 
					
						
							| 
									
										
										
										
											2022-10-22 14:53:57 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2022-10-22 14:29:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #ifdef ARCH_ESP32
 | 
					
						
							| 
									
										
										
										
											2021-01-09 04:06:11 +00:00
										 |  |  |     // Start web server thread.
 | 
					
						
							| 
									
										
										
										
											2021-01-09 04:43:51 +00:00
										 |  |  |     webServerThread = new WebServerThread(); | 
					
						
							| 
									
										
										
										
											2021-01-09 06:59:37 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2021-01-09 04:06:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #ifdef ARCH_PORTDUINO
 | 
					
						
							| 
									
										
										
										
											2022-10-01 10:02:29 +00:00
										 |  |  |     initApiServer(TCPPort); | 
					
						
							| 
									
										
										
										
											2021-02-07 01:17:46 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-09 04:43:51 +00:00
										 |  |  |     // Start airtime logger thread.
 | 
					
						
							|  |  |  |     airTime = new AirTime(); | 
					
						
							| 
									
										
										
										
											2021-01-09 04:06:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-20 22:42:36 +00:00
										 |  |  |     if (!rIf) | 
					
						
							| 
									
										
										
										
											2023-01-21 17:22:19 +00:00
										 |  |  |         RECORD_CRITICALERROR(meshtastic_CriticalErrorCode_NO_RADIO); | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |     else { | 
					
						
							| 
									
										
										
										
											2020-10-10 01:57:57 +00:00
										 |  |  |         router->addInterface(rIf); | 
					
						
							| 
									
										
										
										
											2020-04-14 18:40:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-28 20:02:02 +00:00
										 |  |  |         // Calculate and save the bit rate to myNodeInfo
 | 
					
						
							|  |  |  |         // TODO: This needs to be added what ever method changes the channel from the phone.
 | 
					
						
							| 
									
										
										
										
											2023-01-21 17:39:58 +00:00
										 |  |  |         myNodeInfo.bitrate = | 
					
						
							|  |  |  |             (float(meshtastic_Constants_DATA_PAYLOAD_LEN) / (float(rIf->getPacketTime(meshtastic_Constants_DATA_PAYLOAD_LEN)))) * | 
					
						
							|  |  |  |             1000; | 
					
						
							| 
									
										
										
										
											2022-12-30 02:41:37 +00:00
										 |  |  |         LOG_DEBUG("myNodeInfo.bitrate = %f bytes / sec\n", myNodeInfo.bitrate); | 
					
						
							| 
									
										
										
										
											2022-01-28 20:02:02 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-12-24 02:18:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  |     // This must be _after_ service.init because we need our preferences loaded from flash to have proper timeout values
 | 
					
						
							|  |  |  |     PowerFSM_setup(); // we will transition to ON in a couple of seconds, FIXME, only do this for cold boots, not waking from SDS
 | 
					
						
							| 
									
										
										
										
											2020-10-11 00:12:53 +00:00
										 |  |  |     powerFSMthread = new PowerFSMThread(); | 
					
						
							| 
									
										
										
										
											2020-03-18 22:00:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  |     // setBluetoothEnable(false); we now don't start bluetooth until we enter the proper state
 | 
					
						
							|  |  |  |     setCPUFast(false); // 80MHz is fine for our slow peripherals
 | 
					
						
							| 
									
										
										
										
											2020-02-01 16:30:53 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-07 10:31:21 +00:00
										 |  |  | uint32_t rebootAtMsec;   // If not zero we will reboot at this time (used to reboot shortly after the update completes)
 | 
					
						
							| 
									
										
										
										
											2022-01-21 21:03:26 +00:00
										 |  |  | uint32_t shutdownAtMsec; // If not zero we will shutdown at this time (used to shutdown from python or mobile client)
 | 
					
						
							| 
									
										
										
										
											2021-03-27 02:19:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-28 04:16:37 +00:00
										 |  |  | // If a thread does something that might need for it to be rescheduled ASAP it can set this flag
 | 
					
						
							|  |  |  | // This will supress the current delay and instead try to run ASAP.
 | 
					
						
							|  |  |  | bool runASAP; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-16 18:18:27 +00:00
										 |  |  | extern meshtastic_DeviceMetadata getDeviceMetadata() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     meshtastic_DeviceMetadata deviceMetadata; | 
					
						
							|  |  |  |     strncpy(deviceMetadata.firmware_version, myNodeInfo.firmware_version, 18); | 
					
						
							|  |  |  |     deviceMetadata.device_state_version = DEVICESTATE_CUR_VER; | 
					
						
							|  |  |  |     deviceMetadata.canShutdown = pmu_found || HAS_CPU_SHUTDOWN; | 
					
						
							|  |  |  |     deviceMetadata.hasBluetooth = HAS_BLUETOOTH; | 
					
						
							|  |  |  |     deviceMetadata.hasWifi = HAS_WIFI; | 
					
						
							|  |  |  |     deviceMetadata.hasEthernet = HAS_ETHERNET; | 
					
						
							|  |  |  |     deviceMetadata.role = config.device.role; | 
					
						
							|  |  |  |     deviceMetadata.position_flags = config.position.position_flags; | 
					
						
							|  |  |  |     deviceMetadata.hw_model = HW_VENDOR; | 
					
						
							| 
									
										
										
										
											2023-05-22 12:00:20 +00:00
										 |  |  |     deviceMetadata.hasRemoteHardware = moduleConfig.remote_hardware.enabled; | 
					
						
							| 
									
										
										
										
											2023-02-16 18:18:27 +00:00
										 |  |  |     return deviceMetadata; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 00:14:34 +00:00
										 |  |  | void loop() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-03-28 04:16:37 +00:00
										 |  |  |     runASAP = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-19 02:15:51 +00:00
										 |  |  |     // axpDebugOutput.loop();
 | 
					
						
							| 
									
										
										
										
											2020-04-10 19:18:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-13 15:28:01 +00:00
										 |  |  |     // heap_caps_check_integrity_all(true); // FIXME - disable this expensive check
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #ifdef ARCH_ESP32
 | 
					
						
							| 
									
										
										
										
											2020-04-24 15:52:49 +00:00
										 |  |  |     esp32Loop(); | 
					
						
							| 
									
										
										
										
											2020-04-10 19:18:48 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2022-07-31 12:11:47 +00:00
										 |  |  | #ifdef ARCH_NRF52
 | 
					
						
							| 
									
										
										
										
											2021-03-09 07:07:16 +00:00
										 |  |  |     nrf52Loop(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2022-01-21 21:03:26 +00:00
										 |  |  |     powerCommandsCheck(); | 
					
						
							| 
									
										
										
										
											2020-02-01 16:30:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-07 22:23:05 +00:00
										 |  |  |     // For debugging
 | 
					
						
							|  |  |  |     // if (rIf) ((RadioLibInterface *)rIf)->isActivelyReceiving();
 | 
					
						
							| 
									
										
										
										
											2020-03-15 23:47:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-12 23:37:03 +00:00
										 |  |  | #ifdef DEBUG_STACK
 | 
					
						
							|  |  |  |     static uint32_t lastPrint = 0; | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |     if (millis() - lastPrint > 10 * 1000L) { | 
					
						
							| 
									
										
										
										
											2020-09-05 19:34:48 +00:00
										 |  |  |         lastPrint = millis(); | 
					
						
							| 
									
										
										
										
											2020-06-12 23:37:03 +00:00
										 |  |  |         meshtastic::printThreadInfo("main"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-10 01:57:57 +00:00
										 |  |  |     // TODO: This should go into a thread handled by FreeRTOS.
 | 
					
						
							| 
									
										
										
										
											2021-01-09 06:25:44 +00:00
										 |  |  |     // handleWebResponse();
 | 
					
						
							| 
									
										
										
										
											2020-09-16 16:22:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-10 01:57:57 +00:00
										 |  |  |     service.loop(); | 
					
						
							| 
									
										
										
										
											2020-02-08 01:48:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-10 01:57:57 +00:00
										 |  |  |     long delayMsec = mainController.runOrDelay(); | 
					
						
							| 
									
										
										
										
											2020-02-21 12:57:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-11 00:12:53 +00:00
										 |  |  |     /* if (mainController.nextThread && delayMsec)
 | 
					
						
							| 
									
										
										
										
											2022-12-30 02:41:37 +00:00
										 |  |  |         LOG_DEBUG("Next %s in %ld\n", mainController.nextThread->ThreadName.c_str(), | 
					
						
							| 
									
										
										
										
											2020-10-12 00:25:17 +00:00
										 |  |  |                   mainController.nextThread->tillRun(millis())); */ | 
					
						
							| 
									
										
										
										
											2020-09-14 05:22:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-10 01:57:57 +00:00
										 |  |  |     // We want to sleep as long as possible here - because it saves power
 | 
					
						
							| 
									
										
										
										
											2023-01-19 02:03:10 +00:00
										 |  |  |     if (!runASAP && loopCanSleep()) { | 
					
						
							| 
									
										
										
										
											2022-12-30 02:41:37 +00:00
										 |  |  |         // if(delayMsec > 100) LOG_DEBUG("sleeping %ld\n", delayMsec);
 | 
					
						
							| 
									
										
										
										
											2021-03-28 04:16:37 +00:00
										 |  |  |         mainDelay.delay(delayMsec); | 
					
						
							| 
									
										
										
										
											2021-08-15 17:34:57 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-12-30 02:41:37 +00:00
										 |  |  |     // if (didWake) LOG_DEBUG("wake!\n");
 | 
					
						
							| 
									
										
										
										
											2020-03-15 20:27:00 +00:00
										 |  |  | } |