1818
1919#include " dispDrvBase.h"
2020
21+ #define STATUS_BAR_HEIGHT 20 // /< Height of the status bar in pixels, assumes 16px icons
22+ #define STATUS_BAR_BORDER 1 // /< Border around the status bar in pixels
23+ #define STATUS_BAR_ICON_SZ 16 // /< Size of status bar icons in pixels
24+
2125/* !
2226 @brief Driver for a ThinkInk 2.9" Grayscale 4-level EAAMFGN display.
2327*/
@@ -84,7 +88,6 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {
8488 return ;
8589 _display->drawBitmap (0 , 0 , epd_bitmap_ws_logo_296128, 296 , 128 , EPD_BLACK);
8690 _display->display ();
87- delay (50 );
8891 }
8992
9093 /* !
@@ -94,13 +97,14 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {
9497 if (!_display)
9598 return ;
9699
100+ // Clear the entire display buffer to remove splash screen
101+ _display->clearBuffer ();
102+
97103 // Draw status bar
98- int barHeight = 20 ; // Assumes 16x16 icons
99- int borderWidth = 1 ;
100- _display->fillRect (0 , 0 , _display->width (), barHeight, EPD_BLACK);
101- _display->fillRect (borderWidth, borderWidth,
102- _display->width () - (2 * borderWidth),
103- barHeight - (2 * borderWidth), EPD_WHITE);
104+ _display->fillRect (0 , 0 , _display->width (), STATUS_BAR_HEIGHT, EPD_BLACK);
105+ _display->fillRect (STATUS_BAR_BORDER, STATUS_BAR_BORDER,
106+ _display->width () - (2 * STATUS_BAR_BORDER),
107+ STATUS_BAR_HEIGHT - (2 * STATUS_BAR_BORDER), EPD_WHITE);
104108
105109 // Draw username on left side of the status bar
106110 _display->setTextSize (1 );
@@ -109,49 +113,86 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {
109113 _display->print (io_username);
110114
111115 // Calculate icon positions and center vertically
112- int iconSize = 16 ;
113116 int iconSpacing = 4 ;
114117 int rightMargin = 5 ;
115- int iconY = borderWidth + ((barHeight - 2 * borderWidth - iconSize ) / 2 );
116- int batteryX = _display->width () - iconSize - rightMargin;
117- int wifiX = batteryX - iconSize - iconSpacing;
118- int cloudX = wifiX - iconSize - iconSpacing;
118+ int iconY = STATUS_BAR_BORDER + ((STATUS_BAR_HEIGHT - 2 * STATUS_BAR_BORDER - STATUS_BAR_ICON_SZ ) / 2 );
119+ int batteryX = _display->width () - STATUS_BAR_ICON_SZ - rightMargin;
120+ int wifiX = batteryX - STATUS_BAR_ICON_SZ - iconSpacing;
121+ int cloudX = wifiX - STATUS_BAR_ICON_SZ - iconSpacing;
119122 // Draw icons on right side of the status bar
120- _display->drawBitmap (cloudX, iconY, epd_bmp_cloud, iconSize, iconSize,
121- EPD_BLACK);
122- _display->drawBitmap (wifiX, iconY, epd_bmp_wifi, iconSize, iconSize,
123- EPD_BLACK);
124- _display->drawBitmap (batteryX, iconY, epd_bmp_bat_full, iconSize, iconSize,
125- EPD_BLACK);
123+ _display->drawBitmap (cloudX, iconY, epd_bmp_cloud_online, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
124+ _display->drawBitmap (wifiX, iconY, epd_bmp_wifi_full, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
125+ _display->drawBitmap (batteryX, iconY, epd_bmp_bat_full, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
126+
127+ _display->display ();
126128 }
127129
128- /* !
130+ /* !
129131 @brief Updates the status bar with current information (battery level,
130132 connectivity status, etc).
131133 @param rssi
132- The current RSSI value to display .
134+ The current WiFi RSSI (signal strength) in dB .
133135 @param bat
134- The current battery level (0-100) to display .
135- @param mqtt_connected
136- The current MQTT connection status to display .
136+ The current battery level as a percentage (0-100).
137+ @param mqtt_status
138+ The current MQTT connection status.
137139 */
138- void updateStatusBar (int8_t rssi, uint8_t bat,
139- ws_status_t mqtt_connected) override {
140+ void updateStatusBar (int8_t rssi, uint8_t bat, bool mqtt_status) override {
140141 if (!_display)
141142 return ;
142143
143- if (bat != _statusbar_bat) {
144- // Update battery icon
145- _statusbar_bat = bat;
144+ bool do_update = false ;
145+ // Update cloud icon only if it changed
146+ if (mqtt_status != _statusbar_mqtt_connected) {
147+ int iconSpacing = 4 ;
148+ int rightMargin = 5 ;
149+ int iconY = STATUS_BAR_BORDER + ((STATUS_BAR_HEIGHT - 2 * STATUS_BAR_BORDER - STATUS_BAR_ICON_SZ) / 2 );
150+ int batteryX = _display->width () - STATUS_BAR_ICON_SZ - rightMargin;
151+ int wifiX = batteryX - STATUS_BAR_ICON_SZ - iconSpacing;
152+ int cloudX = wifiX - STATUS_BAR_ICON_SZ - iconSpacing;
153+
154+ // Clear and draw the new cloud icon, based on MQTT connection status
155+ _display->fillRect (cloudX, iconY, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_WHITE);
156+ if (mqtt_status == 21 ) {
157+ _display->drawBitmap (cloudX, iconY, epd_bmp_cloud_online, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ,
158+ EPD_BLACK);
159+ } else {
160+ _display->drawBitmap (cloudX, iconY, epd_bmp_cloud_offline, STATUS_BAR_ICON_SZ,
161+ STATUS_BAR_ICON_SZ, EPD_BLACK);
146162 }
147- if (rssi != _statusbar_rssi) {
148- // Update WiFi icon
163+ _statusbar_mqtt_connected = mqtt_status;
164+ do_update = true ;
165+ }
166+
167+ /* // Update WiFi icon only if it changed significantly (+/- 3 dB)
168+ if (abs(rssi - _statusbar_rssi) >= 3 || rssi == 0 || _statusbar_rssi == 0) {
169+ int iconSpacing = 4;
170+ int rightMargin = 5;
171+ int iconY = STATUS_BAR_BORDER + ((STATUS_BAR_HEIGHT - 2 * STATUS_BAR_BORDER - STATUS_BAR_ICON_SZ) / 2);
172+ int batteryX = _display->width() - STATUS_BAR_ICON_SZ - rightMargin;
173+ int wifiX = batteryX - STATUS_BAR_ICON_SZ - iconSpacing;
174+
175+ // Clear and draw the new WiFi icon, based on RSSI
176+ _display->fillRect(wifiX, iconY, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_WHITE);
177+ if (rssi == 0) {
178+ _display->drawBitmap(wifiX, iconY, epd_bmp_wifi_no_signal, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
179+ } else if (rssi > -50) {
180+ _display->drawBitmap(wifiX, iconY, epd_bmp_wifi_full, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
181+ } else if (rssi > -60) {
182+ _display->drawBitmap(wifiX, iconY, epd_bmp_wifi_fair, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
183+ } else if (rssi > -70) {
184+ _display->drawBitmap(wifiX, iconY, epd_bmp_wifi_weak, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
185+ } else {
186+ _display->drawBitmap(wifiX, iconY, epd_bmp_wifi_weak, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
187+ }
149188 _statusbar_rssi = rssi;
150- }
151- if (mqtt_connected != _statusbar_mqtt_connected) {
152- // Update cloud icon
153- _statusbar_mqtt_connected = mqtt_connected;
154- }
189+ do_update = true;
190+ } */
191+
192+ // Temporarily removed while I get clarification on how often to refresh the epd
193+ /* if (do_update)
194+ _display->display(); */
195+
155196 }
156197
157198 /* !
0 commit comments