src.nth.io/

summaryrefslogtreecommitdiff
path: root/main/app_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/app_main.c')
-rw-r--r--main/app_main.c59
1 files changed, 38 insertions, 21 deletions
diff --git a/main/app_main.c b/main/app_main.c
index 0897649..cc4c063 100644
--- a/main/app_main.c
+++ b/main/app_main.c
@@ -14,6 +14,8 @@
#include "esp_event.h"
#include "esp_log.h"
#include "esp_netif.h"
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
#include "nvs_flash.h"
static const char *TAG = "viewport";
@@ -28,6 +30,8 @@ static inline void mark(esp_err_t err, char up, char *slot)
*slot = (err == ESP_OK) ? up : (char)(up + 0x20); // 'A' -> 'a' on failure
}
+static void display_setup_task(void *arg);
+
void app_main(void)
{
ESP_ERROR_CHECK(nvs_flash_init());
@@ -64,37 +68,50 @@ void app_main(void)
mark(http_api_start(), 'H', &flags[2]);
// ------------------------------------------------------------------
- // Display + I²C-bound peripherals. Missing/miswired panel must not
- // kill networking + /state. Failures here log a warning and continue.
+ // Display + I²C-bound peripherals run on their own task. ESP-IDF's
+ // esp_lcd_new_dsi_bus() spins forever in a PHY-PLL busy-wait if the
+ // config is even slightly off; keeping that off the main task means
+ // a misconfigured panel can't take down networking + /state. The
+ // task also brings up the JPEG decoder and touch (touch shares the
+ // panel I²C bus).
// ------------------------------------------------------------------
+ mark(button_init(), 'B', &flags[6]);
+
+ ESP_LOGI(TAG, "boot complete — net subsystems [%s] ip=%s; "
+ "display init deferred to dsp_init task",
+ flags, got_ip ? net_eth_get_ip_str() : "(no link)");
+
+ xTaskCreate(display_setup_task, "dsp_init", 4096, NULL, 1, NULL);
+}
+
+static void display_setup_task(void *arg)
+{
+ char flags[4] = {'-', '-', '-', 0}; // D J T + NUL
esp_err_t dsp_err = display_init();
- mark(dsp_err, 'D', &flags[3]);
+ mark(dsp_err, 'D', &flags[0]);
+
if (dsp_err == ESP_OK) {
local_screens_init();
- viewport_state_lock();
- viewport_run_state_t s = viewport_state_get()->state;
- viewport_state_unlock();
- if (s == VIEWPORT_STATE_ASLEEP) {
- display_sleep();
- } else {
- local_screens_show_ip();
- }
+ // Show solid-color test sequence for ~6 s so we can characterize the
+ // garble: solid red, then solid green, then solid blue, each for 2s.
+ // If the panel paints a single uniform color (or close to it) for
+ // each, the issue is the text rendering only. If even solid colors
+ // are garbled, it's a stride / pixel-format bug deeper down.
+ display_wake();
+ display_fill(0xF800); vTaskDelay(pdMS_TO_TICKS(2000)); // red
+ display_fill(0x07E0); vTaskDelay(pdMS_TO_TICKS(2000)); // green
+ display_fill(0x001F); vTaskDelay(pdMS_TO_TICKS(2000)); // blue
+ display_sleep();
}
- mark(jpeg_decoder_init(), 'J', &flags[4]);
+ mark(jpeg_decoder_init(), 'J', &flags[1]);
if (dsp_err == ESP_OK) {
- mark(touch_init(), 'T', &flags[5]);
+ mark(touch_init(), 'T', &flags[2]);
} else {
ESP_LOGI(TAG, "touch skipped (display not up)");
}
- mark(button_init(), 'B', &flags[6]);
-
- // ------------------------------------------------------------------
- // Boot summary. Uppercase letter = subsystem live; lowercase = down.
- // E=Ethernet M=mDNS H=HTTP D=Display J=JPEG T=Touch B=BootButton
- // ------------------------------------------------------------------
- ESP_LOGI(TAG, "boot complete — subsystems [%s] ip=%s",
- flags, got_ip ? net_eth_get_ip_str() : "(no link)");
+ ESP_LOGI(TAG, "display subsystems [%s] up", flags);
+ vTaskDelete(NULL);
}