Skip to content

Commit 04dab72

Browse files
committed
Add LED polarity support and roll out LEDManager to 22 boards
LEDManager now accepts per-pin polarity flags (defaulting to active-HIGH for backward compatibility). All digitalWrite calls go through statusWrite()/activityWrite() helpers that respect the configured polarity. Integrated LEDManager into 22 board variants, replacing hardcoded LED logic in onBeforeTransmit/onAfterTransmit/powerOff with centralized, configurable control: Active-HIGH: meshtiny, rak3401, gat562_mesh_tracker_pro, gat562_30s_mesh_kit, minewsemi_me25ls01, rak_wismesh_tag, rak11310, wio_wm1110, sensecap_solar, thinknode_m1 (activity), thinknode_m6, lilygo_tbeam_1w Active-LOW: ikoka_handheld/nano/stick_nrf, xiao_nrf52, thinknode_m3, heltec_t114 Status-only: thinknode_m2, mesh_pocket, t1000-e, promicro
1 parent b899f2a commit 04dab72

45 files changed

Lines changed: 220 additions & 198 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/helpers/ui/LEDManager.h

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@
2323

2424
class LEDManager {
2525
public:
26-
LEDManager(int8_t statusPin, int8_t activityPin)
27-
: _statusPin(statusPin), _activityPin(activityPin) {}
26+
LEDManager(int8_t statusPin, int8_t activityPin, bool statusActiveHigh = true, bool activityActiveHigh = true)
27+
: _statusPin(statusPin), _activityPin(activityPin),
28+
_statusActiveHigh(statusActiveHigh), _activityActiveHigh(activityActiveHigh) {}
2829

2930
void begin(uint8_t statusMode, uint8_t activityMode) {
3031
_statusMode = statusMode;
@@ -37,7 +38,7 @@ class LEDManager {
3738
}
3839
if (_activityPin >= 0) {
3940
pinMode(_activityPin, OUTPUT);
40-
digitalWrite(_activityPin, LOW);
41+
activityWrite(false);
4142
}
4243
}
4344

@@ -47,12 +48,12 @@ class LEDManager {
4748
// Status LED logic
4849
if (_statusPin >= 0) {
4950
if (_statusMode == LED_STATUS_BOOT_30S && _statusOn && (now - _bootTime >= LED_BOOT_TIMEOUT_MS)) {
50-
digitalWrite(_statusPin, LOW);
51+
statusWrite(false);
5152
_statusOn = false;
5253
} else if (_statusMode == LED_STATUS_SLOW_BLINK) {
5354
if (now - _lastBlinkToggle >= (_statusOn ? LED_BLINK_ON_MS : LED_BLINK_CYCLE_MS)) {
5455
_statusOn = !_statusOn;
55-
digitalWrite(_statusPin, _statusOn ? HIGH : LOW);
56+
statusWrite(_statusOn);
5657
_lastBlinkToggle = now;
5758
}
5859
}
@@ -62,15 +63,15 @@ class LEDManager {
6263
if (_activityPin >= 0 && activityWantsBLE() && _activityConnState == LED_CONN_ADVERTISING) {
6364
if (now - _lastAdvToggle >= LED_ADV_BLINK_MS) {
6465
_advBlinkOn = !_advBlinkOn;
65-
digitalWrite(_activityPin, _advBlinkOn ? HIGH : LOW);
66+
activityWrite(_advBlinkOn);
6667
_lastAdvToggle = now;
6768
}
6869
}
6970
}
7071

7172
void onBeforeTransmit() {
7273
if (_activityPin >= 0 && activityWantsLoRa()) {
73-
digitalWrite(_activityPin, HIGH);
74+
activityWrite(true);
7475
}
7576
}
7677

@@ -79,14 +80,14 @@ class LEDManager {
7980
// If BLE is connected, keep it on; if advertising, resume blink; otherwise off
8081
if (activityWantsBLE()) {
8182
if (_activityConnState == LED_CONN_CONNECTED) {
82-
digitalWrite(_activityPin, HIGH);
83+
activityWrite(true);
8384
} else if (_activityConnState == LED_CONN_ADVERTISING) {
8485
// loop() will handle blinking
8586
} else {
86-
digitalWrite(_activityPin, LOW);
87+
activityWrite(false);
8788
}
8889
} else {
89-
digitalWrite(_activityPin, LOW);
90+
activityWrite(false);
9091
}
9192
}
9293
}
@@ -97,14 +98,14 @@ class LEDManager {
9798

9899
if (state == LED_CONN_CONNECTED) {
99100
_advBlinkOn = false;
100-
digitalWrite(_activityPin, HIGH);
101+
activityWrite(true);
101102
} else if (state == LED_CONN_ADVERTISING) {
102103
_lastAdvToggle = millis();
103104
_advBlinkOn = true;
104-
digitalWrite(_activityPin, HIGH);
105+
activityWrite(true);
105106
} else {
106107
_advBlinkOn = false;
107-
digitalWrite(_activityPin, LOW);
108+
activityWrite(false);
108109
}
109110
}
110111

@@ -119,7 +120,7 @@ class LEDManager {
119120
void setActivityMode(uint8_t mode) {
120121
_activityMode = mode;
121122
if (_activityPin >= 0) {
122-
digitalWrite(_activityPin, LOW);
123+
activityWrite(false);
123124
_advBlinkOn = false;
124125
// Re-apply current connection state with new mode
125126
if (activityWantsBLE()) setActivityState(_activityConnState);
@@ -130,13 +131,15 @@ class LEDManager {
130131
uint8_t getActivityMode() const { return _activityMode; }
131132

132133
void powerOff() {
133-
if (_statusPin >= 0) digitalWrite(_statusPin, LOW);
134-
if (_activityPin >= 0) digitalWrite(_activityPin, LOW);
134+
if (_statusPin >= 0) statusWrite(false);
135+
if (_activityPin >= 0) activityWrite(false);
135136
}
136137

137138
private:
138139
int8_t _statusPin;
139140
int8_t _activityPin;
141+
bool _statusActiveHigh;
142+
bool _activityActiveHigh;
140143
uint8_t _statusMode = LED_STATUS_OFF;
141144
uint8_t _activityMode = LED_ACTIVITY_OFF;
142145
uint8_t _activityConnState = LED_CONN_IDLE;
@@ -154,20 +157,23 @@ class LEDManager {
154157
return _activityMode == LED_ACTIVITY_LORA || _activityMode == LED_ACTIVITY_BOTH;
155158
}
156159

160+
void statusWrite(bool on) { digitalWrite(_statusPin, on == _statusActiveHigh ? HIGH : LOW); }
161+
void activityWrite(bool on) { digitalWrite(_activityPin, on == _activityActiveHigh ? HIGH : LOW); }
162+
157163
void applyStatusLED() {
158164
switch (_statusMode) {
159165
case LED_STATUS_BOOT_30S:
160166
case LED_STATUS_ALWAYS_ON:
161-
digitalWrite(_statusPin, HIGH);
167+
statusWrite(true);
162168
_statusOn = true;
163169
break;
164170
case LED_STATUS_SLOW_BLINK:
165171
_lastBlinkToggle = millis();
166172
_statusOn = false;
167-
digitalWrite(_statusPin, LOW);
173+
statusWrite(false);
168174
break;
169175
default:
170-
digitalWrite(_statusPin, LOW);
176+
statusWrite(false);
171177
_statusOn = false;
172178
break;
173179
}

variants/gat562_30s_mesh_kit/GAT56230SMeshKitBoard.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,9 @@ void GAT56230SMeshKitBoard::begin() {
5454
#endif
5555
digitalWrite(SX126X_POWER_EN, HIGH);
5656
delay(10); // give sx1262 some time to power up
57+
58+
// Start LEDs with defaults; prefs are applied after loadPrefs()
59+
static LEDManager _ledManager(LED_BLUE, LED_GREEN);
60+
ledManager = &_ledManager;
61+
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
5762
}

variants/gat562_30s_mesh_kit/GAT56230SMeshKitBoard.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <MeshCore.h>
44
#include <Arduino.h>
55
#include <helpers/NRF52Board.h>
6+
#include <helpers/ui/LEDManager.h>
67

78

89
class GAT56230SMeshKitBoard : public NRF52BoardDCDC {
@@ -33,15 +34,12 @@ class GAT56230SMeshKitBoard : public NRF52BoardDCDC {
3334
return "GAT562 30S Mesh Kit";
3435
}
3536

36-
#if defined(P_LORA_TX_LED)
3737
void onBeforeTransmit() override {
38-
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
38+
if (ledManager) ledManager->onBeforeTransmit();
3939
}
40-
4140
void onAfterTransmit() override {
42-
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
41+
if (ledManager) ledManager->onAfterTransmit();
4342
}
44-
#endif
4543

4644
void powerOff() override {
4745
uint32_t button_pin = PIN_BUTTON1;

variants/gat562_mesh_tracker_pro/GAT562MeshTrackerProBoard.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,9 @@ void GAT562MeshTrackerProBoard::begin() {
5454
#endif
5555
digitalWrite(SX126X_POWER_EN, HIGH);
5656
delay(10); // give sx1262 some time to power up
57+
58+
// Start LEDs with defaults; prefs are applied after loadPrefs()
59+
static LEDManager _ledManager(LED_GREEN, LED_BLUE);
60+
ledManager = &_ledManager;
61+
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
5762
}

variants/gat562_mesh_tracker_pro/GAT562MeshTrackerProBoard.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <MeshCore.h>
44
#include <Arduino.h>
55
#include <helpers/NRF52Board.h>
6+
#include <helpers/ui/LEDManager.h>
67

78

89
class GAT562MeshTrackerProBoard : public NRF52BoardDCDC {
@@ -33,15 +34,12 @@ class GAT562MeshTrackerProBoard : public NRF52BoardDCDC {
3334
return "GAT562 Mesh Tracker Pro";
3435
}
3536

36-
#if defined(P_LORA_TX_LED)
3737
void onBeforeTransmit() override {
38-
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
38+
if (ledManager) ledManager->onBeforeTransmit();
3939
}
40-
4140
void onAfterTransmit() override {
42-
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
41+
if (ledManager) ledManager->onAfterTransmit();
4342
}
44-
#endif
4543

4644
void powerOff() override {
4745
uint32_t button_pin = PIN_BUTTON1;

variants/heltec_t114/T114Board.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,6 @@ void T114Board::begin() {
4343

4444
Wire.begin();
4545

46-
#ifdef P_LORA_TX_LED
47-
pinMode(P_LORA_TX_LED, OUTPUT);
48-
digitalWrite(P_LORA_TX_LED, HIGH);
49-
#endif
50-
5146
pinMode(SX126X_POWER_EN, OUTPUT);
5247
#ifdef NRF52_POWER_MANAGEMENT
5348
// Boot voltage protection check (may not return if voltage too low)
@@ -56,4 +51,9 @@ void T114Board::begin() {
5651
#endif
5752
digitalWrite(SX126X_POWER_EN, HIGH);
5853
delay(10); // give sx1262 some time to power up
54+
55+
// Start LEDs with defaults; prefs are applied after loadPrefs()
56+
static LEDManager _ledManager(-1, LED_RED, true, false);
57+
ledManager = &_ledManager;
58+
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
5959
}

variants/heltec_t114/T114Board.h

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <MeshCore.h>
44
#include <Arduino.h>
55
#include <helpers/NRF52Board.h>
6+
#include <helpers/ui/LEDManager.h>
67

78
// built-ins
89
#define PIN_VBAT_READ 4
@@ -19,14 +20,12 @@ class T114Board : public NRF52BoardDCDC {
1920
T114Board() : NRF52Board("T114_OTA") {}
2021
void begin();
2122

22-
#if defined(P_LORA_TX_LED)
2323
void onBeforeTransmit() override {
24-
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED on
24+
if (ledManager) ledManager->onBeforeTransmit();
2525
}
2626
void onAfterTransmit() override {
27-
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED off
27+
if (ledManager) ledManager->onAfterTransmit();
2828
}
29-
#endif
3029

3130
uint16_t getBattMilliVolts() override {
3231
int adcvalue = 0;
@@ -47,9 +46,7 @@ class T114Board : public NRF52BoardDCDC {
4746
}
4847

4948
void powerOff() override {
50-
#ifdef LED_PIN
51-
digitalWrite(LED_PIN, HIGH);
52-
#endif
49+
if (ledManager) ledManager->powerOff();
5350
#if ENV_INCLUDE_GPS == 1
5451
pinMode(GPS_EN, OUTPUT);
5552
digitalWrite(GPS_EN, LOW);

variants/ikoka_handheld_nrf/IkokaNrf52Board.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ void IkokaNrf52Board::begin() {
2929

3030
Wire.begin();
3131

32-
#ifdef P_LORA_TX_LED
33-
pinMode(P_LORA_TX_LED, OUTPUT);
34-
digitalWrite(P_LORA_TX_LED, HIGH);
35-
#endif
36-
3732
delay(10); // give sx1262 some time to power up
33+
34+
// Start LEDs with defaults; prefs are applied after loadPrefs()
35+
static LEDManager _ledManager(LED_GREEN, LED_RED, false, false);
36+
ledManager = &_ledManager;
37+
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
3838
}
3939

4040
#endif

variants/ikoka_handheld_nrf/IkokaNrf52Board.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <Arduino.h>
44
#include <MeshCore.h>
55
#include <helpers/NRF52Board.h>
6+
#include <helpers/ui/LEDManager.h>
67

78
#ifdef IKOKA_NRF52
89

@@ -11,14 +12,12 @@ class IkokaNrf52Board : public NRF52BoardDCDC {
1112
IkokaNrf52Board() : NRF52Board("XIAO_NRF52_OTA") {}
1213
void begin();
1314

14-
#if defined(P_LORA_TX_LED)
1515
void onBeforeTransmit() override {
16-
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED on
16+
if (ledManager) ledManager->onBeforeTransmit();
1717
}
1818
void onAfterTransmit() override {
19-
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED off
19+
if (ledManager) ledManager->onAfterTransmit();
2020
}
21-
#endif
2221

2322
uint16_t getBattMilliVolts() override {
2423
// Please read befor going further ;)

variants/ikoka_nano_nrf/IkokaNanoNRFBoard.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ void IkokaNanoNRFBoard::begin() {
2222

2323
Wire.begin();
2424

25-
#ifdef P_LORA_TX_LED
26-
pinMode(P_LORA_TX_LED, OUTPUT);
27-
digitalWrite(P_LORA_TX_LED, HIGH);
28-
#endif
29-
3025
// pinMode(SX126X_POWER_EN, OUTPUT);
3126
// digitalWrite(SX126X_POWER_EN, HIGH);
3227
delay(10); // give sx1262 some time to power up
28+
29+
// Start LEDs with defaults; prefs are applied after loadPrefs()
30+
static LEDManager _ledManager(LED_GREEN, LED_RED, false, false);
31+
ledManager = &_ledManager;
32+
ledManager->begin(LED_STATUS_BOOT_30S, LED_ACTIVITY_BOTH);
3333
}
3434

3535
#endif

0 commit comments

Comments
 (0)