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 <Arduino.h> // needed for PlatformIO
|
||||||
#include <Mesh.h>
|
#include <Mesh.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
#include "MyMesh.h"
|
#include "MyMesh.h"
|
||||||
|
|
||||||
// Believe it or not, this std C function is busted on some platforms!
|
// Believe it or not, this std C function is busted on some platforms!
|
||||||
|
|
@ -155,6 +156,7 @@ void setup() {
|
||||||
#else
|
#else
|
||||||
serial_interface.begin(Serial);
|
serial_interface.begin(Serial);
|
||||||
#endif
|
#endif
|
||||||
|
if (board.ledManager) serial_interface.setLEDManager(board.ledManager);
|
||||||
the_mesh.startInterface(serial_interface);
|
the_mesh.startInterface(serial_interface);
|
||||||
#elif defined(RP2040_PLATFORM)
|
#elif defined(RP2040_PLATFORM)
|
||||||
LittleFS.begin();
|
LittleFS.begin();
|
||||||
|
|
@ -212,6 +214,7 @@ void setup() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sensors.begin();
|
sensors.begin();
|
||||||
|
if (board.ledManager) sensors.setLEDManager(board.ledManager);
|
||||||
|
|
||||||
#ifdef DISPLAY_CLASS
|
#ifdef DISPLAY_CLASS
|
||||||
ui_task.begin(disp, &sensors, the_mesh.getNodePrefs()); // still want to pass this in as dependency, as prefs might be moved
|
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() {
|
void loop() {
|
||||||
the_mesh.loop();
|
the_mesh.loop();
|
||||||
sensors.loop();
|
sensors.loop();
|
||||||
|
if (board.ledManager) board.ledManager->loop();
|
||||||
#ifdef DISPLAY_CLASS
|
#ifdef DISPLAY_CLASS
|
||||||
ui_task.loop();
|
ui_task.loop();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,7 @@ void setup() {
|
||||||
loadOrCreateIdentity();
|
loadOrCreateIdentity();
|
||||||
|
|
||||||
sensors.begin();
|
sensors.begin();
|
||||||
|
if (board.ledManager) sensors.setLEDManager(board.ledManager);
|
||||||
|
|
||||||
#if defined(KISS_UART_RX) && defined(KISS_UART_TX)
|
#if defined(KISS_UART_RX) && defined(KISS_UART_TX)
|
||||||
#if defined(ESP32)
|
#if defined(ESP32)
|
||||||
|
|
@ -143,4 +144,5 @@ void loop() {
|
||||||
next_noise_floor_calib_ms = millis();
|
next_noise_floor_calib_ms = millis();
|
||||||
}
|
}
|
||||||
radio_driver.loop();
|
radio_driver.loop();
|
||||||
|
if (board.ledManager) board.ledManager->loop();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include <Arduino.h> // needed for PlatformIO
|
#include <Arduino.h> // needed for PlatformIO
|
||||||
#include <Mesh.h>
|
#include <Mesh.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
#include "MyMesh.h"
|
#include "MyMesh.h"
|
||||||
|
|
||||||
|
|
@ -92,6 +93,7 @@ void setup() {
|
||||||
command[0] = 0;
|
command[0] = 0;
|
||||||
|
|
||||||
sensors.begin();
|
sensors.begin();
|
||||||
|
if (board.ledManager) sensors.setLEDManager(board.ledManager);
|
||||||
|
|
||||||
the_mesh.begin(fs);
|
the_mesh.begin(fs);
|
||||||
|
|
||||||
|
|
@ -149,6 +151,7 @@ void loop() {
|
||||||
|
|
||||||
the_mesh.loop();
|
the_mesh.loop();
|
||||||
sensors.loop();
|
sensors.loop();
|
||||||
|
if (board.ledManager) board.ledManager->loop();
|
||||||
#ifdef DISPLAY_CLASS
|
#ifdef DISPLAY_CLASS
|
||||||
ui_task.loop();
|
ui_task.loop();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include <Arduino.h> // needed for PlatformIO
|
#include <Arduino.h> // needed for PlatformIO
|
||||||
#include <Mesh.h>
|
#include <Mesh.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
#include "MyMesh.h"
|
#include "MyMesh.h"
|
||||||
|
|
||||||
|
|
@ -69,6 +70,7 @@ void setup() {
|
||||||
command[0] = 0;
|
command[0] = 0;
|
||||||
|
|
||||||
sensors.begin();
|
sensors.begin();
|
||||||
|
if (board.ledManager) sensors.setLEDManager(board.ledManager);
|
||||||
|
|
||||||
the_mesh.begin(fs);
|
the_mesh.begin(fs);
|
||||||
|
|
||||||
|
|
@ -109,6 +111,7 @@ void loop() {
|
||||||
|
|
||||||
the_mesh.loop();
|
the_mesh.loop();
|
||||||
sensors.loop();
|
sensors.loop();
|
||||||
|
if (board.ledManager) board.ledManager->loop();
|
||||||
#ifdef DISPLAY_CLASS
|
#ifdef DISPLAY_CLASS
|
||||||
ui_task.loop();
|
ui_task.loop();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -103,6 +103,7 @@ void setup() {
|
||||||
command[0] = 0;
|
command[0] = 0;
|
||||||
|
|
||||||
sensors.begin();
|
sensors.begin();
|
||||||
|
if (board.ledManager) sensors.setLEDManager(board.ledManager);
|
||||||
|
|
||||||
the_mesh.begin(fs);
|
the_mesh.begin(fs);
|
||||||
|
|
||||||
|
|
@ -143,6 +144,7 @@ void loop() {
|
||||||
|
|
||||||
the_mesh.loop();
|
the_mesh.loop();
|
||||||
sensors.loop();
|
sensors.loop();
|
||||||
|
if (board.ledManager) board.ledManager->loop();
|
||||||
#ifdef DISPLAY_CLASS
|
#ifdef DISPLAY_CLASS
|
||||||
ui_task.loop();
|
ui_task.loop();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,8 @@
|
||||||
#define BRIDGE_DEBUG_PRINTLN(...) {}
|
#define BRIDGE_DEBUG_PRINTLN(...) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
class LEDManager; // forward declaration
|
||||||
|
|
||||||
namespace mesh {
|
namespace mesh {
|
||||||
|
|
||||||
#define BD_STARTUP_NORMAL 0 // getStartupReason() codes
|
#define BD_STARTUP_NORMAL 0 // getStartupReason() codes
|
||||||
|
|
@ -42,6 +44,8 @@ namespace mesh {
|
||||||
|
|
||||||
class MainBoard {
|
class MainBoard {
|
||||||
public:
|
public:
|
||||||
|
LEDManager* ledManager = nullptr; // set by boards that have LEDs
|
||||||
|
|
||||||
virtual uint16_t getBattMilliVolts() = 0;
|
virtual uint16_t getBattMilliVolts() = 0;
|
||||||
virtual float getMCUTemperature() { return NAN; }
|
virtual float getMCUTemperature() { return NAN; }
|
||||||
virtual bool setAdcMultiplier(float multiplier) { return false; };
|
virtual bool setAdcMultiplier(float multiplier) { return false; };
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,12 @@
|
||||||
|
|
||||||
#define MAX_FRAME_SIZE 172
|
#define MAX_FRAME_SIZE 172
|
||||||
|
|
||||||
|
class LEDManager;
|
||||||
|
|
||||||
class BaseSerialInterface {
|
class BaseSerialInterface {
|
||||||
protected:
|
protected:
|
||||||
BaseSerialInterface() { }
|
BaseSerialInterface() { }
|
||||||
|
LEDManager* _ledManager = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual void enable() = 0;
|
virtual void enable() = 0;
|
||||||
|
|
@ -18,4 +21,6 @@ public:
|
||||||
virtual bool isWriteBusy() const = 0;
|
virtual bool isWriteBusy() const = 0;
|
||||||
virtual size_t writeFrame(const uint8_t src[], size_t len) = 0;
|
virtual size_t writeFrame(const uint8_t src[], size_t len) = 0;
|
||||||
virtual size_t checkRecvFrame(uint8_t dest[]) = 0;
|
virtual size_t checkRecvFrame(uint8_t dest[]) = 0;
|
||||||
|
|
||||||
|
void setLEDManager(LEDManager* mgr) { _ledManager = mgr; }
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include "TxtDataHelpers.h"
|
#include "TxtDataHelpers.h"
|
||||||
#include "AdvertDataHelpers.h"
|
#include "AdvertDataHelpers.h"
|
||||||
#include <RTClib.h>
|
#include <RTClib.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
#ifndef BRIDGE_MAX_BAUD
|
#ifndef BRIDGE_MAX_BAUD
|
||||||
#define BRIDGE_MAX_BAUD 115200
|
#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->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->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
||||||
file.read((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
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
|
// sanitise bad pref values
|
||||||
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
|
_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
|
// sanitise settings
|
||||||
_prefs->rx_boosted_gain = constrain(_prefs->rx_boosted_gain, 0, 1); // boolean
|
_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();
|
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->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->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
||||||
file.write((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
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();
|
file.close();
|
||||||
}
|
}
|
||||||
|
|
@ -441,6 +454,10 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
||||||
#else
|
#else
|
||||||
strcpy(reply, "ERROR: Power management not supported");
|
strcpy(reply, "ERROR: Power management not supported");
|
||||||
#endif
|
#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 {
|
} else {
|
||||||
sprintf(reply, "??: %s", config);
|
sprintf(reply, "??: %s", config);
|
||||||
}
|
}
|
||||||
|
|
@ -685,6 +702,26 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
||||||
savePrefs();
|
savePrefs();
|
||||||
strcpy(reply, "OK");
|
strcpy(reply, "OK");
|
||||||
#endif
|
#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) {
|
} else if (memcmp(config, "adc.multiplier ", 15) == 0) {
|
||||||
_prefs->adc_multiplier = atof(&config[15]);
|
_prefs->adc_multiplier = atof(&config[15]);
|
||||||
if (_board->setAdcMultiplier(_prefs->adc_multiplier)) {
|
if (_board->setAdcMultiplier(_prefs->adc_multiplier)) {
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,8 @@ struct NodePrefs { // persisted to file
|
||||||
uint8_t rx_boosted_gain; // power settings
|
uint8_t rx_boosted_gain; // power settings
|
||||||
uint8_t path_hash_mode; // which path mode to use when sending
|
uint8_t path_hash_mode; // which path mode to use when sending
|
||||||
uint8_t loop_detect;
|
uint8_t loop_detect;
|
||||||
|
uint8_t led_status_mode;
|
||||||
|
uint8_t led_activity_mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CommonCLICallbacks {
|
class CommonCLICallbacks {
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,8 @@
|
||||||
|
|
||||||
#define TELEM_CHANNEL_SELF 1 // LPP data channel for 'self' device
|
#define TELEM_CHANNEL_SELF 1 // LPP data channel for 'self' device
|
||||||
|
|
||||||
|
class LEDManager;
|
||||||
|
|
||||||
class SensorManager {
|
class SensorManager {
|
||||||
public:
|
public:
|
||||||
double node_lat, node_lon; // modify these, if you want to affect Advert location
|
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 bool setSettingValue(const char* name, const char* value) { return false; }
|
||||||
virtual LocationProvider* getLocationProvider() { return NULL; }
|
virtual LocationProvider* getLocationProvider() { return NULL; }
|
||||||
|
|
||||||
|
virtual void setLEDManager(LEDManager* mgr) { }
|
||||||
|
|
||||||
// Helper functions to manage setting by keys (useful in many places ...)
|
// Helper functions to manage setting by keys (useful in many places ...)
|
||||||
const char* getSettingByKey(const char* key) {
|
const char* getSettingByKey(const char* key) {
|
||||||
int num = getNumSettings();
|
int num = getNumSettings();
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ble_gap.h"
|
#include "ble_gap.h"
|
||||||
#include "ble_hci.h"
|
#include "ble_hci.h"
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
// Magic numbers came from actual testing
|
// Magic numbers came from actual testing
|
||||||
#define BLE_HEALTH_CHECK_INTERVAL 10000 // Advertising watchdog check every 10 seconds
|
#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->_conn_handle = BLE_CONN_HANDLE_INVALID;
|
||||||
instance->_isDeviceConnected = false;
|
instance->_isDeviceConnected = false;
|
||||||
instance->clearBuffers();
|
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) {
|
||||||
if (instance->isValidConnection(connection_handle, true)) {
|
if (instance->isValidConnection(connection_handle, true)) {
|
||||||
instance->_isDeviceConnected = true;
|
instance->_isDeviceConnected = true;
|
||||||
|
if (instance->_ledManager) instance->_ledManager->setActivityState(LED_CONN_CONNECTED);
|
||||||
|
|
||||||
// Connection interval units: 1.25ms, supervision timeout units: 10ms
|
// 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."
|
// 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.restartOnDisconnect(true);
|
||||||
Bluefruit.Advertising.start(0);
|
Bluefruit.Advertising.start(0);
|
||||||
|
if (_ledManager) _ledManager->setActivityState(LED_CONN_ADVERTISING);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SerialBLEInterface::disconnect() {
|
void SerialBLEInterface::disconnect() {
|
||||||
|
|
@ -264,6 +269,7 @@ void SerialBLEInterface::disable() {
|
||||||
Bluefruit.Advertising.stop();
|
Bluefruit.Advertising.stop();
|
||||||
disconnect();
|
disconnect();
|
||||||
_last_health_check = 0;
|
_last_health_check = 0;
|
||||||
|
if (_ledManager) _ledManager->setActivityState(LED_CONN_IDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t SerialBLEInterface::writeFrame(const uint8_t src[], size_t len) {
|
size_t SerialBLEInterface::writeFrame(const uint8_t src[], size_t len) {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
#include "EnvironmentSensorManager.h"
|
#include "EnvironmentSensorManager.h"
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
#if ENV_PIN_SDA && ENV_PIN_SCL
|
#if ENV_PIN_SDA && ENV_PIN_SCL
|
||||||
#define TELEM_WIRE &Wire1 // Use Wire1 as the I2C bus for Environment Sensors
|
#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 ENV_INCLUDE_GPS
|
||||||
if (gps_detected) settings++; // only show GPS setting if GPS is detected
|
if (gps_detected) settings++; // only show GPS setting if GPS is detected
|
||||||
#endif
|
#endif
|
||||||
|
if (_ledManager) settings += 2; // led.status and led.activity
|
||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -504,8 +506,10 @@ const char* EnvironmentSensorManager::getSettingName(int i) const {
|
||||||
return "gps";
|
return "gps";
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// convenient way to add params (needed for some tests)
|
if (_ledManager) {
|
||||||
// if (i == settings++) return "param.2";
|
if (i == settings++) return "led.status";
|
||||||
|
if (i == settings++) return "led.activity";
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -516,8 +520,17 @@ const char* EnvironmentSensorManager::getSettingValue(int i) const {
|
||||||
return gps_active ? "1" : "0";
|
return gps_active ? "1" : "0";
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// convenient way to add params ...
|
if (_ledManager) {
|
||||||
// if (i == settings++) return "2";
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -541,6 +554,20 @@ bool EnvironmentSensorManager::setSettingValue(const char* name, const char* val
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#endif
|
#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
|
return false; // not supported
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
#include <helpers/SensorManager.h>
|
#include <helpers/SensorManager.h>
|
||||||
#include <helpers/sensors/LocationProvider.h>
|
#include <helpers/sensors/LocationProvider.h>
|
||||||
|
|
||||||
|
class LEDManager;
|
||||||
|
|
||||||
class EnvironmentSensorManager : public SensorManager {
|
class EnvironmentSensorManager : public SensorManager {
|
||||||
protected:
|
protected:
|
||||||
int next_available_channel = TELEM_CHANNEL_SELF + 1;
|
int next_available_channel = TELEM_CHANNEL_SELF + 1;
|
||||||
|
|
@ -27,6 +29,8 @@ protected:
|
||||||
bool gps_active = false;
|
bool gps_active = false;
|
||||||
uint32_t gps_update_interval_sec = 1; // Default 1 second
|
uint32_t gps_update_interval_sec = 1; // Default 1 second
|
||||||
|
|
||||||
|
LEDManager* _ledManager = nullptr;
|
||||||
|
|
||||||
#if ENV_INCLUDE_GPS
|
#if ENV_INCLUDE_GPS
|
||||||
LocationProvider* _location;
|
LocationProvider* _location;
|
||||||
void start_gps();
|
void start_gps();
|
||||||
|
|
@ -46,6 +50,8 @@ public:
|
||||||
#else
|
#else
|
||||||
EnvironmentSensorManager(){};
|
EnvironmentSensorManager(){};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void setLEDManager(LEDManager* mgr) override { _ledManager = mgr; }
|
||||||
bool begin() override;
|
bool begin() override;
|
||||||
bool querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) override;
|
bool querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) override;
|
||||||
#if ENV_INCLUDE_GPS
|
#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
|
#endif
|
||||||
digitalWrite(SX126X_POWER_EN, HIGH);
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
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 <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
|
|
||||||
class GAT56230SMeshKitBoard : public NRF52BoardDCDC {
|
class GAT56230SMeshKitBoard : public NRF52BoardDCDC {
|
||||||
|
|
@ -33,15 +34,12 @@ public:
|
||||||
return "GAT562 30S Mesh Kit";
|
return "GAT562 30S Mesh Kit";
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
uint32_t button_pin = PIN_BUTTON1;
|
uint32_t button_pin = PIN_BUTTON1;
|
||||||
|
|
|
||||||
|
|
@ -54,4 +54,9 @@ void GAT562MeshTrackerProBoard::begin() {
|
||||||
#endif
|
#endif
|
||||||
digitalWrite(SX126X_POWER_EN, HIGH);
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
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 <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
|
|
||||||
class GAT562MeshTrackerProBoard : public NRF52BoardDCDC {
|
class GAT562MeshTrackerProBoard : public NRF52BoardDCDC {
|
||||||
|
|
@ -33,15 +34,12 @@ public:
|
||||||
return "GAT562 Mesh Tracker Pro";
|
return "GAT562 Mesh Tracker Pro";
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
uint32_t button_pin = PIN_BUTTON1;
|
uint32_t button_pin = PIN_BUTTON1;
|
||||||
|
|
|
||||||
|
|
@ -43,11 +43,6 @@ void T114Board::begin() {
|
||||||
|
|
||||||
Wire.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);
|
pinMode(SX126X_POWER_EN, OUTPUT);
|
||||||
#ifdef NRF52_POWER_MANAGEMENT
|
#ifdef NRF52_POWER_MANAGEMENT
|
||||||
// Boot voltage protection check (may not return if voltage too low)
|
// Boot voltage protection check (may not return if voltage too low)
|
||||||
|
|
@ -56,4 +51,9 @@ void T114Board::begin() {
|
||||||
#endif
|
#endif
|
||||||
digitalWrite(SX126X_POWER_EN, HIGH);
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
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 <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
// built-ins
|
// built-ins
|
||||||
#define PIN_VBAT_READ 4
|
#define PIN_VBAT_READ 4
|
||||||
|
|
@ -19,14 +20,12 @@ public:
|
||||||
T114Board() : NRF52Board("T114_OTA") {}
|
T114Board() : NRF52Board("T114_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
}
|
}
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override {
|
uint16_t getBattMilliVolts() override {
|
||||||
int adcvalue = 0;
|
int adcvalue = 0;
|
||||||
|
|
@ -47,9 +46,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
#ifdef LED_PIN
|
if (ledManager) ledManager->powerOff();
|
||||||
digitalWrite(LED_PIN, HIGH);
|
|
||||||
#endif
|
|
||||||
#if ENV_INCLUDE_GPS == 1
|
#if ENV_INCLUDE_GPS == 1
|
||||||
pinMode(GPS_EN, OUTPUT);
|
pinMode(GPS_EN, OUTPUT);
|
||||||
digitalWrite(GPS_EN, LOW);
|
digitalWrite(GPS_EN, LOW);
|
||||||
|
|
|
||||||
|
|
@ -29,12 +29,12 @@ void IkokaNrf52Board::begin() {
|
||||||
|
|
||||||
Wire.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
|
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
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <MeshCore.h>
|
#include <MeshCore.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
#ifdef IKOKA_NRF52
|
#ifdef IKOKA_NRF52
|
||||||
|
|
||||||
|
|
@ -11,14 +12,12 @@ public:
|
||||||
IkokaNrf52Board() : NRF52Board("XIAO_NRF52_OTA") {}
|
IkokaNrf52Board() : NRF52Board("XIAO_NRF52_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
}
|
}
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override {
|
uint16_t getBattMilliVolts() override {
|
||||||
// Please read befor going further ;)
|
// Please read befor going further ;)
|
||||||
|
|
|
||||||
|
|
@ -22,14 +22,14 @@ void IkokaNanoNRFBoard::begin() {
|
||||||
|
|
||||||
Wire.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);
|
// pinMode(SX126X_POWER_EN, OUTPUT);
|
||||||
// digitalWrite(SX126X_POWER_EN, HIGH);
|
// digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
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
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include <MeshCore.h>
|
#include <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
#ifdef XIAO_NRF52
|
#ifdef XIAO_NRF52
|
||||||
|
|
||||||
|
|
@ -11,22 +12,20 @@ public:
|
||||||
IkokaNanoNRFBoard() : NRF52Board("XIAO_NRF52_OTA") {}
|
IkokaNanoNRFBoard() : NRF52Board("XIAO_NRF52_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
#if defined(LED_BLUE)
|
#if defined(LED_BLUE)
|
||||||
// turn off that annoying blue LED before transmitting
|
// turn off that annoying blue LED before transmitting
|
||||||
digitalWrite(LED_BLUE, HIGH);
|
digitalWrite(LED_BLUE, HIGH);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
#if defined(LED_BLUE)
|
#if defined(LED_BLUE)
|
||||||
// do it after transmitting too, just in case
|
// do it after transmitting too, just in case
|
||||||
digitalWrite(LED_BLUE, HIGH);
|
digitalWrite(LED_BLUE, HIGH);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override {
|
uint16_t getBattMilliVolts() override {
|
||||||
// Please read befor going further ;)
|
// Please read befor going further ;)
|
||||||
|
|
|
||||||
|
|
@ -22,14 +22,14 @@ void IkokaStickNRFBoard::begin() {
|
||||||
|
|
||||||
Wire.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);
|
// pinMode(SX126X_POWER_EN, OUTPUT);
|
||||||
// digitalWrite(SX126X_POWER_EN, HIGH);
|
// digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
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
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include <MeshCore.h>
|
#include <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
#ifdef XIAO_NRF52
|
#ifdef XIAO_NRF52
|
||||||
|
|
||||||
|
|
@ -11,22 +12,20 @@ public:
|
||||||
IkokaStickNRFBoard() : NRF52Board("XIAO_NRF52_OTA") {}
|
IkokaStickNRFBoard() : NRF52Board("XIAO_NRF52_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
#if defined(LED_BLUE)
|
#if defined(LED_BLUE)
|
||||||
// turn off that annoying blue LED before transmitting
|
// turn off that annoying blue LED before transmitting
|
||||||
digitalWrite(LED_BLUE, HIGH);
|
digitalWrite(LED_BLUE, HIGH);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
#if defined(LED_BLUE)
|
#if defined(LED_BLUE)
|
||||||
// do it after transmitting too, just in case
|
// do it after transmitting too, just in case
|
||||||
digitalWrite(LED_BLUE, HIGH);
|
digitalWrite(LED_BLUE, HIGH);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override {
|
uint16_t getBattMilliVolts() override {
|
||||||
// Please read befor going further ;)
|
// Please read befor going further ;)
|
||||||
|
|
|
||||||
|
|
@ -11,22 +11,23 @@ void TBeam1WBoard::begin() {
|
||||||
|
|
||||||
// RF switch RXEN pin handled by RadioLib via setRfSwitchPins()
|
// 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)
|
// Initialize fan control (on by default - 1W PA can overheat)
|
||||||
pinMode(FAN_CTRL_PIN, OUTPUT);
|
pinMode(FAN_CTRL_PIN, OUTPUT);
|
||||||
digitalWrite(FAN_CTRL_PIN, HIGH);
|
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() {
|
void TBeam1WBoard::onBeforeTransmit() {
|
||||||
// RF switching handled by RadioLib via SX126X_DIO2_AS_RF_SWITCH and setRfSwitchPins()
|
// 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() {
|
void TBeam1WBoard::onAfterTransmit() {
|
||||||
digitalWrite(LED_PIN, LOW); // TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t TBeam1WBoard::getBattMilliVolts() {
|
uint16_t TBeam1WBoard::getBattMilliVolts() {
|
||||||
|
|
@ -56,7 +57,7 @@ void TBeam1WBoard::powerOff() {
|
||||||
radio_powered = false;
|
radio_powered = false;
|
||||||
|
|
||||||
// Turn off LED and fan
|
// Turn off LED and fan
|
||||||
digitalWrite(LED_PIN, LOW);
|
if (ledManager) ledManager->powerOff();
|
||||||
digitalWrite(FAN_CTRL_PIN, LOW);
|
digitalWrite(FAN_CTRL_PIN, LOW);
|
||||||
|
|
||||||
ESP32Board::powerOff();
|
ESP32Board::powerOff();
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/ESP32Board.h>
|
#include <helpers/ESP32Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
#include "variant.h"
|
#include "variant.h"
|
||||||
|
|
||||||
// LilyGo T-Beam 1W with SX1262 + external PA (XY16P35 module)
|
// LilyGo T-Beam 1W with SX1262 + external PA (XY16P35 module)
|
||||||
|
|
|
||||||
|
|
@ -9,4 +9,9 @@ void HeltecMeshPocket::begin() {
|
||||||
pinMode(PIN_VBAT_READ, INPUT);
|
pinMode(PIN_VBAT_READ, INPUT);
|
||||||
|
|
||||||
pinMode(PIN_USER_BTN, 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 <Arduino.h>
|
||||||
#include <MeshCore.h>
|
#include <MeshCore.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
// built-ins
|
// built-ins
|
||||||
#define PIN_VBAT_READ 29
|
#define PIN_VBAT_READ 29
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,11 @@ void MeshtinyBoard::begin() {
|
||||||
pinMode(SX126X_POWER_EN, OUTPUT);
|
pinMode(SX126X_POWER_EN, OUTPUT);
|
||||||
digitalWrite(SX126X_POWER_EN, HIGH);
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
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 <Arduino.h>
|
||||||
#include <MeshCore.h>
|
#include <MeshCore.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
class MeshtinyBoard : public NRF52BoardDCDC {
|
class MeshtinyBoard : public NRF52BoardDCDC {
|
||||||
protected:
|
protected:
|
||||||
|
|
@ -12,14 +13,12 @@ public:
|
||||||
MeshtinyBoard() : NRF52Board("Meshtiny OTA") {}
|
MeshtinyBoard() : NRF52Board("Meshtiny OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
}
|
}
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override {
|
uint16_t getBattMilliVolts() override {
|
||||||
int adcvalue = 0;
|
int adcvalue = 0;
|
||||||
|
|
@ -47,14 +46,7 @@ public:
|
||||||
digitalWrite(PIN_3V3_EN, LOW);
|
digitalWrite(PIN_3V3_EN, LOW);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (ledManager) ledManager->powerOff();
|
||||||
#ifdef PIN_LED1
|
|
||||||
digitalWrite(PIN_LED1, LOW);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PIN_LED2
|
|
||||||
digitalWrite(PIN_LED2, LOW);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PIN_USER_BTN
|
#ifdef PIN_USER_BTN
|
||||||
nrf_gpio_cfg_sense_input(g_ADigitalPinMap[PIN_USER_BTN], NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
|
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();
|
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
|
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 <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
// LoRa and SPI pins
|
// LoRa and SPI pins
|
||||||
|
|
||||||
|
|
@ -59,21 +60,18 @@ public:
|
||||||
digitalWrite(BUZZER_EN, LOW);
|
digitalWrite(BUZZER_EN, LOW);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LED_PIN
|
if (ledManager) ledManager->powerOff();
|
||||||
digitalWrite(LED_PIN, LOW);
|
|
||||||
#endif
|
|
||||||
#ifdef BUTTON_PIN
|
#ifdef BUTTON_PIN
|
||||||
nrf_gpio_cfg_sense_input(digitalPinToInterrupt(BUTTON_PIN), NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_HIGH);
|
nrf_gpio_cfg_sense_input(digitalPinToInterrupt(BUTTON_PIN), NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_HIGH);
|
||||||
#endif
|
#endif
|
||||||
sd_power_system_off();
|
sd_power_system_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, HIGH);// turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
}
|
}
|
||||||
void onAfterTransmit() override {
|
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);
|
pinMode(SX126X_POWER_EN, OUTPUT);
|
||||||
digitalWrite(SX126X_POWER_EN, HIGH);
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
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 <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
#define P_LORA_NSS 13 //P1.13 45
|
#define P_LORA_NSS 13 //P1.13 45
|
||||||
#define P_LORA_DIO_1 11 //P0.10 10
|
#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()
|
// for future use, sub-classes SHOULD call this from their begin()
|
||||||
startup_reason = BD_STARTUP_NORMAL;
|
startup_reason = BD_STARTUP_NORMAL;
|
||||||
|
|
||||||
#ifdef P_LORA_TX_LED
|
|
||||||
pinMode(P_LORA_TX_LED, OUTPUT);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PIN_VBAT_READ
|
#ifdef PIN_VBAT_READ
|
||||||
pinMode(PIN_VBAT_READ, INPUT);
|
pinMode(PIN_VBAT_READ, INPUT);
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -23,6 +19,11 @@ void RAK11310Board::begin() {
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
|
|
||||||
delay(10); // give sx1262 some time to power up
|
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[]) {
|
bool RAK11310Board::startOTAUpdate(const char *id, char reply[]) {
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <MeshCore.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
|
// 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
|
#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();
|
void begin();
|
||||||
uint8_t getStartupReason() const override { return startup_reason; }
|
uint8_t getStartupReason() const override { return startup_reason; }
|
||||||
|
|
||||||
#ifdef P_LORA_TX_LED
|
void onBeforeTransmit() override {
|
||||||
void onBeforeTransmit() override { digitalWrite(P_LORA_TX_LED, HIGH); }
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
void onAfterTransmit() override { digitalWrite(P_LORA_TX_LED, LOW); }
|
}
|
||||||
#endif
|
void onAfterTransmit() override {
|
||||||
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override {
|
uint16_t getBattMilliVolts() override {
|
||||||
#if defined(PIN_VBAT_READ) && defined(ADC_MULTIPLIER)
|
#if defined(PIN_VBAT_READ) && defined(ADC_MULTIPLIER)
|
||||||
|
|
|
||||||
|
|
@ -63,4 +63,9 @@ void RAK3401Board::begin() {
|
||||||
#endif
|
#endif
|
||||||
digitalWrite(SX126X_POWER_EN, HIGH);
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(1); // SKY66122 turn-on settling time (tON = 3us typ)
|
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 <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
// built-ins
|
// built-ins
|
||||||
#define PIN_VBAT_READ 5
|
#define PIN_VBAT_READ 5
|
||||||
|
|
@ -38,6 +39,10 @@ public:
|
||||||
return "RAK 3401";
|
return "RAK 3401";
|
||||||
}
|
}
|
||||||
|
|
||||||
// TX/RX switching is handled by SX1262 DIO2 -> SKY66122 CTX (hardware-timed).
|
void onBeforeTransmit() override {
|
||||||
// No onBeforeTransmit/onAfterTransmit overrides needed.
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
|
}
|
||||||
|
void onAfterTransmit() override {
|
||||||
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -50,4 +50,9 @@ void RAK4631Board::begin() {
|
||||||
#endif
|
#endif
|
||||||
digitalWrite(SX126X_POWER_EN, HIGH);
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
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 <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
// built-ins
|
// built-ins
|
||||||
#define PIN_VBAT_READ 5
|
#define PIN_VBAT_READ 5
|
||||||
|
|
@ -35,4 +36,8 @@ public:
|
||||||
const char* getManufacturerName() const override {
|
const char* getManufacturerName() const override {
|
||||||
return "RAK 4631";
|
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);
|
pinMode(SX126X_POWER_EN, OUTPUT);
|
||||||
digitalWrite(SX126X_POWER_EN, HIGH);
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
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 <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
// built-ins
|
// built-ins
|
||||||
#define PIN_VBAT_READ 5
|
#define PIN_VBAT_READ 5
|
||||||
|
|
@ -13,14 +14,12 @@ public:
|
||||||
RAKWismeshTagBoard() : NRF52Board("WISMESHTAG_OTA") {}
|
RAKWismeshTagBoard() : NRF52Board("WISMESHTAG_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED) && defined(LED_STATE_ON)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, LED_STATE_ON); // turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
}
|
}
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, !LED_STATE_ON); // turn TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#define BATTERY_SAMPLES 8
|
#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
|
// wismesh tag uses LOW to indicate button is pressed, wait until it goes HIGH to indicate it was released
|
||||||
while(digitalRead(BUTTON_PIN) == LOW);
|
while(digitalRead(BUTTON_PIN) == LOW);
|
||||||
#endif
|
#endif
|
||||||
#ifdef LED_GREEN
|
|
||||||
digitalWrite(LED_GREEN, LOW);
|
if (ledManager) ledManager->powerOff();
|
||||||
#endif
|
|
||||||
#ifdef LED_BLUE
|
|
||||||
digitalWrite(LED_BLUE, LOW);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BUTTON_PIN
|
#ifdef BUTTON_PIN
|
||||||
// configure button press to wake up when in powered off state
|
// configure button press to wake up when in powered off state
|
||||||
|
|
|
||||||
|
|
@ -47,23 +47,14 @@ void SenseCapSolarBoard::begin() {
|
||||||
|
|
||||||
Wire.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
|
#ifdef NRF52_POWER_MANAGEMENT
|
||||||
checkBootVoltage(&power_config);
|
checkBootVoltage(&power_config);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
delay(10); // give sx1262 some time to power up
|
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 <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
class SenseCapSolarBoard : public NRF52BoardDCDC {
|
class SenseCapSolarBoard : public NRF52BoardDCDC {
|
||||||
protected:
|
protected:
|
||||||
|
|
@ -14,14 +15,12 @@ public:
|
||||||
SenseCapSolarBoard() : NRF52Board("SENSECAP_SOLAR_OTA") {}
|
SenseCapSolarBoard() : NRF52Board("SENSECAP_SOLAR_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
}
|
}
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override {
|
uint16_t getBattMilliVolts() override {
|
||||||
digitalWrite(VBAT_ENABLE, LOW);
|
digitalWrite(VBAT_ENABLE, LOW);
|
||||||
|
|
@ -38,8 +37,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
digitalWrite(LED_WHITE, LOW);
|
if (ledManager) ledManager->powerOff();
|
||||||
digitalWrite(LED_BLUE, LOW);
|
|
||||||
|
|
||||||
#ifdef PIN_USER_BTN
|
#ifdef PIN_USER_BTN
|
||||||
while (digitalRead(PIN_USER_BTN) == LOW);
|
while (digitalRead(PIN_USER_BTN) == LOW);
|
||||||
|
|
|
||||||
|
|
@ -20,4 +20,9 @@ void T1000eBoard::begin() {
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
|
|
||||||
delay(10); // give sx1262 some time to power up
|
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 <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
class T1000eBoard : public NRF52BoardDCDC {
|
class T1000eBoard : public NRF52BoardDCDC {
|
||||||
protected:
|
protected:
|
||||||
|
|
@ -80,9 +81,8 @@ public:
|
||||||
#ifdef BUTTON_PIN
|
#ifdef BUTTON_PIN
|
||||||
while(digitalRead(BUTTON_PIN));
|
while(digitalRead(BUTTON_PIN));
|
||||||
#endif
|
#endif
|
||||||
#ifdef LED_PIN
|
|
||||||
digitalWrite(LED_PIN, LOW);
|
if (ledManager) ledManager->powerOff();
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BUTTON_PIN
|
#ifdef BUTTON_PIN
|
||||||
nrf_gpio_cfg_sense_input(BUTTON_PIN, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_HIGH);
|
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();
|
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);
|
pinMode(SX126X_POWER_EN, OUTPUT);
|
||||||
digitalWrite(SX126X_POWER_EN, HIGH);
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
||||||
delay(10); // give sx1262 some time to power up
|
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() {
|
uint16_t ThinkNodeM1Board::getBattMilliVolts() {
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include <MeshCore.h>
|
#include <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
// built-ins
|
// built-ins
|
||||||
#define VBAT_MV_PER_LSB (0.73242188F) // 3.0V ADC range and 12-bit ADC resolution = 3000mV/4096
|
#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();
|
void begin();
|
||||||
uint16_t getBattMilliVolts() override;
|
uint16_t getBattMilliVolts() override;
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
}
|
}
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
const char* getManufacturerName() const override {
|
const char* getManufacturerName() const override {
|
||||||
return "Elecrow ThinkNode-M1";
|
return "Elecrow ThinkNode-M1";
|
||||||
}
|
}
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
|
if (ledManager) ledManager->powerOff();
|
||||||
// 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
|
|
||||||
|
|
||||||
// power off board
|
// power off board
|
||||||
sd_power_system_off();
|
sd_power_system_off();
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,11 @@ void ThinknodeM2Board::begin() {
|
||||||
digitalWrite(PIN_VEXT_EN, PIN_VEXT_EN_ACTIVE); // turn backlight back on
|
digitalWrite(PIN_VEXT_EN, PIN_VEXT_EN_ACTIVE); // turn backlight back on
|
||||||
delay(120); // give display time to bias on cold boot
|
delay(120); // give display time to bias on cold boot
|
||||||
ESP32Board::begin();
|
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) {
|
void ThinknodeM2Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/RefCountedDigitalPin.h>
|
#include <helpers/RefCountedDigitalPin.h>
|
||||||
#include <helpers/ESP32Board.h>
|
#include <helpers/ESP32Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
#include <driver/rtc_io.h>
|
#include <driver/rtc_io.h>
|
||||||
|
|
||||||
class ThinknodeM2Board : public ESP32Board {
|
class ThinknodeM2Board : public ESP32Board {
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,11 @@ void ThinkNodeM3Board::begin() {
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
|
|
||||||
delay(10); // give sx1262 some time to power up
|
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() {
|
uint16_t ThinkNodeM3Board::getBattMilliVolts() {
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <MeshCore.h>
|
#include <MeshCore.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
#define ADC_FACTOR ((1000.0*ADC_MULTIPLIER*AREF_VOLTAGE)/ADC_MAX)
|
#define ADC_FACTOR ((1000.0*ADC_MULTIPLIER*AREF_VOLTAGE)/ADC_MAX)
|
||||||
|
|
||||||
|
|
@ -18,14 +19,12 @@ public:
|
||||||
void begin();
|
void begin();
|
||||||
uint16_t getBattMilliVolts() override;
|
uint16_t getBattMilliVolts() override;
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
}
|
}
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
const char* getManufacturerName() const override {
|
const char* getManufacturerName() const override {
|
||||||
return "Elecrow ThinkNode M3";
|
return "Elecrow ThinkNode M3";
|
||||||
|
|
@ -43,10 +42,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
// turn off all leds, sd_power_system_off will not do this for us
|
if (ledManager) ledManager->powerOff();
|
||||||
#ifdef P_LORA_TX_LED
|
|
||||||
digitalWrite(P_LORA_TX_LED, LOW);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// power off board
|
// power off board
|
||||||
sd_power_system_off();
|
sd_power_system_off();
|
||||||
|
|
|
||||||
|
|
@ -10,12 +10,12 @@ void ThinkNodeM6Board::begin() {
|
||||||
|
|
||||||
Wire.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
|
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() {
|
uint16_t ThinkNodeM6Board::getBattMilliVolts() {
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <MeshCore.h>
|
#include <MeshCore.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
// built-ins
|
// built-ins
|
||||||
#define VBAT_MV_PER_LSB (0.73242188F) // 3.0V ADC range and 12-bit ADC resolution = 3000mV/4096
|
#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();
|
void begin();
|
||||||
uint16_t getBattMilliVolts() override;
|
uint16_t getBattMilliVolts() override;
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
}
|
}
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
const char* getManufacturerName() const override {
|
const char* getManufacturerName() const override {
|
||||||
return "Elecrow ThinkNode M6";
|
return "Elecrow ThinkNode M6";
|
||||||
}
|
}
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
|
if (ledManager) ledManager->powerOff();
|
||||||
// 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
|
|
||||||
|
|
||||||
// power off board
|
// power off board
|
||||||
sd_power_system_off();
|
sd_power_system_off();
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,6 @@ void WioWM1110Board::begin() {
|
||||||
pinMode(LED_RED, OUTPUT);
|
pinMode(LED_RED, OUTPUT);
|
||||||
pinMode(SENSOR_POWER_PIN, OUTPUT);
|
pinMode(SENSOR_POWER_PIN, OUTPUT);
|
||||||
|
|
||||||
digitalWrite(LED_GREEN, HIGH);
|
|
||||||
digitalWrite(LED_RED, LOW);
|
|
||||||
digitalWrite(SENSOR_POWER_PIN, LOW);
|
digitalWrite(SENSOR_POWER_PIN, LOW);
|
||||||
|
|
||||||
Serial1.begin(115200);
|
Serial1.begin(115200);
|
||||||
|
|
@ -26,6 +24,12 @@ void WioWM1110Board::begin() {
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
|
|
||||||
delay(10);
|
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
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include <MeshCore.h>
|
#include <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
#ifdef WIO_WM1110
|
#ifdef WIO_WM1110
|
||||||
|
|
||||||
|
|
@ -16,14 +17,12 @@ public:
|
||||||
WioWM1110Board() : NRF52Board("WM1110_OTA") {}
|
WioWM1110Board() : NRF52Board("WM1110_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
#if defined(LED_GREEN)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(LED_RED, HIGH);
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
}
|
}
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(LED_RED, LOW);
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override {
|
uint16_t getBattMilliVolts() override {
|
||||||
int adcvalue = 0;
|
int adcvalue = 0;
|
||||||
|
|
|
||||||
|
|
@ -50,17 +50,17 @@ void XiaoNrf52Board::begin() {
|
||||||
|
|
||||||
Wire.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
|
#ifdef NRF52_POWER_MANAGEMENT
|
||||||
// Boot voltage protection check (may not return if voltage too low)
|
// Boot voltage protection check (may not return if voltage too low)
|
||||||
checkBootVoltage(&power_config);
|
checkBootVoltage(&power_config);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
delay(10); // Give sx1262 some time to power up
|
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() {
|
uint16_t XiaoNrf52Board::getBattMilliVolts() {
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include <MeshCore.h>
|
#include <MeshCore.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <helpers/NRF52Board.h>
|
#include <helpers/NRF52Board.h>
|
||||||
|
#include <helpers/ui/LEDManager.h>
|
||||||
|
|
||||||
#ifdef XIAO_NRF52
|
#ifdef XIAO_NRF52
|
||||||
|
|
||||||
|
|
@ -16,14 +17,12 @@ public:
|
||||||
XiaoNrf52Board() : NRF52Board("XIAO_NRF52_OTA") {}
|
XiaoNrf52Board() : NRF52Board("XIAO_NRF52_OTA") {}
|
||||||
void begin();
|
void begin();
|
||||||
|
|
||||||
#if defined(P_LORA_TX_LED)
|
|
||||||
void onBeforeTransmit() override {
|
void onBeforeTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED on
|
if (ledManager) ledManager->onBeforeTransmit();
|
||||||
}
|
}
|
||||||
void onAfterTransmit() override {
|
void onAfterTransmit() override {
|
||||||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED off
|
if (ledManager) ledManager->onAfterTransmit();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override;
|
uint16_t getBattMilliVolts() override;
|
||||||
|
|
||||||
|
|
@ -37,8 +36,9 @@ public:
|
||||||
#ifdef PIN_USER_BTN
|
#ifdef PIN_USER_BTN
|
||||||
while(digitalRead(PIN_USER_BTN) == LOW);
|
while(digitalRead(PIN_USER_BTN) == LOW);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (ledManager) ledManager->powerOff();
|
||||||
digitalWrite(LED_GREEN, HIGH);
|
digitalWrite(LED_GREEN, HIGH);
|
||||||
digitalWrite(LED_BLUE, HIGH);
|
|
||||||
digitalWrite(PIN_LED, HIGH);
|
digitalWrite(PIN_LED, HIGH);
|
||||||
|
|
||||||
#ifdef PIN_USER_BTN
|
#ifdef PIN_USER_BTN
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue