aboutsummaryrefslogtreecommitdiff
path: root/src/gamepad.rs
diff options
context:
space:
mode:
authorAstatin <[email protected]>2025-04-03 18:35:03 +0200
committerAstatin <[email protected]>2025-04-03 18:35:03 +0200
commit9a8e4117be8d30109229600346e7d9561c52a3e3 (patch)
tree6d2531b675e609d3d5d734732f1328769dddf557 /src/gamepad.rs
parentc1fb610e198d785aa57440b86c69587e5caaf563 (diff)
Separate core from desktop target
Diffstat (limited to 'src/gamepad.rs')
-rw-r--r--src/gamepad.rs291
1 files changed, 0 insertions, 291 deletions
diff --git a/src/gamepad.rs b/src/gamepad.rs
deleted file mode 100644
index 87c445c..0000000
--- a/src/gamepad.rs
+++ /dev/null
@@ -1,291 +0,0 @@
-use crate::window::Keys;
-use gilrs::{Button, GamepadId, Gilrs};
-use std::fs::File;
-use std::io::{ErrorKind, Read, Write};
-use winit::keyboard::KeyCode;
-
-pub struct Gamepad {
- gilrs: Gilrs,
- gamepad_id: Option<GamepadId>,
-}
-
-pub trait Input {
- fn update_events(&mut self, cycles: u128) -> Option<u128>;
- fn get_action_gamepad_reg(&self) -> u8;
- fn get_direction_gamepad_reg(&self) -> u8;
-}
-
-impl Gamepad {
- pub fn new() -> Self {
- let gilrs = Gilrs::new().unwrap();
-
- let gamepad_id = if let Some((gamepad_id, _gamepad)) = gilrs.gamepads().next() {
- println!("Found Gamepad id: {:?}", gamepad_id);
- Some(gamepad_id)
- } else {
- println!("No gamepad found");
- None
- };
-
- Self { gilrs, gamepad_id }
- }
-
- pub fn check_special_actions(&self, is_debug: &mut bool) {
- if let Some(gamepad_id) = self.gamepad_id {
- if let Some(gamepad) = self.gilrs.connected_gamepad(gamepad_id) {
- *is_debug = gamepad.is_pressed(Button::West);
- }
- }
- }
-}
-
-impl Input for Gamepad {
- fn update_events(&mut self, _cycles: u128) -> Option<u128> {
- while let Some(_) = self.gilrs.next_event() {}
- None
- }
-
- fn get_action_gamepad_reg(&self) -> u8 {
- let mut res = 0xf;
-
- if let Some(gamepad_id) = self.gamepad_id {
- if let Some(gamepad) = self.gilrs.connected_gamepad(gamepad_id) {
- if gamepad.is_pressed(Button::East) {
- res &= 0b1110;
- }
-
- if gamepad.is_pressed(Button::South) {
- res &= 0b1101;
- }
-
- if gamepad.is_pressed(Button::Select) {
- res &= 0b1011;
- }
-
- if gamepad.is_pressed(Button::Start) {
- res &= 0b0111;
- }
- }
- }
-
- res
- }
-
- fn get_direction_gamepad_reg(&self) -> u8 {
- let mut res = 0xf;
-
- if let Some(gamepad_id) = self.gamepad_id {
- if let Some(gamepad) = self.gilrs.connected_gamepad(gamepad_id) {
- if gamepad.is_pressed(Button::DPadRight) {
- res &= 0b1110;
- }
-
- if gamepad.is_pressed(Button::DPadLeft) {
- res &= 0b1101;
- }
-
- if gamepad.is_pressed(Button::DPadUp) {
- res &= 0b1011;
- }
-
- if gamepad.is_pressed(Button::DPadDown) {
- res &= 0b0111;
- }
- }
- }
-
- res
- }
-}
-
-pub struct Keyboard {
- keys: Keys,
- action_reg: u8,
- direction_reg: u8,
-}
-
-impl Keyboard {
- pub fn new(keys: Keys) -> Self {
- Self {
- keys,
- action_reg: 0,
- direction_reg: 0,
- }
- }
-}
-
-impl Input for Keyboard {
- fn update_events(&mut self, _cycles: u128) -> Option<u128> {
- let mut res = 0xf;
- let keys = self.keys.borrow();
-
- if keys.contains(&KeyCode::KeyA) {
- res &= 0b1110;
- }
-
- if keys.contains(&KeyCode::KeyB) {
- res &= 0b1101;
- }
-
- if keys.contains(&KeyCode::Backspace) {
- res &= 0b1011;
- }
-
- if keys.contains(&KeyCode::Enter) {
- res &= 0b0111;
- }
-
- self.action_reg = res;
-
- let mut res = 0xf;
-
- if keys.contains(&KeyCode::ArrowRight) {
- res &= 0b1110;
- }
-
- if keys.contains(&KeyCode::ArrowLeft) {
- res &= 0b1101;
- }
-
- if keys.contains(&KeyCode::ArrowUp) {
- res &= 0b1011;
- }
-
- if keys.contains(&KeyCode::ArrowDown) {
- res &= 0b0111;
- }
-
- self.direction_reg = res;
-
- None
- }
-
- fn get_action_gamepad_reg(&self) -> u8 {
- self.action_reg
- }
-
- fn get_direction_gamepad_reg(&self) -> u8 {
- self.direction_reg
- }
-}
-
-pub struct GamepadRecorder {
- input: Box<dyn Input>,
- record_file: File,
- action_reg: u8,
- direction_reg: u8,
-}
-
-impl GamepadRecorder {
- pub fn new(input: Box<dyn Input>, record_file: String) -> Self {
- Self {
- input,
- record_file: File::create(record_file).expect("Couldn't create gamepad record file"),
- action_reg: 0xff,
- direction_reg: 0xff,
- }
- }
-}
-
-impl Input for GamepadRecorder {
- fn update_events(&mut self, cycles: u128) -> Option<u128> {
- self.input.update_events(cycles);
-
- let new_action_reg = self.input.get_action_gamepad_reg();
- let new_direction_reg = self.input.get_direction_gamepad_reg();
-
- if self.action_reg != new_action_reg || self.direction_reg != new_direction_reg {
- println!(
- "input update on cycle {} ! 0x{:02x} 0x{:02x}",
- cycles, new_action_reg, new_direction_reg
- );
- if let Err(err) = self.record_file.write_all(&cycles.to_le_bytes()) {
- eprintln!("Failed to write to record file: {}", err);
- };
- if let Err(err) = self
- .record_file
- .write_all(&[new_action_reg, new_direction_reg])
- {
- eprintln!("Failed to write to record file: {}", err);
- }
- if let Err(err) = self.record_file.flush() {
- eprintln!("Failed to flush record file writes: {}", err);
- }
- }
-
- self.action_reg = new_action_reg;
- self.direction_reg = new_direction_reg;
- None
- }
-
- fn get_action_gamepad_reg(&self) -> u8 {
- self.action_reg
- }
-
- fn get_direction_gamepad_reg(&self) -> u8 {
- self.direction_reg
- }
-}
-
-pub struct GamepadReplay {
- record_file: File,
- action_reg: u8,
- direction_reg: u8,
- next_cycle_update: Option<u128>,
-}
-
-impl GamepadReplay {
- pub fn new(record_file: String) -> Self {
- let mut file = File::open(record_file).expect("Couldn't open gamepad record file");
-
- let mut cycles_le: [u8; 16] = [0; 16];
-
- let next_cycle_update = match file.read_exact(&mut cycles_le) {
- Err(err) if err.kind() == ErrorKind::UnexpectedEof => None,
- Err(err) => panic!("{}", err),
- Ok(_) => Some(u128::from_le_bytes(cycles_le)),
- };
-
- Self {
- record_file: file,
- action_reg: 0xff,
- direction_reg: 0xff,
- next_cycle_update,
- }
- }
-}
-
-impl Input for GamepadReplay {
- fn update_events(&mut self, cycles: u128) -> Option<u128> {
- if let Some(next_cycle_update) = self.next_cycle_update {
- if cycles >= next_cycle_update {
- let mut inputs: [u8; 2] = [0; 2];
-
- self.record_file
- .read_exact(&mut inputs)
- .expect("Unexpected EOF after cycle but before input");
-
- self.action_reg = inputs[0];
- self.direction_reg = inputs[1];
-
- let mut cycles_le: [u8; 16] = [0; 16];
-
- self.next_cycle_update = match self.record_file.read_exact(&mut cycles_le) {
- Err(err) if err.kind() == ErrorKind::UnexpectedEof => None,
- Err(err) => panic!("{}", err),
- Ok(_) => Some(u128::from_le_bytes(cycles_le)),
- };
- }
- }
-
- return self.next_cycle_update;
- }
-
- fn get_action_gamepad_reg(&self) -> u8 {
- self.action_reg
- }
-
- fn get_direction_gamepad_reg(&self) -> u8 {
- self.direction_reg
- }
-}