This commit is contained in:
Brad Stein 2025-06-06 00:21:20 -05:00
parent dfbce37f5a
commit bb9748b423
2 changed files with 17 additions and 26 deletions

View File

@ -2,21 +2,19 @@
#![forbid(unsafe_code)] #![forbid(unsafe_code)]
use anyhow::Result; use anyhow::Result;
use navka_common::navka::{relay_client::RelayClient, HidReport}; // <- only items that exist use navka_common::navka::{relay_client::RelayClient, HidReport};
use tokio::{sync::mpsc, time::sleep}; use tokio::{sync::mpsc, time::sleep};
use tokio_stream::wrappers::ReceiverStream; use tokio_stream::wrappers::ReceiverStream;
use tonic::{transport::Channel, Request}; use tonic::{transport::Channel, Request};
tracing_subscriber::fmt::init();
tracing::info!(bytes=?data, len=%data.len(), "HID report received");
#[tokio::main] #[tokio::main]
async fn main() -> Result<()> { async fn main() -> Result<()> {
tracing_subscriber::fmt::init();
// -- server address comes from CLI arg, env or falls back to localhost // -- server address comes from CLI arg, env or falls back to localhost
let addr = std::env::args() let addr = std::env::args()
.nth(1) .nth(1)
.or_else(|| std::env::var("NAVKA_SERVER_ADDR") .or_else(|| std::env::var("NAVKA_SERVER_ADDR").ok())
.or_else(|_| std::env::var("LAUNCHER_NAVKA_SERVER_ADDR")).ok())
.unwrap_or_else(|| "http://127.0.0.1:50051".to_owned()); .unwrap_or_else(|| "http://127.0.0.1:50051".to_owned());
let channel: Channel = Channel::from_shared(addr)? let channel: Channel = Channel::from_shared(addr)?
@ -26,7 +24,6 @@ async fn main() -> Result<()> {
// mpsc -> ReceiverStream -> bidirectional gRPC // mpsc -> ReceiverStream -> bidirectional gRPC
let (tx, rx) = mpsc::channel::<HidReport>(32); let (tx, rx) = mpsc::channel::<HidReport>(32);
let outbound = ReceiverStream::new(rx); let outbound = ReceiverStream::new(rx);
let mut inbound = RelayClient::new(channel) let mut inbound = RelayClient::new(channel)
.stream(Request::new(outbound)) .stream(Request::new(outbound))
.await? .await?
@ -42,7 +39,7 @@ async fn main() -> Result<()> {
}); });
while let Some(report) = inbound.message().await? { while let Some(report) = inbound.message().await? {
println!("🔄 {:?}", report.data); tracing::info!(bytes=?report.data, "echo from server");
} }
Ok(()) Ok(())
} }

View File

@ -13,9 +13,6 @@ use navka_common::navka::{
HidReport, HidReport,
}; };
tracing_subscriber::fmt::init();
tracing::info!(bytes=?data, len=%data.len(), "HID report received");
struct Handler { struct Handler {
/// shared async handle to /dev/hidg0 /// shared async handle to /dev/hidg0
hid: Arc<tokio::sync::Mutex<tokio::fs::File>>, hid: Arc<tokio::sync::Mutex<tokio::fs::File>>,
@ -32,24 +29,22 @@ impl Relay for Handler {
) -> Result<Response<Self::StreamStream>, Status> { ) -> Result<Response<Self::StreamStream>, Status> {
let mut in_stream = request.into_inner(); let mut in_stream = request.into_inner();
let hid = self.hid.clone(); let hid = self.hid.clone();
// echo everything back to caller & push down USB
let (tx, rx) = tokio::sync::mpsc::channel(32); let (tx, rx) = tokio::sync::mpsc::channel(32);
tokio::spawn(async move { tokio::spawn(async move {
while let Some(msg) = in_stream.next().await.transpose()? { while let Some(msg) = in_stream.next().await.transpose()? {
// 1) write to /dev/hidg0 // 1) write to /dev/hidg0
let mut file = hid.lock().await; let data = msg.data.get(..8).ok_or_else(|| Status::invalid_argument("short"))?;
let data = &msg.data[..8]; {
file.write_all(data).await let mut f = hid.lock().await;
.map_err(|e| Status::internal(e.to_string()))?; if let Err(e) = f.write_all(data).await {
file.flush().await.ok(); error!("USB write failed: {e}");
return Err(Status::internal(e.to_string()));
// 2) structured log (shows hex + length) }
info!(bytes = ?msg.data, len = msg.data.len(), "HID report received"); f.flush().await.ok();
}
// 3) echo back info!(bytes=?data, len=data.len(), "HID report received");
tx.send(Ok(msg)).await.ok(); let _ = tx.send(Ok(msg)).await;
} }
Ok::<_, Status>(()) Ok::<_, Status>(())
}); });
@ -60,8 +55,7 @@ impl Relay for Handler {
#[tokio::main] #[tokio::main]
async fn main() -> anyhow::Result<()> { async fn main() -> anyhow::Result<()> {
let subscriber = FmtSubscriber::builder().with_target(false).finish(); tracing_subscriber::fmt::init();
tracing::subscriber::set_global_default(subscriber)?;
let file = OpenOptions::new() let file = OpenOptions::new()
.write(true) .write(true)