#pragma once #include #include #include // 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 onBeforeTransmit() override { 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 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 // power off board NRF52Board::powerOff(); } };