virtio_input_decoder/
key.rs

1pub struct KeyDecoder();
2
3#[derive(Debug, PartialEq, Clone, Copy)]
4pub enum Key
5{
6	None,
7	ESC,
8	One,
9	Two,
10	Three,
11	Four,
12	Five,
13	Six,
14	Seven,
15	Eight,
16	Nine,
17	Zero,
18	Minus,
19	Equal,
20	BackSpace,
21	Tab,
22	Q,
23	W,
24	E,
25	R,
26	T,
27	Y,
28	U,
29	I,
30	O,
31	P,
32	LSB,
33	RSB,
34	Enter,
35	LCTRL,
36	A,
37	S,
38	D,
39	F,
40	G,
41	H,
42	J,
43	K,
44	L,
45	Colon,
46	SineglePoint,
47	Point,
48	LSHIFT,
49	BackSlash,
50	Z,
51	X,
52	C,
53	V,
54	B,
55	N,
56	M,
57	Comma,
58	Dot,
59	Slash,
60	RSHIFT,
61	DPSTAR,
62	LALT,
63	Space,
64    CAPS,
65    MouseScrollDown = 0x150,
66    MouseScrollUp,
67    MouseLeft = 272,
68    MouseRight,
69    MouseMid,
70}
71
72impl KeyDecoder {
73    pub fn decode(code : usize)->Result<Key, ()>{
74        let rt = match code {
75            1 => {Key::ESC}
76            2 => {Key::One}
77            3 => {Key::Two}
78            4 => {Key::Three}
79            5 => {Key::Four}
80            6 => {Key::Five}
81            7 => {Key::Six}
82            8 => {Key::Seven}
83            9 => {Key::Eight}
84            10 => {Key::Nine}
85            11 => {Key::Zero}
86            12 => {Key::Minus}
87            13 => {Key::Equal}
88            14 => {Key::BackSpace}
89            15 => {Key::Tab}
90            16 => {Key::Q}
91            17 => {Key::W}
92            18 => {Key::E}
93            19 => {Key::R}
94            20 => {Key::T}
95            21 => {Key::Y}
96            22 => {Key::U}
97            23 => {Key::I}
98            24 => {Key::O}
99            25 => {Key::P}
100            26 => {Key::LSB}
101            27 => {Key::RSB}
102            28 => {Key::Enter}
103            29 => {Key::LCTRL}
104            30 => {Key::A}
105            31 => {Key::S}
106            32 => {Key::D}
107            33 => {Key::F}
108            34 => {Key::G}
109            35 => {Key::H}
110            36 => {Key::J}
111            37 => {Key::K}
112            38 => {Key::L}
113            39 => {Key::Colon}
114            40 => {Key::SineglePoint}
115            41 => {Key::Point}
116            42 => {Key::LSHIFT}
117            43 => {Key::BackSlash}
118            44 => {Key::Z}
119            45 => {Key::X}
120            46 => {Key::C}
121            47 => {Key::V}
122            48 => {Key::B}
123            49 => {Key::N}
124            50 => {Key::M}
125            51 => {Key::Comma}
126            52 => {Key::Dot}
127            53 => {Key::Slash}
128            54 => {Key::RSHIFT}
129            55 => {Key::DPSTAR}
130            56 => {Key::LALT}
131            57 => {Key::Space}
132            58 => {Key::CAPS}
133            272 => {Key::MouseLeft}
134            273 => {Key::MouseRight}
135            274 => {Key::MouseMid}
136            _ => return Err(())
137        };
138        Ok(rt)
139    }
140
141    pub fn convert(key : Key)->Result<char, ()> {
142        match key {
143            Key::A => {Ok('a')}
144            Key::B => {Ok('b')}
145            Key::C => {Ok('c')}
146            Key::D => {Ok('d')}
147            Key::E => {Ok('e')}
148            Key::F => {Ok('f')}
149            Key::G => {Ok('g')}
150            Key::H => {Ok('h')}
151            Key::I => {Ok('i')}
152            Key::J => {Ok('j')}
153            Key::K => {Ok('k')}
154            Key::L => {Ok('l')}
155            Key::M => {Ok('m')}
156            Key::N => {Ok('n')}
157            Key::O => {Ok('o')}
158            Key::P => {Ok('p')}
159            Key::Q => {Ok('q')}
160            Key::R => {Ok('r')}
161            Key::S => {Ok('s')}
162            Key::T => {Ok('t')}
163            Key::U => {Ok('u')}
164            Key::V => {Ok('v')}
165            Key::W => {Ok('w')}
166            Key::X => {Ok('x')}
167            Key::Y => {Ok('y')}
168            Key::Z => {Ok('z')}
169            Key::Enter => {Ok('\r')}
170            Key::One => {Ok('1')}
171            Key::Two => {Ok('2')}
172            Key::Three => {Ok('3')}
173            Key::Four => {Ok('4')}
174            Key::Five => {Ok('5')}
175            Key::Six => {Ok('6')}
176            Key::Seven => {Ok('7')}
177            Key::Eight => {Ok('8')}
178            Key::Nine => {Ok('9')}
179            Key::Zero => {Ok('0')}
180            Key::Dot => {Ok('.')}
181            Key::Colon => {Ok(';')}
182            Key::SineglePoint => {Ok('\'')}
183            Key::BackSlash => {Ok('\\')}
184            Key::Comma => {Ok(',')}
185            Key::Slash => {Ok('/')}
186            Key::Space => {Ok(' ')}
187            Key::Minus => {Ok('-')}
188            Key::Equal => {Ok('=')}
189            Key::Tab => {Ok('\t')}
190            _ => {Err(())}
191        }
192    }
193
194    pub fn key_type(value : usize)->Result<KeyType, ()> {
195        match value {
196            1 => Ok(KeyType::Press),
197            0 => Ok(KeyType::Release),
198            _ => Err(())
199        }
200    }
201}
202
203impl Key {
204    pub fn from_code(code : usize)->Result<Key, ()> {
205        let rt = match code {
206            1 => {Key::ESC}
207            2 => {Key::One}
208            3 => {Key::Two}
209            4 => {Key::Three}
210            5 => {Key::Four}
211            6 => {Key::Five}
212            7 => {Key::Six}
213            8 => {Key::Seven}
214            9 => {Key::Eight}
215            10 => {Key::Nine}
216            11 => {Key::Zero}
217            12 => {Key::Minus}
218            13 => {Key::Equal}
219            14 => {Key::BackSpace}
220            15 => {Key::Tab}
221            16 => {Key::Q}
222            17 => {Key::W}
223            18 => {Key::E}
224            19 => {Key::R}
225            20 => {Key::T}
226            21 => {Key::Y}
227            22 => {Key::U}
228            23 => {Key::I}
229            24 => {Key::O}
230            25 => {Key::P}
231            26 => {Key::LSB}
232            27 => {Key::RSB}
233            28 => {Key::Enter}
234            29 => {Key::LCTRL}
235            30 => {Key::A}
236            31 => {Key::S}
237            32 => {Key::D}
238            33 => {Key::F}
239            34 => {Key::G}
240            35 => {Key::H}
241            36 => {Key::J}
242            37 => {Key::K}
243            38 => {Key::L}
244            39 => {Key::Colon}
245            40 => {Key::SineglePoint}
246            41 => {Key::Point}
247            42 => {Key::LSHIFT}
248            43 => {Key::BackSlash}
249            44 => {Key::Z}
250            45 => {Key::X}
251            46 => {Key::C}
252            47 => {Key::V}
253            48 => {Key::B}
254            49 => {Key::N}
255            50 => {Key::M}
256            51 => {Key::Comma}
257            52 => {Key::Dot}
258            53 => {Key::Slash}
259            54 => {Key::RSHIFT}
260            55 => {Key::DPSTAR}
261            56 => {Key::LALT}
262            57 => {Key::Space}
263            58 => {Key::CAPS}
264            272 => {Key::MouseLeft}
265            273 => {Key::MouseRight}
266            274 => {Key::MouseMid}
267            _ => return Err(())
268        };
269        Ok(rt)
270    }
271
272    pub fn to_char(&self)->Result<char, ()> {
273        match *self {
274            Key::A => {Ok('a')}
275            Key::B => {Ok('b')}
276            Key::C => {Ok('c')}
277            Key::D => {Ok('d')}
278            Key::E => {Ok('e')}
279            Key::F => {Ok('f')}
280            Key::G => {Ok('g')}
281            Key::H => {Ok('h')}
282            Key::I => {Ok('i')}
283            Key::J => {Ok('j')}
284            Key::K => {Ok('k')}
285            Key::L => {Ok('l')}
286            Key::M => {Ok('m')}
287            Key::N => {Ok('n')}
288            Key::O => {Ok('o')}
289            Key::P => {Ok('p')}
290            Key::Q => {Ok('q')}
291            Key::R => {Ok('r')}
292            Key::S => {Ok('s')}
293            Key::T => {Ok('t')}
294            Key::U => {Ok('u')}
295            Key::V => {Ok('v')}
296            Key::W => {Ok('w')}
297            Key::X => {Ok('x')}
298            Key::Y => {Ok('y')}
299            Key::Z => {Ok('z')}
300            Key::Enter => {Ok('\r')}
301            Key::One => {Ok('1')}
302            Key::Two => {Ok('2')}
303            Key::Three => {Ok('3')}
304            Key::Four => {Ok('4')}
305            Key::Five => {Ok('5')}
306            Key::Six => {Ok('6')}
307            Key::Seven => {Ok('7')}
308            Key::Eight => {Ok('8')}
309            Key::Nine => {Ok('9')}
310            Key::Zero => {Ok('0')}
311            Key::Dot => {Ok('.')}
312            Key::Colon => {Ok(';')}
313            Key::SineglePoint => {Ok('\'')}
314            Key::BackSlash => {Ok('\\')}
315            Key::Comma => {Ok(',')}
316            Key::Slash => {Ok('/')}
317            Key::Space => {Ok(' ')}
318            Key::Minus => {Ok('-')}
319            Key::Equal => {Ok('=')}
320            Key::Tab => {Ok('\t')}
321            _ => {Err(())}
322        }
323    }
324}
325
326#[derive(Debug, PartialEq, Clone, Copy)]
327pub enum KeyType {
328    Press,
329    Release,
330}