Add get leds and set leds on|off for Companion, repeater, room server and sensor builds. Preserve the setting across reboots and cover GPIO, RGB, Bluetooth, notification and expander indicators without changing radio amplifier controls or screen backlights. RAK Companions blink while advertising and keep the Bluetooth LED off once connected, including late timer callbacks. Adapted from meshcore-dev/MeshCore#3605 and #2694. Validated with host regressions and firmware builds for SenseCAP Solar, RAK4631, T096, Heltec V4, T-Beam, Xiao S3, Pico W and Wio E5 Mini. Co-authored-by: R0ck <develop@hectospark.co.uk> Co-authored-by: Nick Dunklee <nick@dunklee.org>
82 lines
2.4 KiB
C++
82 lines
2.4 KiB
C++
#pragma once
|
|
|
|
#include <Arduino.h>
|
|
#include <MeshCore.h>
|
|
#include <helpers/NRF52Board.h>
|
|
|
|
// built-ins
|
|
#define VBAT_MV_PER_LSB (0.73242188F) // 3.0V ADC range and 12-bit ADC resolution = 3000mV/4096
|
|
|
|
#define VBAT_DIVIDER_COMP ADC_MULTIPLIER // Compensation factor for the VBAT divider
|
|
|
|
#define PIN_VBAT_READ BATTERY_PIN
|
|
#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB)
|
|
|
|
class ThinkNodeM6Board : public NRF52BoardDCDC {
|
|
protected:
|
|
#if NRF52_POWER_MANAGEMENT
|
|
void initiateShutdown(uint8_t reason) override;
|
|
#endif
|
|
|
|
public:
|
|
ThinkNodeM6Board() : NRF52Board("THINKNODE_M6_OTA") {}
|
|
void begin();
|
|
uint16_t getBattMilliVolts() override;
|
|
|
|
#if defined(P_LORA_TX_LED)
|
|
void applyLedPolicy() override {
|
|
NRF52Board::applyLedPolicy();
|
|
if (!mesh::leds::enabled()) digitalWrite(P_LORA_TX_LED, LOW);
|
|
}
|
|
|
|
void onBeforeTransmit() override {
|
|
if (mesh::leds::enabled()) digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
|
|
}
|
|
void onAfterTransmit() override {
|
|
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
|
|
}
|
|
#endif
|
|
|
|
const char* getManufacturerName() const override {
|
|
return "Elecrow ThinkNode M6";
|
|
}
|
|
|
|
bool hasUsbPowerDetect() const override { return true; }
|
|
|
|
bool isUsbPowered() override {
|
|
// P0.13 is the dedicated USB / external power-detect line on the M6 PCB
|
|
// (same pin the Meshtastic M6 variant uses for USB detection).
|
|
return digitalRead(EXT_PWR_DETECT) == EXT_PWR_DETECT_VALUE;
|
|
}
|
|
|
|
bool hasSolarChargerDetect() const override { return true; }
|
|
|
|
bool isSolarChargerActive() override {
|
|
// P0.15 is the active-low solar-charger status line. It reports the
|
|
// charger's state, not photovoltaic voltage or current.
|
|
return digitalRead(EXT_CHRG_DETECT) == EXT_CHRG_DETECT_VALUE;
|
|
}
|
|
|
|
bool isExternalPowered() override {
|
|
if (isUsbPowered() || isSolarChargerActive()) {
|
|
return true;
|
|
}
|
|
return NRF52Board::isExternalPowered();
|
|
}
|
|
|
|
bool isChargerActive() override {
|
|
// Preserve a generic charging indication while also exposing both
|
|
// source-specific states (USB / solar) separately through the CLI.
|
|
return isSolarChargerActive() || isUsbPowered();
|
|
}
|
|
|
|
void shutdownPeripherals() override {
|
|
NRF52Board::shutdownPeripherals();
|
|
|
|
// 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
|
|
}
|
|
};
|