2323
2424class LEDManager {
2525public:
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
137138private:
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 }
0 commit comments