pokeys_lib/
keyboard_matrix.rs1use serde::{Deserialize, Serialize};
41
42#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct MatrixKeyboard {
45 pub configuration: u8,
46 pub width: u8,
47 pub height: u8,
48 pub scanning_decimation: u8,
49 pub column_pins: [u8; 8],
50 pub row_pins: [u8; 16],
51 pub macro_mapping_options: Vec<u8>,
52 pub key_mapping_key_code: Vec<u8>,
53 pub key_mapping_key_modifier: Vec<u8>,
54 pub key_mapping_triggered_key: Vec<u8>,
55 pub key_mapping_key_code_up: Vec<u8>,
56 pub key_mapping_key_modifier_up: Vec<u8>,
57 pub key_values: Vec<u8>,
58}
59
60impl MatrixKeyboard {
61 pub fn new() -> Self {
62 Self {
63 configuration: 0,
64 width: 0,
65 height: 0,
66 scanning_decimation: 0,
67 column_pins: [0; 8],
68 row_pins: [0; 16],
69 macro_mapping_options: vec![0; 128],
70 key_mapping_key_code: vec![0; 128],
71 key_mapping_key_modifier: vec![0; 128],
72 key_mapping_triggered_key: vec![0; 128],
73 key_mapping_key_code_up: vec![0; 128],
74 key_mapping_key_modifier_up: vec![0; 128],
75 key_values: vec![0; 128],
76 }
77 }
78
79 pub fn is_enabled(&self) -> bool {
80 self.configuration != 0
81 }
82
83 pub fn get_key_state(&self, row: usize, col: usize) -> bool {
84 if row >= self.height as usize || col >= self.width as usize {
85 return false;
86 }
87 let key_index = row * 8 + col;
89 if key_index < self.key_values.len() {
90 self.key_values[key_index] != 0
91 } else {
92 false
93 }
94 }
95}
96
97impl Default for MatrixKeyboard {
98 fn default() -> Self {
99 Self::new()
100 }
101}
102
103#[cfg(test)]
104mod tests {
105 use super::*;
106
107 #[test]
108 fn test_matrix_keyboard_creation() {
109 let kb = MatrixKeyboard::new();
110 assert!(!kb.is_enabled());
111 assert_eq!(kb.width, 0);
112 assert_eq!(kb.height, 0);
113 }
114
115 #[test]
116 fn test_matrix_keyboard_configuration() {
117 let mut kb = MatrixKeyboard::new();
118
119 assert_eq!(kb.configuration, 0);
121 assert_eq!(kb.width, 0);
122 assert_eq!(kb.height, 0);
123 assert_eq!(kb.scanning_decimation, 0);
124 assert_eq!(kb.column_pins.len(), 8);
125 assert_eq!(kb.row_pins.len(), 16);
126
127 kb.configuration = 1;
129 kb.width = 4;
130 kb.height = 4;
131
132 assert!(kb.is_enabled());
133 assert_eq!(kb.width, 4);
134 assert_eq!(kb.height, 4);
135 }
136
137 #[test]
138 fn test_get_key_state() {
139 let mut kb = MatrixKeyboard::new();
140 kb.width = 4;
141 kb.height = 4;
142
143 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));
151
152 kb.key_values[8] = 1; assert!(kb.get_key_state(1, 0));
154 }
155
156 #[test]
157 fn test_key_index_calculation() {
158 let mut kb = MatrixKeyboard::new();
159 kb.width = 3;
160 kb.height = 3;
161
162 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));
169 assert!(kb.get_key_state(0, 1));
170 assert!(!kb.get_key_state(0, 2));
171 assert!(kb.get_key_state(1, 0));
172 assert!(kb.get_key_state(1, 1));
173 assert!(!kb.get_key_state(1, 2));
174 }
175}