Work through the remaining review items in TODO.md
Keep the HTTP session alive between weather polls (TODO #1). Re-creating the client each time forced a fresh TLS handshake inside the window where the UI is frozen. Measured on hardware: the fetch went from ~1.3s to ~80ms, so the pause is no longer long enough to matter once thermostat controls exist. The timeout drops from 30s to 10s once a session is warm, since only a cold handshake needs the longer budget. Any transport error or non-200 tears the session down so a half-open connection cannot poison every later poll. The response buffer is now reset per request rather than on HTTP_EVENT_ON_CONNECTED -- a kept-alive connection does not re-fire that event, so the buffer would have accumulated across polls. Indicate stale readings (TODO #2). After two consecutive failures the temperature dims and the status line shows the age. Age comes from tick counts, not weather_data_t.last_update: there is no SNTP client here, so time(NULL) starts at the epoch and any age derived from it is meaningless. Gate the touch readout behind UI_DEBUG_TOUCH, default off (TODO #3). Kept the note about LVGL not bubbling events to parents -- it documents a real trap. Delete main/utils (TODO #4); it had no callers outside itself. Also refreshed project_structure.txt, which was additionally missing i2c_bus and backlight. Lay out two 4MB OTA slots (TODO #5) while no devices are fielded, and document in the README that an OTA download cannot run while the panel is scanning -- the flash write faults the bounce-buffer ISR. Log the truncation warning once per response instead of once per chunk, and record the weather task's stack high-water mark (TODO #6): ~2400 bytes spare of 6144. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
1 parent
5bbb50c4eb
commit
d4b2ab7f99
10 files changed
+222
-101
No files matched your search
+38
-8
@@ -11,10 +11,19 @@ static const char *TAG = "ui_manager";
|
||||
|
||||
#define UI_LOCK_TIMEOUT_MS 1000
|
||||
|
||||
/*
|
||||
* Bring-up diagnostic: a live readout of the last touch coordinate. Off by
|
||||
* default -- define UI_DEBUG_TOUCH to put it back on screen when working on
|
||||
* the input path.
|
||||
*/
|
||||
/* #define UI_DEBUG_TOUCH */
|
||||
|
||||
static lv_obj_t *temp_label = NULL;
|
||||
static lv_obj_t *cond_label = NULL;
|
||||
static lv_obj_t *status_label = NULL;
|
||||
#ifdef UI_DEBUG_TOUCH
|
||||
static lv_obj_t *touch_label = NULL;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* lv_label_set_text() invalidates the label unconditionally, even when the
|
||||
@@ -37,15 +46,15 @@ static void label_set_if_changed(lv_obj_t *label, const char *text)
|
||||
}
|
||||
|
||||
/*
|
||||
* Live readout of the last contact.
|
||||
*
|
||||
* Polled from an LVGL timer rather than driven by a widget event. An event
|
||||
* handler on the screen object only fires for taps that actually reach the
|
||||
* screen: LVGL does not bubble events to parents by default, so anything
|
||||
* landing on the header or the temperature card is consumed by that child and
|
||||
* never seen here. That made whole regions of the panel look like dead touch
|
||||
* zones when the hardware was reporting them perfectly well.
|
||||
* NOTE, even with the readout compiled out: LVGL does not bubble events to
|
||||
* parents by default. An event handler on the screen object never fires for
|
||||
* taps landing on a child widget -- the header or the temperature card
|
||||
* consume them -- which presents as whole regions of the panel being dead to
|
||||
* touch while the hardware reports them perfectly well. Anything that needs
|
||||
* to observe touches screen-wide must poll the input device, as below, rather
|
||||
* than hang an event handler on the screen.
|
||||
*/
|
||||
#ifdef UI_DEBUG_TOUCH
|
||||
static void touch_readout_timer_cb(lv_timer_t *timer)
|
||||
{
|
||||
lv_indev_t *indev = lv_indev_get_next(NULL);
|
||||
@@ -64,6 +73,7 @@ static void touch_readout_timer_cb(lv_timer_t *timer)
|
||||
}
|
||||
label_set_if_changed(touch_label, buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
void ui_update_weather(int16_t temp_f, const char *condition)
|
||||
{
|
||||
@@ -80,6 +90,24 @@ void ui_update_weather(int16_t temp_f, const char *condition)
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
|
||||
void ui_set_weather_stale(bool stale)
|
||||
{
|
||||
if (!lvgl_port_lock(UI_LOCK_TIMEOUT_MS)) {
|
||||
ESP_LOGW(TAG, "Dropped stale-state update: LVGL lock timed out");
|
||||
return;
|
||||
}
|
||||
|
||||
if (temp_label != NULL) {
|
||||
/* Unlike lv_label_set_text(), setting an identical style value does
|
||||
* not invalidate, so this is safe to call on every poll. */
|
||||
lv_obj_set_style_text_color(temp_label,
|
||||
stale ? lv_color_hex(0x5A6672) : lv_color_white(),
|
||||
LV_PART_MAIN);
|
||||
}
|
||||
|
||||
lvgl_port_unlock();
|
||||
}
|
||||
|
||||
void ui_set_status(const char *status)
|
||||
{
|
||||
if (status == NULL) {
|
||||
@@ -150,11 +178,13 @@ void ui_init(void)
|
||||
lv_label_set_text(status_label, "Starting...");
|
||||
lv_obj_set_style_text_color(status_label, lv_color_hex(0x7F8C8D), LV_PART_MAIN);
|
||||
|
||||
#ifdef UI_DEBUG_TOUCH
|
||||
touch_label = lv_label_create(scr);
|
||||
lv_label_set_text(touch_label, "touch --, --");
|
||||
lv_obj_set_style_text_color(touch_label, lv_color_hex(0x3498DB), LV_PART_MAIN);
|
||||
|
||||
lv_timer_create(touch_readout_timer_cb, 100, NULL);
|
||||
#endif
|
||||
|
||||
lvgl_port_unlock();
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#ifndef UI_MANAGER_H
|
||||
#define UI_MANAGER_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "lvgl.h"
|
||||
|
||||
@@ -10,4 +11,11 @@ void ui_init(void);
|
||||
void ui_update_weather(int16_t temp_f, const char *condition);
|
||||
void ui_set_status(const char *status);
|
||||
|
||||
/*
|
||||
* Mark the displayed reading as no longer trustworthy. Dims the temperature
|
||||
* so a value that stopped updating is visibly distinct from a live one,
|
||||
* rather than sitting there at full styling looking current.
|
||||
*/
|
||||
void ui_set_weather_stale(bool stale);
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user