Merge branch 'dev' into analog-button

This commit is contained in:
JQ 2025-06-19 21:50:16 -07:00
commit cdca6fa52a
11 changed files with 47 additions and 80 deletions

View file

@ -50,9 +50,12 @@ void Button::update() {
triggerEvent(SHORT_PRESS); triggerEvent(SHORT_PRESS);
} else if (_clickCount == 2) { } else if (_clickCount == 2) {
triggerEvent(DOUBLE_PRESS); triggerEvent(DOUBLE_PRESS);
} else if (_clickCount >= 3) { } else if (_clickCount == 3) {
triggerEvent(TRIPLE_PRESS); triggerEvent(TRIPLE_PRESS);
} else if (_clickCount >= 4) {
triggerEvent(QUADRUPLE_PRESS);
} }
_clickCount = 0; _clickCount = 0;
_state = IDLE; _state = IDLE;
} }
@ -116,6 +119,9 @@ void Button::triggerEvent(EventType event) {
case TRIPLE_PRESS: case TRIPLE_PRESS:
if (_onTriplePress) _onTriplePress(); if (_onTriplePress) _onTriplePress();
break; break;
case QUADRUPLE_PRESS:
if (_onQuadruplePress) _onQuadruplePress();
break;
case LONG_PRESS: case LONG_PRESS:
if (_onLongPress) _onLongPress(); if (_onLongPress) _onLongPress();
break; break;

View file

@ -16,6 +16,7 @@ public:
SHORT_PRESS, SHORT_PRESS,
DOUBLE_PRESS, DOUBLE_PRESS,
TRIPLE_PRESS, TRIPLE_PRESS,
QUADRUPLE_PRESS,
LONG_PRESS, LONG_PRESS,
ANY_PRESS ANY_PRESS
}; };
@ -32,6 +33,7 @@ public:
void onShortPress(EventCallback callback) { _onShortPress = callback; } void onShortPress(EventCallback callback) { _onShortPress = callback; }
void onDoublePress(EventCallback callback) { _onDoublePress = callback; } void onDoublePress(EventCallback callback) { _onDoublePress = callback; }
void onTriplePress(EventCallback callback) { _onTriplePress = callback; } void onTriplePress(EventCallback callback) { _onTriplePress = callback; }
void onQuadruplePress(EventCallback callback) { _onQuadruplePress = callback; }
void onLongPress(EventCallback callback) { _onLongPress = callback; } void onLongPress(EventCallback callback) { _onLongPress = callback; }
void onAnyPress(EventCallback callback) { _onAnyPress = callback; } void onAnyPress(EventCallback callback) { _onAnyPress = callback; }
@ -68,6 +70,7 @@ private:
EventCallback _onShortPress = nullptr; EventCallback _onShortPress = nullptr;
EventCallback _onDoublePress = nullptr; EventCallback _onDoublePress = nullptr;
EventCallback _onTriplePress = nullptr; EventCallback _onTriplePress = nullptr;
EventCallback _onQuadruplePress = nullptr;
EventCallback _onLongPress = nullptr; EventCallback _onLongPress = nullptr;
EventCallback _onAnyPress = nullptr; EventCallback _onAnyPress = nullptr;

View file

