mirror of
https://github.com/mikecarper/MeshCore.git
synced 2026-09-26 18:47:56 +00:00
dfdcc25b50de07b40312431c6582ddbfb1dabe2e
2
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
018d68063f |
fix(display): harden CHSC6X polling and long-gap activity accounting
Addresses a Codex review of the preceding three commits. Touch could disable itself for the whole session. begin() latched _present from a single address probe, but this controller NACKs whenever it has nothing to report, so an idle probe at boot was indistinguishable from absent hardware. The probe is now diagnostics only; checkTap() polls regardless, and a NACK costs one quiet bus cycle. Touch no longer mutates shared bus state. Wrapping the read in setTimeOut()/restore was an unsynchronised global write, and the MQTT task drives the same Wire through AutoDiscoverRTCClock in its NTP fallback, so it could inherit the short timeout. The address probe alone removes the ESP_ERR_TIMEOUT stalls that motivated it, and it also ran before the timeout was installed, so the transaction most exposed to a wedged bus was unprotected anyway. A single failed read could fake a release. The debounce window was 40 ms against a 50 ms poll, so a state change was confirmed by the very next sample and one NACK mid-touch produced a release followed by a second tap. It is now 80 ms - two consecutive consistent reads. RadioActivityWindow froze after a gap longer than ~24.8 days. tick() treated any delta past the signed halfway mark as an out-of-order timestamp, so a node left unserviced that long kept a month-old packet in the 20-minute window and reported it as recently received. A backwards step is now only believed when it is small, which is what an out-of-order reading between two call sites actually looks like. Not changed: a downgrade that then saves prefs drops the display group, since /mqtt.json is rewritten from the older serializer's known schema. That is inherent to every appended field in this format, and bumping the JSON version would be worse - older firmware would reject the file rather than ignore one group. Documented instead. |
||
|
|
fcd92e985f |
feat(display): add R8 observer TFT dashboard, touch toggle and display.timeout
Replace the sparse Heltec V4 R8 observer home screen with a padded dark analytics dashboard, add manual display control, and make blanking a runtime setting. Dashboard (DISPLAY_ACTIVITY_DASHBOARD, the four R8 TFT observer envs): - RadioActivityWindow: 20 one-minute buckets of valid RX packets, no heap. The caller's 32-bit millis() is extended to a monotonic 64-bit clock, so nothing downstream has a rollover case; an always-on node passes 2^32 ms after ~49.7 days, which would otherwise re-enter warm-up and divide 20 minutes of traffic by seconds. Rates use 19 whole minutes plus the elapsed part of the current one rather than a fixed 1200 s. - ObserverDashboard: header, radio strip, headline totals, a 20-bar packets-per-minute graph and RF/status footers, with separate portrait and landscape layouts. A text row is a fixed 16 px, which is 3.2 logical units in portrait but 4.27 in landscape, so one shared grid would overlap. Text is trimmed by character budget, not measured width: getTextWidth() reports an over-long string at the portrait driver's fallback scale, so DisplayDriver::drawTextEllipsized() under-trims and the row renders at half height. - Six per-row signatures computed from what is actually drawn, so only the rows whose pixels changed repaint. No startFrame(), no whole-screen clear. Link state moved out of the full-frame signature, so a DHCP renewal or WiFi flap repaints one footer row instead of the panel. - Dark theme by retuning the UIColor statics at runtime, which needs no display-driver edit and carries boot, setup, reboot and power-off with it. Touch and button (DISPLAY_TOUCH_TOGGLE): - CHSC6X at I2C 0x2E, polled; TP_INT is unusable (optional R13, and GPIO 43 is U0TXD). The point-count byte is tested against a valid count, never against non-zero: an idle read returns 0xFF, which reads as a finger held down forever and latches the tap detector after one event. - turnOff() no longer parks PIN_TFT_RST low on this board. GPIO 21 is a shared LCD_RST/TP_RST net, so doing that held the touch controller in reset for as long as the display was off. Verified against Heltec's expansion-board and mainboard schematics and the V4-R8 datasheet pinout, which also correct the pin comment in HeltecV4R8Board.cpp. - The USER button click now toggles the display too; it previously did nothing whenever the display was already on. display.timeout: - `set display.timeout <secs>` / `get display.timeout`, 0 = stay on, 60 s default, 3600 max. Read live, so a change applies without a reboot and restarts the countdown rather than firing on the old deadline. - Stored in MQTTPrefs (/mqtt.json), keeping NodePrefs aligned with upstream. Runtime-only: LegacyV1MQTTPrefs and the four frozen binary payload sizes are unchanged. No JSON format-version bump - the loader skips keys no def() claims, so older firmware reads newer files and this firmware reads older ones with the default applied. Both directions are covered by tests. - Joins the observer atomic-setter contract, so a failed save rolls the live value back instead of only claiming to. New periodic work uses a wrap-safe deadline check; `millis() >= deadline` fires every loop for a whole interval before each rollover. Adds test_radio_activity_window, test_observer_dashboard (driving the real renderer against a recording DisplayDriver in both orientation profiles) and test_touch_tap_detector. 440 native cases pass. |