src.nth.io/

summaryrefslogtreecommitdiff
path: root/main/app_main.c
diff options
context:
space:
mode:
authorLuke Hoersten <[email protected]>2026-06-13 22:08:02 -0500
committerLuke Hoersten <[email protected]>2026-06-13 22:08:02 -0500
commit4756daedaefd18919e96fadaabc7f1a00b383b4c (patch)
treeb2eeefb22f53673ac9437920d7447442a205fc8b /main/app_main.c
parente2ac22e58901e18b0b567b85d93a8f68335180bc (diff)
M2: HTTP server + mDNS service discovery + shared state
- viewport_state.{h,c}: shared state struct (config, run-state, counters, orientation, timestamps) behind a FreeRTOS mutex. Modules update it under viewport_state_lock(); GET /state serializes a snapshot. - http_api.{h,c}: starts esp_http_server on :80, registers GET /state. Returns the full JSON shape from the spec (name, version, configured, state, uptime_ms, last_frame_ms_ago, frames_received, decode_errors, state_post_failures, resolution, ip, free_heap, free_psram). - mdns_service.{h,c}: mdns_init + advertise _scrypted-viewport._tcp.local on :80 with version/resolution/orientation/name TXT records. mdns_service_refresh() reapplies hostname + TXT after /config writes (called from M4 onward). - main/CMakeLists.txt: add esp_http_server, esp_timer, json, mdns to REQUIRES. espressif/mdns added as managed component via main/idf_component.yml. app_main calls viewport_state_init early so any module can read defaults before /config arrives. Also adds TESTING.md tracking per-milestone verification status and an integration test plan to run after M9 (races, failure modes, longevity, power cycles, negative protocol, multi-viewport). M1 promoted to "🟡 builds clean" in TESTING.md; combined HW verification of M1+M2 will be one flash session. Build verified against ESP-IDF 5.4 for target esp32p4 (binary ~550 KB).
Diffstat (limited to 'main/app_main.c')
-rw-r--r--main/app_main.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/main/app_main.c b/main/app_main.c
index 8b91537..9389642 100644
--- a/main/app_main.c
+++ b/main/app_main.c
@@ -1,4 +1,7 @@
+#include "http_api.h"
+#include "mdns_service.h"
#include "net_eth.h"
+#include "viewport_state.h"
#include "esp_event.h"
#include "esp_log.h"
@@ -13,7 +16,8 @@ void app_main(void)
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
- ESP_LOGI(TAG, "Scrypted Viewport boot");
+ viewport_state_init();
+ ESP_LOGI(TAG, "Scrypted Viewport boot (v%s)", VIEWPORT_VERSION);
ESP_ERROR_CHECK(net_eth_init());
if (net_eth_wait_for_ip(30 * 1000) == ESP_OK) {
@@ -22,12 +26,13 @@ void app_main(void)
ESP_LOGW(TAG, "no DHCP lease after 30s, will keep retrying in the background");
}
- // TODO M2: mDNS _scrypted-viewport._tcp.local
- // TODO M2: HTTP server: GET /state
+ ESP_ERROR_CHECK(mdns_service_start());
+ ESP_ERROR_CHECK(http_api_start());
+
// TODO M3: MIPI-DSI panel init (800x480 IPS, default portrait 480x800)
- // TODO M4: /config persistence (NVS)
+ // TODO M4: /config persistence (NVS) + GET /config + POST /config
// TODO M5: /frame JPEG decode -> framebuffer
- // TODO M6: /state POST + idle timer
+ // TODO M6: POST /state + idle timer
// TODO M7: Capacitive touch -> outbound /state POST
// TODO M8: Local screens (IP, loading) + BOOT button
}