Add centralized LEDManager for configurable LED behavior

Adds a LEDManager class (src/helpers/ui/LEDManager.h) that centralizes
all LED control into one component with begin()/loop() lifecycle and
per-pin active-HIGH/LOW polarity support.

LED settings are exposed as custom vars (led.status, led.activity)
accessible via companion radio binary protocol, CLI set/get commands,
and the SensorManager settings interface.

Status LED modes: off, boot-30s, slow blink (200ms/4s), always on.
Activity LED modes: off, BLE only, LoRa TX only, BLE + LoRa TX.

Integrated into 23 board variants, replacing scattered hardcoded
digitalWrite calls in onBeforeTransmit/onAfterTransmit/powerOff.
This commit is contained in:
Ryan Gregg 2026-03-20 18:19:44 -07:00
parent 467959cc3b
commit e2aa33b3a0
60 changed files with 497 additions and 185 deletions

View file

@ -54,4 +54,9 @@ void GAT56230SMeshKitBoard::begin() {
#endif
digitalWrite(SX126X_POWER_EN, HIGH);
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(LED_BLUE, LED_GREEN);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
class GAT56230SMeshKitBoard : public NRF52BoardDCDC {
@ -33,15 +34,12 @@ public:
return "GAT562 30S Mesh Kit";
}
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
}
#endif
void powerOff() override {
uint32_t button_pin = PIN_BUTTON1;

View file

@ -54,4 +54,9 @@ void GAT562MeshTrackerProBoard::begin() {
#endif
digitalWrite(SX126X_POWER_EN, HIGH);
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(LED_GREEN, LED_BLUE);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
class GAT562MeshTrackerProBoard : public NRF52BoardDCDC {
@ -33,15 +34,12 @@ public:
return "GAT562 Mesh Tracker Pro";
}
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
}
#endif
void powerOff() override {
uint32_t button_pin = PIN_BUTTON1;

View file

@ -43,11 +43,6 @@ void T114Board::begin() {
Wire.begin();
#ifdef P_LORA_TX_LED
pinMode(P_LORA_TX_LED, OUTPUT);
digitalWrite(P_LORA_TX_LED, HIGH);
#endif
pinMode(SX126X_POWER_EN, OUTPUT);
#ifdef NRF52_POWER_MANAGEMENT
// Boot voltage protection check (may not return if voltage too low)
@ -56,4 +51,9 @@ void T114Board::begin() {
#endif
digitalWrite(SX126X_POWER_EN, HIGH);
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(-1, LED_RED, true, false);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
// built-ins
#define PIN_VBAT_READ 4
@ -19,14 +20,12 @@ public:
T114Board() : NRF52Board("T114_OTA") {}
void begin();
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
}
#endif
uint16_t getBattMilliVolts() override {
int adcvalue = 0;
@ -47,9 +46,7 @@ public:
}
void powerOff() override {
#ifdef LED_PIN
digitalWrite(LED_PIN, HIGH);
#endif
if (ledManager) ledManager->powerOff();
#if ENV_INCLUDE_GPS == 1
pinMode(GPS_EN, OUTPUT);
digitalWrite(GPS_EN, LOW);

View file

@ -29,12 +29,12 @@ void IkokaNrf52Board::begin() {
Wire.begin();
#ifdef P_LORA_TX_LED
pinMode(P_LORA_TX_LED, OUTPUT);
digitalWrite(P_LORA_TX_LED, HIGH);
#endif
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(LED_GREEN, LED_RED, false, false);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}
#endif

View file

@ -3,6 +3,7 @@
#include <Arduino.h>
#include <MeshCore.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
#ifdef IKOKA_NRF52
@ -11,14 +12,12 @@ public:
IkokaNrf52Board() : NRF52Board("XIAO_NRF52_OTA") {}
void begin();
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
}
#endif
uint16_t getBattMilliVolts() override {
// Please read befor going further ;)

View file

@ -22,14 +22,14 @@ void IkokaNanoNRFBoard::begin() {
Wire.begin();
#ifdef P_LORA_TX_LED
pinMode(P_LORA_TX_LED, OUTPUT);
digitalWrite(P_LORA_TX_LED, HIGH);
#endif
// pinMode(SX126X_POWER_EN, OUTPUT);
// digitalWrite(SX126X_POWER_EN, HIGH);
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(LED_GREEN, LED_RED, false, false);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}
#endif

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
#ifdef XIAO_NRF52
@ -11,22 +12,20 @@ public:
IkokaNanoNRFBoard() : NRF52Board("XIAO_NRF52_OTA") {}
void begin();
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
#if defined(LED_BLUE)
// turn off that annoying blue LED before transmitting
digitalWrite(LED_BLUE, HIGH);
#endif
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
#if defined(LED_BLUE)
// do it after transmitting too, just in case
digitalWrite(LED_BLUE, HIGH);
#endif
}
#endif
uint16_t getBattMilliVolts() override {
// Please read befor going further ;)

View file

@ -22,14 +22,14 @@ void IkokaStickNRFBoard::begin() {
Wire.begin();
#ifdef P_LORA_TX_LED
pinMode(P_LORA_TX_LED, OUTPUT);
digitalWrite(P_LORA_TX_LED, HIGH);
#endif
// pinMode(SX126X_POWER_EN, OUTPUT);
// digitalWrite(SX126X_POWER_EN, HIGH);
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(LED_GREEN, LED_RED, false, false);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}
#endif

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
#ifdef XIAO_NRF52
@ -11,22 +12,20 @@ public:
IkokaStickNRFBoard() : NRF52Board("XIAO_NRF52_OTA") {}
void begin();
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
#if defined(LED_BLUE)
// turn off that annoying blue LED before transmitting
digitalWrite(LED_BLUE, HIGH);
#endif
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
#if defined(LED_BLUE)
// do it after transmitting too, just in case
digitalWrite(LED_BLUE, HIGH);
#endif
}
#endif
uint16_t getBattMilliVolts() override {
// Please read befor going further ;)

View file

@ -11,22 +11,23 @@ void TBeam1WBoard::begin() {
// RF switch RXEN pin handled by RadioLib via setRfSwitchPins()
// Initialize LED
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// Initialize fan control (on by default - 1W PA can overheat)
pinMode(FAN_CTRL_PIN, OUTPUT);
digitalWrite(FAN_CTRL_PIN, HIGH);
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(-1, LED_PIN);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}
void TBeam1WBoard::onBeforeTransmit() {
// RF switching handled by RadioLib via SX126X_DIO2_AS_RF_SWITCH and setRfSwitchPins()
digitalWrite(LED_PIN, HIGH); // TX LED on
if (ledManager) ledManager->onBeforeTransmit();
}
void TBeam1WBoard::onAfterTransmit() {
digitalWrite(LED_PIN, LOW); // TX LED off
if (ledManager) ledManager->onAfterTransmit();
}
uint16_t TBeam1WBoard::getBattMilliVolts() {
@ -56,7 +57,7 @@ void TBeam1WBoard::powerOff() {
radio_powered = false;
// Turn off LED and fan
digitalWrite(LED_PIN, LOW);
if (ledManager) ledManager->powerOff();
digitalWrite(FAN_CTRL_PIN, LOW);
ESP32Board::powerOff();

View file

@ -2,6 +2,7 @@
#include <Arduino.h>
#include <helpers/ESP32Board.h>
#include <helpers/ui/LEDManager.h>
#include "variant.h"
// LilyGo T-Beam 1W with SX1262 + external PA (XY16P35 module)

View file

@ -9,4 +9,9 @@ void HeltecMeshPocket::begin() {
pinMode(PIN_VBAT_READ, INPUT);
pinMode(PIN_USER_BTN, INPUT);
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(PIN_LED, -1, false);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}

View file

@ -3,6 +3,7 @@
#include <Arduino.h>
#include <MeshCore.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
// built-ins
#define PIN_VBAT_READ 29

View file

@ -39,6 +39,11 @@ void MeshtinyBoard::begin() {
pinMode(SX126X_POWER_EN, OUTPUT);
digitalWrite(SX126X_POWER_EN, HIGH);
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(LED_GREEN, PIN_LED2);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}

View file

@ -3,6 +3,7 @@
#include <Arduino.h>
#include <MeshCore.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
class MeshtinyBoard : public NRF52BoardDCDC {
protected:
@ -12,14 +13,12 @@ public:
MeshtinyBoard() : NRF52Board("Meshtiny OTA") {}
void begin();
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
}
#endif
uint16_t getBattMilliVolts() override {
int adcvalue = 0;
@ -47,14 +46,7 @@ public:
digitalWrite(PIN_3V3_EN, LOW);
#endif
#ifdef PIN_LED1
digitalWrite(PIN_LED1, LOW);
#endif
#ifdef PIN_LED2
digitalWrite(PIN_LED2, LOW);
#endif
if (ledManager) ledManager->powerOff();
#ifdef PIN_USER_BTN
nrf_gpio_cfg_sense_input(g_ADigitalPinMap[PIN_USER_BTN], NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);

View file

@ -20,10 +20,10 @@ void MinewsemiME25LS01Board::begin() {
Wire.begin();
#ifdef P_LORA_TX_LED
pinMode(P_LORA_TX_LED, OUTPUT);
digitalWrite(P_LORA_TX_LED, LOW);
#endif
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(LED_BLUE, LED_RED);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
// LoRa and SPI pins
@ -54,26 +55,23 @@ public:
pinMode(GPS_RESETB, OUTPUT);
digitalWrite(GPS_RESETB, LOW);
#endif
#ifdef BUZZER_EN
digitalWrite(BUZZER_EN, LOW);
#endif
#ifdef LED_PIN
digitalWrite(LED_PIN, LOW);
#endif
if (ledManager) ledManager->powerOff();
#ifdef BUTTON_PIN
nrf_gpio_cfg_sense_input(digitalPinToInterrupt(BUTTON_PIN), NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_HIGH);
#endif
sd_power_system_off();
}
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH);// turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
}
#endif
};

View file

@ -22,4 +22,9 @@ void PromicroBoard::begin() {
pinMode(SX126X_POWER_EN, OUTPUT);
digitalWrite(SX126X_POWER_EN, HIGH);
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(PIN_LED, -1);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
#define P_LORA_NSS 13 //P1.13 45
#define P_LORA_DIO_1 11 //P0.10 10

View file

@ -7,10 +7,6 @@ void RAK11310Board::begin() {
// for future use, sub-classes SHOULD call this from their begin()
startup_reason = BD_STARTUP_NORMAL;
#ifdef P_LORA_TX_LED
pinMode(P_LORA_TX_LED, OUTPUT);
#endif
#ifdef PIN_VBAT_READ
pinMode(PIN_VBAT_READ, INPUT);
#endif
@ -23,6 +19,11 @@ void RAK11310Board::begin() {
Wire.begin();
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(23, 24);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}
bool RAK11310Board::startOTAUpdate(const char *id, char reply[]) {

View file

@ -2,6 +2,7 @@
#include <Arduino.h>
#include <MeshCore.h>
#include <helpers/ui/LEDManager.h>
// from https://github.com/RAKWireless/RAK11300-AT-Command-Firmware/blob/9c48409a43620a828d653501d536473200aa33af/RAK11300-AT-Arduino/batt.cpp#L17-L19
#define VBAT_MV_PER_LSB (0.806F) // 3.0V ADC range and 12 - bit ADC resolution = 3300mV / 4096
@ -20,10 +21,12 @@ public:
void begin();
uint8_t getStartupReason() const override { return startup_reason; }
#ifdef P_LORA_TX_LED
void onBeforeTransmit() override { digitalWrite(P_LORA_TX_LED, HIGH); }
void onAfterTransmit() override { digitalWrite(P_LORA_TX_LED, LOW); }
#endif
void onBeforeTransmit() override {
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
if (ledManager) ledManager->onAfterTransmit();
}
uint16_t getBattMilliVolts() override {
#if defined(PIN_VBAT_READ) && defined(ADC_MULTIPLIER)

View file

@ -63,4 +63,9 @@ void RAK3401Board::begin() {
#endif
digitalWrite(SX126X_POWER_EN, HIGH);
delay(1); // SKY66122 turn-on settling time (tON = 3us typ)
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(LED_GREEN, LED_BLUE);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
// built-ins
#define PIN_VBAT_READ 5
@ -38,6 +39,10 @@ public:
return "RAK 3401";
}
// TX/RX switching is handled by SX1262 DIO2 -> SKY66122 CTX (hardware-timed).
// No onBeforeTransmit/onAfterTransmit overrides needed.
void onBeforeTransmit() override {
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
if (ledManager) ledManager->onAfterTransmit();
}
};

View file

@ -50,4 +50,9 @@ void RAK4631Board::begin() {
#endif
digitalWrite(SX126X_POWER_EN, HIGH);
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(LED_GREEN, LED_BLUE);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
// built-ins
#define PIN_VBAT_READ 5
@ -35,4 +36,8 @@ public:
const char* getManufacturerName() const override {
return "RAK 4631";
}
void onBeforeTransmit() override { if (ledManager) ledManager->onBeforeTransmit(); }
void onAfterTransmit() override { if (ledManager) ledManager->onAfterTransmit(); }
void powerOff() override { if (ledManager) ledManager->powerOff(); }
};

View file

@ -15,4 +15,9 @@ void RAKWismeshTagBoard::begin() {
pinMode(SX126X_POWER_EN, OUTPUT);
digitalWrite(SX126X_POWER_EN, HIGH);
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(LED_BLUE, LED_GREEN);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
// built-ins
#define PIN_VBAT_READ 5
@ -13,14 +14,12 @@ public:
RAKWismeshTagBoard() : NRF52Board("WISMESHTAG_OTA") {}
void begin();
#if defined(P_LORA_TX_LED) && defined(LED_STATE_ON)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, LED_STATE_ON); // turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, !LED_STATE_ON); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
}
#endif
#define BATTERY_SAMPLES 8
@ -57,12 +56,8 @@ public:
// wismesh tag uses LOW to indicate button is pressed, wait until it goes HIGH to indicate it was released
while(digitalRead(BUTTON_PIN) == LOW);
#endif
#ifdef LED_GREEN
digitalWrite(LED_GREEN, LOW);
#endif
#ifdef LED_BLUE
digitalWrite(LED_BLUE, LOW);
#endif
if (ledManager) ledManager->powerOff();
#ifdef BUTTON_PIN
// configure button press to wake up when in powered off state

View file

@ -47,23 +47,14 @@ void SenseCapSolarBoard::begin() {
Wire.begin();
#ifdef LED_WHITE
pinMode(LED_WHITE, OUTPUT);
digitalWrite(LED_WHITE, HIGH);
#endif
#ifdef LED_BLUE
pinMode(LED_BLUE, OUTPUT);
digitalWrite(LED_BLUE, LOW);
#endif
#ifdef P_LORA_TX_LED
pinMode(P_LORA_TX_LED, OUTPUT);
digitalWrite(P_LORA_TX_LED, LOW);
#endif
#ifdef NRF52_POWER_MANAGEMENT
checkBootVoltage(&power_config);
#endif
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(LED_BLUE, LED_WHITE);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
class SenseCapSolarBoard : public NRF52BoardDCDC {
protected:
@ -14,14 +15,12 @@ public:
SenseCapSolarBoard() : NRF52Board("SENSECAP_SOLAR_OTA") {}
void begin();
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
}
#endif
uint16_t getBattMilliVolts() override {
digitalWrite(VBAT_ENABLE, LOW);
@ -38,8 +37,7 @@ public:
}
void powerOff() override {
digitalWrite(LED_WHITE, LOW);
digitalWrite(LED_BLUE, LOW);
if (ledManager) ledManager->powerOff();
#ifdef PIN_USER_BTN
while (digitalRead(PIN_USER_BTN) == LOW);

View file

@ -20,4 +20,9 @@ void T1000eBoard::begin() {
Wire.begin();
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(LED_GREEN, -1);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
class T1000eBoard : public NRF52BoardDCDC {
protected:
@ -80,9 +81,8 @@ public:
#ifdef BUTTON_PIN
while(digitalRead(BUTTON_PIN));
#endif
#ifdef LED_PIN
digitalWrite(LED_PIN, LOW);
#endif
if (ledManager) ledManager->powerOff();
#ifdef BUTTON_PIN
nrf_gpio_cfg_sense_input(BUTTON_PIN, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_HIGH);

View file

@ -10,14 +10,15 @@ void ThinkNodeM1Board::begin() {
Wire.begin();
#ifdef P_LORA_TX_LED
pinMode(P_LORA_TX_LED, OUTPUT);
digitalWrite(P_LORA_TX_LED, LOW);
#endif
pinMode(SX126X_POWER_EN, OUTPUT);
digitalWrite(SX126X_POWER_EN, HIGH);
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
// LED_GREEN is active-LOW (LED_STATE_ON=LOW), P_LORA_TX_LED(13) is active-HIGH
static LEDManager _ledManager(LED_GREEN, 13, false, true);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}
uint16_t ThinkNodeM1Board::getBattMilliVolts() {

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
// built-ins
#define VBAT_MV_PER_LSB (0.73242188F) // 3.0V ADC range and 12-bit ADC resolution = 3000mV/4096
@ -19,28 +20,21 @@ public:
void begin();
uint16_t getBattMilliVolts() override;
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
}
#endif
const char* getManufacturerName() const override {
return "Elecrow ThinkNode-M1";
}
void powerOff() override {
// turn off all leds, sd_power_system_off will not do this for us
#ifdef P_LORA_TX_LED
digitalWrite(P_LORA_TX_LED, LOW);
#endif
if (ledManager) ledManager->powerOff();
// power off board
sd_power_system_off();
}
};

View file

@ -9,7 +9,11 @@ void ThinknodeM2Board::begin() {
digitalWrite(PIN_VEXT_EN, PIN_VEXT_EN_ACTIVE); // turn backlight back on
delay(120); // give display time to bias on cold boot
ESP32Board::begin();
pinMode(PIN_STATUS_LED, OUTPUT); // init power led
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(PIN_STATUS_LED, -1);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}
void ThinknodeM2Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {

View file

@ -3,6 +3,7 @@
#include <Arduino.h>
#include <helpers/RefCountedDigitalPin.h>
#include <helpers/ESP32Board.h>
#include <helpers/ui/LEDManager.h>
#include <driver/rtc_io.h>
class ThinknodeM2Board : public ESP32Board {

View file

@ -11,6 +11,11 @@ void ThinkNodeM3Board::begin() {
Wire.begin();
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(PIN_LED_GREEN, PIN_LED_BLUE, false, false);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}
uint16_t ThinkNodeM3Board::getBattMilliVolts() {

View file

@ -3,6 +3,7 @@
#include <Arduino.h>
#include <MeshCore.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
#define ADC_FACTOR ((1000.0*ADC_MULTIPLIER*AREF_VOLTAGE)/ADC_MAX)
@ -18,14 +19,12 @@ public:
void begin();
uint16_t getBattMilliVolts() override;
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
}
#endif
const char* getManufacturerName() const override {
return "Elecrow ThinkNode M3";
@ -43,10 +42,7 @@ public:
}
void powerOff() override {
// turn off all leds, sd_power_system_off will not do this for us
#ifdef P_LORA_TX_LED
digitalWrite(P_LORA_TX_LED, LOW);
#endif
if (ledManager) ledManager->powerOff();
// power off board
sd_power_system_off();

View file

@ -10,12 +10,12 @@ void ThinkNodeM6Board::begin() {
Wire.begin();
#ifdef P_LORA_TX_LED
pinMode(P_LORA_TX_LED, OUTPUT);
digitalWrite(P_LORA_TX_LED, LOW);
#endif
delay(10); // give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(PIN_LED_RED, PIN_LED_BLUE);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}
uint16_t ThinkNodeM6Board::getBattMilliVolts() {

View file

@ -3,6 +3,7 @@
#include <Arduino.h>
#include <MeshCore.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
// built-ins
#define VBAT_MV_PER_LSB (0.73242188F) // 3.0V ADC range and 12-bit ADC resolution = 3000mV/4096
@ -23,25 +24,19 @@ public:
void begin();
uint16_t getBattMilliVolts() override;
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
}
#endif
const char* getManufacturerName() const override {
return "Elecrow ThinkNode M6";
}
void powerOff() override {
// turn off all leds, sd_power_system_off will not do this for us
#ifdef P_LORA_TX_LED
digitalWrite(P_LORA_TX_LED, LOW);
#endif
if (ledManager) ledManager->powerOff();
// power off board
sd_power_system_off();

View file

@ -13,8 +13,6 @@ void WioWM1110Board::begin() {
pinMode(LED_RED, OUTPUT);
pinMode(SENSOR_POWER_PIN, OUTPUT);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_RED, LOW);
digitalWrite(SENSOR_POWER_PIN, LOW);
Serial1.begin(115200);
@ -26,6 +24,12 @@ void WioWM1110Board::begin() {
Wire.begin();
delay(10);
// Start LEDs with defaults; prefs are applied after loadPrefs()
// LED_GREEN was previously always on; LED_STATUS_ALWAYS_ON preserves that behavior
static LEDManager _ledManager(LED_GREEN, LED_RED);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}
#endif

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
#ifdef WIO_WM1110
@ -16,14 +17,12 @@ public:
WioWM1110Board() : NRF52Board("WM1110_OTA") {}
void begin();
#if defined(LED_GREEN)
void onBeforeTransmit() override {
digitalWrite(LED_RED, HIGH);
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
digitalWrite(LED_RED, LOW);
if (ledManager) ledManager->onAfterTransmit();
}
#endif
uint16_t getBattMilliVolts() override {
int adcvalue = 0;

View file

@ -50,17 +50,17 @@ void XiaoNrf52Board::begin() {
Wire.begin();
#ifdef P_LORA_TX_LED
pinMode(P_LORA_TX_LED, OUTPUT);
digitalWrite(P_LORA_TX_LED, HIGH);
#endif
#ifdef NRF52_POWER_MANAGEMENT
// Boot voltage protection check (may not return if voltage too low)
checkBootVoltage(&power_config);
#endif
delay(10); // Give sx1262 some time to power up
// Start LEDs with defaults; prefs are applied after loadPrefs()
static LEDManager _ledManager(LED_BLUE, LED_RED, false, false);
ledManager = &_ledManager;
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
}
uint16_t XiaoNrf52Board::getBattMilliVolts() {

View file

@ -3,6 +3,7 @@
#include <MeshCore.h>
#include <Arduino.h>
#include <helpers/NRF52Board.h>
#include <helpers/ui/LEDManager.h>
#ifdef XIAO_NRF52
@ -16,14 +17,12 @@ public:
XiaoNrf52Board() : NRF52Board("XIAO_NRF52_OTA") {}
void begin();
#if defined(P_LORA_TX_LED)
void onBeforeTransmit() override {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED on
if (ledManager) ledManager->onBeforeTransmit();
}
void onAfterTransmit() override {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED off
if (ledManager) ledManager->onAfterTransmit();
}
#endif
uint16_t getBattMilliVolts() override;
@ -37,8 +36,9 @@ public:
#ifdef PIN_USER_BTN
while(digitalRead(PIN_USER_BTN) == LOW);
#endif
if (ledManager) ledManager->powerOff();
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, HIGH);
digitalWrite(PIN_LED, HIGH);
#ifdef PIN_USER_BTN