many fixes

This commit is contained in:
Brad Stein 2025-06-28 18:51:13 -05:00
parent 820ba97b76
commit c742d364e4
6 changed files with 47 additions and 17 deletions

View File

@ -136,8 +136,8 @@ impl InputAggregator {
} else { } else {
tracing::info!("🧙 magic chord - freeing devices 🪄 EXPELLIARMUS!!! 🔓🕊️"); tracing::info!("🧙 magic chord - freeing devices 🪄 EXPELLIARMUS!!! 🔓🕊️");
} }
for k in &mut self.keyboards { k.set_grab(self.released); } for k in &mut self.keyboards { k.set_grab(self.released); k.set_send(self.released); }
for m in &mut self.mice { m.set_grab(self.released); } for m in &mut self.mice { m.set_grab(self.released); m.set_send(self.released); }
self.released = !self.released; self.released = !self.released;
} }
} }

View File

@ -13,6 +13,7 @@ pub struct KeyboardAggregator {
dev: Device, dev: Device,
tx: Sender<KeyboardReport>, tx: Sender<KeyboardReport>,
dev_mode: bool, dev_mode: bool,
sending_disabled: bool,
pressed_keys: HashSet<KeyCode>, pressed_keys: HashSet<KeyCode>,
} }
@ -23,13 +24,17 @@ static SEQ: AtomicU32 = AtomicU32::new(0);
impl KeyboardAggregator { impl KeyboardAggregator {
pub fn new(dev: Device, dev_mode: bool, tx: Sender<KeyboardReport>) -> Self { pub fn new(dev: Device, dev_mode: bool, tx: Sender<KeyboardReport>) -> Self {
let _ = dev.set_nonblocking(true); let _ = dev.set_nonblocking(true);
Self { dev, tx, dev_mode, pressed_keys: HashSet::new()} Self { dev, tx, dev_mode, sending_disabled: false, pressed_keys: HashSet::new()}
} }
pub fn set_grab(&mut self, grab: bool) { pub fn set_grab(&mut self, grab: bool) {
let _ = if grab { self.dev.grab() } else { self.dev.ungrab() }; let _ = if grab { self.dev.grab() } else { self.dev.ungrab() };
} }
pub fn set_send(&mut self, send: bool) {
self.sending_disabled = !send;
}
pub fn process_events(&mut self) { pub fn process_events(&mut self) {
// --- first fetch, then log (avoids aliasing borrow) --- // --- first fetch, then log (avoids aliasing borrow) ---
let events: Vec<InputEvent> = match self.dev.fetch_events() { let events: Vec<InputEvent> = match self.dev.fetch_events() {
@ -55,9 +60,9 @@ impl KeyboardAggregator {
// Generate a local sequence number for debugging/log-merge only. // Generate a local sequence number for debugging/log-merge only.
let id = SEQ.fetch_add(1, Ordering::Relaxed); let id = SEQ.fetch_add(1, Ordering::Relaxed);
if self.dev_mode { debug!(seq = id, ?report, "kbd"); } if self.dev_mode { debug!(seq = id, ?report, "kbd"); }
let _ = self.tx.send(KeyboardReport { if !self.sending_disabled {
data: report.to_vec() let _ = self.tx.send(KeyboardReport { data: report.to_vec() });
}); }
} }
} }

View File

@ -13,6 +13,7 @@ pub struct MouseAggregator {
dev: Device, dev: Device,
tx: Sender<MouseReport>, tx: Sender<MouseReport>,
dev_mode: bool, dev_mode: bool,
sending_disabled: bool,
next_send: Instant, next_send: Instant,
buttons: u8, buttons: u8,
@ -24,7 +25,7 @@ pub struct MouseAggregator {
impl MouseAggregator { impl MouseAggregator {
pub fn new(dev: Device, dev_mode: bool, tx: Sender<MouseReport>) -> Self { pub fn new(dev: Device, dev_mode: bool, tx: Sender<MouseReport>) -> Self {
Self { dev, tx, dev_mode, next_send: Instant::now(), buttons:0, last_buttons:0, dx:0, dy:0, wheel:0 } Self { dev, tx, dev_mode, sending_disabled: false, next_send: Instant::now(), buttons:0, last_buttons:0, dx:0, dy:0, wheel:0 }
} }
#[inline] fn slog(&self, f: impl FnOnce()) { if self.dev_mode { f() } } #[inline] fn slog(&self, f: impl FnOnce()) { if self.dev_mode { f() } }
@ -32,6 +33,10 @@ impl MouseAggregator {
let _ = if grab { self.dev.grab() } else { self.dev.ungrab() }; let _ = if grab { self.dev.grab() } else { self.dev.ungrab() };
} }
pub fn set_send(&mut self, send: bool) {
self.sending_disabled = !send;
}
pub fn process_events(&mut self) { pub fn process_events(&mut self) {
let evts: Vec<InputEvent> = match self.dev.fetch_events() { let evts: Vec<InputEvent> = match self.dev.fetch_events() {
Ok(it) => it.collect(), Ok(it) => it.collect(),
@ -77,10 +82,15 @@ impl MouseAggregator {
self.wheel as u8, self.wheel as u8,
]; ];
if let Err(broadcast::error::SendError(_)) = if !self.sending_disabled {
self.tx.send(MouseReport { data: pkt.to_vec() }) if let Err(broadcast::error::SendError(_)) =
{ if self.dev_mode { warn!("❌ no HID receiver (mouse)"); } } self.tx.send(MouseReport { data: pkt.to_vec() })
else if self.dev_mode { debug!("📤 mouse {:?}", pkt) } {
if self.dev_mode { warn!("❌ no HID receiver (mouse)"); }
} else if self.dev_mode {
debug!("📤 mouse {:?}", pkt);
}
}
self.dx=0; self.dy=0; self.wheel=0; self.last_buttons=self.buttons; self.dx=0; self.dy=0; self.wheel=0; self.last_buttons=self.buttons;
} }

View File

@ -105,7 +105,7 @@ After=network.target lesavka-core.service
[Service] [Service]
ExecStart=/usr/local/bin/lesavka-server ExecStart=/usr/local/bin/lesavka-server
Restart=always Restart=always
Environment=RUST_LOG=lesavka_server::video=trace,lesavka_server::usb_gadget=info,lesavka_server=info Environment=RUST_LOG=lesavka_server::video=trace,lesavka_server::usb_gadget=debug
Environment=RUST_BACKTRACE=1 Environment=RUST_BACKTRACE=1
Restart=always Restart=always
RestartSec=5 RestartSec=5

View File

@ -15,7 +15,7 @@ tonic-reflection = "0.13"
anyhow = "1.0" anyhow = "1.0"
lesavka_common = { path = "../common" } lesavka_common = { path = "../common" }
tracing = { version = "0.1", features = ["std"] } tracing = { version = "0.1", features = ["std"] }
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] } tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt", "ansi"] }
tracing-appender = "0.2" tracing-appender = "0.2"
libc = "0.2" libc = "0.2"
futures-util = "0.3" futures-util = "0.3"

View File

@ -38,12 +38,27 @@ fn init_tracing() -> anyhow::Result<WorkerGuard> {
.open("/tmp/lesavka-server.log")?; .open("/tmp/lesavka-server.log")?;
let (file_writer, guard) = tracing_appender::non_blocking(file); let (file_writer, guard) = tracing_appender::non_blocking(file);
let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| {
EnvFilter::new("lesavka_server=info,lesavka_server::video=warn")
});
let filter_str = env_filter.to_string();
tracing_subscriber::registry() tracing_subscriber::registry()
.with(EnvFilter::try_from_default_env() .with(env_filter)
.unwrap_or_else(|_| EnvFilter::new("lesavka_server=info"))) .with(
.with(fmt::layer().with_target(true).with_thread_ids(true)) fmt::layer()
.with(fmt::layer().with_writer(file_writer).with_ansi(false)) .with_target(true)
.with_thread_ids(true),
)
.with(
fmt::layer()
.with_writer(file_writer)
.with_ansi(false)
.with_target(true)
.with_level(true),
)
.init(); .init();
tracing::info!("📜 effective RUST_LOG = \"{}\"", filter_str);
Ok(guard) Ok(guard)
} }