Merge branch 'dev' into dev-meshpocket
This commit is contained in:
@@ -3,7 +3,9 @@
|
|||||||
#include "../MyMesh.h"
|
#include "../MyMesh.h"
|
||||||
#include "target.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
|
#define BOOT_SCREEN_MILLIS 3000 // 3 seconds
|
||||||
|
|
||||||
#ifdef PIN_STATUS_LED
|
#ifdef PIN_STATUS_LED
|
||||||
@@ -223,11 +225,11 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool handleInput(char c) override {
|
bool handleInput(char c) override {
|
||||||
if (c == KEY_LEFT) {
|
if (c == KEY_LEFT || c == KEY_PREV) {
|
||||||
_page = (_page + HomePage::Count - 1) % HomePage::Count;
|
_page = (_page + HomePage::Count - 1) % HomePage::Count;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (c == KEY_RIGHT || c == KEY_SELECT) {
|
if (c == KEY_NEXT || c == KEY_RIGHT) {
|
||||||
_page = (_page + 1) % HomePage::Count;
|
_page = (_page + 1) % HomePage::Count;
|
||||||
if (_page == HomePage::RECENT) {
|
if (_page == HomePage::RECENT) {
|
||||||
_task->showAlert("Recent adverts", 800);
|
_task->showAlert("Recent adverts", 800);
|
||||||
@@ -321,11 +323,15 @@ public:
|
|||||||
display.setColor(DisplayDriver::LIGHT);
|
display.setColor(DisplayDriver::LIGHT);
|
||||||
display.printWordWrap(p->msg, display.width());
|
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
|
return 1000; // next render after 1000 ms
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool handleInput(char c) override {
|
bool handleInput(char c) override {
|
||||||
if (c == KEY_SELECT || c == KEY_RIGHT) {
|
if (c == KEY_NEXT || c == KEY_RIGHT) {
|
||||||
num_unread--;
|
num_unread--;
|
||||||
if (num_unread == 0) {
|
if (num_unread == 0) {
|
||||||
_task->gotoHomeScreen();
|
_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 != NULL) {
|
||||||
if (!_display->isOn()) _display->turnOn();
|
if (!_display->isOn()) _display->turnOn();
|
||||||
_auto_off = millis() + AUTO_OFF_MILLIS; // extend the auto-off timer
|
_auto_off = millis() + AUTO_OFF_MILLIS; // extend the auto-off timer
|
||||||
_next_refresh = 0; // trigger refresh
|
_next_refresh = 100; // trigger refresh
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UITask::userLedHandler() {
|
void UITask::userLedHandler() {
|
||||||
#ifdef PIN_STATUS_LED
|
#ifdef PIN_STATUS_LED
|
||||||
static int state = 0;
|
|
||||||
static int next_change = 0;
|
|
||||||
static int last_increment = 0;
|
|
||||||
|
|
||||||
int cur_time = millis();
|
int cur_time = millis();
|
||||||
if (cur_time > next_change) {
|
if (cur_time > next_led_change) {
|
||||||
if (state == 0) {
|
if (led_state == 0) {
|
||||||
state = 1;
|
led_state = 1;
|
||||||
if (_msgcount > 0) {
|
if (_msgcount > 0) {
|
||||||
last_increment = LED_ON_MSG_MILLIS;
|
last_led_increment = LED_ON_MSG_MILLIS;
|
||||||
} else {
|
} 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 {
|
} else {
|
||||||
state = 0;
|
led_state = 0;
|
||||||
next_change = cur_time + LED_CYCLE_MILLIS - last_increment;
|
next_led_change = cur_time + LED_CYCLE_MILLIS - last_led_increment;
|
||||||
}
|
}
|
||||||
digitalWrite(PIN_STATUS_LED, state);
|
digitalWrite(PIN_STATUS_LED, led_state);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void UITask::setCurrScreen(UIScreen* c) {
|
void UITask::setCurrScreen(UIScreen* c) {
|
||||||
curr = c;
|
curr = c;
|
||||||
_next_refresh = 0;
|
_next_refresh = 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -492,9 +494,13 @@ void UITask::loop() {
|
|||||||
#if defined(PIN_USER_BTN)
|
#if defined(PIN_USER_BTN)
|
||||||
int ev = user_btn.check();
|
int ev = user_btn.check();
|
||||||
if (ev == BUTTON_EVENT_CLICK) {
|
if (ev == BUTTON_EVENT_CLICK) {
|
||||||
c = checkDisplayOn(KEY_SELECT);
|
c = checkDisplayOn(KEY_NEXT);
|
||||||
} else if (ev == BUTTON_EVENT_LONG_PRESS) {
|
} else if (ev == BUTTON_EVENT_LONG_PRESS) {
|
||||||
c = handleLongPress(KEY_ENTER);
|
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
|
#endif
|
||||||
#if defined(WIO_TRACKER_L1)
|
#if defined(WIO_TRACKER_L1)
|
||||||
@@ -514,16 +520,27 @@ void UITask::loop() {
|
|||||||
#if defined(PIN_USER_BTN_ANA)
|
#if defined(PIN_USER_BTN_ANA)
|
||||||
ev = analog_btn.check();
|
ev = analog_btn.check();
|
||||||
if (ev == BUTTON_EVENT_CLICK) {
|
if (ev == BUTTON_EVENT_CLICK) {
|
||||||
c = checkDisplayOn(KEY_SELECT);
|
c = checkDisplayOn(KEY_NEXT);
|
||||||
} else if (ev == BUTTON_EVENT_LONG_PRESS) {
|
} else if (ev == BUTTON_EVENT_LONG_PRESS) {
|
||||||
c = handleLongPress(KEY_ENTER);
|
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
|
#endif
|
||||||
|
|
||||||
if (c != 0 && curr) {
|
if (c != 0 && curr) {
|
||||||
curr->handleInput(c);
|
curr->handleInput(c);
|
||||||
_auto_off = millis() + AUTO_OFF_MILLIS; // extend auto-off timer
|
_auto_off = millis() + AUTO_OFF_MILLIS; // extend auto-off timer
|
||||||
_next_refresh = 0; // trigger refresh
|
_next_refresh = 100; // trigger refresh
|
||||||
}
|
}
|
||||||
|
|
||||||
userLedHandler();
|
userLedHandler();
|
||||||
@@ -553,9 +570,11 @@ void UITask::loop() {
|
|||||||
}
|
}
|
||||||
_display->endFrame();
|
_display->endFrame();
|
||||||
}
|
}
|
||||||
|
#if AUTO_OFF_MILLIS > 0
|
||||||
if (millis() > _auto_off) {
|
if (millis() > _auto_off) {
|
||||||
_display->turnOff();
|
_display->turnOff();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef AUTO_SHUTDOWN_MILLIVOLTS
|
#ifdef AUTO_SHUTDOWN_MILLIVOLTS
|
||||||
@@ -604,20 +623,53 @@ char UITask::handleLongPress(char c) {
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
char UITask::handleDoubleClick(char c) {
|
||||||
void UITask::handleButtonTriplePress() {
|
MESH_DEBUG_PRINTLN("UITask: double click triggered");
|
||||||
MESH_DEBUG_PRINTLN("UITask: triple press triggered");
|
checkDisplayOn(c);
|
||||||
// Toggle buzzer quiet mode
|
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
|
#ifdef PIN_BUZZER
|
||||||
if (buzzer.isQuiet()) {
|
if (buzzer.isQuiet()) {
|
||||||
buzzer.quiet(false);
|
buzzer.quiet(false);
|
||||||
soundBuzzer(UIEventType::ack);
|
soundBuzzer(UIEventType::ack);
|
||||||
showAlert("Buzzer: ON", 600);
|
showAlert("Buzzer: ON", 800);
|
||||||
} else {
|
} else {
|
||||||
buzzer.quiet(true);
|
buzzer.quiet(true);
|
||||||
showAlert("Buzzer: OFF", 600);
|
showAlert("Buzzer: OFF", 800);
|
||||||
}
|
}
|
||||||
_next_refresh = 0; // trigger refresh
|
_next_refresh = 0; // trigger refresh
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|||||||
@@ -26,6 +26,12 @@ class UITask : public AbstractUITask {
|
|||||||
unsigned long _alert_expiry;
|
unsigned long _alert_expiry;
|
||||||
int _msgcount;
|
int _msgcount;
|
||||||
unsigned long ui_started_at, next_batt_chck;
|
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* splash;
|
||||||
UIScreen* home;
|
UIScreen* home;
|
||||||
@@ -37,6 +43,8 @@ class UITask : public AbstractUITask {
|
|||||||
// Button action handlers
|
// Button action handlers
|
||||||
char checkDisplayOn(char c);
|
char checkDisplayOn(char c);
|
||||||
char handleLongPress(char c);
|
char handleLongPress(char c);
|
||||||
|
char handleDoubleClick(char c);
|
||||||
|
char handleTripleClick(char c);
|
||||||
|
|
||||||
void setCurrScreen(UIScreen* c);
|
void setCurrScreen(UIScreen* c);
|
||||||
|
|
||||||
@@ -55,6 +63,10 @@ public:
|
|||||||
bool hasDisplay() const { return _display != NULL; }
|
bool hasDisplay() const { return _display != NULL; }
|
||||||
bool isButtonPressed() const;
|
bool isButtonPressed() const;
|
||||||
|
|
||||||
|
void toggleBuzzer();
|
||||||
|
void toggleGPS();
|
||||||
|
|
||||||
|
|
||||||
// from AbstractUITask
|
// from AbstractUITask
|
||||||
void msgRead(int msgcount) override;
|
void msgRead(int msgcount) override;
|
||||||
void newMsg(uint8_t path_len, const char* from_name, const char* text, int msgcount) override;
|
void newMsg(uint8_t path_len, const char* from_name, const char* text, int msgcount) override;
|
||||||
|
|||||||
@@ -85,8 +85,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void powerOff() override {
|
void powerOff() override {
|
||||||
// TODO: re-enable this when there is a definite wake-up source pin:
|
enterDeepSleep(0);
|
||||||
// enterDeepSleep(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t getBattMilliVolts() override {
|
uint16_t getBattMilliVolts() override {
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ bool GxEPDDisplay::begin() {
|
|||||||
display.fillScreen(GxEPD_WHITE);
|
display.fillScreen(GxEPD_WHITE);
|
||||||
display.display(true);
|
display.display(true);
|
||||||
#if DISP_BACKLIGHT
|
#if DISP_BACKLIGHT
|
||||||
|
digitalWrite(DISP_BACKLIGHT, LOW);
|
||||||
pinMode(DISP_BACKLIGHT, OUTPUT);
|
pinMode(DISP_BACKLIGHT, OUTPUT);
|
||||||
#endif
|
#endif
|
||||||
_init = true;
|
_init = true;
|
||||||
@@ -24,14 +25,14 @@ bool GxEPDDisplay::begin() {
|
|||||||
|
|
||||||
void GxEPDDisplay::turnOn() {
|
void GxEPDDisplay::turnOn() {
|
||||||
if (!_init) begin();
|
if (!_init) begin();
|
||||||
#if DISP_BACKLIGHT
|
#if defined(DISP_BACKLIGHT) && !defined(BACKLIGHT_BTN)
|
||||||
digitalWrite(DISP_BACKLIGHT, HIGH);
|
digitalWrite(DISP_BACKLIGHT, HIGH);
|
||||||
#endif
|
#endif
|
||||||
_isOn = true;
|
_isOn = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GxEPDDisplay::turnOff() {
|
void GxEPDDisplay::turnOff() {
|
||||||
#if DISP_BACKLIGHT
|
#if defined(DISP_BACKLIGHT) && !defined(BACKLIGHT_BTN)
|
||||||
digitalWrite(DISP_BACKLIGHT, LOW);
|
digitalWrite(DISP_BACKLIGHT, LOW);
|
||||||
#endif
|
#endif
|
||||||
_isOn = false;
|
_isOn = false;
|
||||||
@@ -40,14 +41,17 @@ void GxEPDDisplay::turnOff() {
|
|||||||
void GxEPDDisplay::clear() {
|
void GxEPDDisplay::clear() {
|
||||||
display.fillScreen(GxEPD_WHITE);
|
display.fillScreen(GxEPD_WHITE);
|
||||||
display.setTextColor(GxEPD_BLACK);
|
display.setTextColor(GxEPD_BLACK);
|
||||||
|
display_crc.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GxEPDDisplay::startFrame(Color bkg) {
|
void GxEPDDisplay::startFrame(Color bkg) {
|
||||||
display.fillScreen(GxEPD_WHITE);
|
display.fillScreen(GxEPD_WHITE);
|
||||||
display.setTextColor(_curr_color = GxEPD_BLACK);
|
display.setTextColor(_curr_color = GxEPD_BLACK);
|
||||||
|
display_crc.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GxEPDDisplay::setTextSize(int sz) {
|
void GxEPDDisplay::setTextSize(int sz) {
|
||||||
|
display_crc.update<int>(sz);
|
||||||
switch(sz) {
|
switch(sz) {
|
||||||
case 1: // Small
|
case 1: // Small
|
||||||
display.setFont(&FreeSans9pt7b);
|
display.setFont(&FreeSans9pt7b);
|
||||||
@@ -65,6 +69,7 @@ void GxEPDDisplay::setTextSize(int sz) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GxEPDDisplay::setColor(Color c) {
|
void GxEPDDisplay::setColor(Color c) {
|
||||||
|
display_crc.update<Color> (c);
|
||||||
// colours need to be inverted for epaper displays
|
// colours need to be inverted for epaper displays
|
||||||
if (c == DARK) {
|
if (c == DARK) {
|
||||||
display.setTextColor(_curr_color = GxEPD_WHITE);
|
display.setTextColor(_curr_color = GxEPD_WHITE);
|
||||||
@@ -74,22 +79,38 @@ void GxEPDDisplay::setColor(Color c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GxEPDDisplay::setCursor(int x, int y) {
|
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);
|
display.setCursor((x+offset_x)*scale_x, (y+offset_y)*scale_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GxEPDDisplay::print(const char* str) {
|
void GxEPDDisplay::print(const char* str) {
|
||||||
|
display_crc.update<char>(str, strlen(str));
|
||||||
display.print(str);
|
display.print(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GxEPDDisplay::fillRect(int x, int y, int w, int h) {
|
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) {
|
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) {
|
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
|
// Calculate the base position in display coordinates
|
||||||
uint16_t startX = x * scale_x;
|
uint16_t startX = x * scale_x;
|
||||||
uint16_t startY = y * scale_y;
|
uint16_t startY = y * scale_y;
|
||||||
@@ -133,5 +154,9 @@ uint16_t GxEPDDisplay::getTextWidth(const char* str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GxEPDDisplay::endFrame() {
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
|
|
||||||
#include <epd/GxEPD2_150_BN.h> // 1.54" b/w
|
#include <epd/GxEPD2_150_BN.h> // 1.54" b/w
|
||||||
#include <epd/GxEPD2_213_B74.h> // 2.13" b/w
|
#include <epd/GxEPD2_213_B74.h> // 2.13" b/w
|
||||||
|
#include <CRC32.h>
|
||||||
|
|
||||||
#include "DisplayDriver.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
|
//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 _init = false;
|
||||||
bool _isOn = false;
|
bool _isOn = false;
|
||||||
uint16_t _curr_color;
|
uint16_t _curr_color;
|
||||||
|
CRC32 display_crc;
|
||||||
|
int last_display_crc_value = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// there is a margin in y...
|
// there is a margin in y...
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#include "MomentaryButton.h"
|
#include "MomentaryButton.h"
|
||||||
|
|
||||||
|
#define MULTI_CLICK_WINDOW_MS 280
|
||||||
|
|
||||||
MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, bool reverse, bool pulldownup) {
|
MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, bool reverse, bool pulldownup) {
|
||||||
_pin = pin;
|
_pin = pin;
|
||||||
_reverse = reverse;
|
_reverse = reverse;
|
||||||
@@ -9,6 +11,10 @@ MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, bool reverse
|
|||||||
cancel = 0;
|
cancel = 0;
|
||||||
_long_millis = long_press_millis;
|
_long_millis = long_press_millis;
|
||||||
_threshold = 0;
|
_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) {
|
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;
|
cancel = 0;
|
||||||
_long_millis = long_press_millis;
|
_long_millis = long_press_millis;
|
||||||
_threshold = analog_threshold;
|
_threshold = analog_threshold;
|
||||||
|
_click_count = 0;
|
||||||
|
_last_click_time = 0;
|
||||||
|
_multi_click_window = MULTI_CLICK_WINDOW_MS;
|
||||||
|
_pending_click = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MomentaryButton::begin() {
|
void MomentaryButton::begin() {
|
||||||
@@ -35,6 +45,10 @@ bool MomentaryButton::isPressed() const {
|
|||||||
|
|
||||||
void MomentaryButton::cancelClick() {
|
void MomentaryButton::cancelClick() {
|
||||||
cancel = 1;
|
cancel = 1;
|
||||||
|
down_at = 0;
|
||||||
|
_click_count = 0;
|
||||||
|
_last_click_time = 0;
|
||||||
|
_pending_click = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MomentaryButton::isPressed(int level) const {
|
bool MomentaryButton::isPressed(int level) const {
|
||||||
@@ -60,13 +74,20 @@ int MomentaryButton::check(bool repeat_click) {
|
|||||||
// button UP
|
// button UP
|
||||||
if (_long_millis > 0) {
|
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
|
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 {
|
} 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) {
|
if (event == BUTTON_EVENT_CLICK && cancel) {
|
||||||
event = BUTTON_EVENT_NONE;
|
event = BUTTON_EVENT_NONE;
|
||||||
|
_click_count = 0;
|
||||||
|
_last_click_time = 0;
|
||||||
|
_pending_click = false;
|
||||||
}
|
}
|
||||||
down_at = 0;
|
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) {
|
if (_long_millis > 0 && down_at > 0 && (unsigned long)(millis() - down_at) >= _long_millis) {
|
||||||
event = BUTTON_EVENT_LONG_PRESS;
|
if (_pending_click) {
|
||||||
down_at = 0;
|
// 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) {
|
if (down_at > 0 && repeat_click) {
|
||||||
unsigned long diff = (unsigned long)(millis() - down_at);
|
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;
|
return event;
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,8 @@
|
|||||||
#define BUTTON_EVENT_NONE 0
|
#define BUTTON_EVENT_NONE 0
|
||||||
#define BUTTON_EVENT_CLICK 1
|
#define BUTTON_EVENT_CLICK 1
|
||||||
#define BUTTON_EVENT_LONG_PRESS 2
|
#define BUTTON_EVENT_LONG_PRESS 2
|
||||||
|
#define BUTTON_EVENT_DOUBLE_CLICK 3
|
||||||
|
#define BUTTON_EVENT_TRIPLE_CLICK 4
|
||||||
|
|
||||||
class MomentaryButton {
|
class MomentaryButton {
|
||||||
int8_t _pin;
|
int8_t _pin;
|
||||||
@@ -13,6 +15,10 @@ class MomentaryButton {
|
|||||||
int _long_millis;
|
int _long_millis;
|
||||||
int _threshold; // analog mode
|
int _threshold; // analog mode
|
||||||
unsigned long down_at;
|
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;
|
bool isPressed(int level) const;
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,17 @@
|
|||||||
|
|
||||||
#include "DisplayDriver.h"
|
#include "DisplayDriver.h"
|
||||||
|
|
||||||
#define KEY_LEFT 0xB4
|
#define KEY_LEFT 0xB4
|
||||||
#define KEY_UP 0xB5
|
#define KEY_UP 0xB5
|
||||||
#define KEY_DOWN 0xB6
|
#define KEY_DOWN 0xB6
|
||||||
#define KEY_RIGHT 0xB7
|
#define KEY_RIGHT 0xB7
|
||||||
#define KEY_SELECT 10
|
#define KEY_SELECT 10
|
||||||
#define KEY_ENTER 13
|
#define KEY_ENTER 13
|
||||||
#define KEY_BACK 27 // Esc
|
#define KEY_CANCEL 27 // Esc
|
||||||
|
#define KEY_HOME 0xF0
|
||||||
|
#define KEY_NEXT 0xF1
|
||||||
|
#define KEY_PREV 0xF2
|
||||||
|
#define KEY_CONTEXT_MENU 0xF3
|
||||||
|
|
||||||
class UIScreen {
|
class UIScreen {
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ void HeltecE213Board::begin() {
|
|||||||
void HeltecE213Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
|
void HeltecE213Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
|
||||||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
|
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_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);
|
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
|
||||||
|
|
||||||
@@ -44,8 +44,7 @@ void HeltecE213Board::begin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HeltecE213Board::powerOff() {
|
void HeltecE213Board::powerOff() {
|
||||||
// TODO: re-enable this when there is a definite wake-up source pin:
|
enterDeepSleep(0);
|
||||||
// enterDeepSleep(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t HeltecE213Board::getBattMilliVolts() {
|
uint16_t HeltecE213Board::getBattMilliVolts() {
|
||||||
@@ -66,4 +65,3 @@ void HeltecE213Board::begin() {
|
|||||||
const char* HeltecE213Board::getManufacturerName() const {
|
const char* HeltecE213Board::getManufacturerName() const {
|
||||||
return "Heltec E213";
|
return "Heltec E213";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5,15 +5,6 @@
|
|||||||
#include <helpers/ESP32Board.h>
|
#include <helpers/ESP32Board.h>
|
||||||
#include <driver/rtc_io.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 {
|
class HeltecE213Board : public ESP32Board {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -26,5 +17,4 @@ public:
|
|||||||
void powerOff() override;
|
void powerOff() override;
|
||||||
uint16_t getBattMilliVolts() override;
|
uint16_t getBattMilliVolts() override;
|
||||||
const char* getManufacturerName() const override ;
|
const char* getManufacturerName() const override ;
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -1,14 +1,22 @@
|
|||||||
[Heltec_Vision_Master_E213_base]
|
[Heltec_E213_base]
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = heltec_vision_master_e213
|
board = heltec_e213
|
||||||
build_flags =
|
build_flags =
|
||||||
${esp32_base.build_flags}
|
${esp32_base.build_flags}
|
||||||
-I variants/heltec_vision_master_e213
|
-I variants/heltec_e213
|
||||||
-D HELTEC_VISION_MASTER_E213
|
-D Vision_Master_E213
|
||||||
|
-D ARDUINO_USB_CDC_ON_BOOT=1
|
||||||
-D RADIO_CLASS=CustomSX1262
|
-D RADIO_CLASS=CustomSX1262
|
||||||
-D WRAPPER_CLASS=CustomSX1262Wrapper
|
-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 P_LORA_TX_LED=45
|
||||||
|
-D LORA_TX_POWER=22
|
||||||
-D PIN_USER_BTN=0
|
-D PIN_USER_BTN=0
|
||||||
-D PIN_VEXT_EN=18
|
-D PIN_VEXT_EN=18
|
||||||
-D PIN_VEXT_EN_ACTIVE=HIGH
|
-D PIN_VEXT_EN_ACTIVE=HIGH
|
||||||
@@ -26,17 +34,16 @@ build_flags =
|
|||||||
-D DISP_RST=3
|
-D DISP_RST=3
|
||||||
-D DISP_SCLK=4
|
-D DISP_SCLK=4
|
||||||
-D DISP_MOSI=6
|
-D DISP_MOSI=6
|
||||||
-D Vision_Master_E213
|
|
||||||
build_src_filter = ${esp32_base.build_src_filter}
|
build_src_filter = ${esp32_base.build_src_filter}
|
||||||
+<../variants/heltec_vision_master_e213>
|
+<../variants/heltec_e213>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${esp32_base.lib_deps}
|
${esp32_base.lib_deps}
|
||||||
https://github.com/Quency-D/heltec-eink-modules/archive/563dd41fd850a1bc3039b8723da4f3a20fe1c800.zip
|
https://github.com/Quency-D/heltec-eink-modules/archive/563dd41fd850a1bc3039b8723da4f3a20fe1c800.zip
|
||||||
|
|
||||||
[env:Heltec_Vision_Master_E213_radio_ble]
|
[env:Heltec_E213_companion_radio_ble]
|
||||||
extends = Heltec_Vision_Master_E213_base
|
extends = Heltec_E213_base
|
||||||
build_flags =
|
build_flags =
|
||||||
${Heltec_Vision_Master_E213_base.build_flags}
|
${Heltec_E213_base.build_flags}
|
||||||
-I examples/companion_radio/ui-new
|
-I examples/companion_radio/ui-new
|
||||||
-D MAX_CONTACTS=300
|
-D MAX_CONTACTS=300
|
||||||
-D MAX_GROUP_CHANNELS=8
|
-D MAX_GROUP_CHANNELS=8
|
||||||
@@ -44,43 +51,61 @@ build_flags =
|
|||||||
-D BLE_PIN_CODE=123456 ; dynamic, random PIN
|
-D BLE_PIN_CODE=123456 ; dynamic, random PIN
|
||||||
-D BLE_DEBUG_LOGGING=1
|
-D BLE_DEBUG_LOGGING=1
|
||||||
-D OFFLINE_QUEUE_SIZE=256
|
-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/ui/E213Display.cpp>
|
||||||
+<helpers/esp32/*.cpp>
|
+<helpers/esp32/*.cpp>
|
||||||
+<../examples/companion_radio/*.cpp>
|
+<../examples/companion_radio/*.cpp>
|
||||||
+<../examples/companion_radio/ui-new/*.cpp>
|
+<../examples/companion_radio/ui-new/*.cpp>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${Heltec_Vision_Master_E213_base.lib_deps}
|
${Heltec_E213_base.lib_deps}
|
||||||
densaugeo/base64 @ ~1.4.0
|
densaugeo/base64 @ ~1.4.0
|
||||||
|
|
||||||
[env:Heltec_Vision_Master_E213_repeater]
|
[env:Heltec_E213_companion_radio_usb]
|
||||||
extends = Heltec_Vision_Master_E213_base
|
extends = Heltec_E213_base
|
||||||
build_flags =
|
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
|
||||||
|
-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_E213_base.lib_deps}
|
||||||
|
densaugeo/base64 @ ~1.4.0
|
||||||
|
|
||||||
|
[env:Heltec_E213_repeater]
|
||||||
|
extends = Heltec_E213_base
|
||||||
|
build_flags =
|
||||||
|
${Heltec_E213_base.build_flags}
|
||||||
-D DISPLAY_CLASS=E213Display
|
-D DISPLAY_CLASS=E213Display
|
||||||
-D ADVERT_NAME='"Heltec E213 Repeater"'
|
-D ADVERT_NAME='"Heltec E213 Repeater"'
|
||||||
-D ADVERT_LAT=0.0
|
-D ADVERT_LAT=0.0
|
||||||
-D ADVERT_LON=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>
|
+<helpers/ui/E213Display.cpp>
|
||||||
+<../examples/simple_repeater>
|
+<../examples/simple_repeater>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${Heltec_Vision_Master_E213_base.lib_deps}
|
${Heltec_E213_base.lib_deps}
|
||||||
${esp32_ota.lib_deps}
|
${esp32_ota.lib_deps}
|
||||||
|
|
||||||
[env:Heltec_Vision_Master_E213_room_server]
|
[env:Heltec_E213_room_server]
|
||||||
extends = Heltec_Vision_Master_E213_base
|
extends = Heltec_E213_base
|
||||||
build_flags =
|
build_flags =
|
||||||
${Heltec_Vision_Master_E213_base.build_flags}
|
${Heltec_E213_base.build_flags}
|
||||||
-D DISPLAY_CLASS=E213Display
|
-D DISPLAY_CLASS=E213Display
|
||||||
-D ADVERT_NAME='"Heltec E213 Room"'
|
-D ADVERT_NAME='"Heltec E213 Room"'
|
||||||
-D ADVERT_LAT=0.0
|
-D ADVERT_LAT=0.0
|
||||||
-D ADVERT_LON=0.0
|
-D ADVERT_LON=0.0
|
||||||
-D ADMIN_PASSWORD='"password"'
|
-D ADMIN_PASSWORD='"password"'
|
||||||
-D ROOM_PASSWORD='"hello"'
|
-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>
|
+<helpers/ui/E213Display.cpp>
|
||||||
+<../examples/simple_room_server>
|
+<../examples/simple_room_server>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${Heltec_Vision_Master_E213_base.lib_deps}
|
${Heltec_E213_base.lib_deps}
|
||||||
${esp32_ota.lib_deps}
|
${esp32_ota.lib_deps}
|
||||||
@@ -23,7 +23,7 @@ void HeltecE290Board::begin() {
|
|||||||
void HeltecE290Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
|
void HeltecE290Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
|
||||||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
|
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_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);
|
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
|
||||||
|
|
||||||
@@ -44,8 +44,7 @@ void HeltecE290Board::begin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HeltecE290Board::powerOff() {
|
void HeltecE290Board::powerOff() {
|
||||||
// TODO: re-enable this when there is a definite wake-up source pin:
|
enterDeepSleep(0);
|
||||||
// enterDeepSleep(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t HeltecE290Board::getBattMilliVolts() {
|
uint16_t HeltecE290Board::getBattMilliVolts() {
|
||||||
@@ -66,4 +65,3 @@ void HeltecE290Board::begin() {
|
|||||||
const char* HeltecE290Board::getManufacturerName() const {
|
const char* HeltecE290Board::getManufacturerName() const {
|
||||||
return "Heltec E290";
|
return "Heltec E290";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5,15 +5,6 @@
|
|||||||
#include <helpers/ESP32Board.h>
|
#include <helpers/ESP32Board.h>
|
||||||
#include <driver/rtc_io.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 {
|
class HeltecE290Board : public ESP32Board {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -1,13 +1,21 @@
|
|||||||
[Heltec_Vision_Master_E290_base]
|
[Heltec_E290_base]
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = heltec_vision_master_e290
|
board = heltec_e290
|
||||||
build_flags =
|
build_flags =
|
||||||
${esp32_base.build_flags}
|
${esp32_base.build_flags}
|
||||||
-I variants/heltec_vision_master_e290
|
-I variants/heltec_e290
|
||||||
-D HELTEC_VISION_MASTER_E290
|
-D Vision_Master_E290
|
||||||
|
-D ARDUINO_USB_CDC_ON_BOOT=1
|
||||||
-D RADIO_CLASS=CustomSX1262
|
-D RADIO_CLASS=CustomSX1262
|
||||||
-D WRAPPER_CLASS=CustomSX1262Wrapper
|
-D WRAPPER_CLASS=CustomSX1262Wrapper
|
||||||
-D LORA_TX_POWER=22
|
-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 P_LORA_TX_LED=45
|
||||||
-D PIN_USER_BTN=0
|
-D PIN_USER_BTN=0
|
||||||
-D PIN_VEXT_EN=18
|
-D PIN_VEXT_EN=18
|
||||||
@@ -20,17 +28,16 @@ build_flags =
|
|||||||
-D SX126X_RX_BOOSTED_GAIN=1
|
-D SX126X_RX_BOOSTED_GAIN=1
|
||||||
-D PIN_BOARD_SDA=39
|
-D PIN_BOARD_SDA=39
|
||||||
-D PIN_BOARD_SCL=38
|
-D PIN_BOARD_SCL=38
|
||||||
-D Vision_Master_E290
|
|
||||||
build_src_filter = ${esp32_base.build_src_filter}
|
build_src_filter = ${esp32_base.build_src_filter}
|
||||||
+<../variants/heltec_vision_master_e290>
|
+<../variants/heltec_e290>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${esp32_base.lib_deps}
|
${esp32_base.lib_deps}
|
||||||
https://github.com/Quency-D/heltec-eink-modules/archive/563dd41fd850a1bc3039b8723da4f3a20fe1c800.zip
|
https://github.com/Quency-D/heltec-eink-modules/archive/563dd41fd850a1bc3039b8723da4f3a20fe1c800.zip
|
||||||
|
|
||||||
[env:Heltec_Vision_Master_E290_radio_ble]
|
[env:Heltec_E290_companion_radio_ble]
|
||||||
extends = Heltec_Vision_Master_E290_base
|
extends = Heltec_E290_base
|
||||||
build_flags =
|
build_flags =
|
||||||
${Heltec_Vision_Master_E290_base.build_flags}
|
${Heltec_E290_base.build_flags}
|
||||||
-I examples/companion_radio/ui-new
|
-I examples/companion_radio/ui-new
|
||||||
-D MAX_CONTACTS=300
|
-D MAX_CONTACTS=300
|
||||||
-D MAX_GROUP_CHANNELS=8
|
-D MAX_GROUP_CHANNELS=8
|
||||||
@@ -38,43 +45,63 @@ build_flags =
|
|||||||
-D BLE_PIN_CODE=123456 ; dynamic, random PIN
|
-D BLE_PIN_CODE=123456 ; dynamic, random PIN
|
||||||
-D BLE_DEBUG_LOGGING=1
|
-D BLE_DEBUG_LOGGING=1
|
||||||
-D OFFLINE_QUEUE_SIZE=256
|
-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/ui/E290Display.cpp>
|
||||||
+<helpers/esp32/*.cpp>
|
+<helpers/esp32/*.cpp>
|
||||||
+<../examples/companion_radio/*.cpp>
|
+<../examples/companion_radio/*.cpp>
|
||||||
+<../examples/companion_radio/ui-new/*.cpp>
|
+<../examples/companion_radio/ui-new/*.cpp>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${Heltec_Vision_Master_E290_base.lib_deps}
|
${Heltec_E290_base.lib_deps}
|
||||||
densaugeo/base64 @ ~1.4.0
|
densaugeo/base64 @ ~1.4.0
|
||||||
|
|
||||||
[env:Heltec_Vision_Master_E290_repeater]
|
[env:Heltec_E290_companion_radio_usb]
|
||||||
extends = Heltec_Vision_Master_E290_base
|
extends = Heltec_E290_base
|
||||||
build_flags =
|
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
|
||||||
|
-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_repeater]
|
||||||
|
extends = Heltec_E290_base
|
||||||
|
build_flags =
|
||||||
|
${Heltec_E290_base.build_flags}
|
||||||
-D DISPLAY_CLASS=E290Display
|
-D DISPLAY_CLASS=E290Display
|
||||||
-D ADVERT_NAME='"Heltec E290 Repeater"'
|
-D ADVERT_NAME='"Heltec E290 Repeater"'
|
||||||
-D ADVERT_LAT=0.0
|
-D ADVERT_LAT=0.0
|
||||||
-D ADVERT_LON=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>
|
+<helpers/ui/E290Display.cpp>
|
||||||
+<../examples/simple_repeater>
|
+<../examples/simple_repeater>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${Heltec_Vision_Master_E290_base.lib_deps}
|
${Heltec_E290_base.lib_deps}
|
||||||
${esp32_ota.lib_deps}
|
${esp32_ota.lib_deps}
|
||||||
|
|
||||||
[env:Heltec_Vision_Master_E290_room_server]
|
[env:Heltec_E290_room_server]
|
||||||
extends = Heltec_Vision_Master_E290_base
|
extends = Heltec_E290_base
|
||||||
build_flags =
|
build_flags =
|
||||||
${Heltec_Vision_Master_E290_base.build_flags}
|
${Heltec_E290_base.build_flags}
|
||||||
-D DISPLAY_CLASS=E290Display
|
-D DISPLAY_CLASS=E290Display
|
||||||
-D ADVERT_NAME='"Heltec E290 Room"'
|
-D ADVERT_NAME='"Heltec E290 Room"'
|
||||||
-D ADVERT_LAT=0.0
|
-D ADVERT_LAT=0.0
|
||||||
-D ADVERT_LON=0.0
|
-D ADVERT_LON=0.0
|
||||||
-D ADMIN_PASSWORD='"password"'
|
-D ADMIN_PASSWORD='"password"'
|
||||||
-D ROOM_PASSWORD='"hello"'
|
-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>
|
+<helpers/ui/E290Display.cpp>
|
||||||
+<../examples/simple_room_server>
|
+<../examples/simple_room_server>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${Heltec_Vision_Master_E290_base.lib_deps}
|
${Heltec_E290_base.lib_deps}
|
||||||
${esp32_ota.lib_deps}
|
${esp32_ota.lib_deps}
|
||||||
@@ -23,7 +23,7 @@ void HeltecT190Board::begin() {
|
|||||||
void HeltecT190Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
|
void HeltecT190Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
|
||||||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
|
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_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);
|
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
|
||||||
|
|
||||||
@@ -44,8 +44,7 @@ void HeltecT190Board::begin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HeltecT190Board::powerOff() {
|
void HeltecT190Board::powerOff() {
|
||||||
// TODO: re-enable this when there is a definite wake-up source pin:
|
enterDeepSleep(0);
|
||||||
// enterDeepSleep(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t HeltecT190Board::getBattMilliVolts() {
|
uint16_t HeltecT190Board::getBattMilliVolts() {
|
||||||
@@ -66,4 +65,3 @@ void HeltecT190Board::begin() {
|
|||||||
const char* HeltecT190Board::getManufacturerName() const {
|
const char* HeltecT190Board::getManufacturerName() const {
|
||||||
return "Heltec T190";
|
return "Heltec T190";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5,15 +5,6 @@
|
|||||||
#include <helpers/ESP32Board.h>
|
#include <helpers/ESP32Board.h>
|
||||||
#include <driver/rtc_io.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 {
|
class HeltecT190Board : public ESP32Board {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -1,13 +1,20 @@
|
|||||||
[Heltec_Vision_Master_T190_base]
|
[Heltec_T190_base]
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board = heltec_vision_master_t190
|
board = heltec_t190
|
||||||
build_flags =
|
build_flags =
|
||||||
${esp32_base.build_flags}
|
${esp32_base.build_flags}
|
||||||
-I variants/heltec_vision_master_t190
|
-I variants/heltec_t190
|
||||||
-I src/helpers/ui
|
-I src/helpers/ui
|
||||||
-D HELTEC_VISION_MASTER_T190
|
-D HELTEC_VISION_MASTER_T190
|
||||||
-D RADIO_CLASS=CustomSX1262
|
-D RADIO_CLASS=CustomSX1262
|
||||||
-D WRAPPER_CLASS=CustomSX1262Wrapper
|
-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 LORA_TX_POWER=22
|
||||||
-D PIN_USER_BTN=0
|
-D PIN_USER_BTN=0
|
||||||
-D PIN_VEXT_EN=5
|
-D PIN_VEXT_EN=5
|
||||||
@@ -31,7 +38,7 @@ build_flags =
|
|||||||
-D ST7789
|
-D ST7789
|
||||||
-D DISPLAY_CLASS=ST7789Display
|
-D DISPLAY_CLASS=ST7789Display
|
||||||
build_src_filter = ${esp32_base.build_src_filter}
|
build_src_filter = ${esp32_base.build_src_filter}
|
||||||
+<../variants/heltec_vision_master_t190>
|
+<../variants/heltec_t190>
|
||||||
+<helpers/*.cpp>
|
+<helpers/*.cpp>
|
||||||
+<helpers/ui/ST7789Display.cpp>
|
+<helpers/ui/ST7789Display.cpp>
|
||||||
+<helpers/ui/OLEDDisplay.cpp>
|
+<helpers/ui/OLEDDisplay.cpp>
|
||||||
@@ -40,48 +47,64 @@ lib_deps =
|
|||||||
${esp32_base.lib_deps}
|
${esp32_base.lib_deps}
|
||||||
adafruit/Adafruit GFX Library @ ^1.12.1
|
adafruit/Adafruit GFX Library @ ^1.12.1
|
||||||
|
|
||||||
[env:Heltec_Vision_Master_T190_radio_ble]
|
[env:Heltec_T190_companion_radio_ble]
|
||||||
extends = Heltec_Vision_Master_T190_base
|
extends = Heltec_T190_base
|
||||||
build_flags =
|
build_flags =
|
||||||
${Heltec_Vision_Master_T190_base.build_flags}
|
${Heltec_T190_base.build_flags}
|
||||||
-I examples/companion_radio/ui-new
|
-I examples/companion_radio/ui-new
|
||||||
-D MAX_CONTACTS=300
|
-D MAX_CONTACTS=300
|
||||||
-D MAX_GROUP_CHANNELS=8
|
-D MAX_GROUP_CHANNELS=8
|
||||||
-D BLE_PIN_CODE=123456 ; dynamic, random PIN
|
-D BLE_PIN_CODE=123456 ; dynamic, random PIN
|
||||||
-D BLE_DEBUG_LOGGING=1
|
-D BLE_DEBUG_LOGGING=1
|
||||||
-D OFFLINE_QUEUE_SIZE=256
|
-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>
|
+<helpers/esp32/*.cpp>
|
||||||
+<../examples/companion_radio/*.cpp>
|
+<../examples/companion_radio/*.cpp>
|
||||||
+<../examples/companion_radio/ui-new/*.cpp>
|
+<../examples/companion_radio/ui-new/*.cpp>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${Heltec_Vision_Master_T190_base.lib_deps}
|
${Heltec_T190_base.lib_deps}
|
||||||
densaugeo/base64 @ ~1.4.0
|
densaugeo/base64 @ ~1.4.0
|
||||||
|
|
||||||
[env:Heltec_Vision_Master_T190_repeater]
|
[env:Heltec_T190_companion_radio_usb]
|
||||||
extends = Heltec_Vision_Master_T190_base
|
extends = Heltec_T190_base
|
||||||
build_flags =
|
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_NAME='"Heltec T190 Repeater"'
|
||||||
-D ADVERT_LAT=0.0
|
-D ADVERT_LAT=0.0
|
||||||
-D ADVERT_LON=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>
|
+<../examples/simple_repeater>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${Heltec_Vision_Master_T190_base.lib_deps}
|
${Heltec_T190_base.lib_deps}
|
||||||
${esp32_ota.lib_deps}
|
${esp32_ota.lib_deps}
|
||||||
|
|
||||||
[env:Heltec_Vision_Master_T190_room_server]
|
[env:Heltec_T190_room_server]
|
||||||
extends = Heltec_Vision_Master_T190_base
|
extends = Heltec_T190_base
|
||||||
build_flags =
|
build_flags =
|
||||||
${Heltec_Vision_Master_T190_base.build_flags}
|
${Heltec_T190_base.build_flags}
|
||||||
-D ADVERT_NAME='"Heltec T190 Room"'
|
-D ADVERT_NAME='"Heltec T190 Room"'
|
||||||
-D ADVERT_LAT=0.0
|
-D ADVERT_LAT=0.0
|
||||||
-D ADVERT_LON=0.0
|
-D ADVERT_LON=0.0
|
||||||
-D ADMIN_PASSWORD='"password"'
|
-D ADMIN_PASSWORD='"password"'
|
||||||
-D ROOM_PASSWORD='"hello"'
|
-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>
|
+<../examples/simple_room_server>
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${Heltec_Vision_Master_T190_base.lib_deps}
|
${Heltec_T190_base.lib_deps}
|
||||||
${esp32_ota.lib_deps}
|
${esp32_ota.lib_deps}
|
||||||
@@ -60,6 +60,10 @@ public:
|
|||||||
void reboot() override {
|
void reboot() override {
|
||||||
NVIC_SystemReset();
|
NVIC_SystemReset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void powerOff() override {
|
||||||
|
sd_power_system_off();
|
||||||
|
}
|
||||||
|
|
||||||
bool startOTAUpdate(const char* id, char reply[]) override;
|
bool startOTAUpdate(const char* id, char reply[]) override;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -74,10 +74,12 @@ build_flags =
|
|||||||
-D MAX_CONTACTS=100
|
-D MAX_CONTACTS=100
|
||||||
-D MAX_GROUP_CHANNELS=8
|
-D MAX_GROUP_CHANNELS=8
|
||||||
-D BLE_PIN_CODE=123456
|
-D BLE_PIN_CODE=123456
|
||||||
-D BLE_DEBUG_LOGGING=1
|
; -D BLE_DEBUG_LOGGING=1
|
||||||
-D DISPLAY_CLASS=GxEPDDisplay
|
-D DISPLAY_CLASS=GxEPDDisplay
|
||||||
-D OFFLINE_QUEUE_SIZE=256
|
-D OFFLINE_QUEUE_SIZE=256
|
||||||
-D UI_RECENT_LIST_SIZE=9
|
-D UI_RECENT_LIST_SIZE=9
|
||||||
|
-D BACKLIGHT_BTN=PIN_BUTTON2
|
||||||
|
-D AUTO_OFF_MILLIS=0
|
||||||
; -D MESH_PACKET_LOGGING=1
|
; -D MESH_PACKET_LOGGING=1
|
||||||
; -D MESH_DEBUG=1
|
; -D MESH_DEBUG=1
|
||||||
build_src_filter = ${LilyGo_Techo.build_src_filter}
|
build_src_filter = ${LilyGo_Techo.build_src_filter}
|
||||||
@@ -91,3 +93,4 @@ lib_deps =
|
|||||||
${LilyGo_Techo.lib_deps}
|
${LilyGo_Techo.lib_deps}
|
||||||
densaugeo/base64 @ ~1.4.0
|
densaugeo/base64 @ ~1.4.0
|
||||||
zinggjm/GxEPD2 @ 1.6.2
|
zinggjm/GxEPD2 @ 1.6.2
|
||||||
|
bakercp/CRC32 @ ^2.0.0
|
||||||
|
|||||||
Reference in New Issue
Block a user