1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
use button; use register::Register; const BUTTON_NUM: u8 = 8; pub enum Button { A, B, Select, Start, Up, Down, Left, Right } fn button_index(button: Button) -> usize { match button { Button::A => 0, Button::B => 1, Button::Select => 2, Button::Start => 3, Button::Up => 4, Button::Down => 5, Button::Left => 6, Button::Right => 7 } } pub struct Joypad { register: Register<u8>, latch: u8, current_button: u8, buttons: [bool; BUTTON_NUM as usize] } impl Joypad { pub fn new() -> Self { Joypad { register: Register::<u8>::new(), latch: 0, current_button: 0, buttons: [false; BUTTON_NUM as usize] } } pub fn handle_input(&mut self, button: Button, event: button::Event) { match event { button::Event::Press => self.press_button(button), button::Event::Release => self.release_button(button) }; } pub fn load_register(&mut self) -> u8 { let button = match self.latch == 1 { true => 1, _ => { let value = self.current_button; self.current_button += 1; value } }; match button >= BUTTON_NUM || self.buttons[button as usize] { true => 1, false => 0 } } pub fn store_register(&mut self, mut value: u8) { self.register.store(value); value = value & 1; if value == 1 { self.current_button = 0; } self.latch = value; } pub fn press_button(&mut self, button: Button) { self.buttons[button_index(button)] = true; } pub fn release_button(&mut self, button: Button) { self.buttons[button_index(button)] = false; } }