@ -34,8 +34,9 @@ static const uint8_t meshcore_logo [] PROGMEM = {
0xe3, 0xe3, 0x8f, 0xff, 0x1f, 0xfc, 0x3c, 0x0e, 0x1f, 0xf8, 0xff, 0xf8, 0x70, 0x3c, 0x7f, 0xf8, 0xe3, 0xe3, 0x8f, 0xff, 0x1f, 0xfc, 0x3c, 0x0e, 0x1f, 0xf8, 0xff, 0xf8, 0x70, 0x3c, 0x7f, 0xf8,
}; };
void UITask::begin(DisplayDriver* display, NodePrefs* node_prefs) { void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* node_prefs) {
_display = display; _display = display;
_sensors = sensors;
_auto_off = millis() + AUTO_OFF_MILLIS; _auto_off = millis() + AUTO_OFF_MILLIS;
clearMsgPreview(); clearMsgPreview();
_node_prefs = node_prefs; _node_prefs = node_prefs;
@ -67,6 +68,7 @@ void UITask::begin(DisplayDriver* display, NodePrefs* node_prefs) {
_userButton->onShortPress([this]() { handleButtonShortPress(); }); _userButton->onShortPress([this]() { handleButtonShortPress(); });
_userButton->onDoublePress([this]() { handleButtonDoublePress(); }); _userButton->onDoublePress([this]() { handleButtonDoublePress(); });
_userButton->onTriplePress([this]() { handleButtonTriplePress(); }); _userButton->onTriplePress([this]() { handleButtonTriplePress(); });
_userButton->onQuadruplePress([this]() { handleButtonQuadruplePress(); });
_userButton->onLongPress([this]() { handleButtonLongPress(); }); _userButton->onLongPress([this]() { handleButtonLongPress(); });
_userButton->onAnyPress([this]() { handleButtonAnyPress(); }); _userButton->onAnyPress([this]() { handleButtonAnyPress(); });
#endif #endif
@ -396,6 +398,25 @@ void UITask::handleButtonTriplePress() {
#endif #endif
} }
void UITask::handleButtonQuadruplePress() {
MESH_DEBUG_PRINTLN("UITask: quad press triggered");
if (_sensors != NULL) {
// toggle GPS onn/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");
} else {
_sensors->setSettingValue("gps", "1");
}
break;
}
}
}
_need_refresh = true;
}
void UITask::handleButtonLongPress() { void UITask::handleButtonLongPress() {
MESH_DEBUG_PRINTLN("UITask: long press triggered"); MESH_DEBUG_PRINTLN("UITask: long press triggered");
if (millis() - ui_started_at < 8000) { // long press in first 8 seconds since startup -> CLI/rescue if (millis() - ui_started_at < 8000) { // long press in first 8 seconds since startup -> CLI/rescue

View file

@ -2,6 +2,7 @@
#include <MeshCore.h> #include <MeshCore.h>
#include <helpers/ui/DisplayDriver.h> #include <helpers/ui/DisplayDriver.h>
#include <helpers/SensorManager.h>
#include <stddef.h> #include <stddef.h>
#ifdef PIN_BUZZER #ifdef PIN_BUZZER
@ -24,6 +25,7 @@
class UITask { class UITask {
DisplayDriver* _display; DisplayDriver* _display;
mesh::MainBoard* _board; mesh::MainBoard* _board;
SensorManager* _sensors;
#ifdef PIN_BUZZER #ifdef PIN_BUZZER
genericBuzzer buzzer; genericBuzzer buzzer;
#endif #endif
@ -56,17 +58,18 @@ class UITask {
void handleButtonShortPress(); void handleButtonShortPress();
void handleButtonDoublePress(); void handleButtonDoublePress();
void handleButtonTriplePress(); void handleButtonTriplePress();
void handleButtonQuadruplePress();
void handleButtonLongPress(); void handleButtonLongPress();
public: public:
UITask(mesh::MainBoard* board) : _board(board), _display(NULL) { UITask(mesh::MainBoard* board) : _board(board), _display(NULL), _sensors(NULL) {
_next_refresh = 0; _next_refresh = 0;
ui_started_at = 0; ui_started_at = 0;
_connected = false; _connected = false;
} }
void begin(DisplayDriver* display, NodePrefs* node_prefs); void begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* node_prefs);
void setHasConnection(bool connected) { _connected = connected; } void setHasConnection(bool connected) { _connected = connected; }
bool hasDisplay() const { return _display != NULL; } bool hasDisplay() const { return _display != NULL; }

View file

@ -186,7 +186,7 @@ void setup() {
sensors.begin(); sensors.begin();
#ifdef DISPLAY_CLASS #ifdef DISPLAY_CLASS
ui_task.begin(disp, the_mesh.getNodePrefs()); // still want to pass this in as dependency, as prefs might be moved ui_task.begin(disp, &sensors, the_mesh.getNodePrefs()); // still want to pass this in as dependency, as prefs might be moved
#endif #endif
} }

View file

@ -30,6 +30,12 @@ class CustomSX1262 : public SX1262 {
#endif #endif
#endif #endif
int status = begin(LORA_FREQ, LORA_BW, LORA_SF, cr, RADIOLIB_SX126X_SYNC_WORD_PRIVATE, LORA_TX_POWER, 8, tcxo); int status = begin(LORA_FREQ, LORA_BW, LORA_SF, cr, RADIOLIB_SX126X_SYNC_WORD_PRIVATE, LORA_TX_POWER, 8, tcxo);
// if radio init fails with -707/-706, try again with tcxo voltage set to 0.0f
if (status == RADIOLIB_ERR_SPI_CMD_FAILED || status == RADIOLIB_ERR_SPI_CMD_INVALID) {
#define SX126X_DIO3_TCXO_VOLTAGE (0.0f);
tcxo = SX126X_DIO3_TCXO_VOLTAGE;
status = begin(LORA_FREQ, LORA_BW, LORA_SF, cr, RADIOLIB_SX126X_SYNC_WORD_PRIVATE, LORA_TX_POWER, 8, tcxo);
}
if (status != RADIOLIB_ERR_NONE) { if (status != RADIOLIB_ERR_NONE) {
Serial.print("ERROR: radio init failed: "); Serial.print("ERROR: radio init failed: ");
Serial.println(status); Serial.println(status);

View file

@ -2,9 +2,6 @@
#include "target.h" #include "target.h"
#include <helpers/ArduinoHelpers.h> #include <helpers/ArduinoHelpers.h>
#if ENV_INCLUDE_GPS
#endif
PromicroBoard board; PromicroBoard board;
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI); RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI);
@ -25,47 +22,10 @@ AutoDiscoverRTCClock rtc_clock(fallback_clock);
DISPLAY_CLASS display; DISPLAY_CLASS display;
#endif #endif
#ifndef LORA_CR
#define LORA_CR 5
#endif
bool radio_init() { bool radio_init() {
rtc_clock.begin(Wire); rtc_clock.begin(Wire);
#ifdef SX126X_DIO3_TCXO_VOLTAGE return radio.std_init(&SPI);
float tcxo = SX126X_DIO3_TCXO_VOLTAGE;
#else
float tcxo = 1.6f;
#endif
SPI.setPins(P_LORA_MISO, P_LORA_SCLK, P_LORA_MOSI);
SPI.begin();
radio.setRfSwitchPins(SX126X_RXEN, SX126X_TXEN);
int status = radio.begin(LORA_FREQ, LORA_BW, LORA_SF, LORA_CR, RADIOLIB_SX126X_SYNC_WORD_PRIVATE, LORA_TX_POWER, 8, tcxo);
if (status == RADIOLIB_ERR_SPI_CMD_FAILED || status == RADIOLIB_ERR_SPI_CMD_INVALID) {
#define SX126X_DIO3_TCXO_VOLTAGE (0.0f);
tcxo = SX126X_DIO3_TCXO_VOLTAGE;
status = radio.begin(LORA_FREQ, LORA_BW, LORA_SF, LORA_CR, RADIOLIB_SX126X_SYNC_WORD_PRIVATE, LORA_TX_POWER, 8, tcxo);
}
if (status != RADIOLIB_ERR_NONE) {
Serial.print("ERROR: radio init failed: ");
Serial.println(status);
return false; // fail
}
radio.setCRC(1);
#ifdef SX126X_CURRENT_LIMIT
radio.setCurrentLimit(SX126X_CURRENT_LIMIT);
#endif
#ifdef SX126X_DIO2_AS_RF_SWITCH
radio.setDio2AsRfSwitch(SX126X_DIO2_AS_RF_SWITCH);
#endif
#ifdef SX126X_RX_BOOSTED_GAIN
radio.setRxBoostedGainMode(SX126X_RX_BOOSTED_GAIN);
#endif
return true; // success
} }
uint32_t radio_get_rng_seed() { uint32_t radio_get_rng_seed() {

View file

@ -3,7 +3,7 @@
#define RADIOLIB_STATIC_ONLY 1 #define RADIOLIB_STATIC_ONLY 1
#include <RadioLib.h> #include <RadioLib.h>
#include <helpers/RadioLibWrappers.h> #include <helpers/RadioLibWrappers.h>
#include <helpers/nrf52/T1000eBoard.h> #include "T1000eBoard.h"
#include <helpers/CustomLR1110Wrapper.h> #include <helpers/CustomLR1110Wrapper.h>
#include <helpers/ArduinoHelpers.h> #include <helpers/ArduinoHelpers.h>
#include <helpers/SensorManager.h> #include <helpers/SensorManager.h>

View file

@ -18,41 +18,9 @@ ThinkNodeM1SensorManager sensors = ThinkNodeM1SensorManager(nmea);
DISPLAY_CLASS display; DISPLAY_CLASS display;
#endif #endif
#ifndef LORA_CR
#define LORA_CR 5
#endif
bool radio_init() { bool radio_init() {
rtc_clock.begin(Wire); rtc_clock.begin(Wire);
return radio.std_init(&SPI);
#ifdef SX126X_DIO3_TCXO_VOLTAGE
float tcxo = SX126X_DIO3_TCXO_VOLTAGE;
#else
float tcxo = 1.6f;
#endif
SPI.setPins(P_LORA_MISO, P_LORA_SCLK, P_LORA_MOSI);
SPI.begin();
int status = radio.begin(LORA_FREQ, LORA_BW, LORA_SF, LORA_CR, RADIOLIB_SX126X_SYNC_WORD_PRIVATE, LORA_TX_POWER, 8, tcxo);
if (status != RADIOLIB_ERR_NONE) {
Serial.print("ERROR: radio init failed: ");
Serial.println(status);
return false; // fail
}
radio.setCRC(1);
#ifdef SX126X_CURRENT_LIMIT
radio.setCurrentLimit(SX126X_CURRENT_LIMIT);
#endif
#ifdef SX126X_DIO2_AS_RF_SWITCH
radio.setDio2AsRfSwitch(SX126X_DIO2_AS_RF_SWITCH);
#endif
#ifdef SX126X_RX_BOOSTED_GAIN
radio.setRxBoostedGainMode(SX126X_RX_BOOSTED_GAIN);
#endif
return true; // success
} }
uint32_t radio_get_rng_seed() { uint32_t radio_get_rng_seed() {