2020-02-01 16:30:53 +00:00
|
|
|
/*
|
|
|
|
|
|
|
|
Main module
|
|
|
|
|
|
|
|
# Modified by Kyle T. Gabriel to fix issue with incorrect GPS data for TTNMapper
|
|
|
|
|
|
|
|
Copyright (C) 2018 by Xose Pérez <xose dot perez at gmail dot com>
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
2020-03-19 02:15:51 +00:00
|
|
|
#include "MeshRadio.h"
|
2020-02-02 20:45:32 +00:00
|
|
|
#include "MeshService.h"
|
2020-09-16 16:22:03 +00:00
|
|
|
#include "NMEAGPS.h"
|
2020-02-08 04:59:21 +00:00
|
|
|
#include "NodeDB.h"
|
2020-03-19 02:15:51 +00:00
|
|
|
#include "PowerFSM.h"
|
2020-05-04 18:15:05 +00:00
|
|
|
#include "UBloxGPS.h"
|
2020-07-08 01:33:33 +00:00
|
|
|
#include "concurrency/Periodic.h"
|
2020-03-19 02:15:51 +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-04-15 03:22:27 +00:00
|
|
|
// #include "rom/rtc.h"
|
2020-05-27 22:31:32 +00:00
|
|
|
#include "DSRRouter.h"
|
2020-07-10 02:57:55 +00:00
|
|
|
// #include "debug.h"
|
2020-08-29 00:38:23 +00:00
|
|
|
#include "SPILock.h"
|
2020-07-07 08:46:49 +00:00
|
|
|
#include "graphics/Screen.h"
|
2020-07-08 01:33:33 +00:00
|
|
|
#include "main.h"
|
2020-02-22 01:01:26 +00:00
|
|
|
#include "sleep.h"
|
2020-09-06 16:24:08 +00:00
|
|
|
#include "target_specific.h"
|
2020-06-22 18:09:26 +00:00
|
|
|
#include <OneButton.h>
|
2020-07-01 17:08:38 +00:00
|
|
|
#include <Wire.h>
|
2020-04-15 03:22:27 +00:00
|
|
|
// #include <driver/rtc_io.h>
|
2020-02-01 16:30:53 +00:00
|
|
|
|
2020-04-10 19:18:48 +00:00
|
|
|
#ifndef NO_ESP32
|
2020-07-22 19:08:54 +00:00
|
|
|
#include "nimble/BluetoothUtil.h"
|
2020-04-10 19:18:48 +00:00
|
|
|
#endif
|
|
|
|
|
2020-06-17 00:01:50 +00:00
|
|
|
#include "RF95Interface.h"
|
|
|
|
#include "SX1262Interface.h"
|
|
|
|
|
|
|
|
#ifdef NRF52_SERIES
|
|
|
|
#include "variant.h"
|
|
|
|
#endif
|
|
|
|
|
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-07-07 08:46:49 +00:00
|
|
|
graphics::Screen screen(SSD1306_ADDRESS);
|
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
|
|
|
|
|
|
|
bool ssd1306_found;
|
|
|
|
bool axp192_found;
|
|
|
|
|
2020-05-27 22:31:32 +00:00
|
|
|
DSRRouter realRouter;
|
2020-04-17 18:52:20 +00:00
|
|
|
Router &router = realRouter; // Users of router don't care what sort of subclass implements that API
|
|
|
|
|
2020-02-01 16:30:53 +00:00
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// Application
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void scanI2Cdevice(void)
|
|
|
|
{
|
2020-03-19 02:15:51 +00:00
|
|
|
byte err, addr;
|
|
|
|
int nDevices = 0;
|
|
|
|
for (addr = 1; addr < 127; addr++) {
|
|
|
|
Wire.beginTransmission(addr);
|
|
|
|
err = Wire.endTransmission();
|
|
|
|
if (err == 0) {
|
|
|
|
DEBUG_MSG("I2C device found at address 0x%x\n", addr);
|
|
|
|
|
|
|
|
nDevices++;
|
|
|
|
|
|
|
|
if (addr == SSD1306_ADDRESS) {
|
|
|
|
ssd1306_found = true;
|
|
|
|
DEBUG_MSG("ssd1306 display found\n");
|
|
|
|
}
|
2020-04-24 21:55:51 +00:00
|
|
|
#ifdef AXP192_SLAVE_ADDRESS
|
2020-03-19 02:15:51 +00:00
|
|
|
if (addr == AXP192_SLAVE_ADDRESS) {
|
|
|
|
axp192_found = true;
|
|
|
|
DEBUG_MSG("axp192 PMU found\n");
|
|
|
|
}
|
2020-02-02 00:14:34 +00:00
|
|
|
#endif
|
2020-03-19 02:15:51 +00:00
|
|
|
} else if (err == 4) {
|
|
|
|
DEBUG_MSG("Unknow error at address 0x%x\n", addr);
|
|
|
|
}
|
2020-02-01 16:30:53 +00:00
|
|
|
}
|
2020-03-19 02:15:51 +00:00
|
|
|
if (nDevices == 0)
|
|
|
|
DEBUG_MSG("No I2C devices found\n");
|
|
|
|
else
|
|
|
|
DEBUG_MSG("done\n");
|
2020-02-01 16:30:53 +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
|
|
|
|
2020-03-19 02:15:51 +00:00
|
|
|
// Meshtastic_ab3c
|
|
|
|
static char name[20];
|
|
|
|
sprintf(name, "Meshtastic_%02x%02x", dmac[4], dmac[5]);
|
|
|
|
return name;
|
2020-02-02 20:55:26 +00:00
|
|
|
}
|
|
|
|
|
2020-04-25 17:59:40 +00:00
|
|
|
static uint32_t ledBlinker()
|
|
|
|
{
|
|
|
|
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-06-29 01:17:52 +00:00
|
|
|
return powerStatus->getIsCharging() ? 1000 : (ledOn ? 2 : 1000);
|
2020-04-25 17:59:40 +00:00
|
|
|
}
|
|
|
|
|
2020-07-05 22:54:30 +00:00
|
|
|
concurrency::Periodic ledPeriodic(ledBlinker);
|
2020-04-17 16:48:54 +00:00
|
|
|
|
2020-06-22 18:09:26 +00:00
|
|
|
// Prepare for button presses
|
|
|
|
#ifdef BUTTON_PIN
|
2020-07-01 17:08:38 +00:00
|
|
|
OneButton userButton;
|
2020-06-22 18:09:26 +00:00
|
|
|
#endif
|
|
|
|
#ifdef BUTTON_PIN_ALT
|
2020-07-01 17:08:38 +00:00
|
|
|
OneButton userButtonAlt;
|
2020-06-22 18:09:26 +00:00
|
|
|
#endif
|
2020-07-01 17:08:38 +00:00
|
|
|
void userButtonPressed()
|
|
|
|
{
|
2020-06-22 18:09:26 +00:00
|
|
|
powerFSM.trigger(EVENT_PRESS);
|
|
|
|
}
|
2020-07-01 17:08:38 +00:00
|
|
|
void userButtonPressedLong()
|
|
|
|
{
|
2020-06-22 19:03:26 +00:00
|
|
|
screen.adjustBrightness();
|
|
|
|
}
|
2020-04-29 21:54:03 +00:00
|
|
|
|
2020-02-02 00:14:34 +00:00
|
|
|
void setup()
|
|
|
|
{
|
2020-04-24 15:06:29 +00:00
|
|
|
#ifdef USE_SEGGER
|
|
|
|
SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_TRIM);
|
|
|
|
#endif
|
2020-04-24 15:52:49 +00:00
|
|
|
|
2020-02-02 00:14:34 +00:00
|
|
|
// Debug
|
|
|
|
#ifdef DEBUG_PORT
|
2020-04-27 16:36:39 +00:00
|
|
|
DEBUG_PORT.init(); // Set serial baud rate and init our mesh console
|
2020-02-02 00:14:34 +00:00
|
|
|
#endif
|
2020-02-01 16:30:53 +00:00
|
|
|
|
2020-03-19 02:15:51 +00:00
|
|
|
initDeepSleep();
|
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
|
|
|
|
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);
|
2020-04-23 20:53:51 +00:00
|
|
|
#else
|
|
|
|
Wire.begin();
|
2020-02-04 15:31:32 +00:00
|
|
|
#endif
|
2020-06-05 18:00:58 +00:00
|
|
|
// i2c still busted on new board
|
2020-06-15 21:43:16 +00:00
|
|
|
#ifndef ARDUINO_NRF52840_PPR
|
|
|
|
scanI2Cdevice();
|
|
|
|
#endif
|
2020-04-23 20:53:51 +00:00
|
|
|
|
2020-03-19 02:15:51 +00:00
|
|
|
// Buttons & LED
|
2020-02-01 22:23:21 +00:00
|
|
|
#ifdef BUTTON_PIN
|
2020-06-22 18:09:26 +00:00
|
|
|
userButton = OneButton(BUTTON_PIN, true, true);
|
|
|
|
userButton.attachClick(userButtonPressed);
|
2020-06-22 19:03:26 +00:00
|
|
|
userButton.attachDuringLongPress(userButtonPressedLong);
|
2020-06-22 18:09:26 +00:00
|
|
|
#endif
|
|
|
|
#ifdef BUTTON_PIN_ALT
|
|
|
|
userButtonAlt = OneButton(BUTTON_PIN_ALT, true, true);
|
|
|
|
userButtonAlt.attachClick(userButtonPressed);
|
2020-06-22 19:03:26 +00:00
|
|
|
userButton.attachDuringLongPress(userButtonPressedLong);
|
2020-02-01 22:23:21 +00:00
|
|
|
#endif
|
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-04-25 17:59:40 +00:00
|
|
|
ledPeriodic.setup();
|
|
|
|
|
2020-03-19 02:15:51 +00:00
|
|
|
// Hello
|
2020-05-13 00:57:51 +00:00
|
|
|
DEBUG_MSG("Meshtastic swver=%s, hwver=%s\n", optstr(APP_VERSION), optstr(HW_VERSION));
|
2020-02-01 16:30:53 +00:00
|
|
|
|
2020-04-15 03:22:27 +00:00
|
|
|
#ifndef NO_ESP32
|
2020-03-19 02:15:51 +00:00
|
|
|
// 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)
|
|
|
|
ssd1306_found = false; // forget we even have the hardware
|
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
|
|
|
|
2020-07-01 17:08:38 +00:00
|
|
|
// Currently only the tbeam has a PMU
|
2020-06-28 04:19:49 +00:00
|
|
|
power = new Power();
|
|
|
|
power->setup();
|
2020-06-29 01:17:52 +00:00
|
|
|
power->setStatusHandler(powerStatus);
|
|
|
|
powerStatus->observe(&power->newStatus);
|
2020-02-01 16:30:53 +00:00
|
|
|
|
2020-04-24 16:33:45 +00:00
|
|
|
#ifdef NRF52_SERIES
|
|
|
|
nrf52Setup();
|
|
|
|
#endif
|
|
|
|
|
2020-08-29 00:38:23 +00:00
|
|
|
// Init our SPI controller (must be before screen and lora)
|
|
|
|
initSPI();
|
2020-09-05 00:23:17 +00:00
|
|
|
#ifdef NO_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.
|
2020-08-28 22:06:52 +00:00
|
|
|
#ifdef ST7735_CS
|
|
|
|
screen.setup();
|
|
|
|
#else
|
2020-03-19 02:15:51 +00:00
|
|
|
if (ssd1306_found)
|
|
|
|
screen.setup();
|
2020-08-28 22:06:52 +00:00
|
|
|
#endif
|
2020-02-01 16:30:53 +00:00
|
|
|
|
2020-03-19 02:15:51 +00:00
|
|
|
screen.print("Started...\n");
|
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)
|
|
|
|
|
2020-05-10 19:33:17 +00:00
|
|
|
// If we know we have a L80 GPS, don't try UBLOX
|
|
|
|
#ifndef L80_RESET
|
2020-05-04 18:15:05 +00:00
|
|
|
// Init GPS - first try ublox
|
2020-08-21 17:14:03 +00:00
|
|
|
auto ublox = new UBloxGPS();
|
|
|
|
gps = ublox;
|
2020-05-04 18:15:05 +00:00
|
|
|
if (!gps->setup()) {
|
2020-07-10 19:16:10 +00:00
|
|
|
DEBUG_MSG("ERROR: No UBLOX GPS found\n");
|
2020-07-10 18:43:14 +00:00
|
|
|
|
2020-08-21 17:14:03 +00:00
|
|
|
delete ublox;
|
|
|
|
gps = ublox = NULL;
|
|
|
|
|
2020-07-10 21:37:01 +00:00
|
|
|
if (GPS::_serial_gps) {
|
2020-07-10 19:16:10 +00:00
|
|
|
// Some boards might have only the TX line from the GPS connected, in that case, we can't configure it at all. Just
|
2020-09-16 16:22:03 +00:00
|
|
|
// assume NMEA at 9600 baud.
|
|
|
|
DEBUG_MSG("Hoping that NMEA might work\n");
|
2020-07-10 19:16:10 +00:00
|
|
|
|
2020-09-16 16:22:03 +00:00
|
|
|
// dumb NMEA access only work for serial GPSes)
|
|
|
|
gps = new NMEAGPS();
|
2020-07-10 18:43:14 +00:00
|
|
|
gps->setup();
|
|
|
|
}
|
2020-05-04 18:15:05 +00:00
|
|
|
}
|
2020-05-10 19:33:17 +00:00
|
|
|
#else
|
2020-09-16 16:22:03 +00:00
|
|
|
gps = new NMEAGPS();
|
2020-05-10 19:33:17 +00:00
|
|
|
gps->setup();
|
|
|
|
#endif
|
2020-09-06 21:45:43 +00:00
|
|
|
if (gps)
|
|
|
|
gpsStatus->observe(&gps->newStatus);
|
|
|
|
else
|
|
|
|
DEBUG_MSG("Warning: No GPS found - running without GPS\n");
|
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
|
|
|
|
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
|
|
|
|
if (ublox && !devicestate.did_gps_reset) {
|
|
|
|
if (ublox->factoryReset()) { // If we don't succeed try again next time
|
|
|
|
devicestate.did_gps_reset = true;
|
|
|
|
nodeDB.saveToDisk();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-30 01:46:32 +00:00
|
|
|
#ifdef SX1262_ANT_SW
|
|
|
|
// make analog PA vs not PA switch on SX1262 eval board work properly
|
|
|
|
pinMode(SX1262_ANT_SW, OUTPUT);
|
|
|
|
digitalWrite(SX1262_ANT_SW, 1);
|
|
|
|
#endif
|
|
|
|
|
2020-04-14 18:40:49 +00:00
|
|
|
// MUST BE AFTER service.init, so we have our radio config settings (from nodedb init)
|
2020-08-20 22:42:36 +00:00
|
|
|
RadioInterface *rIf = NULL;
|
|
|
|
|
2020-07-10 21:37:01 +00:00
|
|
|
#if defined(RF95_IRQ)
|
2020-08-20 22:42:36 +00:00
|
|
|
if (!rIf) {
|
|
|
|
rIf = new RF95Interface(RF95_NSS, RF95_IRQ, RF95_RESET, SPI);
|
|
|
|
if (!rIf->init()) {
|
|
|
|
DEBUG_MSG("Warning: Failed to find RF95 radio\n");
|
|
|
|
delete rIf;
|
|
|
|
rIf = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(SX1262_CS)
|
|
|
|
if (!rIf) {
|
|
|
|
rIf = new SX1262Interface(SX1262_CS, SX1262_DIO1, SX1262_RESET, SX1262_BUSY, SPI);
|
|
|
|
if (!rIf->init()) {
|
|
|
|
DEBUG_MSG("Warning: Failed to find SX1262 radio\n");
|
|
|
|
delete rIf;
|
|
|
|
rIf = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef USE_SIM_RADIO
|
|
|
|
if (!rIf) {
|
|
|
|
rIf = new SimRadio;
|
|
|
|
if (!rIf->init()) {
|
|
|
|
DEBUG_MSG("Warning: Failed to find simulated radio\n");
|
|
|
|
delete rIf;
|
|
|
|
rIf = NULL;
|
|
|
|
}
|
|
|
|
}
|
2020-04-29 21:54:03 +00:00
|
|
|
#endif
|
2020-04-14 18:40:49 +00:00
|
|
|
|
2020-08-20 22:42:36 +00:00
|
|
|
if (!rIf)
|
2020-04-14 18:40:49 +00:00
|
|
|
recordCriticalError(ErrNoRadio);
|
2020-05-25 22:47:45 +00:00
|
|
|
else
|
|
|
|
router.addInterface(rIf);
|
2020-04-14 18:40:49 +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-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
|
|
|
}
|
|
|
|
|
2020-02-17 00:03:16 +00:00
|
|
|
#if 0
|
|
|
|
// Turn off for now
|
2020-02-15 19:15:43 +00:00
|
|
|
|
2020-03-26 16:24:53 +00:00
|
|
|
uint32_t axpDebugRead()
|
2020-02-17 00:03:16 +00:00
|
|
|
{
|
|
|
|
axp.debugCharging();
|
|
|
|
DEBUG_MSG("vbus current %f\n", axp.getVbusCurrent());
|
|
|
|
DEBUG_MSG("charge current %f\n", axp.getBattChargeCurrent());
|
|
|
|
DEBUG_MSG("bat voltage %f\n", axp.getBattVoltage());
|
|
|
|
DEBUG_MSG("batt pct %d\n", axp.getBattPercentage());
|
2020-03-26 16:24:53 +00:00
|
|
|
DEBUG_MSG("is battery connected %d\n", axp.isBatteryConnect());
|
|
|
|
DEBUG_MSG("is USB connected %d\n", axp.isVBUSPlug());
|
|
|
|
DEBUG_MSG("is charging %d\n", axp.isChargeing());
|
2020-02-17 00:03:16 +00:00
|
|
|
|
|
|
|
return 30 * 1000;
|
2020-02-15 19:15:43 +00:00
|
|
|
}
|
|
|
|
|
2020-07-05 22:54:30 +00:00
|
|
|
concurrency::Periodic axpDebugOutput(axpDebugRead);
|
2020-04-25 17:59:40 +00:00
|
|
|
axpDebugOutput.setup();
|
2020-02-21 12:57:08 +00:00
|
|
|
#endif
|
2020-02-15 19:15:43 +00:00
|
|
|
|
2020-02-02 00:14:34 +00:00
|
|
|
void loop()
|
|
|
|
{
|
2020-03-19 02:15:51 +00:00
|
|
|
uint32_t msecstosleep = 1000 * 30; // How long can we sleep before we again need to service the main loop?
|
2020-02-08 00:12:55 +00:00
|
|
|
|
2020-09-06 21:45:43 +00:00
|
|
|
if (gps)
|
|
|
|
gps->loop(); // FIXME, remove from main, instead block on read
|
2020-04-17 17:38:44 +00:00
|
|
|
router.loop();
|
2020-04-18 21:22:24 +00:00
|
|
|
powerFSM.run_machine();
|
2020-03-19 02:15:51 +00:00
|
|
|
service.loop();
|
2020-02-21 18:51:36 +00:00
|
|
|
|
2020-07-06 08:45:55 +00:00
|
|
|
concurrency::periodicScheduler.loop();
|
2020-03-19 02:15:51 +00:00
|
|
|
// axpDebugOutput.loop();
|
2020-04-10 19:18:48 +00:00
|
|
|
|
2020-04-27 16:36:39 +00:00
|
|
|
#ifdef DEBUG_PORT
|
|
|
|
DEBUG_PORT.loop(); // Send/receive protobufs over the serial port
|
|
|
|
#endif
|
|
|
|
|
2020-06-13 15:28:01 +00:00
|
|
|
// heap_caps_check_integrity_all(true); // FIXME - disable this expensive check
|
|
|
|
|
2020-04-10 19:18:48 +00:00
|
|
|
#ifndef NO_ESP32
|
2020-04-24 15:52:49 +00:00
|
|
|
esp32Loop();
|
2020-04-10 19:18:48 +00:00
|
|
|
#endif
|
2020-07-01 17:08:38 +00:00
|
|
|
#ifdef TBEAM_V10
|
2020-06-28 04:19:49 +00:00
|
|
|
power->loop();
|
2020-04-10 19:18:48 +00:00
|
|
|
#endif
|
2020-02-01 16:30:53 +00:00
|
|
|
|
2020-02-01 22:23:21 +00:00
|
|
|
#ifdef BUTTON_PIN
|
2020-06-22 18:09:26 +00:00
|
|
|
userButton.tick();
|
|
|
|
#endif
|
|
|
|
#ifdef BUTTON_PIN_ALT
|
|
|
|
userButtonAlt.tick();
|
2020-02-23 18:49:37 +00:00
|
|
|
#endif
|
2020-02-01 16:30:53 +00:00
|
|
|
|
2020-03-19 02:15:51 +00:00
|
|
|
// Show boot screen for first 3 seconds, then switch to normal operation.
|
|
|
|
static bool showingBootScreen = true;
|
2020-09-05 19:34:48 +00:00
|
|
|
if (showingBootScreen && (millis() > 3000)) {
|
2020-03-19 02:15:51 +00:00
|
|
|
screen.stopBootScreen();
|
|
|
|
showingBootScreen = false;
|
|
|
|
}
|
2020-03-15 23:47:38 +00:00
|
|
|
|
2020-06-12 23:37:03 +00:00
|
|
|
#ifdef DEBUG_STACK
|
|
|
|
static uint32_t lastPrint = 0;
|
2020-09-05 19:34:48 +00:00
|
|
|
if (millis() - lastPrint > 10 * 1000L) {
|
|
|
|
lastPrint = millis();
|
2020-06-12 23:37:03 +00:00
|
|
|
meshtastic::printThreadInfo("main");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2020-03-26 16:24:53 +00:00
|
|
|
// Update the screen last, after we've figured out what to show.
|
2020-08-12 18:04:03 +00:00
|
|
|
screen.debug_info()->setChannelNameStatus(getChannelName());
|
2020-09-16 16:22:03 +00:00
|
|
|
|
2020-03-19 02:15:51 +00:00
|
|
|
// No GPS lock yet, let the OS put the main CPU in low power mode for 100ms (or until another interrupt comes in)
|
|
|
|
// i.e. don't just keep spinning in loop as fast as we can.
|
|
|
|
// DEBUG_MSG("msecs %d\n", msecstosleep);
|
2020-02-08 01:48:12 +00:00
|
|
|
|
2020-03-19 02:15:51 +00:00
|
|
|
// FIXME - until button press handling is done by interrupt (see polling above) we can't sleep very long at all or buttons
|
|
|
|
// feel slow
|
|
|
|
msecstosleep = 10;
|
2020-02-21 12:57:08 +00:00
|
|
|
|
2020-03-19 02:15:51 +00:00
|
|
|
delay(msecstosleep);
|
2020-03-15 20:27:00 +00:00
|
|
|
}
|