Skip to main content

rmk_types/keycode/
ascii.rs

1//! ASCII to/from keycode conversion.
2
3use super::hid::HidKeyCode;
4
5/// Convert a ascii chat to keycode
6/// bool, if the keycode should be shifted
7/// assumes en-us keyboard mapping
8pub fn from_ascii(ascii: u8) -> (HidKeyCode, bool) {
9    match ascii {
10        b'0' => (HidKeyCode::Kc0, false),
11        b'1' => (HidKeyCode::Kc1, false),
12        b'2' => (HidKeyCode::Kc2, false),
13        b'3' => (HidKeyCode::Kc3, false),
14        b'4' => (HidKeyCode::Kc4, false),
15        b'5' => (HidKeyCode::Kc5, false),
16        b'6' => (HidKeyCode::Kc6, false),
17        b'7' => (HidKeyCode::Kc7, false),
18        b'8' => (HidKeyCode::Kc8, false),
19        b'9' => (HidKeyCode::Kc9, false),
20        b'a' => (HidKeyCode::A, false),
21        b'b' => (HidKeyCode::B, false),
22        b'c' => (HidKeyCode::C, false),
23        b'd' => (HidKeyCode::D, false),
24        b'e' => (HidKeyCode::E, false),
25        b'f' => (HidKeyCode::F, false),
26        b'g' => (HidKeyCode::G, false),
27        b'h' => (HidKeyCode::H, false),
28        b'i' => (HidKeyCode::I, false),
29        b'j' => (HidKeyCode::J, false),
30        b'k' => (HidKeyCode::K, false),
31        b'l' => (HidKeyCode::L, false),
32        b'm' => (HidKeyCode::M, false),
33        b'n' => (HidKeyCode::N, false),
34        b'o' => (HidKeyCode::O, false),
35        b'p' => (HidKeyCode::P, false),
36        b'q' => (HidKeyCode::Q, false),
37        b'r' => (HidKeyCode::R, false),
38        b's' => (HidKeyCode::S, false),
39        b't' => (HidKeyCode::T, false),
40        b'u' => (HidKeyCode::U, false),
41        b'v' => (HidKeyCode::V, false),
42        b'w' => (HidKeyCode::W, false),
43        b'x' => (HidKeyCode::X, false),
44        b'y' => (HidKeyCode::Y, false),
45        b'z' => (HidKeyCode::Z, false),
46        b'A' => (HidKeyCode::A, true),
47        b'B' => (HidKeyCode::B, true),
48        b'C' => (HidKeyCode::C, true),
49        b'D' => (HidKeyCode::D, true),
50        b'E' => (HidKeyCode::E, true),
51        b'F' => (HidKeyCode::F, true),
52        b'G' => (HidKeyCode::G, true),
53        b'H' => (HidKeyCode::H, true),
54        b'I' => (HidKeyCode::I, true),
55        b'J' => (HidKeyCode::J, true),
56        b'K' => (HidKeyCode::K, true),
57        b'L' => (HidKeyCode::L, true),
58        b'M' => (HidKeyCode::M, true),
59        b'N' => (HidKeyCode::N, true),
60        b'O' => (HidKeyCode::O, true),
61        b'P' => (HidKeyCode::P, true),
62        b'Q' => (HidKeyCode::Q, true),
63        b'R' => (HidKeyCode::R, true),
64        b'S' => (HidKeyCode::S, true),
65        b'T' => (HidKeyCode::T, true),
66        b'U' => (HidKeyCode::U, true),
67        b'V' => (HidKeyCode::V, true),
68        b'W' => (HidKeyCode::W, true),
69        b'X' => (HidKeyCode::X, true),
70        b'Y' => (HidKeyCode::Y, true),
71        b'Z' => (HidKeyCode::Z, true),
72        b'!' => (HidKeyCode::Kc1, true),
73        b'@' => (HidKeyCode::Kc2, true),
74        b'#' => (HidKeyCode::Kc3, true),
75        b'$' => (HidKeyCode::Kc4, true),
76        b'%' => (HidKeyCode::Kc5, true),
77        b'^' => (HidKeyCode::Kc6, true),
78        b'&' => (HidKeyCode::Kc7, true),
79        b'*' => (HidKeyCode::Kc8, true),
80        b'(' => (HidKeyCode::Kc9, true),
81        b')' => (HidKeyCode::Kc0, true),
82        b'-' => (HidKeyCode::Minus, false),
83        b'_' => (HidKeyCode::Minus, true),
84        b'=' => (HidKeyCode::Equal, false),
85        b'+' => (HidKeyCode::Equal, true),
86        b'[' => (HidKeyCode::LeftBracket, false),
87        b']' => (HidKeyCode::RightBracket, false),
88        b'{' => (HidKeyCode::LeftBracket, true),
89        b'}' => (HidKeyCode::RightBracket, true),
90        b';' => (HidKeyCode::Semicolon, false),
91        b':' => (HidKeyCode::Semicolon, true),
92        b'\'' => (HidKeyCode::Quote, false),
93        b'"' => (HidKeyCode::Quote, true),
94        b'`' => (HidKeyCode::Grave, false),
95        b'~' => (HidKeyCode::Grave, true),
96        b'\\' => (HidKeyCode::Backslash, false),
97        b'|' => (HidKeyCode::Backslash, true),
98        b',' => (HidKeyCode::Comma, false),
99        b'<' => (HidKeyCode::Comma, true),
100        b'.' => (HidKeyCode::Dot, false),
101        b'>' => (HidKeyCode::Dot, true),
102        b'/' => (HidKeyCode::Slash, false),
103        b'?' => (HidKeyCode::Slash, true),
104        b' ' => (HidKeyCode::Space, false),
105        b'\n' => (HidKeyCode::Enter, false),
106        b'\t' => (HidKeyCode::Tab, false),
107        b'\x08' => (HidKeyCode::Backspace, false),
108        b'\x1B' => (HidKeyCode::Escape, false),
109        b'\x7F' => (HidKeyCode::Delete, false),
110        _ => (HidKeyCode::No, false),
111    }
112}
113
114/// Convert a ascii chat to keycode
115/// assumes en-us keyboard mapping
116pub fn to_ascii(keycode: HidKeyCode, shifted: bool) -> u8 {
117    match (keycode, shifted) {
118        (HidKeyCode::Kc0, false) => b'0',
119        (HidKeyCode::Kc1, false) => b'1',
120        (HidKeyCode::Kc2, false) => b'2',
121        (HidKeyCode::Kc3, false) => b'3',
122        (HidKeyCode::Kc4, false) => b'4',
123        (HidKeyCode::Kc5, false) => b'5',
124        (HidKeyCode::Kc6, false) => b'6',
125        (HidKeyCode::Kc7, false) => b'7',
126        (HidKeyCode::Kc8, false) => b'8',
127        (HidKeyCode::Kc9, false) => b'9',
128        (HidKeyCode::A, false) => b'a',
129        (HidKeyCode::B, false) => b'b',
130        (HidKeyCode::C, false) => b'c',
131        (HidKeyCode::D, false) => b'd',
132        (HidKeyCode::E, false) => b'e',
133        (HidKeyCode::F, false) => b'f',
134        (HidKeyCode::G, false) => b'g',
135        (HidKeyCode::H, false) => b'h',
136        (HidKeyCode::I, false) => b'i',
137        (HidKeyCode::J, false) => b'j',
138        (HidKeyCode::K, false) => b'k',
139        (HidKeyCode::L, false) => b'l',
140        (HidKeyCode::M, false) => b'm',
141        (HidKeyCode::N, false) => b'n',
142        (HidKeyCode::O, false) => b'o',
143        (HidKeyCode::P, false) => b'p',
144        (HidKeyCode::Q, false) => b'q',
145        (HidKeyCode::R, false) => b'r',
146        (HidKeyCode::S, false) => b's',
147        (HidKeyCode::T, false) => b't',
148        (HidKeyCode::U, false) => b'u',
149        (HidKeyCode::V, false) => b'v',
150        (HidKeyCode::W, false) => b'w',
151        (HidKeyCode::X, false) => b'x',
152        (HidKeyCode::Y, false) => b'y',
153        (HidKeyCode::Z, false) => b'z',
154        (HidKeyCode::A, true) => b'A',
155        (HidKeyCode::B, true) => b'B',
156        (HidKeyCode::C, true) => b'C',
157        (HidKeyCode::D, true) => b'D',
158        (HidKeyCode::E, true) => b'E',
159        (HidKeyCode::F, true) => b'F',
160        (HidKeyCode::G, true) => b'G',
161        (HidKeyCode::H, true) => b'H',
162        (HidKeyCode::I, true) => b'I',
163        (HidKeyCode::J, true) => b'J',
164        (HidKeyCode::K, true) => b'K',
165        (HidKeyCode::L, true) => b'L',
166        (HidKeyCode::M, true) => b'M',
167        (HidKeyCode::N, true) => b'N',
168        (HidKeyCode::O, true) => b'O',
169        (HidKeyCode::P, true) => b'P',
170        (HidKeyCode::Q, true) => b'Q',
171        (HidKeyCode::R, true) => b'R',
172        (HidKeyCode::S, true) => b'S',
173        (HidKeyCode::T, true) => b'T',
174        (HidKeyCode::U, true) => b'U',
175        (HidKeyCode::V, true) => b'V',
176        (HidKeyCode::W, true) => b'W',
177        (HidKeyCode::X, true) => b'X',
178        (HidKeyCode::Y, true) => b'Y',
179        (HidKeyCode::Z, true) => b'Z',
180        (HidKeyCode::Kc1, true) => b'!',
181        (HidKeyCode::Kc2, true) => b'@',
182        (HidKeyCode::Kc3, true) => b'#',
183        (HidKeyCode::Kc4, true) => b'$',
184        (HidKeyCode::Kc5, true) => b'%',
185        (HidKeyCode::Kc6, true) => b'^',
186        (HidKeyCode::Kc7, true) => b'&',
187        (HidKeyCode::Kc8, true) => b'*',
188        (HidKeyCode::Kc9, true) => b'(',
189        (HidKeyCode::Kc0, true) => b')',
190        (HidKeyCode::Minus, false) => b'-',
191        (HidKeyCode::Minus, true) => b'_',
192        (HidKeyCode::Equal, false) => b'=',
193        (HidKeyCode::Equal, true) => b'+',
194        (HidKeyCode::LeftBracket, false) => b'[',
195        (HidKeyCode::RightBracket, false) => b']',
196        (HidKeyCode::LeftBracket, true) => b'{',
197        (HidKeyCode::RightBracket, true) => b'}',
198        (HidKeyCode::Semicolon, false) => b';',
199        (HidKeyCode::Semicolon, true) => b':',
200        (HidKeyCode::Quote, false) => b'\'',
201        (HidKeyCode::Quote, true) => b'"',
202        (HidKeyCode::Grave, false) => b'`',
203        (HidKeyCode::Grave, true) => b'~',
204        (HidKeyCode::Backslash, false) => b'\\',
205        (HidKeyCode::Backslash, true) => b'|',
206        (HidKeyCode::Comma, false) => b',',
207        (HidKeyCode::Comma, true) => b'<',
208        (HidKeyCode::Dot, false) => b'.',
209        (HidKeyCode::Dot, true) => b'>',
210        (HidKeyCode::Slash, false) => b'/',
211        (HidKeyCode::Slash, true) => b'?',
212        (HidKeyCode::Space, false) => b' ',
213        (HidKeyCode::Enter, false) => b'\n',
214        (HidKeyCode::Tab, false) => b'\t',
215        (HidKeyCode::Backspace, false) => b'\x08',
216        (HidKeyCode::Escape, false) => b'\x1B',
217        (HidKeyCode::Delete, false) => b'\x7F',
218        // not supported keycodes
219        (_, _) => b'X',
220    }
221}