diff --git a/Boards.h b/Boards.h index 3193b8e..05a57f8 100644 --- a/Boards.h +++ b/Boards.h @@ -17,728 +17,709 @@ #include "ROM.h" #ifndef BOARDS_H - #define BOARDS_H +#define BOARDS_H - #define PLATFORM_ESP32 0x80 - #define PLATFORM_NRF52 0x70 +#define PLATFORM_ESP32 0x80 +#define PLATFORM_NRF52 0x70 - #define MCU_ESP32 0x81 - #define MCU_NRF52 0x71 +#define MCU_ESP32 0x81 +#define MCU_NRF52 0x71 - // Boards - #define BOARD_RNODE 0x31 - #define BOARD_HMBRW 0x32 - #define BOARD_TBEAM 0x33 - #define BOARD_HUZZAH32 0x34 - #define BOARD_GENERIC_ESP32 0x35 - #define BOARD_LORA32_V2_0 0x36 - #define BOARD_LORA32_V2_1 0x37 - #define BOARD_LORA32_V1_0 0x39 - #define BOARD_HELTEC32_V2 0x38 - #define BOARD_HELTEC32_V3 0x3A - #define BOARD_RNODE_NG_20 0x40 - #define BOARD_RNODE_NG_21 0x41 - #define BOARD_T3S3 0x42 - #define BOARD_GENERIC_NRF52 0x50 - #define BOARD_RAK4631 0x51 +// Boards +#define BOARD_RNODE 0x31 +#define BOARD_HMBRW 0x32 +#define BOARD_TBEAM 0x33 +#define BOARD_HUZZAH32 0x34 +#define BOARD_GENERIC_ESP32 0x35 +#define BOARD_LORA32_V2_0 0x36 +#define BOARD_LORA32_V2_1 0x37 +#define BOARD_LORA32_V1_0 0x39 +#define BOARD_HELTEC32_V2 0x38 +#define BOARD_HELTEC32_V3 0x3A +#define BOARD_RNODE_NG_20 0x40 +#define BOARD_RNODE_NG_21 0x41 +#define BOARD_T3S3 0x42 +#define BOARD_GENERIC_NRF52 0x50 +#define BOARD_RAK4631 0x51 - // Displays - #define OLED 0x01 - #define EINK_BW 0x02 - #define EINK_3C 0x03 +// Displays +#define OLED 0x01 +#define EINK_BW 0x02 +#define EINK_3C 0x03 - #if defined(ESP32) - #define PLATFORM PLATFORM_ESP32 - #define MCU_VARIANT MCU_ESP32 - #elif defined(NRF52840_XXAA) - #include - #define PLATFORM PLATFORM_NRF52 - #define MCU_VARIANT MCU_NRF52 - #else - #error "The firmware cannot be compiled for the selected MCU variant" - #endif - - #define HAS_DISPLAY false - #define HAS_BLUETOOTH false - #define HAS_BLE false - #define HAS_TCXO false - #define HAS_PMU false - #define HAS_NP false - #define HAS_EEPROM false - #define HAS_INPUT false - #define HAS_SLEEP false - #define PIN_DISP_SLEEP -1 - #define VALIDATE_FIRMWARE true - - #if defined(ENABLE_TCXO) - #define HAS_TCXO true - #endif - - #if MCU_VARIANT == MCU_ESP32 - - // Board models for ESP32 based builds are - // defined by the build target in the makefile. - // If you are not using make to compile this - // firmware, you can manually define model here. - // - // #define BOARD_MODEL BOARD_GENERIC_ESP32 - #define CONFIG_UART_BUFFER_SIZE 6144 - #define CONFIG_QUEUE_0_SIZE 6144 - #define CONFIG_QUEUE_MAX_LENGTH 200 - - #define EEPROM_SIZE 1024 - #define EEPROM_OFFSET EEPROM_SIZE-EEPROM_RESERVED - - #define GPS_BAUD_RATE 9600 - #define PIN_GPS_TX 12 - #define PIN_GPS_RX 34 - - #if BOARD_MODEL == BOARD_GENERIC_ESP32 - #define HAS_BLUETOOTH true - #define HAS_CONSOLE true - #define HAS_EEPROM true - #define INTERFACE_COUNT 1 - const int pin_led_rx = 14; - const int pin_led_tx = 32; - const uint8_t interfaces[INTERFACE_COUNT] = {SX127X}; - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX127X - { - true, // DEFAULT_SPI - false, // HAS_TCXO - false // DIO2_AS_RF_SWITCH - }, - }; - const int8_t interface_pins[INTERFACE_COUNT][10] = { - // SX127X - { - 4, // pin_ss - -1, // pin_sclk - -1, // pin_mosi - -1, // pin_miso - -1, // pin_busy - 39, // pin_dio - 36, // pin_reset - -1, // pin_txen - -1, // pin_rxen - -1 // pin_tcxo_enable - } - }; - - #elif BOARD_MODEL == BOARD_TBEAM - #define HAS_DISPLAY true - #define DISPLAY OLED - #define HAS_PMU true - #define HAS_BLUETOOTH true - #define HAS_BLE true - #define HAS_CONSOLE true - #define HAS_SD false - #define HAS_EEPROM true - #define I2C_SDA 21 - #define I2C_SCL 22 - #define PMU_IRQ 35 - #define INTERFACE_COUNT 1 - const int pin_led_rx = 2; - const int pin_led_tx = 4; - - const uint8_t interfaces[INTERFACE_COUNT] = {SX1262}; - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX1262 - { - true, // DEFAULT_SPI - true, // HAS_TCXO - true // DIO2_AS_RF_SWITCH - }, - }; - const int8_t interface_pins[INTERFACE_COUNT][10] = { - // SX1262 - { - 18, // pin_ss - -1, // pin_sclk - -1, // pin_mosi - -1, // pin_miso - 32, // pin_busy - 33, // pin_dio - 23, // pin_reset - -1, // pin_txen - -1, // pin_rxen - -1 // pin_tcxo_enable - } - }; - - #elif BOARD_MODEL == BOARD_HUZZAH32 - #define HAS_BLUETOOTH true - #define HAS_CONSOLE true - #define HAS_EEPROM true - #define INTERFACE_COUNT 1 - const int pin_led_rx = 14; - const int pin_led_tx = 32; - - const uint8_t interfaces[INTERFACE_COUNT] = {SX127X}; - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX127X - { - true, // DEFAULT_SPI - false, // HAS_TCXO - false // DIO2_AS_RF_SWITCH - }, - }; - const int8_t interface_pins[INTERFACE_COUNT][10] = { - // SX1262 - { - 4, // pin_ss - -1, // pin_sclk - -1, // pin_mosi - -1, // pin_miso - -1, // pin_busy - 39, // pin_dio - 36, // pin_reset - -1, // pin_txen - -1, // pin_rxen - -1 // pin_tcxo_enable - } - }; - - #elif BOARD_MODEL == BOARD_LORA32_V1_0 - #define HAS_DISPLAY true - #define DISPLAY OLED - #define HAS_BLUETOOTH true - #define HAS_BLE true - #define HAS_CONSOLE true - #define HAS_EEPROM true - #define INTERFACE_COUNT 1 - const int pin_cs = 18; - const int pin_reset = 14; - const int pin_dio = 26; - #if defined(EXTERNAL_LEDS) - const int pin_led_rx = 25; - const int pin_led_tx = 2; - #else - const int pin_led_rx = 2; - const int pin_led_tx = 2; - #endif - - const uint8_t interfaces[INTERFACE_COUNT] = {SX1276}; - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX1276 - { - true, // DEFAULT_SPI - false, // HAS_TCXO - false // DIO2_AS_RF_SWITCH - }, - }; - const int8_t interface_pins[INTERFACE_COUNT][10] = { - // SX1276 - { - 18, // pin_ss - -1, // pin_sclk - -1, // pin_mosi - -1, // pin_miso - -1, // pin_busy - 26, // pin_dio - 14, // pin_reset - -1, // pin_txen - -1, // pin_rxen - -1 // pin_tcxo_enable - } - }; - - #elif BOARD_MODEL == BOARD_LORA32_V2_0 - #define HAS_DISPLAY true - #define DISPLAY OLED - #define HAS_BLUETOOTH true - #define HAS_BLE true - #define HAS_CONSOLE true - #define HAS_EEPROM true - #define INTERFACE_COUNT 1 - const int pin_cs = 18; - const int pin_reset = 12; - const int pin_dio = 26; - #if defined(EXTERNAL_LEDS) - const int pin_led_rx = 2; - const int pin_led_tx = 0; - #else - const int pin_led_rx = 22; - const int pin_led_tx = 22; - #endif - - - const uint8_t interfaces[INTERFACE_COUNT] = {SX127X}; - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX127X - { - true, // DEFAULT_SPI - false, // HAS_TCXO - false // DIO2_AS_RF_SWITCH - }, - }; - const int8_t interface_pins[INTERFACE_COUNT][10] = { - // SX127X - { - 18, // pin_ss - -1, // pin_sclk - -1, // pin_mosi - -1, // pin_miso - -1, // pin_busy - 26, // pin_dio - 14, // pin_reset - -1, // pin_txen - -1, // pin_rxen - -1 // pin_tcxo_enable - } - }; - - #elif BOARD_MODEL == BOARD_LORA32_V2_1 - #define HAS_DISPLAY true - #define DISPLAY OLED - #define HAS_BLUETOOTH true - #define HAS_BLE true - #define HAS_PMU true - #define HAS_CONSOLE true - #define HAS_EEPROM true - #define INTERFACE_COUNT 1 - - const uint8_t interfaces[INTERFACE_COUNT] = {SX127X}; - #if HAS_TCXO == true - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX127X - { - true, // DEFAULT_SPI - true, // HAS_TCXO - false // DIO2_AS_RF_SWITCH - }, - }; - const int8_t interface_pins[INTERFACE_COUNT][10] = { - // SX127X - { - 18, // pin_ss - -1, // pin_sclk - -1, // pin_mosi - -1, // pin_miso - -1, // pin_busy - 26, // pin_dio - 23, // pin_reset - -1, // pin_txen - -1, // pin_rxen - 33 // pin_tcxo_enable - } - }; - #endif - #if defined(EXTERNAL_LEDS) - const int pin_led_rx = 15; - const int pin_led_tx = 4; - #else - const int pin_led_rx = 25; - const int pin_led_tx = 25; - #endif - - #if HAS_TCXO == false - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX127X - { - true, // DEFAULT_SPI - false, // HAS_TCXO - false // DIO2_AS_RF_SWITCH - }, - }; - - const int8_t interface_pins[INTERFACE_COUNT][10] = { - // SX127X - { - 18, // pin_ss - -1, // pin_sclk - -1, // pin_mosi - -1, // pin_miso - -1, // pin_busy - 26, // pin_dio - 23, // pin_reset - -1, // pin_txen - -1, // pin_rxen - -1 // pin_tcxo_enable - } - }; - #endif - - #elif BOARD_MODEL == BOARD_HELTEC32_V2 - #define HAS_DISPLAY true - #define DISPLAY OLED - #define HAS_BLUETOOTH true - #define HAS_CONSOLE true - #define HAS_EEPROM true - #define INTERFACE_COUNT 1 - #if defined(EXTERNAL_LEDS) - const int pin_led_rx = 36; - const int pin_led_tx = 37; - #else - const int pin_led_rx = 25; - const int pin_led_tx = 25; - #endif - - const uint8_t interfaces[INTERFACE_COUNT] = {SX127X}; - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX127X - { - true, // DEFAULT_SPI - false, // HAS_TCXO - false // DIO2_AS_RF_SWITCH - }, - }; - const int8_t interface_pins[INTERFACE_COUNT][10] = { - // SX127X - { - 18, // pin_ss - -1, // pin_sclk - -1, // pin_mosi - -1, // pin_miso - -1, // pin_busy - 26, // pin_dio - 14, // pin_reset - -1, // pin_txen - -1, // pin_rxen - -1 // pin_tcxo_enable - } - }; - - #elif BOARD_MODEL == BOARD_HELTEC32_V3 - #define IS_ESP32S3 true - #define HAS_DISPLAY true - #define HAS_BLUETOOTH false - #define HAS_BLE true - #define HAS_CONSOLE false - #define HAS_EEPROM true - #define HAS_INPUT true - #define HAS_SLEEP true - #define PIN_WAKEUP GPIO_NUM_0 - #define WAKEUP_LEVEL 0 - #define INTERFACE_COUNT 1 - - const int pin_btn_usr1 = 0; - - #if defined(EXTERNAL_LEDS) - const int pin_led_rx = 13; - const int pin_led_tx = 14; - #else - const int pin_led_rx = 35; - const int pin_led_tx = 35; - #endif - - const uint8_t interfaces[INTERFACE_COUNT] = {SX1262}; - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX1262 - { - true, // DEFAULT_SPI - true, // HAS_TCXO - true // DIO2_AS_RF_SWITCH - }, - }; - const int8_t interface_pins[INTERFACE_COUNT][10] = { - // SX1262 - { - 8, // pin_ss - 9, // pin_sclk - 10, // pin_mosi - 11, // pin_miso - 13, // pin_busy - 14, // pin_dio - 12, // pin_reset - -1, // pin_txen - -1, // pin_rxen - -1 // pin_tcxo_enable - } - }; - - #elif BOARD_MODEL == BOARD_RNODE_NG_20 - #define HAS_DISPLAY true - #define DISPLAY OLED - #define HAS_BLUETOOTH true - #define HAS_NP true - #define HAS_CONSOLE true - #define HAS_EEPROM true - #define INTERFACE_COUNT 1 - const int pin_cs = 18; - const int pin_reset = 12; - const int pin_dio = 26; - const int pin_np = 4; - #if HAS_NP == false - #if defined(EXTERNAL_LEDS) - const int pin_led_rx = 2; - const int pin_led_tx = 0; - #else - const int pin_led_rx = 22; - const int pin_led_tx = 22; - #endif - #endif - - - const uint8_t interfaces[INTERFACE_COUNT] = {SX1276}; - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX1276 - { - false, // DEFAULT_SPI - true, // HAS_TCXO - true // DIO2_AS_RF_SWITCH - }, - }; - const uint8_t interface_pins[INTERFACE_COUNT][10] = { - // SX1276 - { - 8, // pin_ss - 9, // pin_sclk - 10, // pin_mosi - 11, // pin_miso - 13, // pin_busy - 14, // pin_dio - 12, // pin_reset - -1, // pin_txen - -1, // pin_rxen - -1 // pin_tcxo_enable - } - }; - - #elif BOARD_MODEL == BOARD_RNODE_NG_21 - #define HAS_DISPLAY true - #define DISPLAY OLED - #define HAS_BLUETOOTH true - #define HAS_CONSOLE true - #define HAS_PMU true - #define HAS_NP true - #define HAS_SD false - #define HAS_EEPROM true - #define INTERFACE_COUNT 1 - const int pin_np = 12; - const int pin_dac = 25; - const int pin_adc = 34; - const int SD_MISO = 2; - const int SD_MOSI = 15; - const int SD_CLK = 14; - const int SD_CS = 13; - #if HAS_NP == false - #if defined(EXTERNAL_LEDS) - const int pin_led_rx = 12; - const int pin_led_tx = 4; - #else - const int pin_led_rx = 25; - const int pin_led_tx = 25; - #endif - #endif - - - const uint8_t interfaces[INTERFACE_COUNT] = {SX127X}; - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX127X - { - true, // DEFAULT_SPI - false, // HAS_TCXO - false // DIO2_AS_RF_SWITCH - }, - }; - const uint8_t interface_pins[INTERFACE_COUNT][10] = { - // SX127X - { - 18, // pin_ss - -1, // pin_sclk - -1, // pin_mosi - -1, // pin_miso - -1, // pin_busy - 26, // pin_dio - 23, // pin_reset - -1, // pin_txen - -1, // pin_rxen - -1 // pin_tcxo_enable - } - }; - - #elif BOARD_MODEL == BOARD_T3S3 - #define IS_ESP32S3 true - - #define HAS_DISPLAY true - #define DISPLAY OLED - #define HAS_CONSOLE false - #define HAS_BLUETOOTH false - #define HAS_BLE true - #define HAS_PMU true - #define HAS_NP false - #define HAS_SD false - #define HAS_EEPROM true - - #define HAS_INPUT true - #define HAS_SLEEP true - #define PIN_WAKEUP GPIO_NUM_0 - #define WAKEUP_LEVEL 0 - #define INTERFACE_COUNT 1 - // #define PIN_DISP_SLEEP 21 - // #define DISP_SLEEP_LEVEL HIGH - const int pin_btn_usr1 = 0; - - const int pin_np = 38; - const int pin_dac = 25; - const int pin_adc = 1; - - const int SD_MISO = 2; - const int SD_MOSI = 11; - const int SD_CLK = 14; - const int SD_CS = 13; - #if HAS_NP == false - #if defined(EXTERNAL_LEDS) - const int pin_led_rx = 37; - const int pin_led_tx = 37; - #else - const int pin_led_rx = 37; - const int pin_led_tx = 37; - #endif - #endif - - #if BOARD_VARIANT == MODEL_A1 - const uint8_t interfaces[INTERFACE_COUNT] = {SX1262}; - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX1262 - { - false, // DEFAULT_SPI - true, // HAS_TCXO - true // DIO2_AS_RF_SWITCH - }, - }; - #elif BOARD_VARIANT == MODEL_A5 // SX1280 with PA - const uint8_t interfaces[INTERFACE_COUNT] = {SX1280}; - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX1280 - { - false, // DEFAULT_SPI - false, // HAS_TCXO - false // DIO2_AS_RF_SWITCH - }, - }; - #endif - const uint8_t interface_pins[INTERFACE_COUNT][10] = { - // SX1262 - { - 7, // pin_ss - 5, // pin_sclk - 6, // pin_mosi - 3, // pin_miso - 34, // pin_busy - 33, // pin_dio - 8, // pin_reset - -1, // pin_txen - -1, // pin_rxen - -1 // pin_tcxo_enable - } - }; - #else - #error An unsupported ESP32 board was selected. Cannot compile RNode firmware. - #endif - - #elif MCU_VARIANT == MCU_NRF52 - #if BOARD_MODEL == BOARD_RAK4631 || BOARD_MODEL == BOARD_FREENODE - #define HAS_EEPROM false - #define HAS_DISPLAY true - #define DISPLAY EINK_BW - #define HAS_BLUETOOTH false - #define HAS_BLE true - #define HAS_CONSOLE false - #define HAS_PMU true - #define HAS_NP false - #define HAS_SD false - #define CONFIG_UART_BUFFER_SIZE 40000 - #define CONFIG_QUEUE_0_SIZE 6144 - #define CONFIG_QUEUE_MAX_LENGTH 200 - #define EEPROM_SIZE 296 - #define EEPROM_OFFSET EEPROM_SIZE-EEPROM_RESERVED - #define BLE_MANUFACTURER "RAK Wireless" - #define BLE_MODEL "RAK4640" - - #if BOARD_VARIANT == MODEL_11 || BOARD_VARIANT == MODEL_12 - #define INTERFACE_COUNT 1 - - // first interface in list is the primary - const uint8_t interfaces[INTERFACE_COUNT] = {SX126X}; - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX1262 - { - false, // DEFAULT_SPI - true, // HAS_TCXO - true // DIO2_AS_RF_SWITCH - } - }; - const int8_t interface_pins[INTERFACE_COUNT][10] = { - // SX1262 - { - 42, // pin_ss - 43, // pin_sclk - 44, // pin_mosi - 45, // pin_miso - 46, // pin_busy - 47, // pin_dio - 38, // pin_reset - -1, // pin_txen - 37, // pin_rxen - -1 // pin_tcxo_enable - } - }; - #elif BOARD_VARIANT == MODEL_13 || BOARD_VARIANT == MODEL_14 || BOARD_VARIANT == MODEL_21 - #define INTERFACE_COUNT 2 - - #define CONFIG_QUEUE_1_SIZE 40000 - - // first interface in list is the primary - const uint8_t interfaces[INTERFACE_COUNT] = {SX126X, SX128X}; - const bool interface_cfg[INTERFACE_COUNT][3] = { - // SX1262 - { - false, // DEFAULT_SPI - true, // HAS_TCXO - true // DIO2_AS_RF_SWITCH - }, - // SX1280 - { - true, // DEFAULT_SPI - false,// HAS_TCXO - false // DIO2_AS_RF_SWITCH - } - }; - const int8_t interface_pins[INTERFACE_COUNT][10] = { - // SX1262 - { - 42, // pin_ss - 43, // pin_sclk - 44, // pin_mosi - 45, // pin_miso - 46, // pin_busy - 47, // pin_dio - 38, // pin_reset - -1, // pin_txen - 37, // pin_rxen - -1 // pin_tcxo_enable - }, - // SX1280 - { - 24, // pin_ss - 3, // pin_sclk - 30, // pin_mosi - 29, // pin_miso - 25, // pin_busy - 15, // pin_dio - 16, // pin_reset - 20, // pin_txen - 19, // pin_rxen - -1 // pin_tcxo_enable - } - }; - #endif - - - const int pin_disp_cs = SS; - const int pin_disp_dc = WB_IO1; - const int pin_disp_reset = -1; - const int pin_disp_busy = WB_IO4; - const int pin_disp_en = WB_IO2; - - const int pin_led_rx = LED_BLUE; - const int pin_led_tx = LED_GREEN; - - #else - #error An unsupported nRF board was selected. Cannot compile RNode firmware. - #endif - - #endif +#if defined(ESP32) +#define PLATFORM PLATFORM_ESP32 +#define MCU_VARIANT MCU_ESP32 +#elif defined(NRF52840_XXAA) +#include +#define PLATFORM PLATFORM_NRF52 +#define MCU_VARIANT MCU_NRF52 +#else +#error "The firmware cannot be compiled for the selected MCU variant" +#endif + +#define HAS_DISPLAY false +#define HAS_BLUETOOTH false +#define HAS_BLE false +#define HAS_TCXO false +#define HAS_PMU false +#define HAS_NP false +#define HAS_EEPROM false +#define HAS_INPUT false +#define HAS_SLEEP false +#define PIN_DISP_SLEEP -1 +#define VALIDATE_FIRMWARE true + +#if defined(ENABLE_TCXO) +#define HAS_TCXO true +#endif + +#if MCU_VARIANT == MCU_ESP32 + +// Board models for ESP32 based builds are +// defined by the build target in the makefile. +// If you are not using make to compile this +// firmware, you can manually define model here. +// +// #define BOARD_MODEL BOARD_GENERIC_ESP32 +#define CONFIG_UART_BUFFER_SIZE 6144 +#define CONFIG_QUEUE_0_SIZE 6144 +#define CONFIG_QUEUE_MAX_LENGTH 200 + +#define EEPROM_SIZE 1024 +#define EEPROM_OFFSET EEPROM_SIZE - EEPROM_RESERVED + +#define GPS_BAUD_RATE 9600 +#define PIN_GPS_TX 12 +#define PIN_GPS_RX 34 + +#if BOARD_MODEL == BOARD_GENERIC_ESP32 +#define HAS_BLUETOOTH true +#define HAS_CONSOLE true +#define HAS_EEPROM true +#define INTERFACE_COUNT 1 +const int pin_led_rx = 14; +const int pin_led_tx = 32; +const uint8_t interfaces[INTERFACE_COUNT] = {SX127X}; +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX127X + { + true, // DEFAULT_SPI + false, // HAS_TCXO + false // DIO2_AS_RF_SWITCH + }, +}; +const int8_t interface_pins[INTERFACE_COUNT][10] = { + // SX127X + { + 4, // pin_ss + -1, // pin_sclk + -1, // pin_mosi + -1, // pin_miso + -1, // pin_busy + 39, // pin_dio + 36, // pin_reset + -1, // pin_txen + -1, // pin_rxen + -1 // pin_tcxo_enable + }}; + +#elif BOARD_MODEL == BOARD_TBEAM +#define HAS_DISPLAY true +#define DISPLAY OLED +#define HAS_PMU true +#define HAS_BLUETOOTH true +#define HAS_BLE true +#define HAS_CONSOLE true +#define HAS_SD false +#define HAS_EEPROM true +#define I2C_SDA 21 +#define I2C_SCL 22 +#define PMU_IRQ 35 +#define INTERFACE_COUNT 1 +const int pin_led_rx = 2; +const int pin_led_tx = 4; + +const uint8_t interfaces[INTERFACE_COUNT] = {SX1262}; +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX1262 + { + true, // DEFAULT_SPI + true, // HAS_TCXO + true // DIO2_AS_RF_SWITCH + }, +}; +const int8_t interface_pins[INTERFACE_COUNT][10] = { + // SX1262 + { + 18, // pin_ss + -1, // pin_sclk + -1, // pin_mosi + -1, // pin_miso + 32, // pin_busy + 33, // pin_dio + 23, // pin_reset + -1, // pin_txen + -1, // pin_rxen + -1 // pin_tcxo_enable + }}; + +#elif BOARD_MODEL == BOARD_HUZZAH32 +#define HAS_BLUETOOTH true +#define HAS_CONSOLE true +#define HAS_EEPROM true +#define INTERFACE_COUNT 1 +const int pin_led_rx = 14; +const int pin_led_tx = 32; + +const uint8_t interfaces[INTERFACE_COUNT] = {SX127X}; +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX127X + { + true, // DEFAULT_SPI + false, // HAS_TCXO + false // DIO2_AS_RF_SWITCH + }, +}; +const int8_t interface_pins[INTERFACE_COUNT][10] = { + // SX1262 + { + 4, // pin_ss + -1, // pin_sclk + -1, // pin_mosi + -1, // pin_miso + -1, // pin_busy + 39, // pin_dio + 36, // pin_reset + -1, // pin_txen + -1, // pin_rxen + -1 // pin_tcxo_enable + }}; + +#elif BOARD_MODEL == BOARD_LORA32_V1_0 +#define HAS_DISPLAY true +#define DISPLAY OLED +#define HAS_BLUETOOTH true +#define HAS_BLE true +#define HAS_CONSOLE true +#define HAS_EEPROM true +#define INTERFACE_COUNT 1 +const int pin_cs = 18; +const int pin_reset = 14; +const int pin_dio = 26; +#if defined(EXTERNAL_LEDS) +const int pin_led_rx = 25; +const int pin_led_tx = 2; +#else +const int pin_led_rx = 2; +const int pin_led_tx = 2; +#endif + +const uint8_t interfaces[INTERFACE_COUNT] = {SX1276}; +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX1276 + { + true, // DEFAULT_SPI + false, // HAS_TCXO + false // DIO2_AS_RF_SWITCH + }, +}; +const int8_t interface_pins[INTERFACE_COUNT][10] = { + // SX1276 + { + 18, // pin_ss + -1, // pin_sclk + -1, // pin_mosi + -1, // pin_miso + -1, // pin_busy + 26, // pin_dio + 14, // pin_reset + -1, // pin_txen + -1, // pin_rxen + -1 // pin_tcxo_enable + }}; + +#elif BOARD_MODEL == BOARD_LORA32_V2_0 +#define HAS_DISPLAY true +#define DISPLAY OLED +#define HAS_BLUETOOTH true +#define HAS_BLE true +#define HAS_CONSOLE true +#define HAS_EEPROM true +#define INTERFACE_COUNT 1 +const int pin_cs = 18; +const int pin_reset = 12; +const int pin_dio = 26; +#if defined(EXTERNAL_LEDS) +const int pin_led_rx = 2; +const int pin_led_tx = 0; +#else +const int pin_led_rx = 22; +const int pin_led_tx = 22; +#endif + +const uint8_t interfaces[INTERFACE_COUNT] = {SX127X}; +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX127X + { + true, // DEFAULT_SPI + false, // HAS_TCXO + false // DIO2_AS_RF_SWITCH + }, +}; +const int8_t interface_pins[INTERFACE_COUNT][10] = { + // SX127X + { + 18, // pin_ss + -1, // pin_sclk + -1, // pin_mosi + -1, // pin_miso + -1, // pin_busy + 26, // pin_dio + 14, // pin_reset + -1, // pin_txen + -1, // pin_rxen + -1 // pin_tcxo_enable + }}; + +#elif BOARD_MODEL == BOARD_LORA32_V2_1 +#define HAS_DISPLAY true +#define DISPLAY OLED +#define HAS_BLUETOOTH true +#define HAS_BLE true +#define HAS_PMU true +#define HAS_CONSOLE true +#define HAS_EEPROM true +#define INTERFACE_COUNT 1 + +const uint8_t interfaces[INTERFACE_COUNT] = {SX127X}; +#if HAS_TCXO == true +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX127X + { + true, // DEFAULT_SPI + true, // HAS_TCXO + false // DIO2_AS_RF_SWITCH + }, +}; +const int8_t interface_pins[INTERFACE_COUNT][10] = { + // SX127X + { + 18, // pin_ss + -1, // pin_sclk + -1, // pin_mosi + -1, // pin_miso + -1, // pin_busy + 26, // pin_dio + 23, // pin_reset + -1, // pin_txen + -1, // pin_rxen + 33 // pin_tcxo_enable + }}; +#endif +#if defined(EXTERNAL_LEDS) +const int pin_led_rx = 15; +const int pin_led_tx = 4; +#else +const int pin_led_rx = 25; +const int pin_led_tx = 25; +#endif + +#if HAS_TCXO == false +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX127X + { + true, // DEFAULT_SPI + false, // HAS_TCXO + false // DIO2_AS_RF_SWITCH + }, +}; + +const int8_t interface_pins[INTERFACE_COUNT][10] = { + // SX127X + { + 18, // pin_ss + -1, // pin_sclk + -1, // pin_mosi + -1, // pin_miso + -1, // pin_busy + 26, // pin_dio + 23, // pin_reset + -1, // pin_txen + -1, // pin_rxen + -1 // pin_tcxo_enable + }}; +#endif + +#elif BOARD_MODEL == BOARD_HELTEC32_V2 +#define HAS_DISPLAY true +#define DISPLAY OLED +#define HAS_BLUETOOTH true +#define HAS_CONSOLE true +#define HAS_EEPROM true +#define INTERFACE_COUNT 1 +#if defined(EXTERNAL_LEDS) +const int pin_led_rx = 36; +const int pin_led_tx = 37; +#else +const int pin_led_rx = 25; +const int pin_led_tx = 25; +#endif + +const uint8_t interfaces[INTERFACE_COUNT] = {SX127X}; +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX127X + { + true, // DEFAULT_SPI + false, // HAS_TCXO + false // DIO2_AS_RF_SWITCH + }, +}; +const int8_t interface_pins[INTERFACE_COUNT][10] = { + // SX127X + { + 18, // pin_ss + -1, // pin_sclk + -1, // pin_mosi + -1, // pin_miso + -1, // pin_busy + 26, // pin_dio + 14, // pin_reset + -1, // pin_txen + -1, // pin_rxen + -1 // pin_tcxo_enable + }}; + +#elif BOARD_MODEL == BOARD_HELTEC32_V3 +#define IS_ESP32S3 true +#define HAS_DISPLAY true +#define HAS_BLUETOOTH false +#define HAS_BLE true +#define HAS_CONSOLE false +#define HAS_EEPROM true +#define HAS_INPUT true +#define HAS_SLEEP true +#define PIN_WAKEUP GPIO_NUM_0 +#define WAKEUP_LEVEL 0 +#define INTERFACE_COUNT 1 +#define HAS_PMU true + +const int pin_btn_usr1 = 0; + +#if defined(EXTERNAL_LEDS) +const int pin_led_rx = 13; +const int pin_led_tx = 14; +#else +const int pin_led_rx = 35; +const int pin_led_tx = 35; +#endif + +const uint8_t interfaces[INTERFACE_COUNT] = {SX1262}; +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX1262 + { + true, // DEFAULT_SPI + true, // HAS_TCXO + true // DIO2_AS_RF_SWITCH + }, +}; +const int8_t interface_pins[INTERFACE_COUNT][10] = { + // SX1262 + { + 8, // pin_ss + 9, // pin_sclk + 10, // pin_mosi + 11, // pin_miso + 13, // pin_busy + 14, // pin_dio + 12, // pin_reset + -1, // pin_txen + -1, // pin_rxen + -1 // pin_tcxo_enable + }}; + +#elif BOARD_MODEL == BOARD_RNODE_NG_20 +#define HAS_DISPLAY true +#define DISPLAY OLED +#define HAS_BLUETOOTH true +#define HAS_NP true +#define HAS_CONSOLE true +#define HAS_EEPROM true +#define INTERFACE_COUNT 1 +const int pin_cs = 18; +const int pin_reset = 12; +const int pin_dio = 26; +const int pin_np = 4; +#if HAS_NP == false +#if defined(EXTERNAL_LEDS) +const int pin_led_rx = 2; +const int pin_led_tx = 0; +#else +const int pin_led_rx = 22; +const int pin_led_tx = 22; +#endif +#endif + +const uint8_t interfaces[INTERFACE_COUNT] = {SX1276}; +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX1276 + { + false, // DEFAULT_SPI + true, // HAS_TCXO + true // DIO2_AS_RF_SWITCH + }, +}; +const uint8_t interface_pins[INTERFACE_COUNT][10] = { + // SX1276 + { + 8, // pin_ss + 9, // pin_sclk + 10, // pin_mosi + 11, // pin_miso + 13, // pin_busy + 14, // pin_dio + 12, // pin_reset + -1, // pin_txen + -1, // pin_rxen + -1 // pin_tcxo_enable + }}; + +#elif BOARD_MODEL == BOARD_RNODE_NG_21 +#define HAS_DISPLAY true +#define DISPLAY OLED +#define HAS_BLUETOOTH true +#define HAS_CONSOLE true +#define HAS_PMU true +#define HAS_NP true +#define HAS_SD false +#define HAS_EEPROM true +#define INTERFACE_COUNT 1 +const int pin_np = 12; +const int pin_dac = 25; +const int pin_adc = 34; +const int SD_MISO = 2; +const int SD_MOSI = 15; +const int SD_CLK = 14; +const int SD_CS = 13; +#if HAS_NP == false +#if defined(EXTERNAL_LEDS) +const int pin_led_rx = 12; +const int pin_led_tx = 4; +#else +const int pin_led_rx = 25; +const int pin_led_tx = 25; +#endif +#endif + +const uint8_t interfaces[INTERFACE_COUNT] = {SX127X}; +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX127X + { + true, // DEFAULT_SPI + false, // HAS_TCXO + false // DIO2_AS_RF_SWITCH + }, +}; +const uint8_t interface_pins[INTERFACE_COUNT][10] = { + // SX127X + { + 18, // pin_ss + -1, // pin_sclk + -1, // pin_mosi + -1, // pin_miso + -1, // pin_busy + 26, // pin_dio + 23, // pin_reset + -1, // pin_txen + -1, // pin_rxen + -1 // pin_tcxo_enable + }}; + +#elif BOARD_MODEL == BOARD_T3S3 +#define IS_ESP32S3 true + +#define HAS_DISPLAY true +#define DISPLAY OLED +#define HAS_CONSOLE false +#define HAS_BLUETOOTH false +#define HAS_BLE true +#define HAS_PMU true +#define HAS_NP false +#define HAS_SD false +#define HAS_EEPROM true + +#define HAS_INPUT true +#define HAS_SLEEP true +#define PIN_WAKEUP GPIO_NUM_0 +#define WAKEUP_LEVEL 0 +#define INTERFACE_COUNT 1 +// #define PIN_DISP_SLEEP 21 +// #define DISP_SLEEP_LEVEL HIGH +const int pin_btn_usr1 = 0; + +const int pin_np = 38; +const int pin_dac = 25; +const int pin_adc = 1; + +const int SD_MISO = 2; +const int SD_MOSI = 11; +const int SD_CLK = 14; +const int SD_CS = 13; +#if HAS_NP == false +#if defined(EXTERNAL_LEDS) +const int pin_led_rx = 37; +const int pin_led_tx = 37; +#else +const int pin_led_rx = 37; +const int pin_led_tx = 37; +#endif +#endif + +#if BOARD_VARIANT == MODEL_A1 +const uint8_t interfaces[INTERFACE_COUNT] = {SX1262}; +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX1262 + { + false, // DEFAULT_SPI + true, // HAS_TCXO + true // DIO2_AS_RF_SWITCH + }, +}; +#elif BOARD_VARIANT == MODEL_A5 // SX1280 with PA +const uint8_t interfaces[INTERFACE_COUNT] = {SX1280}; +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX1280 + { + false, // DEFAULT_SPI + false, // HAS_TCXO + false // DIO2_AS_RF_SWITCH + }, +}; +#endif +const uint8_t interface_pins[INTERFACE_COUNT][10] = { + // SX1262 + { + 7, // pin_ss + 5, // pin_sclk + 6, // pin_mosi + 3, // pin_miso + 34, // pin_busy + 33, // pin_dio + 8, // pin_reset + -1, // pin_txen + -1, // pin_rxen + -1 // pin_tcxo_enable + }}; +#else +#error An unsupported ESP32 board was selected. Cannot compile RNode firmware. +#endif + +#elif MCU_VARIANT == MCU_NRF52 +#if BOARD_MODEL == BOARD_RAK4631 || BOARD_MODEL == BOARD_FREENODE +#define HAS_EEPROM false +#define HAS_DISPLAY true +#define DISPLAY EINK_BW +#define HAS_BLUETOOTH false +#define HAS_BLE true +#define HAS_CONSOLE false +#define HAS_PMU true +#define HAS_NP false +#define HAS_SD false +#define CONFIG_UART_BUFFER_SIZE 40000 +#define CONFIG_QUEUE_0_SIZE 6144 +#define CONFIG_QUEUE_MAX_LENGTH 200 +#define EEPROM_SIZE 296 +#define EEPROM_OFFSET EEPROM_SIZE - EEPROM_RESERVED +#define BLE_MANUFACTURER "RAK Wireless" +#define BLE_MODEL "RAK4640" + +#if BOARD_VARIANT == MODEL_11 || BOARD_VARIANT == MODEL_12 +#define INTERFACE_COUNT 1 + +// first interface in list is the primary +const uint8_t interfaces[INTERFACE_COUNT] = {SX126X}; +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX1262 + { + false, // DEFAULT_SPI + true, // HAS_TCXO + true // DIO2_AS_RF_SWITCH + }}; +const int8_t interface_pins[INTERFACE_COUNT][10] = { + // SX1262 + { + 42, // pin_ss + 43, // pin_sclk + 44, // pin_mosi + 45, // pin_miso + 46, // pin_busy + 47, // pin_dio + 38, // pin_reset + -1, // pin_txen + 37, // pin_rxen + -1 // pin_tcxo_enable + }}; +#elif BOARD_VARIANT == MODEL_13 || BOARD_VARIANT == MODEL_14 || BOARD_VARIANT == MODEL_21 +#define INTERFACE_COUNT 2 + +#define CONFIG_QUEUE_1_SIZE 40000 + +// first interface in list is the primary +const uint8_t interfaces[INTERFACE_COUNT] = {SX126X, SX128X}; +const bool interface_cfg[INTERFACE_COUNT][3] = { + // SX1262 + { + false, // DEFAULT_SPI + true, // HAS_TCXO + true // DIO2_AS_RF_SWITCH + }, + // SX1280 + { + true, // DEFAULT_SPI + false, // HAS_TCXO + false // DIO2_AS_RF_SWITCH + }}; +const int8_t interface_pins[INTERFACE_COUNT][10] = { + // SX1262 + { + 42, // pin_ss + 43, // pin_sclk + 44, // pin_mosi + 45, // pin_miso + 46, // pin_busy + 47, // pin_dio + 38, // pin_reset + -1, // pin_txen + 37, // pin_rxen + -1 // pin_tcxo_enable + }, + // SX1280 + { + 24, // pin_ss + 3, // pin_sclk + 30, // pin_mosi + 29, // pin_miso + 25, // pin_busy + 15, // pin_dio + 16, // pin_reset + 20, // pin_txen + 19, // pin_rxen + -1 // pin_tcxo_enable + }}; +#endif + +const int pin_disp_cs = SS; +const int pin_disp_dc = WB_IO1; +const int pin_disp_reset = -1; +const int pin_disp_busy = WB_IO4; +const int pin_disp_en = WB_IO2; + +const int pin_led_rx = LED_BLUE; +const int pin_led_tx = LED_GREEN; + +#else +#error An unsupported nRF board was selected. Cannot compile RNode firmware. +#endif + +#endif #endif diff --git a/Power.h b/Power.h index 395f629..307655c 100644 --- a/Power.h +++ b/Power.h @@ -1,57 +1,59 @@ #if BOARD_MODEL == BOARD_TBEAM - #include - XPowersLibInterface* PMU = NULL; +#include +XPowersLibInterface *PMU = NULL; - #ifndef PMU_WIRE_PORT - #define PMU_WIRE_PORT Wire - #endif +#ifndef PMU_WIRE_PORT +#define PMU_WIRE_PORT Wire +#endif - #define BAT_V_MIN 3.15 - #define BAT_V_MAX 4.14 +#define BAT_V_MIN 3.15 +#define BAT_V_MAX 4.14 - void disablePeripherals() { - if (PMU) { - // GNSS RTC PowerVDD - PMU->enablePowerOutput(XPOWERS_VBACKUP); - - // LoRa VDD - PMU->disablePowerOutput(XPOWERS_ALDO2); - - // GNSS VDD - PMU->disablePowerOutput(XPOWERS_ALDO3); - } - } - - bool pmuInterrupt; - void setPmuFlag() +void disablePeripherals() +{ + if (PMU) { - pmuInterrupt = true; + // GNSS RTC PowerVDD + PMU->enablePowerOutput(XPOWERS_VBACKUP); + + // LoRa VDD + PMU->disablePowerOutput(XPOWERS_ALDO2); + + // GNSS VDD + PMU->disablePowerOutput(XPOWERS_ALDO3); } +} + +bool pmuInterrupt; +void setPmuFlag() +{ + pmuInterrupt = true; +} #elif BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 - #define BAT_C_SAMPLES 7 - #define BAT_D_SAMPLES 2 - #define BAT_V_MIN 3.15 - #define BAT_V_MAX 4.3 - #define BAT_V_CHG 4.48 - #define BAT_V_FLOAT 4.33 - #define BAT_SAMPLES 5 - const uint8_t pin_vbat = 35; - float bat_p_samples[BAT_SAMPLES]; - float bat_v_samples[BAT_SAMPLES]; - uint8_t bat_samples_count = 0; - int bat_discharging_samples = 0; - int bat_charging_samples = 0; - int bat_charged_samples = 0; - bool bat_voltage_dropping = false; - float bat_delay_v = 0; +#define BAT_C_SAMPLES 7 +#define BAT_D_SAMPLES 2 +#define BAT_V_MIN 3.15 +#define BAT_V_MAX 4.3 +#define BAT_V_CHG 4.48 +#define BAT_V_FLOAT 4.33 +#define BAT_SAMPLES 5 +const uint8_t pin_vbat = 35; +float bat_p_samples[BAT_SAMPLES]; +float bat_v_samples[BAT_SAMPLES]; +uint8_t bat_samples_count = 0; +int bat_discharging_samples = 0; +int bat_charging_samples = 0; +int bat_charged_samples = 0; +bool bat_voltage_dropping = false; +float bat_delay_v = 0; #elif BOARD_MODEL == BOARD_RAK4631 #include "nrfx_power.h" -#define BAT_C_SAMPLES 7 -#define BAT_D_SAMPLES 2 -#define BAT_V_MIN 2.75 -#define BAT_V_MAX 4.2 -#define BAT_V_FLOAT 4.22 -#define BAT_SAMPLES 5 +#define BAT_C_SAMPLES 7 +#define BAT_D_SAMPLES 2 +#define BAT_V_MIN 2.75 +#define BAT_V_MAX 4.2 +#define BAT_V_FLOAT 4.22 +#define BAT_SAMPLES 5 #define VBAT_MV_PER_LSB (0.73242188F) // 3.0V ADC range and 12 - bit ADC resolution = 3000mV / 4096 #define VBAT_DIVIDER_COMP (1.73) // Compensation factor for the VBAT divider #define VBAT_MV_PER_LSB_FIN (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB) @@ -64,379 +66,480 @@ int bat_charging_samples = 0; int bat_charged_samples = 0; bool bat_voltage_dropping = false; float bat_delay_v = 0; +#elif BOARD_MODEL == BOARD_HELTEC32_V3 +#define PIN_VBAT 1 +#define VBAT_READ_CNTRL_PIN 37 #endif uint32_t last_pmu_update = 0; uint8_t pmu_target_pps = 1; -int pmu_update_interval = 1000/pmu_target_pps; +int pmu_update_interval = 1000 / pmu_target_pps; uint8_t pmu_rc = 0; #define PMU_R_INTERVAL 5 void kiss_indicate_battery(); -void measure_battery() { - #if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 - battery_installed = true; - battery_indeterminate = true; - bat_v_samples[bat_samples_count%BAT_SAMPLES] = (float)(analogRead(pin_vbat)) / 4095*2*3.3*1.1; - bat_p_samples[bat_samples_count%BAT_SAMPLES] = ((battery_voltage-BAT_V_MIN) / (BAT_V_MAX-BAT_V_MIN))*100.0; - - bat_samples_count++; - if (!battery_ready && bat_samples_count >= BAT_SAMPLES) { - battery_ready = true; - } +void measure_battery() +{ +#if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 + battery_installed = true; + battery_indeterminate = true; + bat_v_samples[bat_samples_count % BAT_SAMPLES] = (float)(analogRead(pin_vbat)) / 4095 * 2 * 3.3 * 1.1; + bat_p_samples[bat_samples_count % BAT_SAMPLES] = ((battery_voltage - BAT_V_MIN) / (BAT_V_MAX - BAT_V_MIN)) * 100.0; - if (battery_ready) { + bat_samples_count++; + if (!battery_ready && bat_samples_count >= BAT_SAMPLES) + { + battery_ready = true; + } - battery_percent = 0; - for (uint8_t bi = 0; bi < BAT_SAMPLES; bi++) { - battery_percent += bat_p_samples[bi]; - } - battery_percent = battery_percent/BAT_SAMPLES; - - battery_voltage = 0; - for (uint8_t bi = 0; bi < BAT_SAMPLES; bi++) { - battery_voltage += bat_v_samples[bi]; - } - battery_voltage = battery_voltage/BAT_SAMPLES; - - if (bat_delay_v == 0) bat_delay_v = battery_voltage; - if (battery_percent > 100.0) battery_percent = 100.0; - if (battery_percent < 0.0) battery_percent = 0.0; - - if (bat_samples_count%BAT_SAMPLES == 0) { - if (battery_voltage < bat_delay_v && battery_voltage < BAT_V_FLOAT) { - bat_voltage_dropping = true; - } else { - bat_voltage_dropping = false; - } - bat_samples_count = 0; - } - - if (bat_voltage_dropping && battery_voltage < BAT_V_FLOAT) { - battery_state = BATTERY_STATE_DISCHARGING; - } else { - #if BOARD_MODEL == BOARD_RNODE_NG_21 - battery_state = BATTERY_STATE_CHARGING; - #else - battery_state = BATTERY_STATE_DISCHARGING; - #endif - } - - - - // if (bt_state == BT_STATE_CONNECTED) { - // SerialBT.printf("Bus voltage %.3fv. Unfiltered %.3fv.", battery_voltage, bat_v_samples[BAT_SAMPLES-1]); - // if (bat_voltage_dropping) { - // SerialBT.printf(" Voltage is dropping. Percentage %.1f%%.\n", battery_percent); - // } else { - // SerialBT.print(" Voltage is not dropping.\n"); - // } - // } - } - - #elif BOARD_MODEL == BOARD_TBEAM - if (PMU) { - float discharge_current = 0; - float charge_current = 0; - float ext_voltage = 0; - float ext_current = 0; - if (PMU->getChipModel() == XPOWERS_AXP192) { - discharge_current = ((XPowersAXP192*)PMU)->getBattDischargeCurrent(); - charge_current = ((XPowersAXP192*)PMU)->getBatteryChargeCurrent(); - battery_voltage = PMU->getBattVoltage()/1000.0; - // battery_percent = PMU->getBattPercentage()*1.0; - battery_installed = PMU->isBatteryConnect(); - external_power = PMU->isVbusIn(); - ext_voltage = PMU->getVbusVoltage()/1000.0; - ext_current = ((XPowersAXP192*)PMU)->getVbusCurrent(); - } - else if (PMU->getChipModel() == XPOWERS_AXP2101) { - battery_voltage = PMU->getBattVoltage()/1000.0; - // battery_percent = PMU->getBattPercentage()*1.0; - battery_installed = PMU->isBatteryConnect(); - external_power = PMU->isVbusIn(); - ext_voltage = PMU->getVbusVoltage()/1000.0; - } - - if (battery_installed) { - if (PMU->isCharging()) { - battery_state = BATTERY_STATE_CHARGING; - battery_percent = ((battery_voltage-BAT_V_MIN) / (BAT_V_MAX-BAT_V_MIN))*100.0; - } else { - if (PMU->isDischarge()) { - battery_state = BATTERY_STATE_DISCHARGING; - battery_percent = ((battery_voltage-BAT_V_MIN) / (BAT_V_MAX-BAT_V_MIN))*100.0; - } else { - battery_state = BATTERY_STATE_CHARGED; - battery_percent = 100.0; - } - } - } else { - battery_state = BATTERY_STATE_DISCHARGING; - battery_percent = 0.0; - battery_voltage = 0.0; - } - - if (battery_percent > 100.0) battery_percent = 100.0; - if (battery_percent < 0.0) battery_percent = 0.0; - - float charge_watts = battery_voltage*(charge_current/1000.0); - float discharge_watts = battery_voltage*(discharge_current/1000.0); - float ext_watts = ext_voltage*(ext_current/1000.0); - - battery_ready = true; - - // if (bt_state == BT_STATE_CONNECTED) { - // if (battery_installed) { - // if (external_power) { - // SerialBT.printf("External power connected, drawing %.2fw, %.1fmA at %.1fV\n", ext_watts, ext_current, ext_voltage); - // } else { - // SerialBT.println("Running on battery"); - // } - // SerialBT.printf("Battery percentage %.1f%%\n", battery_percent); - // SerialBT.printf("Battery voltage %.2fv\n", battery_voltage); - // // SerialBT.printf("Temperature %.1f%\n", auxillary_temperature); - - // if (battery_state == BATTERY_STATE_CHARGING) { - // SerialBT.printf("Charging with %.2fw, %.1fmA at %.1fV\n", charge_watts, charge_current, battery_voltage); - // } else if (battery_state == BATTERY_STATE_DISCHARGING) { - // SerialBT.printf("Discharging at %.2fw, %.1fmA at %.1fV\n", discharge_watts, discharge_current, battery_voltage); - // } else if (battery_state == BATTERY_STATE_CHARGED) { - // SerialBT.printf("Battery charged\n"); - // } - // } else { - // SerialBT.println("No battery installed"); - // } - // SerialBT.println(""); - // } - } - else { - battery_ready = false; - } - - #elif BOARD_MODEL == BOARD_RAK4631 - battery_installed = true; - battery_indeterminate = false; - - bat_v_samples[bat_samples_count%BAT_SAMPLES] = (float)(analogRead(PIN_VBAT)) * VBAT_MV_PER_LSB_FIN; - - if (bat_v_samples[bat_samples_count%BAT_SAMPLES] < 3300) { - bat_p_samples[bat_samples_count%BAT_SAMPLES] = 0; - } - else if (bat_v_samples[bat_samples_count%BAT_SAMPLES] < 3600) - { - bat_v_samples[bat_samples_count%BAT_SAMPLES] -= 3300; - bat_p_samples[bat_samples_count%BAT_SAMPLES] = bat_v_samples[bat_samples_count%BAT_SAMPLES] / 30; - } else { - bat_v_samples[bat_samples_count%BAT_SAMPLES] -= 3600; - } - bat_p_samples[bat_samples_count%BAT_SAMPLES] = 10 + (bat_v_samples[bat_samples_count%BAT_SAMPLES] * 0.15F); - - bat_samples_count++; - if (!battery_ready && bat_samples_count >= BAT_SAMPLES) { - battery_ready = true; - } + if (battery_ready) + { battery_percent = 0; - for (uint8_t bi = 0; bi < BAT_SAMPLES; bi++) { - battery_percent += bat_p_samples[bi]; + for (uint8_t bi = 0; bi < BAT_SAMPLES; bi++) + { + battery_percent += bat_p_samples[bi]; } - battery_percent = battery_percent/BAT_SAMPLES; + battery_percent = battery_percent / BAT_SAMPLES; battery_voltage = 0; - for (uint8_t bi = 0; bi < BAT_SAMPLES; bi++) { - battery_voltage += bat_v_samples[bi]; + for (uint8_t bi = 0; bi < BAT_SAMPLES; bi++) + { + battery_voltage += bat_v_samples[bi]; } - battery_voltage = battery_voltage/BAT_SAMPLES; + battery_voltage = battery_voltage / BAT_SAMPLES; - if (bat_delay_v == 0) bat_delay_v = battery_voltage; - if (battery_percent > 100.0) battery_percent = 100.0; - if (battery_percent < 0.0) battery_percent = 0.0; + if (bat_delay_v == 0) + bat_delay_v = battery_voltage; + if (battery_percent > 100.0) + battery_percent = 100.0; + if (battery_percent < 0.0) + battery_percent = 0.0; - if (bat_samples_count%BAT_SAMPLES == 0) { - if (battery_voltage < bat_delay_v && battery_voltage < BAT_V_FLOAT) { - bat_voltage_dropping = true; - } else { - bat_voltage_dropping = false; - } - bat_samples_count = 0; + if (bat_samples_count % BAT_SAMPLES == 0) + { + if (battery_voltage < bat_delay_v && battery_voltage < BAT_V_FLOAT) + { + bat_voltage_dropping = true; + } + else + { + bat_voltage_dropping = false; + } + bat_samples_count = 0; } - nrfx_power_usb_state_t usbstate = nrfx_power_usbstatus_get(); - if (usbstate == NRFX_POWER_USB_STATE_CONNECTED || usbstate == NRFX_POWER_USB_STATE_READY) { - // charging + if (bat_voltage_dropping && battery_voltage < BAT_V_FLOAT) + { + battery_state = BATTERY_STATE_DISCHARGING; + } + else + { +#if BOARD_MODEL == BOARD_RNODE_NG_21 + battery_state = BATTERY_STATE_CHARGING; +#else + battery_state = BATTERY_STATE_DISCHARGING; +#endif + } + + // if (bt_state == BT_STATE_CONNECTED) { + // SerialBT.printf("Bus voltage %.3fv. Unfiltered %.3fv.", battery_voltage, bat_v_samples[BAT_SAMPLES-1]); + // if (bat_voltage_dropping) { + // SerialBT.printf(" Voltage is dropping. Percentage %.1f%%.\n", battery_percent); + // } else { + // SerialBT.print(" Voltage is not dropping.\n"); + // } + // } + } + +#elif BOARD_MODEL == BOARD_HELTEC32_V3 + battery_installed = true; + battery_indeterminate = false; + battery_state = BATTERY_STATE_DISCHARGING; + battery_ready = true; + + digitalWrite(VBAT_READ_CNTRL_PIN, LOW); + analogSetPinAttenuation(PIN_VBAT, ADC_2_5db); + delay(50); + analogRead(PIN_VBAT); // to clear out potential wrong reads on first read + int analogValue = 0; + for (int i = 0; i < 5; i++) + { + analogValue += analogRead(PIN_VBAT); // reading value to make an average over 5 values + delay(10); + } + analogValue /= 5; // calculate average value + digitalWrite(VBAT_READ_CNTRL_PIN, HIGH); + battery_voltage = (float(analogValue) / 4095.0) * 1.25 * (4.9); // at 2.5db attenuation range is 0-1250mV, 4.9 is voltage divider ratio + battery_percent = (battery_voltage - 3.4) * 125.0; + if (battery_percent > 100.0) + { + battery_percent = 100.0; + } + if (battery_percent < 0.0) + { + battery_percent = 0.0; + } + +#elif BOARD_MODEL == BOARD_TBEAM + if (PMU) + { + float discharge_current = 0; + float charge_current = 0; + float ext_voltage = 0; + float ext_current = 0; + if (PMU->getChipModel() == XPOWERS_AXP192) + { + discharge_current = ((XPowersAXP192 *)PMU)->getBattDischargeCurrent(); + charge_current = ((XPowersAXP192 *)PMU)->getBatteryChargeCurrent(); + battery_voltage = PMU->getBattVoltage() / 1000.0; + // battery_percent = PMU->getBattPercentage()*1.0; + battery_installed = PMU->isBatteryConnect(); + external_power = PMU->isVbusIn(); + ext_voltage = PMU->getVbusVoltage() / 1000.0; + ext_current = ((XPowersAXP192 *)PMU)->getVbusCurrent(); + } + else if (PMU->getChipModel() == XPOWERS_AXP2101) + { + battery_voltage = PMU->getBattVoltage() / 1000.0; + // battery_percent = PMU->getBattPercentage()*1.0; + battery_installed = PMU->isBatteryConnect(); + external_power = PMU->isVbusIn(); + ext_voltage = PMU->getVbusVoltage() / 1000.0; + } + + if (battery_installed) + { + if (PMU->isCharging()) + { battery_state = BATTERY_STATE_CHARGING; - } else { - battery_state = BATTERY_STATE_DISCHARGING; + battery_percent = ((battery_voltage - BAT_V_MIN) / (BAT_V_MAX - BAT_V_MIN)) * 100.0; + } + else + { + if (PMU->isDischarge()) + { + battery_state = BATTERY_STATE_DISCHARGING; + battery_percent = ((battery_voltage - BAT_V_MIN) / (BAT_V_MAX - BAT_V_MIN)) * 100.0; + } + else + { + battery_state = BATTERY_STATE_CHARGED; + battery_percent = 100.0; + } + } + } + else + { + battery_state = BATTERY_STATE_DISCHARGING; + battery_percent = 0.0; + battery_voltage = 0.0; } - if (battery_percent >= 98) { - battery_state = BATTERY_STATE_CHARGED; - } - #endif + if (battery_percent > 100.0) + battery_percent = 100.0; + if (battery_percent < 0.0) + battery_percent = 0.0; - if (battery_ready) { + float charge_watts = battery_voltage * (charge_current / 1000.0); + float discharge_watts = battery_voltage * (discharge_current / 1000.0); + float ext_watts = ext_voltage * (ext_current / 1000.0); + + battery_ready = true; + + // if (bt_state == BT_STATE_CONNECTED) { + // if (battery_installed) { + // if (external_power) { + // SerialBT.printf("External power connected, drawing %.2fw, %.1fmA at %.1fV\n", ext_watts, ext_current, ext_voltage); + // } else { + // SerialBT.println("Running on battery"); + // } + // SerialBT.printf("Battery percentage %.1f%%\n", battery_percent); + // SerialBT.printf("Battery voltage %.2fv\n", battery_voltage); + // // SerialBT.printf("Temperature %.1f%\n", auxillary_temperature); + + // if (battery_state == BATTERY_STATE_CHARGING) { + // SerialBT.printf("Charging with %.2fw, %.1fmA at %.1fV\n", charge_watts, charge_current, battery_voltage); + // } else if (battery_state == BATTERY_STATE_DISCHARGING) { + // SerialBT.printf("Discharging at %.2fw, %.1fmA at %.1fV\n", discharge_watts, discharge_current, battery_voltage); + // } else if (battery_state == BATTERY_STATE_CHARGED) { + // SerialBT.printf("Battery charged\n"); + // } + // } else { + // SerialBT.println("No battery installed"); + // } + // SerialBT.println(""); + // } + } + else + { + battery_ready = false; + } + +#elif BOARD_MODEL == BOARD_RAK4631 + battery_installed = true; + battery_indeterminate = false; + + bat_v_samples[bat_samples_count % BAT_SAMPLES] = (float)(analogRead(PIN_VBAT)) * VBAT_MV_PER_LSB_FIN; + + if (bat_v_samples[bat_samples_count % BAT_SAMPLES] < 3300) + { + bat_p_samples[bat_samples_count % BAT_SAMPLES] = 0; + } + else if (bat_v_samples[bat_samples_count % BAT_SAMPLES] < 3600) + { + bat_v_samples[bat_samples_count % BAT_SAMPLES] -= 3300; + bat_p_samples[bat_samples_count % BAT_SAMPLES] = bat_v_samples[bat_samples_count % BAT_SAMPLES] / 30; + } + else + { + bat_v_samples[bat_samples_count % BAT_SAMPLES] -= 3600; + } + bat_p_samples[bat_samples_count % BAT_SAMPLES] = 10 + (bat_v_samples[bat_samples_count % BAT_SAMPLES] * 0.15F); + + bat_samples_count++; + if (!battery_ready && bat_samples_count >= BAT_SAMPLES) + { + battery_ready = true; + } + + battery_percent = 0; + for (uint8_t bi = 0; bi < BAT_SAMPLES; bi++) + { + battery_percent += bat_p_samples[bi]; + } + battery_percent = battery_percent / BAT_SAMPLES; + + battery_voltage = 0; + for (uint8_t bi = 0; bi < BAT_SAMPLES; bi++) + { + battery_voltage += bat_v_samples[bi]; + } + battery_voltage = battery_voltage / BAT_SAMPLES; + + if (bat_delay_v == 0) + bat_delay_v = battery_voltage; + if (battery_percent > 100.0) + battery_percent = 100.0; + if (battery_percent < 0.0) + battery_percent = 0.0; + + if (bat_samples_count % BAT_SAMPLES == 0) + { + if (battery_voltage < bat_delay_v && battery_voltage < BAT_V_FLOAT) + { + bat_voltage_dropping = true; + } + else + { + bat_voltage_dropping = false; + } + bat_samples_count = 0; + } + + nrfx_power_usb_state_t usbstate = nrfx_power_usbstatus_get(); + if (usbstate == NRFX_POWER_USB_STATE_CONNECTED || usbstate == NRFX_POWER_USB_STATE_READY) + { + // charging + battery_state = BATTERY_STATE_CHARGING; + } + else + { + battery_state = BATTERY_STATE_DISCHARGING; + } + + if (battery_percent >= 98) + { + battery_state = BATTERY_STATE_CHARGED; + } +#endif + + if (battery_ready) + { pmu_rc++; - if (pmu_rc%PMU_R_INTERVAL == 0) { + if (pmu_rc % PMU_R_INTERVAL == 0) + { kiss_indicate_battery(); } } } -void update_pmu() { - if (millis()-last_pmu_update >= pmu_update_interval) { +void update_pmu() +{ + if (millis() - last_pmu_update >= pmu_update_interval) + { measure_battery(); last_pmu_update = millis(); } } -bool init_pmu() { - #if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 - pinMode(pin_vbat, INPUT); - return true; - #elif BOARD_MODEL == BOARD_TBEAM - Wire.begin(I2C_SDA, I2C_SCL); +bool init_pmu() +{ +#if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 + pinMode(pin_vbat, INPUT); + return true; - if (!PMU) { - PMU = new XPowersAXP2101(PMU_WIRE_PORT); - if (!PMU->init()) { - Serial.println("Warning: Failed to find AXP2101 power management"); - delete PMU; - PMU = NULL; - } else { - Serial.println("AXP2101 PMU init succeeded, using AXP2101 PMU"); - } +#elif BOARD_MODEL == BOARD_HELTEC32_V3 + + pinMode(PIN_VBAT, INPUT); + pinMode(VBAT_READ_CNTRL_PIN, OUTPUT); + adcAttachPin(PIN_VBAT); + analogReadResolution(12); + + return true; + +#elif BOARD_MODEL == BOARD_TBEAM + Wire.begin(I2C_SDA, I2C_SCL); + + if (!PMU) + { + PMU = new XPowersAXP2101(PMU_WIRE_PORT); + if (!PMU->init()) + { + Serial.println("Warning: Failed to find AXP2101 power management"); + delete PMU; + PMU = NULL; } - - if (!PMU) { - PMU = new XPowersAXP192(PMU_WIRE_PORT); - if (!PMU->init()) { - Serial.println("Warning: Failed to find AXP192 power management"); - delete PMU; - PMU = NULL; - } else { - Serial.println("AXP192 PMU init succeeded, using AXP192 PMU"); - } + else + { + Serial.println("AXP2101 PMU init succeeded, using AXP2101 PMU"); } + } - if (!PMU) { - return false; + if (!PMU) + { + PMU = new XPowersAXP192(PMU_WIRE_PORT); + if (!PMU->init()) + { + Serial.println("Warning: Failed to find AXP192 power management"); + delete PMU; + PMU = NULL; } - - // Configure charging indicator - PMU->setChargingLedMode(XPOWERS_CHG_LED_OFF); - - pinMode(PMU_IRQ, INPUT_PULLUP); - attachInterrupt(PMU_IRQ, setPmuFlag, FALLING); - - if (PMU->getChipModel() == XPOWERS_AXP192) { - - // Turn off unused power sources to save power - PMU->disablePowerOutput(XPOWERS_DCDC1); - PMU->disablePowerOutput(XPOWERS_DCDC2); - PMU->disablePowerOutput(XPOWERS_LDO2); - PMU->disablePowerOutput(XPOWERS_LDO3); - - // Set the power of LoRa and GPS module to 3.3V - // LoRa - PMU->setPowerChannelVoltage(XPOWERS_LDO2, 3300); - // GPS - PMU->setPowerChannelVoltage(XPOWERS_LDO3, 3300); - // OLED - PMU->setPowerChannelVoltage(XPOWERS_DCDC1, 3300); - - // Turn on LoRa - PMU->enablePowerOutput(XPOWERS_LDO2); - - // Turn on GPS - //PMU->enablePowerOutput(XPOWERS_LDO3); - - // protected oled power source - PMU->setProtectedChannel(XPOWERS_DCDC1); - // protected esp32 power source - PMU->setProtectedChannel(XPOWERS_DCDC3); - // enable oled power - PMU->enablePowerOutput(XPOWERS_DCDC1); - - PMU->disableIRQ(XPOWERS_AXP192_ALL_IRQ); - - PMU->enableIRQ(XPOWERS_AXP192_VBUS_REMOVE_IRQ | - XPOWERS_AXP192_VBUS_INSERT_IRQ | - XPOWERS_AXP192_BAT_CHG_DONE_IRQ | - XPOWERS_AXP192_BAT_CHG_START_IRQ | - XPOWERS_AXP192_BAT_REMOVE_IRQ | - XPOWERS_AXP192_BAT_INSERT_IRQ | - XPOWERS_AXP192_PKEY_SHORT_IRQ - ); - + else + { + Serial.println("AXP192 PMU init succeeded, using AXP192 PMU"); } - else if (PMU->getChipModel() == XPOWERS_AXP2101) { + } - // Turn off unused power sources to save power - PMU->disablePowerOutput(XPOWERS_DCDC2); - PMU->disablePowerOutput(XPOWERS_DCDC3); - PMU->disablePowerOutput(XPOWERS_DCDC4); - PMU->disablePowerOutput(XPOWERS_DCDC5); - PMU->disablePowerOutput(XPOWERS_ALDO1); - PMU->disablePowerOutput(XPOWERS_ALDO2); - PMU->disablePowerOutput(XPOWERS_ALDO3); - PMU->disablePowerOutput(XPOWERS_ALDO4); - PMU->disablePowerOutput(XPOWERS_BLDO1); - PMU->disablePowerOutput(XPOWERS_BLDO2); - PMU->disablePowerOutput(XPOWERS_DLDO1); - PMU->disablePowerOutput(XPOWERS_DLDO2); - PMU->disablePowerOutput(XPOWERS_VBACKUP); - - // Set the power of LoRa and GPS module to 3.3V - // LoRa - PMU->setPowerChannelVoltage(XPOWERS_ALDO2, 3300); - // GPS - PMU->setPowerChannelVoltage(XPOWERS_ALDO3, 3300); - PMU->setPowerChannelVoltage(XPOWERS_VBACKUP, 3300); - - // ESP32 VDD - // ! No need to set, automatically open , Don't close it - // PMU->setPowerChannelVoltage(XPOWERS_DCDC1, 3300); - // PMU->setProtectedChannel(XPOWERS_DCDC1); - PMU->setProtectedChannel(XPOWERS_DCDC1); - - // LoRa VDD - PMU->enablePowerOutput(XPOWERS_ALDO2); - - // GNSS VDD - //PMU->enablePowerOutput(XPOWERS_ALDO3); - - // GNSS RTC PowerVDD - //PMU->enablePowerOutput(XPOWERS_VBACKUP); - } - - PMU->enableSystemVoltageMeasure(); - PMU->enableVbusVoltageMeasure(); - PMU->enableBattVoltageMeasure(); - // It is necessary to disable the detection function of the TS pin on the board - // without the battery temperature detection function, otherwise it will cause abnormal charging - PMU->disableTSPinMeasure(); - - // Set the time of pressing the button to turn off - PMU->setPowerKeyPressOffTime(XPOWERS_POWEROFF_4S); - - return true; - #elif BOARD_MODEL == BOARD_RAK4631 - // board doesn't have PMU but we can measure batt voltage - - // prep ADC for reading battery level - analogReference(AR_INTERNAL_3_0); - - // Set the resolution to 12-bit (0..4095) - analogReadResolution(12); - - // Let the ADC settle - delay(1); - - // Get a single ADC sample and throw it away - float raw = analogRead(PIN_VBAT); - return true; - #else + if (!PMU) + { return false; - #endif + } + + // Configure charging indicator + PMU->setChargingLedMode(XPOWERS_CHG_LED_OFF); + + pinMode(PMU_IRQ, INPUT_PULLUP); + attachInterrupt(PMU_IRQ, setPmuFlag, FALLING); + + if (PMU->getChipModel() == XPOWERS_AXP192) + { + + // Turn off unused power sources to save power + PMU->disablePowerOutput(XPOWERS_DCDC1); + PMU->disablePowerOutput(XPOWERS_DCDC2); + PMU->disablePowerOutput(XPOWERS_LDO2); + PMU->disablePowerOutput(XPOWERS_LDO3); + + // Set the power of LoRa and GPS module to 3.3V + // LoRa + PMU->setPowerChannelVoltage(XPOWERS_LDO2, 3300); + // GPS + PMU->setPowerChannelVoltage(XPOWERS_LDO3, 3300); + // OLED + PMU->setPowerChannelVoltage(XPOWERS_DCDC1, 3300); + + // Turn on LoRa + PMU->enablePowerOutput(XPOWERS_LDO2); + + // Turn on GPS + // PMU->enablePowerOutput(XPOWERS_LDO3); + + // protected oled power source + PMU->setProtectedChannel(XPOWERS_DCDC1); + // protected esp32 power source + PMU->setProtectedChannel(XPOWERS_DCDC3); + // enable oled power + PMU->enablePowerOutput(XPOWERS_DCDC1); + + PMU->disableIRQ(XPOWERS_AXP192_ALL_IRQ); + + PMU->enableIRQ(XPOWERS_AXP192_VBUS_REMOVE_IRQ | + XPOWERS_AXP192_VBUS_INSERT_IRQ | + XPOWERS_AXP192_BAT_CHG_DONE_IRQ | + XPOWERS_AXP192_BAT_CHG_START_IRQ | + XPOWERS_AXP192_BAT_REMOVE_IRQ | + XPOWERS_AXP192_BAT_INSERT_IRQ | + XPOWERS_AXP192_PKEY_SHORT_IRQ); + } + else if (PMU->getChipModel() == XPOWERS_AXP2101) + { + + // Turn off unused power sources to save power + PMU->disablePowerOutput(XPOWERS_DCDC2); + PMU->disablePowerOutput(XPOWERS_DCDC3); + PMU->disablePowerOutput(XPOWERS_DCDC4); + PMU->disablePowerOutput(XPOWERS_DCDC5); + PMU->disablePowerOutput(XPOWERS_ALDO1); + PMU->disablePowerOutput(XPOWERS_ALDO2); + PMU->disablePowerOutput(XPOWERS_ALDO3); + PMU->disablePowerOutput(XPOWERS_ALDO4); + PMU->disablePowerOutput(XPOWERS_BLDO1); + PMU->disablePowerOutput(XPOWERS_BLDO2); + PMU->disablePowerOutput(XPOWERS_DLDO1); + PMU->disablePowerOutput(XPOWERS_DLDO2); + PMU->disablePowerOutput(XPOWERS_VBACKUP); + + // Set the power of LoRa and GPS module to 3.3V + // LoRa + PMU->setPowerChannelVoltage(XPOWERS_ALDO2, 3300); + // GPS + PMU->setPowerChannelVoltage(XPOWERS_ALDO3, 3300); + PMU->setPowerChannelVoltage(XPOWERS_VBACKUP, 3300); + + // ESP32 VDD + // ! No need to set, automatically open , Don't close it + // PMU->setPowerChannelVoltage(XPOWERS_DCDC1, 3300); + // PMU->setProtectedChannel(XPOWERS_DCDC1); + PMU->setProtectedChannel(XPOWERS_DCDC1); + + // LoRa VDD + PMU->enablePowerOutput(XPOWERS_ALDO2); + + // GNSS VDD + // PMU->enablePowerOutput(XPOWERS_ALDO3); + + // GNSS RTC PowerVDD + // PMU->enablePowerOutput(XPOWERS_VBACKUP); + } + + PMU->enableSystemVoltageMeasure(); + PMU->enableVbusVoltageMeasure(); + PMU->enableBattVoltageMeasure(); + // It is necessary to disable the detection function of the TS pin on the board + // without the battery temperature detection function, otherwise it will cause abnormal charging + PMU->disableTSPinMeasure(); + + // Set the time of pressing the button to turn off + PMU->setPowerKeyPressOffTime(XPOWERS_POWEROFF_4S); + + return true; +#elif BOARD_MODEL == BOARD_RAK4631 + // board doesn't have PMU but we can measure batt voltage + + // prep ADC for reading battery level + analogReference(AR_INTERNAL_3_0); + + // Set the resolution to 12-bit (0..4095) + analogReadResolution(12); + + // Let the ADC settle + delay(1); + + // Get a single ADC sample and throw it away + float raw = analogRead(PIN_VBAT); + return true; +#else + return false; +#endif }