106 lines
2.1 KiB
Rust
106 lines
2.1 KiB
Rust
/*
|
|
+---+---+---+---+---+---+
|
|
| 0 | 1 | 2 | 3 | 4 | 5 |
|
|
+---+---+---+---+---+---+
|
|
| 6 | 7 | 8 | 9 | A | B |
|
|
+---+---+---+---+---+---+
|
|
| C | D | E | F | AD| DA|
|
|
+---+---+---+---+---+---+
|
|
| + | PC| ST| RS| | |
|
|
+---+---+---+---+---+---+
|
|
*/
|
|
|
|
pub struct Kim1Keypad {
|
|
keys: [bool; 23],
|
|
stepping: bool
|
|
}
|
|
|
|
impl Kim1Keypad {
|
|
pub fn dump(&self) {
|
|
println!("Dumping state of keypad");
|
|
}
|
|
}
|
|
|
|
impl Kim1Keypad {
|
|
fn keyid(from: u8) -> usize{
|
|
(from % 23) as usize
|
|
}
|
|
pub fn new() -> Self {
|
|
Kim1Keypad {
|
|
keys: [false; 23],
|
|
stepping: false
|
|
}
|
|
}
|
|
|
|
pub fn toggle_stepping(&mut self) {
|
|
self.stepping = !self.stepping;;
|
|
}
|
|
|
|
pub fn set_stepping(&mut self, new_state: bool) {
|
|
self.stepping = new_state
|
|
}
|
|
|
|
pub fn press_key(&mut self, key_to_press: u8) {
|
|
self.keys[Self::keyid(key_to_press)] = true;
|
|
}
|
|
|
|
pub fn release_key(&mut self, key_to_release: u8) {
|
|
self.keys[Self::keyid(key_to_release)] = false;
|
|
}
|
|
|
|
pub fn is_pressed(&self, key: u8) -> bool {
|
|
self.keys[Self::keyid(key)]
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod test {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn smoke() { assert!(true); }
|
|
|
|
#[test]
|
|
fn keys_are_pressed() {
|
|
let mut kb = Kim1Keypad::new();
|
|
|
|
for index in 0..23 {
|
|
assert!(!kb.is_pressed(index));
|
|
kb.press_key(index);
|
|
assert!(kb.is_pressed(index));
|
|
|
|
kb.release_key(index);
|
|
assert!(!kb.is_pressed(index));
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn stepping_changes() {
|
|
let mut kb = Kim1Keypad::new();
|
|
|
|
kb.set_stepping(false);
|
|
|
|
assert!(!kb.stepping);
|
|
|
|
kb.toggle_stepping();
|
|
|
|
assert!(kb.stepping);
|
|
|
|
kb.toggle_stepping();
|
|
kb.toggle_stepping();
|
|
kb.toggle_stepping();
|
|
kb.toggle_stepping();
|
|
kb.toggle_stepping();
|
|
|
|
assert!(!kb.stepping);
|
|
}
|
|
|
|
#[test]
|
|
fn out_of_range() {
|
|
let mut kb = Kim1Keypad::new();
|
|
|
|
kb.press_key(24);
|
|
assert!(kb.is_pressed(1));
|
|
}
|
|
}
|