* Refactor of UITask, moved to /ui-new

This commit is contained in:
Scott Powell
2025-08-16 20:04:54 +10:00
parent 29fd5da5e8
commit acde9921b5
9 changed files with 86 additions and 101 deletions

View File

@@ -0,0 +1,46 @@
#pragma once
#include <MeshCore.h>
#include <helpers/ui/DisplayDriver.h>
#include <helpers/ui/UIScreen.h>
#include <helpers/SensorManager.h>
#include <helpers/BaseSerialInterface.h>
#include <Arduino.h>
#ifdef PIN_BUZZER
#include <helpers/ui/buzzer.h>
#endif
#include "NodePrefs.h"
enum class UIEventType {
none,
contactMessage,
channelMessage,
roomMessage,
newContactMessage,
ack
};
class AbstractUITask {
protected:
mesh::MainBoard* _board;
BaseSerialInterface* _serial;
bool _connected;
AbstractUITask(mesh::MainBoard* board, BaseSerialInterface* serial) : _board(board), _serial(serial) {
_connected = false;
}
public:
void setHasConnection(bool connected) { _connected = connected; }
bool hasConnection() const { return _connected; }
uint16_t getBattMilliVolts() const { return _board->getBattMilliVolts(); }
bool isSerialEnabled() const { return _serial->isEnabled(); }
void enableSerial() { _serial->enable(); }
void disableSerial() { _serial->disable(); }
virtual void msgRead(int msgcount) = 0;
virtual void newMsg(uint8_t path_len, const char* from_name, const char* text, int msgcount) = 0;
virtual void soundBuzzer(UIEventType bet = UIEventType::none) = 0;
virtual void loop();
};

View File

