add basic script repl

This commit is contained in:
Matthieu Jolimaitre 2024-10-25 01:44:27 +02:00
parent 0d1a12202f
commit a2cca0be4e
15 changed files with 1041 additions and 61 deletions

View file

@ -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
*/