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;