@@ -109,10 +109,6 @@
#define MAX_SIGN_DATA_LEN (8 * 1024) // 8K #define MAX_SIGN_DATA_LEN (8 * 1024) // 8K
#ifdef DISPLAY_CLASS
#include "UITask.h"
#endif
void MyMesh::writeOKFrame() { void MyMesh::writeOKFrame() {
uint8_t buf[1]; uint8_t buf[1];
buf[0] = RESP_CODE_OK; buf[0] = RESP_CODE_OK;
@@ -247,7 +243,7 @@ void MyMesh::onDiscoveredContact(ContactInfo &contact, bool is_new, uint8_t path
} }
} else { } else {
#ifdef DISPLAY_CLASS #ifdef DISPLAY_CLASS
ui_task.soundBuzzer(UIEventType::newContactMessage); if (_ui) _ui->soundBuzzer(UIEventType::newContactMessage);
#endif #endif
} }
@@ -354,10 +350,10 @@ void MyMesh::queueMessage(const ContactInfo &from, uint8_t txt_type, mesh::Packe
#ifdef DISPLAY_CLASS #ifdef DISPLAY_CLASS
// we only want to show text messages on display, not cli data // we only want to show text messages on display, not cli data
bool should_display = txt_type == TXT_TYPE_PLAIN || txt_type == TXT_TYPE_SIGNED_PLAIN; bool should_display = txt_type == TXT_TYPE_PLAIN || txt_type == TXT_TYPE_SIGNED_PLAIN;
if (should_display) { if (should_display && _ui) {
ui_task.newMsg(path_len, from.name, text, offline_queue_len); _ui->newMsg(path_len, from.name, text, offline_queue_len);
if (!_serial->isConnected()) { if (!_serial->isConnected()) {
ui_task.soundBuzzer(UIEventType::contactMessage); _ui->soundBuzzer(UIEventType::contactMessage);
} }
} }
#endif #endif
@@ -416,7 +412,7 @@ void MyMesh::onChannelMessageRecv(const mesh::GroupChannel &channel, mesh::Packe
_serial->writeFrame(frame, 1); _serial->writeFrame(frame, 1);
} else { } else {
#ifdef DISPLAY_CLASS #ifdef DISPLAY_CLASS
ui_task.soundBuzzer(UIEventType::channelMessage); if (_ui) _ui->soundBuzzer(UIEventType::channelMessage);
#endif #endif
} }
#ifdef DISPLAY_CLASS #ifdef DISPLAY_CLASS
@@ -426,7 +422,7 @@ void MyMesh::onChannelMessageRecv(const mesh::GroupChannel &channel, mesh::Packe
if (getChannel(channel_idx, channel_details)) { if (getChannel(channel_idx, channel_details)) {
channel_name = channel_details.name; channel_name = channel_details.name;
} }
ui_task.newMsg(path_len, channel_name, text, offline_queue_len); if (_ui) _ui->newMsg(path_len, channel_name, text, offline_queue_len);
#endif #endif
} }
@@ -635,9 +631,9 @@ uint32_t MyMesh::calcDirectTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t
void MyMesh::onSendTimeout() {} void MyMesh::onSendTimeout() {}
MyMesh::MyMesh(mesh::Radio &radio, mesh::RNG &rng, mesh::RTCClock &rtc, SimpleMeshTables &tables, DataStore& store) MyMesh::MyMesh(mesh::Radio &radio, mesh::RNG &rng, mesh::RTCClock &rtc, SimpleMeshTables &tables, DataStore& store, AbstractUITask* ui)
: BaseChatMesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables), : BaseChatMesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables),
_serial(NULL), telemetry(MAX_PACKET_PAYLOAD - 4), _store(&store) { _serial(NULL), telemetry(MAX_PACKET_PAYLOAD - 4), _store(&store), _ui(ui) {
_iter_started = false; _iter_started = false;
_cli_rescue = false; _cli_rescue = false;
offline_queue_len = 0; offline_queue_len = 0;
@@ -1041,7 +1037,7 @@ void MyMesh::handleCmdFrame(size_t len) {
if ((out_len = getFromOfflineQueue(out_frame)) > 0) { if ((out_len = getFromOfflineQueue(out_frame)) > 0) {
_serial->writeFrame(out_frame, out_len); _serial->writeFrame(out_frame, out_len);
#ifdef DISPLAY_CLASS #ifdef DISPLAY_CLASS
ui_task.msgRead(offline_queue_len); if (_ui) _ui->msgRead(offline_queue_len);
#endif #endif
} else { } else {
out_frame[0] = RESP_CODE_NO_MORE_MESSAGES; out_frame[0] = RESP_CODE_NO_MORE_MESSAGES;
@@ -1643,7 +1639,7 @@ void MyMesh::loop() {
} }
#ifdef DISPLAY_CLASS #ifdef DISPLAY_CLASS
ui_task.setHasConnection(_serial->isConnected()); if (_ui) _ui->setHasConnection(_serial->isConnected());
#endif #endif
} }

View File

@@ -2,9 +2,7 @@
#include <Arduino.h> #include <Arduino.h>
#include <Mesh.h> #include <Mesh.h>
#ifdef DISPLAY_CLASS #include "AbstractUITask.h"
#include "UITask.h"
#endif
/*------------ Frame Protocol --------------*/ /*------------ Frame Protocol --------------*/
#define FIRMWARE_VER_CODE 7 #define FIRMWARE_VER_CODE 7
@@ -87,7 +85,7 @@ struct AdvertPath {
class MyMesh : public BaseChatMesh, public DataStoreHost { class MyMesh : public BaseChatMesh, public DataStoreHost {
public: public:
MyMesh(mesh::Radio &radio, mesh::RNG &rng, mesh::RTCClock &rtc, SimpleMeshTables &tables, DataStore& store); MyMesh(mesh::Radio &radio, mesh::RNG &rng, mesh::RTCClock &rtc, SimpleMeshTables &tables, DataStore& store, AbstractUITask* ui=NULL);
void begin(bool has_display); void begin(bool has_display);
void startInterface(BaseSerialInterface &serial); void startInterface(BaseSerialInterface &serial);
@@ -179,6 +177,7 @@ private:
uint32_t pending_telemetry, pending_discovery; // pending _TELEMETRY_REQ uint32_t pending_telemetry, pending_discovery; // pending _TELEMETRY_REQ
uint32_t pending_req; // pending _BINARY_REQ uint32_t pending_req; // pending _BINARY_REQ
BaseSerialInterface *_serial; BaseSerialInterface *_serial;
AbstractUITask* _ui;
ContactsIterator _iter; ContactsIterator _iter;
uint32_t _iter_filter_since; uint32_t _iter_filter_since;
@@ -216,6 +215,3 @@ private:
}; };
extern MyMesh the_mesh; extern MyMesh the_mesh;
#ifdef DISPLAY_CLASS
extern UITask ui_task;
#endif

View File

@@ -75,14 +75,19 @@ static uint32_t _atoi(const char* sp) {
#endif #endif
/* GLOBAL OBJECTS */ /* GLOBAL OBJECTS */
StdRNG fast_rng;
SimpleMeshTables tables;
MyMesh the_mesh(radio_driver, fast_rng, rtc_clock, tables, store);
#ifdef DISPLAY_CLASS #ifdef DISPLAY_CLASS
#include "UITask.h" #include "UITask.h"
UITask ui_task(&board, &serial_interface); UITask ui_task(&board, &serial_interface);
#endif #endif
StdRNG fast_rng;
SimpleMeshTables tables;
MyMesh the_mesh(radio_driver, fast_rng, rtc_clock, tables, store
#ifdef DISPLAY_CLASS
, &ui_task
#endif
);
/* END GLOBAL OBJECTS */ /* END GLOBAL OBJECTS */
void halt() { void halt() {

View File

@@ -1,7 +1,6 @@
#include "UITask.h" #include "UITask.h"
#include <helpers/TxtDataHelpers.h> #include <helpers/TxtDataHelpers.h>
#include "NodePrefs.h" #include "../MyMesh.h"
#include "MyMesh.h"
#include "target.h" #include "target.h"
#define AUTO_OFF_MILLIS 15000 // 15 seconds #define AUTO_OFF_MILLIS 15000 // 15 seconds

View File

@@ -11,29 +11,16 @@
#include <helpers/ui/buzzer.h> #include <helpers/ui/buzzer.h>
#endif #endif
#include "NodePrefs.h" #include "../AbstractUITask.h"
#include "../NodePrefs.h"
enum class UIEventType { class UITask : public AbstractUITask {
none,
contactMessage,
channelMessage,
roomMessage,
newContactMessage,
ack
};
#define MAX_TOP_LEVEL 8
class UITask {
DisplayDriver* _display; DisplayDriver* _display;
mesh::MainBoard* _board;
BaseSerialInterface* _serial;
SensorManager* _sensors; SensorManager* _sensors;
#ifdef PIN_BUZZER #ifdef PIN_BUZZER
genericBuzzer buzzer; genericBuzzer buzzer;
#endif #endif
unsigned long _next_refresh, _auto_off; unsigned long _next_refresh, _auto_off;
bool _connected;
NodePrefs* _node_prefs; NodePrefs* _node_prefs;
char _alert[80]; char _alert[80];
unsigned long _alert_expiry; unsigned long _alert_expiry;
@@ -55,28 +42,24 @@ class UITask {
public: public:
UITask(mesh::MainBoard* board, BaseSerialInterface* serial) : _board(board), _serial(serial), _display(NULL), _sensors(NULL) { UITask(mesh::MainBoard* board, BaseSerialInterface* serial) : AbstractUITask(board, serial), _display(NULL), _sensors(NULL) {
next_batt_chck = _next_refresh = 0; next_batt_chck = _next_refresh = 0;
ui_started_at = 0; ui_started_at = 0;
_connected = false;
curr = NULL; curr = NULL;
} }
void begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* node_prefs); void begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* node_prefs);
void gotoHomeScreen() { setCurrScreen(home); } void gotoHomeScreen() { setCurrScreen(home); }
void showAlert(const char* text, int duration_millis); void showAlert(const char* text, int duration_millis);
void setHasConnection(bool connected) { _connected = connected; }
bool hasConnection() const { return _connected; }
uint16_t getBattMilliVolts() const { return _board->getBattMilliVolts(); }
bool isSerialEnabled() const { return _serial->isEnabled(); }
void enableSerial() { _serial->enable(); }
void disableSerial() { _serial->disable(); }
int getMsgCount() const { return _msgcount; } int getMsgCount() const { return _msgcount; }
bool hasDisplay() const { return _display != NULL; } bool hasDisplay() const { return _display != NULL; }
bool isButtonPressed() const; bool isButtonPressed() const;
void msgRead(int msgcount);
void newMsg(uint8_t path_len, const char* from_name, const char* text, int msgcount); // from AbsractUITask
void soundBuzzer(UIEventType bet = UIEventType::none); void msgRead(int msgcount) override;
void newMsg(uint8_t path_len, const char* from_name, const char* text, int msgcount) override;
void soundBuzzer(UIEventType bet = UIEventType::none) override;
void loop() override;
void shutdown(bool restart = false); void shutdown(bool restart = false);
void loop();
}; };

View File

@@ -103,6 +103,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}
-I examples/companion_radio/ui-new
-D MAX_CONTACTS=160 -D MAX_CONTACTS=160
-D MAX_GROUP_CHANNELS=8 -D MAX_GROUP_CHANNELS=8
-D DISPLAY_CLASS=SSD1306Display -D DISPLAY_CLASS=SSD1306Display
@@ -117,6 +118,7 @@ build_src_filter = ${Heltec_lora32_v3.build_src_filter}
+<helpers/ui/MomentaryButton.cpp> +<helpers/ui/MomentaryButton.cpp>
+<helpers/esp32/*.cpp> +<helpers/esp32/*.cpp>
+<../examples/companion_radio> +<../examples/companion_radio>
+<../examples/companion_radio/ui-new>
lib_deps = lib_deps =
${Heltec_lora32_v3.lib_deps} ${Heltec_lora32_v3.lib_deps}
densaugeo/base64 @ ~1.4.0 densaugeo/base64 @ ~1.4.0
@@ -244,49 +246,3 @@ build_src_filter = ${Heltec_lora32_v3.build_src_filter}
lib_deps = lib_deps =
${Heltec_lora32_v3.lib_deps} ${Heltec_lora32_v3.lib_deps}
${esp32_ota.lib_deps} ${esp32_ota.lib_deps}
[env:Heltec_WSL3_espnow_bridge]
extends = Heltec_lora32_v3
build_flags =
${Heltec_lora32_v3.build_flags}
; -D LORA_FREQ=915.8
-D MESH_PACKET_LOGGING=1
-D ENV_INCLUDE_AHTX0=0
-D ENV_INCLUDE_BME280=0
-D ENV_INCLUDE_BMP280=0
-D ENV_INCLUDE_INA3221=0
-D ENV_INCLUDE_INA219=0
-D ENV_INCLUDE_MLX90614=0
-D ENV_INCLUDE_VL53L0X=0
-D ENV_INCLUDE_GPS=0
; -D MESH_DEBUG=1
build_src_filter = ${Heltec_lora32_v3.build_src_filter}
+<../examples/simple_bridge/main.cpp>
+<helpers/esp32/ESPNOWRadio.cpp>
lib_deps =
${Heltec_lora32_v3.lib_deps}
bakercp/CRC32 @ ^2.0.0
[env:Heltec_WSL3_serial_bridge]
extends = Heltec_lora32_v3
build_flags =
${Heltec_lora32_v3.build_flags}
; -D LORA_FREQ=915.8
-D MESH_PACKET_LOGGING=1
-D SERIAL_BRIDGE_RX=47
-D SERIAL_BRIDGE_TX=48
-D ENV_INCLUDE_AHTX0=0
-D ENV_INCLUDE_BME280=0
-D ENV_INCLUDE_BMP280=0
-D ENV_INCLUDE_INA3221=0
-D ENV_INCLUDE_INA219=0
-D ENV_INCLUDE_MLX90614=0
-D ENV_INCLUDE_VL53L0X=0
-D ENV_INCLUDE_GPS=0
; -D MESH_DEBUG=1
build_src_filter = ${Heltec_lora32_v3.build_src_filter}
+<../examples/simple_bridge/main.cpp>
+<../examples/simple_bridge/SerialBridgeRadio.cpp>
lib_deps =
${Heltec_lora32_v3.lib_deps}
bakercp/CRC32 @ ^2.0.0

View File

@@ -73,6 +73,7 @@ build_flags =
extends = Heltec_t114 extends = Heltec_t114
build_flags = build_flags =
${Heltec_t114.build_flags} ${Heltec_t114.build_flags}
-I examples/companion_radio/ui-new
-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
@@ -83,6 +84,7 @@ build_flags =
build_src_filter = ${Heltec_t114.build_src_filter} build_src_filter = ${Heltec_t114.build_src_filter}
+<helpers/nrf52/SerialBLEInterface.cpp> +<helpers/nrf52/SerialBLEInterface.cpp>
+<../examples/companion_radio> +<../examples/companion_radio>
+<../examples/companion_radio/ui-new>
lib_deps = lib_deps =
${Heltec_t114.lib_deps} ${Heltec_t114.lib_deps}
densaugeo/base64 @ ~1.4.0 densaugeo/base64 @ ~1.4.0
@@ -91,6 +93,7 @@ lib_deps =
extends = Heltec_t114 extends = Heltec_t114
build_flags = build_flags =
${Heltec_t114.build_flags} ${Heltec_t114.build_flags}
-I examples/companion_radio/ui-new
-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
@@ -100,6 +103,7 @@ build_flags =
build_src_filter = ${Heltec_t114.build_src_filter} build_src_filter = ${Heltec_t114.build_src_filter}
+<helpers/nrf52/*.cpp> +<helpers/nrf52/*.cpp>
+<../examples/companion_radio> +<../examples/companion_radio>
+<../examples/companion_radio/ui-new>
lib_deps = lib_deps =
${Heltec_t114.lib_deps} ${Heltec_t114.lib_deps}
densaugeo/base64 @ ~1.4.0 densaugeo/base64 @ ~1.4.0