mirror of
https://github.com/meshcore-dev/MeshCore.git
synced 2026-04-20 22:13:47 +00:00
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:
parent
467959cc3b
commit
e2aa33b3a0
60 changed files with 497 additions and 185 deletions
|
|
@ -1,5 +1,6 @@
|
|||
#include <Arduino.h> // needed for PlatformIO
|
||||
#include <Mesh.h>
|
||||
#include <helpers/ui/LEDManager.h>
|
||||
#include "MyMesh.h"
|
||||
|
||||
// Believe it or not, this std C function is busted on some platforms!
|
||||
|
|
@ -155,6 +156,7 @@ void setup() {
|
|||
#else
|
||||
serial_interface.begin(Serial);
|
||||
#endif
|
||||
if (board.ledManager) serial_interface.setLEDManager(board.ledManager);
|
||||
the_mesh.startInterface(serial_interface);
|
||||
#elif defined(RP2040_PLATFORM)
|
||||
LittleFS.begin();
|
||||
|
|
@ -212,6 +214,7 @@ void setup() {
|
|||
#endif
|
||||
|
||||
sensors.begin();
|
||||
if (board.ledManager) sensors.setLEDManager(board.ledManager);
|
||||
|
||||
#ifdef DISPLAY_CLASS
|
||||
ui_task.begin(disp, &sensors, the_mesh.getNodePrefs()); // still want to pass this in as dependency, as prefs might be moved
|
||||
|
|
@ -221,6 +224,7 @@ void setup() {
|
|||
void loop() {
|
||||
the_mesh.loop();
|
||||
sensors.loop();
|
||||
if (board.ledManager) board.ledManager->loop();
|
||||
#ifdef DISPLAY_CLASS
|
||||
ui_task.loop();
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@ void setup() {
|
|||
loadOrCreateIdentity();
|
||||
|
||||
sensors.begin();
|
||||
if (board.ledManager) sensors.setLEDManager(board.ledManager);
|
||||
|
||||
#if defined(KISS_UART_RX) && defined(KISS_UART_TX)
|
||||
#if defined(ESP32)
|
||||
|
|
@ -143,4 +144,5 @@ void loop() {
|
|||
next_noise_floor_calib_ms = millis();
|
||||
}
|
||||
radio_driver.loop();
|
||||
if (board.ledManager) board.ledManager->loop();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include <Arduino.h> // needed for PlatformIO
|
||||
#include <Mesh.h>
|
||||
#include <helpers/ui/LEDManager.h>
|
||||
|
||||
#include "MyMesh.h"
|
||||
|
||||
|
|
@ -92,6 +93,7 @@ void setup() {
|
|||
command[0] = 0;
|
||||
|
||||
sensors.begin();
|
||||
if (board.ledManager) sensors.setLEDManager(board.ledManager);
|
||||
|
||||
the_mesh.begin(fs);
|
||||
|
||||
|
|
@ -149,6 +151,7 @@ void loop() {
|
|||
|
||||
the_mesh.loop();
|
||||
sensors.loop();
|
||||
if (board.ledManager) board.ledManager->loop();
|
||||
#ifdef DISPLAY_CLASS
|
||||
ui_task.loop();
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include <Arduino.h> // needed for PlatformIO
|
||||
#include <Mesh.h>
|
||||
#include <helpers/ui/LEDManager.h>
|
||||
|
||||
#include "MyMesh.h"
|
||||
|
||||
|
|
@ -69,6 +70,7 @@ void setup() {
|
|||
command[0] = 0;
|
||||
|
||||
sensors.begin();
|
||||
if (board.ledManager) sensors.setLEDManager(board.ledManager);
|
||||
|
||||
the_mesh.begin(fs);
|
||||
|
||||
|
|
@ -109,6 +111,7 @@ void loop() {
|
|||
|
||||
the_mesh.loop();
|
||||
sensors.loop();
|
||||
if (board.ledManager) board.ledManager->loop();
|
||||
#ifdef DISPLAY_CLASS
|
||||
ui_task.loop();
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -103,6 +103,7 @@ void setup() {
|
|||
command[0] = 0;
|
||||
|
||||
sensors.begin();
|
||||
if (board.ledManager) sensors.setLEDManager(board.ledManager);
|
||||
|
||||
the_mesh.begin(fs);
|
||||
|
||||
|
|
@ -143,6 +144,7 @@ void loop() {
|
|||
|
||||
the_mesh.loop();
|
||||
sensors.loop();
|
||||
if (board.ledManager) board.ledManager->loop();
|
||||
#ifdef DISPLAY_CLASS
|
||||
ui_task.loop();
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -35,6 +35,8 @@
|
|||
#define BRIDGE_DEBUG_PRINTLN(...) {}
|
||||
#endif
|
||||
|
||||
class LEDManager; // forward declaration
|
||||
|
||||
namespace mesh {
|
||||
|
||||
#define BD_STARTUP_NORMAL 0 // getStartupReason() codes
|
||||
|
|
@ -42,6 +44,8 @@ namespace mesh {
|
|||
|
||||
class MainBoard {
|
||||
public:
|
||||
LEDManager* ledManager = nullptr; // set by boards that have LEDs
|
||||
|
||||
virtual uint16_t getBattMilliVolts() = 0;
|
||||
virtual float getMCUTemperature() { return NAN; }
|
||||
virtual bool setAdcMultiplier(float multiplier) { return false; };
|
||||
|
|
|
|||
|
|
@ -4,9 +4,12 @@
|
|||
|
||||
#define MAX_FRAME_SIZE 172
|
||||
|
||||
class LEDManager;
|
||||
|
||||
class BaseSerialInterface {
|
||||
protected:
|
||||
BaseSerialInterface() { }
|
||||
LEDManager* _ledManager = nullptr;
|
||||
|
||||
public:
|
||||
virtual void enable() = 0;
|
||||
|
|
@ -18,4 +21,6 @@ public:
|
|||
virtual bool isWriteBusy() const = 0;
|
||||
virtual size_t writeFrame(const uint8_t src[], size_t len) = 0;
|
||||
virtual size_t checkRecvFrame(uint8_t dest[]) = 0;
|
||||
|
||||
void setLEDManager(LEDManager* mgr) { _ledManager = mgr; }
|
||||
};
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
#include "TxtDataHelpers.h"
|
||||
#include "AdvertDataHelpers.h"
|
||||
#include <RTClib.h>
|
||||
#include <helpers/ui/LEDManager.h>
|
||||
|
||||
#ifndef BRIDGE_MAX_BAUD
|
||||
#define BRIDGE_MAX_BAUD 115200
|
||||
|
|
@ -87,7 +88,9 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
|
|||
file.read((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
|
||||
file.read((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
||||
file.read((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
||||
// next: 290
|
||||
file.read((uint8_t *)&_prefs->led_status_mode, sizeof(_prefs->led_status_mode)); // 290
|
||||
file.read((uint8_t *)&_prefs->led_activity_mode, sizeof(_prefs->led_activity_mode)); // 291
|
||||
// next: 292
|
||||
|
||||
// sanitise bad pref values
|
||||
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
|
||||
|
|
@ -117,8 +120,16 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
|
|||
|
||||
// sanitise settings
|
||||
_prefs->rx_boosted_gain = constrain(_prefs->rx_boosted_gain, 0, 1); // boolean
|
||||
_prefs->led_status_mode = constrain(_prefs->led_status_mode, 0, 3);
|
||||
_prefs->led_activity_mode = constrain(_prefs->led_activity_mode, 0, 3);
|
||||
|
||||
file.close();
|
||||
|
||||
// Apply LED preferences to board's LED manager (if present)
|
||||
if (_board->ledManager) {
|
||||
_board->ledManager->setStatusMode(_prefs->led_status_mode);
|
||||
_board->ledManager->setActivityMode(_prefs->led_activity_mode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -177,7 +188,9 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
|
|||
file.write((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
|
||||
file.write((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
||||
file.write((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
||||
// next: 290
|
||||
file.write((uint8_t *)&_prefs->led_status_mode, sizeof(_prefs->led_status_mode)); // 290
|
||||
file.write((uint8_t *)&_prefs->led_activity_mode, sizeof(_prefs->led_activity_mode)); // 291
|
||||
// next: 292
|
||||
|
||||
file.close();
|
||||
}
|
||||
|
|
@ -441,6 +454,10 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
|||
#else
|
||||
strcpy(reply, "ERROR: Power management not supported");
|
||||
#endif
|
||||
} else if (memcmp(config, "led.status", 10) == 0) {
|
||||
sprintf(reply, "> %d", (int)_prefs->led_status_mode);
|
||||
} else if (memcmp(config, "led.activity", 12) == 0) {
|
||||
sprintf(reply, "> %d", (int)_prefs->led_activity_mode);
|
||||
} else {
|
||||
sprintf(reply, "??: %s", config);
|
||||
}
|
||||
|
|
@ -685,6 +702,26 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
|||
savePrefs();
|
||||
strcpy(reply, "OK");
|
||||
#endif
|
||||
} else if (memcmp(config, "led.status ", 11) == 0) {
|
||||
int val = atoi(&config[11]);
|
||||
if (val >= 0 && val <= 3) {
|
||||
_prefs->led_status_mode = val;
|
||||
_sensors->setSettingValue("led.status", &config[11]);
|
||||
savePrefs();
|
||||
strcpy(reply, "OK");
|
||||
} else {
|
||||
strcpy(reply, "Error: must be 0-3 (off/boot30s/blink/on)");
|
||||
}
|
||||
} else if (memcmp(config, "led.activity ", 13) == 0) {
|
||||
int val = atoi(&config[13]);
|
||||
if (val >= 0 && val <= 3) {
|
||||
_prefs->led_activity_mode = val;
|
||||
_sensors->setSettingValue("led.activity", &config[13]);
|
||||
savePrefs();
|
||||
strcpy(reply, "OK");
|
||||
} else {
|
||||
strcpy(reply, "Error: must be 0-3 (off/ble/lora/both)");
|
||||
}
|
||||
} else if (memcmp(config, "adc.multiplier ", 15) == 0) {
|
||||
_prefs->adc_multiplier = atof(&config[15]);
|
||||
if (_board->setAdcMultiplier(_prefs->adc_multiplier)) {
|
||||
|
|
|
|||
|
|
@ -60,6 +60,8 @@ struct NodePrefs { // persisted to file
|
|||
uint8_t rx_boosted_gain; // power settings
|
||||
uint8_t path_hash_mode; // which path mode to use when sending
|
||||
uint8_t loop_detect;
|
||||
uint8_t led_status_mode;
|
||||
uint8_t led_activity_mode;
|
||||
};
|
||||
|
||||
class CommonCLICallbacks {
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@
|
|||
|
||||
#define TELEM_CHANNEL_SELF 1 // LPP data channel for 'self' device
|
||||
|
||||
class LEDManager;
|
||||
|
||||
class SensorManager {
|
||||
public:
|
||||
double node_lat, node_lon; // modify these, if you want to affect Advert location
|
||||
|
|
@ -24,6 +26,8 @@ public:
|
|||
virtual bool setSettingValue(const char* name, const char* value) { return false; }
|
||||
virtual LocationProvider* getLocationProvider() { return NULL; }
|
||||
|
||||
virtual void setLEDManager(LEDManager* mgr) { }
|
||||
|
||||
// Helper functions to manage setting by keys (useful in many places ...)
|
||||
const char* getSettingByKey(const char* key) {
|
||||
int num = getNumSettings();
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
#include <string.h>
|
||||
#include "ble_gap.h"
|
||||
#include "ble_hci.h"
|
||||
#include <helpers/ui/LEDManager.h>
|
||||
|
||||
// Magic numbers came from actual testing
|
||||
#define BLE_HEALTH_CHECK_INTERVAL 10000 // Advertising watchdog check every 10 seconds
|
||||
|
|
@ -40,6 +41,8 @@ void SerialBLEInterface::onDisconnect(uint16_t connection_handle, uint8_t reason
|
|||
instance->_conn_handle = BLE_CONN_HANDLE_INVALID;
|
||||
instance->_isDeviceConnected = false;
|
||||
instance->clearBuffers();
|
||||
// Advertising auto-restarts on disconnect
|
||||
if (instance->_ledManager) instance->_ledManager->setActivityState(LED_CONN_ADVERTISING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -49,6 +52,7 @@ void SerialBLEInterface::onSecured(uint16_t connection_handle) {
|
|||
if (instance) {
|
||||
if (instance->isValidConnection(connection_handle, true)) {
|
||||
instance->_isDeviceConnected = true;
|
||||
if (instance->_ledManager) instance->_ledManager->setActivityState(LED_CONN_CONNECTED);
|
||||
|
||||
// Connection interval units: 1.25ms, supervision timeout units: 10ms
|
||||
// Apple: "The product will not read or use the parameters in the Peripheral Preferred Connection Parameters characteristic."
|
||||
|
|
@ -248,6 +252,7 @@ void SerialBLEInterface::enable() {
|
|||
|
||||
Bluefruit.Advertising.restartOnDisconnect(true);
|
||||
Bluefruit.Advertising.start(0);
|
||||
if (_ledManager) _ledManager->setActivityState(LED_CONN_ADVERTISING);
|
||||
}
|
||||
|
||||
void SerialBLEInterface::disconnect() {
|
||||
|
|
@ -264,6 +269,7 @@ void SerialBLEInterface::disable() {
|
|||
Bluefruit.Advertising.stop();
|
||||
disconnect();
|
||||
_last_health_check = 0;
|
||||
if (_ledManager) _ledManager->setActivityState(LED_CONN_IDLE);
|
||||
}
|
||||
|
||||
size_t SerialBLEInterface::writeFrame(const uint8_t src[], size_t len) {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
#include "EnvironmentSensorManager.h"
|
||||
#include <helpers/ui/LEDManager.h>
|
||||
|
||||
#if ENV_PIN_SDA && ENV_PIN_SCL
|
||||
#define TELEM_WIRE &Wire1 // Use Wire1 as the I2C bus for Environment Sensors
|
||||
|
|
@ -494,6 +495,7 @@ int EnvironmentSensorManager::getNumSettings() const {
|
|||
#if ENV_INCLUDE_GPS
|
||||
if (gps_detected) settings++; // only show GPS setting if GPS is detected
|
||||
#endif
|
||||
if (_ledManager) settings += 2; // led.status and led.activity
|
||||
return settings;
|
||||
}
|
||||
|
||||
|
|
@ -504,8 +506,10 @@ const char* EnvironmentSensorManager::getSettingName(int i) const {
|
|||
return "gps";
|
||||
}
|
||||
#endif
|
||||
// convenient way to add params (needed for some tests)
|
||||
// if (i == settings++) return "param.2";
|
||||
if (_ledManager) {
|
||||
if (i == settings++) return "led.status";
|
||||
if (i == settings++) return "led.activity";
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -516,8 +520,17 @@ const char* EnvironmentSensorManager::getSettingValue(int i) const {
|
|||
return gps_active ? "1" : "0";
|
||||
}
|
||||
#endif
|
||||
// convenient way to add params ...
|
||||
// if (i == settings++) return "2";
|
||||
if (_ledManager) {
|
||||
static char buf[2] = {0, 0};
|
||||
if (i == settings++) {
|
||||
buf[0] = '0' + _ledManager->getStatusMode();
|
||||
return buf;
|
||||
}
|
||||
if (i == settings++) {
|
||||
buf[0] = '0' + _ledManager->getActivityMode();
|
||||
return buf;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -541,6 +554,20 @@ bool EnvironmentSensorManager::setSettingValue(const char* name, const char* val
|
|||
return true;
|
||||
}
|
||||
#endif
|
||||
if (_ledManager && strcmp(name, "led.status") == 0) {
|
||||
int val = atoi(value);
|
||||
if (val >= 0 && val <= 3) {
|
||||
_ledManager->setStatusMode(val);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (_ledManager && strcmp(name, "led.activity") == 0) {
|
||||
int val = atoi(value);
|
||||
if (val >= 0 && val <= 3) {
|
||||
_ledManager->setActivityMode(val);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false; // not supported
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
#include <helpers/SensorManager.h>
|
||||
#include <helpers/sensors/LocationProvider.h>
|
||||
|
||||
class LEDManager;
|
||||
|
||||
class EnvironmentSensorManager : public SensorManager {
|
||||
protected:
|
||||
int next_available_channel = TELEM_CHANNEL_SELF + 1;
|
||||
|
|
@ -27,6 +29,8 @@ protected:
|
|||
bool gps_active = false;
|
||||
uint32_t gps_update_interval_sec = 1; // Default 1 second
|
||||
|
||||
LEDManager* _ledManager = nullptr;
|
||||
|
||||
#if ENV_INCLUDE_GPS
|
||||
LocationProvider* _location;
|
||||
void start_gps();
|
||||
|
|
@ -46,6 +50,8 @@ public:
|
|||
#else
|
||||
EnvironmentSensorManager(){};
|
||||
#endif
|
||||
|
||||
void setLEDManager(LEDManager* mgr) override { _ledManager = mgr; }
|
||||
bool begin() override;
|
||||
bool querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) override;
|
||||
#if ENV_INCLUDE_GPS
|
||||
|
|
|
|||
181
src/helpers/ui/LEDManager.h
Normal file
181
src/helpers/ui/LEDManager.h
Normal file
|
|
@ -0,0 +1,181 @@
|
|||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
#define LED_STATUS_OFF 0
|
||||
#define LED_STATUS_BOOT_30S 1
|
||||
#define LED_STATUS_SLOW_BLINK 2
|
||||
#define LED_STATUS_ALWAYS_ON 3
|
||||
|
||||
#define LED_ACTIVITY_OFF 0
|
||||
#define LED_ACTIVITY_BLE 1
|
||||
#define LED_ACTIVITY_LORA 2
|
||||
#define LED_ACTIVITY_BOTH 3
|
||||
|
||||
#define LED_CONN_IDLE 0
|
||||
#define LED_CONN_ADVERTISING 1
|
||||
#define LED_CONN_CONNECTED 2
|
||||
|
||||
#define LED_BOOT_TIMEOUT_MS 30000
|
||||
#define LED_BLINK_CYCLE_MS 4000
|
||||
#define LED_BLINK_ON_MS 200
|
||||
#define LED_ADV_BLINK_MS 500
|
||||
|
||||
class LEDManager {
|
||||
public:
|
||||
LEDManager(int8_t statusPin, int8_t activityPin, bool statusActiveHigh = true, bool activityActiveHigh = true)
|
||||
: _statusPin(statusPin), _activityPin(activityPin),
|
||||
_statusActiveHigh(statusActiveHigh), _activityActiveHigh(activityActiveHigh) {}
|
||||
|
||||
void begin(uint8_t statusMode, uint8_t activityMode) {
|
||||
_statusMode = statusMode;
|
||||
_activityMode = activityMode;
|
||||
_bootTime = millis();
|
||||
|
||||
if (_statusPin >= 0) {
|
||||
pinMode(_statusPin, OUTPUT);
|
||||
applyStatusLED();
|
||||
}
|
||||
if (_activityPin >= 0) {
|
||||
pinMode(_activityPin, OUTPUT);
|
||||
activityWrite(false);
|
||||
}
|
||||
}
|
||||
|
||||
void loop() {
|
||||
unsigned long now = millis();
|
||||
|
||||
// Status LED logic
|
||||
if (_statusPin >= 0) {
|
||||
if (_statusMode == LED_STATUS_BOOT_30S && _statusOn && (now - _bootTime >= LED_BOOT_TIMEOUT_MS)) {
|
||||
statusWrite(false);
|
||||
_statusOn = false;
|
||||
} else if (_statusMode == LED_STATUS_SLOW_BLINK) {
|
||||
if (now - _lastBlinkToggle >= (_statusOn ? LED_BLINK_ON_MS : LED_BLINK_CYCLE_MS)) {
|
||||
_statusOn = !_statusOn;
|
||||
statusWrite(_statusOn);
|
||||
_lastBlinkToggle = now;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Activity LED: BLE advertising blink
|
||||
if (_activityPin >= 0 && activityWantsBLE() && _activityConnState == LED_CONN_ADVERTISING) {
|
||||
if (now - _lastAdvToggle >= LED_ADV_BLINK_MS) {
|
||||
_advBlinkOn = !_advBlinkOn;
|
||||
activityWrite(_advBlinkOn);
|
||||
_lastAdvToggle = now;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void onBeforeTransmit() {
|
||||
if (_activityPin >= 0 && activityWantsLoRa()) {
|
||||
activityWrite(true);
|
||||
}
|
||||
}
|
||||
|
||||
void onAfterTransmit() {
|
||||
if (_activityPin >= 0 && activityWantsLoRa()) {
|
||||
// If BLE is connected, keep it on; if advertising, resume blink; otherwise off
|
||||
if (activityWantsBLE()) {
|
||||
if (_activityConnState == LED_CONN_CONNECTED) {
|
||||
activityWrite(true);
|
||||
} else if (_activityConnState == LED_CONN_ADVERTISING) {
|
||||
// loop() will handle blinking
|
||||
} else {
|
||||
activityWrite(false);
|
||||
}
|
||||
} else {
|
||||
activityWrite(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setActivityState(uint8_t state) {
|
||||
_activityConnState = state;
|
||||
if (_activityPin < 0 || !activityWantsBLE()) return;
|
||||
|
||||
if (state == LED_CONN_CONNECTED) {
|
||||
_advBlinkOn = false;
|
||||
activityWrite(true);
|
||||
} else if (state == LED_CONN_ADVERTISING) {
|
||||
_lastAdvToggle = millis();
|
||||
_advBlinkOn = true;
|
||||
activityWrite(true);
|
||||
} else {
|
||||
_advBlinkOn = false;
|
||||
activityWrite(false);
|
||||
}
|
||||
}
|
||||
|
||||
void setStatusMode(uint8_t mode) {
|
||||
_statusMode = mode;
|
||||
_bootTime = millis();
|
||||
_lastBlinkToggle = millis();
|
||||
_statusOn = false;
|
||||
if (_statusPin >= 0) applyStatusLED();
|
||||
}
|
||||
|
||||
void setActivityMode(uint8_t mode) {
|
||||
_activityMode = mode;
|
||||
if (_activityPin >= 0) {
|
||||
activityWrite(false);
|
||||
_advBlinkOn = false;
|
||||
// Re-apply current connection state with new mode
|
||||
if (activityWantsBLE()) setActivityState(_activityConnState);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t getStatusMode() const { return _statusMode; }
|
||||
uint8_t getActivityMode() const { return _activityMode; }
|
||||
|
||||
void powerOff() {
|
||||
if (_statusPin >= 0) statusWrite(false);
|
||||
if (_activityPin >= 0) activityWrite(false);
|
||||
}
|
||||
|
||||
private:
|
||||
int8_t _statusPin;
|
||||
int8_t _activityPin;
|
||||
bool _statusActiveHigh;
|
||||
bool _activityActiveHigh;
|
||||
uint8_t _statusMode = LED_STATUS_OFF;
|
||||
uint8_t _activityMode = LED_ACTIVITY_OFF;
|
||||
uint8_t _activityConnState = LED_CONN_IDLE;
|
||||
unsigned long _bootTime = 0;
|
||||
unsigned long _lastBlinkToggle = 0;
|
||||
unsigned long _lastAdvToggle = 0;
|
||||
bool _statusOn = false;
|
||||
bool _advBlinkOn = false;
|
||||
|
||||
bool activityWantsBLE() const {
|
||||
return _activityMode == LED_ACTIVITY_BLE || _activityMode == LED_ACTIVITY_BOTH;
|
||||
}
|
||||
|
||||
bool activityWantsLoRa() const {
|
||||
return _activityMode == LED_ACTIVITY_LORA || _activityMode == LED_ACTIVITY_BOTH;
|
||||
}
|
||||
|
||||
void statusWrite(bool on) { digitalWrite(_statusPin, on == _statusActiveHigh ? HIGH : LOW); }
|
||||
void activityWrite(bool on) { digitalWrite(_activityPin, on == _activityActiveHigh ? HIGH : LOW); }
|
||||
|
||||
void applyStatusLED() {
|
||||
switch (_statusMode) {
|
||||
case LED_STATUS_BOOT_30S:
|
||||
case LED_STATUS_ALWAYS_ON:
|
||||
statusWrite(true);
|
||||
_statusOn = true;
|
||||
break;
|
||||
case LED_STATUS_SLOW_BLINK:
|
||||
_lastBlinkToggle = millis();
|
||||
_statusOn = false;
|
||||
statusWrite(false);
|
||||
break;
|
||||
default:
|
||||
statusWrite(false);
|
||||
_statusOn = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 ;)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 ;)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 ;)
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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
|
||||
};
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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[]) {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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(); }
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue