This commit is contained in:
Brad Stein 2025-06-25 19:04:11 -05:00
parent 1d4a3f8615
commit 5d390e495c

View File

@ -9,7 +9,7 @@ use tokio::{fs::{OpenOptions}, io::AsyncWriteExt, sync::Mutex};
use tokio_stream::{wrappers::ReceiverStream};
use tonic::{transport::Server, Request, Response, Status};
use anyhow::Context as _;
use tracing::{info, trace, warn};
use tracing::{info, trace, warn, error};
use tracing_subscriber::{filter::EnvFilter, fmt, prelude::*};
use tracing_appender::non_blocking;
use tracing_appender::non_blocking::WorkerGuard;
@ -50,6 +50,32 @@ fn init_tracing() -> anyhow::Result<WorkerGuard> {
Ok(guard)
}
async fn open_with_retry(
path: &str,
retries: usize,
delay_ms: u64,
) -> anyhow::Result<tokio::fs::File> {
for attempt in 0..=retries {
match OpenOptions::new()
.write(true)
.custom_flags(libc::O_NONBLOCK)
.open(path)
.await
{
Ok(f) => {
info!("✅ opened {path} on attempt #{attempt}");
return Ok(f);
}
Err(e) if attempt < retries => {
warn!("🕒 {path} not ready ({e}); retrying… #{attempt}"); // will retry
tokio::time::sleep(Duration::from_millis(delay_ms)).await;
}
Err(e) => return Err(e).with_context(|| format!("giving up on {path}")),
}
}
unreachable!()
}
/*─────────────────── tonic service ─────────────────────*/
struct Handler {
kb: Arc<Mutex<tokio::fs::File>>,
@ -63,14 +89,8 @@ impl Handler {
gadget.cycle()?;
tokio::time::sleep(Duration::from_secs(1)).await;
let kb = OpenOptions::new()
.write(true).custom_flags(libc::O_NONBLOCK)
.open("/dev/hidg0").await
.context("opening /dev/hidg0")?;
let ms = OpenOptions::new()
.write(true).custom_flags(libc::O_NONBLOCK)
.open("/dev/hidg1").await
.context("opening /dev/hidg1")?;
let kb = open_with_retry("/dev/hidg0", 10, 100).await?;
let ms = open_with_retry("/dev/hidg1", 10, 100).await?;
Ok(Self { kb: Arc::new(Mutex::new(kb)),
ms: Arc::new(Mutex::new(ms)),
@ -219,10 +239,15 @@ async fn main() -> anyhow::Result<()> {
// }
// });
println!("🌐 lesavka-server listening on 0.0.0.0:50051");
Server::builder()
.add_service(RelayServer::new(handler))
.serve(([0, 0, 0, 0], 50051).into())
.await?;
info!("🌐 lesavkaserver listening on 0.0.0.0:50051");
if let Err(e) = Server::builder()
.add_service(RelayServer::new(handler))
.serve(([0, 0, 0, 0], 50051).into())
.await
{
error!("💥 gRPC server exited: {e:#}");
std::process::exit(1);
}
Ok(())
}