33 lines
1.1 KiB
Rust
33 lines
1.1 KiB
Rust
|
|
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";
|
||
|
|
|
||
|
|
#[tokio::main]
|
||
|
|
async fn main() -> anyhow::Result<()> {
|
||
|
|
// open evdev
|
||
|
|
let mut dev = Device::open(KEYBOARD)?;
|
||
|
|
|
||
|
|
// 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();
|
||
|
|
|
||
|
|
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?;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|