From 87bceec1b47a16fe8e9cdfa66f584a3723e743d6 Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Sun, 1 Jun 2025 14:46:12 -0500 Subject: [PATCH] client: use HidReport.data instead of report --- client/src/main.rs | 57 +++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/client/src/main.rs b/client/src/main.rs index 3485a98..428796f 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -1,32 +1,37 @@ -use evdev::{Device, InputEventKind}; -use navka_common::navka::{relay_client::RelayClient, HidReport}; -use tonic::transport::Channel; - -const KEYBOARD: &str = "/dev/input/event4"; // adjust -const NAVKA_IP: &str = "192.168.42.253:4000"; +use anyhow::Result; +use navka_common::navka::HidReport; +use navka_common::navka::relay_client::RelayClient; +use tokio::sync::mpsc; +use tokio_stream::wrappers::ReceiverStream; +use tonic::{Request, transport::Channel}; #[tokio::main] -async fn main() -> anyhow::Result<()> { - // open evdev - let mut dev = Device::open(KEYBOARD)?; +async fn main() -> Result<()> { + // 1) connect to the navka-server gRPC endpoint + let channel = Channel::from_static("http://127.0.0.1:50051").connect().await?; + let mut client = RelayClient::new(channel); - // connect to navka - let channel = Channel::from_shared(format!("http://{NAVKA_IP}"))? - .connect().await?; - let (mut tx, _rx) = RelayClient::new(channel).stream().await?.into_inner(); + // 2) create an mpsc channel that we can push HID reports into + let (tx_request, rx_request) = mpsc::channel::(32); + let outbound = ReceiverStream::new(rx_request); - loop { - for ev in dev.fetch_events()? { - if let InputEventKind::Key(code) = ev.kind() { - // simple map: only letters a-z for PoC - let usage = match code.0 { - 30..=55 => (code.0 - 26) as u8, // HID usage 0x04..0x1d - _ => continue, - }; - let mut buf = [0u8; 8]; - buf[2] = if ev.value() == 1 { usage } else { 0 }; - tx.send(HidReport { data: buf.to_vec() }).await?; - } - } + // 3) start the bi-directional stream (note the REQUIRED argument) + let response = client.stream(Request::new(outbound)).await?; + let mut inbound = response.into_inner(); // Streaming + + // 4) demo: send “press A”, wait 100 ms, send “release” + tokio::spawn(async move { + let press_a = HidReport { data: vec![0x00,0x00,0x04,0,0,0,0,0] }; + let release = HidReport { data: vec![0x00; 8] }; + + tx_request.send(press_a).await.ok(); + tokio::time::sleep(std::time::Duration::from_millis(100)).await; + tx_request.send(release).await.ok(); + }); + + // 5) print anything the server echoes back + while let Some(msg) = inbound.message().await? { + println!("🔄 got report from server: {:?}", msg.data); } + Ok(()) }