src.nth.io/

summaryrefslogtreecommitdiff
path: root/main/display.c
diff options
context:
space:
mode:
authorLuke Hoersten <[email protected]>2026-06-14 18:30:44 -0500
committerLuke Hoersten <[email protected]>2026-06-14 18:30:44 -0500
commit186fd85422f99dfb59d89ae9338dc50627f7c3e5 (patch)
tree59db53e2962dc815151b9e70a4d6f1ce53c22a98 /main/display.c
parent4a6bbdb075a5e4f9910cb9b85e615ff8c50aa4ec (diff)
Tidy: delete dead code, inline single-use helpers, fix double-lock
Code-review pass after the M5 colour fix. -126 net lines (-215 / +89). Dead code removed: - display_fill, display_test_pattern — M3 bring-up self-tests, no callers - net_eth_is_up — no callers - nvs_config_reset — no callers (factory-reset gesture was removed earlier; NVS wipe now goes through `idf.py erase-flash`) Helpers inlined or collapsed (each had one call site): - state_name / orientation_name — ternaries at the cJSON site - fmt_bytes / fmt_uptime — inline scope in local_screens_show_info - expected_dims (http_api) + effective_dims (local_screens) — merged into viewport_state_effective_dims() in viewport_state, one canonical source state_machine cleanup: - arm_idle_timer_unlocked / disarm_idle_timer collapsed to one arm_idle_timer(ms) that takes the snapshotted timeout (ms==0 disables). Removes the misleading name and the second viewport_state lock acquisition per painted frame. - state_machine_set + state_machine_frame_painted now snapshot state + idle_ms under one lock. mdns_service cleanup: - snapshot_state / apply_hostname / apply_txt collapsed into a single apply_state(include_hostname) helper; mdns_service_start grabs hostname once for hostname_set + log instead of going under the lock three times. http_api cleanup: - POST /config brightness-changed path uses the local `bright` it already validated instead of re-locking + re-reading st->brightness. - Trimmed verbose bring-up comments (stack-size justification, M5 saga, DSI shadow struct) to one line each — kept the load-bearing facts. Smoke-tested on hardware: boot clean, display + JPEG + touch all up ([DJT]), info screen renders, no crashes.
Diffstat (limited to 'main/display.c')
-rw-r--r--main/display.c57
1 files changed, 5 insertions, 52 deletions
diff --git a/main/display.c b/main/display.c
index 13babdb..a704891 100644
--- a/main/display.c
+++ b/main/display.c
@@ -101,13 +101,8 @@ enum {
#define TC_PPI_STARTPPI 0x0104
#define TC_DSI_STARTDSI 0x0204
-// Shadow of esp_lcd_dsi_bus_t. The IDF private struct is
-// { int bus_id; mipi_dsi_hal_context_t hal; esp_pm_lock_handle_t pm_lock; }
-// (esp-idf/components/esp_lcd/dsi/mipi_dsi_priv.h). We only need bus_id +
-// hal to reach the LL/HAL APIs, so the trailing pm_lock is fine to ignore.
-// If the IDF layout shifts in a future release this is the place that
-// breaks first — guarded by ESP-IDF version is overkill until it actually
-// breaks.
+// Mirror of esp_lcd_dsi_bus_t (esp-idf/components/esp_lcd/dsi/mipi_dsi_priv.h)
+// — needed to reach the HAL/LL APIs for the TC358762 bridge init.
typedef struct {
int bus_id;
mipi_dsi_hal_context_t hal;
@@ -424,12 +419,9 @@ esp_err_t display_wake(void)
return err;
}
-// RGB565 → RGB888 in B,G,R byte order. The ESP32-P4 DSI engine + TC358762
-// bridge pipeline expects BGR on the wire for the panel's RGB channels —
-// writing R first paints pure blue as solid red on the panel (verified
-// with the M5 self-test: decoded buffer holds 0x001F, panel showed red).
-// Symmetric pixels (white text on black) don't expose this; saturated
-// channel inputs do.
+// RGB565 → 24-bit pixel in B,G,R memory order — what the DSI engine +
+// TC358762 + Pi panel pipeline expects (the "RGB888" label refers to the
+// MIPI wire bit order, not byte position in PSRAM).
static inline void rgb565_to_rgb888(uint16_t px, uint8_t *out)
{
out[0] = (uint8_t)(( px & 0x1F) * 255 / 31); // B
@@ -437,22 +429,6 @@ static inline void rgb565_to_rgb888(uint16_t px, uint8_t *out)
out[2] = (uint8_t)(((px >> 11) & 0x1F) * 255 / 31); // R
}
-esp_err_t display_fill(uint16_t rgb565)
-{
- if (!s_up || !s_rot_buf) return ESP_ERR_INVALID_STATE;
- uint8_t rgb[3];
- rgb565_to_rgb888(rgb565, rgb);
- size_t n = PANEL_H_ACTIVE * PANEL_V_ACTIVE;
- for (size_t i = 0; i < n; ++i) {
- s_rot_buf[i * 3 + 0] = rgb[0];
- s_rot_buf[i * 3 + 1] = rgb[1];
- s_rot_buf[i * 3 + 2] = rgb[2];
- }
- return esp_lcd_panel_draw_bitmap(s_panel, 0, 0,
- PANEL_H_ACTIVE, PANEL_V_ACTIVE,
- s_rot_buf);
-}
-
esp_err_t display_present_rgb565(const uint16_t *src,
uint16_t src_w,
uint16_t src_h)
@@ -463,8 +439,6 @@ esp_err_t display_present_rgb565(const uint16_t *src,
viewport_orientation_t orient = viewport_state_get()->orientation;
viewport_state_unlock();
- if (!s_rot_buf) return ESP_ERR_INVALID_STATE;
-
if (orient == VIEWPORT_ORIENTATION_LANDSCAPE) {
if (src_w != PANEL_H_ACTIVE || src_h != PANEL_V_ACTIVE)
return ESP_ERR_INVALID_SIZE;
@@ -489,24 +463,3 @@ esp_err_t display_present_rgb565(const uint16_t *src,
PANEL_H_ACTIVE, PANEL_V_ACTIVE,
s_rot_buf);
}
-
-esp_err_t display_test_pattern(void)
-{
- if (!s_up || !s_rot_buf) return ESP_ERR_INVALID_STATE;
- static const uint16_t bars[8] = {
- 0xFFFF, 0xFFE0, 0x07FF, 0x07E0,
- 0xF81F, 0xF800, 0x001F, 0x0000,
- };
- const int bar_w = PANEL_H_ACTIVE / 8;
- for (int y = 0; y < PANEL_V_ACTIVE; ++y) {
- for (int x = 0; x < PANEL_H_ACTIVE; ++x) {
- int b = x / bar_w;
- if (b > 7) b = 7;
- size_t idx = ((size_t)y * PANEL_H_ACTIVE + x) * 3;
- rgb565_to_rgb888(bars[b], &s_rot_buf[idx]);
- }
- }
- return esp_lcd_panel_draw_bitmap(s_panel, 0, 0,
- PANEL_H_ACTIVE, PANEL_V_ACTIVE,
- s_rot_buf);
-}