Merge branch 'dev'

This commit is contained in:
Scott Powell 2025-09-01 19:32:54 +10:00
commit 1130cf13ab
20 changed files with 134 additions and 30 deletions

View file

@ -8,11 +8,11 @@
#define FIRMWARE_VER_CODE 7 #define FIRMWARE_VER_CODE 7
#ifndef FIRMWARE_BUILD_DATE #ifndef FIRMWARE_BUILD_DATE
#define FIRMWARE_BUILD_DATE "31 Aug 2025" #define FIRMWARE_BUILD_DATE "1 Sep 2025"
#endif #endif
#ifndef FIRMWARE_VERSION #ifndef FIRMWARE_VERSION
#define FIRMWARE_VERSION "v1.8.0" #define FIRMWARE_VERSION "v1.8.1"
#endif #endif
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)

View file

@ -354,6 +354,9 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no
#if defined(PIN_USER_BTN) #if defined(PIN_USER_BTN)
user_btn.begin(); user_btn.begin();
#endif #endif
#if defined(PIN_USER_BTN_ANA)
analog_btn.begin();
#endif
_node_prefs = node_prefs; _node_prefs = node_prefs;
if (_display != NULL) { if (_display != NULL) {
@ -508,6 +511,14 @@ void UITask::loop() {
c = handleLongPress(KEY_RIGHT); c = handleLongPress(KEY_RIGHT);
} }
#endif #endif
#if defined(PIN_USER_BTN_ANA)
ev = analog_btn.check();
if (ev == BUTTON_EVENT_CLICK) {
c = checkDisplayOn(KEY_SELECT);
} else if (ev == BUTTON_EVENT_LONG_PRESS) {
c = handleLongPress(KEY_ENTER);
}
#endif
if (c != 0 && curr) { if (c != 0 && curr) {
curr->handleInput(c); curr->handleInput(c);

View file

@ -22,11 +22,11 @@
/* ------------------------------ Config -------------------------------- */ /* ------------------------------ Config -------------------------------- */
#ifndef FIRMWARE_BUILD_DATE #ifndef FIRMWARE_BUILD_DATE
#define FIRMWARE_BUILD_DATE "31 Aug 2025" #define FIRMWARE_BUILD_DATE "1 Sep 2025"
#endif #endif
#ifndef FIRMWARE_VERSION #ifndef FIRMWARE_VERSION
#define FIRMWARE_VERSION "v1.8.0" #define FIRMWARE_VERSION "v1.8.1"
#endif #endif
#ifndef LORA_FREQ #ifndef LORA_FREQ
@ -732,6 +732,20 @@ public:
mesh::LocalIdentity& getSelfId() override { return self_id; } mesh::LocalIdentity& getSelfId() override { return self_id; }
void saveIdentity(const mesh::LocalIdentity& new_id) override {
self_id = new_id;
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
IdentityStore store(*_fs, "");
#elif defined(ESP32)
IdentityStore store(*_fs, "/identity");
#elif defined(RP2040_PLATFORM)
IdentityStore store(*_fs, "/identity");
#else
#error "need to define saveIdentity()"
#endif
store.save("_main", self_id);
}
void clearStats() override { void clearStats() override {
radio_driver.resetStats(); radio_driver.resetStats();
resetStats(); resetStats();

View file

@ -22,11 +22,11 @@
/* ------------------------------ Config -------------------------------- */ /* ------------------------------ Config -------------------------------- */
#ifndef FIRMWARE_BUILD_DATE #ifndef FIRMWARE_BUILD_DATE
#define FIRMWARE_BUILD_DATE "31 Aug 2025" #define FIRMWARE_BUILD_DATE "1 Sep 2025"
#endif #endif
#ifndef FIRMWARE_VERSION #ifndef FIRMWARE_VERSION
#define FIRMWARE_VERSION "v1.8.0" #define FIRMWARE_VERSION "v1.8.1"
#endif #endif
#ifndef LORA_FREQ #ifndef LORA_FREQ
@ -865,6 +865,20 @@ public:
mesh::LocalIdentity& getSelfId() override { return self_id; } mesh::LocalIdentity& getSelfId() override { return self_id; }
void saveIdentity(const mesh::LocalIdentity& new_id) override {
self_id = new_id;
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
IdentityStore store(*_fs, "");
#elif defined(ESP32)
IdentityStore store(*_fs, "/identity");
#elif defined(RP2040_PLATFORM)
IdentityStore store(*_fs, "/identity");
#else
#error "need to define saveIdentity()"
#endif
store.save("_main", self_id);
}
void clearStats() override { void clearStats() override {
radio_driver.resetStats(); radio_driver.resetStats();
resetStats(); resetStats();

View file

@ -837,6 +837,20 @@ bool SensorMesh::formatFileSystem() {
#endif #endif
} }
void SensorMesh::saveIdentity(const mesh::LocalIdentity& new_id) {
self_id = new_id;
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
IdentityStore store(*_fs, "");
#elif defined(ESP32)
IdentityStore store(*_fs, "/identity");
#elif defined(RP2040_PLATFORM)
IdentityStore store(*_fs, "/identity");
#else
#error "need to define saveIdentity()"
#endif
store.save("_main", self_id);
}
void SensorMesh::applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) { void SensorMesh::applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) {
set_radio_at = futureMillis(2000); // give CLI reply some time to be sent back, before applying temp radio params set_radio_at = futureMillis(2000); // give CLI reply some time to be sent back, before applying temp radio params
pending_freq = freq; pending_freq = freq;

View file

@ -49,11 +49,11 @@ struct ContactInfo {
}; };
#ifndef FIRMWARE_BUILD_DATE #ifndef FIRMWARE_BUILD_DATE
#define FIRMWARE_BUILD_DATE "31 Aug 2025" #define FIRMWARE_BUILD_DATE "1 Sep 2025"
#endif #endif
#ifndef FIRMWARE_VERSION #ifndef FIRMWARE_VERSION
#define FIRMWARE_VERSION "v1.8.0" #define FIRMWARE_VERSION "v1.8.1"
#endif #endif
#define FIRMWARE_ROLE "sensor" #define FIRMWARE_ROLE "sensor"
@ -89,6 +89,7 @@ public:
strcpy(reply, "not supported"); strcpy(reply, "not supported");
} }
mesh::LocalIdentity& getSelfId() override { return self_id; } mesh::LocalIdentity& getSelfId() override { return self_id; }
void saveIdentity(const mesh::LocalIdentity& new_id) override;
void clearStats() override { } void clearStats() override { }
void applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) override; void applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) override;

View file

@ -1,6 +1,6 @@
{ {
"name": "MeshCore", "name": "MeshCore",
"version" : "1.7.4", "version" : "1.8.0",
"dependencies": { "dependencies": {
"SPI": "*", "SPI": "*",
"Wire": "*", "Wire": "*",

View file

@ -53,7 +53,7 @@ build_src_filter =
[esp32_base] [esp32_base]
extends = arduino_base extends = arduino_base
platform = platformio/espressif32@^6.11.0 platform = platformio/espressif32@6.11.0
monitor_filters = esp32_exception_decoder monitor_filters = esp32_exception_decoder
extra_scripts = merge-bin.py extra_scripts = merge-bin.py
build_flags = ${arduino_base.build_flags} build_flags = ${arduino_base.build_flags}

View file

@ -305,7 +305,9 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
uint8_t prv_key[PRV_KEY_SIZE]; uint8_t prv_key[PRV_KEY_SIZE];
bool success = mesh::Utils::fromHex(prv_key, PRV_KEY_SIZE, &config[8]); bool success = mesh::Utils::fromHex(prv_key, PRV_KEY_SIZE, &config[8]);
if (success) { if (success) {
_callbacks->getSelfId().readFrom(prv_key, PRV_KEY_SIZE); mesh::LocalIdentity new_id;
new_id.readFrom(prv_key, PRV_KEY_SIZE);
_callbacks->saveIdentity(new_id);
strcpy(reply, "OK"); strcpy(reply, "OK");
} else { } else {
strcpy(reply, "Error, invalid key"); strcpy(reply, "Error, invalid key");

View file

@ -47,6 +47,7 @@ public:
// no op by default // no op by default
}; };
virtual mesh::LocalIdentity& getSelfId() = 0; virtual mesh::LocalIdentity& getSelfId() = 0;
virtual void saveIdentity(const mesh::LocalIdentity& new_id) = 0;
virtual void clearStats() = 0; virtual void clearStats() = 0;
virtual void applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) = 0; virtual void applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) = 0;
}; };

View file

@ -8,16 +8,29 @@ MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, bool reverse
prev = _reverse ? HIGH : LOW; prev = _reverse ? HIGH : LOW;
cancel = 0; cancel = 0;
_long_millis = long_press_millis; _long_millis = long_press_millis;
_threshold = 0;
}
MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, int analog_threshold) {
_pin = pin;
_reverse = false;
_pull = false;
down_at = 0;
prev = LOW;
cancel = 0;
_long_millis = long_press_millis;
_threshold = analog_threshold;
} }
void MomentaryButton::begin() { void MomentaryButton::begin() {
if (_pin >= 0) { if (_pin >= 0 && _threshold == 0) {
pinMode(_pin, _pull ? (_reverse ? INPUT_PULLUP : INPUT_PULLDOWN) : INPUT); pinMode(_pin, _pull ? (_reverse ? INPUT_PULLUP : INPUT_PULLDOWN) : INPUT);
} }
} }
bool MomentaryButton::isPressed() const { bool MomentaryButton::isPressed() const {
return isPressed(digitalRead(_pin)); int btn = _threshold > 0 ? (analogRead(_pin) < _threshold) : digitalRead(_pin);
return isPressed(btn);
} }
void MomentaryButton::cancelClick() { void MomentaryButton::cancelClick() {
@ -25,6 +38,9 @@ void MomentaryButton::cancelClick() {
} }
bool MomentaryButton::isPressed(int level) const { bool MomentaryButton::isPressed(int level) const {
if (_threshold > 0) {
return level;
}
if (_reverse) { if (_reverse) {
return level == LOW; return level == LOW;
} else { } else {
@ -36,7 +52,7 @@ int MomentaryButton::check(bool repeat_click) {
if (_pin < 0) return BUTTON_EVENT_NONE; if (_pin < 0) return BUTTON_EVENT_NONE;
int event = BUTTON_EVENT_NONE; int event = BUTTON_EVENT_NONE;
int btn = digitalRead(_pin); int btn = _threshold > 0 ? (analogRead(_pin) < _threshold) : digitalRead(_pin);
if (btn != prev) { if (btn != prev) {
if (isPressed(btn)) { if (isPressed(btn)) {
down_at = millis(); down_at = millis();

View file

@ -11,12 +11,14 @@ class MomentaryButton {
int8_t prev, cancel; int8_t prev, cancel;
bool _reverse, _pull; bool _reverse, _pull;
int _long_millis; int _long_millis;
int _threshold; // analog mode
unsigned long down_at; unsigned long down_at;
bool isPressed(int level) const; bool isPressed(int level) const;
public: public:
MomentaryButton(int8_t pin, int long_press_mills=0, bool reverse=false, bool pulldownup=false); MomentaryButton(int8_t pin, int long_press_mills=0, bool reverse=false, bool pulldownup=false);
MomentaryButton(int8_t pin, int long_press_mills, int analog_threshold);
void begin(); void begin();
int check(bool repeat_click=false); // returns one of BUTTON_EVENT_* int check(bool repeat_click=false); // returns one of BUTTON_EVENT_*
void cancelClick(); // suppress next BUTTON_EVENT_CLICK (if already in DOWN state) void cancelClick(); // suppress next BUTTON_EVENT_CLICK (if already in DOWN state)

View file

@ -64,7 +64,7 @@ lib_deps =
extends = Heltec_lora32_v2 extends = Heltec_lora32_v2
build_flags = build_flags =
${Heltec_lora32_v2.build_flags} ${Heltec_lora32_v2.build_flags}
-D MAX_CONTACTS=100 -D MAX_CONTACTS=170
-D MAX_GROUP_CHANNELS=1 -D MAX_GROUP_CHANNELS=1
; -D MESH_PACKET_LOGGING=1 ; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1 ; -D MESH_DEBUG=1
@ -80,7 +80,7 @@ build_flags =
${Heltec_lora32_v2.build_flags} ${Heltec_lora32_v2.build_flags}
-I examples/companion_radio/ui-new -I examples/companion_radio/ui-new
-D DISPLAY_CLASS=SSD1306Display -D DISPLAY_CLASS=SSD1306Display
-D MAX_CONTACTS=100 -D MAX_CONTACTS=170
-D MAX_GROUP_CHANNELS=8 -D MAX_GROUP_CHANNELS=8
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1 ; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1
; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1 ; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1
@ -100,7 +100,7 @@ build_flags =
${Heltec_lora32_v2.build_flags} ${Heltec_lora32_v2.build_flags}
-I examples/companion_radio/ui-new -I examples/companion_radio/ui-new
-D DISPLAY_CLASS=SSD1306Display -D DISPLAY_CLASS=SSD1306Display
-D MAX_CONTACTS=100 -D MAX_CONTACTS=170
-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

View file

@ -17,7 +17,7 @@ build_flags =
-D PIN_VEXT_EN=36 -D PIN_VEXT_EN=36
-D SX126X_DIO2_AS_RF_SWITCH=true -D SX126X_DIO2_AS_RF_SWITCH=true
-D SX126X_DIO3_TCXO_VOLTAGE=1.8 -D SX126X_DIO3_TCXO_VOLTAGE=1.8
-D SX126X_CURRENT_LIMIT=160 -D SX126X_CURRENT_LIMIT=140
-D SX126X_RX_BOOSTED_GAIN=1 -D SX126X_RX_BOOSTED_GAIN=1
-D PIN_GPS_RX=47 -D PIN_GPS_RX=47
-D PIN_GPS_TX=48 -D PIN_GPS_TX=48
@ -87,7 +87,7 @@ extends = Heltec_lora32_v3
build_flags = build_flags =
${Heltec_lora32_v3.build_flags} ${Heltec_lora32_v3.build_flags}
-I examples/companion_radio/ui-new -I examples/companion_radio/ui-new
-D MAX_CONTACTS=100 -D MAX_CONTACTS=300
-D MAX_GROUP_CHANNELS=8 -D MAX_GROUP_CHANNELS=8
-D DISPLAY_CLASS=SSD1306Display -D DISPLAY_CLASS=SSD1306Display
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1 ; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1
@ -130,7 +130,7 @@ extends = Heltec_lora32_v3
build_flags = build_flags =
${Heltec_lora32_v3.build_flags} ${Heltec_lora32_v3.build_flags}
-I examples/companion_radio/ui-new -I examples/companion_radio/ui-new
-D MAX_CONTACTS=100 -D MAX_CONTACTS=300
-D MAX_GROUP_CHANNELS=8 -D MAX_GROUP_CHANNELS=8
-D DISPLAY_CLASS=SSD1306Display -D DISPLAY_CLASS=SSD1306Display
-D WIFI_DEBUG_LOGGING=1 -D WIFI_DEBUG_LOGGING=1
@ -207,7 +207,7 @@ lib_deps =
extends = Heltec_lora32_v3 extends = Heltec_lora32_v3
build_flags = build_flags =
${Heltec_lora32_v3.build_flags} ${Heltec_lora32_v3.build_flags}
-D MAX_CONTACTS=100 -D MAX_CONTACTS=300
-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

View file

@ -38,7 +38,7 @@ board_build.upload.maximum_ram_size=2000000
build_flags = build_flags =
${LilyGo_TBeam_SX1262.build_flags} ${LilyGo_TBeam_SX1262.build_flags}
-I examples/companion_radio/ui-new -I examples/companion_radio/ui-new
-D MAX_CONTACTS=100 -D MAX_CONTACTS=160
-D MAX_GROUP_CHANNELS=8 -D MAX_GROUP_CHANNELS=8
-D BLE_PIN_CODE=123456 -D BLE_PIN_CODE=123456
-D OFFLINE_QUEUE_SIZE=256 -D OFFLINE_QUEUE_SIZE=256

View file

@ -37,7 +37,7 @@ board_build.upload.maximum_ram_size=2000000
build_flags = build_flags =
${LilyGo_TBeam_SX1276.build_flags} ${LilyGo_TBeam_SX1276.build_flags}
-I examples/companion_radio/ui-new -I examples/companion_radio/ui-new
-D MAX_CONTACTS=100 -D MAX_CONTACTS=160
-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

View file

@ -68,7 +68,7 @@ lib_deps =
extends = LilyGo_TLora_V2_1_1_6 extends = LilyGo_TLora_V2_1_1_6
build_flags = build_flags =
${LilyGo_TLora_V2_1_1_6.build_flags} ${LilyGo_TLora_V2_1_1_6.build_flags}
-D MAX_CONTACTS=100 -D MAX_CONTACTS=160
-D MAX_GROUP_CHANNELS=8 -D MAX_GROUP_CHANNELS=8
; -D MESH_PACKET_LOGGING=1 ; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1 ; -D MESH_DEBUG=1
@ -84,7 +84,7 @@ extends = LilyGo_TLora_V2_1_1_6
build_flags = build_flags =
${LilyGo_TLora_V2_1_1_6.build_flags} ${LilyGo_TLora_V2_1_1_6.build_flags}
-I examples/companion_radio/ui-new -I examples/companion_radio/ui-new
-D MAX_CONTACTS=100 -D MAX_CONTACTS=160
-D MAX_GROUP_CHANNELS=8 -D MAX_GROUP_CHANNELS=8
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1 ; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1
; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1 ; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1
@ -102,7 +102,7 @@ extends = LilyGo_TLora_V2_1_1_6
build_flags = build_flags =
${LilyGo_TLora_V2_1_1_6.build_flags} ${LilyGo_TLora_V2_1_1_6.build_flags}
-I examples/companion_radio/ui-new -I examples/companion_radio/ui-new
-D MAX_CONTACTS=100 -D MAX_CONTACTS=160
-D MAX_GROUP_CHANNELS=8 -D MAX_GROUP_CHANNELS=8
-D BLE_PIN_CODE=123456 -D BLE_PIN_CODE=123456
-D OFFLINE_QUEUE_SIZE=256 -D OFFLINE_QUEUE_SIZE=256
@ -136,3 +136,23 @@ build_flags =
lib_deps = lib_deps =
${LilyGo_TLora_V2_1_1_6.lib_deps} ${LilyGo_TLora_V2_1_1_6.lib_deps}
${esp32_ota.lib_deps} ${esp32_ota.lib_deps}
[env:LilyGo_TLora_V2_1_1_6_companion_radio_wifi]
extends = LilyGo_TLora_V2_1_1_6
build_flags =
${LilyGo_TLora_V2_1_1_6.build_flags}
-I examples/companion_radio/ui-new
-D MAX_CONTACTS=160
-D MAX_GROUP_CHANNELS=8
-D WIFI_SSID='"ssid"'
-D WIFI_PWD='"password"'
-D WIFI_DEBUG_LOGGING=1
build_src_filter = ${LilyGo_TLora_V2_1_1_6.build_src_filter}
+<helpers/esp32/*.cpp>
+<helpers/ui/SSD1306Display.cpp>
+<helpers/ui/MomentaryButton.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
lib_deps =
${LilyGo_TLora_V2_1_1_6.lib_deps}
densaugeo/base64 @ ~1.4.0

View file

@ -80,6 +80,8 @@ extends = Meshadventurer
build_src_filter = ${Meshadventurer.build_src_filter} build_src_filter = ${Meshadventurer.build_src_filter}
+<../examples/companion_radio/*.cpp> +<../examples/companion_radio/*.cpp>
+<helpers/ui/SSD1306Display.cpp> +<helpers/ui/SSD1306Display.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
build_flags = build_flags =
${Meshadventurer.build_flags} ${Meshadventurer.build_flags}
-I examples/companion_radio/ui-new -I examples/companion_radio/ui-new

View file

@ -10,7 +10,11 @@ RAK4631Board board;
#ifdef DISPLAY_CLASS #ifdef DISPLAY_CLASS
DISPLAY_CLASS display; DISPLAY_CLASS display;
MomentaryButton user_btn(PIN_USER_BTN, 1000, true); MomentaryButton user_btn(PIN_USER_BTN, 1000, true, true);
#if defined(PIN_USER_BTN_ANA)
MomentaryButton analog_btn(PIN_USER_BTN_ANA, 1000, 20);
#endif
#endif #endif
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);

View file

@ -13,6 +13,9 @@
extern DISPLAY_CLASS display; extern DISPLAY_CLASS display;
#include <helpers/ui/MomentaryButton.h> #include <helpers/ui/MomentaryButton.h>
extern MomentaryButton user_btn; extern MomentaryButton user_btn;
#if defined(PIN_USER_BTN_ANA)
extern MomentaryButton analog_btn;
#endif
#endif #endif
extern RAK4631Board board; extern RAK4631Board board;