Bevy+Ratutui powered Monitoring of Pico-Strike devices
at noise-proto 74 lines 2.1 kB view raw
1#![allow(clippy::type_complexity)] 2 3mod device; 4mod messages; 5mod net; 6mod state; 7 8mod constants { 9 include!(concat!(env!("OUT_DIR"), "/constants.rs")); 10} 11 12use bevy::{ 13 app::{AppExit, Plugin, PreUpdate}, 14 ecs::{ 15 message::{MessageReader, MessageWriter}, 16 system::Res, 17 }, 18 state::{app::AppExtStates, state::State}, 19}; 20use bevy_ratatui::event::KeyMessage; 21 22use crate::{ 23 device::DevicePlugin, 24 messages::StrikeMessage, 25 net::NetPlugin, 26 state::AppState, 27}; 28 29#[derive(Debug)] 30pub struct StrikerPlugin; 31 32impl Plugin for StrikerPlugin { 33 fn build(&self, app: &mut bevy::app::App) { 34 app.init_state::<AppState>() 35 .add_message::<StrikeMessage>() 36 .add_plugins(( 37 NetPlugin, 38 DevicePlugin, 39 )) 40 .add_systems(PreUpdate, keybinds); 41 } 42} 43 44fn keybinds( 45 state: Res<State<AppState>>, 46 mut key_reader: MessageReader<KeyMessage>, 47 mut strike_writer: MessageWriter<StrikeMessage>, 48 mut app_exit: MessageWriter<AppExit>, 49) { 50 use ratatui::crossterm::event::KeyCode; 51 for message in key_reader.read() { 52 match message.code { 53 KeyCode::Char('s') if state.get() == &AppState::Home => { 54 strike_writer.write(StrikeMessage::ToggleSearch); 55 } 56 KeyCode::Up if state.get() == &AppState::Home => { 57 strike_writer.write(StrikeMessage::PrevDevice); 58 } 59 KeyCode::Down if state.get() == &AppState::Home => { 60 strike_writer.write(StrikeMessage::NextDevice); 61 } 62 KeyCode::Enter | KeyCode::Char(' ') if state.get() == &AppState::Home => { 63 strike_writer.write(StrikeMessage::MonitorDevice); 64 } 65 KeyCode::Backspace if state.get() == &AppState::Monitoring => { 66 strike_writer.write(StrikeMessage::StopMonitoring); 67 } 68 KeyCode::Char('q') | KeyCode::Esc => { 69 app_exit.write(AppExit::Success); 70 } 71 _ => {} 72 } 73 } 74}