client: use HidReport.data instead of report
This commit is contained in:
parent
a90c2103b6
commit
87bceec1b4
@ -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::<HidReport>(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<HidReport>
|
||||
|
||||
// 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(())
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user