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
@@ -25,7 +25,6 @@ implemented yet.
|
||||
| `main/ui/ui_manager.c` | Screen layout and update entry points |
|
||||
| `main/wifi` | WiFi station bring-up |
|
||||
| `main/api` | Ambient Weather REST client |
|
||||
| `main/utils` | Small helpers |
|
||||
|
||||
## Setup
|
||||
|
||||
@@ -124,6 +123,21 @@ High Performance Mode and a DC-aware bootloader.
|
||||
is running faults it with *"Cache disabled but cached memory region
|
||||
accessed"*.
|
||||
|
||||
## Partitions
|
||||
|
||||
Two 4 MB OTA slots (`ota_0` / `ota_1`) with `otadata`, laid out in
|
||||
`partitions.csv`. The app is ~1.4 MB, so the slots are generous — but the
|
||||
layout is fixed once devices are fielded, and re-partitioning later means
|
||||
reflashing each one over USB. ~7.9 MB of the 16 MB is left unallocated;
|
||||
adding a partition to free space is safe, moving an existing one is not.
|
||||
|
||||
> **OTA is not yet implemented, and it is not a drop-in.** Writing an OTA image
|
||||
> is a flash write, and the bounce-buffer refill ISR reads PSRAM, which shares
|
||||
> the cache with flash on the S3 (see Memory notes). Downloading an update
|
||||
> while the panel is scanning **will** fault that ISR. Any implementation must
|
||||
> stop the panel for the download and write, or reboot into a dedicated
|
||||
> updater mode first.
|
||||
|
||||
## Memory notes
|
||||
|
||||
Two 800×480×2 framebuffers (750 KB each) live in PSRAM. The 8 MB **octal**
|
||||
|
||||
Reference in new issue
Block a user