Skip to content

Commit 330d2c0

Browse files
committed
fixed handling of key release
1 parent c11acc7 commit 330d2c0

File tree

2 files changed

+48
-24
lines changed

2 files changed

+48
-24
lines changed

src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ impl Chip8Emulator {
116116
self.keyboard[idx] = pressed;
117117
}
118118

119+
pub fn clear_keys(&mut self) {
120+
self.keyboard = [false; NUM_KEYS];
121+
}
122+
119123
const fn read_opcode(&mut self) -> u16 {
120124
let op_byte_1 = self.memory[self.program_counter as usize] as u16;
121125
let op_byte_2 = self.memory[(self.program_counter + 1) as usize] as u16;

src/main.rs

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use chip8::{Chip8Emulator, SCREEN_WIDTH};
44
use clap::Parser;
55
use clap::Subcommand;
66
use itertools::Itertools;
7+
use ratatui::crossterm::event::KeyboardEnhancementFlags;
8+
use ratatui::crossterm::event::PushKeyboardEnhancementFlags;
79
use ratatui::{
810
crossterm::event::{self, Event, KeyCode, KeyEvent, KeyEventKind},
911
layout::{Constraint, Layout, Position, Rect},
@@ -39,6 +41,10 @@ pub struct App {
3941
fn main() -> io::Result<()> {
4042
let command = Args::parse().commands;
4143
let mut terminal = ratatui::init();
44+
ratatui::crossterm::execute!(
45+
io::stderr(),
46+
PushKeyboardEnhancementFlags(KeyboardEnhancementFlags::REPORT_EVENT_TYPES)
47+
)?;
4248
let app_result = App::new(command).run(&mut terminal);
4349
ratatui::restore();
4450
app_result
@@ -64,11 +70,13 @@ impl App {
6470

6571
pub fn run(&mut self, terminal: &mut DefaultTerminal) -> io::Result<()> {
6672
while !self.exit {
67-
self.emulator.tick();
73+
for _ in 0..10 {
74+
self.emulator.tick();
75+
}
6876
self.emulator.tick_timers();
6977
self.calculate_points();
70-
terminal.draw(|frame| self.draw(frame))?;
7178
self.handle_events()?;
79+
terminal.draw(|frame| self.draw(frame))?;
7280
}
7381
Ok(())
7482
}
@@ -80,35 +88,47 @@ impl App {
8088
}
8189

8290
fn handle_events(&mut self) -> io::Result<()> {
83-
if event::poll(Duration::from_micros(10))? {
91+
if event::poll(Duration::from_millis(10))? {
8492
match event::read()? {
85-
Event::Key(key_event) if key_event.kind == KeyEventKind::Press => {
86-
self.handle_key_event(key_event)
93+
Event::Key(key_event) => {
94+
let pressed = if key_event.kind == KeyEventKind::Press {
95+
true
96+
} else {
97+
false
98+
};
99+
self.handle_key_event(key_event, pressed)
87100
}
88101
_ => {}
89102
};
90103
}
91104
Ok(())
92105
}
93-
fn handle_key_event(&mut self, key_event: KeyEvent) {
94-
match key_event.code {
95-
KeyCode::Char('q') => self.exit(),
96-
KeyCode::Char(c) => match c {
97-
'0'..='9' => {
98-
let idx = c as usize - '0' as usize;
99-
self.emulator.keypress(idx, true);
100-
}
101-
'a'..='f' => {
102-
let idx = c as usize - 'a' as usize;
103-
self.emulator.keypress(idx, true);
104-
}
105-
'A'..='F' => {
106-
let idx = c as usize - 'A' as usize;
107-
self.emulator.keypress(idx, true);
108-
}
109-
_ => {}
110-
},
111-
_ => {}
106+
fn handle_key_event(&mut self, key_event: KeyEvent, pressed: bool) {
107+
if key_event.code == KeyCode::Esc {
108+
self.exit();
109+
}
110+
let x = match key_event.code {
111+
KeyCode::Char('1') => Some(0x1),
112+
KeyCode::Char('2') => Some(0x2),
113+
KeyCode::Char('3') => Some(0x3),
114+
KeyCode::Char('4') => Some(0xC),
115+
KeyCode::Char('q') | KeyCode::Char('Q') => Some(0x4),
116+
KeyCode::Char('w') | KeyCode::Char('W') => Some(0x5),
117+
KeyCode::Char('e') | KeyCode::Char('E') => Some(0x6),
118+
KeyCode::Char('r') | KeyCode::Char('R') => Some(0xD),
119+
KeyCode::Char('a') | KeyCode::Char('A') => Some(0x7),
120+
KeyCode::Char('s') | KeyCode::Char('S') => Some(0x8),
121+
KeyCode::Char('d') | KeyCode::Char('D') => Some(0x9),
122+
KeyCode::Char('f') | KeyCode::Char('F') => Some(0xE),
123+
KeyCode::Char('z') | KeyCode::Char('Z') => Some(0xA),
124+
KeyCode::Char('x') | KeyCode::Char('X') => Some(0x0),
125+
KeyCode::Char('c') | KeyCode::Char('C') => Some(0xB),
126+
KeyCode::Char('v') | KeyCode::Char('V') => Some(0xB),
127+
_ => None,
128+
};
129+
130+
if let Some(idx) = x {
131+
self.emulator.keypress(idx, pressed);
112132
}
113133
}
114134

0 commit comments

Comments
 (0)