Files
t-embed-insecam-widget/main/main.c
T
Juli d92a2e53cc On-device menu, persistent settings and 12 favourite slots
Hold the knob to open a six-row menu: save/remove the playing camera as
a favourite (12 NVS slots), play or forget favourites, choose the
source (random insecam or favourites), time per camera, listing,
screen and ring brightness, caption, and reboot into Wi-Fi setup.
Settings live in NVS and override the Kconfig first-boot defaults.
Camera URLs are stored with their COUNTER placeholder so favourites get
a fresh cache-buster on every visit.
2026-09-17 00:57:02 +02:00

61 lines
1.7 KiB
C

#include "board.h"
#include "display.h"
#include "input.h"
#include "jpegdec.h"
#include "leds.h"
#include "net.h"
#include "settings.h"
#include "slideshow.h"
#include "ui.h"
#include "sdkconfig.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
static const char *TAG = "main";
static void run_portal(void)
{
net_start_portal();
leds_set_mode(LED_BREATHE, 0x8030ff);
ui_status("Wi-Fi setup",
"Join the Wi-Fi network\n\"" CONFIG_WIDGET_AP_SSID "\" with your phone.\n"
"The setup page opens by itself\n(or browse to http://192.168.4.1)");
net_wait_connected(-1);
}
void app_main(void)
{
board_init();
settings_init();
leds_init();
leds_set_brightness(settings.led_brightness);
leds_set_mode(LED_BREATHE, 0x404040);
display_init();
ui_init();
ui_status("insecam widget", "starting");
display_set_backlight(settings.lcd_brightness);
ESP_ERROR_CHECK(jpegdec_init());
net_init();
// Holding the knob after power-up forces the setup hotspot.
gpio_config_t btn = {.pin_bit_mask = 1ULL << board->enc_btn, .mode = GPIO_MODE_INPUT, .pull_up_en = 1};
gpio_config(&btn);
bool force_setup = !gpio_get_level(board->enc_btn) || settings_take_portal_request();
input_init();
if (force_setup || !net_has_credentials()) {
run_portal();
} else {
ui_status("insecam widget", "connecting to Wi-Fi");
if (!net_wait_connected(20000)) run_portal();
}
ESP_LOGI(TAG, "online at %s", net_ip_str());
ui_status("insecam widget", "online " "\xE2\x80\xA2" " finding cameras\n\nknob: next / previous\nclick: pause hold: menu");
leds_set_mode(LED_SPIN, 0x2060ff);
slideshow_start();
}