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"
|
2023-06-27 00:59:44 +00:00
|
|
|
#include "graphics/RAKled.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>
|
2023-10-15 00:33:45 +00:00
|
|
|
#include <utility>
|
2020-04-15 03:22:27 +00:00
|
|
|
// #include <driver/rtc_io.h>
|
2020-02-01 16:30:53 +00:00
|
|
|
|
2022-07-31 12:11:47 +00:00
|
|
|
#ifdef ARCH_ESP32
|
2024-03-21 11:34:34 +00:00
|
|
|
#if !MESHTASTIC_EXCLUDE_WEBSERVER
|
2022-05-07 10:31:21 +00:00
|
|
|
#include "mesh/http/WebServer.h"
|
2024-03-21 11:34:34 +00:00
|
|
|
#endif
|
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"
|
2023-12-02 20:47:52 +00:00
|
|
|
#include "mesh/wifi/WiFiAPClient.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"
|
2023-12-02 20:47:52 +00:00
|
|
|
#include "mesh/eth/ethClient.h"
|
2022-10-25 22:07:02 +00:00
|
|
|
#endif
|
2023-07-09 01:37:04 +00:00
|
|
|
#include "mqtt/MQTT.h"
|
2022-10-25 22:07:02 +00:00
|
|
|
|
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"
|
2023-06-01 12:14:55 +00:00
|
|
|
#ifdef ARCH_STM32WL
|
|
|
|
#include "STM32WLE5JCInterface.h"
|
|
|
|
#endif
|
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
|
|
|
|
2024-01-12 08:00:31 +00:00
|
|
|
#ifdef ARCH_PORTDUINO
|
2023-11-29 06:48:30 +00:00
|
|
|
#include "linux/LinuxHardwareI2C.h"
|
Native Webserver (#3343)
* Added WebServer/WebServices for Native Linux Meshtastic and web gui
* Fix bug in login functionality
* Added customized config of portdunio.ini with LovyannGFX from marelab repro
* Compile Problem resolved with developer version of LovyanGFX.git
* Compile against dev version
* Fixes to fit into main branch
* Update variant.h, main.cpp, .gitignore, WebServer.cpp, esp32s2.ini, WebServer.h, ContentHandler.cpp, rp2040.ini, nrf52.ini, ContentHelper.cpp, Dockerfile, ContentHandler.h, esp32.ini, stm32wl5e.ini
* Added linux pi std /usr/include dir
* Adding /usr/innclude for Linux compile against native libs that are not hadled by platformio
* Review log level changes & translation
* Update Dockerfile
* Fix Typo & VFS ref. Part1
* Fix Typo & VFS ref.
* Dev Version for ulfius web lib
* Update platformio.ini
* Free VFS path string
* Remove unintended changes
* More unintentional changes
* Make the HTTP server optional on native
* Tune-up for Native web defaults
* Don't modify build system yet
* Remove more unneeded changes
---------
Co-authored-by: marc hammermann <marchammermann@googlemail.com>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Thomas Göttgens <tgoettgens@gmail.com>
2024-03-06 22:23:04 +00:00
|
|
|
#include "mesh/raspihttp/PiWebServer.h"
|
2023-11-18 14:12:34 +00:00
|
|
|
#include "platform/portduino/PortduinoGlue.h"
|
2023-11-16 02:33:53 +00:00
|
|
|
#include <fstream>
|
|
|
|
#include <iostream>
|
|
|
|
#include <string>
|
2023-11-15 23:04:41 +00:00
|
|
|
#endif
|
|
|
|
|
2024-01-12 08:00:31 +00:00
|
|
|
#if HAS_BUTTON || defined(ARCH_PORTDUINO)
|
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-06-01 12:14:55 +00:00
|
|
|
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
|
2023-03-23 16:32:04 +00:00
|
|
|
#include "AccelerometerThread.h"
|
2023-09-07 17:24:47 +00:00
|
|
|
#include "AmbientLightingThread.h"
|
2023-03-23 16:32:04 +00:00
|
|
|
#endif
|
|
|
|
|
2023-12-12 14:36:37 +00:00
|
|
|
#ifdef HAS_I2S
|
|
|
|
#include "AudioThread.h"
|
|
|
|
AudioThread *audioThread;
|
|
|
|
#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;
|
2023-07-30 12:51:26 +00:00
|
|
|
// 0x02 for RAK14004, 0x00 for cardkb, 0x10 for T-Deck
|
2022-05-09 18:12:49 +00:00
|
|
|
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
|
|
|
|
2023-07-22 14:26:54 +00:00
|
|
|
#ifdef T_WATCH_S3
|
|
|
|
Adafruit_DRV2605 drv;
|
|
|
|
#endif
|
2023-12-12 14:36:37 +00:00
|
|
|
|
2023-07-22 14:26:54 +00:00
|
|
|
bool isVibrating = false;
|
|
|
|
|
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
|
|
|
|
2023-10-15 00:33:45 +00:00
|
|
|
// Array map of sensor types with i2c address and wire as we'll find in the i2c scan
|
|
|
|
std::pair<uint8_t, TwoWire *> nodeTelemetrySensorsMap[_meshtastic_TelemetrySensorType_MAX + 1] = {};
|
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];
|
2024-01-12 08:00:31 +00:00
|
|
|
|
2023-11-16 03:01:17 +00:00
|
|
|
getMacAddr(dmac);
|
2024-01-12 08:00:31 +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;
|
|
|
|
|
2020-10-12 00:25:17 +00:00
|
|
|
static Periodic *ledPeriodic;
|
2022-11-25 13:17:24 +00:00
|
|
|
static OSThread *powerFSMthread;
|
2024-01-12 08:00:31 +00:00
|
|
|
#if HAS_BUTTON || defined(ARCH_PORTDUINO)
|
2022-11-25 13:17:24 +00:00
|
|
|
static OSThread *buttonThread;
|
2022-07-31 12:11:47 +00:00
|
|
|
#endif
|
2023-03-23 16:32:04 +00:00
|
|
|
static OSThread *accelerometerThread;
|
2023-09-07 17:24:47 +00:00
|
|
|
static OSThread *ambientLightingThread;
|
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
|
|
|
/**
|
2023-07-14 21:25:20 +00:00
|
|
|
* Some platforms (nrf52) might provide an alterate version that suppresses calling delay from sleep.
|
2021-04-28 07:11:55 +00:00
|
|
|
*/
|
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
|
|
|
|
2024-03-09 02:15:37 +00:00
|
|
|
// power on peripherals
|
|
|
|
#if defined(TTGO_T_ECHO) && defined(PIN_POWER_EN)
|
|
|
|
pinMode(PIN_POWER_EN, OUTPUT);
|
|
|
|
digitalWrite(PIN_POWER_EN, HIGH);
|
2024-03-15 22:12:30 +00:00
|
|
|
// digitalWrite(PIN_POWER_EN1, INPUT);
|
2022-04-26 09:43:32 +00:00
|
|
|
#endif
|
2020-02-01 16:30:53 +00:00
|
|
|
|
2024-03-12 21:42:34 +00:00
|
|
|
#if defined(LORA_TCXO_GPIO)
|
|
|
|
pinMode(LORA_TCXO_GPIO, OUTPUT);
|
|
|
|
digitalWrite(LORA_TCXO_GPIO, HIGH);
|
|
|
|
#endif
|
|
|
|
|
2023-10-05 03:24:25 +00:00
|
|
|
#if defined(VEXT_ENABLE_V03)
|
2024-02-20 13:27:48 +00:00
|
|
|
pinMode(VEXT_ENABLE_V03, OUTPUT);
|
|
|
|
pinMode(ST7735_BL_V03, OUTPUT);
|
|
|
|
digitalWrite(VEXT_ENABLE_V03, 0); // turn on the display power and antenna boost
|
|
|
|
digitalWrite(ST7735_BL_V03, 1); // display backligth on
|
|
|
|
LOG_DEBUG("HELTEC Detect Tracker V1.0\n");
|
|
|
|
#elif defined(VEXT_ENABLE_V05)
|
|
|
|
pinMode(VEXT_ENABLE_V05, OUTPUT);
|
|
|
|
pinMode(ST7735_BL_V05, OUTPUT);
|
|
|
|
digitalWrite(VEXT_ENABLE_V05, 1); // turn on the lora antenna boost
|
|
|
|
digitalWrite(ST7735_BL_V05, 1); // turn on display backligth
|
|
|
|
LOG_DEBUG("HELTEC Detect Tracker V1.1\n");
|
2023-10-05 03:24:25 +00:00
|
|
|
#elif defined(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
|
|
|
|
2023-10-05 03:24:25 +00:00
|
|
|
#if defined(VGNSS_CTRL_V03)
|
2024-02-20 13:27:48 +00:00
|
|
|
pinMode(VGNSS_CTRL_V03, OUTPUT);
|
|
|
|
digitalWrite(VGNSS_CTRL_V03, LOW);
|
2023-10-05 03:24:25 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(VTFT_CTRL_V03)
|
2024-02-20 13:27:48 +00:00
|
|
|
pinMode(VTFT_CTRL_V03, OUTPUT);
|
|
|
|
digitalWrite(VTFT_CTRL_V03, LOW);
|
2023-10-05 03:24:25 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(VGNSS_CTRL)
|
|
|
|
pinMode(VGNSS_CTRL, OUTPUT);
|
|
|
|
digitalWrite(VGNSS_CTRL, LOW);
|
|
|
|
#endif
|
|
|
|
|
2023-07-14 21:12:30 +00:00
|
|
|
#if defined(VTFT_CTRL)
|
|
|
|
pinMode(VTFT_CTRL, OUTPUT);
|
|
|
|
digitalWrite(VTFT_CTRL, LOW);
|
|
|
|
#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();
|
|
|
|
|
2023-07-22 01:37:00 +00:00
|
|
|
#if defined(_SEEED_XIAO_NRF52840_SENSE_H_)
|
|
|
|
|
|
|
|
pinMode(CHARGE_LED, INPUT); // sets to detect if charge LED is on or off to see if USB is plugged in
|
|
|
|
|
|
|
|
pinMode(HICHG, OUTPUT);
|
|
|
|
digitalWrite(HICHG, LOW); // 100 mA charging current if set to LOW and 50mA (actually about 20mA) if set to HIGH
|
|
|
|
|
|
|
|
pinMode(BAT_READ, OUTPUT);
|
|
|
|
digitalWrite(BAT_READ, LOW); // This is pin P0_14 = 14 and by pullling low to GND it provices path to read on pin 32 (P0,31)
|
|
|
|
// PIN_VBAT the voltage from divider on XIAO board
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2023-12-27 14:15:38 +00:00
|
|
|
#if defined(I2C_SDA1) && defined(ARCH_RP2040)
|
|
|
|
Wire1.setSDA(I2C_SDA1);
|
|
|
|
Wire1.setSCL(I2C_SCL1);
|
|
|
|
Wire1.begin();
|
|
|
|
#elif defined(I2C_SDA1) && !defined(ARCH_RP2040)
|
2022-10-07 11:57:55 +00:00
|
|
|
Wire1.begin(I2C_SDA1, I2C_SCL1);
|
|
|
|
#endif
|
|
|
|
|
2023-12-27 14:15:38 +00:00
|
|
|
#if defined(I2C_SDA) && defined(ARCH_RP2040)
|
|
|
|
Wire.setSDA(I2C_SDA);
|
|
|
|
Wire.setSCL(I2C_SCL);
|
|
|
|
Wire.begin();
|
|
|
|
#elif defined(I2C_SDA) && !defined(ARCH_RP2040)
|
2020-03-19 02:15:51 +00:00
|
|
|
Wire.begin(I2C_SDA, I2C_SCL);
|
2024-01-29 02:15:29 +00:00
|
|
|
#elif defined(ARCH_PORTDUINO)
|
|
|
|
if (settingsStrings[i2cdev] != "") {
|
|
|
|
LOG_INFO("Using %s as I2C device.\n", settingsStrings[i2cdev]);
|
|
|
|
Wire.begin(settingsStrings[i2cdev].c_str());
|
|
|
|
} else {
|
|
|
|
LOG_INFO("No I2C device configured, skipping.\n");
|
|
|
|
}
|
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
|
2023-07-03 14:34:32 +00:00
|
|
|
#ifdef PIN_3V3_EN
|
2022-10-23 00:55:34 +00:00
|
|
|
// 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);
|
2023-07-03 14:34:32 +00:00
|
|
|
#endif
|
2024-03-12 18:03:04 +00:00
|
|
|
#ifdef AQ_SET_PIN
|
2023-06-09 10:58:58 +00:00
|
|
|
// RAK-12039 set pin for Air quality sensor
|
|
|
|
pinMode(AQ_SET_PIN, OUTPUT);
|
|
|
|
digitalWrite(AQ_SET_PIN, HIGH);
|
|
|
|
#endif
|
2022-10-23 00:55:34 +00:00
|
|
|
#endif
|
|
|
|
|
2023-07-30 12:51:26 +00:00
|
|
|
#ifdef T_DECK
|
|
|
|
// enable keyboard
|
|
|
|
pinMode(KB_POWERON, OUTPUT);
|
|
|
|
digitalWrite(KB_POWERON, HIGH);
|
|
|
|
// There needs to be a delay after power on, give LILYGO-KEYBOARD some startup time
|
|
|
|
// otherwise keyboard and touch screen will not work
|
|
|
|
delay(800);
|
|
|
|
#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());
|
2024-01-29 02:15:29 +00:00
|
|
|
#ifdef HAS_WIRE
|
2023-03-09 03:13:46 +00:00
|
|
|
LOG_INFO("Scanning for i2c devices...\n");
|
2024-01-29 02:15:29 +00:00
|
|
|
#endif
|
2023-03-09 03:13:46 +00:00
|
|
|
|
2023-12-27 14:15:38 +00:00
|
|
|
#if defined(I2C_SDA1) && defined(ARCH_RP2040)
|
|
|
|
Wire1.setSDA(I2C_SDA1);
|
|
|
|
Wire1.setSCL(I2C_SCL1);
|
|
|
|
Wire1.begin();
|
|
|
|
i2cScanner->scanPort(ScanI2C::I2CPort::WIRE1);
|
|
|
|
#elif defined(I2C_SDA1) && !defined(ARCH_RP2040)
|
2023-03-09 03:13:46 +00:00
|
|
|
Wire1.begin(I2C_SDA1, I2C_SCL1);
|
|
|
|
i2cScanner->scanPort(ScanI2C::I2CPort::WIRE1);
|
|
|
|
#endif
|
|
|
|
|
2023-12-27 14:15:38 +00:00
|
|
|
#if defined(I2C_SDA) && defined(ARCH_RP2040)
|
|
|
|
Wire.setSDA(I2C_SDA);
|
|
|
|
Wire.setSCL(I2C_SCL);
|
|
|
|
Wire.begin();
|
|
|
|
i2cScanner->scanPort(ScanI2C::I2CPort::WIRE);
|
|
|
|
#elif defined(I2C_SDA) && !defined(ARCH_RP2040)
|
2023-03-09 03:13:46 +00:00
|
|
|
Wire.begin(I2C_SDA, I2C_SCL);
|
|
|
|
i2cScanner->scanPort(ScanI2C::I2CPort::WIRE);
|
2024-01-29 02:15:29 +00:00
|
|
|
#elif defined(ARCH_PORTDUINO)
|
|
|
|
if (settingsStrings[i2cdev] != "") {
|
|
|
|
LOG_INFO("Scanning for i2c devices...\n");
|
|
|
|
i2cScanner->scanPort(ScanI2C::I2CPort::WIRE);
|
|
|
|
}
|
2023-03-09 03:13:46 +00:00
|
|
|
#elif HAS_WIRE
|
|
|
|
i2cScanner->scanPort(ScanI2C::I2CPort::WIRE);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
auto i2cCount = i2cScanner->countDevices();
|
|
|
|
if (i2cCount == 0) {
|
|
|
|
LOG_INFO("No I2C devices found\n");
|
2023-12-08 17:13:15 +00:00
|
|
|
Wire.end();
|
|
|
|
#ifdef I2C_SDA1
|
|
|
|
Wire1.end();
|
|
|
|
#endif
|
2023-03-09 03:13:46 +00:00
|
|
|
} 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:
|
2023-07-30 12:51:26 +00:00
|
|
|
kb_model = 0x00;
|
|
|
|
break;
|
|
|
|
case ScanI2C::DeviceType::TDECKKB:
|
|
|
|
// assign an arbitrary value to distinguish from other models
|
|
|
|
kb_model = 0x10;
|
|
|
|
break;
|
2023-08-19 13:37:42 +00:00
|
|
|
case ScanI2C::DeviceType::BBQ10KB:
|
|
|
|
// assign an arbitrary value to distinguish from other models
|
|
|
|
kb_model = 0x11;
|
|
|
|
break;
|
2023-03-09 03:13:46 +00:00
|
|
|
default:
|
|
|
|
// use this as default since it's also just zero
|
2023-07-30 12:51:26 +00:00
|
|
|
LOG_WARN("kb_info.type is unknown(0x%02x), setting kb_model=0x00\n", kb_info.type);
|
2023-03-09 03:13:46 +00:00
|
|
|
kb_model = 0x00;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pmu_found = i2cScanner->exists(ScanI2C::DeviceType::PMU_AXP192_AXP2101);
|
|
|
|
|
2023-07-03 14:34:32 +00:00
|
|
|
/*
|
|
|
|
* 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-06-01 12:14:55 +00:00
|
|
|
|
2023-07-03 14:34:32 +00:00
|
|
|
// Only one supported RGB LED currently
|
|
|
|
#ifdef HAS_NCP5623
|
2023-05-06 12:17:40 +00:00
|
|
|
rgb_found = i2cScanner->find(ScanI2C::DeviceType::NCP5623);
|
2023-06-27 00:59:44 +00:00
|
|
|
#endif
|
|
|
|
|
2023-06-01 12:14:55 +00:00
|
|
|
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
|
2023-03-23 16:32:04 +00:00
|
|
|
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) { \
|
2023-10-15 00:33:45 +00:00
|
|
|
nodeTelemetrySensorsMap[PB_T].first = found.address.address; \
|
|
|
|
nodeTelemetrySensorsMap[PB_T].second = i2cScanner->fetchI2CBus(found.address); \
|
2023-03-09 03:13:46 +00:00
|
|
|
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)
|
2024-03-02 21:14:34 +00:00
|
|
|
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::BMP_085, meshtastic_TelemetrySensorType_BMP085)
|
2023-03-09 03:13:46 +00:00
|
|
|
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::INA260, meshtastic_TelemetrySensorType_INA260)
|
|
|
|
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::INA219, meshtastic_TelemetrySensorType_INA219)
|
2023-11-05 01:07:00 +00:00
|
|
|
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::INA3221, meshtastic_TelemetrySensorType_INA3221)
|
2023-03-09 03:13:46 +00:00
|
|
|
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
|
2023-07-29 12:19:58 +00:00
|
|
|
|
|
|
|
#ifdef ARCH_RP2040
|
|
|
|
rp2040Setup();
|
|
|
|
#endif
|
|
|
|
|
2020-12-26 05:36:21 +00:00
|
|
|
// We do this as early as possible because this loads preferences from flash
|
2023-08-07 17:34:42 +00:00
|
|
|
// but we need to do this after main cpu init (esp32setup), because we need the random seed set
|
2024-03-21 18:14:02 +00:00
|
|
|
nodeDB = new NodeDB;
|
2020-12-26 05:36:21 +00:00
|
|
|
|
2023-12-08 17:13:15 +00:00
|
|
|
// If we're taking on the repeater role, use flood router and turn off 3V3_S rail because peripherals are not needed
|
|
|
|
if (config.device.role == meshtastic_Config_DeviceConfig_Role_REPEATER) {
|
2023-01-28 14:03:32 +00:00
|
|
|
router = new FloodingRouter();
|
2023-12-08 17:13:15 +00:00
|
|
|
#ifdef PIN_3V3_EN
|
|
|
|
digitalWrite(PIN_3V3_EN, LOW);
|
|
|
|
#endif
|
|
|
|
} else
|
2023-05-04 07:55:12 +00:00
|
|
|
router = new ReliableRouter();
|
2023-01-28 14:03:32 +00:00
|
|
|
|
2024-01-12 08:00:31 +00:00
|
|
|
#if HAS_BUTTON || defined(ARCH_PORTDUINO)
|
2023-04-18 12:22:37 +00:00
|
|
|
// 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-06-01 12:14:55 +00:00
|
|
|
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
|
2023-03-29 18:04:02 +00:00
|
|
|
if (acc_info.type != ScanI2C::DeviceType::NONE) {
|
2023-07-22 14:26:54 +00:00
|
|
|
config.display.wake_on_tap_or_motion = true;
|
|
|
|
moduleConfig.external_notification.enabled = true;
|
2023-03-29 18:04:02 +00:00
|
|
|
accelerometerThread = new AccelerometerThread(acc_info.type);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2023-09-07 17:24:47 +00:00
|
|
|
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
|
|
|
|
if (rgb_found.type != ScanI2C::DeviceType::NONE) {
|
|
|
|
ambientLightingThread = new AmbientLightingThread(rgb_found.type);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2023-07-22 14:26:54 +00:00
|
|
|
#ifdef T_WATCH_S3
|
|
|
|
drv.begin();
|
|
|
|
drv.selectLibrary(1);
|
|
|
|
// I2C trigger by sending 'go' command
|
|
|
|
drv.setMode(DRV2605_MODE_INTTRIG);
|
|
|
|
#endif
|
|
|
|
|
2020-08-29 00:38:23 +00:00
|
|
|
// Init our SPI controller (must be before screen and lora)
|
|
|
|
initSPI();
|
2023-05-23 21:19:36 +00:00
|
|
|
#ifdef ARCH_RP2040
|
|
|
|
#ifdef HW_SPI1_DEVICE
|
2023-11-29 21:51:05 +00:00
|
|
|
SPI1.setSCK(LORA_SCK);
|
|
|
|
SPI1.setTX(LORA_MOSI);
|
|
|
|
SPI1.setRX(LORA_MISO);
|
|
|
|
pinMode(LORA_CS, OUTPUT);
|
|
|
|
digitalWrite(LORA_CS, HIGH);
|
2023-05-23 21:19:36 +00:00
|
|
|
SPI1.begin(false);
|
2024-01-12 08:00:31 +00:00
|
|
|
#else // HW_SPI1_DEVICE
|
2023-11-29 21:51:05 +00:00
|
|
|
SPI.setSCK(LORA_SCK);
|
|
|
|
SPI.setTX(LORA_MOSI);
|
|
|
|
SPI.setRX(LORA_MISO);
|
2023-05-23 21:19:36 +00:00
|
|
|
SPI.begin(false);
|
2024-01-12 08:00:31 +00:00
|
|
|
#endif // HW_SPI1_DEVICE
|
|
|
|
#elif ARCH_PORTDUINO
|
|
|
|
SPI.begin(settingsStrings[spidev].c_str());
|
2023-05-23 21:19:36 +00:00
|
|
|
#elif !defined(ARCH_ESP32) // ARCH_RP2040
|
2020-08-29 00:38:23 +00:00
|
|
|
SPI.begin();
|
|
|
|
#else
|
|
|
|
// ESP32
|
2023-11-29 21:51:05 +00:00
|
|
|
SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS);
|
|
|
|
LOG_WARN("SPI.begin(SCK=%d, MISO=%d, MOSI=%d, NSS=%d)\n", LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS);
|
2020-08-29 00:38:23 +00:00
|
|
|
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)
|
2023-09-17 04:10:10 +00:00
|
|
|
|
2023-12-08 17:13:15 +00:00
|
|
|
// If we're taking on the repeater role, ignore GPS
|
2024-02-01 21:24:39 +00:00
|
|
|
if (config.device.role != meshtastic_Config_DeviceConfig_Role_REPEATER &&
|
|
|
|
config.position.gps_mode != meshtastic_Config_PositionConfig_GpsMode_NOT_PRESENT) {
|
2023-12-08 17:13:15 +00:00
|
|
|
gps = GPS::createGps();
|
|
|
|
}
|
2023-09-17 04:10:10 +00:00
|
|
|
if (gps) {
|
2023-09-12 21:46:46 +00:00
|
|
|
gpsStatus->observe(&gps->newStatus);
|
2023-09-17 04:10:10 +00:00
|
|
|
} else {
|
|
|
|
LOG_DEBUG("Running without GPS.\n");
|
|
|
|
}
|
2024-03-21 14:06:37 +00:00
|
|
|
nodeStatus->observe(&nodeDB->newStatus);
|
2020-03-18 22:00:17 +00:00
|
|
|
|
2023-12-12 14:36:37 +00:00
|
|
|
#ifdef HAS_I2S
|
|
|
|
LOG_DEBUG("Starting audio thread\n");
|
|
|
|
audioThread = new AudioThread();
|
|
|
|
#endif
|
|
|
|
|
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)
|
2023-07-19 13:13:51 +00:00
|
|
|
#if defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7789_CS)
|
2020-10-21 09:27:13 +00:00
|
|
|
screen->setup();
|
2024-01-12 08:00:31 +00:00
|
|
|
#elif defined(ARCH_PORTDUINO)
|
2023-12-13 02:27:31 +00:00
|
|
|
if (screen_found.port != ScanI2C::I2CPort::NO_I2C || settingsMap[displayPanel]) {
|
|
|
|
screen->setup();
|
|
|
|
}
|
2020-10-21 09:27:13 +00:00
|
|
|
#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
|
|
|
|
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
|
|
|
|
|
2024-03-07 13:11:25 +00:00
|
|
|
#ifdef PIN_PWR_DELAY_MS
|
|
|
|
// This may be required to give the peripherals time to power up.
|
|
|
|
delay(PIN_PWR_DELAY_MS);
|
|
|
|
#endif
|
|
|
|
|
2024-01-12 08:00:31 +00:00
|
|
|
#ifdef ARCH_PORTDUINO
|
2023-11-18 14:12:34 +00:00
|
|
|
if (settingsMap[use_sx1262]) {
|
|
|
|
if (!rIf) {
|
2024-01-22 07:27:06 +00:00
|
|
|
LOG_DEBUG("Attempting to activate sx1262 radio on SPI port %s\n", settingsStrings[spidev].c_str());
|
2023-11-27 03:30:08 +00:00
|
|
|
LockingArduinoHal *RadioLibHAL = new LockingArduinoHal(SPI, spiSettings);
|
2023-11-19 20:00:03 +00:00
|
|
|
rIf = new SX1262Interface((LockingArduinoHal *)RadioLibHAL, settingsMap[cs], settingsMap[irq], settingsMap[reset],
|
|
|
|
settingsMap[busy]);
|
2023-11-18 14:12:34 +00:00
|
|
|
if (!rIf->init()) {
|
|
|
|
LOG_ERROR("Failed to find SX1262 radio\n");
|
|
|
|
delete rIf;
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
} else {
|
|
|
|
LOG_INFO("SX1262 Radio init succeeded, using SX1262 radio\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (settingsMap[use_rf95]) {
|
|
|
|
if (!rIf) {
|
2024-01-22 07:27:06 +00:00
|
|
|
LOG_DEBUG("Attempting to activate rf95 radio on SPI port %s\n", settingsStrings[spidev].c_str());
|
2023-11-27 03:30:08 +00:00
|
|
|
LockingArduinoHal *RadioLibHAL = new LockingArduinoHal(SPI, spiSettings);
|
2023-11-19 20:00:03 +00:00
|
|
|
rIf = new RF95Interface((LockingArduinoHal *)RadioLibHAL, settingsMap[cs], settingsMap[irq], settingsMap[reset],
|
|
|
|
settingsMap[busy]);
|
2023-11-18 14:12:34 +00:00
|
|
|
if (!rIf->init()) {
|
|
|
|
LOG_ERROR("Failed to find RF95 radio\n");
|
|
|
|
delete rIf;
|
|
|
|
rIf = NULL;
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
} else {
|
|
|
|
LOG_INFO("RF95 Radio init succeeded, using RF95 radio\n");
|
|
|
|
}
|
2023-11-15 23:04:41 +00:00
|
|
|
}
|
2023-12-18 00:05:04 +00:00
|
|
|
} else if (settingsMap[use_sx1280]) {
|
|
|
|
if (!rIf) {
|
2024-01-22 07:27:06 +00:00
|
|
|
LOG_DEBUG("Attempting to activate sx1280 radio on SPI port %s\n", settingsStrings[spidev].c_str());
|
2023-12-18 00:05:04 +00:00
|
|
|
LockingArduinoHal *RadioLibHAL = new LockingArduinoHal(SPI, spiSettings);
|
|
|
|
rIf = new SX1280Interface((LockingArduinoHal *)RadioLibHAL, settingsMap[cs], settingsMap[irq], settingsMap[reset],
|
|
|
|
settingsMap[busy]);
|
|
|
|
if (!rIf->init()) {
|
|
|
|
LOG_ERROR("Failed to find SX1280 radio\n");
|
|
|
|
delete rIf;
|
|
|
|
rIf = NULL;
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
} else {
|
|
|
|
LOG_INFO("SX1280 Radio init succeeded, using SX1280 radio\n");
|
|
|
|
}
|
|
|
|
}
|
2023-11-15 23:04:41 +00:00
|
|
|
}
|
|
|
|
|
2023-11-16 02:33:53 +00:00
|
|
|
#elif defined(HW_SPI1_DEVICE)
|
2023-05-23 21:19:36 +00:00
|
|
|
LockingArduinoHal *RadioLibHAL = new LockingArduinoHal(SPI1, spiSettings);
|
|
|
|
#else // HW_SPI1_DEVICE
|
2023-05-08 11:18:28 +00:00
|
|
|
LockingArduinoHal *RadioLibHAL = new LockingArduinoHal(SPI, spiSettings);
|
2023-05-23 21:19:36 +00:00
|
|
|
#endif
|
2023-05-08 11:18:28 +00:00
|
|
|
|
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)
|
2023-06-01 12:14:55 +00:00
|
|
|
#if defined(USE_STM32WLx)
|
|
|
|
if (!rIf) {
|
|
|
|
rIf = new STM32WLE5JCInterface(RadioLibHAL, SX126X_CS, SX126X_DIO1, SX126X_RESET, SX126X_BUSY);
|
|
|
|
if (!rIf->init()) {
|
|
|
|
LOG_WARN("Failed to find STM32WL radio\n");
|
|
|
|
delete rIf;
|
|
|
|
rIf = NULL;
|
|
|
|
} else {
|
|
|
|
LOG_INFO("STM32WL Radio init succeeded, using STM32WL radio\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
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-11-29 21:51:05 +00:00
|
|
|
rIf = new RF95Interface(RadioLibHAL, LORA_CS, 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
|
|
|
|
|
2024-01-12 08:00:31 +00:00
|
|
|
#if defined(USE_SX1262) && !defined(ARCH_PORTDUINO)
|
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;
|
2024-03-21 14:06:37 +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
|
|
|
}
|
|
|
|
|
2021-08-18 02:59:56 +00:00
|
|
|
mqttInit();
|
|
|
|
|
2022-10-22 14:53:57 +00:00
|
|
|
#ifndef ARCH_PORTDUINO
|
2020-09-13 04:43:41 +00:00
|
|
|
// Initialize Wifi
|
2023-12-02 20:47:52 +00:00
|
|
|
#if HAS_WIFI
|
2022-10-25 09:53:22 +00:00
|
|
|
initWifi();
|
2023-12-02 20:47:52 +00:00
|
|
|
#endif
|
2020-09-13 04:43:41 +00:00
|
|
|
|
2023-12-02 20:47:52 +00:00
|
|
|
#if HAS_ETHERNET
|
2022-10-22 14:29:50 +00:00
|
|
|
// Initialize Ethernet
|
|
|
|
initEthernet();
|
2022-10-22 14:53:57 +00:00
|
|
|
#endif
|
2023-12-02 20:47:52 +00:00
|
|
|
#endif
|
2022-10-22 14:29:50 +00:00
|
|
|
|
2024-03-21 11:34:34 +00:00
|
|
|
#if defined(ARCH_ESP32) && !MESHTASTIC_EXCLUDE_WEBSERVER
|
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
|
Native Webserver (#3343)
* Added WebServer/WebServices for Native Linux Meshtastic and web gui
* Fix bug in login functionality
* Added customized config of portdunio.ini with LovyannGFX from marelab repro
* Compile Problem resolved with developer version of LovyanGFX.git
* Compile against dev version
* Fixes to fit into main branch
* Update variant.h, main.cpp, .gitignore, WebServer.cpp, esp32s2.ini, WebServer.h, ContentHandler.cpp, rp2040.ini, nrf52.ini, ContentHelper.cpp, Dockerfile, ContentHandler.h, esp32.ini, stm32wl5e.ini
* Added linux pi std /usr/include dir
* Adding /usr/innclude for Linux compile against native libs that are not hadled by platformio
* Review log level changes & translation
* Update Dockerfile
* Fix Typo & VFS ref. Part1
* Fix Typo & VFS ref.
* Dev Version for ulfius web lib
* Update platformio.ini
* Free VFS path string
* Remove unintended changes
* More unintentional changes
* Make the HTTP server optional on native
* Tune-up for Native web defaults
* Don't modify build system yet
* Remove more unneeded changes
---------
Co-authored-by: marc hammermann <marchammermann@googlemail.com>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Thomas Göttgens <tgoettgens@gmail.com>
2024-03-06 22:23:04 +00:00
|
|
|
#if __has_include(<ulfius.h>)
|
|
|
|
if (settingsMap[webserverport] != -1) {
|
|
|
|
piwebServerThread = new PiWebServerThread();
|
|
|
|
}
|
|
|
|
#endif
|
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
|
|
|
|
2023-06-08 13:07:32 +00:00
|
|
|
// Log bit rate to debug output
|
|
|
|
LOG_DEBUG("LoRA bitrate = %f bytes / sec\n", (float(meshtastic_Constants_DATA_PAYLOAD_LEN) /
|
|
|
|
(float(rIf->getPacketTime(meshtastic_Constants_DATA_PAYLOAD_LEN)))) *
|
|
|
|
1000);
|
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-19 02:15:51 +00:00
|
|
|
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
|
2023-07-14 21:25:20 +00:00
|
|
|
// This will suppress the current delay and instead try to run ASAP.
|
2021-03-28 04:16:37 +00:00
|
|
|
bool runASAP;
|
|
|
|
|
2023-02-16 18:18:27 +00:00
|
|
|
extern meshtastic_DeviceMetadata getDeviceMetadata()
|
|
|
|
{
|
|
|
|
meshtastic_DeviceMetadata deviceMetadata;
|
2023-06-08 13:07:32 +00:00
|
|
|
strncpy(deviceMetadata.firmware_version, optstr(APP_VERSION), sizeof(deviceMetadata.firmware_version));
|
2023-02-16 18:18:27 +00:00
|
|
|
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");
|
2024-03-21 14:06:37 +00:00
|
|
|
}
|