add basic script repl
This commit is contained in:
parent
0d1a12202f
commit
a2cca0be4e
15 changed files with 1041 additions and 61 deletions
|
@ -1,7 +1,278 @@
|
|||
pub struct Keyboard;
|
||||
use alloc::boxed::Box;
|
||||
use lazy_static::lazy_static;
|
||||
use spin::{Mutex, MutexGuard};
|
||||
|
||||
use crate::println;
|
||||
|
||||
pub fn keyboard<'r>() -> MutexGuard<'r, Keyboard> {
|
||||
KEYBOARD.lock()
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
static ref KEYBOARD: Mutex<Keyboard> = Mutex::new(Keyboard::init());
|
||||
}
|
||||
|
||||
pub struct Keyboard {
|
||||
on_code: Option<Box<dyn FnMut(Code) + Send>>,
|
||||
last: Option<Code>,
|
||||
}
|
||||
|
||||
impl Keyboard {
|
||||
pub fn record(key_code: u8) {
|
||||
// todo!()
|
||||
pub fn init() -> Self {
|
||||
let on_code = None;
|
||||
let last = None;
|
||||
Self { on_code, last }
|
||||
}
|
||||
|
||||
pub fn on_code(&mut self, op: impl FnMut(Code) + Send + 'static) {
|
||||
self.on_code = Some(Box::new(op) as _);
|
||||
}
|
||||
|
||||
pub fn record(&mut self, scan_code: u8) {
|
||||
let code = self.parse(scan_code);
|
||||
match code {
|
||||
Err(err) => println!("Failed to record key : {err:?}"),
|
||||
Ok(Code::Control) => self.last = Some(Code::Control),
|
||||
Ok(c) if let Some(op) = self.on_code.as_mut() => op(c),
|
||||
Ok(c) => println!("Ignoring {c:?}"),
|
||||
};
|
||||
}
|
||||
|
||||
pub fn parse(&mut self, scan_code: u8) -> Result<Code, KeyParseErr> {
|
||||
let code = match (self.last, scan_code) {
|
||||
(None, 0xE0) => Code::Control,
|
||||
(None, 0x1E) => Code::Down(Key::Char('a')),
|
||||
(None, 0x30) => Code::Down(Key::Char('b')),
|
||||
(None, 0x2E) => Code::Down(Key::Char('c')),
|
||||
(None, 0x20) => Code::Down(Key::Char('d')),
|
||||
(None, 0x12) => Code::Down(Key::Char('e')),
|
||||
(None, 0x21) => Code::Down(Key::Char('f')),
|
||||
(None, 0x22) => Code::Down(Key::Char('g')),
|
||||
(None, 0x23) => Code::Down(Key::Char('h')),
|
||||
(None, 0x17) => Code::Down(Key::Char('i')),
|
||||
(None, 0x24) => Code::Down(Key::Char('j')),
|
||||
(None, 0x25) => Code::Down(Key::Char('k')),
|
||||
(None, 0x26) => Code::Down(Key::Char('l')),
|
||||
(None, 0x32) => Code::Down(Key::Char('m')),
|
||||
(None, 0x31) => Code::Down(Key::Char('n')),
|
||||
(None, 0x18) => Code::Down(Key::Char('o')),
|
||||
(None, 0x19) => Code::Down(Key::Char('p')),
|
||||
(None, 0x10) => Code::Down(Key::Char('q')),
|
||||
(None, 0x13) => Code::Down(Key::Char('r')),
|
||||
(None, 0x1F) => Code::Down(Key::Char('s')),
|
||||
(None, 0x14) => Code::Down(Key::Char('t')),
|
||||
(None, 0x16) => Code::Down(Key::Char('u')),
|
||||
(None, 0x2F) => Code::Down(Key::Char('v')),
|
||||
(None, 0x11) => Code::Down(Key::Char('w')),
|
||||
(None, 0x2D) => Code::Down(Key::Char('x')),
|
||||
(None, 0x15) => Code::Down(Key::Char('y')),
|
||||
(None, 0x2C) => Code::Down(Key::Char('z')),
|
||||
(None, 0x0B) => Code::Down(Key::Char('0')),
|
||||
(None, 0x02) => Code::Down(Key::Char('1')),
|
||||
(None, 0x03) => Code::Down(Key::Char('2')),
|
||||
(None, 0x04) => Code::Down(Key::Char('3')),
|
||||
(None, 0x05) => Code::Down(Key::Char('4')),
|
||||
(None, 0x06) => Code::Down(Key::Char('5')),
|
||||
(None, 0x07) => Code::Down(Key::Char('6')),
|
||||
(None, 0x08) => Code::Down(Key::Char('7')),
|
||||
(None, 0x09) => Code::Down(Key::Char('8')),
|
||||
(None, 0x0A) => Code::Down(Key::Char('9')),
|
||||
(None, 0x29) => Code::Down(Key::Char('`')),
|
||||
(None, 0x0C) => Code::Down(Key::Char('-')),
|
||||
(None, 0x0D) => Code::Down(Key::Char('=')),
|
||||
(None, 0x2B) => Code::Down(Key::Char('\\')),
|
||||
(None, 0x1A) => Code::Down(Key::Char('[')),
|
||||
(None, 0x34) => Code::Down(Key::Char('.')),
|
||||
(None, 0x35) => Code::Down(Key::Char('/')),
|
||||
(None, 0x1B) => Code::Down(Key::Char(']')),
|
||||
(None, 0x27) => Code::Down(Key::Char(';')),
|
||||
(None, 0x28) => Code::Down(Key::Char('\'')),
|
||||
(None, 0x33) => Code::Down(Key::Char(',')),
|
||||
(None, 0x1C) => Code::Down(Key::Char('\n')),
|
||||
(None, 0x39) => Code::Down(Key::Char(' ')),
|
||||
(None, 0x0F) => Code::Down(Key::Char('\t')),
|
||||
(None, 0x0E) => Code::Down(Key::BackSpace),
|
||||
(None, 0x9E) => Code::Up(Key::Char('a')),
|
||||
(None, 0xB0) => Code::Up(Key::Char('b')),
|
||||
(None, 0xAE) => Code::Up(Key::Char('c')),
|
||||
(None, 0xA0) => Code::Up(Key::Char('d')),
|
||||
(None, 0x92) => Code::Up(Key::Char('e')),
|
||||
(None, 0xA1) => Code::Up(Key::Char('f')),
|
||||
(None, 0xA2) => Code::Up(Key::Char('g')),
|
||||
(None, 0xA3) => Code::Up(Key::Char('h')),
|
||||
(None, 0x97) => Code::Up(Key::Char('i')),
|
||||
(None, 0xA4) => Code::Up(Key::Char('j')),
|
||||
(None, 0xA5) => Code::Up(Key::Char('k')),
|
||||
(None, 0xA6) => Code::Up(Key::Char('l')),
|
||||
(None, 0xB2) => Code::Up(Key::Char('m')),
|
||||
(None, 0xB1) => Code::Up(Key::Char('n')),
|
||||
(None, 0x98) => Code::Up(Key::Char('o')),
|
||||
(None, 0x99) => Code::Up(Key::Char('p')),
|
||||
(None, 0x90) => Code::Up(Key::Char('q')),
|
||||
(None, 0x93) => Code::Up(Key::Char('r')),
|
||||
(None, 0x9F) => Code::Up(Key::Char('s')),
|
||||
(None, 0x94) => Code::Up(Key::Char('t')),
|
||||
(None, 0x96) => Code::Up(Key::Char('u')),
|
||||
(None, 0xAF) => Code::Up(Key::Char('v')),
|
||||
(None, 0x91) => Code::Up(Key::Char('w')),
|
||||
(None, 0xAD) => Code::Up(Key::Char('x')),
|
||||
(None, 0x95) => Code::Up(Key::Char('y')),
|
||||
(None, 0xAC) => Code::Up(Key::Char('z')),
|
||||
(None, 0x8B) => Code::Up(Key::Char('0')),
|
||||
(None, 0x82) => Code::Up(Key::Char('1')),
|
||||
(None, 0x83) => Code::Up(Key::Char('2')),
|
||||
(None, 0x84) => Code::Up(Key::Char('3')),
|
||||
(None, 0x85) => Code::Up(Key::Char('4')),
|
||||
(None, 0x86) => Code::Up(Key::Char('5')),
|
||||
(None, 0x87) => Code::Up(Key::Char('6')),
|
||||
(None, 0x88) => Code::Up(Key::Char('7')),
|
||||
(None, 0x89) => Code::Up(Key::Char('8')),
|
||||
(None, 0x8A) => Code::Up(Key::Char('9')),
|
||||
(None, 0xA9) => Code::Up(Key::Char('`')),
|
||||
(None, 0x8C) => Code::Up(Key::Char('-')),
|
||||
(None, 0x8D) => Code::Up(Key::Char('=')),
|
||||
(None, 0xAB) => Code::Up(Key::Char('\\')),
|
||||
(None, 0x9A) => Code::Up(Key::Char('[')),
|
||||
(None, 0xB4) => Code::Up(Key::Char('.')),
|
||||
(None, 0xB5) => Code::Up(Key::Char('/')),
|
||||
(None, 0x9B) => Code::Up(Key::Char(']')),
|
||||
(None, 0xA7) => Code::Up(Key::Char(';')),
|
||||
(None, 0xA8) => Code::Up(Key::Char('\'')),
|
||||
(None, 0xB3) => Code::Up(Key::Char(',')),
|
||||
(None, 0x9C) => Code::Up(Key::Char('\n')),
|
||||
(None, 0xB9) => Code::Up(Key::Char(' ')),
|
||||
(None, 0x8F) => Code::Up(Key::Char('\t')),
|
||||
(None, 0x8E) => Code::Up(Key::BackSpace),
|
||||
_ => Err(KeyParseErr::UnknownCode(scan_code))?,
|
||||
};
|
||||
Ok(code)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub enum Code {
|
||||
Down(Key),
|
||||
Up(Key),
|
||||
Control,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub enum Key {
|
||||
Char(char),
|
||||
BackSpace,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub enum KeyParseErr {
|
||||
UnknownCode(u8),
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
char table
|
||||
|
||||
A 1E 9E
|
||||
B 30 B0
|
||||
C 2E AE
|
||||
D 20 A0
|
||||
E 12 92
|
||||
F 21 A1
|
||||
G 22 A2
|
||||
H 23 A3
|
||||
I 17 97
|
||||
J 24 A4
|
||||
K 25 A5
|
||||
L 26 A6
|
||||
M 32 B2
|
||||
N 31 B1
|
||||
O 18 98
|
||||
P 19 99
|
||||
Q 10 90
|
||||
R 13 93
|
||||
S 1F 9F
|
||||
T 14 94
|
||||
U 16 96
|
||||
V 2F AF
|
||||
W 11 91
|
||||
X 2D AD
|
||||
Y 15 95
|
||||
Z 2C AC
|
||||
0 0B 8B
|
||||
1 02 82
|
||||
2 03 83
|
||||
3 04 84
|
||||
4 05 85
|
||||
5 06 86
|
||||
6 07 87
|
||||
7 08 88
|
||||
8 09 89
|
||||
9 0A 8A
|
||||
` 29 89
|
||||
- 0C 8C
|
||||
= 0D 8D
|
||||
\ 2B AB
|
||||
[ 1A 9A
|
||||
. 34 B4
|
||||
/ 35 B5
|
||||
] 1B 9B
|
||||
; 27 A7
|
||||
' 28 A8
|
||||
, 33 B3
|
||||
ENTER 1C 9C
|
||||
SPACE 39 B9
|
||||
TAB 0F 8F
|
||||
|
||||
BKSP 0E 8E
|
||||
ESC 01 81
|
||||
CAPS 3A BA
|
||||
L_SHFT 2A AA
|
||||
L_CTRL 1D 9D
|
||||
INSERT E0,52 E0,D2
|
||||
HOME E0,47 E0,97
|
||||
PG_UP E0,49 E0,C9
|
||||
DELETE E0,53 E0,D3
|
||||
END E0,4F E0,CF
|
||||
PG_DN E0,51 E0,D1
|
||||
U_ARROW E0,48 E0,C8
|
||||
L_ARROW E0,4B E0,CB
|
||||
D_ARROW E0,50 E0,D0
|
||||
R_ARROW E0,4D E0,CD
|
||||
L_GUI E0,5B E0,DB
|
||||
L_ALT 38 B8
|
||||
R_SHFT 36 B6
|
||||
R_CTRL E0,1D E0,9D
|
||||
R_GUI E0,5C E0,DC
|
||||
R_ALT E0,38 E0,B8
|
||||
APPS E0,5D E0,DD
|
||||
F1 3B BB
|
||||
F2 3C BC
|
||||
F3 3D BD
|
||||
F4 3E BE
|
||||
F5 3F BF
|
||||
F6 40 C0
|
||||
F7 41 C1
|
||||
F8 42 C2
|
||||
F9 43 C3
|
||||
F10 44 C4
|
||||
F11 57 D7
|
||||
F12 58 D8
|
||||
SCROLL 46 C6
|
||||
KP_2 50 D0
|
||||
KP_3 51 D1
|
||||
KP_4 4B CB
|
||||
KP_5 4C CC
|
||||
KP_6 4D CD
|
||||
KP_7 47 C7
|
||||
KP_8 48 C8
|
||||
KP_9 49 C9
|
||||
NUM 45 C5
|
||||
KP_/ E0,35 E0,B5
|
||||
KP_* 37 B7
|
||||
KP_- 4A CA
|
||||
KP_+ 4E CE
|
||||
KP_EN E0,1C E0,9C
|
||||
KP_. 53 D3
|
||||
KP_0 52 D2
|
||||
KP_1 4F CF
|
||||
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue