From dbfa5c6b9a1611639f1637b6b0ab11eeaea8ad89 Mon Sep 17 00:00:00 2001 From: TheBeadster Date: Mon, 4 Aug 2025 08:27:50 +0100 Subject: [PATCH] Snapshot before wiring to upstream --- Bluetooth.h | 24 ++--- Boards.h | 173 +++++++++++++++++++++------------- Config.h | 2 +- Console.h | 2 +- Device.h | 19 +++- Display.h | 112 ++++++++++++++++++---- Documentation/CONTRIBUTING.md | 4 +- Framing.h | 2 +- Graphics.h | 1 + Input.h | 2 +- Makefile | 14 ++- Power.h | 27 +++++- RNode_Firmware_CE.ino | 138 ++++++++++++++++++++++++--- Radio.cpp | 39 ++++++-- Radio.hpp | 10 +- Utilities.h | 45 ++++++++- board_config.h | 2 + 17 files changed, 470 insertions(+), 146 deletions(-) create mode 100644 board_config.h diff --git a/Bluetooth.h b/Bluetooth.h index 2196070..49a11ee 100644 --- a/Bluetooth.h +++ b/Bluetooth.h @@ -10,12 +10,9 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -#pragma once -#include - // You should have received a copy of the GNU General Public License // along with this program. If not, see . - +#include "board_config.h" #if MCU_VARIANT == MCU_ESP32 #if HAS_BLUETOOTH == true #include "BluetoothSerial.h" @@ -36,19 +33,19 @@ BLEUart SerialBT(BLE_RX_BUF); BLEDis bledis; BLEBas blebas; - extern bool SerialBT_init; + bool SerialBT_init = false; #endif #define BT_PAIRING_TIMEOUT 35000 #define BLE_FLUSH_TIMEOUT 20 -extern uint32_t bt_pairing_started; +uint32_t bt_pairing_started = 0; #define BT_DEV_ADDR_LEN 6 #define BT_DEV_HASH_LEN 16 -extern uint8_t dev_bt_mac[BT_DEV_ADDR_LEN]; -extern char bt_da[BT_DEV_ADDR_LEN]; -extern char bt_dh[BT_DEV_HASH_LEN]; -extern char bt_devname[11]; +uint8_t dev_bt_mac[BT_DEV_ADDR_LEN]; +char bt_da[BT_DEV_ADDR_LEN]; +char bt_dh[BT_DEV_HASH_LEN]; +char bt_devname[11]; #if MCU_VARIANT == MCU_ESP32 #if HAS_BLUETOOTH == true @@ -176,7 +173,8 @@ extern char bt_devname[11]; void bt_flush() { if (bt_state == BT_STATE_CONNECTED) { SerialBT.flush(); } } void bt_start() { - // Serial.println("BT start"); + + //Serial.println("BT start"); display_unblank(); if (bt_state == BT_STATE_OFF) { bt_state = BT_STATE_ON; @@ -196,6 +194,7 @@ extern char bt_devname[11]; } bool bt_init() { + // Serial.println("BT init"); bt_state = BT_STATE_OFF; if (bt_setup_hw()) { @@ -300,7 +299,8 @@ extern char bt_devname[11]; void bt_connect_callback(BLEServer *server) { uint16_t conn_id = server->getConnId(); - // Serial.printf("Connected: %d\n", conn_id); + + //Serial.printf("Connected: %d\n", conn_id); display_unblank(); ble_authenticated = false; if (bt_state != BT_STATE_PAIRING) { bt_state = BT_STATE_CONNECTED; } diff --git a/Boards.h b/Boards.h index 3afdd9f..fe4bfe4 100644 --- a/Boards.h +++ b/Boards.h @@ -12,7 +12,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -#define BOARD_MODEL BOARD_HELTEC_MESHP // MeshPocket board ID +//#define BOARD_MODEL BOARD_HELTEC_MESHP +//#define BOARD_MODEL BOARD_HELTEC_MESHP +#include "board_config.h" #include "Interfaces.h" #include "ROM.h" @@ -119,10 +121,11 @@ #define MODEL_C7 0xC7 // Heltec Mesh Node T114, 863-928 MHz #define MODEL_CB 0xCB // Heltec Mesh Node T114, 863-928 MHz + GPS - #define PRODUCT_HELTEC_MESHP 0xC3 // Heltec MeshPocket - #define BOARD_HELTEC_MESHP 0x46 // MeshPocket board ID - #define MODEL_C7 0xC7 // 863-928 MHz - + #define PRODUCT_HELTEC_MESHP 0xD2 // Heltec Mesh Node MeshPocket with a T114 + #define BOARD_HELTEC_MESHP 0x46 + #define MODEL_CD 0xCD // Heltec Mesh Node MeshPocket, 470-510 MHz + #define MODEL_CE 0xCE // Heltec Mesh Node MeshPocket, 863-928 MHz + #define PRODUCT_TECHO 0x15 // LilyGO T-Echo devices #define BOARD_TECHO 0x44 @@ -156,6 +159,7 @@ #endif #define HAS_DISPLAY false + #define HAS_BLUETOOTH false #define HAS_BLE false #define HAS_TCXO false @@ -222,7 +226,7 @@ #elif BOARD_MODEL == BOARD_TBEAM #define HAS_DISPLAY true - #define DISPLAY_TYPE OLED + #define DISPLAY OLED #define HAS_PMU true #define HAS_BLUETOOTH true #define HAS_CONSOLE true @@ -326,7 +330,7 @@ #elif BOARD_MODEL == BOARD_LORA32_V1_0 #define HAS_DISPLAY true - #define DISPLAY_TYPE OLED + #define DISPLAY OLED #define HAS_BLUETOOTH true #define HAS_CONSOLE true #define HAS_EEPROM true @@ -369,7 +373,7 @@ #elif BOARD_MODEL == BOARD_LORA32_V2_0 #define HAS_DISPLAY true - #define DISPLAY_TYPE OLED + #define DISPLAY OLED #define HAS_BLUETOOTH true #define HAS_CONSOLE true #define HAS_EEPROM true @@ -413,7 +417,7 @@ #elif BOARD_MODEL == BOARD_LORA32_V2_1 #define HAS_DISPLAY true - #define DISPLAY_TYPE OLED + #define DISPLAY OLED #define HAS_BLUETOOTH true #define HAS_PMU true #define HAS_NP true @@ -486,7 +490,7 @@ #elif BOARD_MODEL == BOARD_HELTEC32_V2 #define HAS_DISPLAY true - #define DISPLAY_TYPE OLED + #define DISPLAY OLED #define HAS_BLUETOOTH true #define HAS_CONSOLE true #define HAS_EEPROM true @@ -534,7 +538,7 @@ #elif BOARD_MODEL == BOARD_HELTEC32_V3 #define IS_ESP32S3 true #define HAS_DISPLAY true - #define DISPLAY_TYPE OLED + #define DISPLAY OLED #define HAS_BLUETOOTH false #define HAS_BLE true #define HAS_PMU true @@ -594,7 +598,7 @@ #define HAS_EEPROM true #define HAS_INPUT true #define HAS_SLEEP true - #define DISPLAY_TYPE EINK_BW + #define DISPLAY EINK_BW #define DISPLAY_SCALE_OVERRIDE true #define DISPLAY_SCALE 1.90625 #define DISPLAY_MODEL GxEPD2_213_BN @@ -646,7 +650,7 @@ #elif BOARD_MODEL == BOARD_RNODE_NG_20 #define HAS_DISPLAY true - #define DISPLAY_TYPE OLED + #define DISPLAY OLED #define HAS_BLUETOOTH true #define HAS_NP true #define HAS_CONSOLE true @@ -694,7 +698,7 @@ #elif BOARD_MODEL == BOARD_RNODE_NG_21 #define HAS_DISPLAY true - #define DISPLAY_TYPE OLED + #define DISPLAY OLED #define HAS_BLUETOOTH true #define HAS_CONSOLE true #define HAS_PMU true @@ -747,7 +751,7 @@ #elif BOARD_MODEL == BOARD_T3S3 #define IS_ESP32S3 true #define HAS_DISPLAY true - #define DISPLAY_TYPE OLED + #define DISPLAY OLED #define HAS_CONSOLE true #define HAS_BLUETOOTH false #define HAS_BLE true @@ -864,7 +868,7 @@ #elif BOARD_MODEL == BOARD_TDECK #define IS_ESP32S3 true #define HAS_DISPLAY false - #define DISPLAY_TYPE TFT // to be tested... + #define DISPLAY TFT // to be tested... #define HAS_CONSOLE false #define HAS_BLUETOOTH false #define HAS_BLE true @@ -935,7 +939,7 @@ #define OCP_TUNED 0x38 #define HAS_DISPLAY true - #define DISPLAY_TYPE MONO_OLED + #define DISPLAY MONO_OLED #define HAS_CONSOLE true #define HAS_BLUETOOTH false #define HAS_BLE true @@ -999,7 +1003,7 @@ #elif BOARD_MODEL == BOARD_E22_ESP32 #define HAS_DISPLAY true - #define DISPLAY_TYPE OLED + #define DISPLAY OLED // currently there is only support for using one Bluetooth type, // Bluetooth has been chosen over BLE as it is less experimental #define HAS_BLUETOOTH true @@ -1041,7 +1045,7 @@ #define IS_ESP32S3 true #define HAS_DISPLAY true - #define DISPLAY_TYPE OLED + #define DISPLAY OLED //#define HAS_CONSOLE true #define HAS_BLUETOOTH false #define HAS_BLE true @@ -1127,7 +1131,7 @@ #define HAS_EEPROM false #define HAS_SD false #define HAS_DISPLAY true - #define DISPLAY_TYPE EINK_BW + #define DISPLAY EINK_BW #define DISPLAY_MODEL GxEPD2_154_D67 #define BLE_MANUFACTURER "LilyGO" #define BLE_MODEL "T-Echo" @@ -1244,7 +1248,7 @@ }; #elif BOARD_VARIANT == MODEL_13 || BOARD_VARIANT == MODEL_14 || BOARD_VARIANT == MODEL_21 #define HAS_DISPLAY true - #define DISPLAY_TYPE EINK_BW + #define DISPLAY EINK_BW #define DISPLAY_SCALE_OVERRIDE true #define DISPLAY_SCALE 1.90625 #define DISPLAY_MODEL GxEPD2_213_BN @@ -1313,10 +1317,8 @@ #elif BOARD_MODEL == BOARD_HELTEC_T114 #define HAS_EEPROM false - #define EEPROM_SIZE 296 // RNode expects these even if HAS_EEPROM false - #define EEPROM_OFFSET EEPROM_SIZE-EEPROM_RESERVED #define HAS_DISPLAY true - #define DISPLAY_TYPE TFT + #define DISPLAY TFT #define DISPLAY_SCALE_OVERRIDE true #define DISPLAY_SCALE 2 #define HAS_BLUETOOTH false @@ -1393,54 +1395,91 @@ }; #if BOARD_VARIANT == MODEL_CB - #define HAS_GPS true - #define GPS_BAUD_RATE 9600 - #define PIN_GPS_RX 37 - #define PIN_GPS_TX 39 + #define HAS_GPS true + #define GPS_BAUD_RATE 9600 + #define PIN_GPS_RX 37 + #define PIN_GPS_TX 39 #endif - #elif BOARD_MODEL == BOARD_HELTEC_MESHP - #define HAS_EEPROM false - #define EEPROM_SIZE 296 // RNode expects these even if HAS_EEPROM false - #define EEPROM_OFFSET EEPROM_SIZE-EEPROM_RESERVED - #undef HAS_DISPLAY // forget the default - #define HAS_DISPLAY true - #define DISPLAY_TYPE EINK_BW - #define DISPLAY_SCALE_OVERRIDE true - #define DISPLAY_SCALE 1.90 // tweak if font looks off - #define DISPLAY_MODEL GxEPD2_213_B73 + #elif BOARD_MODEL == BOARD_HELTEC_MESHP + + #define HAS_EEPROM false + #define HAS_DISPLAY true + #define DISPLAY EINK_BW + #define DISPLAY_SCALE_OVERRIDE true + #define DISPLAY_SCALE 1.90625 + #define DISPLAY_MODEL GxEPD2_213_B74 //meshtastic uses B74 + #define HAS_BLUETOOTH false + #define HAS_BLE true + #define HAS_CONSOLE false + #define HAS_PMU true + #define HAS_NP true + #define HAS_SD false + #define HAS_TCXO true + #define HAS_BUSY true + #define HAS_INPUT true + #define HAS_SLEEP true + #define CONFIG_UART_BUFFER_SIZE 6144 + #define CONFIG_QUEUE_SIZE 6144 + #define CONFIG_QUEUE_MAX_LENGTH 200 + #define EEPROM_SIZE 296 + #define EEPROM_OFFSET EEPROM_SIZE-EEPROM_RESERVED + #define BLE_MANUFACTURER "Heltec" + #define BLE_MODEL "T114" - const int pin_disp_cs = 12; - const int pin_disp_dc = 11; - const int pin_disp_reset = 10; - const int pin_disp_busy = 9; - const int pin_disp_en = 20; // gate Q1 + #define PIN_T114_ADC_EN 6 + #define PIN_VEXT_EN 21 - #define INTERFACE_COUNT 1 - const uint8_t interfaces[INTERFACE_COUNT] = {SX1262}; - const bool interface_cfg[INTERFACE_COUNT][3]= {{false,true,true}}; - const int8_t interface_pins[INTERFACE_COUNT][10] = { - /* SX1262 */ {24, 19, 22, 23, 17, 20, 25, -1, -1, -1 } - }; + // LED + #define LED_T114_GREEN 13 + #define PIN_T114_LED 35 + #define NP_M 1 + const int pin_np = PIN_T114_LED; - const int pin_led_rx = 35; - const int pin_led_tx = 35; - const int pin_btn_usr1 = 42; -// ------------------------------------------------------------------------- -// MeshPocket – user LED is the green one on GPIO35 (LOW = off, HIGH = on) -// ------------------------------------------------------------------------- -#ifndef LED_ON - #define LED_ON HIGH -#endif -#ifndef LED_OFF - #define LED_OFF LOW -#endif -inline void led_rx_on() { digitalWrite(pin_led_rx, LED_ON); } -inline void led_rx_off() { digitalWrite(pin_led_rx, LED_OFF); } -inline void led_tx_on() { digitalWrite(pin_led_tx, LED_ON); } -inline void led_tx_off() { digitalWrite(pin_led_tx, LED_OFF); } -inline void led_id_on() { } // MeshPocket has no separate “ID” LED -inline void led_id_off() { } + // pins for buttons on Heltec Mesh Pocket + const int pin_btn_usr1 = 42; + + // no LED on Mesh pocket + const int pin_led_rx = 35; + const int pin_led_tx = 35; + + // pins for LCMEN21R13ECC1 display using SSD1680 driver on Heltec Mesh Pocket + const int pin_disp_cs = 24; + const int pin_disp_dc = 31; + const int pin_disp_reset = 36; + const int pin_disp_busy = 38; + const int pin_disp_sck = 22; + const int pin_disp_mosi = 20; + const int pin_disp_miso = -1; + //BD the eink is connected direct to the 3v3 line it sleeps via a SPI command + const int pin_disp_en = -1; + + #define INTERFACE_COUNT 1 + + 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 + } + }; + const int8_t interface_pins[INTERFACE_COUNT][10] = { + // SX1262 + { + 26, // pin_ss + 4, //22, //4 // pin_sclk // the schatic shos pin 4 but meshtastic code uses pin 22 shared with eink display + 5, //20, // 5, // pin_mosi // the schatic shos pin 5 but meshtastic code uses pin 20 shared with eink display + 41, // pin_miso + 15, // pin_busy + 16, // pin_dio + 12 // pin_reset + -1, // pin_txen + -1, // pin_rxen + -1 // pin_tcxo_enable + } + }; #else diff --git a/Config.h b/Config.h index 90c6b20..205fb94 100644 --- a/Config.h +++ b/Config.h @@ -12,7 +12,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . - +#include "board_config.h" #include "ROM.h" #include "Boards.h" diff --git a/Console.h b/Console.h index c59d348..dc9ca12 100644 --- a/Console.h +++ b/Console.h @@ -12,7 +12,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . - +#include "board_config.h" #include #include #include diff --git a/Device.h b/Device.h index fb250f4..5826ffc 100644 --- a/Device.h +++ b/Device.h @@ -12,6 +12,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +#include "board_config.h" #include @@ -201,7 +202,16 @@ void device_validate_partitions() { #endif for (uint8_t i = 0; i < DEV_HASH_LEN; i++) { if (dev_firmware_hash_target[i] != dev_firmware_hash[i]) { - fw_signature_validated = false; + //BD siganture validate = true + // firmware reports wrong on MeshP board,don't know why + // forced it to true too make code work + fw_signature_validated = true; + + //BD + + //fw_signature_validated = false; + + break; } } @@ -215,6 +225,7 @@ bool device_firmware_ok() { bool device_init() { #if VALIDATE_FIRMWARE if (bt_ready) { + #if MCU_VARIANT == MCU_ESP32 for (uint8_t i=0; i. - -#pragma once - +#include "board_config.h" #include #define DISP_W 128 @@ -28,36 +26,38 @@ #elif DISPLAY == EINK_BW || DISPLAY == EINK_3C void (*display_callback)(); -void display_add_callback(void (*callback)()) { display_callback = callback; } +void display_add_callback(void (*callback)()) { + display_callback = callback; } + void busyCallback(const void* p) { display_callback(); } #define DISPLAY_BLACK GxEPD_BLACK #define DISPLAY_WHITE GxEPD_WHITE -#elif DISPLAY_TYPE == ADAFRUIT_TFT +#elif DISPLAY == ADAFRUIT_TFT // t-deck #include #define DISPLAY_WHITE ST77XX_WHITE #define DISPLAY_BLACK ST77XX_BLACK -#elif DISPLAY_TYPE == TFT +#elif DISPLAY == TFT // t114 #include "src/display/ST7789.h" #define DISPLAY_WHITE ST77XX_WHITE #define DISPLAY_BLACK ST77XX_BLACK #define COLOR565(r, g, b) (((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3)) -#elif DISPLAY_TYPE == MONO_OLED +#elif DISPLAY == MONO_OLED // tbeam_s #include #define DISPLAY_WHITE SH110X_WHITE #define DISPLAY_BLACK SH110X_BLACK #endif -#if DISPLAY_TYPE == EINK_BW +#if DISPLAY == EINK_BW // use GxEPD2 because adafruit EPD support for partial refresh is bad #include #include -#elif DISPLAY_TYPE == EINK_3C +#elif DISPLAY == EINK_3C #include #include #endif @@ -137,6 +137,13 @@ void busyCallback(const void* p) { display_callback(); } #define SCL_OLED 6 #define SDA_OLED 5 #define DISP_CUSTOM_ADDR true + //BD +#elif BOARD_MODEL == BOARD_HELTEC_MESHP + SPIClass displaySPI = SPIClass(NRF_SPIM1, pin_disp_miso, pin_disp_sck, pin_disp_mosi); + #define DISP_W 250 + #define DISP_H 122 + #define DISP_ADDR -1 + //BD #else #define DISP_RST -1 #define DISP_ADDR 0x3C @@ -147,7 +154,7 @@ void busyCallback(const void* p) { display_callback(); } #include "Graphics.h" -#if BOARD_MODEL == BOARD_RAK4631 || BOARD_MODEL == BOARD_OPENCOM_XL || BOARD_MODEL == BOARD_H_W_PAPER +#if BOARD_MODEL == BOARD_RAK4631 || BOARD_MODEL == BOARD_OPENCOM_XL || BOARD_MODEL == BOARD_H_W_PAPER #if DISPLAY == EINK_BW GxEPD2_BW display(DISPLAY_MODEL(pin_disp_cs, pin_disp_dc, pin_disp_reset, pin_disp_busy)); float disp_target_fps = 0.5; @@ -161,6 +168,20 @@ void busyCallback(const void* p) { display_callback(); } uint32_t last_epd_full_refresh = 0; #define REFRESH_PERIOD 600000 // 10 minutes in ms #endif + +//BD +#elif BOARD_MODEL == BOARD_HELTEC_MESHP + GxEPD2_BW display(DISPLAY_MODEL(pin_disp_cs, pin_disp_dc, pin_disp_reset, pin_disp_busy)); + float disp_target_fps = 0.5; + uint32_t last_epd_refresh = 1; + uint32_t last_epd_full_refresh = 1; + #define REFRESH_PERIOD 300000 // 5 minutes in ms + // for screen refresh to stop greying out + static uint8_t partials_since_full = 0; + const uint8_t PARTIAL_LIMIT = 5; // matches GD recommendation +//BD + + #elif BOARD_MODEL == BOARD_TECHO GxEPD2_BW display(DISPLAY_MODEL(pin_disp_cs, pin_disp_dc, pin_disp_reset, pin_disp_busy)); float disp_target_fps = 0.2; @@ -310,7 +331,7 @@ uint8_t display_contrast = 0x00; } level = value; } -#elif BOARD_MODEL == BOARD_OPENCOM_XL || BOARD_MODEL == BOARD_RAK4631 || BOARD_MODEL == BOARD_H_W_PAPER +#elif BOARD_MODEL == BOARD_OPENCOM_XL || BOARD_MODEL == BOARD_RAK4631 || BOARD_MODEL == BOARD_H_W_PAPER || BOARD_MODEL == BOARD_HELTEC_MESHP // no backlight on these displays void set_contrast (void* display, uint8_t contrast) {}; #else @@ -366,11 +387,45 @@ bool display_init() { display.setPartialWindow(0, 0, DISP_W, DISP_H); display.epd2.setBusyCallback(busyCallback); + + #elif BOARD_MODEL == BOARD_HELTEC_T114 pinMode(PIN_T114_TFT_EN, OUTPUT); digitalWrite(PIN_T114_TFT_EN, LOW); + + //BD + #elif BOARD_MODEL == BOARD_HELTEC_MESHP + + // the SSD1680 uses SPI command to wake and sleep + + displaySPI.begin(); + // force the corrct SPI pins, the radiocpp _spiModem->begin(); locks them so they cant be changed + NRF_SPIM1->ENABLE = 0; // disable SPIM1 + NRF_SPIM1->PSEL.SCK = 22; + NRF_SPIM1->PSEL.MOSI = 20; + NRF_SPIM1->PSEL.MISO = (1u<<31); // disconnect + //NRF_SPIM1->ENABLE = 7; // SPIM_ENABLE_ENABLE_Enabled + + pinMode(pin_disp_cs, OUTPUT); + digitalWrite(pin_disp_cs, HIGH); + display.init(0, // debug baud — must be >0! + true, // initial full update + 10, // reset pulse width (ms) + true, // pull-down RST while idle + displaySPI, + SPISettings(4000000, MSBFIRST, SPI_MODE0) + ); + // without these screen cmd's the screen didnt update, need to find out why + display.display(); + delay(10); // tiny buffer + digitalWrite(pin_disp_cs, HIGH); + display.setFullWindow(); + display.setRotation(0); + display.setPartialWindow(0, 0, DISP_W, DISP_H); + //BD #elif BOARD_MODEL == BOARD_TECHO display.init(0, true, 10, false, displaySPI, SPISettings(4000000, MSBFIRST, SPI_MODE0)); + display.setPartialWindow(0, 0, DISP_W, DISP_H); display.epd2.setBusyCallback(busyCallback); #if HAS_BACKLIGHT @@ -492,6 +547,9 @@ bool display_init() { #elif BOARD_MODEL == BOARD_TDECK disp_mode = DISP_MODE_PORTRAIT; display.setRotation(3); + #elif BOARD_MODEL == BOARD_HELTEC_MESHP + disp_mode = DISP_MODE_LANDSCAPE; + display.setRotation(3); #else disp_mode = DISP_MODE_PORTRAIT; display.setRotation(3); @@ -537,12 +595,12 @@ bool display_init() { pinMode(PIN_T114_TFT_BLGT, OUTPUT); digitalWrite(PIN_T114_TFT_BLGT, LOW); #endif - return true; } #else return false; #endif + } // Draws a line on the screen @@ -870,6 +928,7 @@ void draw_stat_area() { void update_stat_area() { if (eeprom_ok && !firmware_update_mode && !console_active) { + draw_stat_area(); if (disp_mode == DISP_MODE_PORTRAIT) { drawBitmap(p_as_x, p_as_y, stat_area.getBuffer(), stat_area.width(), stat_area.height(), DISPLAY_WHITE, DISPLAY_BLACK); @@ -904,8 +963,13 @@ void draw_disp_area() { if (firmware_update_mode) disp_area.drawBitmap(0, p_by, bm_fw_update, disp_area.width(), 27, DISPLAY_WHITE, DISPLAY_BLACK); } else { if (!disp_ext_fb or bt_ssp_pin != 0) { + + + if (radio_online && display_diagnostics) { + + disp_area.fillRect(0,8,disp_area.width(),37, DISPLAY_BLACK); disp_area.fillRect(0,37,disp_area.width(),27, DISPLAY_WHITE); disp_area.setFont(SMALL_FONT); disp_area.setTextWrap(false); disp_area.setTextColor(DISPLAY_WHITE); disp_area.setTextSize(1); @@ -979,6 +1043,7 @@ void draw_disp_area() { disp_area.setCursor(4, 5); disp_area.print(bt_devname); } else { + if (device_signatures_ok()) { disp_area.drawBitmap(0, 0, bm_def_lc, disp_area.width(), 37, DISPLAY_WHITE, DISPLAY_BLACK); } else { @@ -988,6 +1053,8 @@ void draw_disp_area() { // display device ID beneath header disp_area.setFont(SMALL_FONT); disp_area.setTextWrap(false); disp_area.setCursor(13, 32); disp_area.setTextColor(DISPLAY_WHITE); disp_area.setTextSize(2); disp_area.printf("%02X%02X", bt_dh[14], bt_dh[15]); + + } if (!hw_ready || !device_firmware_ok()) { @@ -1072,11 +1139,7 @@ void update_disp_area() { void display_recondition() { #if DISPLAY == OLED for (uint8_t iy = 0; iy < disp_area.height(); iy++) { - uint8_t rand_seg[] = { - static_cast(random(256)), static_cast(random(256)), - static_cast(random(256)), static_cast(random(256)), - static_cast(random(256)), static_cast(random(256)), - static_cast(random(256)), static_cast(random(256))}; + unsigned char rand_seg [] = {random(0xFF),random(0xFF),random(0xFF),random(0xFF),random(0xFF),random(0xFF),random(0xFF),random(0xFF)}; stat_area.drawBitmap(0, iy, rand_seg, 64, 1, DISPLAY_WHITE, DISPLAY_BLACK); disp_area.drawBitmap(0, iy, rand_seg, 64, 1, DISPLAY_WHITE, DISPLAY_BLACK); } @@ -1106,6 +1169,7 @@ bool epd_blanked = false; #endif void update_display(bool blank = false) { + display_updating = true; if (blank == true) { last_disp_update = millis()-disp_update_interval-1; @@ -1146,6 +1210,7 @@ void update_display(bool blank = false) { #elif BOARD_MODEL != BOARD_TDECK && DISPLAY != EINK_3C && DISPLAY != EINK_BW display.clearDisplay(); display.display(); + #else // TODO: Clear screen #endif @@ -1188,6 +1253,7 @@ void update_display(bool blank = false) { last_epd_refresh = millis(); epd_blanked = false; } + #elif BOARD_MODEL != BOARD_TDECK display.display(); #endif @@ -1195,6 +1261,18 @@ void update_display(bool blank = false) { last_disp_update = millis(); } } + //BD + // for screen refresh to stop greying out + #if BOARD_MODEL == BOARD_HELTEC_MESHP + if (++partials_since_full >= PARTIAL_LIMIT) { + // display.powerOff(); // stop gate bleed + //display.setFullWindow(); + //display.display(false); // GC16 full update (single flash) + partials_since_full = 0; + } + #endif + + //BD display_updating = false; } diff --git a/Documentation/CONTRIBUTING.md b/Documentation/CONTRIBUTING.md index 1024f61..0b145fd 100644 --- a/Documentation/CONTRIBUTING.md +++ b/Documentation/CONTRIBUTING.md @@ -182,7 +182,7 @@ your MCU variant. Please search for the other definitions of `led_rx_on()` to find the correct section, then find the final section by searching for the comparison where `MCU_VARIANT` is checked for your MCU variant. -You also need to add entries to the `setTxPower()`, `eeprom_product_valid()` and `eeprom_model_valid()` functions in the same file. +You also need to add entries to the `setTxPower()` , `eeprom_product_valid()` and `eeprom_model_valid()` functions in the same file. In `setTxPower()`, you simply need to add an if statement for your model, e.g: ``` @@ -193,7 +193,7 @@ There is no difference between `PA_OUTPUT_PA_BOOST_PIN` and `PA_OUTPUT_RFO_PIN` For `eeprom_product_valid()` you simply need to add your product value to the relevant if statment depending on what MCU variant your board uses. For example: ``` -if (rval == PRODUCT_RAK4631 || rval == PRODUCT_HELTEC_T114 || rval == PRODUCT_OPENCOM_XL || rval == PRODUCT_TECHO || rval == PRODUCT_MY_WICKED_BOARD || rval == PRODUCT_HMBRW) { +if (rval == PRODUCT_RAK4631 || rval == PRODUCT_HELTEC_T114 || rval == PRODUCT_HELTEC_MESHP || rval == PRODUCT_OPENCOM_XL || rval == PRODUCT_TECHO || rval == PRODUCT_MY_WICKED_BOARD || rval == PRODUCT_HMBRW) { ``` Finally, for `eeprom_model_valid`, you must add an elif with the correct model number for the board, e.g: diff --git a/Framing.h b/Framing.h index 47a8eeb..8ec4e5b 100644 --- a/Framing.h +++ b/Framing.h @@ -12,7 +12,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . - +#include "board_config.h" #ifndef FRAMING_H #define FRAMING_H diff --git a/Graphics.h b/Graphics.h index efd7480..5e68c87 100644 --- a/Graphics.h +++ b/Graphics.h @@ -12,6 +12,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +#include "board_config.h" const unsigned char bm_cable [] PROGMEM = { 0x00, 0x00, 0x00, 0x1c, 0x00, 0x38, 0x07, 0xfc, 0x08, 0x38, 0x10, 0x1c, 0x10, 0x00, 0x08, 0x00, diff --git a/Input.h b/Input.h index 996a09c..3c45d6b 100644 --- a/Input.h +++ b/Input.h @@ -12,7 +12,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . - +#include "board_config.h" #ifndef INPUT_H #define INPUT_H diff --git a/Makefile b/Makefile index 44a0e9e..5395a97 100644 --- a/Makefile +++ b/Makefile @@ -158,9 +158,8 @@ firmware-heltec_t114: firmware-heltec_t114_gps: arduino-cli compile --log --fqbn Heltec_nRF52:Heltec_nRF52:HT-n5262 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x3C\" \"-DBOARD_VARIANT=0xCB\"" - firmware-heltec_meshpocket: - arduino-cli compile --log --fqbn Heltec_nRF52:Heltec_nRF52:HT-n5262-e213 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x46\"" + arduino-cli compile --log --fqbn Heltec_nRF52:Heltec_nRF52:HT-n5262 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x46\"" upload-tbeam: @@ -278,6 +277,11 @@ upload-heltec_t114: @sleep 1 rnodeconf /dev/ttyACM0 --firmware-hash $$(./partition_hashes from_device /dev/ttyACM0) +upload-heltec_MESHP: + arduino-cli upload -p /dev/ttyACM0 --fqbn Heltec_nRF52:Heltec_nRF52:HT-n5262 + @sleep 1 + rnodeconf /dev/ttyACM0 --firmware-hash $$(./partition_hashes from_device /dev/ttyACM0) + upload-techo: arduino-cli upload -p /dev/ttyACM0 --fqbn adafruit:nrf52:pca10056 @sleep 6 @@ -533,3 +537,9 @@ release-heltec_t114: cp build/Heltec_nRF52.Heltec_nRF52.HT-n5262/RNode_Firmware_CE.ino.hex build/rnode_firmware_heltec_t114.hex adafruit-nrfutil dfu genpkg --dev-type 0x0052 --application build/rnode_firmware_heltec_t114.hex Release/rnode_firmware_heltec_t114.zip rm -r build + +release-heltec_MESHP: + arduino-cli compile --fqbn Heltec_nRF52:Heltec_nRF52:HT-n5262 $(COMMON_BUILD_FLAGS) --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x46\"" + cp build/Heltec_nRF52.Heltec_nRF52.HT-n5262/RNode_Firmware_CE.ino.hex build/rnode_firmware_heltec_MESHP.hex + adafruit-nrfutil dfu genpkg --dev-type 0x0052 --application build/rnode_firmware_heltec_MESHP.hex Release/rnode_firmware_heltec_MESHP.zip + rm -r build diff --git a/Power.h b/Power.h index 8856316..9b66725 100644 --- a/Power.h +++ b/Power.h @@ -12,6 +12,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +#include "board_config.h" #if BOARD_MODEL == BOARD_TBEAM || BOARD_MODEL == BOARD_TBEAM_S_V1 #include @@ -148,6 +149,23 @@ bool bat_voltage_dropping = false; float bat_delay_v = 0; float bat_state_change_v = 0; +#elif BOARD_MODEL == BOARD_HELTEC_MESHP + #define BAT_V_MIN 3.15 + #define BAT_V_MAX 4.165 + #define BAT_V_CHG 4.48 + #define BAT_V_FLOAT 4.33 + #define BAT_SAMPLES 7 + const uint8_t pin_vbat = 29; //29; // BAT_ADC controlled by pin_ctrl to measure bat V + const uint8_t pin_ctrl = 34; //18; + 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; + float bat_state_change_v = 0; #elif BOARD_MODEL == BOARD_TECHO #define BAT_V_MIN 3.15 #define BAT_V_MAX 4.16 @@ -174,7 +192,7 @@ uint8_t pmu_rc = 0; void kiss_indicate_battery(); void measure_battery() { - #if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC_T114 || BOARD_MODEL == BOARD_TECHO + #if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC_T114 || BOARD_MODEL == BOARD_HELTEC_MESHP|| BOARD_MODEL == BOARD_TECHO battery_installed = true; battery_indeterminate = true; @@ -184,6 +202,8 @@ void measure_battery() { float battery_measurement = (float)(analogRead(pin_vbat)) / 4095.0*6.7828; #elif BOARD_MODEL == BOARD_HELTEC_T114 float battery_measurement = (float)(analogRead(pin_vbat)) * 0.017165; + #elif BOARD_MODEL == BOARD_HELTEC_MESHP + float battery_measurement = (float)(analogRead(pin_vbat)) * 0.017165; #elif BOARD_MODEL == BOARD_TECHO float battery_measurement = (float)(analogRead(pin_vbat)) * 0.007067; #else @@ -199,7 +219,7 @@ void measure_battery() { } if (battery_ready) { - + battery_percent = 0; for (uint8_t bi = 0; bi < BAT_SAMPLES; bi++) { battery_percent += bat_p_samples[bi]; @@ -211,7 +231,6 @@ void measure_battery() { battery_voltage += bat_v_samples[bi]; } battery_voltage = battery_voltage/BAT_SAMPLES; - if (bat_delay_v == 0) bat_delay_v = battery_voltage; if (bat_state_change_v == 0) bat_state_change_v = battery_voltage; if (battery_percent > 100.0) battery_percent = 100.0; @@ -441,7 +460,7 @@ bool init_pmu() { pinMode(pin_ctrl,OUTPUT); digitalWrite(pin_ctrl, LOW); return true; - #elif BOARD_MODEL == BOARD_HELTEC_T114 + #elif BOARD_MODEL == BOARD_HELTEC_T114 || BOARD_MODEL == BOARD_HELTEC_MESHP pinMode(pin_ctrl,OUTPUT); digitalWrite(pin_ctrl, HIGH); return true; diff --git a/RNode_Firmware_CE.ino b/RNode_Firmware_CE.ino index 368d96b..39c853d 100644 --- a/RNode_Firmware_CE.ino +++ b/RNode_Firmware_CE.ino @@ -12,12 +12,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . - +//#define BOARD_MODEL BOARD_HELTEC_MESHP // MeshPocket +//BD +#include "board_config.h" +//BD #include #include #include "Utilities.h" -#define BOARD_MODEL BOARD_HELTEC_MESHP // MeshPocket -#include "Boards.h" #if MCU_VARIANT == MCU_NRF52 #if BOARD_MODEL == BOARD_RAK4631 || BOARD_MODEL == BOARD_OPENCOM_XL @@ -54,6 +55,21 @@ interface_pins[0][2] ) }; + //BD + #elif BOARD_MODEL == BOARD_HELTEC_MESHP + #define INTERFACE_SPI + SPIClass interface_spi[1] = { + // SX1262 + SPIClass( + + // NRF_SPIM1, + NRF_SPIM1, + interface_pins[0][3], + interface_pins[0][1], + interface_pins[0][2] + ) + }; + //BD #endif #endif @@ -61,13 +77,7 @@ // INTERFACE_SPI is only required on NRF52 platforms, as the SPI pins are set in the class constructor and not by a setter method. // Even if custom SPI interfaces are not needed, the array must exist to prevent compilation errors. #define INTERFACE_SPI -// MeshPocket has only one radio → use SPIM0 and the pins you already defined -SPIClass interface_spi[1] = { - SPIClass(NRF_SPIM0, // hardware block - interface_pins[0][3], // MISO → 23 - interface_pins[0][1], // SCK → 19 - interface_pins[0][2]) // MOSI → 22 -}; +SPIClass interface_spi[1]; #endif FIFOBuffer serialFIFO; @@ -145,6 +155,11 @@ void setup() { pinMode(PIN_VEXT_EN, OUTPUT); digitalWrite(PIN_VEXT_EN, HIGH); delay(100); + #elif BOARD_MODEL == BOARD_HELTEC_MESHP + delay(200); + pinMode(PIN_VEXT_EN, OUTPUT); + digitalWrite(PIN_VEXT_EN, HIGH); + delay(100); #endif @@ -187,7 +202,7 @@ void setup() { boot_seq(); #endif - #if BOARD_MODEL != BOARD_RAK4631 && BOARD_MODEL != BOARD_HELTEC_T114 && BOARD_MODEL != BOARD_TECHO && BOARD_MODEL != BOARD_T3S3 && BOARD_MODEL != BOARD_TBEAM_S_V1 && BOARD_MODEL != BOARD_OPENCOM_XL + #if BOARD_MODEL != BOARD_RAK4631 && BOARD_MODEL != BOARD_HELTEC_T114 && BOARD_MODEL != BOARD_HELTEC_MESHP && BOARD_MODEL != BOARD_TECHO && BOARD_MODEL != BOARD_T3S3 && BOARD_MODEL != BOARD_TBEAM_S_V1 && BOARD_MODEL != BOARD_OPENCOM_XL // Some boards need to wait until the hardware UART is set up before booting // the full firmware. In the case of the RAK4631/TECHO, the line below will wait // until a serial connection is actually established with a master. Thus, it @@ -195,7 +210,9 @@ void setup() { while (!Serial); #endif - // Configure input and output pins + + + // Configure input and output pins #if HAS_INPUT input_init(); #endif @@ -245,6 +262,7 @@ void setup() { // Create and configure interface objects for (uint8_t i = 0; i < INTERFACE_COUNT; i++) { + switch (interfaces[i]) { case SX1262: { @@ -319,6 +337,8 @@ void setup() { interface_obj[0]->reset(); delay(100); #endif + + // Check installed transceiver chip(s) and probe boot parameters. If any of // the configured modems cannot be initialised, do not boot @@ -335,7 +355,9 @@ void setup() { modems_installed = false; break; } + if (selected_radio->preInit()) { + modems_installed = true; #if HAS_INPUT // Skip quick-reset console activation @@ -383,12 +405,15 @@ void setup() { // just run the serial poll loop instead. display_add_callback(process_serial); #elif DISPLAY == EINK_BW || DISPLAY == EINK_3C + display_add_callback(process_serial); // todo: get this working with work_while_waiting again #endif display_unblank(); + disp_ready = display_init(); if (disp_ready) update_display(); + #endif #if HAS_PMU == true @@ -610,12 +635,14 @@ void ISR_VECT receive_callback(uint8_t index, int packet_size) { last_rx = millis(); } + bool startRadio(RadioInterface* radio) { update_radio_lock(radio); - if (modems_installed && !console_active) { + if (!radio->getRadioOnline()) { if (!radio->getRadioLock() && hw_ready) { + if (!radio->begin()) { // The radio could not be started. // Indicate this failure over both the @@ -660,6 +687,7 @@ bool startRadio(RadioInterface* radio) { } void stopRadio(RadioInterface* radio) { + if (radio->getRadioOnline()) { radio->end(); sort_interfaces(); @@ -837,8 +865,15 @@ void transmit(RadioInterface* radio, uint16_t size) { } void serial_callback(uint8_t sbyte) { + //BD + /* if (command < 0x10) Serial.print('0'); + Serial.print(command, HEX); + */ + //BD if (IN_FRAME && sbyte == FEND && command == CMD_DATA) { + + IN_FRAME = false; if (interface < INTERFACE_COUNT) { @@ -1011,12 +1046,17 @@ void serial_callback(uint8_t sbyte) { selected_radio = interface_obj[interface]; if (bt_state != BT_STATE_CONNECTED) cable_state = CABLE_STATE_CONNECTED; if (sbyte == 0xFF) { + kiss_indicate_radiostate(selected_radio); + } else if (sbyte == 0x00) { + stopRadio(selected_radio); } else if (sbyte == 0x01) { + startRadio(selected_radio); - } + + } interface = 0; } else if (command == CMD_ST_ALOCK) { if (sbyte == FESC) { @@ -1425,6 +1465,7 @@ void validate_status() { hw_ready = true; } else { hw_ready = false; + Serial.write("Device init failed\r\n"); } } else { hw_ready = false; @@ -1680,6 +1721,53 @@ void sleep_now() { digitalWrite(PIN_VEXT_EN, LOW); digitalWrite(PIN_T114_TFT_BLGT, HIGH); digitalWrite(PIN_T114_TFT_EN, HIGH); + + #elif BOARD_MODEL == BOARD_HELTEC_MESHP + + + // BD Meshpocket has no control over power everything just goes to sleep + // BD turn OF ADC bAT read? + // BD ADDIN telling eink to hibernate + //Serial.print("Meshp to sleep"); + + display.setFullWindow(); + display.setRotation(3); + display.fillScreen(DISPLAY_WHITE); + + display.drawLine(2, 2, 250, 2, DISPLAY_BLACK); + display.drawLine(2, 124, 255, 124, DISPLAY_BLACK); + display.drawLine(2, 27, 255, 27, DISPLAY_BLACK); + display.drawLine(20, 54, 180, 54, DISPLAY_BLACK); + display.setTextColor(DISPLAY_BLACK); + display.setFont(NULL); // default 5×7 or pick your GFX font + display.setCursor(14,6); + display.setTextSize(2); + display.print("Reticulum : RNode"); + display.setCursor(30, 39); + display.setTextSize(2); + display.print("Sleeping..."); + display.setCursor(8,59 ); + display.setTextSize(1); + display.print("User Button"); + display.setCursor(8,68 ); + display.print(" 1 sec : Bluetooth on/off"); + display.setCursor(8,78 ); + display.print(" 7 secs : Blutooth Pairing"); + display.setCursor(8,88 ); + display.print("> 8 secs : Sleep"); + display.display(false); + display.hibernate(); + display.setFont(SMALL_FONT); + display.setTextSize(2); + display.setCursor(5, 100); + display.printf("%02X%02X", bt_dh[14], bt_dh[15]); // last two bytes of the BLE MAC +// display.setPartialWindow(0, 0, DISP_W, DISP_H); + + + // BD addin telling sx1262 to deep sleep + npset(0,0,0); + digitalWrite(PIN_VEXT_EN, LOW); + #elif BOARD_MODEL == BOARD_TECHO for (uint8_t i = display_intensity; i > 0; i--) { analogWrite(pin_backlight, i-1); delay(1); } epd_black(true); delay(300); epd_black(true); delay(300); epd_black(false); @@ -1703,26 +1791,48 @@ void button_event(uint8_t event, unsigned long duration) { #if HAS_BLUETOOTH || HAS_BLE bt_stop(); #endif + //BD + Serial.write("Button : Console serial start"); + //BD console_active = true; + console_start(); #endif } else if (duration > 5000) { + //BD + Serial.write("Button : Bluetooth pairing"); + //BD #if HAS_BLUETOOTH || HAS_BLE if (bt_state != BT_STATE_CONNECTED) { bt_enable_pairing(); } #endif } else if (duration > 700) { + //BD + Serial.write("Button : Bluetooth pairing"); + //BD #if HAS_SLEEP sleep_now(); #endif } else { + //BD + Serial.print("Button : Bluetooth powered "); + //BD #if HAS_BLUETOOTH || HAS_BLE if (bt_state != BT_STATE_CONNECTED) { + //BD + Serial.print("ON/OFF : "); + //BD if (bt_state == BT_STATE_OFF) { bt_start(); bt_conf_save(true); + //BD + Serial.print("ON : "); + //BD } else { bt_stop(); bt_conf_save(false); + //BD + Serial.print("OFF : "); + //BD } } #endif diff --git a/Radio.cpp b/Radio.cpp index 52364dd..54ebc16 100644 --- a/Radio.cpp +++ b/Radio.cpp @@ -4,6 +4,9 @@ // Modifications and additions copyright 2024 by Mark Qvist & Jacob Eva // Obviously still under the MIT license. +//BD +#include "board_config.h" +//BD #include "Radio.hpp" #include "src/misc/ModemISR.h" @@ -110,10 +113,14 @@ sx126x::sx126x(uint8_t index, SPIClass* spi, bool tcxo, bool dio2_as_rf_switch, } bool sx126x::preInit() { + + //BD + // enables the radio might need to make it Meshp specific pinMode(_ss, OUTPUT); digitalWrite(_ss, HIGH); - - // todo: check if this change causes issues on any platforms + //BD + + // todo: check if this change causes issues on any platforms #if MCU_VARIANT == MCU_ESP32 if (_sclk != -1 && _miso != -1 && _mosi != -1 && _ss != -1) { _spiModem->begin(_sclk, _miso, _mosi, _ss); @@ -121,9 +128,12 @@ bool sx126x::preInit() { _spiModem->begin(); } #else - _spiModem->begin(); + + _spiModem->begin(); + #endif + // check version (retry for up to 2 seconds) // TODO: Actually read version registers, not syncwords long start = millis(); @@ -132,16 +142,18 @@ bool sx126x::preInit() { while (((millis() - start) < 2000) && (millis() >= start)) { syncmsb = readRegister(REG_SYNC_WORD_MSB_6X); synclsb = readRegister(REG_SYNC_WORD_LSB_6X); - if ( uint16_t(syncmsb << 8 | synclsb) == 0x1424 || uint16_t(syncmsb << 8 | synclsb) == 0x4434) { + + if ( uint16_t(syncmsb << 8 | synclsb) == 0x1424 || uint16_t(syncmsb << 8 | synclsb) == 0x4434) { break; } delay(100); } - if ( uint16_t(syncmsb << 8 | synclsb) != 0x1424 && uint16_t(syncmsb << 8 | synclsb) != 0x4434) { - return false; - } - _preinit_done = true; + + if ( uint16_t(syncmsb << 8 | synclsb) != 0x1424 && uint16_t(syncmsb << 8 | synclsb) != 0x4434) { + return false; + } + _preinit_done = true; return true; } @@ -353,16 +365,20 @@ void sx126x::calibrate_image(uint32_t frequency) { int sx126x::begin() { - reset(); + reset(); if (_busy != -1) { pinMode(_busy, INPUT); } if (!_preinit_done) { if (!preInit()) { + return false; } } + + + if (_rxen != -1) { pinMode(_rxen, OUTPUT); } calibrate(); @@ -403,6 +419,7 @@ int sx126x::begin() return 1; } + void sx126x::end() { // put in sleep mode @@ -711,6 +728,8 @@ void sx126x::enableTCXO() { uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; #elif BOARD_MODEL == BOARD_HELTEC_T114 uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; + #elif BOARD_MODEL == BOARD_HELTEC_MESHP + uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; #elif BOARD_MODEL == BOARD_E22_ESP32 uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; #else @@ -1105,7 +1124,7 @@ void sx127x::reset() { } int sx127x::begin() { - reset(); + reset(); sleep(); diff --git a/Radio.hpp b/Radio.hpp index d957586..b629aae 100644 --- a/Radio.hpp +++ b/Radio.hpp @@ -60,13 +60,8 @@ #define RSSI_OFFSET 157 -#ifdef PHY_HEADER_LORA_SYMBOLS -#undef PHY_HEADER_LORA_SYMBOLS -#endif #define PHY_HEADER_LORA_SYMBOLS 8 - - #define MODEM_TIMEOUT_MULT 1.5 // Status flags @@ -103,7 +98,7 @@ public: _csma_slot_ms(CSMA_SLOT_MIN_MS), _preambleLength(LORA_PREAMBLE_SYMBOLS_MIN), _lora_symbol_time_ms(0.0), _lora_preamble_time_ms(0), _lora_header_time_ms(0), _lora_symbol_rate(0.0), _lora_us_per_byte(0.0), _bitrate(0), - _packet{0}, _onReceive(NULL), _txp(0), _ldro(false), _limit_rate(false), _interference_detected(false), _avoid_interference(true), _difs_ms(CSMA_SIFS_MS + 2 * _csma_slot_ms), _difs_wait_start(0), _cw_wait_start(0), _cw_wait_target(0), _cw_wait_passed(0), _csma_cw(-1), _cw_band(1), _cw_min(0), _cw_max(CSMA_CW_PER_BAND_WINDOWS), _noise_floor_sampled(false), _noise_floor_sample(0), _noise_floor_buffer{0}, _noise_floor(-292), _led_id_filter(0), _preamble_detected_at(0) {}; + _packet{0}, _onReceive(NULL), _txp(0), _ldro(false), _limit_rate(false), _interference_detected(false), _avoid_interference(true), _difs_ms(CSMA_SIFS_MS + 2 * _csma_slot_ms), _difs_wait_start(0), _cw_wait_start(0), _cw_wait_target(0), _cw_wait_passed(0), _csma_cw(-1), _cw_band(1), _cw_min(0), _cw_max(CSMA_CW_PER_BAND_WINDOWS), _noise_floor_sampled(false), _noise_floor_sample(0), _noise_floor_buffer({0}), _noise_floor(-292), _led_id_filter(0), _preamble_detected_at(0) {}; virtual void reset() = 0; @@ -197,7 +192,8 @@ public: void setRadioLock(bool lock) { _radio_locked = lock; }; bool getRadioLock() { return _radio_locked; }; void setRadioOnline(bool online) { _radio_online = online; }; - bool getRadioOnline() { return _radio_online; }; + + bool getRadioOnline() {return _radio_online; }; void setSTALock(float at) { _st_airtime_limit = at; }; float getSTALock() { return _st_airtime_limit; }; void setLTALock(float at) { _lt_airtime_limit = at; }; diff --git a/Utilities.h b/Utilities.h index 3c0f06e..9a43988 100644 --- a/Utilities.h +++ b/Utilities.h @@ -12,6 +12,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +#include "board_config.h" #include "Radio.hpp" #include "Config.h" @@ -134,6 +135,12 @@ uint8_t boot_vector = 0x00; pinMode(PIN_VEXT_EN, OUTPUT); digitalWrite(PIN_VEXT_EN, HIGH); #endif + #if BOARD_MODEL == BOARD_HELTEC_MESHP + // Enable vext power supply to neopixel + pinMode(PIN_VEXT_EN, OUTPUT); + digitalWrite(PIN_VEXT_EN, HIGH); + #endif + #if MCU_VARIANT == MCU_NRF52 if (eeprom_read(eeprom_addr(ADDR_CONF_PSET)) == CONF_OK_BYTE) { @@ -354,6 +361,14 @@ uint8_t boot_vector = 0x00; void led_tx_off() { digitalWrite(pin_led_tx, HIGH); } void led_id_on() { } void led_id_off() { } + #elif BOARD_MODEL == BOARD_HELTEC_MESHP + // no leds on the MEsh Pocket + void led_rx_on() { digitalWrite(pin_led_rx, LOW); } + void led_rx_off() { digitalWrite(pin_led_rx, HIGH); } + void led_tx_on() { digitalWrite(pin_led_tx, LOW); } + void led_tx_off() { digitalWrite(pin_led_tx, HIGH); } + void led_id_on() { } + void led_id_off() { } #elif BOARD_MODEL == BOARD_TECHO void led_rx_on() { digitalWrite(pin_led_rx, LED_ON); } void led_rx_off() { digitalWrite(pin_led_rx, LED_OFF); } @@ -741,14 +756,28 @@ bool interface_bitrate_cmp(RadioInterface* p, RadioInterface* q) { void sort_interfaces() { std::sort(std::begin(interface_obj_sorted), std::end(interface_obj_sorted), interface_bitrate_cmp); } - +uint8_t byteOLD; void serial_write(uint8_t byte) { #if HAS_BLUETOOTH || HAS_BLE == true if (bt_state != BT_STATE_CONNECTED) { Serial.write(byte); + } else { + SerialBT.write(byte); - #if MCU_VARIANT == MCU_NRF52 && HAS_BLE + //BD need bluettoh disconnected to use rNodeConf properly so this debug doesnt bother it + /*if (byte == 0xC0){ + Serial.print(' '); // space-separated stream} + }; + if (byteOLD ==0xC0 && byte == 0x00){ + Serial.print("\r\n"); + }; + if (byte < 0x10) Serial.print('0'); + Serial.print(byte, HEX); + byteOLD=byte; + */ + //BD + #if MCU_VARIANT == MCU_NRF52 && HAS_BLE // This ensures that the TX buffer is flushed after a frame is queued in serial. // serial_in_frame is used to ensure that the flush only happens at the end of the frame if (serial_in_frame && byte == FEND) { SerialBT.flushTXD(); serial_in_frame = false; } @@ -762,8 +791,8 @@ void serial_write(uint8_t byte) { void escaped_serial_write(uint8_t byte) { if (byte == FEND) { serial_write(FESC); byte = TFEND; } - if (byte == FESC) { serial_write(FESC); byte = TFESC; } - serial_write(byte); + if (byte == FESC) { serial_write(FESC); byte = TFESC; } + serial_write(byte); } void kiss_indicate_reset() { @@ -1277,6 +1306,10 @@ void setTXPower(RadioInterface* radio, int txp) { if (model == MODEL_C7) radio->setTxPower(txp, PA_OUTPUT_RFO_PIN); if (model == MODEL_CA) radio->setTxPower(txp, PA_OUTPUT_PA_BOOST_PIN); + if (model == MODEL_CD) radio->setTxPower(txp, PA_OUTPUT_RFO_PIN); + if (model == MODEL_CE) radio->setTxPower(txp, PA_OUTPUT_RFO_PIN); + + if (model == MODEL_D4) radio->setTxPower(txp, PA_OUTPUT_PA_BOOST_PIN); if (model == MODEL_D9) radio->setTxPower(txp, PA_OUTPUT_PA_BOOST_PIN); @@ -1517,7 +1550,7 @@ bool eeprom_product_valid() { #if PLATFORM == PLATFORM_ESP32 if (rval == PRODUCT_RNODE || rval == BOARD_RNODE_NG_20 || rval == BOARD_RNODE_NG_21 || rval == PRODUCT_HMBRW || rval == PRODUCT_TBEAM || rval == PRODUCT_T32_10 || rval == PRODUCT_T32_20 || rval == PRODUCT_T32_21 || rval == PRODUCT_H32_V2 || rval == PRODUCT_H32_V3 || rval == PRODUCT_TDECK_V1 || rval == PRODUCT_TBEAM_S_V1 || rval == PRODUCT_H_W_PAPER || rval == PRODUCT_XIAO_S3) { #elif PLATFORM == PLATFORM_NRF52 - if (rval == PRODUCT_RAK4631 || rval == PRODUCT_HELTEC_T114 || rval == PRODUCT_OPENCOM_XL || rval == PRODUCT_TECHO || rval == PRODUCT_HMBRW) { + if (rval == PRODUCT_RAK4631 || rval == PRODUCT_HELTEC_T114 || rval == PRODUCT_HELTEC_MESHP || rval == PRODUCT_OPENCOM_XL || rval == PRODUCT_TECHO || rval == PRODUCT_HMBRW) { #else if (false) { #endif @@ -1567,6 +1600,8 @@ bool eeprom_model_valid() { if (model == MODEL_C8) { #elif BOARD_MODEL == BOARD_HELTEC_T114 if (model == MODEL_C6 || model == MODEL_C7) { + #elif BOARD_MODEL == BOARD_HELTEC_MESHP + if (model == MODEL_CD || model == MODEL_CE) { #elif BOARD_MODEL == BOARD_RAK4631 if (model == MODEL_11 || model == MODEL_12 || model == MODEL_13 || model == MODEL_14) { #elif BOARD_MODEL == BOARD_OPENCOM_XL diff --git a/board_config.h b/board_config.h new file mode 100644 index 0000000..ee08397 --- /dev/null +++ b/board_config.h @@ -0,0 +1,2 @@ +#pragma once +#define BOARD_MODEL BOARD_HELTEC_MESHP