diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index d474966..c74ae29 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -68,7 +68,7 @@ ___________________________________________________________________*/ String versionDate = "2025-12-22"; -String versionNumber = "3.1.6.1"; +String versionNumber = "3.1.6.2"; Configuration Config; WiFiClient aprsIsClient; WiFiClient mqttClient; diff --git a/src/configuration.cpp b/src/configuration.cpp index c6c08e6..adbcc3b 100644 --- a/src/configuration.cpp +++ b/src/configuration.cpp @@ -290,7 +290,11 @@ bool Configuration::readFile() { if (!data["display"].containsKey("alwaysOn") || !data["display"].containsKey("timeout") || !data["display"].containsKey("turn180")) needsRewrite = true; - display.alwaysOn = data["display"]["alwaysOn"] | true; + #ifdef HAS_EPAPER + display.alwaysOn = true; + #else + display.alwaysOn = data["display"]["alwaysOn"] | true; + #endif display.timeout = data["display"]["timeout"] | 4; display.turn180 = data["display"]["turn180"] | false; diff --git a/src/display.cpp b/src/display.cpp index 2378bb5..0b07125 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -47,9 +47,13 @@ #ifdef HELTEC_WP_V1 EInkDisplay_WirelessPaperV1_1 display; #endif - /*#ifdef HELTEC_WP_V1_2 // SOON! + /*#ifdef HELTEC_WP_V1_2 EInkDisplay_WirelessPaperV1_2 display; #endif*/ + #ifdef HELTEC_VM_E290 + EInkDisplay_VisionMasterE290 display; + #endif + String lastEpaperText; #else #include @@ -88,15 +92,25 @@ void displaySetup() { tft.setTextFont(0); tft.fillScreen(TFT_BLACK); #if defined(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS) - sprite.createSprite(320,240); + sprite.createSprite(320, 240); #else - sprite.createSprite(160,80); + sprite.createSprite(160, 80); #endif #else #ifdef HAS_EPAPER display.landscape(); display.printCenter("LoRa APRS iGate Initialising..."); - if (Config.display.turn180) display.setRotation(2); + if (Config.display.turn180) + #ifdef HELTEC_VM_E290 + display.setRotation(3); + #else + #ifdef HELTEC_WP_V1_2 + display.setRotation(1); + #else + display.setRotation(3) + #endif + #endif + display.update(); #else #ifdef OLED_DISPLAY_HAS_RST_PIN @@ -158,7 +172,6 @@ void displayToggle(bool toggle) { digitalWrite(TFT_BL, LOW); #else #ifdef HAS_EPAPER - display.printCenter("Enabled EPAPER Display..."); display.update(); #else #if defined(TTGO_T_Beam_S3_SUPREME_V3) @@ -196,7 +209,7 @@ void displayShow(const String& header, const String& line1, const String& line2, sprite.drawString(*lines[i], 3, (lineSpacing * (2 + i)) - 2); } - sprite.pushSprite(0,0); + sprite.pushSprite(0, 0); #else #ifdef HAS_EPAPER display.clearMemory(); @@ -261,7 +274,7 @@ void displayShow(const String& header, const String& line1, const String& line2, sprite.drawString(*lines[i], 3, (lineSpacing * (2 + i)) - 2); } - sprite.pushSprite(0,0); + sprite.pushSprite(0, 0); #else #ifdef HAS_EPAPER lastEpaperText = header + line1 + line2 + line3 + line4 + line5 + line6; diff --git a/src/power_utils.cpp b/src/power_utils.cpp index 28eaabf..f408134 100644 --- a/src/power_utils.cpp +++ b/src/power_utils.cpp @@ -49,7 +49,7 @@ namespace POWER_Utils { #ifdef VEXT_CTRL void vext_ctrl_ON() { - #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3) + #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3) || defined(HELTEC_VM_E290) digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? LOW : HIGH); #endif #if defined(HELTEC_WP_V1) || defined(HELTEC_WS) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3) @@ -58,7 +58,7 @@ namespace POWER_Utils { } void vext_ctrl_OFF() { - #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3) + #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3) || defined(HELTEC_VM_E290) digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? HIGH : LOW); #endif #if defined(HELTEC_WP_V1) || defined(HELTEC_WS) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3) @@ -70,7 +70,7 @@ namespace POWER_Utils { #ifdef ADC_CTRL void adc_ctrl_ON() { - #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2) + #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2) || defined(HELTEC_VM_E290) digitalWrite(ADC_CTRL, HIGH); #endif #if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP_V1) @@ -79,7 +79,7 @@ namespace POWER_Utils { } void adc_ctrl_OFF() { - #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2) + #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2) || defined(HELTEC_VM_E290) digitalWrite(ADC_CTRL, LOW); #endif #if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP_V1) diff --git a/variants/heltec_vision_master_e290/board_pinout.h b/variants/heltec_vision_master_e290/board_pinout.h new file mode 100644 index 0000000..50d5d82 --- /dev/null +++ b/variants/heltec_vision_master_e290/board_pinout.h @@ -0,0 +1,56 @@ +/* Copyright (C) 2025 Ricardo Guzman - CA2RXU + * + * This file is part of LoRa APRS iGate. + * + * LoRa APRS iGate is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * LoRa APRS iGate is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LoRa APRS iGate. If not, see . + */ + +#ifndef BOARD_PINOUT_H_ +#define BOARD_PINOUT_H_ + + // LoRa Radio + #define HAS_SX1262 + #define HAS_TCXO + #define RADIO_SCLK_PIN 9 + #define RADIO_MISO_PIN 11 + #define RADIO_MOSI_PIN 10 + #define RADIO_CS_PIN 8 + #define RADIO_RST_PIN 12 + #define RADIO_DIO1_PIN 14 + #define RADIO_BUSY_PIN 13 + #define RADIO_WAKEUP_PIN RADIO_DIO1_PIN + #define GPIO_WAKEUP_PIN GPIO_SEL_14 + + // I2C + #define USE_WIRE1_WITH_BOARD_I2C_PINS + #define BOARD_I2C_SDA 39 + #define BOARD_I2C_SCL 38 + + // Display + #define HAS_DISPLAY + #define HAS_EPAPER + #define EPAPER_BUSY 6 + #define EPAPER_RST 5 + #define EPAPER_DC 4 + #define EPAPER_CS 3 + #define EPAPER_SCL 2 + #define EPAPER_SDA 1 + + // Aditional Config + #define INTERNAL_LED_PIN 45 + #define BATTERY_PIN 7 + #define ADC_CTRL 46 + #define VEXT_CTRL 18 + +#endif \ No newline at end of file diff --git a/variants/heltec_vision_master_e290/platformio.ini b/variants/heltec_vision_master_e290/platformio.ini new file mode 100644 index 0000000..653b147 --- /dev/null +++ b/variants/heltec_vision_master_e290/platformio.ini @@ -0,0 +1,16 @@ +[env:heltec_vision_master_e290] +board = esp32-s3-devkitc-1 +board_build.mcu = esp32s3 +build_flags = + ${common.build_flags} + -D RADIOLIB_EXCLUDE_LR11X0=1 + -D RADIOLIB_EXCLUDE_SX127X=1 + -D RADIOLIB_EXCLUDE_SX128X=1 + -D HELTEC_VM_E290 + -D Vision_Master_E290 ; Todd Herbert eink display driver constructor + -D USE_EINK_DYNAMICDISPLAY ; Enable Dynamic EInk + -D EINK_LIMIT_FASTREFRESH=10 ; How many consecutive fast-refreshes are permitted + -D EINK_HASQUIRK_GHOSTING ; Display model is identified as "prone to ghosting" +lib_deps = + ${common.lib_deps} + https://github.com/todd-herbert/heltec-eink-modules.git \ No newline at end of file