Explorar o código

* big refactor of the 'display' object. Now defined in variants/*/target modules.

Scott Powell hai 1 ano
pai
achega
a73eb9823d
Modificáronse 43 ficheiros con 210 adicións e 58 borrados
  1. 2 2
      examples/companion_radio/UITask.cpp
  2. 1 0
      examples/companion_radio/UITask.h
  3. 11 36
      examples/companion_radio/main.cpp
  4. 1 5
      examples/simple_repeater/main.cpp
  5. 1 5
      examples/simple_room_server/main.cpp
  6. 0 4
      src/helpers/ui/ST7735Display.cpp
  7. 0 1
      variants/heltec_tracker/platformio.ini
  8. 4 0
      variants/heltec_tracker/target.cpp
  9. 7 0
      variants/heltec_tracker/target.h
  10. 4 0
      variants/heltec_v2/target.cpp
  11. 7 0
      variants/heltec_v2/target.h
  12. 4 0
      variants/heltec_v3/target.cpp
  13. 7 0
      variants/heltec_v3/target.h
  14. 4 0
      variants/lilygo_t3s3/target.cpp
  15. 7 0
      variants/lilygo_t3s3/target.h
  16. 4 0
      variants/lilygo_tbeam/target.cpp
  17. 7 0
      variants/lilygo_tbeam/target.h
  18. 4 0
      variants/lilygo_tbeam_SX1262/target.cpp
  19. 7 0
      variants/lilygo_tbeam_SX1262/target.h
  20. 4 0
      variants/lilygo_tlora_v2_1/target.cpp
  21. 7 0
      variants/lilygo_tlora_v2_1/target.h
  22. 0 1
      variants/nano_g2_ultra/platformio.ini
  23. 4 0
      variants/nano_g2_ultra/target.cpp
  24. 7 0
      variants/nano_g2_ultra/target.h
  25. 4 1
      variants/promicro/platformio.ini
  26. 4 0
      variants/promicro/target.cpp
  27. 6 0
      variants/promicro/target.h
  28. 4 0
      variants/rak4631/target.cpp
  29. 7 0
      variants/rak4631/target.h
  30. 24 0
      variants/t1000-e/NullDisplayDriver.h
  31. 1 1
      variants/t1000-e/platformio.ini
  32. 4 0
      variants/t1000-e/target.cpp
  33. 7 0
      variants/t1000-e/target.h
  34. 4 0
      variants/t114/target.cpp
  35. 7 0
      variants/t114/target.h
  36. 0 1
      variants/techo/platformio.ini
  37. 4 0
      variants/techo/target.cpp
  38. 8 0
      variants/techo/target.h
  39. 0 1
      variants/thinknode_m1/platformio.ini
  40. 4 0
      variants/thinknode_m1/target.cpp
  41. 7 0
      variants/thinknode_m1/target.h
  42. 4 0
      variants/xiao_s3_wio/target.cpp
  43. 7 0
      variants/xiao_s3_wio/target.h

+ 2 - 2
examples/companion_radio/UITask.cpp

@@ -85,7 +85,7 @@ void UITask::newMsg(uint8_t path_len, const char* from_name, const char* text, i
   }
 }
 
-void renderBatteryIndicator(DisplayDriver* _display, uint16_t batteryMilliVolts) {
+void UITask::renderBatteryIndicator(uint16_t batteryMilliVolts) {
   // Convert millivolts to percentage
   const int minMilliVolts = 3000; // Minimum voltage (e.g., 3.0V)
   const int maxMilliVolts = 4200; // Maximum voltage (e.g., 4.2V)
@@ -155,7 +155,7 @@ void UITask::renderCurrScreen() {
     _display->print(_node_prefs->node_name);
 
     // battery voltage
-    renderBatteryIndicator(_display, _board->getBattMilliVolts());
+    renderBatteryIndicator(_board->getBattMilliVolts());
 
     // freq / sf
     _display->setCursor(0, 20);

+ 1 - 0
examples/companion_radio/UITask.h

@@ -22,6 +22,7 @@ class UITask {
   void renderCurrScreen();
   void buttonHandler();
   void userLedHandler();
+  void renderBatteryIndicator(uint16_t batteryMilliVolts);
 
 public:
 

+ 11 - 36
examples/companion_radio/main.cpp

@@ -60,30 +60,7 @@
 
 #define  PUBLIC_GROUP_PSK  "izOH6cXN6mrJ5e26oRXNcg=="
 
-#ifdef DISPLAY_CLASS      // TODO: refactor this -- move to variants/*/target
-  #include "UITask.h"
-  #ifdef ST7735
-    #include <helpers/ui/ST7735Display.h>
-  #elif ST7789
-    #include <helpers/ui/ST7789Display.h>
-  #elif SH1106
-    #include <helpers/ui/SH1106Display.h>
-  #elif defined(HAS_GxEPD)
-    #include <helpers/ui/GxEPDDisplay.h>
-  #else
-    #include <helpers/ui/SSD1306Display.h>
-  #endif
-
-  #if defined(HELTEC_LORA_V3) && defined(ST7735)
-    static DISPLAY_CLASS display(&board.periph_power);   // peripheral power pin is shared
-  #else
-    static DISPLAY_CLASS display;
-  #endif
-
-  #define HAS_UI
-#endif
-
-#if defined(HAS_UI)
+#ifdef DISPLAY_CLASS
   #include "UITask.h"
 
   static UITask ui_task(&board);
