@@ -237,6 +237,8 @@ unsigned long LcdTask::loop(MicroTasks::WakeReason reason)
237
237
_tft.startWrite ();
238
238
#endif
239
239
240
+ uint8_t evse_state = _evse->getEvseState ();
241
+
240
242
switch (_state)
241
243
{
242
244
case State::Boot:
@@ -286,7 +288,12 @@ unsigned long LcdTask::loop(MicroTasks::WakeReason reason)
286
288
} break ;
287
289
288
290
case State::Charge:
289
- {
291
+ {
292
+ // redraw when going in or out of charging state to switch between pilot and power display
293
+ if ((evse_state == OPENEVSE_STATE_CHARGING || _previous_evse_state == OPENEVSE_STATE_CHARGING) && evse_state != _previous_evse_state) {
294
+ _full_update = true ;
295
+ }
296
+
290
297
if (_full_update)
291
298
{
292
299
_screen.fillRect (DISPLAY_AREA_X, DISPLAY_AREA_Y, DISPLAY_AREA_WIDTH, DISPLAY_AREA_HEIGHT, TFT_OPENEVSE_BACK);
@@ -301,8 +308,8 @@ unsigned long LcdTask::loop(MicroTasks::WakeReason reason)
301
308
if (_evse->isVehicleConnected ()) {
302
309
car_icon = " /car_connected.png" ;
303
310
}
304
-
305
- switch (_evse-> getEvseState () )
311
+
312
+ switch (evse_state )
306
313
{
307
314
case OPENEVSE_STATE_STARTING:
308
315
status_icon = " /start.png" ;
@@ -337,7 +344,7 @@ unsigned long LcdTask::loop(MicroTasks::WakeReason reason)
337
344
}
338
345
339
346
char buffer[32 ] = " " ;
340
- char buffer2[10 ];
347
+ char buffer2[12 ];
341
348
342
349
if (wifi_client) {
343
350
if (wifi_connected) {
@@ -358,17 +365,36 @@ unsigned long LcdTask::loop(MicroTasks::WakeReason reason)
358
365
render_image (car_icon.c_str (), 16 , 92 );
359
366
render_image (wifi_icon.c_str (), 16 , 132 );
360
367
361
- snprintf (buffer, sizeof (buffer), " %d" , _evse->getChargeCurrent ());
362
- render_right_text_box (buffer, 66 , 175 , 154 , &FreeSans24pt7b, TFT_BLACK, TFT_WHITE, !_full_update, 2 );
363
- if (_full_update) {
364
- render_left_text_box (" A" , 224 , 165 , 34 , &FreeSans24pt7b, TFT_BLACK, TFT_WHITE, false , 1 );
368
+
369
+ if (evse_state == OPENEVSE_STATE_CHARGING) {
370
+ float power = _evse->getPower () / 1000.0 ; // kW
371
+ if (power < 10 ) {
372
+ snprintf (buffer, sizeof (buffer), " %.2f" , power);
373
+ } else if (power < 100 ) {
374
+ snprintf (buffer, sizeof (buffer), " %.1f" , power);
375
+ } else {
376
+ snprintf (buffer, sizeof (buffer), " %.0f" , power);
377
+ }
378
+ render_left_text_box (buffer, 66 , 157 , 188 , &FreeSans24pt7b, TFT_BLACK, TFT_WHITE, !_full_update, 2 );
379
+ render_left_text_box (" kW" , 224 , 165 , 34 , &FreeSans9pt7b, TFT_BLACK, TFT_WHITE, false , 1 );
380
+ } else {
381
+ snprintf (buffer, sizeof (buffer), " %d" , _evse->getChargeCurrent ());
382
+ render_right_text_box (buffer, 66 , 175 , 154 , &FreeSans24pt7b, TFT_BLACK, TFT_WHITE, !_full_update, 2 );
383
+ if (_full_update) {
384
+ render_left_text_box (" A" , 224 , 165 , 34 , &FreeSans24pt7b, TFT_BLACK, TFT_WHITE, false , 1 );
385
+ }
365
386
}
366
387
if (_evse->isTemperatureValid (EVSE_MONITOR_TEMP_MONITOR)) {
367
388
snprintf (buffer, sizeof (buffer), " %.1fC" , _evse->getTemperature (EVSE_MONITOR_TEMP_MONITOR));
368
389
render_right_text_box (buffer, 415 , 30 , 50 , &FreeSans9pt7b, TFT_WHITE, TFT_OPENEVSE_BACK, false , 1 );
369
390
}
391
+
370
392
snprintf (buffer, sizeof (buffer), " %.1f V %.2f A" , _evse->getVoltage (), _evse->getAmps ());
371
- get_scaled_number_value (_evse->getPower (), 2 , " W" , buffer2, sizeof (buffer2));
393
+ if (evse_state == OPENEVSE_STATE_CHARGING) {
394
+ snprintf (buffer2, sizeof (buffer2), " Pilot: %dA" , _evse->getChargeCurrent ());
395
+ } else {
396
+ get_scaled_number_value (_evse->getPower (), 2 , " W" , buffer2, sizeof (buffer2));
397
+ }
372
398
render_data_box (buffer2, buffer, 66 , 175 , INFO_BOX_WIDTH, INFO_BOX_HEIGHT, _full_update);
373
399
374
400
String line = getLine (0 );
@@ -397,6 +423,8 @@ unsigned long LcdTask::loop(MicroTasks::WakeReason reason)
397
423
strftime (buffer, sizeof (buffer), " %Y-%m-%d %H:%M:%S" , &timeinfo);
398
424
render_left_text_box (buffer, 12 , 30 , 175 , &FreeSans9pt7b, TFT_WHITE, TFT_OPENEVSE_BACK, false , 1 );
399
425
426
+ _previous_evse_state = evse_state;
427
+
400
428
// sleep until next whole second so clock doesn't skip
401
429
gettimeofday (&local_time, NULL );
402
430
nextUpdate = 1000 - local_time.tv_usec /1000 ;
@@ -413,11 +441,9 @@ unsigned long LcdTask::loop(MicroTasks::WakeReason reason)
413
441
#endif
414
442
415
443
#ifdef TFT_BACKLIGHT_TIMEOUT_MS
416
- uint8_t evse_state = _evse->getEvseState ();
417
444
bool vehicle_state = _evse->isVehicleConnected ();
418
445
if (evse_state != _previous_evse_state || vehicle_state != _previous_vehicle_state) { // wake backlight on state change
419
446
wakeBacklight ();
420
- _previous_evse_state = evse_state;
421
447
_previous_vehicle_state = vehicle_state;
422
448
} else { // otherwise timeout backlight in appropriate states
423
449
bool timeout = true ;
@@ -462,7 +488,7 @@ unsigned long LcdTask::loop(MicroTasks::WakeReason reason)
462
488
}
463
489
}
464
490
#endif // TFT_BACKLIGHT_TIMEOUT_MS
465
-
491
+ _previous_evse_state = evse_state;
466
492
DBUGVAR (nextUpdate);
467
493
return nextUpdate;
468
494
}
0 commit comments