fix(joypad): reimplement joypad

This commit is contained in:
2021-06-07 17:23:48 -05:00
parent 83994e6adc
commit 1449ed3765
4 changed files with 105 additions and 146 deletions

View File

@@ -2,8 +2,8 @@ use anyhow::{anyhow, Result};
use clap::{crate_authors, crate_description, crate_name, crate_version, App, Arg};
use gb::Egui;
use gb::LR35902_CLOCK_SPEED;
use gb::{ButtonState, Cycle, LR35902};
use gilrs::{Button, Event as GamepadEvent, EventType as GamepadEventType, Gilrs};
use gb::{handle_gamepad_input, Cycle, LR35902};
use gilrs::Gilrs;
use pixels::{Pixels, SurfaceTexture};
use std::time::{Duration, Instant};
use winit::dpi::LogicalSize;
@@ -168,7 +168,7 @@ fn main() -> Result<()> {
while elapsed_cycles <= pending_cycles {
if let Some(event) = gilrs.next_event() {
handle_gamepad_input(&mut game_boy, event);
handle_gamepad_input(&mut game_boy.bus.joypad, event);
}
elapsed_cycles += game_boy.step();
@@ -207,43 +207,3 @@ fn create_window(event_loop: &EventLoop<()>, title: &str) -> Result<Window> {
.with_min_inner_size(size)
.build(event_loop)?)
}
fn handle_gamepad_input(game_boy: &mut LR35902, event: GamepadEvent) {
use GamepadEventType::*;
let joypad_status = &mut game_boy.bus.joypad.status;
let interrupt = &mut game_boy.bus.joypad.interrupt;
match event.event {
ButtonPressed(button, _) => match button {
Button::DPadDown | Button::Start => {
joypad_status.set_down_start(ButtonState::Pressed, interrupt)
}
Button::DPadUp | Button::Select => {
joypad_status.set_up_select(ButtonState::Pressed, interrupt)
}
Button::DPadLeft | Button::South => {
joypad_status.set_left_b(ButtonState::Pressed, interrupt)
}
Button::DPadRight | Button::East => {
joypad_status.set_right_a(ButtonState::Pressed, interrupt)
}
_ => {}
},
ButtonReleased(button, _) => match button {
Button::DPadDown | Button::Start => {
joypad_status.set_down_start(ButtonState::Released, interrupt)
}
Button::DPadUp | Button::Select => {
joypad_status.set_up_select(ButtonState::Released, interrupt)
}
Button::DPadLeft | Button::South => {
joypad_status.set_left_b(ButtonState::Released, interrupt)
}
Button::DPadRight | Button::East => {
joypad_status.set_right_a(ButtonState::Released, interrupt)
}
_ => {}
},
_ => {}
}
}