Bevy+Ratutui powered Monitoring of Pico-Strike devices
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}