diff --git a/server/src/main.rs b/server/src/main.rs index 446fbb4..e2b6f9f 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -121,8 +121,12 @@ impl Handler { gadget.cycle()?; let ctrl = UsbGadget::find_controller()?; - wait_configured(&ctrl, 10_000).await - .context("waiting for host to configure")?; + let configured = wait_configured(&ctrl, 10_000).await.is_ok(); + if configured { + info!("✅ host enumerated (configured)"); + } else { + warn!("⚠️ host absent – queuing HID traffic"); + } let state = UsbGadget::wait_state_any(&ctrl, 5_000)?; match state.as_str() { "configured" => info!("✅ host enumerated (configured)"), @@ -144,6 +148,20 @@ impl Handler { did_cycle: AtomicBool::new(true), }) } + + async fn degraded(gadget: UsbGadget) -> anyhow::Result { + info!("🛠️ Handler::degraded - opening HID endpoints ..."); + let kb = open_with_retry("/dev/hidg0").await?; + let ms = open_with_retry("/dev/hidg1").await?; + + info!("✅ HID endpoints ready"); + Ok(Self { + kb: Arc::new(Mutex::new(kb)), + ms: Arc::new(Mutex::new(ms)), + gadget, + did_cycle: AtomicBool::new(false), + }) + } } #[tonic::async_trait] @@ -288,24 +306,11 @@ async fn main() -> anyhow::Result<()> { let handler = match Handler::make(gadget.clone()).await { Ok(h) => h, Err(e) => { - error!("💥 failed to create Handler: {e:#}"); - std::process::exit(1); + error!("💥 handler degraded (host offline): {e:#}"); + Handler::degraded(gadget.clone()).await? } }; - // tokio::spawn({ - // let gadget = gadget.clone(); - // async move { - // loop { - // tokio::time::sleep(Duration::from_secs(4)).await; - // if LAST_HID_WRITE.elapsed().as_secs() > 3 { - // warn!("no HID traffic in 3 s - cycling UDC"); - // let _ = gadget.cycle(); - // } - // } - // } - // }); - info!("🌐 lesavka‑server listening on 0.0.0.0:50051"); if let Err(e) = Server::builder()