use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MatrixKeyboard {
pub configuration: u8,
pub width: u8,
pub height: u8,
pub scanning_decimation: u8,
pub column_pins: [u8; 8],
pub row_pins: [u8; 16],
pub macro_mapping_options: Vec<u8>,
pub key_mapping_key_code: Vec<u8>,
pub key_mapping_key_modifier: Vec<u8>,
pub key_mapping_triggered_key: Vec<u8>,
pub key_mapping_key_code_up: Vec<u8>,
pub key_mapping_key_modifier_up: Vec<u8>,
pub key_values: Vec<u8>,
}
impl MatrixKeyboard {
pub fn new() -> Self {
Self {
configuration: 0,
width: 0,
height: 0,
scanning_decimation: 0,
column_pins: [0; 8],
row_pins: [0; 16],
macro_mapping_options: vec![0; 128],
key_mapping_key_code: vec![0; 128],
key_mapping_key_modifier: vec![0; 128],
key_mapping_triggered_key: vec![0; 128],
key_mapping_key_code_up: vec![0; 128],
key_mapping_key_modifier_up: vec![0; 128],
key_values: vec![0; 128],
}
}
pub fn is_enabled(&self) -> bool {
self.configuration != 0
}
pub fn get_key_state(&self, row: usize, col: usize) -> bool {
if row >= self.height as usize || col >= self.width as usize {
return false;
}
let key_index = row * 8 + col;
if key_index < self.key_values.len() {
self.key_values[key_index] != 0
} else {
false
}
}
}
impl Default for MatrixKeyboard {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_matrix_keyboard_creation() {
let kb = MatrixKeyboard::new();
assert!(!kb.is_enabled());
assert_eq!(kb.width, 0);
assert_eq!(kb.height, 0);
}
#[test]
fn test_matrix_keyboard_configuration() {
let mut kb = MatrixKeyboard::new();
assert_eq!(kb.configuration, 0);
assert_eq!(kb.width, 0);
assert_eq!(kb.height, 0);
assert_eq!(kb.scanning_decimation, 0);
assert_eq!(kb.column_pins.len(), 8);
assert_eq!(kb.row_pins.len(), 16);
kb.configuration = 1;
kb.width = 4;
kb.height = 4;
assert!(kb.is_enabled());
assert_eq!(kb.width, 4);
assert_eq!(kb.height, 4);
}
#[test]
fn test_get_key_state() {
let mut kb = MatrixKeyboard::new();
kb.width = 4;
kb.height = 4;
assert!(!kb.get_key_state(0, 0)); assert!(!kb.get_key_state(4, 0)); assert!(!kb.get_key_state(0, 4));
kb.key_values[0] = 1; assert!(kb.get_key_state(0, 0));
kb.key_values[8] = 1; assert!(kb.get_key_state(1, 0));
}
#[test]
fn test_key_index_calculation() {
let mut kb = MatrixKeyboard::new();
kb.width = 3;
kb.height = 3;
kb.key_values[0] = 1; kb.key_values[1] = 1; kb.key_values[8] = 1; kb.key_values[9] = 1;
assert!(kb.get_key_state(0, 0));
assert!(kb.get_key_state(0, 1));
assert!(!kb.get_key_state(0, 2));
assert!(kb.get_key_state(1, 0));
assert!(kb.get_key_state(1, 1));
assert!(!kb.get_key_state(1, 2));
}
}