ソースを参照

* Refactor of UITask, moved to /ui-new

Scott Powell 1 年間 前
コミット
acde9921b5

+ 46 - 0
examples/companion_radio/AbstractUITask.h

@@ -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();
+};

+ 10 - 14
examples/companion_radio/MyMesh.cpp

@@ -109,10 +109,6 @@
 
 #define MAX_SIGN_DATA_LEN               (8 * 1024) // 8K
 
-#ifdef DISPLAY_CLASS
-#include "UITask.h"
-#endif
-
 void MyMesh::writeOKFrame() {
   uint8_t buf[1];
   buf[0] = RESP_CODE_OK;
@@ -247,7 +243,7 @@ void MyMesh::onDiscoveredContact(ContactInfo &contact, bool is_new, uint8_t path
     }
   } else {
 #ifdef DISPLAY_CLASS
-    ui_task.soundBuzzer(UIEventType::newContactMessage);
+    if (_ui) _ui->soundBuzzer(UIEventType::newContactMessage);
 #endif
   }
 
@@ -354,10 +350,10 @@ void MyMesh::queueMessage(const ContactInfo &from, uint8_t txt_type, mesh::Packe
 #ifdef DISPLAY_CLASS
   // 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;
-  if (should_display) {
-    ui_task.newMsg(path_len, from.name, text, offline_queue_len);
+  if (should_display && _ui) {
+    _ui->newMsg(path_len, from.name, text, offline_queue_len);
     if (!_serial->isConnected()) {
-      ui_task.soundBuzzer(UIEventType::contactMessage);
+      _ui->soundBuzzer(UIEventType::contactMessage);
     }
   }
 #endif
@@ -416,7 +412,7 @@ void MyMesh::onChannelMessageRecv(const mesh::GroupChannel &channel, mesh::Packe
     _serial->writeFrame(frame, 1);
   } else {
 #ifdef DISPLAY_CLASS
-    ui_task.soundBuzzer(UIEventType::channelMessage);
+    if (_ui) _ui->soundBuzzer(UIEventType::channelMessage);
 #endif
   }
 #ifdef DISPLAY_CLASS
@@ -426,7 +422,7 @@ void MyMesh::onChannelMessageRecv(const mesh::GroupChannel &channel, mesh::Packe
   if (getChannel(channel_idx, channel_details)) {
     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
 }
 
@@ -635,9 +631,9 @@ uint32_t MyMesh::calcDirectTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t
 
 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),
-      _serial(NULL), telemetry(MAX_PACKET_PAYLOAD - 4), _store(&store) {
+      _serial(NULL), telemetry(MAX_PACKET_PAYLOAD - 4), _store(&store), _ui(ui) {
   _iter_started = false;
   _cli_rescue = false;
   offline_queue_len = 0;
@@ -1041,7 +1037,7 @@ void MyMesh::handleCmdFrame(size_t len) {
     if ((out_len = getFromOfflineQueue(out_frame)) > 0) {
       _serial->writeFrame(out_frame, out_len);
 #ifdef DISPLAY_CLASS
-      ui_task.msgRead(offline_queue_len);
+      if (_ui) _ui->msgRead(offline_queue_len);
 #endif
     } else {
       out_frame[0] = RESP_CODE_NO_MORE_MESSAGES;
@@ -1643,7 +1639,7 @@ void MyMesh::loop() {
   }
 
 #ifdef DISPLAY_CLASS
-  ui_task.setHasConnection(_serial->isConnected());
+  if (_ui) _ui->setHasConnection(_serial->isConnected());
 #endif
 }
 

+ 3 - 7
examples/companion_radio/MyMesh.h

@@ -2,9 +2,7 @@
 
 #include <Arduino.h>
 #include <Mesh.h>
-#ifdef DISPLAY_CLASS
-#include "UITask.h"
-#endif
+#include "AbstractUITask.h"
 
 /*------------ Frame Protocol --------------*/
 #define FIRMWARE_VER_CODE 7
@@ -87,7 +85,7 @@ struct AdvertPath {
 
 class MyMesh : public BaseChatMesh, public DataStoreHost {
 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 startInterface(BaseSerialInterface &serial);
@@ -179,6 +177,7 @@ private:
   uint32_t pending_telemetry, pending_discovery;   // pending _TELEMETRY_REQ
   uint32_t pending_req;   // pending _BINARY_REQ
   BaseSerialInterface *_serial;
+  AbstractUITask* _ui;
 
   ContactsIterator _iter;
   uint32_t _iter_filter_since;
@@ -216,6 +215,3 @@ private:
 };
 
 extern MyMesh the_mesh;
-#ifdef DISPLAY_CLASS
-extern UITask ui_task;
-#endif

+ 9 - 4
examples/companion_radio/main.cpp

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

+ 1 - 2
examples/companion_radio/UITask.cpp → examples/companion_radio/ui-new/UITask.cpp

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

+ 11 - 28
examples/companion_radio/UITask.h → examples/companion_radio/ui-new/UITask.h

@@ -11,29 +11,16 @@
   #include <helpers/ui/buzzer.h>
 #endif
 
-#include "NodePrefs.h"
+#include "../AbstractUITask.h"
+#include "../NodePrefs.h"
 
-enum class UIEventType {
-    none,
-    contactMessage,
-    channelMessage,
-    roomMessage,
-    newContactMessage,
-    ack
-};
-
-#define MAX_TOP_LEVEL    8
-
-class UITask {
+class UITask : public AbstractUITask {
   DisplayDriver* _display;
-  mesh::MainBoard* _board;
-  BaseSerialInterface* _serial;
   SensorManager* _sensors;
 #ifdef PIN_BUZZER
   genericBuzzer buzzer;
 #endif
   unsigned long _next_refresh, _auto_off;
-  bool _connected;
   NodePrefs* _node_prefs;
   char _alert[80];
   unsigned long _alert_expiry;
@@ -55,28 +42,24 @@ class UITask {
 
 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;
     ui_started_at = 0;
-    _connected = false;
     curr = NULL;
   }
   void begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* node_prefs);
 
   void gotoHomeScreen() { setCurrScreen(home); }
   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; }
   bool hasDisplay() const { return _display != NULL; }
   bool isButtonPressed() const;
-  void msgRead(int msgcount);
-  void newMsg(uint8_t path_len, const char* from_name, const char* text, int msgcount);
-  void soundBuzzer(UIEventType bet = UIEventType::none);
+
+  // from AbsractUITask
+  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 loop();
 };

+ 0 - 0
examples/companion_radio/icons.h → examples/companion_radio/ui-new/icons.h


+ 2 - 46
variants/heltec_v3/platformio.ini

@@ -103,6 +103,7 @@ lib_deps =
 extends = Heltec_lora32_v3
 build_flags =
   ${Heltec_lora32_v3.build_flags}
+  -I examples/companion_radio/ui-new
   -D MAX_CONTACTS=160
   -D MAX_GROUP_CHANNELS=8
   -D DISPLAY_CLASS=SSD1306Display
@@ -117,6 +118,7 @@ build_src_filter = ${Heltec_lora32_v3.build_src_filter}
   +<helpers/ui/MomentaryButton.cpp>
   +<helpers/esp32/*.cpp>
   +<../examples/companion_radio>
+  +<../examples/companion_radio/ui-new>
 lib_deps =
   ${Heltec_lora32_v3.lib_deps}
   densaugeo/base64 @ ~1.4.0
@@ -244,49 +246,3 @@ build_src_filter = ${Heltec_lora32_v3.build_src_filter}
 lib_deps =
   ${Heltec_lora32_v3.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

+ 4 - 0
variants/t114/platformio.ini

@@ -73,6 +73,7 @@ build_flags =
 extends = Heltec_t114
 build_flags =
   ${Heltec_t114.build_flags}
+  -I examples/companion_radio/ui-new
   -D MAX_CONTACTS=100
   -D MAX_GROUP_CHANNELS=8
   -D BLE_PIN_CODE=123456
@@ -83,6 +84,7 @@ build_flags =
 build_src_filter = ${Heltec_t114.build_src_filter}
   +<helpers/nrf52/SerialBLEInterface.cpp>
   +<../examples/companion_radio>
+  +<../examples/companion_radio/ui-new>
 lib_deps =
   ${Heltec_t114.lib_deps}
   densaugeo/base64 @ ~1.4.0
@@ -91,6 +93,7 @@ lib_deps =
 extends = Heltec_t114
 build_flags =
   ${Heltec_t114.build_flags}
+  -I examples/companion_radio/ui-new
   -D MAX_CONTACTS=100
   -D MAX_GROUP_CHANNELS=8
 ;  -D BLE_PIN_CODE=123456
@@ -100,6 +103,7 @@ build_flags =
 build_src_filter = ${Heltec_t114.build_src_filter}
   +<helpers/nrf52/*.cpp>
   +<../examples/companion_radio>
+  +<../examples/companion_radio/ui-new>
 lib_deps =
   ${Heltec_t114.lib_deps}
   densaugeo/base64 @ ~1.4.0