@@ -609,7 +586,7 @@ protected:
     } else {
       soundBuzzer();
     }
-  #ifdef HAS_UI
+  #ifdef DISPLAY_CLASS
     ui_task.newMsg(path_len, from.name, text, offline_queue_len);
   #endif
   }
@@ -660,7 +637,7 @@ protected:
     } else {
       soundBuzzer();
     }
-  #ifdef HAS_UI
+  #ifdef DISPLAY_CLASS
     ui_task.newMsg(path_len, "Public", text, offline_queue_len);
   #endif
   }
@@ -895,7 +872,7 @@ public:
 
   #ifdef BLE_PIN_CODE
     if (_prefs.ble_pin == 0) {
-    #ifdef HAS_UI
+    #ifdef DISPLAY_CLASS
       if (has_display) {
         StdRNG  rng;
         _active_ble_pin = rng.nextInt(100000, 999999);  // random pin each session
@@ -1244,7 +1221,7 @@ public:
       int out_len;
       if ((out_len = getFromOfflineQueue(out_frame)) > 0) {
         _serial->writeFrame(out_frame, out_len);
-        #ifdef HAS_UI
+        #ifdef DISPLAY_CLASS
           ui_task.msgRead(offline_queue_len);
         #endif
       } else {
@@ -1572,7 +1549,7 @@ public:
       checkConnections();
     }
 
-  #ifdef HAS_UI
+  #ifdef DISPLAY_CLASS
     ui_task.setHasConnection(_serial->isConnected());
     ui_task.loop();
   #endif
@@ -1643,16 +1620,14 @@ void setup() {
 
   board.begin();
 
-#ifdef HAS_UI
+#ifdef DISPLAY_CLASS
   DisplayDriver* disp = NULL;
- #ifdef DISPLAY_CLASS
   if (display.begin()) {
     disp = &display;
     disp->startFrame();
     disp->print("Please wait...");
     disp->endFrame();
   }
- #endif
 #endif
 
   if (!radio_init()) { halt(); }
@@ -1662,7 +1637,7 @@ void setup() {
 #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
   InternalFS.begin();
   the_mesh.begin(InternalFS,
-    #ifdef HAS_UI
+    #ifdef DISPLAY_CLASS
         disp != NULL
     #else
         false
@@ -1680,7 +1655,7 @@ void setup() {
 #elif defined(RP2040_PLATFORM)
   LittleFS.begin();
   the_mesh.begin(LittleFS,
-    #ifdef HAS_UI
+    #ifdef DISPLAY_CLASS
         disp != NULL
     #else
         false
@@ -1705,7 +1680,7 @@ void setup() {
 #elif defined(ESP32)
   SPIFFS.begin(true);
   the_mesh.begin(SPIFFS,
-    #ifdef HAS_UI
+    #ifdef DISPLAY_CLASS
         disp != NULL
     #else
         false
@@ -1733,7 +1708,7 @@ void setup() {
 
   sensors.begin();
 
-#ifdef HAS_UI
+#ifdef DISPLAY_CLASS
   ui_task.begin(disp, the_mesh.getNodePrefs(), FIRMWARE_BUILD_DATE, FIRMWARE_VERSION, the_mesh.getBLEPin());
 #endif
 }

+ 1 - 5
examples/simple_repeater/main.cpp

@@ -60,10 +60,6 @@
 #endif
 
 #ifdef DISPLAY_CLASS
-  #include <helpers/ui/SSD1306Display.h>
-
-  static DISPLAY_CLASS  display;
-
   #include "UITask.h"
   static UITask ui_task(display);
 #endif
@@ -735,7 +731,7 @@ void setup() {
   board.begin();
 
 #ifdef DISPLAY_CLASS
-  if(display.begin()){
+  if (display.begin()) {
     display.startFrame();
     display.print("Please wait...");
     display.endFrame();

+ 1 - 5
examples/simple_room_server/main.cpp

@@ -68,10 +68,6 @@
 #endif
 
 #ifdef DISPLAY_CLASS
-  #include <helpers/ui/SSD1306Display.h>
-
-  static DISPLAY_CLASS  display;
-
   #include "UITask.h"
   static UITask ui_task(display);
 #endif
@@ -909,7 +905,7 @@ void setup() {
   board.begin();
 
 #ifdef DISPLAY_CLASS
-  if(display.begin()){
+  if (display.begin()) {
     display.startFrame();
     display.print("Please wait...");
     display.endFrame();

+ 0 - 4
src/helpers/ui/ST7735Display.cpp

@@ -1,5 +1,3 @@
-#ifdef ST7735
-
 #include "ST7735Display.h"
 
 #ifndef DISPLAY_ROTATION
@@ -130,5 +128,3 @@ uint16_t ST7735Display::getTextWidth(const char* str) {
 void ST7735Display::endFrame() {
   // display.display();
 }
-
-#endif

+ 0 - 1
variants/heltec_tracker/platformio.ini

@@ -38,7 +38,6 @@ build_flags =
   ${Heltec_tracker_base.build_flags}
   -I src/helpers/ui
  ; -D ARDUINO_USB_CDC_ON_BOOT=1      ; need for debugging
-  -D ST7735
   -D DISPLAY_ROTATION=1
   -D DISPLAY_CLASS=ST7735Display
   -D MAX_CONTACTS=100

+ 4 - 0
variants/heltec_tracker/target.cpp

@@ -19,6 +19,10 @@ AutoDiscoverRTCClock rtc_clock(fallback_clock);
 MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1);
 HWTSensorManager sensors = HWTSensorManager(nmea);
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display(&board.periph_power);   // peripheral power pin is shared
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 7 - 0
variants/heltec_tracker/target.h

@@ -8,6 +8,9 @@
 #include <helpers/AutoDiscoverRTCClock.h>
 #include <helpers/SensorManager.h>
 #include <helpers/sensors/LocationProvider.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/ST7735Display.h>
+#endif
 
 class HWTSensorManager : public SensorManager {
   bool gps_active = false;
@@ -31,6 +34,10 @@ extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 extern HWTSensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
+
 bool radio_init();
 uint32_t radio_get_rng_seed();
 void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);

+ 4 - 0
variants/heltec_v2/target.cpp

@@ -16,6 +16,10 @@ ESP32RTCClock fallback_clock;
 AutoDiscoverRTCClock rtc_clock(fallback_clock);
 SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 7 - 0
variants/heltec_v2/target.h

@@ -7,12 +7,19 @@
 #include <helpers/CustomSX1276Wrapper.h>
 #include <helpers/AutoDiscoverRTCClock.h>
 #include <helpers/SensorManager.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/SSD1306Display.h>
+#endif
 
 extern HeltecV2Board board;
 extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 extern SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
+
 bool radio_init();
 uint32_t radio_get_rng_seed();
 void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);

+ 4 - 0
variants/heltec_v3/target.cpp

@@ -16,6 +16,10 @@ ESP32RTCClock fallback_clock;
 AutoDiscoverRTCClock rtc_clock(fallback_clock);
 SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 7 - 0
variants/heltec_v3/target.h

@@ -7,12 +7,19 @@
 #include <helpers/CustomSX1262Wrapper.h>
 #include <helpers/AutoDiscoverRTCClock.h>
 #include <helpers/SensorManager.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/SSD1306Display.h>
+#endif
 
 extern HeltecV3Board board;
 extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 extern SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
+
 bool radio_init();
 uint32_t radio_get_rng_seed();
 void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);

+ 4 - 0
variants/lilygo_t3s3/target.cpp

@@ -16,6 +16,10 @@ ESP32RTCClock fallback_clock;
 AutoDiscoverRTCClock rtc_clock(fallback_clock);
 SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 7 - 0
variants/lilygo_t3s3/target.h

@@ -7,12 +7,19 @@
 #include <helpers/CustomSX1262Wrapper.h>
 #include <helpers/AutoDiscoverRTCClock.h>
 #include <helpers/SensorManager.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/SSD1306Display.h>
+#endif
 
 extern ESP32Board board;
 extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 extern SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
+
 bool radio_init();
 uint32_t radio_get_rng_seed();
 void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);

+ 4 - 0
variants/lilygo_tbeam/target.cpp

@@ -16,6 +16,10 @@ ESP32RTCClock fallback_clock;
 AutoDiscoverRTCClock rtc_clock(fallback_clock);
 SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 7 - 0
variants/lilygo_tbeam/target.h

@@ -7,12 +7,19 @@
 #include <helpers/CustomSX1276Wrapper.h>
 #include <helpers/AutoDiscoverRTCClock.h>
 #include <helpers/SensorManager.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/SSD1306Display.h>
+#endif
 
 extern TBeamBoard board;
 extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 extern SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
+
 bool radio_init();
 uint32_t radio_get_rng_seed();
 void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);

+ 4 - 0
variants/lilygo_tbeam_SX1262/target.cpp

@@ -16,6 +16,10 @@ ESP32RTCClock fallback_clock;
 AutoDiscoverRTCClock rtc_clock(fallback_clock);
 SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 7 - 0
variants/lilygo_tbeam_SX1262/target.h

@@ -7,12 +7,19 @@
 #include <helpers/CustomSX1262Wrapper.h>
 #include <helpers/AutoDiscoverRTCClock.h>
 #include <helpers/SensorManager.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/SSD1306Display.h>
+#endif
 
 extern TBeamBoardSX1262 board;
 extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 extern SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
+
 bool radio_init();
 uint32_t radio_get_rng_seed();
 void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);

+ 4 - 0
variants/lilygo_tlora_v2_1/target.cpp

@@ -12,6 +12,10 @@ ESP32RTCClock fallback_clock;
 AutoDiscoverRTCClock rtc_clock(fallback_clock);
 SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 7 - 0
variants/lilygo_tlora_v2_1/target.h

@@ -7,12 +7,19 @@
 #include <helpers/CustomSX1276Wrapper.h>
 #include <helpers/AutoDiscoverRTCClock.h>
 #include <helpers/SensorManager.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/SSD1306Display.h>
+#endif
 
 extern LilyGoTLoraBoard board;
 extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 extern SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
+
 bool radio_init();
 uint32_t radio_get_rng_seed();
 void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);

+ 0 - 1
variants/nano_g2_ultra/platformio.ini

@@ -39,7 +39,6 @@ build_flags =
   -D BLE_PIN_CODE=0
   -D BLE_DEBUG_LOGGING=1
   -D OFFLINE_QUEUE_SIZE=256
-  -D SH1106
   -D DISPLAY_CLASS=SH1106Display
 ;  -D ENABLE_PRIVATE_KEY_IMPORT=1
 ;  -D ENABLE_PRIVATE_KEY_EXPORT=1

+ 4 - 0
variants/nano_g2_ultra/target.cpp

@@ -12,6 +12,10 @@ VolatileRTCClock fallback_clock;
 AutoDiscoverRTCClock rtc_clock(fallback_clock);
 SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+#endif
+
 #ifndef LORA_CR
 #define LORA_CR 5
 #endif

+ 7 - 0
variants/nano_g2_ultra/target.h

@@ -7,12 +7,19 @@
 #include <helpers/CustomSX1262Wrapper.h>
 #include <helpers/AutoDiscoverRTCClock.h>
 #include <helpers/SensorManager.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/SH1106Display.h>
+#endif
 
 extern NanoG2Ultra board;
 extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 extern SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
+
 bool radio_init();
 uint32_t radio_get_rng_seed();
 void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);

+ 4 - 1
variants/promicro/platformio.ini

@@ -9,7 +9,6 @@ build_flags = ${nrf52840_base.build_flags}
   -D LORA_TX_POWER=22
   -D SX126X_CURRENT_LIMIT=140
   -D SX126X_RX_BOOSTED_GAIN=1
-  -D DISPLAY_CLASS=SSD1306Display
   -D PIN_BOARD_SCL=7
   -D PIN_BOARD_SDA=8
   -D PIN_OLED_RESET=-1
@@ -35,6 +34,7 @@ build_flags =
   -D ADVERT_LON=0.0
   -D ADMIN_PASSWORD='"password"'
   -D MAX_NEIGHBOURS=8
+  -D DISPLAY_CLASS=SSD1306Display
 ;  -D MESH_PACKET_LOGGING=1
 ;  -D MESH_DEBUG=1
 lib_deps = ${Faketec.lib_deps}
@@ -51,6 +51,7 @@ build_flags = ${Faketec.build_flags}
   -D ADVERT_LON=0.0
   -D ADMIN_PASSWORD='"password"'
   -D ROOM_PASSWORD='"hello"'
+  -D DISPLAY_CLASS=SSD1306Display
 ;  -D MESH_PACKET_LOGGING=1
 ;  -D MESH_DEBUG=1
 lib_deps = ${Faketec.lib_deps}
@@ -74,6 +75,7 @@ extends = Faketec
 build_flags = ${Faketec.build_flags}
   -D MAX_CONTACTS=100
   -D MAX_GROUP_CHANNELS=8
+  -D DISPLAY_CLASS=SSD1306Display
 ; NOTE: DO NOT ENABLE -->  -D MESH_PACKET_LOGGING=1
 ; NOTE: DO NOT ENABLE -->  -D MESH_DEBUG=1
 build_src_filter = ${Faketec.build_src_filter}
@@ -93,6 +95,7 @@ build_flags = ${Faketec.build_flags}
   -D ENABLE_PRIVATE_KEY_EXPORT=1
   -D ENABLE_PRIVATE_KEY_IMPORT=1
   -D OFFLINE_QUEUE_SIZE=256
+  -D DISPLAY_CLASS=SSD1306Display
 ;  -D MESH_PACKET_LOGGING=1
 ;  -D MESH_DEBUG=1
 build_src_filter = ${Faketec.build_src_filter}

+ 4 - 0
variants/promicro/target.cpp

@@ -12,6 +12,10 @@ VolatileRTCClock fallback_clock;
 AutoDiscoverRTCClock rtc_clock(fallback_clock);
 PromicroSensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 6 - 0
variants/promicro/target.h

@@ -11,6 +11,9 @@
 #include <INA3221.h>
 #include <INA219.h>
 #include <Adafruit_AHTX0.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/SSD1306Display.h>
+#endif
 
 #define NUM_SENSOR_SETTINGS 3
 
@@ -18,6 +21,9 @@ extern PromicroBoard board;
 extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
 
 bool radio_init();
 uint32_t radio_get_rng_seed();

+ 4 - 0
variants/rak4631/target.cpp

@@ -12,6 +12,10 @@ VolatileRTCClock fallback_clock;
 AutoDiscoverRTCClock rtc_clock(fallback_clock);
 SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 7 - 0
variants/rak4631/target.h

@@ -7,12 +7,19 @@
 #include <helpers/CustomSX1262Wrapper.h>
 #include <helpers/AutoDiscoverRTCClock.h>
 #include <helpers/SensorManager.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/SSD1306Display.h>
+#endif
 
 extern RAK4631Board board;
 extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 extern SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
+
 bool radio_init();
 uint32_t radio_get_rng_seed();
 void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);

+ 24 - 0
variants/t1000-e/NullDisplayDriver.h

@@ -0,0 +1,24 @@
+#pragma once
+
+#include <helpers/ui/DisplayDriver.h>
+
+class NullDisplayDriver : public DisplayDriver {
+public:
+  NullDisplayDriver() : DisplayDriver(128, 64) { }
+  bool begin() { return false; }   // not present
+
+  bool isOn() override { return false; }
+  void turnOn() override { }
+  void turnOff() override { }
+  void clear() override { }
+  void startFrame(Color bkg = DARK) override { }
+  void setTextSize(int sz) override { }
+  void setColor(Color c) override { }
+  void setCursor(int x, int y) override { }
+  void print(const char* str) override { }
+  void fillRect(int x, int y, int w, int h) override { }
+  void drawRect(int x, int y, int w, int h) override { }
+  void drawXbm(int x, int y, const uint8_t* bits, int w, int h) override { }
+  uint16_t getTextWidth(const char* str) override { return 0; }
+  void endFrame() { }
+};

+ 1 - 1
variants/t1000-e/platformio.ini

@@ -46,7 +46,7 @@ build_flags = ${t1000-e.build_flags}
   -D OFFLINE_QUEUE_SIZE=256
   -D RX_BOOSTED_GAIN=true
   -D RF_SWITCH_TABLE
-  -D HAS_UI
+  -D DISPLAY_CLASS=NullDisplayDriver
 build_src_filter = ${t1000-e.build_src_filter}
   +<helpers/nrf52/SerialBLEInterface.cpp>
   +<../examples/companion_radio/*.cpp>

+ 4 - 0
variants/t1000-e/target.cpp

@@ -12,6 +12,10 @@ VolatileRTCClock rtc_clock;
 MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1);
 T1000SensorManager sensors = T1000SensorManager(nmea);
 
+#ifdef DISPLAY_CLASS
+  NullDisplayDriver display;
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 7 - 0
variants/t1000-e/target.h

@@ -8,6 +8,9 @@
 #include <helpers/ArduinoHelpers.h>
 #include <helpers/SensorManager.h>
 #include <helpers/sensors/LocationProvider.h>
+#ifdef DISPLAY_CLASS
+  #include "NullDisplayDriver.h"
+#endif
 
 class T1000SensorManager: public SensorManager {
   bool gps_active = false;
@@ -27,6 +30,10 @@ public:
   bool setSettingValue(const char* name, const char* value) override;
 };
 
+#ifdef DISPLAY_CLASS
+  extern NullDisplayDriver display;
+#endif
+
 extern T1000eBoard board;
 extern WRAPPER_CLASS radio_driver;
 extern VolatileRTCClock rtc_clock;

+ 4 - 0
variants/t114/target.cpp

@@ -14,6 +14,10 @@ AutoDiscoverRTCClock rtc_clock(fallback_clock);
 MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1);
 T114SensorManager sensors = T114SensorManager(nmea);
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 7 - 0
variants/t114/target.h

@@ -8,6 +8,9 @@
 #include <helpers/AutoDiscoverRTCClock.h>
 #include <helpers/SensorManager.h>
 #include <helpers/sensors/LocationProvider.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/ST7789Display.h>
+#endif
 
 class T114SensorManager : public SensorManager {
   bool gps_active = false;
@@ -32,6 +35,10 @@ extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 extern T114SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
+
 bool radio_init();
 uint32_t radio_get_rng_seed();
 void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);

+ 0 - 1
variants/techo/platformio.ini

@@ -64,7 +64,6 @@ build_flags =
   -D BLE_DEBUG_LOGGING=1
   -D DISPLAY_CLASS=GxEPDDisplay
   -D OFFLINE_QUEUE_SIZE=256
-  -D HAS_GxEPD
 ;  -D ENABLE_PRIVATE_KEY_IMPORT=1
 ;  -D ENABLE_PRIVATE_KEY_EXPORT=1
 ;  -D MESH_PACKET_LOGGING=1

+ 4 - 0
variants/techo/target.cpp

@@ -12,6 +12,10 @@ VolatileRTCClock fallback_clock;
 AutoDiscoverRTCClock rtc_clock(fallback_clock);
 SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 8 - 0
variants/techo/target.h

@@ -7,12 +7,20 @@
 #include <helpers/CustomSX1262Wrapper.h>
 #include <helpers/AutoDiscoverRTCClock.h>
 #include <helpers/SensorManager.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/GxEPDDisplay.h>
+#endif
+
 
 extern TechoBoard board;
 extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 extern SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
+
 bool radio_init();
 uint32_t radio_get_rng_seed();
 void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);

+ 0 - 1
variants/thinknode_m1/platformio.ini

@@ -70,7 +70,6 @@ build_flags =
   -D BLE_DEBUG_LOGGING=1
   -D DISPLAY_ROTATION=4
   -D DISPLAY_CLASS=GxEPDDisplay
-  -D HAS_GxEPD
   -D OFFLINE_QUEUE_SIZE=256
 ;  -D ENABLE_PRIVATE_KEY_IMPORT=1
 ;  -D ENABLE_PRIVATE_KEY_EXPORT=1

+ 4 - 0
variants/thinknode_m1/target.cpp

@@ -12,6 +12,10 @@ VolatileRTCClock fallback_clock;
 AutoDiscoverRTCClock rtc_clock(fallback_clock);
 SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 7 - 0
variants/thinknode_m1/target.h

@@ -7,12 +7,19 @@
 #include <helpers/CustomSX1262Wrapper.h>
 #include <helpers/AutoDiscoverRTCClock.h>
 #include <helpers/SensorManager.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/GxEPDDisplay.h>
+#endif
 
 extern ThinkNodeM1Board board;
 extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 extern SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
+
 bool radio_init();
 uint32_t radio_get_rng_seed();
 void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);

+ 4 - 0
variants/xiao_s3_wio/target.cpp

@@ -16,6 +16,10 @@ ESP32RTCClock fallback_clock;
 AutoDiscoverRTCClock rtc_clock(fallback_clock);
 SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+#endif
+
 #ifndef LORA_CR
   #define LORA_CR      5
 #endif

+ 7 - 0
variants/xiao_s3_wio/target.h

@@ -7,12 +7,19 @@
 #include <helpers/CustomSX1262Wrapper.h>
 #include <helpers/AutoDiscoverRTCClock.h>
 #include <helpers/SensorManager.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/SSD1306Display.h>
+#endif
 
 extern ESP32Board board;
 extern WRAPPER_CLASS radio_driver;
 extern AutoDiscoverRTCClock rtc_clock;
 extern SensorManager sensors;
 
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+#endif
+
 bool radio_init();
 uint32_t radio_get_rng_seed();
 void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);