use crate::config_storage::{ConfigApi, ConfigFormGen, ConfigGet, ConfigLoadStore, ConfigStorage};
use crate::portal;
use crate::portal::config_ui::ConfigHandler;
use embassy_net::Stack;
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
use embassy_sync::mutex::Mutex;
#[doc(hidden)]
#[derive(Clone, Copy, Debug)]
pub struct ConfigUiOptions {
pub default_group: &'static str,
pub page_heading: &'static str,
pub title: &'static str,
pub subtitle: &'static str,
pub nav_left: &'static str,
pub nav_right: &'static str,
pub extra_css: &'static str,
}
#[doc(hidden)]
pub async fn run_http_config_loop<C, S>(
stack: Stack<'static>,
config: &'static Mutex<CriticalSectionRawMutex, C>,
io: &'static Mutex<CriticalSectionRawMutex, S>,
ui: ConfigUiOptions,
on_updated: Option<&'static (dyn Fn(C::ChangedSet) + Send)>,
) where
C: ConfigFormGen + ConfigGet + ConfigApi + ConfigLoadStore + Send,
C::ChangedSet: Send,
S: ConfigStorage + Send,
{
info!("Starting HTTP config server...");
let handler = ConfigHandler {
config,
io,
default_group: ui.default_group,
page_heading: ui.page_heading,
title: ui.title,
subtitle: ui.subtitle,
nav_left: ui.nav_left,
nav_right: ui.nav_right,
extra_css: ui.extra_css,
on_updated,
#[cfg(feature = "captive")]
captive: true,
};
portal::serve_loop(stack, handler).await;
}
#[cfg(feature = "debug-server")]
#[doc(hidden)]
pub async fn run_http_debug_loop<C, S>(
stack: Stack<'static>,
config: &'static Mutex<CriticalSectionRawMutex, C>,
io: &'static Mutex<CriticalSectionRawMutex, S>,
ui: ConfigUiOptions,
on_updated: Option<&'static (dyn Fn(C::ChangedSet) + Send)>,
) where
C: ConfigFormGen + ConfigGet + ConfigApi + ConfigLoadStore + Send,
C::ChangedSet: Send,
S: ConfigStorage + Send,
{
info!("Debug HTTP server: waiting for STA IP...");
loop {
if let Some(cfg) = stack.config_v4() {
info!(
"Debug HTTP server started at http://{}",
cfg.address.address()
);
break;
}
embassy_time::Timer::after(embassy_time::Duration::from_millis(500)).await;
}
let handler = ConfigHandler {
config,
io,
default_group: ui.default_group,
page_heading: ui.page_heading,
title: ui.title,
subtitle: ui.subtitle,
nav_left: ui.nav_left,
nav_right: ui.nav_right,
extra_css: ui.extra_css,
on_updated,
#[cfg(feature = "captive")]
captive: false,
};
portal::serve_loop_debug(stack, handler).await;
}