Ultibo API
C/C++ API for Ultibo Core
Loading...
Searching...
No Matches
keyboard.h
Go to the documentation of this file.
1/*
2 * This file is part of the Ultibo project, https://ultibo.org/
3 *
4 * The MIT License (MIT)
5 *
6 * Copyright (c) 2026 Garry Wood <garry@softoz.com.au>
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 * THE SOFTWARE.
25 */
26#ifndef _ULTIBO_KEYBOARD_H
27#define _ULTIBO_KEYBOARD_H
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33#include "ultibo/globaltypes.h"
34#include "ultibo/globalconst.h"
35#include "ultibo/devices.h"
36
38#define KEYBOARD_NAME_PREFIX "Keyboard"
39
41#define KEYBOARD_TYPE_NONE 0
42#define KEYBOARD_TYPE_USB 1
43#define KEYBOARD_TYPE_PS2 2
44#define KEYBOARD_TYPE_SERIAL 3
45
46#define KEYBOARD_TYPE_MAX 3
47
49#define KEYBOARD_STATE_DETACHED 0
50#define KEYBOARD_STATE_DETACHING 1
51#define KEYBOARD_STATE_ATTACHING 2
52#define KEYBOARD_STATE_ATTACHED 3
53
54#define KEYBOARD_STATE_MAX 3
55
57#define KEYBOARD_FLAG_NONE 0x00000000
58#define KEYBOARD_FLAG_NON_BLOCK 0x00000001
59#define KEYBOARD_FLAG_DIRECT_READ 0x00000002
60#define KEYBOARD_FLAG_PEEK_BUFFER 0x00000004
61
62#define KEYBOARD_FLAG_MASK KEYBOARD_FLAG_NON_BLOCK | KEYBOARD_FLAG_DIRECT_READ | KEYBOARD_FLAG_PEEK_BUFFER
63
65#define KEYBOARD_CONTROL_GET_FLAG 1
66#define KEYBOARD_CONTROL_SET_FLAG 2
67#define KEYBOARD_CONTROL_CLEAR_FLAG 3
68#define KEYBOARD_CONTROL_FLUSH_BUFFER 4
69#define KEYBOARD_CONTROL_GET_LED 5
70#define KEYBOARD_CONTROL_SET_LED 6
71#define KEYBOARD_CONTROL_CLEAR_LED 7
72#define KEYBOARD_CONTROL_GET_REPEAT_RATE 8
73#define KEYBOARD_CONTROL_SET_REPEAT_RATE 9
74#define KEYBOARD_CONTROL_GET_REPEAT_DELAY 10
75#define KEYBOARD_CONTROL_SET_REPEAT_DELAY 11
76
78#define KEYBOARD_LED_NONE 0x00000000
79#define KEYBOARD_LED_NUMLOCK 0x00000001
80#define KEYBOARD_LED_CAPSLOCK 0x00000002
81#define KEYBOARD_LED_SCROLLLOCK 0x00000004
82#define KEYBOARD_LED_COMPOSE 0x00000008
83#define KEYBOARD_LED_KANA 0x00000010
84
85#define KEYBOARD_LED_MASK KEYBOARD_LED_NUMLOCK | KEYBOARD_LED_CAPSLOCK | KEYBOARD_LED_SCROLLLOCK | KEYBOARD_LED_COMPOSE | KEYBOARD_LED_KANA
86
88#define KEYBOARD_BUFFER_SIZE 512
89
91#define KEYBOARD_REPEAT_RATE 40
92#define KEYBOARD_REPEAT_DELAY 10
93
95#define KEYBOARD_LEFT_CTRL 0x00000001
96#define KEYBOARD_LEFT_SHIFT 0x00000002
97#define KEYBOARD_LEFT_ALT 0x00000004
98#define KEYBOARD_LEFT_GUI 0x00000008
99#define KEYBOARD_RIGHT_CTRL 0x00000010
100#define KEYBOARD_RIGHT_SHIFT 0x00000020
101#define KEYBOARD_RIGHT_ALT 0x00000040
102#define KEYBOARD_RIGHT_GUI 0x00000080
103#define KEYBOARD_NUM_LOCK 0x00000100
104#define KEYBOARD_CAPS_LOCK 0x00000200
105#define KEYBOARD_SCROLL_LOCK 0x00000400
106#define KEYBOARD_COMPOSE 0x00000800
107#define KEYBOARD_KANA 0x00001000
108#define KEYBOARD_KEYUP 0x00002000
109#define KEYBOARD_KEYDOWN 0x00004000
110#define KEYBOARD_KEYREPEAT 0x00008000
111#define KEYBOARD_DEADKEY 0x00010000
112#define KEYBOARD_ALTGR 0x00020000
113
116
118#define USB_HID_SUBCLASS_NONE 0
119#define USB_HID_SUBCLASS_BOOT 1
120
122#define USB_HID_BOOT_PROTOCOL_NONE 0
123#define USB_HID_BOOT_PROTOCOL_KEYBOARD 1
124#define USB_HID_BOOT_PROTOCOL_MOUSE 2
125
127#define USB_HID_DESCRIPTOR_TYPE_HID 0x21
128#define USB_HID_DESCRIPTOR_TYPE_REPORT 0x22
129#define USB_HID_DESCRIPTOR_TYPE_PHYSICAL_DESCRIPTOR 0x23
130
132#define USB_HID_REQUEST_GET_REPORT 0x01
133#define USB_HID_REQUEST_GET_IDLE 0x02
134#define USB_HID_REQUEST_GET_PROTOCOL 0x03
135#define USB_HID_REQUEST_SET_REPORT 0x09
136#define USB_HID_REQUEST_SET_IDLE 0x0A
137#define USB_HID_REQUEST_SET_PROTOCOL 0x0B
138
140#define USB_HID_PROTOCOL_BOOT 0
141#define USB_HID_PROTOCOL_REPORT 1
142
144#define USB_HID_REPORT_INPUT 1
145#define USB_HID_REPORT_OUTPUT 2
146#define USB_HID_REPORT_FEATURE 3
147
149#define USB_HID_REPORTID_NONE 0
150
152#define USB_HID_BOOT_LEFT_CTRL (1 << 0)
153#define USB_HID_BOOT_LEFT_SHIFT (1 << 1)
154#define USB_HID_BOOT_LEFT_ALT (1 << 2)
155#define USB_HID_BOOT_LEFT_GUI (1 << 3)
156#define USB_HID_BOOT_RIGHT_CTRL (1 << 4)
157#define USB_HID_BOOT_RIGHT_SHIFT (1 << 5)
158#define USB_HID_BOOT_RIGHT_ALT (1 << 6)
159#define USB_HID_BOOT_RIGHT_GUI (1 << 7)
160
162#define USB_HID_BOOT_REPORT_SIZE 8
163
165#define USB_HID_BOOT_NUMLOCK_LED (1 << 0)
166#define USB_HID_BOOT_CAPSLOCK_LED (1 << 1)
167#define USB_HID_BOOT_SCROLLLOCK_LED (1 << 2)
168#define USB_HID_BOOT_COMPOSE_LED (1 << 3)
169#define USB_HID_BOOT_KANA_LED (1 << 4)
170
171#define USB_HID_BOOT_LEDMASK USB_HID_BOOT_NUMLOCK_LED | USB_HID_BOOT_CAPSLOCK_LED | USB_HID_BOOT_SCROLLLOCK_LED | USB_HID_BOOT_COMPOSE_LED | USB_HID_BOOT_KANA_LED
172
174#define USB_HID_BOOT_OUTPUT_SIZE 1
175
176#define USB_HID_BOOT_USAGE_NUMLOCK SCAN_CODE_NUMLOCK
177#define USB_HID_BOOT_USAGE_CAPSLOCK SCAN_CODE_CAPSLOCK
178#define USB_HID_BOOT_USAGE_SCROLLLOCK SCAN_CODE_SCROLLLOCK
179
184{
185 uint32_t modifiers;
186 uint16_t scancode;
187 uint16_t keycode;
188 char charcode;
190};
191
201
204
206typedef uint32_t STDCALL (*keyboard_enumerate_cb)(KEYBOARD_DEVICE *keyboard, void *data);
208typedef uint32_t STDCALL (*keyboard_notification_cb)(DEVICE *device, void *data, uint32_t notification);
209
211typedef uint32_t STDCALL (*keyboard_device_get_proc)(KEYBOARD_DEVICE *keyboard, uint16_t *keycode);
212typedef uint32_t STDCALL (*keyboard_device_read_proc)(KEYBOARD_DEVICE *keyboard, void *buffer, uint32_t size, uint32_t *count);
213typedef uint32_t STDCALL (*keyboard_device_control_proc)(KEYBOARD_DEVICE *keyboard, int request, size_t argument1, size_t *argument2);
214
216{
217 // Device Properties
219 // Keyboard Properties
220 uint32_t keyboardid;
221 uint32_t keyboardstate;
222 uint32_t keyboardleds;
223 uint32_t keyboardrate;
224 uint32_t keyboarddelay;
228 // Driver Properties
230 uint16_t code;
231 uint16_t index;
232 uint32_t modifiers;
234 // Statistics Properties
235 uint32_t receivecount;
238 // Internal Properties
241};
242
245
246#ifndef _ULTIBO_MOUSE_H
250{
251 uint8_t blength;
253 uint16_t bcdhid;
258 // Note: Up to two optional bHIDDescriptorType/wHIDDescriptorLength pairs after the Report descriptor details
260#endif // _ULTIBO_MOUSE_H
261
263
273uint32_t STDCALL keyboard_get(uint16_t *keycode);
274
279uint32_t STDCALL keyboard_peek(void);
280
288uint32_t STDCALL keyboard_read(void *buffer, uint32_t size, uint32_t *count);
289
298uint32_t STDCALL keyboard_read_ex(void *buffer, uint32_t size, uint32_t flags, uint32_t *count);
299
307uint32_t STDCALL keyboard_put(uint16_t scancode, uint16_t keycode, uint32_t modifiers);
308
316uint32_t STDCALL keyboard_write(void *buffer, uint32_t size, uint32_t count);
317
322uint32_t STDCALL keyboard_flush(void);
323
334uint32_t STDCALL keyboard_device_get(KEYBOARD_DEVICE *keyboard, uint16_t *keycode);
335
344uint32_t STDCALL keyboard_device_read(KEYBOARD_DEVICE *keyboard, void *buffer, uint32_t size, uint32_t *count);
345
354uint32_t STDCALL keyboard_device_control(KEYBOARD_DEVICE *keyboard, int request, size_t argument1, size_t *argument2);
355
362uint32_t STDCALL keyboard_device_set_state(KEYBOARD_DEVICE *keyboard, uint32_t state);
363
369
376
383
390
397
404
411
418
426
435uint32_t STDCALL keyboard_device_notification(KEYBOARD_DEVICE *keyboard, keyboard_notification_cb callback, void *data, uint32_t notification, uint32_t flags);
436
438
443
448
449uint32_t STDCALL keyboard_device_type_to_string(uint32_t keyboardtype, char *string, uint32_t len);
450uint32_t STDCALL keyboard_device_state_to_string(uint32_t keyboardstate, char *string, uint32_t len);
451
456
461uint16_t STDCALL keyboard_remap_ctrl_code(uint16_t keycode, uint16_t charcode);
462
469BOOL STDCALL keyboard_remap_key_code(uint16_t scancode, uint16_t keycode, uint8_t *charcode, uint32_t modifiers);
470
477BOOL STDCALL keyboard_remap_scan_code(uint16_t scancode, uint16_t keycode, uint8_t *charcode, uint32_t modifiers);
478
488
489#ifdef __cplusplus
490}
491#endif
492
493#endif // _ULTIBO_KEYBOARD_H
struct _DEVICE DEVICE
Definition devices.h:373
#define STDCALL
Definition globaltypes.h:45
#define PACKED
Definition globaltypes.h:48
_Bool BOOL
Built in Boolean type (1 byte) (Redeclared here for flexibility).
Definition globaltypes.h:55
HANDLE SEMAPHORE_HANDLE
Definition globaltypes.h:107
wchar_t WCHAR
Standard WideChar type (2 bytes) (Redeclared here for flexibility).
Definition globaltypes.h:58
HANDLE MUTEX_HANDLE
Definition globaltypes.h:105
uint32_t STDCALL keyboard_device_enumerate(keyboard_enumerate_cb callback, void *data)
Enumerate all keyboard devices in the keyboard table.
struct _KEYBOARD_DATA KEYBOARD_DATA
Definition keyboard.h:182
uint32_t STDCALL(* keyboard_device_read_proc)(KEYBOARD_DEVICE *keyboard, void *buffer, uint32_t size, uint32_t *count)
Definition keyboard.h:212
uint16_t STDCALL keyboard_remap_ctrl_code(uint16_t keycode, uint16_t charcode)
Remap Ctrl-<Key> combinations to ASCII control codes.
KEYBOARD_DEVICE *STDCALL keyboard_device_find(uint32_t keyboardid)
Find a keyboard device by ID in the keyboard table.
uint32_t STDCALL keyboard_insert_data(KEYBOARD_DEVICE *keyboard, KEYBOARD_DATA *data, BOOL signal)
Insert a TKeyboardData entry into the keyboard buffer (Direct or Global).
uint32_t STDCALL keyboard_read(void *buffer, uint32_t size, uint32_t *count)
Read keyboard data packets from the global keyboard buffer.
KEYBOARD_DEVICE *STDCALL keyboard_device_create_ex(uint32_t size)
Create a new Keyboard device entry.
KEYBOARD_DEVICE *STDCALL keyboard_device_find_by_description(const char *description)
Find a keyboard device by description in the keyboard table.
struct _USB_HID_DESCRIPTOR USB_HID_DESCRIPTOR
Definition keyboard.h:248
uint32_t STDCALL keyboard_device_read(KEYBOARD_DEVICE *keyboard, void *buffer, uint32_t size, uint32_t *count)
Read keyboard data packets from the buffer of the specified keyboard.
uint32_t STDCALL(* keyboard_enumerate_cb)(KEYBOARD_DEVICE *keyboard, void *data)
Definition keyboard.h:206
BOOL STDCALL keyboard_remap_key_code(uint16_t scancode, uint16_t keycode, uint8_t *charcode, uint32_t modifiers)
Remap the SCAN_CODE_* and KEY_CODE_* values to DOS compatible scan codes.
uint32_t STDCALL keyboard_get_count(void)
Get the current keyboard count.
uint32_t STDCALL keyboard_write(void *buffer, uint32_t size, uint32_t count)
Write keyboard data packets to the global keyboard buffer.
uint32_t STDCALL keyboard_put(uint16_t scancode, uint16_t keycode, uint32_t modifiers)
Put a scan code and key code in the global keyboard buffer.
uint32_t STDCALL keyboard_flush(void)
Flush the contents of the global keyboard buffer.
uint32_t STDCALL keyboard_get(uint16_t *keycode)
Get the first key code from the global keyboard buffer.
uint32_t STDCALL(* keyboard_device_control_proc)(KEYBOARD_DEVICE *keyboard, int request, size_t argument1, size_t *argument2)
Definition keyboard.h:213
uint32_t STDCALL keyboard_peek(void)
Peek at the global keyboard buffer to see if any data packets are ready.
#define KEYBOARD_BUFFER_SIZE
Definition keyboard.h:88
uint32_t STDCALL keyboard_device_destroy(KEYBOARD_DEVICE *keyboard)
Destroy an existing Keyboard device entry.
KEYBOARD_DEVICE *STDCALL keyboard_device_check(KEYBOARD_DEVICE *keyboard)
Check if the supplied Keyboard is in the keyboard table.
uint32_t STDCALL keyboard_device_notification(KEYBOARD_DEVICE *keyboard, keyboard_notification_cb callback, void *data, uint32_t notification, uint32_t flags)
Register a notification for keyboard device changes.
uint32_t STDCALL keyboard_read_ex(void *buffer, uint32_t size, uint32_t flags, uint32_t *count)
Read keyboard data packets from the global keyboard buffer.
KEYBOARD_DEVICE *STDCALL keyboard_device_create(void)
Create a new Keyboard device entry.
BOOL STDCALL keyboard_remap_scan_code(uint16_t scancode, uint16_t keycode, uint8_t *charcode, uint32_t modifiers)
Remap the SCAN_CODE_* and KEY_CODE_* values to DOS compatible scan codes.
uint32_t STDCALL(* keyboard_device_get_proc)(KEYBOARD_DEVICE *keyboard, uint16_t *keycode)
Definition keyboard.h:211
uint32_t STDCALL keyboard_device_get(KEYBOARD_DEVICE *keyboard, uint16_t *keycode)
Get the first key code from the buffer of the specified keyboard.
uint32_t STDCALL keyboard_device_type_to_string(uint32_t keyboardtype, char *string, uint32_t len)
struct _KEYBOARD_DEVICE KEYBOARD_DEVICE
Definition keyboard.h:203
uint32_t STDCALL keyboard_device_register(KEYBOARD_DEVICE *keyboard)
Register a new Keyboard device in the Keyboard table.
KEYBOARD_DEVICE *STDCALL keyboard_device_find_by_name(const char *name)
Find a keyboard device by name in the keyboard table.
uint32_t STDCALL keyboard_device_state_to_string(uint32_t keyboardstate, char *string, uint32_t len)
uint32_t STDCALL(* keyboard_notification_cb)(DEVICE *device, void *data, uint32_t notification)
Definition keyboard.h:208
uint32_t STDCALL keyboard_device_state_to_notification(uint32_t state)
Convert a Keyboard state value into the notification code for device notifications.
uint32_t STDCALL keyboard_device_deregister(KEYBOARD_DEVICE *keyboard)
Deregister a Keyboard device from the Keyboard table.
struct _KEYBOARD_BUFFER KEYBOARD_BUFFER
Definition keyboard.h:193
uint32_t STDCALL keyboard_device_set_state(KEYBOARD_DEVICE *keyboard, uint32_t state)
Set the state of the specified keyboard and send a notification.
uint32_t STDCALL keyboard_device_control(KEYBOARD_DEVICE *keyboard, int request, size_t argument1, size_t *argument2)
Perform a control request on the specified keyboard device.
Definition keyboard.h:195
KEYBOARD_DATA buffer[KEYBOARD_BUFFER_SIZE]
Definition keyboard.h:199
uint32_t start
Index of first buffer ready.
Definition keyboard.h:197
uint32_t count
Number of messages ready in buffer.
Definition keyboard.h:198
SEMAPHORE_HANDLE wait
Data ready semaphore.
Definition keyboard.h:196
Definition keyboard.h:184
char charcode
ANSI character representing the translated key code.
Definition keyboard.h:188
uint16_t keycode
Translated key code value from keyboard (See KEY_CODE_* constants).
Definition keyboard.h:187
WCHAR charunicode
Unicode character representing the translated key code.
Definition keyboard.h:189
uint16_t scancode
Untranslated scan code value from keyboard (See SCAN_CODE_* constants).
Definition keyboard.h:186
uint32_t modifiers
Keyboard modifier flags for Shift, Alt, Control etc (eg KEYBOARD_LEFT_CTRL).
Definition keyboard.h:185
Definition keyboard.h:216
uint32_t keyboardleds
Keyboard LEDs (eg KEYBOARD_LED_NUMLOCK).
Definition keyboard.h:222
MUTEX_HANDLE lock
Keyboard lock.
Definition keyboard.h:229
uint32_t keyboardstate
Keyboard state (eg KEYBOARD_STATE_ATTACHED).
Definition keyboard.h:221
keyboard_device_control_proc devicecontrol
A Device specific DeviceControl method implementing a standard Keyboard device interface (Or nil if t...
Definition keyboard.h:227
uint32_t receiveerrors
Definition keyboard.h:236
keyboard_device_get_proc deviceget
A Device specific DeviceGet method implementing a standard Keyboard device interface (Or nil if the d...
Definition keyboard.h:225
KEYBOARD_BUFFER buffer
Keyboard input buffer.
Definition keyboard.h:233
DEVICE device
The Device entry for this Keyboard.
Definition keyboard.h:218
uint32_t receivecount
Definition keyboard.h:235
uint16_t code
Scan code of current deadkey (If Applicable).
Definition keyboard.h:230
uint16_t index
Index state for current deadkey (If Applicable).
Definition keyboard.h:231
KEYBOARD_DEVICE * next
Next entry in Keyboard table.
Definition keyboard.h:240
keyboard_device_read_proc deviceread
A Device specific DeviceRead method implementing a standard Keyboard device interface (Or nil if the ...
Definition keyboard.h:226
KEYBOARD_DEVICE * prev
Previous entry in Keyboard table.
Definition keyboard.h:239
uint32_t keyboardid
Unique Id of this Keyboard in the Keyboard table.
Definition keyboard.h:220
uint32_t keyboarddelay
Keyboard repeat delay (Number of KeyboardRate intervals before first repeat).
Definition keyboard.h:224
uint32_t bufferoverruns
Definition keyboard.h:237
uint32_t keyboardrate
Keyboard repeat rate (Milliseconds).
Definition keyboard.h:223
uint32_t modifiers
Modifier state for current deadkey (If Applicable).
Definition keyboard.h:232
Definition keyboard.h:250
uint16_t whiddescriptorlength
Definition keyboard.h:257
uint8_t bnumdescriptors
Definition keyboard.h:255
uint16_t bcdhid
Definition keyboard.h:253
uint8_t bdescriptortype
Definition keyboard.h:252
uint8_t bhiddescriptortype
Definition keyboard.h:256
uint8_t blength
Definition keyboard.h:251
uint8_t bcountrycode
Definition keyboard.h:254