mirror of
https://github.com/sharkdp/bat
synced 2024-12-26 20:23:06 +00:00
340 lines
6.3 KiB
Ada
340 lines
6.3 KiB
Ada
|
with HAL.GPIO;
|
|||
|
with USB.Device.HID.Keyboard;
|
|||
|
|
|||
|
generic
|
|||
|
Nb_Bounce : Natural;
|
|||
|
type ColR is (<>);
|
|||
|
type RowR is (<>);
|
|||
|
|
|||
|
type GPIOP is new HAL.GPIO.GPIO_Point with private;
|
|||
|
|
|||
|
type Cols_T is array (ColR) of GPIOP;
|
|||
|
type Rows_T is array (RowR) of GPIOP;
|
|||
|
|
|||
|
Cols : Cols_T;
|
|||
|
Rows : Rows_T;
|
|||
|
Num_Layers : Natural;
|
|||
|
|
|||
|
with procedure Log (S : String; L : Integer := 1; Deindent : Integer := 0);
|
|||
|
package Click is
|
|||
|
|
|||
|
type Keys_T is record
|
|||
|
Cols : Cols_T;
|
|||
|
Rows : Rows_T;
|
|||
|
end record;
|
|||
|
|
|||
|
Keys : Keys_T :=
|
|||
|
(Rows => Rows, Cols => Cols);
|
|||
|
|
|||
|
type Key_Matrix is array (ColR, RowR) of Boolean;
|
|||
|
|
|||
|
--------------------------
|
|||
|
-- Events & Debouncing --
|
|||
|
--------------------------
|
|||
|
|
|||
|
MaxEvents : constant Positive := 20;
|
|||
|
|
|||
|
type EventT is (Press, Release);
|
|||
|
type Event is record
|
|||
|
Evt : EventT;
|
|||
|
Col : ColR;
|
|||
|
Row : RowR;
|
|||
|
end record;
|
|||
|
|
|||
|
type Events is array (Natural range <>) of Event;
|
|||
|
|
|||
|
function Get_Events return Events;
|
|||
|
function Update (NewS : Key_Matrix) return Boolean;
|
|||
|
|
|||
|
-------------
|
|||
|
-- Layout --
|
|||
|
-------------
|
|||
|
---------------
|
|||
|
-- Keycodes --
|
|||
|
---------------
|
|||
|
|
|||
|
-- Keycodes copy/pasted from the excelent Keyberon Rust firmware:
|
|||
|
-- https://github.com/TeXitoi/keyberon/
|
|||
|
|
|||
|
type Key_Code_T is
|
|||
|
(
|
|||
|
-- The "no" key, a placeholder to express nothing.
|
|||
|
No, -- = 0x00,
|
|||
|
-- / Error if too much keys are pressed at
|
|||
|
-- the same time.
|
|||
|
ErrorRollOver,
|
|||
|
-- / The POST fail error.
|
|||
|
PostFail,
|
|||
|
-- / An undefined error occured.
|
|||
|
ErrorUndefined,
|
|||
|
-- / `a` and `A`.
|
|||
|
A,
|
|||
|
B,
|
|||
|
C,
|
|||
|
D,
|
|||
|
E,
|
|||
|
F,
|
|||
|
G,
|
|||
|
H,
|
|||
|
I,
|
|||
|
J,
|
|||
|
K,
|
|||
|
L,
|
|||
|
M, -- 0x10
|
|||
|
N,
|
|||
|
O,
|
|||
|
P,
|
|||
|
Q,
|
|||
|
R,
|
|||
|
S,
|
|||
|
T,
|
|||
|
U,
|
|||
|
V,
|
|||
|
W,
|
|||
|
X,
|
|||
|
Y,
|
|||
|
Z,
|
|||
|
-- `1` and `!`.
|
|||
|
Kb1,
|
|||
|
-- `2` and `@`.
|
|||
|
Kb2,
|
|||
|
-- `3` and `#`.
|
|||
|
Kb3, -- 0x20
|
|||
|
-- / `4` and `$`.
|
|||
|
Kb4,
|
|||
|
-- `5` and `%`.
|
|||
|
Kb5,
|
|||
|
-- `6` and `^`.
|
|||
|
Kb6,
|
|||
|
-- `7` and `&`.
|
|||
|
Kb7,
|
|||
|
-- `8` and `*`.
|
|||
|
Kb8,
|
|||
|
-- `9` and `(`.
|
|||
|
Kb9,
|
|||
|
-- `0` and `)`.
|
|||
|
Kb0,
|
|||
|
Enter,
|
|||
|
Escape,
|
|||
|
BSpace,
|
|||
|
Tab,
|
|||
|
Space,
|
|||
|
-- `-` and `_`.
|
|||
|
Minus,
|
|||
|
-- `=` and `+`.
|
|||
|
Equal,
|
|||
|
-- `[` and `{`.
|
|||
|
LBracket,
|
|||
|
-- `]` and `}`.
|
|||
|
RBracket, -- 0x30
|
|||
|
-- / `\` and `|`.
|
|||
|
Bslash,
|
|||
|
-- Non-US `#` and `~` (Typically near the Enter key).
|
|||
|
NonUsHash,
|
|||
|
-- `;` and `:`.
|
|||
|
SColon,
|
|||
|
-- `'` and `"`.
|
|||
|
Quote,
|
|||
|
-- How to have ` as code?
|
|||
|
-- \` and `~`.
|
|||
|
Grave,
|
|||
|
-- `,` and `<`.
|
|||
|
Comma,
|
|||
|
-- `.` and `>`.
|
|||
|
Dot,
|
|||
|
-- `/` and `?`.
|
|||
|
Slash,
|
|||
|
CapsLock,
|
|||
|
F1,
|
|||
|
F2,
|
|||
|
F3,
|
|||
|
F4,
|
|||
|
F5,
|
|||
|
F6,
|
|||
|
F7, -- 0x40
|
|||
|
F8,
|
|||
|
F9,
|
|||
|
F10,
|
|||
|
F11,
|
|||
|
F12,
|
|||
|
PScreen,
|
|||
|
ScrollLock,
|
|||
|
Pause,
|
|||
|
Insert,
|
|||
|
Home,
|
|||
|
PgUp,
|
|||
|
Delete,
|
|||
|
Endd,
|
|||
|
PgDown,
|
|||
|
Right,
|
|||
|
Left, -- 0x50
|
|||
|
Down,
|
|||
|
Up,
|
|||
|
NumLock,
|
|||
|
-- Keypad `/`
|
|||
|
KpSlash,
|
|||
|
-- Keypad `*`
|
|||
|
KpAsterisk,
|
|||
|
-- Keypad `-`.
|
|||
|
KpMinus,
|
|||
|
-- Keypad `+`.
|
|||
|
KpPlus,
|
|||
|
-- Keypad enter.
|
|||
|
KpEnter,
|
|||
|
-- Keypad 1.
|
|||
|
Kp1,
|
|||
|
Kp2,
|
|||
|
Kp3,
|
|||
|
Kp4,
|
|||
|
Kp5,
|
|||
|
Kp6,
|
|||
|
Kp7,
|
|||
|
Kp8, -- 0x60
|
|||
|
Kp9,
|
|||
|
Kp0,
|
|||
|
KpDot,
|
|||
|
-- Non-US `\` and `|` (Typically near the Left-Shift key)
|
|||
|
NonUsBslash,
|
|||
|
Application, -- 0x65
|
|||
|
-- / not a key, used for errors
|
|||
|
Power,
|
|||
|
-- Keypad `=`.
|
|||
|
KpEqual,
|
|||
|
F13,
|
|||
|
F14,
|
|||
|
F15,
|
|||
|
F16,
|
|||
|
F17,
|
|||
|
F18,
|
|||
|
F19,
|
|||
|
F20,
|
|||
|
F21, -- 0x70
|
|||
|
F22,
|
|||
|
F23,
|
|||
|
F24,
|
|||
|
Execute,
|
|||
|
Help,
|
|||
|
Menu,
|
|||
|
Selectt,
|
|||
|
Stop,
|
|||
|
Again,
|
|||
|
Undo,
|
|||
|
Cut,
|
|||
|
Copy,
|
|||
|
Paste,
|
|||
|
Find,
|
|||
|
Mute,
|
|||
|
VolUp, -- 0x80
|
|||
|
VolDown,
|
|||
|
-- Deprecated.
|
|||
|
LockingCapsLock,
|
|||
|
-- Deprecated.
|
|||
|
LockingNumLock,
|
|||
|
-- Deprecated.
|
|||
|
LockingScrollLock,
|
|||
|
-- / Keypad `,`, also used for the
|
|||
|
-- brazilian keypad period (.) key.
|
|||
|
KpComma,
|
|||
|
-- Used on AS/400 keyboard
|
|||
|
KpEqualSign,
|
|||
|
Intl1,
|
|||
|
Intl2,
|
|||
|
Intl3,
|
|||
|
Intl4,
|
|||
|
Intl5,
|
|||
|
Intl6,
|
|||
|
Intl7,
|
|||
|
Intl8,
|
|||
|
Intl9,
|
|||
|
Lang1, -- 0x90
|
|||
|
Lang2,
|
|||
|
Lang3,
|
|||
|
Lang4,
|
|||
|
Lang5,
|
|||
|
Lang6,
|
|||
|
Lang7,
|
|||
|
Lang8,
|
|||
|
Lang9,
|
|||
|
AltErase,
|
|||
|
SysReq,
|
|||
|
Cancel,
|
|||
|
Clear,
|
|||
|
Prior,
|
|||
|
Returnn,
|
|||
|
Separator,
|
|||
|
Outt, -- 0xA0
|
|||
|
Oper,
|
|||
|
ClearAgain,
|
|||
|
CrSel,
|
|||
|
ExSel,
|
|||
|
|
|||
|
-- According to QMK, 0xA5-0xDF are not
|
|||
|
-- usable on modern keyboards
|
|||
|
|
|||
|
-- Modifiers
|
|||
|
-- Left Control.
|
|||
|
LCtrl, -- = 0xE0,
|
|||
|
-- / Left Shift.
|
|||
|
LShift,
|
|||
|
-- Left Alt.
|
|||
|
LAlt,
|
|||
|
-- Left GUI (the Windows key).
|
|||
|
LGui,
|
|||
|
-- Right Control.
|
|||
|
RCtrl,
|
|||
|
-- Right Shift.
|
|||
|
RShift,
|
|||
|
-- Right Alt (or Alt Gr).
|
|||
|
RAlt,
|
|||
|
-- Right GUI (the Windows key).
|
|||
|
RGui, -- 0xE7
|
|||
|
|
|||
|
-- Unofficial
|
|||
|
MediaPlayPause, -- 0xE8,
|
|||
|
MediaStopCD,
|
|||
|
MediaPreviousSong,
|
|||
|
MediaNextSong,
|
|||
|
MediaEjectCD,
|
|||
|
MediaVolUp,
|
|||
|
MediaVolDown,
|
|||
|
MediaMute,
|
|||
|
MediaWWW, -- 0xF0
|
|||
|
MediaBack,
|
|||
|
MediaForward,
|
|||
|
MediaStop,
|
|||
|
MediaFind,
|
|||
|
MediaScrollUp,
|
|||
|
MediaScrollDown,
|
|||
|
MediaEdit,
|
|||
|
MediaSleep,
|
|||
|
MediaCoffee,
|
|||
|
MediaRefresh,
|
|||
|
MediaCalc -- 0xFB
|
|||
|
);
|
|||
|
|
|||
|
type Action_Type is (Key, No_Op, Trans, Layer, Multiple_Actions);
|
|||
|
|
|||
|
-- Should be a discriminated type
|
|||
|
type Action is record
|
|||
|
T : Action_Type; -- hould be the discriminant
|
|||
|
C : Key_Code_T;
|
|||
|
L : Natural;
|
|||
|
end record;
|
|||
|
|
|||
|
function Kw (Code : Key_Code_T) return Action;
|
|||
|
function Lw (V : Natural) return Action;
|
|||
|
|
|||
|
type Key_Modifiers is array (Natural range <>) of USB.Device.HID.Keyboard.Modifiers;
|
|||
|
|
|||
|
type Key_Codes_T is array (Natural range <>) of Key_Code_T;
|
|||
|
|
|||
|
subtype Ac is Action;
|
|||
|
type Layout is array (0 .. Num_Layers - 1, RowR, ColR) of Action;
|
|||
|
procedure Register_Events (L : Layout; Es : Events);
|
|||
|
procedure Tick (L : Layout);
|
|||
|
|
|||
|
function Get_Key_Codes return Key_Codes_T;
|
|||
|
function Get_Modifiers return Key_Modifiers;
|
|||
|
procedure Init;
|
|||
|
end Click;
|