2222 20 // /< Height of the status bar in pixels, assumes 16px icons
2323#define STATUS_BAR_BORDER 1 // /< Border around the status bar in pixels
2424#define STATUS_BAR_ICON_SZ 16 // /< Size of status bar icons in pixels
25- #define STATUS_BAR_ICON_SPACING 4 // /< Spacing between status bar icons in pixels
26- #define STATUS_BAR_ICON_MARGIN 5 // /< Margin from edge of display to status bar icons in pixels
25+ #define STATUS_BAR_ICON_SPACING \
26+ 4 // /< Spacing between status bar icons in pixels
27+ #define STATUS_BAR_ICON_MARGIN \
28+ 5 // /< Margin from edge of display to status bar icons in pixels
2729
2830/* !
2931 @brief Driver for a ThinkInk 2.9" Grayscale 4-level EAAMFGN display.
@@ -73,7 +75,6 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {
7375 // Initialize the display
7476 _display->begin (mode);
7577 // Configure display settings
76- _text_sz = 3 ;
7778 _display->setTextSize (_text_sz);
7879 _display->setTextColor (EPD_BLACK);
7980 _display->setTextWrap (false );
@@ -116,16 +117,24 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {
116117 _display->print (io_username);
117118
118119 // Calculate status bar icon positions and center vertically
119- _statusbar_icons_y = STATUS_BAR_BORDER + ((STATUS_BAR_HEIGHT - 2 * STATUS_BAR_BORDER - STATUS_BAR_ICON_SZ) / 2 );
120- _statusbar_icon_battery_x = _display->width () - STATUS_BAR_ICON_SZ - STATUS_BAR_ICON_MARGIN;
121- _statusbar_icon_wifi_x = _statusbar_icon_battery_x - STATUS_BAR_ICON_SZ - STATUS_BAR_ICON_SPACING;
122- _statusbar_icon_cloud_x = _statusbar_icon_wifi_x - STATUS_BAR_ICON_SZ - STATUS_BAR_ICON_SPACING;
120+ _statusbar_icons_y =
121+ STATUS_BAR_BORDER +
122+ ((STATUS_BAR_HEIGHT - 2 * STATUS_BAR_BORDER - STATUS_BAR_ICON_SZ) / 2 );
123+ _statusbar_icon_battery_x =
124+ _display->width () - STATUS_BAR_ICON_SZ - STATUS_BAR_ICON_MARGIN;
125+ _statusbar_icon_wifi_x = _statusbar_icon_battery_x - STATUS_BAR_ICON_SZ -
126+ STATUS_BAR_ICON_SPACING;
127+ _statusbar_icon_cloud_x =
128+ _statusbar_icon_wifi_x - STATUS_BAR_ICON_SZ - STATUS_BAR_ICON_SPACING;
123129 // Draw icons on right side of the status bar
124- _display->drawBitmap (_statusbar_icon_cloud_x, _statusbar_icons_y, epd_bmp_cloud_online,
125- STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
126- _display->drawBitmap (_statusbar_icon_wifi_x, _statusbar_icons_y, epd_bmp_wifi_full, STATUS_BAR_ICON_SZ,
130+ _display->drawBitmap (_statusbar_icon_cloud_x, _statusbar_icons_y,
131+ epd_bmp_cloud_online, STATUS_BAR_ICON_SZ,
127132 STATUS_BAR_ICON_SZ, EPD_BLACK);
128- _display->drawBitmap (_statusbar_icon_battery_x, _statusbar_icons_y, epd_bmp_bat_full, STATUS_BAR_ICON_SZ,
133+ _display->drawBitmap (_statusbar_icon_wifi_x, _statusbar_icons_y,
134+ epd_bmp_wifi_full, STATUS_BAR_ICON_SZ,
135+ STATUS_BAR_ICON_SZ, EPD_BLACK);
136+ _display->drawBitmap (_statusbar_icon_battery_x, _statusbar_icons_y,
137+ epd_bmp_bat_full, STATUS_BAR_ICON_SZ,
129138 STATUS_BAR_ICON_SZ, EPD_BLACK);
130139
131140 _display->display ();
@@ -145,21 +154,54 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {
145154 if (!_display)
146155 return ;
147156
148- bool do_update = false ;
157+ // Only update wifi icon if the RSSI has changed significantly (+/- 5dB)
158+ bool update_rssi = abs (rssi - _statusbar_rssi) >= 5 ;
159+ // Only update cloud icon if MQTT status has changed
160+ bool update_mqtt = mqtt_status != _statusbar_mqtt_connected;
149161
150- // For EPD - redraws take 1-2 seconds, so only update the cloud state
162+ // No need to update if nothing has changed
163+ if (!update_rssi && !update_mqtt)
164+ return ;
151165
152- // Update cloud icon only if it changed state
153- // Clear and draw the new cloud icon, based on MQTT connection status
154- _display->fillRect (_statusbar_icon_cloud_x, _statusbar_icons_y, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ,
155- EPD_WHITE);
156- if (mqtt_status == 21 ) {
157- _display->drawBitmap (_statusbar_icon_cloud_x, _statusbar_icons_y, epd_bmp_cloud_online,
158- STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
166+ if (update_mqtt) {
167+ // updating the RSSI occurs too frequently to be practical
168+ _display->fillRect (_statusbar_icon_cloud_x, _statusbar_icons_y,
169+ STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_WHITE);
170+ if (mqtt_status) {
171+ _display->drawBitmap (_statusbar_icon_cloud_x, _statusbar_icons_y,
172+ epd_bmp_cloud_online, STATUS_BAR_ICON_SZ,
173+ STATUS_BAR_ICON_SZ, EPD_BLACK);
174+ } else {
175+ _display->drawBitmap (_statusbar_icon_cloud_x, _statusbar_icons_y,
176+ epd_bmp_cloud_offline, STATUS_BAR_ICON_SZ,
177+ STATUS_BAR_ICON_SZ, EPD_BLACK);
178+ }
179+ _statusbar_mqtt_connected = mqtt_status;
180+ }
181+
182+ // Update WiFi icon only if RSSI has changed significantly (+/-3dB)
183+ if (update_rssi) {
184+ const unsigned char *wifi_icon = epd_bmp_wifi_no_signal;
185+ if (rssi >= -50 ) {
186+ wifi_icon = epd_bmp_wifi_full;
187+ } else if (rssi < -50 && rssi >= -60 ) {
188+ wifi_icon = epd_bmp_wifi_fair;
189+ } else if (rssi < -60 && rssi >= -70 ) {
190+ wifi_icon = epd_bmp_wifi_weak;
191+ } else if (rssi < -70 && rssi >= -80 ) {
192+ wifi_icon = epd_bmp_wifi_no_signal;
159193 } else {
160- _display->drawBitmap (_statusbar_icon_cloud_x, _statusbar_icons_y, epd_bmp_cloud_offline,
161- STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_BLACK);
194+ wifi_icon = epd_bmp_wifi_no_signal;
162195 }
196+ // Clear and draw the new WiFi icon, based on RSSI
197+ _display->fillRect (_statusbar_icon_wifi_x, _statusbar_icons_y,
198+ STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ,
199+ EPD_WHITE);
200+ _display->drawBitmap (_statusbar_icon_wifi_x, _statusbar_icons_y,
201+ wifi_icon, STATUS_BAR_ICON_SZ,
202+ STATUS_BAR_ICON_SZ, EPD_BLACK);
203+ _statusbar_rssi = rssi;
204+ }
163205
164206 _display->display ();
165207 }
@@ -178,14 +220,19 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {
178220 // Clear only the area below the status bar
179221 _display->fillRect (0 , STATUS_BAR_HEIGHT, _display->width (),
180222 _display->height () - STATUS_BAR_HEIGHT, EPD_WHITE);
181- int16_t y_idx = STATUS_BAR_HEIGHT;
223+ // Add padding between status bar and text content
224+ int16_t y_idx = STATUS_BAR_HEIGHT + 4 ;
182225 _display->setCursor (0 , y_idx);
183226
184227 // Calculate the line height based on the text size (NOTE: base height is
185228 // 8px)
186229 int16_t line_height = 8 * _text_sz;
187230 uint16_t c_idx = 0 ;
188231 size_t msg_size = strlen (message);
232+
233+ // Reset the text size to the configured value before we write
234+ _display->setTextSize (_text_sz);
235+
189236 for (size_t i = 0 ; i < msg_size && c_idx < msg_size; i++) {
190237 if (y_idx + line_height > _height)
191238 break ;
0 commit comments