updates
This commit is contained in:
parent
dfbce37f5a
commit
bb9748b423
@ -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(())
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user