Przeglądaj źródła

Merge branch 'dev' into dev-meshpocket

Quency-D 11 miesięcy temu
rodzic
commit
13d046892a

+ 0 - 0
boards/heltec_vision_master_e213.json → boards/heltec_e213.json


+ 0 - 0
boards/heltec_vision_master_e290.json → boards/heltec_e290.json


+ 0 - 0
boards/heltec_vision_master_t190.json → boards/heltec_t190.json


+ 81 - 29
examples/companion_radio/ui-new/UITask.cpp

@@ -3,7 +3,9 @@
 #include "../MyMesh.h"
 #include "target.h"
 
-#define AUTO_OFF_MILLIS     15000   // 15 seconds
+#ifndef AUTO_OFF_MILLIS
+  #define AUTO_OFF_MILLIS     15000   // 15 seconds
+#endif
 #define BOOT_SCREEN_MILLIS   3000   // 3 seconds
 
 #ifdef PIN_STATUS_LED
@@ -223,11 +225,11 @@ public:
   }
 
   bool handleInput(char c) override {
-    if (c == KEY_LEFT) {
+    if (c == KEY_LEFT || c == KEY_PREV) {
       _page = (_page + HomePage::Count - 1) % HomePage::Count;
       return true;
     }
-    if (c == KEY_RIGHT || c == KEY_SELECT) {
+    if (c == KEY_NEXT || c == KEY_RIGHT) {
       _page = (_page + 1) % HomePage::Count;
       if (_page == HomePage::RECENT) {
         _task->showAlert("Recent adverts", 800);
@@ -321,11 +323,15 @@ public:
     display.setColor(DisplayDriver::LIGHT);
     display.printWordWrap(p->msg, display.width());
 
+#if AUTO_OFF_MILLIS==0 // probably e-ink
+    return 10000; // 10 s
+#else
     return 1000;  // next render after 1000 ms
+#endif
   }
 
   bool handleInput(char c) override {
-    if (c == KEY_SELECT || c == KEY_RIGHT) {
+    if (c == KEY_NEXT || c == KEY_RIGHT) {
       num_unread--;
       if (num_unread == 0) {
         _task->gotoHomeScreen();
@@ -419,38 +425,34 @@ void UITask::newMsg(uint8_t path_len, const char* from_name, const char* text, i
   if (_display != NULL) {
     if (!_display->isOn()) _display->turnOn();
     _auto_off = millis() + AUTO_OFF_MILLIS;  // extend the auto-off timer
-    _next_refresh = 0;  // trigger refresh
+    _next_refresh = 100;  // trigger refresh
   }
 }
 
 void UITask::userLedHandler() {
 #ifdef PIN_STATUS_LED
-  static int state = 0;
-  static int next_change = 0;
-  static int last_increment = 0;
-
   int cur_time = millis();
-  if (cur_time > next_change) {
-    if (state == 0) {
-      state = 1;
+  if (cur_time > next_led_change) {
+    if (led_state == 0) {
+      led_state = 1;
       if (_msgcount > 0) {
-        last_increment = LED_ON_MSG_MILLIS;
+        last_led_increment = LED_ON_MSG_MILLIS;
       } else {
-        last_increment = LED_ON_MILLIS;
+        last_led_increment = LED_ON_MILLIS;
       }
-      next_change = cur_time + last_increment;
+      next_led_change = cur_time + last_led_increment;
     } else {
-      state = 0;
-      next_change = cur_time + LED_CYCLE_MILLIS - last_increment;
+      led_state = 0;
+      next_led_change = cur_time + LED_CYCLE_MILLIS - last_led_increment;
     }
-    digitalWrite(PIN_STATUS_LED, state);
+    digitalWrite(PIN_STATUS_LED, led_state);
   }
 #endif
 }
 
 void UITask::setCurrScreen(UIScreen* c) {
   curr = c;
-  _next_refresh = 0;
+  _next_refresh = 100;
 }
 
 /* 
@@ -492,9 +494,13 @@ void UITask::loop() {
 #if defined(PIN_USER_BTN)
   int ev = user_btn.check();
   if (ev == BUTTON_EVENT_CLICK) {
-    c = checkDisplayOn(KEY_SELECT);
+    c = checkDisplayOn(KEY_NEXT);
   } else if (ev == BUTTON_EVENT_LONG_PRESS) {
     c = handleLongPress(KEY_ENTER);
+  } else if (ev == BUTTON_EVENT_DOUBLE_CLICK) {
+    c = handleDoubleClick(KEY_PREV);
+  } else if (ev == BUTTON_EVENT_TRIPLE_CLICK) {
+    c = handleTripleClick(KEY_SELECT);
   }
 #endif
 #if defined(WIO_TRACKER_L1)
@@ -514,16 +520,27 @@ void UITask::loop() {
 #if defined(PIN_USER_BTN_ANA)
   ev = analog_btn.check();
   if (ev == BUTTON_EVENT_CLICK) {
-    c = checkDisplayOn(KEY_SELECT);
+    c = checkDisplayOn(KEY_NEXT);
   } else if (ev == BUTTON_EVENT_LONG_PRESS) {
     c = handleLongPress(KEY_ENTER);
+  } else if (ev == BUTTON_EVENT_DOUBLE_CLICK) {
+    c = handleDoubleClick(KEY_PREV);
+  } else if (ev == BUTTON_EVENT_TRIPLE_CLICK) {
+    c = handleTripleClick(KEY_SELECT);
+  }
+#endif
+#if defined(DISP_BACKLIGHT) && defined(BACKLIGHT_BTN)
+  if (millis() > next_backlight_btn_check) {
+    bool touch_state = digitalRead(PIN_BUTTON2);
+    digitalWrite(DISP_BACKLIGHT, !touch_state);
+    next_backlight_btn_check = millis() + 300;
   }
 #endif
 
   if (c != 0 && curr) {
     curr->handleInput(c);
     _auto_off = millis() + AUTO_OFF_MILLIS;   // extend auto-off timer
-    _next_refresh = 0;  // trigger refresh
+    _next_refresh = 100;  // trigger refresh
   }
 
   userLedHandler();
@@ -553,9 +570,11 @@ void UITask::loop() {
       }
       _display->endFrame();
     }
+#if AUTO_OFF_MILLIS > 0
     if (millis() > _auto_off) {
       _display->turnOff();
     }
+#endif
   }
 
 #ifdef AUTO_SHUTDOWN_MILLIVOLTS
@@ -604,20 +623,53 @@ char UITask::handleLongPress(char c) {
   return c;
 }
 
-/*
-void UITask::handleButtonTriplePress() {
-  MESH_DEBUG_PRINTLN("UITask: triple press triggered");
-  // Toggle buzzer quiet mode
+char UITask::handleDoubleClick(char c) {
+  MESH_DEBUG_PRINTLN("UITask: double click triggered");
+  checkDisplayOn(c);
+  return c;
+}
+
+char UITask::handleTripleClick(char c) {
+  MESH_DEBUG_PRINTLN("UITask: triple click triggered");
+  checkDisplayOn(c);
+  toggleBuzzer();
+  c = 0;
+  return c;
+}
+
+void UITask::toggleGPS() {
+    if (_sensors != NULL) {
+    // toggle GPS on/off
+    int num = _sensors->getNumSettings();
+    for (int i = 0; i < num; i++) {
+      if (strcmp(_sensors->getSettingName(i), "gps") == 0) {
+        if (strcmp(_sensors->getSettingValue(i), "1") == 0) {
+          _sensors->setSettingValue("gps", "0");
+          soundBuzzer(UIEventType::ack);
+          showAlert("GPS: Disabled", 800);
+        } else {
+          _sensors->setSettingValue("gps", "1");
+          soundBuzzer(UIEventType::ack);
+          showAlert("GPS: Enabled", 800);
+        }
+        _next_refresh = 0;
+        break;
+      }
+    }
+  }
+}
+
+void UITask::toggleBuzzer() {
+    // Toggle buzzer quiet mode
   #ifdef PIN_BUZZER
     if (buzzer.isQuiet()) {
       buzzer.quiet(false);
       soundBuzzer(UIEventType::ack);
-      showAlert("Buzzer: ON", 600);
+      showAlert("Buzzer: ON", 800);
     } else {
       buzzer.quiet(true);
-      showAlert("Buzzer: OFF", 600);
+      showAlert("Buzzer: OFF", 800);
     }
     _next_refresh = 0;  // trigger refresh
   #endif
 }
-*/

+ 12 - 0
examples/companion_radio/ui-new/UITask.h

@@ -26,6 +26,12 @@ class UITask : public AbstractUITask {
   unsigned long _alert_expiry;
   int _msgcount;
   unsigned long ui_started_at, next_batt_chck;
+  int next_backlight_btn_check = 0;
+#ifdef PIN_STATUS_LED
+  int led_state = 0;
+  int next_led_change = 0;
+  int last_led_increment = 0;
+#endif
 
   UIScreen* splash;
   UIScreen* home;
@@ -37,6 +43,8 @@ class UITask : public AbstractUITask {
   // Button action handlers
   char checkDisplayOn(char c);
   char handleLongPress(char c);
+  char handleDoubleClick(char c);
+  char handleTripleClick(char c);
 
   void setCurrScreen(UIScreen* c);
 
@@ -55,6 +63,10 @@ public:
   bool hasDisplay() const { return _display != NULL; }
   bool isButtonPressed() const;
 
+  void toggleBuzzer();
+  void toggleGPS();
+
+
   // from AbstractUITask
   void msgRead(int msgcount) override;
   void newMsg(uint8_t path_len, const char* from_name, const char* text, int msgcount) override;

+ 1 - 2
src/helpers/HeltecV3Board.h

@@ -85,8 +85,7 @@ public:
   }
 
   void powerOff() override {
-    // TODO: re-enable this when there is a definite wake-up source pin:
-    //  enterDeepSleep(0);
+    enterDeepSleep(0);
   }
 
   uint16_t getBattMilliVolts() override {

+ 30 - 5
src/helpers/ui/GxEPDDisplay.cpp

@@ -16,6 +16,7 @@ bool GxEPDDisplay::begin() {
   display.fillScreen(GxEPD_WHITE);
   display.display(true);
   #if DISP_BACKLIGHT
+  digitalWrite(DISP_BACKLIGHT, LOW);
   pinMode(DISP_BACKLIGHT, OUTPUT);
   #endif
   _init = true;
@@ -24,14 +25,14 @@ bool GxEPDDisplay::begin() {
 
 void GxEPDDisplay::turnOn() {
   if (!_init) begin();
-#if DISP_BACKLIGHT
+#if defined(DISP_BACKLIGHT) && !defined(BACKLIGHT_BTN)
   digitalWrite(DISP_BACKLIGHT, HIGH);
 #endif
   _isOn = true;
 }
 
 void GxEPDDisplay::turnOff() {
-#if DISP_BACKLIGHT
+#if defined(DISP_BACKLIGHT) && !defined(BACKLIGHT_BTN)
   digitalWrite(DISP_BACKLIGHT, LOW);
 #endif
   _isOn = false;
@@ -40,14 +41,17 @@ void GxEPDDisplay::turnOff() {
 void GxEPDDisplay::clear() {
   display.fillScreen(GxEPD_WHITE);
   display.setTextColor(GxEPD_BLACK);
+  display_crc.reset();
 }
 
 void GxEPDDisplay::startFrame(Color bkg) {
   display.fillScreen(GxEPD_WHITE);
   display.setTextColor(_curr_color = GxEPD_BLACK);
+  display_crc.reset();
 }
 
 void GxEPDDisplay::setTextSize(int sz) {
+  display_crc.update<int>(sz);
   switch(sz) {
     case 1:  // Small
       display.setFont(&FreeSans9pt7b);
@@ -65,6 +69,7 @@ void GxEPDDisplay::setTextSize(int sz) {
 }
 
 void GxEPDDisplay::setColor(Color c) {
+  display_crc.update<Color> (c);
   // colours need to be inverted for epaper displays
   if (c == DARK) {
     display.setTextColor(_curr_color = GxEPD_WHITE);
@@ -74,22 +79,38 @@ void GxEPDDisplay::setColor(Color c) {
 }
 
 void GxEPDDisplay::setCursor(int x, int y) {
+  display_crc.update<int>(x);
+  display_crc.update<int>(y);
   display.setCursor((x+offset_x)*scale_x, (y+offset_y)*scale_y);
 }
 
 void GxEPDDisplay::print(const char* str) {
+  display_crc.update<char>(str, strlen(str));
   display.print(str);
 }
 
 void GxEPDDisplay::fillRect(int x, int y, int w, int h) {
-  display.fillRect(x*scale_x, y*scale_y, w*scale_x, h*scale_y, _curr_color);
+  display_crc.update<int>(x);
+  display_crc.update<int>(y);
+  display_crc.update<int>(w);
+  display_crc.update<int>(h);
+  display.fillRect(x*SCALE_X, y*SCALE_Y, w*SCALE_X, h*SCALE_Y, _curr_color);
 }
 
 void GxEPDDisplay::drawRect(int x, int y, int w, int h) {
-  display.drawRect(x*scale_x, y*scale_y, w*scale_x, h*scale_y, _curr_color);
+  display_crc.update<int>(x);
+  display_crc.update<int>(y);
+  display_crc.update<int>(w);
+  display_crc.update<int>(h);
+  display.drawRect(x*SCALE_X, y*SCALE_Y, w*SCALE_X, h*SCALE_Y, _curr_color);
 }
 
 void GxEPDDisplay::drawXbm(int x, int y, const uint8_t* bits, int w, int h) {
+  display_crc.update<int>(x);
+  display_crc.update<int>(y);
+  display_crc.update<int>(w);
+  display_crc.update<int>(h);
+  display_crc.update<uint8_t>(bits, w * h / 8);
   // Calculate the base position in display coordinates
   uint16_t startX = x * scale_x;
   uint16_t startY = y * scale_y;
@@ -133,5 +154,9 @@ uint16_t GxEPDDisplay::getTextWidth(const char* str) {
 }
 
 void GxEPDDisplay::endFrame() {
-  display.display(true);
+  uint32_t crc = display_crc.finalize();
+  if (crc != last_display_crc_value) {
+    display.display(true);
+    last_display_crc_value = crc;
+  }
 }

+ 4 - 0
src/helpers/ui/GxEPDDisplay.h

@@ -15,6 +15,8 @@
 
 #include <epd/GxEPD2_150_BN.h>  // 1.54" b/w
 #include <epd/GxEPD2_213_B74.h> // 2.13" b/w
+#include <CRC32.h>
+
 #include "DisplayDriver.h"
 
 //GxEPD2_BW<GxEPD2_150_BN, 200> display(GxEPD2_150_BN(DISP_CS, DISP_DC, DISP_RST, DISP_BUSY)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
@@ -38,6 +40,8 @@ class GxEPDDisplay : public DisplayDriver {
   bool _init = false;
   bool _isOn = false;
   uint16_t _curr_color;
+  CRC32 display_crc;
+  int last_display_crc_value = 0;
 
 public:
   // there is a margin in y...

+ 58 - 4
src/helpers/ui/MomentaryButton.cpp

@@ -1,5 +1,7 @@
 #include "MomentaryButton.h"
 
+#define MULTI_CLICK_WINDOW_MS  280
+
 MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, bool reverse, bool pulldownup) { 
   _pin = pin;
   _reverse = reverse;
@@ -9,6 +11,10 @@ MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, bool reverse
   cancel = 0;
   _long_millis = long_press_millis;
   _threshold = 0;
+  _click_count = 0;
+  _last_click_time = 0;
+  _multi_click_window = MULTI_CLICK_WINDOW_MS;
+  _pending_click = false;
 }
 
 MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, int analog_threshold) {
@@ -20,6 +26,10 @@ MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, int analog_t
   cancel = 0;
   _long_millis = long_press_millis;
   _threshold = analog_threshold;
+  _click_count = 0;
+  _last_click_time = 0;
+  _multi_click_window = MULTI_CLICK_WINDOW_MS;
+  _pending_click = false;
 }
 
 void MomentaryButton::begin() {
@@ -35,6 +45,10 @@ bool  MomentaryButton::isPressed() const {
 
 void MomentaryButton::cancelClick() {
   cancel = 1;
+  down_at = 0;
+  _click_count = 0;
+  _last_click_time = 0;
+  _pending_click = false;
 }
 
 bool MomentaryButton::isPressed(int level) const {
@@ -60,13 +74,20 @@ int MomentaryButton::check(bool repeat_click) {
       // button UP
       if (_long_millis > 0) {
         if (down_at > 0 && (unsigned long)(millis() - down_at) < _long_millis) {  // only a CLICK if still within the long_press millis
-          event = BUTTON_EVENT_CLICK;
+            _click_count++;
+            _last_click_time = millis();
+            _pending_click = true;
         }
       } else {
-        event = BUTTON_EVENT_CLICK;  // any UP results in CLICK event when NOT using long_press feature
+          _click_count++;
+          _last_click_time = millis();
+          _pending_click = true;
       }
       if (event == BUTTON_EVENT_CLICK && cancel) {
         event = BUTTON_EVENT_NONE;
+        _click_count = 0;
+        _last_click_time = 0;
+        _pending_click = false;
       }
       down_at = 0;
     }
@@ -77,8 +98,16 @@ int MomentaryButton::check(bool repeat_click) {
   }
 
   if (_long_millis > 0 && down_at > 0 && (unsigned long)(millis() - down_at) >= _long_millis) {
-    event = BUTTON_EVENT_LONG_PRESS;
-    down_at = 0;
+    if (_pending_click) {
+      // long press during multi-click detection - cancel pending clicks
+      cancelClick();
+    } else {
+      event = BUTTON_EVENT_LONG_PRESS;
+      down_at = 0;
+      _click_count = 0;
+      _last_click_time = 0;
+      _pending_click = false;
+    }
   }
   if (down_at > 0 && repeat_click) {
     unsigned long diff = (unsigned long)(millis() - down_at);
@@ -87,5 +116,30 @@ int MomentaryButton::check(bool repeat_click) {
     }
   }
 
+  if (_pending_click && (millis() - _last_click_time) >= _multi_click_window) {
+    if (down_at > 0) {
+      // still pressed - wait for button release before processing clicks
+      return event;
+    }
+    switch (_click_count) {
+      case 1:
+        event = BUTTON_EVENT_CLICK;
+        break;
+      case 2:
+        event = BUTTON_EVENT_DOUBLE_CLICK;
+        break;
+      case 3:
+        event = BUTTON_EVENT_TRIPLE_CLICK;
+        break;
+      default:
+        // For 4+ clicks, treat as triple click?
+        event = BUTTON_EVENT_TRIPLE_CLICK;
+        break;
+    }
+    _click_count = 0;
+    _last_click_time = 0;
+    _pending_click = false;
+  }
+
   return event;
 }

+ 6 - 0
src/helpers/ui/MomentaryButton.h

@@ -5,6 +5,8 @@
 #define BUTTON_EVENT_NONE        0
 #define BUTTON_EVENT_CLICK       1
 #define BUTTON_EVENT_LONG_PRESS  2
+#define BUTTON_EVENT_DOUBLE_CLICK 3
+#define BUTTON_EVENT_TRIPLE_CLICK 4
 
 class MomentaryButton {
   int8_t _pin;
@@ -13,6 +15,10 @@ class MomentaryButton {
   int _long_millis;
   int _threshold;  // analog mode
   unsigned long down_at;
+  uint8_t _click_count;
+  unsigned long _last_click_time;
+  int _multi_click_window;
+  bool _pending_click;
 
   bool isPressed(int level) const;
 

+ 11 - 7
src/helpers/ui/UIScreen.h

@@ -2,13 +2,17 @@
 
 #include "DisplayDriver.h"
 
-#define KEY_LEFT     0xB4
-#define KEY_UP       0xB5
-#define KEY_DOWN     0xB6
-#define KEY_RIGHT    0xB7
-#define KEY_SELECT     10
-#define KEY_ENTER      13
-#define KEY_BACK       27   // Esc
+#define KEY_LEFT           0xB4
+#define KEY_UP             0xB5
+#define KEY_DOWN           0xB6
+#define KEY_RIGHT          0xB7
+#define KEY_SELECT           10
+#define KEY_ENTER            13
+#define KEY_CANCEL           27   // Esc
+#define KEY_HOME           0xF0
+#define KEY_NEXT           0xF1
+#define KEY_PREV           0xF2
+#define KEY_CONTEXT_MENU   0xF3
 
 class UIScreen {
 protected:

+ 2 - 4
variants/heltec_vision_master_e213/HeltecE213Board.cpp → variants/heltec_e213/HeltecE213Board.cpp

@@ -23,7 +23,7 @@ void HeltecE213Board::begin() {
   void HeltecE213Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
     esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
 
-    // Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep 
+    // Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
     rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
     rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
 
@@ -44,8 +44,7 @@ void HeltecE213Board::begin() {
   }
 
   void HeltecE213Board::powerOff()  {
-    // TODO: re-enable this when there is a definite wake-up source pin:
-    //  enterDeepSleep(0);
+    enterDeepSleep(0);
   }
 
   uint16_t HeltecE213Board::getBattMilliVolts()  {
@@ -66,4 +65,3 @@ void HeltecE213Board::begin() {
   const char* HeltecE213Board::getManufacturerName() const {
     return "Heltec E213";
   }
-

+ 0 - 10
variants/heltec_vision_master_e213/HeltecE213Board.h → variants/heltec_e213/HeltecE213Board.h

@@ -5,15 +5,6 @@
 #include <helpers/ESP32Board.h>
 #include <driver/rtc_io.h>
 
-// LoRa radio module pins for heltec_vision_master_e213 
-#define  P_LORA_DIO_1   14
-#define  P_LORA_NSS      8
-#define  P_LORA_RESET   12
-#define  P_LORA_BUSY    13
-#define  P_LORA_SCLK     9
-#define  P_LORA_MISO    11
-#define  P_LORA_MOSI    10
-
 class HeltecE213Board : public ESP32Board {
 
 public:
@@ -26,5 +17,4 @@ public:
   void powerOff() override;
   uint16_t getBattMilliVolts() override;
   const char* getManufacturerName() const override ;
-
 };

+ 0 - 0
variants/heltec_vision_master_e213/pins_arduino.h → variants/heltec_e213/pins_arduino.h


+ 47 - 22
variants/heltec_vision_master_e213/platformio.ini → variants/heltec_e213/platformio.ini

@@ -1,14 +1,22 @@
-[Heltec_Vision_Master_E213_base]
+[Heltec_E213_base]
 extends = esp32_base
-board = heltec_vision_master_e213
+board = heltec_e213
 build_flags =
   ${esp32_base.build_flags}
-  -I variants/heltec_vision_master_e213
-  -D HELTEC_VISION_MASTER_E213
+  -I variants/heltec_e213
+  -D Vision_Master_E213
+  -D ARDUINO_USB_CDC_ON_BOOT=1
   -D RADIO_CLASS=CustomSX1262
   -D WRAPPER_CLASS=CustomSX1262Wrapper
-  -D LORA_TX_POWER=22
+  -D P_LORA_DIO_1=14
+  -D P_LORA_NSS=8
+  -D P_LORA_RESET=12
+  -D P_LORA_BUSY=13
+  -D P_LORA_SCLK=9
+  -D P_LORA_MISO=11
+  -D P_LORA_MOSI=10
   -D P_LORA_TX_LED=45
+  -D LORA_TX_POWER=22
   -D PIN_USER_BTN=0
   -D PIN_VEXT_EN=18
   -D PIN_VEXT_EN_ACTIVE=HIGH
@@ -26,17 +34,16 @@ build_flags =
   -D DISP_RST=3
   -D DISP_SCLK=4
   -D DISP_MOSI=6
-  -D Vision_Master_E213
 build_src_filter = ${esp32_base.build_src_filter}
-  +<../variants/heltec_vision_master_e213>
+  +<../variants/heltec_e213>
 lib_deps =
   ${esp32_base.lib_deps}
   https://github.com/Quency-D/heltec-eink-modules/archive/563dd41fd850a1bc3039b8723da4f3a20fe1c800.zip
 
-[env:Heltec_Vision_Master_E213_radio_ble]
-extends = Heltec_Vision_Master_E213_base
+[env:Heltec_E213_companion_radio_ble]
+extends = Heltec_E213_base
 build_flags =
-  ${Heltec_Vision_Master_E213_base.build_flags}
+  ${Heltec_E213_base.build_flags}
   -I examples/companion_radio/ui-new
   -D MAX_CONTACTS=300
   -D MAX_GROUP_CHANNELS=8
@@ -44,43 +51,61 @@ build_flags =
   -D BLE_PIN_CODE=123456   ; dynamic, random PIN
   -D BLE_DEBUG_LOGGING=1
   -D OFFLINE_QUEUE_SIZE=256
-build_src_filter = ${Heltec_Vision_Master_E213_base.build_src_filter}
+build_src_filter = ${Heltec_E213_base.build_src_filter}
+  +<helpers/ui/E213Display.cpp>
+  +<helpers/esp32/*.cpp>
+  +<../examples/companion_radio/*.cpp>
+  +<../examples/companion_radio/ui-new/*.cpp>
+lib_deps =
+  ${Heltec_E213_base.lib_deps}
+  densaugeo/base64 @ ~1.4.0
+
+[env:Heltec_E213_companion_radio_usb]
+extends = Heltec_E213_base
+build_flags =
+  ${Heltec_E213_base.build_flags}
+  -I examples/companion_radio/ui-new
+  -D MAX_CONTACTS=300
+  -D MAX_GROUP_CHANNELS=8
+  -D DISPLAY_CLASS=E213Display
+  -D OFFLINE_QUEUE_SIZE=256
+build_src_filter = ${Heltec_E213_base.build_src_filter}
   +<helpers/ui/E213Display.cpp>
   +<helpers/esp32/*.cpp>
   +<../examples/companion_radio/*.cpp>
   +<../examples/companion_radio/ui-new/*.cpp>
 lib_deps =
-  ${Heltec_Vision_Master_E213_base.lib_deps}
+  ${Heltec_E213_base.lib_deps}
   densaugeo/base64 @ ~1.4.0
 
-[env:Heltec_Vision_Master_E213_repeater]
-extends = Heltec_Vision_Master_E213_base
+[env:Heltec_E213_repeater]
+extends = Heltec_E213_base
 build_flags =
-  ${Heltec_Vision_Master_E213_base.build_flags}
+  ${Heltec_E213_base.build_flags}
   -D DISPLAY_CLASS=E213Display
   -D ADVERT_NAME='"Heltec E213 Repeater"'
   -D ADVERT_LAT=0.0
   -D ADVERT_LON=0.0
-build_src_filter = ${Heltec_Vision_Master_E213_base.build_src_filter}
+build_src_filter = ${Heltec_E213_base.build_src_filter}
   +<helpers/ui/E213Display.cpp>
   +<../examples/simple_repeater>
 lib_deps =
-  ${Heltec_Vision_Master_E213_base.lib_deps}
+  ${Heltec_E213_base.lib_deps}
   ${esp32_ota.lib_deps}
 
-[env:Heltec_Vision_Master_E213_room_server]
-extends = Heltec_Vision_Master_E213_base
+[env:Heltec_E213_room_server]
+extends = Heltec_E213_base
 build_flags =
-  ${Heltec_Vision_Master_E213_base.build_flags}
+  ${Heltec_E213_base.build_flags}
   -D DISPLAY_CLASS=E213Display
   -D ADVERT_NAME='"Heltec E213 Room"'
   -D ADVERT_LAT=0.0
   -D ADVERT_LON=0.0
   -D ADMIN_PASSWORD='"password"'
   -D ROOM_PASSWORD='"hello"'
-build_src_filter = ${Heltec_Vision_Master_E213_base.build_src_filter}
+build_src_filter = ${Heltec_E213_base.build_src_filter}
   +<helpers/ui/E213Display.cpp>
   +<../examples/simple_room_server>
 lib_deps =
-  ${Heltec_Vision_Master_E213_base.lib_deps}
+  ${Heltec_E213_base.lib_deps}
   ${esp32_ota.lib_deps}

+ 0 - 0
variants/heltec_vision_master_e213/target.cpp → variants/heltec_e213/target.cpp


+ 0 - 0
variants/heltec_vision_master_e213/target.h → variants/heltec_e213/target.h


+ 2 - 4
variants/heltec_vision_master_e290/HeltecE290Board.cpp → variants/heltec_e290/HeltecE290Board.cpp

@@ -23,7 +23,7 @@ void HeltecE290Board::begin() {
   void HeltecE290Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
     esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
 
-    // Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep 
+    // Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
     rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
     rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
 
@@ -44,8 +44,7 @@ void HeltecE290Board::begin() {
   }
 
   void HeltecE290Board::powerOff()  {
-    // TODO: re-enable this when there is a definite wake-up source pin:
-    //  enterDeepSleep(0);
+    enterDeepSleep(0);
   }
 
   uint16_t HeltecE290Board::getBattMilliVolts()  {
@@ -66,4 +65,3 @@ void HeltecE290Board::begin() {
   const char* HeltecE290Board::getManufacturerName() const {
     return "Heltec E290";
   }
-

+ 0 - 9
variants/heltec_vision_master_e290/HeltecE290Board.h → variants/heltec_e290/HeltecE290Board.h

@@ -5,15 +5,6 @@
 #include <helpers/ESP32Board.h>
 #include <driver/rtc_io.h>
 
-// LoRa radio module pins for heltec_vision_master_e290 
-#define  P_LORA_DIO_1   14
-#define  P_LORA_NSS      8
-#define  P_LORA_RESET   12
-#define  P_LORA_BUSY    13
-#define  P_LORA_SCLK     9
-#define  P_LORA_MISO    11
-#define  P_LORA_MOSI    10
-
 class HeltecE290Board : public ESP32Board {
 
 public:

+ 0 - 0
variants/heltec_vision_master_e290/pins_arduino.h → variants/heltec_e290/pins_arduino.h


+ 48 - 21
variants/heltec_vision_master_e290/platformio.ini → variants/heltec_e290/platformio.ini

@@ -1,13 +1,21 @@
-[Heltec_Vision_Master_E290_base]
+[Heltec_E290_base]
 extends = esp32_base
-board = heltec_vision_master_e290
+board = heltec_e290
 build_flags =
   ${esp32_base.build_flags}
-  -I variants/heltec_vision_master_e290
-  -D HELTEC_VISION_MASTER_E290
+  -I variants/heltec_e290
+  -D Vision_Master_E290
+  -D ARDUINO_USB_CDC_ON_BOOT=1
   -D RADIO_CLASS=CustomSX1262
   -D WRAPPER_CLASS=CustomSX1262Wrapper
   -D LORA_TX_POWER=22
+  -D P_LORA_DIO_1=14
+  -D P_LORA_NSS=8
+  -D P_LORA_RESET=12
+  -D P_LORA_BUSY=13
+  -D P_LORA_SCLK=9
+  -D P_LORA_MISO=11
+  -D P_LORA_MOSI=10
   -D P_LORA_TX_LED=45
   -D PIN_USER_BTN=0
   -D PIN_VEXT_EN=18
@@ -20,17 +28,36 @@ build_flags =
   -D SX126X_RX_BOOSTED_GAIN=1
   -D PIN_BOARD_SDA=39
   -D PIN_BOARD_SCL=38
-  -D Vision_Master_E290
 build_src_filter = ${esp32_base.build_src_filter}
-  +<../variants/heltec_vision_master_e290>
+  +<../variants/heltec_e290>
 lib_deps =
   ${esp32_base.lib_deps}
   https://github.com/Quency-D/heltec-eink-modules/archive/563dd41fd850a1bc3039b8723da4f3a20fe1c800.zip
 
-[env:Heltec_Vision_Master_E290_radio_ble]
-extends = Heltec_Vision_Master_E290_base
+[env:Heltec_E290_companion_radio_ble]
+extends = Heltec_E290_base
+build_flags =
+  ${Heltec_E290_base.build_flags}
+  -I examples/companion_radio/ui-new
+  -D MAX_CONTACTS=300
+  -D MAX_GROUP_CHANNELS=8
+  -D DISPLAY_CLASS=E290Display
+  -D BLE_PIN_CODE=123456   ; dynamic, random PIN
+  -D BLE_DEBUG_LOGGING=1
+  -D OFFLINE_QUEUE_SIZE=256
+build_src_filter = ${Heltec_E290_base.build_src_filter}
+  +<helpers/ui/E290Display.cpp>
+  +<helpers/esp32/*.cpp>
+  +<../examples/companion_radio/*.cpp>
+  +<../examples/companion_radio/ui-new/*.cpp>
+lib_deps =
+  ${Heltec_E290_base.lib_deps}
+  densaugeo/base64 @ ~1.4.0
+
+[env:Heltec_E290_companion_radio_usb]
+extends = Heltec_E290_base
 build_flags =
-  ${Heltec_Vision_Master_E290_base.build_flags}
+  ${Heltec_E290_base.build_flags}
   -I examples/companion_radio/ui-new
   -D MAX_CONTACTS=300
   -D MAX_GROUP_CHANNELS=8
@@ -38,43 +65,43 @@ build_flags =
   -D BLE_PIN_CODE=123456   ; dynamic, random PIN
   -D BLE_DEBUG_LOGGING=1
   -D OFFLINE_QUEUE_SIZE=256
-build_src_filter = ${Heltec_Vision_Master_E290_base.build_src_filter}
+build_src_filter = ${Heltec_E290_base.build_src_filter}
   +<helpers/ui/E290Display.cpp>
   +<helpers/esp32/*.cpp>
   +<../examples/companion_radio/*.cpp>
   +<../examples/companion_radio/ui-new/*.cpp>
 lib_deps =
-  ${Heltec_Vision_Master_E290_base.lib_deps}
+  ${Heltec_E290_base.lib_deps}
   densaugeo/base64 @ ~1.4.0
 
-[env:Heltec_Vision_Master_E290_repeater]
-extends = Heltec_Vision_Master_E290_base
+[env:Heltec_E290_repeater]
+extends = Heltec_E290_base
 build_flags =
-  ${Heltec_Vision_Master_E290_base.build_flags}
+  ${Heltec_E290_base.build_flags}
   -D DISPLAY_CLASS=E290Display
   -D ADVERT_NAME='"Heltec E290 Repeater"'
   -D ADVERT_LAT=0.0
   -D ADVERT_LON=0.0
-build_src_filter = ${Heltec_Vision_Master_E290_base.build_src_filter}
+build_src_filter = ${Heltec_E290_base.build_src_filter}
   +<helpers/ui/E290Display.cpp>
   +<../examples/simple_repeater>
 lib_deps =
-  ${Heltec_Vision_Master_E290_base.lib_deps}
+  ${Heltec_E290_base.lib_deps}
   ${esp32_ota.lib_deps}
 
-[env:Heltec_Vision_Master_E290_room_server]
-extends = Heltec_Vision_Master_E290_base
+[env:Heltec_E290_room_server]
+extends = Heltec_E290_base
 build_flags =
-  ${Heltec_Vision_Master_E290_base.build_flags}
+  ${Heltec_E290_base.build_flags}
   -D DISPLAY_CLASS=E290Display
   -D ADVERT_NAME='"Heltec E290 Room"'
   -D ADVERT_LAT=0.0
   -D ADVERT_LON=0.0
   -D ADMIN_PASSWORD='"password"'
   -D ROOM_PASSWORD='"hello"'
-build_src_filter = ${Heltec_Vision_Master_E290_base.build_src_filter}
+build_src_filter = ${Heltec_E290_base.build_src_filter}
   +<helpers/ui/E290Display.cpp>
   +<../examples/simple_room_server>
 lib_deps =
-  ${Heltec_Vision_Master_E290_base.lib_deps}
+  ${Heltec_E290_base.lib_deps}
   ${esp32_ota.lib_deps}

+ 0 - 0
variants/heltec_vision_master_e290/target.cpp → variants/heltec_e290/target.cpp


+ 0 - 0
variants/heltec_vision_master_e290/target.h → variants/heltec_e290/target.h


+ 2 - 4
variants/heltec_vision_master_t190/HeltecT190Board.cpp → variants/heltec_t190/HeltecT190Board.cpp

@@ -23,7 +23,7 @@ void HeltecT190Board::begin() {
   void HeltecT190Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
     esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
 
-    // Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep 
+    // Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
     rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
     rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
 
@@ -44,8 +44,7 @@ void HeltecT190Board::begin() {
   }
 
   void HeltecT190Board::powerOff()  {
-    // TODO: re-enable this when there is a definite wake-up source pin:
-    //  enterDeepSleep(0);
+    enterDeepSleep(0);
   }
 
   uint16_t HeltecT190Board::getBattMilliVolts()  {
@@ -66,4 +65,3 @@ void HeltecT190Board::begin() {
   const char* HeltecT190Board::getManufacturerName() const {
     return "Heltec T190";
   }
-

+ 0 - 9
variants/heltec_vision_master_t190/HeltecT190Board.h → variants/heltec_t190/HeltecT190Board.h

@@ -5,15 +5,6 @@
 #include <helpers/ESP32Board.h>
 #include <driver/rtc_io.h>
 
-// LoRa radio module pins for heltec_vision_master_e290 
-#define  P_LORA_DIO_1   14
-#define  P_LORA_NSS      8
-#define  P_LORA_RESET   12
-#define  P_LORA_BUSY    13
-#define  P_LORA_SCLK     9
-#define  P_LORA_MISO    11
-#define  P_LORA_MOSI    10
-
 class HeltecT190Board : public ESP32Board {
 
 public:

+ 0 - 0
variants/heltec_vision_master_t190/pins_arduino.h → variants/heltec_t190/pins_arduino.h


+ 42 - 19
variants/heltec_vision_master_t190/platformio.ini → variants/heltec_t190/platformio.ini

@@ -1,13 +1,20 @@
-[Heltec_Vision_Master_T190_base]
+[Heltec_T190_base]
 extends = esp32_base
-board = heltec_vision_master_t190
+board = heltec_t190
 build_flags =
   ${esp32_base.build_flags}
-  -I variants/heltec_vision_master_t190
+  -I variants/heltec_t190
   -I src/helpers/ui
   -D HELTEC_VISION_MASTER_T190
   -D RADIO_CLASS=CustomSX1262
   -D WRAPPER_CLASS=CustomSX1262Wrapper
+  -D P_LORA_DIO_1=14
+  -D P_LORA_NSS=8
+  -D P_LORA_RESET=12
+  -D P_LORA_BUSY=13
+  -D P_LORA_SCLK=9
+  -D P_LORA_MISO=11
+  -D P_LORA_MOSI=10
   -D LORA_TX_POWER=22
   -D PIN_USER_BTN=0
   -D PIN_VEXT_EN=5
@@ -31,7 +38,7 @@ build_flags =
   -D ST7789
   -D DISPLAY_CLASS=ST7789Display
 build_src_filter = ${esp32_base.build_src_filter}
-  +<../variants/heltec_vision_master_t190>
+  +<../variants/heltec_t190>
   +<helpers/*.cpp>
   +<helpers/ui/ST7789Display.cpp>
   +<helpers/ui/OLEDDisplay.cpp>
@@ -40,48 +47,64 @@ lib_deps =
   ${esp32_base.lib_deps}
   adafruit/Adafruit GFX Library @ ^1.12.1
 
-[env:Heltec_Vision_Master_T190_radio_ble]
-extends = Heltec_Vision_Master_T190_base
+[env:Heltec_T190_companion_radio_ble]
+extends = Heltec_T190_base
 build_flags =
-  ${Heltec_Vision_Master_T190_base.build_flags}
+  ${Heltec_T190_base.build_flags}
   -I examples/companion_radio/ui-new
   -D MAX_CONTACTS=300
   -D MAX_GROUP_CHANNELS=8
   -D BLE_PIN_CODE=123456   ; dynamic, random PIN
   -D BLE_DEBUG_LOGGING=1
   -D OFFLINE_QUEUE_SIZE=256
-build_src_filter = ${Heltec_Vision_Master_T190_base.build_src_filter}
+build_src_filter = ${Heltec_T190_base.build_src_filter}
   +<helpers/esp32/*.cpp>
   +<../examples/companion_radio/*.cpp>
   +<../examples/companion_radio/ui-new/*.cpp>
 lib_deps =
-  ${Heltec_Vision_Master_T190_base.lib_deps}
+  ${Heltec_T190_base.lib_deps}
   densaugeo/base64 @ ~1.4.0
 
-[env:Heltec_Vision_Master_T190_repeater]
-extends = Heltec_Vision_Master_T190_base
+[env:Heltec_T190_companion_radio_usb]
+extends = Heltec_T190_base
 build_flags =
-  ${Heltec_Vision_Master_T190_base.build_flags}
+  ${Heltec_T190_base.build_flags}
+  -I examples/companion_radio/ui-new
+  -D MAX_CONTACTS=300
+  -D MAX_GROUP_CHANNELS=8
+  -D OFFLINE_QUEUE_SIZE=256
+build_src_filter = ${Heltec_T190_base.build_src_filter}
+  +<helpers/esp32/*.cpp>
+  +<../examples/companion_radio/*.cpp>
+  +<../examples/companion_radio/ui-new/*.cpp>
+lib_deps =
+  ${Heltec_T190_base.lib_deps}
+  densaugeo/base64 @ ~1.4.0
+
+[env:Heltec_T190_repeater]
+extends = Heltec_T190_base
+build_flags =
+  ${Heltec_T190_base.build_flags}
   -D ADVERT_NAME='"Heltec T190 Repeater"'
   -D ADVERT_LAT=0.0
   -D ADVERT_LON=0.0
-build_src_filter = ${Heltec_Vision_Master_T190_base.build_src_filter}
+build_src_filter = ${Heltec_T190_base.build_src_filter}
   +<../examples/simple_repeater>
 lib_deps =
-  ${Heltec_Vision_Master_T190_base.lib_deps}
+  ${Heltec_T190_base.lib_deps}
   ${esp32_ota.lib_deps}
 
-[env:Heltec_Vision_Master_T190_room_server]
-extends = Heltec_Vision_Master_T190_base
+[env:Heltec_T190_room_server]
+extends = Heltec_T190_base
 build_flags =
-  ${Heltec_Vision_Master_T190_base.build_flags}
+  ${Heltec_T190_base.build_flags}
   -D ADVERT_NAME='"Heltec T190 Room"'
   -D ADVERT_LAT=0.0
   -D ADVERT_LON=0.0
   -D ADMIN_PASSWORD='"password"'
   -D ROOM_PASSWORD='"hello"'
-build_src_filter = ${Heltec_Vision_Master_T190_base.build_src_filter}
+build_src_filter = ${Heltec_T190_base.build_src_filter}
   +<../examples/simple_room_server>
 lib_deps =
-  ${Heltec_Vision_Master_T190_base.lib_deps}
+  ${Heltec_T190_base.lib_deps}
   ${esp32_ota.lib_deps}

+ 0 - 0
variants/heltec_vision_master_t190/target.cpp → variants/heltec_t190/target.cpp


+ 0 - 0
variants/heltec_vision_master_t190/target.h → variants/heltec_t190/target.h


+ 4 - 0
variants/promicro/PromicroBoard.h

@@ -60,6 +60,10 @@ public:
   void reboot() override {
     NVIC_SystemReset();
   }
+  
+  void powerOff() override {
+    sd_power_system_off();
+  }
 
   bool startOTAUpdate(const char* id, char reply[]) override;
 };

+ 4 - 1
variants/techo/platformio.ini

@@ -74,10 +74,12 @@ build_flags =
   -D MAX_CONTACTS=100
   -D MAX_GROUP_CHANNELS=8
   -D BLE_PIN_CODE=123456
-  -D BLE_DEBUG_LOGGING=1
+;  -D BLE_DEBUG_LOGGING=1
   -D DISPLAY_CLASS=GxEPDDisplay
   -D OFFLINE_QUEUE_SIZE=256
   -D UI_RECENT_LIST_SIZE=9
+  -D BACKLIGHT_BTN=PIN_BUTTON2
+  -D AUTO_OFF_MILLIS=0
 ;  -D MESH_PACKET_LOGGING=1
 ;  -D MESH_DEBUG=1
 build_src_filter = ${LilyGo_Techo.build_src_filter}
@@ -91,3 +93,4 @@ lib_deps =
   ${LilyGo_Techo.lib_deps}
   densaugeo/base64 @ ~1.4.0
   zinggjm/GxEPD2 @ 1.6.2
+  bakercp/CRC32 @ ^2.0.0