mirror of
https://github.com/meshcore-dev/MeshCore.git
synced 2026-04-20 22:13:47 +00:00
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.
72 lines
2 KiB
C++
72 lines
2 KiB
C++
#include "TBeam1WBoard.h"
|
|
|
|
void TBeam1WBoard::begin() {
|
|
ESP32Board::begin();
|
|
|
|
// Power on radio module (must be done before radio init)
|
|
pinMode(SX126X_POWER_EN, OUTPUT);
|
|
digitalWrite(SX126X_POWER_EN, HIGH);
|
|
radio_powered = true;
|
|
delay(10); // Allow radio to power up
|
|
|
|
// RF switch RXEN pin handled by RadioLib via setRfSwitchPins()
|
|
|
|
// 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()
|
|
if (ledManager) ledManager->onBeforeTransmit();
|
|
}
|
|
|
|
void TBeam1WBoard::onAfterTransmit() {
|
|
if (ledManager) ledManager->onAfterTransmit();
|
|
}
|
|
|
|
uint16_t TBeam1WBoard::getBattMilliVolts() {
|
|
// T-Beam 1W uses 7.4V battery with voltage divider
|
|
// ADC reads through divider - adjust multiplier based on actual divider ratio
|
|
analogReadResolution(12);
|
|
uint32_t raw = 0;
|
|
for (int i = 0; i < 8; i++) {
|
|
raw += analogRead(BATTERY_PIN);
|
|
}
|
|
raw = raw / 8;
|
|
// Assuming voltage divider ratio from ADC_MULTIPLIER
|
|
// 3.3V reference, 12-bit ADC (4095 max)
|
|
return static_cast<uint16_t>((raw * 3300 * ADC_MULTIPLIER) / 4095);
|
|
}
|
|
|
|
const char* TBeam1WBoard::getManufacturerName() const {
|
|
return "LilyGo T-Beam 1W";
|
|
}
|
|
|
|
void TBeam1WBoard::powerOff() {
|
|
// Turn off radio LNA (CTRL pin must be LOW when not receiving)
|
|
digitalWrite(SX126X_RXEN, LOW);
|
|
|
|
// Turn off radio power
|
|
digitalWrite(SX126X_POWER_EN, LOW);
|
|
radio_powered = false;
|
|
|
|
// Turn off LED and fan
|
|
if (ledManager) ledManager->powerOff();
|
|
digitalWrite(FAN_CTRL_PIN, LOW);
|
|
|
|
ESP32Board::powerOff();
|
|
}
|
|
|
|
void TBeam1WBoard::setFanEnabled(bool enabled) {
|
|
digitalWrite(FAN_CTRL_PIN, enabled ? HIGH : LOW);
|
|
}
|
|
|
|
bool TBeam1WBoard::isFanEnabled() const {
|
|
return digitalRead(FAN_CTRL_PIN) == HIGH;
|
|
}
|