22
22
20 // /< Height of the status bar in pixels, assumes 16px icons
23
23
#define STATUS_BAR_BORDER 1 // /< Border around the status bar in pixels
24
24
#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
27
29
28
30
/* !
29
31
@brief Driver for a ThinkInk 2.9" Grayscale 4-level EAAMFGN display.
@@ -73,7 +75,6 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {
73
75
// Initialize the display
74
76
_display->begin (mode);
75
77
// Configure display settings
76
- _text_sz = 3 ;
77
78
_display->setTextSize (_text_sz);
78
79
_display->setTextColor (EPD_BLACK);
79
80
_display->setTextWrap (false );
@@ -116,16 +117,24 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {
116
117
_display->print (io_username);
117
118
118
119
// 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;
123
129
// 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,
127
132
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,
129
138
STATUS_BAR_ICON_SZ, EPD_BLACK);
130
139
131
140
_display->display ();
@@ -145,21 +154,54 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {
145
154
if (!_display)
146
155
return ;
147
156
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;
149
161
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 ;
151
165
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;
159
193
} 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;
162
195
}
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
+ }
163
205
164
206
_display->display ();
165
207
}
@@ -178,14 +220,19 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {
178
220
// Clear only the area below the status bar
179
221
_display->fillRect (0 , STATUS_BAR_HEIGHT, _display->width (),
180
222
_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 ;
182
225
_display->setCursor (0 , y_idx);
183
226
184
227
// Calculate the line height based on the text size (NOTE: base height is
185
228
// 8px)
186
229
int16_t line_height = 8 * _text_sz;
187
230
uint16_t c_idx = 0 ;
188
231
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
+
189
236
for (size_t i = 0 ; i < msg_size && c_idx < msg_size; i++) {
190
237
if (y_idx + line_height > _height)
191
238
break ;
0 commit comments