src.nth.io/

summaryrefslogtreecommitdiff
path: root/main/app_main.c
blob: 316f7025b309d8787605a1bb7de6d42bf6fe5ae4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "display.h"
#include "http_api.h"
#include "mdns_service.h"
#include "net_eth.h"
#include "nvs_config.h"
#include "viewport_state.h"

#include "esp_event.h"
#include "esp_log.h"
#include "esp_netif.h"
#include "nvs_flash.h"

static const char *TAG = "viewport";

void app_main(void)
{
    ESP_ERROR_CHECK(nvs_flash_init());
    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    viewport_state_init();
    nvs_config_load();  // apply persisted config over defaults (best-effort)
    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) {
        ESP_LOGI(TAG, "online at %s", net_eth_get_ip_str());
    } else {
        ESP_LOGW(TAG, "no DHCP lease after 30s, will keep retrying in the background");
    }

    ESP_ERROR_CHECK(mdns_service_start());
    ESP_ERROR_CHECK(http_api_start());

    // Display is best-effort — a missing/miswired panel must not kill
    // networking + /state. M3 acceptance: show a test pattern.
    if (display_init() == ESP_OK) {
        display_test_pattern();
        ESP_LOGI(TAG, "display up — test pattern on screen");
    } else {
        ESP_LOGW(TAG, "display init failed — continuing without panel");
    }

    // TODO M5: /frame JPEG decode -> framebuffer
    // TODO M6: POST /state + idle timer
    // TODO M7: Capacitive touch -> outbound /state POST
    // TODO M8: Local screens (IP, loading) + BOOT button
}