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
21+ #define STATUS_BAR_HEIGHT \
22+ 20 // /< Height of the status bar in pixels, assumes 16px icons
23+ #define STATUS_BAR_BORDER 1 // /< Border around the status bar in pixels
2324#define STATUS_BAR_ICON_SZ 16 // /< Size of status bar icons in pixels
2425
2526/* !
@@ -115,84 +116,69 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {
115116 // Calculate icon positions and center vertically
116117 int iconSpacing = 4 ;
117118 int rightMargin = 5 ;
118- int iconY = STATUS_BAR_BORDER + ((STATUS_BAR_HEIGHT - 2 * STATUS_BAR_BORDER - STATUS_BAR_ICON_SZ) / 2 );
119+ int iconY =
120+ STATUS_BAR_BORDER +
121+ ((STATUS_BAR_HEIGHT - 2 * STATUS_BAR_BORDER - STATUS_BAR_ICON_SZ) / 2 );
119122 int batteryX = _display->width () - STATUS_BAR_ICON_SZ - rightMargin;
120123 int wifiX = batteryX - STATUS_BAR_ICON_SZ - iconSpacing;
121124 int cloudX = wifiX - STATUS_BAR_ICON_SZ - iconSpacing;
122125 // Draw icons on right side of the status bar
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+ _display->drawBitmap (cloudX, iconY, epd_bmp_cloud_online,
127+ STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
128+ _display->drawBitmap (wifiX, iconY, epd_bmp_wifi_full, STATUS_BAR_ICON_SZ,
129+ STATUS_BAR_ICON_SZ, EPD_BLACK);
130+ _display->drawBitmap (batteryX, iconY, epd_bmp_bat_full, STATUS_BAR_ICON_SZ,
131+ STATUS_BAR_ICON_SZ, EPD_BLACK);
126132
127133 _display->display ();
128134 }
129135
130- /* !
131- @brief Updates the status bar with current information (battery level,
132- connectivity status, etc).
133- @param rssi
134- The current WiFi RSSI (signal strength) in dB.
135- @param bat
136- The current battery level as a percentage (0-100).
137- @param mqtt_status
138- The current MQTT connection status.
139- */
136+ /* !
137+ @brief Updates the status bar with current information (battery level,
138+ connectivity status, etc).
139+ @param rssi
140+ The current WiFi RSSI (signal strength) in dB.
141+ @param bat
142+ The current battery level as a percentage (0-100).
143+ @param mqtt_status
144+ The current MQTT connection status.
145+ */
140146 void updateStatusBar (int8_t rssi, uint8_t bat, bool mqtt_status) override {
141147 if (!_display)
142148 return ;
143149
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;
150+ bool do_update = false ;
153151
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);
162- }
163- _statusbar_mqtt_connected = mqtt_status;
164- do_update = true ;
165- }
152+ // For EPD - redraws take 1-2 seconds, so only update the cloud state
166153
167- /* // Update WiFi icon only if it changed significantly (+/- 3 dB)
168- if (abs(rssi - _statusbar_rssi) >= 3 || rssi == 0 || _statusbar_rssi == 0 ) {
154+ // Update cloud icon only if it changed state
155+ if (mqtt_status != _statusbar_mqtt_connected ) {
169156 int iconSpacing = 4 ;
170157 int rightMargin = 5 ;
171- int iconY = STATUS_BAR_BORDER + ((STATUS_BAR_HEIGHT - 2 * STATUS_BAR_BORDER - STATUS_BAR_ICON_SZ) / 2);
158+ int iconY =
159+ STATUS_BAR_BORDER +
160+ ((STATUS_BAR_HEIGHT - 2 * STATUS_BAR_BORDER - STATUS_BAR_ICON_SZ) /
161+ 2 );
172162 int batteryX = _display->width () - STATUS_BAR_ICON_SZ - rightMargin;
173163 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);
164+ int cloudX = wifiX - STATUS_BAR_ICON_SZ - iconSpacing;
165+
166+ // Clear and draw the new cloud icon, based on MQTT connection status
167+ _display->fillRect (cloudX, iconY, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ,
168+ EPD_WHITE);
169+ if (mqtt_status == 21 ) {
170+ _display->drawBitmap (cloudX, iconY, epd_bmp_cloud_online,
171+ STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
185172 } else {
186- _display->drawBitmap(wifiX, iconY, epd_bmp_wifi_weak, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
173+ _display->drawBitmap (cloudX, iconY, epd_bmp_cloud_offline,
174+ STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
187175 }
188- _statusbar_rssi = rssi ;
176+ _statusbar_mqtt_connected = mqtt_status ;
189177 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(); */
178+ }
195179
180+ if (do_update)
181+ _display->display ();
196182 }
197183
198184 /* !
@@ -206,9 +192,10 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {
206192 if (_display == nullptr )
207193 return ;
208194
209- // Start with a fresh display buffer
210- _display->clearBuffer ();
211- int16_t y_idx = 0 ;
195+ // Clear only the area below the status bar
196+ _display->fillRect (0 , STATUS_BAR_HEIGHT, _display->width (),
197+ _display->height () - STATUS_BAR_HEIGHT, EPD_WHITE);
198+ int16_t y_idx = STATUS_BAR_HEIGHT;
212199 _display->setCursor (0 , y_idx);
213200
214201 // Calculate the line height based on the text size (NOTE: base height is
0 commit comments