Difference between revisions of "Unit Keyboard"
(38 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
---- | ---- | ||
+ | '''Ultibo Keyboard Interface unit''' | ||
'''Keyboard Devices''' | '''Keyboard Devices''' | ||
− | This unit provides | + | This unit provides the Keyboard device interface and keyboard API to be used by both drivers and applications. |
+ | The API includes functions to create, register, locate, read, write, control and configure each connected keyboard device. | ||
− | + | The API supports a global keyboard buffer so multiple devices can feed data into a common buffer as well as a buffer per device to allow each device to be used for a specific purpose. For example an application with two separate displays may choose to have a keyboard device to control each one individually. | |
− | + | ||
− | + | ||
=== Constants === | === Constants === | ||
---- | ---- | ||
− | '' | + | |
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Keyboard specific constants''' <code> KEYBOARD_NAME_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>KEYBOARD_NAME_PREFIX = 'Keyboard';</code> | ||
+ | | Name prefix for Keyboard Devices | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Keyboard device type''' <code> KEYBOARD_TYPE_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>KEYBOARD_TYPE_NONE = 0;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>KEYBOARD_TYPE_USB = 1;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>KEYBOARD_TYPE_PS2 = 2;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>KEYBOARD_TYPE_SERIAL = 3;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>KEYBOARD_TYPE_MAX = 3;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Keyboard device state''' <code> KEYBOARD_STATE_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>KEYBOARD_STATE_DETACHED = 0;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>KEYBOARD_STATE_DETACHING = 1;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>KEYBOARD_STATE_ATTACHING = 2;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>KEYBOARD_STATE_ATTACHED = 3;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>KEYBOARD_STATE_MAX = 3;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Keyboard device flag''' <code> KEYBOARD_FLAG_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>KEYBOARD_FLAG_NON_BLOCK = $00000001;</code> | ||
+ | | If set device reads are non blocking (Also supported in Flags parameter of KeyboardReadEx) | ||
+ | |- | ||
+ | | <code>KEYBOARD_FLAG_DIRECT_READ = $00000002;</code> | ||
+ | | If set device writes keyboard data to its local buffer which must be read using KeyboardDeviceRead | ||
+ | |- | ||
+ | | <code>KEYBOARD_FLAG_PEEK_BUFFER = $00000004;</code> | ||
+ | | Peek at the buffer to see if any data is available, don't remove it (Used only in Flags parameter of KeyboardReadEx) | ||
+ | |- | ||
+ | | <code>KEYBOARD_FLAG_PEEK_BUFFER = $00000004;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | |colspan="2"|<code>KEYBOARD_FLAG_MASK = KEYBOARD_FLAG_NON_BLOCK or KEYBOARD_FLAG_DIRECT_READ or KEYBOARD_FLAG_PEEK_BUFFER;</code> | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Keyboard device control code''' <code> KEYBOARD_CONTROL_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>KEYBOARD_CONTROL_GET_FLAG = 1;</code> | ||
+ | | Get Flag | ||
+ | |- | ||
+ | | <code> KEYBOARD_CONTROL_SET_FLAG = 2;</code> | ||
+ | | Set Flag | ||
+ | |- | ||
+ | | <code>KEYBOARD_CONTROL_CLEAR_FLAG = 3;</code> | ||
+ | | Clear Flag | ||
+ | |- | ||
+ | | <code>KEYBOARD_CONTROL_FLUSH_BUFFER = 4;</code> | ||
+ | | Flush Buffer | ||
+ | |- | ||
+ | | <code>KEYBOARD_CONTROL_GET_LED = 5;</code> | ||
+ | | Get LED | ||
+ | |- | ||
+ | | <code>KEYBOARD_CONTROL_SET_LED = 6;</code> | ||
+ | | Set LED | ||
+ | |- | ||
+ | | <code>KEYBOARD_CONTROL_CLEAR_LED = 7;</code> | ||
+ | | Clear LED | ||
+ | |- | ||
+ | | <code>KEYBOARD_CONTROL_GET_REPEAT_RATE = 8;</code> | ||
+ | | Get Repeat Rate | ||
+ | |- | ||
+ | | <code>KEYBOARD_CONTROL_SET_REPEAT_RATE = 9;</code> | ||
+ | | Set Repeat Rate | ||
+ | |- | ||
+ | | <code>KEYBOARD_CONTROL_GET_REPEAT_DELAY = 10;</code> | ||
+ | | Get Repeat Delay | ||
+ | |- | ||
+ | | <code>KEYBOARD_CONTROL_SET_REPEAT_DELAY = 11;</code> | ||
+ | | Set Repeat Delay | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Keyboard device LED''' <code> KEYBOARD_LED_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>KEYBOARD_LED_NONE = $00000000;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>KEYBOARD_LED_NUMLOCK = $00000001;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>KEYBOARD_LED_CAPSLOCK = $00000002;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>KEYBOARD_LED_SCROLLLOCK = $00000004;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>KEYBOARD_LED_COMPOSE = $00000008;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>KEYBOARD_LED_KANA = $00000010;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | |colspan="2"|<code>KEYBOARD_LED_MASK = KEYBOARD_LED_NUMLOCK or KEYBOARD_LED_CAPSLOCK or KEYBOARD_LED_SCROLLLOCK or KEYBOARD_LED_COMPOSE or KEYBOARD_LED_KANA;</code> | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Keyboard buffer size''' <code> KEYBOARD_BUFFER_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>KEYBOARD_BUFFER_SIZE = 512;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Keyboard sampling rate''' <code> KEYBOARD_REPEAT_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>KEYBOARD_REPEAT_RATE = 40;</code> | ||
+ | | 40msec -> 25cps | ||
+ | |- | ||
+ | | <code>KEYBOARD_REPEAT_DELAY = 10;</code> | ||
+ | | 10 x KEYBOARD_REPEAT_RATE = 400msec initial delay before repeat | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Keyboard data definition''' <code> KEYBOARD_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Values for TKeyboardData.Modifiers | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>KEYBOARD_LEFT_CTRL = $00000001;</code> | ||
+ | | The Left Control key is pressed | ||
+ | |- | ||
+ | | <code>KEYBOARD_LEFT_SHIFT = $00000002;</code> | ||
+ | | The Left Shift key is pressed | ||
+ | |- | ||
+ | | <code>KEYBOARD_LEFT_ALT = $00000004;</code> | ||
+ | | The Left Alt key is pressed | ||
+ | |- | ||
+ | | <code>KEYBOARD_LEFT_GUI = $00000008;</code> | ||
+ | | The Left GUI (or Windows) key is pressed | ||
+ | |- | ||
+ | | <code>KEYBOARD_RIGHT_CTRL = $00000010;</code> | ||
+ | | The Right Control key is pressed | ||
+ | |- | ||
+ | | <code>KEYBOARD_RIGHT_SHIFT = $00000020;</code> | ||
+ | | The Right Shift key is pressed | ||
+ | |- | ||
+ | | <code>KEYBOARD_RIGHT_ALT = $00000040;</code> | ||
+ | | The Right Alt key is pressed | ||
+ | |- | ||
+ | | <code>KEYBOARD_RIGHT_GUI = $00000080;</code> | ||
+ | | The Right GUI (or Windows) key is pressed | ||
+ | |- | ||
+ | | <code>KEYBOARD_NUM_LOCK = $00000100;</code> | ||
+ | | Num Lock is currently on | ||
+ | |- | ||
+ | | <code>KEYBOARD_CAPS_LOCK = $00000200;</code> | ||
+ | | Caps Lock is currently on | ||
+ | |- | ||
+ | | <code>KEYBOARD_SCROLL_LOCK = $00000400;</code> | ||
+ | | Scroll Lock is currently on | ||
+ | |- | ||
+ | | <code>KEYBOARD_COMPOSE = $00000800;</code> | ||
+ | | Compose is currently on | ||
+ | |- | ||
+ | | <code>KEYBOARD_KANA = $00001000;</code> | ||
+ | | Kana is currently on | ||
+ | |- | ||
+ | | <code>KEYBOARD_KEYUP = $00002000;</code> | ||
+ | | The key state changed to up | ||
+ | |- | ||
+ | | <code>KEYBOARD_KEYDOWN = $00004000;</code> | ||
+ | | The key state changed to down | ||
+ | |- | ||
+ | | <code>KEYBOARD_KEYREPEAT = $00008000;</code> | ||
+ | | The key is being repeated | ||
+ | |- | ||
+ | | <code>KEYBOARD_DEADKEY = $00010000;</code> | ||
+ | | The key is a being handled as a deadkey} | ||
+ | |- | ||
+ | | <code>KEYBOARD_ALTGR = $00020000;</code> | ||
+ | | The AltGr key is pressed (Normally also Right Alt but may be Ctrl-Alt) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Keyboard logging''' <code> KEYBOARD_LOG_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>KEYBOARD_LOG_LEVEL_DEBUG = LOG_LEVEL_DEBUG;</code> | ||
+ | | Keyboard debugging messages | ||
+ | |- | ||
+ | | <code>KEYBOARD_LOG_LEVEL_INFO = LOG_LEVEL_INFO;</code> | ||
+ | | Keyboard informational messages, such as a device being attached or detached | ||
+ | |- | ||
+ | | <code>KEYBOARD_LOG_LEVEL_WARN = LOG_LEVEL_WARN;</code> | ||
+ | | Keyboard warning messages | ||
+ | |- | ||
+ | | <code>KEYBOARD_LOG_LEVEL_ERROR = LOG_LEVEL_ERROR;</code> | ||
+ | | Keyboard error messages | ||
+ | |- | ||
+ | | <code>KEYBOARD_LOG_LEVEL_NONE = LOG_LEVEL_NONE;</code> | ||
+ | | No Keyboard messages | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''USB keyboard specific constants''' <code> USBKEYBOARD_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|Note: The following constants are duplicated with the USBKeyboard unit for backwards compatibility | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''USB HID interface subclass''' <code> USB_HID_SUBCLASS_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|See USB HID v1.11 specification | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>USB_HID_SUBCLASS_NONE = 0;</code> | ||
+ | | Section 4.2 | ||
+ | |- | ||
+ | | <code>USB_HID_SUBCLASS_BOOT = 1;</code> | ||
+ | | Section 4.2 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''USB HID interface protocol''' <code> USB_HID_BOOT_PROTOCOL_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|See USB HID v1.11 specification | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_PROTOCOL_NONE = 0;</code> | ||
+ | | Section 4.3 | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_PROTOCOL_KEYBOARD = 1;</code> | ||
+ | | Section 4.3 | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_PROTOCOL_MOUSE = 2;</code> | ||
+ | | Section 4.3 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''USB HID class descriptor''' <code> USB_HID_DESCRIPTOR_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|See USB HID v1.11 specification | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>USB_HID_DESCRIPTOR_TYPE_HID = $21;</code> | ||
+ | | Section 7.1 | ||
+ | |- | ||
+ | | <code>USB_HID_DESCRIPTOR_TYPE_REPORT = $22;</code> | ||
+ | | Section 7.1 | ||
+ | |- | ||
+ | | <code>USB_HID_DESCRIPTOR_TYPE_PHYSICAL_DESCRIPTOR = $23;</code> | ||
+ | | Section 7.1 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''USB HID request''' <code> USB_HID_REQUEST_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|See USB HID v1.11 specification | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>USB_HID_REQUEST_GET_REPORT = $01;</code> | ||
+ | | Section 7.2 | ||
+ | |- | ||
+ | | <code>USB_HID_REQUEST_GET_IDLE = $02;</code> | ||
+ | | Section 7.2 | ||
+ | |- | ||
+ | | <code>USB_HID_REQUEST_GET_PROTOCOL = $03;</code> | ||
+ | | Section 7.2 | ||
+ | |- | ||
+ | | <code>USB_HID_REQUEST_SET_REPORT = $09;</code> | ||
+ | | Section 7.2 | ||
+ | |- | ||
+ | | <code>USB_HID_REQUEST_SET_IDLE = $0A;</code> | ||
+ | | Section 7.2 | ||
+ | |- | ||
+ | | <code>USB_HID_REQUEST_SET_PROTOCOL = $0B;</code> | ||
+ | | Section 7.2 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''USB HID protocol''' <code> USB_HID_PROTOCOL_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|See USB HID v1.11 specification | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>USB_HID_PROTOCOL_BOOT = 0;</code> | ||
+ | | Section 7.2.5 | ||
+ | |- | ||
+ | | <code>USB_HID_PROTOCOL_REPORT = 1;</code> | ||
+ | | Section 7.2.5 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''USB HID report''' <code> USB_HID_REPORT_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|See USB HID v1.11 specification | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>USB_HID_REPORT_INPUT = 1;</code> | ||
+ | | Section 7.2.1 | ||
+ | |- | ||
+ | | <code>USB_HID_REPORT_OUTPUT = 2;</code> | ||
+ | | Section 7.2.1 | ||
+ | |- | ||
+ | | <code>USB_HID_REPORT_FEATURE = 3;</code> | ||
+ | | Section 7.2.1 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''USB HID report Ids''' <code> USB_HID_REPORTID_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|See USB HID v1.11 specification | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>USB_HID_REPORTID_NONE = 0;</code> | ||
+ | | Section 7.2.1 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''USB HID boot protocol''' <code> USB_HID_BOOT_LEFT_*, USB_HID_BOOT_RIGHT_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_LEFT_CTRL = (1 shl 0);</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_LEFT_SHIFT = (1 shl 1);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_LEFT_ALT = (1 shl 2);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_LEFT_GUI = (1 shl 3);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_RIGHT_CTRL = (1 shl 4);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_RIGHT_SHIFT = (1 shl 5);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_RIGHT_ALT = (1 shl 6);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_RIGHT_GUI = (1 shl 7);</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''USB HID boot protocol report data''' <code> USB_HID_BOOT_REPORT_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_REPORT_SIZE = 8;</code> | ||
+ | | Appendix B of HID Device Class Definition 1.11 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''USB HID boot protocol output''' <code> USB_HID_BOOT_*_LED </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_NUMLOCK_LED = (1 shl 0);</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_CAPSLOCK_LED = (1 shl 1);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_SCROLLLOCK_LED = (1 shl 2);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_COMPOSE_LED = (1 shl 3);</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_KANA_LED = (1 shl 4);</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_LEDMASK = USB_HID_BOOT_NUMLOCK_LED or USB_HID_BOOT_CAPSLOCK_LED or USB_HID_BOOT_SCROLLLOCK_LED or USB_HID_BOOT_COMPOSE_LED or USB_HID_BOOT_KANA_LED;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;"> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''USB HID boot protocol output data''' <code> USB_HID_BOOT_OUTPUT_* </code></div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_OUTPUT_SIZE = 1;</code> | ||
+ | | Appendix B of HID Device Class Definition 1.11 | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_USAGE_NUMLOCK = SCAN_CODE_NUMLOCK;</code> | ||
+ | | 83 | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_USAGE_CAPSLOCK = SCAN_CODE_CAPSLOCK;</code> | ||
+ | | 57 | ||
+ | |- | ||
+ | | <code>USB_HID_BOOT_USAGE_SCROLLLOCK = SCAN_CODE_SCROLLLOCK;</code> | ||
+ | | 71 | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
=== Type definitions === | === Type definitions === | ||
---- | ---- | ||
− | '' | + | |
+ | '''Keyboard data''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PKeyboardData = ^TKeyboardData;</code> | ||
+ | |||
+ | <code>TKeyboardData = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>Modifiers:LongWord;</code> | ||
+ | | Keyboard modifier flags for Shift, Alt, Control etc (eg KEYBOARD_LEFT_CTRL) | ||
+ | |- | ||
+ | | <code>ScanCode:Word;</code> | ||
+ | | Untranslated scan code value from keyboard (See SCAN_CODE_* constants) | ||
+ | |- | ||
+ | | <code>KeyCode:Word;</code> | ||
+ | | Translated key code value from keyboard (See KEY_CODE_* constants) | ||
+ | |- | ||
+ | | <code>CharCode:Char;</code> | ||
+ | | ANSI character representing the translated key code | ||
+ | |- | ||
+ | | <code>CharUnicode:WideChar;</code> | ||
+ | | Unicode character representing the translated key code | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''Keyboard buffer''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PKeyboardBuffer = ^TKeyboardBuffer;</code> | ||
+ | |||
+ | <code>TKeyboardBuffer = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>Wait:TSemaphoreHandle;</code> | ||
+ | | Data ready semaphore | ||
+ | |- | ||
+ | | <code>Start:LongWord;</code> | ||
+ | | Index of first buffer ready | ||
+ | |- | ||
+ | | <code>Count:LongWord;</code> | ||
+ | | Number of messages ready in buffer | ||
+ | |- | ||
+ | | <code>Buffer:array[0..(KEYBOARD_BUFFER_SIZE - 1)] of TKeyboardData;</code> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''Keyboard enumeration callback''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TKeyboardEnumerate = function(Keyboard:PKeyboardDevice; Data:Pointer):LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Keyboard notification callback''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TKeyboardNotification = function(Device:PDevice;Data:Pointer;Notification:LongWord):LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Keyboard device get''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TKeyboardDeviceGet = function(Keyboard:PKeyboardDevice; var KeyCode:Word):LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Keyboard device read''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TKeyboardDeviceRead = function(Keyboard:PKeyboardDevice; Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Keyboard device control''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>TKeyboardDeviceControl = function(Keyboard:PKeyboardDevice; Request:Integer; Argument1:PtrUInt; var Argument2:PtrUInt):LongWord;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | '''Keyboard device''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PKeyboardDevice = ^TKeyboardDevice;</code> | ||
+ | |||
+ | <code>TKeyboardDevice = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''Device Properties'' | ||
+ | |- | ||
+ | | <code>Device:TDevice;</code> | ||
+ | | The Device entry for this Keyboard | ||
+ | |- | ||
+ | |colspan="2"|''Keyboard Properties'' | ||
+ | |- | ||
+ | | <code>KeyboardId:LongWord;</code> | ||
+ | | Unique Id of this Keyboard in the Keyboard table | ||
+ | |- | ||
+ | | <code>KeyboardState:LongWord;</code> | ||
+ | | Keyboard state (eg KEYBOARD_STATE_ATTACHED) | ||
+ | |- | ||
+ | | <code>KeyboardLEDs:LongWord;</code> | ||
+ | | Keyboard LEDs (eg KEYBOARD_LED_NUMLOCK) | ||
+ | |- | ||
+ | | <code>KeyboardRate:LongWord;</code> | ||
+ | | Keyboard repeat rate (Milliseconds) | ||
+ | |- | ||
+ | | <code>KeyboardDelay:LongWord;</code> | ||
+ | | Keyboard repeat delay (Number of KeyboardRate intervals before first repeat) | ||
+ | |- | ||
+ | | <code>DeviceGet:TKeyboardDeviceGet;</code> | ||
+ | | A Device specific DeviceGet method implementing a standard Keyboard device interface (Or nil if the default method is suitable) | ||
+ | |- | ||
+ | | <code>DeviceRead:TKeyboardDeviceRead;</code> | ||
+ | | A Device specific DeviceRead method implementing a standard Keyboard device interface (Or nil if the default method is suitable) | ||
+ | |- | ||
+ | | <code>DeviceControl:TKeyboardDeviceControl;</code> | ||
+ | | A Device specific DeviceControl method implementing a standard Keyboard device interface (Or nil if the default method is suitable) | ||
+ | |- | ||
+ | |colspan="2"|''Driver Properties'' | ||
+ | |- | ||
+ | | <code>Lock:TMutexHandle;</code> | ||
+ | | Keyboard lock | ||
+ | |- | ||
+ | | <code>Code:Word;</code> | ||
+ | | Scan code of current deadkey (If Applicable) | ||
+ | |- | ||
+ | | <code>Index:Word;</code> | ||
+ | | Index state for current deadkey (If Applicable) | ||
+ | |- | ||
+ | | <code>Modifiers:LongWord;</code> | ||
+ | | Modifier state for current deadkey (If Applicable) | ||
+ | |- | ||
+ | | <code>Buffer:TKeyboardBuffer;</code> | ||
+ | | Keyboard input buffer | ||
+ | |- | ||
+ | |colspan="2"|''Statistics Properties'' | ||
+ | |- | ||
+ | | <code>ReceiveCount:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>ReceiveErrors:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>BufferOverruns:LongWord;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''Internal Properties'' | ||
+ | |- | ||
+ | | <code>Prev:PKeyboardDevice;</code> | ||
+ | | Previous entry in Keyboard table | ||
+ | |- | ||
+ | | <code>Next:PKeyboardDevice;</code> | ||
+ | | Next entry in Keyboard table | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''USB HID descriptor''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PUSBHIDDescriptor = ^TUSBHIDDescriptor;</code> | ||
+ | |||
+ | <code>TUSBHIDDescriptor = packed record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | <code>bLength:Byte;</code> | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | | <code>bDescriptorType:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>bcdHID:Word;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>bCountryCode:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>bNumDescriptors:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>bHIDDescriptorType:Byte;</code> | ||
+ | | | ||
+ | |- | ||
+ | | <code>wHIDDescriptorLength:Word;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''Note: Up to two optional bHIDDescriptorType/wHIDDescriptorLength pairs after the Report descriptor details'' | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | '''USB keyboard report''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PUSBKeyboardReport = ^TUSBKeyboardReport;</code> | ||
+ | |||
+ | <code>TUSBKeyboardReport = array[0..7] of Byte;</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | | | ||
+ | | style="width: 50%;"| | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | |||
+ | ''' USB keyboard device''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;"> | ||
+ | <code>PUSBKeyboardDevice = ^TUSBKeyboardDevice;</code> | ||
+ | |||
+ | <code>TUSBKeyboardDevice = record</code> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | |colspan="2"|''Keyboard Properties'' | ||
+ | |- | ||
+ | | <code>Keyboard:TKeyboardDevice;</code> | ||
+ | | | ||
+ | |- | ||
+ | |colspan="2"|''USB Properties'' | ||
+ | |- | ||
+ | | <code>HIDInterface:PUSBInterface;</code> | ||
+ | | USB HID Keyboard Interface | ||
+ | |- | ||
+ | | <code>ReportRequest:PUSBRequest;</code> | ||
+ | | USB request for keyboard report data | ||
+ | |- | ||
+ | | <code>ReportEndpoint:PUSBEndpointDescriptor;</code> | ||
+ | | USB Keyboard Interrupt IN Endpoint | ||
+ | |- | ||
+ | | <code>HIDDescriptor:PUSBHIDDescriptor;</code> | ||
+ | | USB HID Descriptor for keyboard | ||
+ | |- | ||
+ | | <code>ReportDescriptor:Pointer;</code> | ||
+ | | USB HID Report Descriptor for keyboard | ||
+ | |- | ||
+ | | <code>LastCode:Word;</code> | ||
+ | | The scan code of the last key pressed | ||
+ | |- | ||
+ | | <code>LastCount:LongWord;</code> | ||
+ | | The repeat count of the last key pressed | ||
+ | |- | ||
+ | | <code>LastReport:TUSBKeyboardReport;</code> | ||
+ | | The last keyboard report received | ||
+ | |- | ||
+ | | <code>PendingCount:LongWord;</code> | ||
+ | | Number of USB requests pending for this keyboard | ||
+ | |- | ||
+ | | <code>WaiterThread:TThreadId;</code> | ||
+ | | Thread waiting for pending requests to complete (for keyboard detachment) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
=== Public variables === | === Public variables === | ||
---- | ---- | ||
− | '' | + | |
+ | '''Keyboard logging''' | ||
+ | |||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>KEYBOARD_DEFAULT_LOG_LEVEL:LongWord = KEYBOARD_LOG_LEVEL_DEBUG;</code> | ||
+ | | style="width: 40%;"|Minimum level for Keyboard messages. Only messages with level greater than or equal to this will be printed. | ||
+ | |- | ||
+ | |} | ||
+ | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | ||
+ | |- | ||
+ | | <code>KEYBOARD_LOG_ENABLED:Boolean;</code> | ||
+ | | style="width: 40%;"| | ||
+ | |- | ||
+ | |} | ||
+ | <br /> | ||
=== Function declarations === | === Function declarations === | ||
---- | ---- | ||
− | |||
+ | '''Initialization functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure KeyboardInit;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Initialize the keyboard unit and device table</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Called only during system startup | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | '''Keyboard functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardGet(var KeyCode:Word):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Get the first key code from the global keyboard buffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! KeyCode | ||
+ | | The returned key code read from the buffer (eg KEY_CODE_A) | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | ! Note | ||
+ | | Key code is the value translated from the scan code using the current keymap it may not be a character code and it may include non printable characters | ||
+ | To translate a key code to a character call KeymapGetCharCode() | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardPeek:LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Peek at the global keyboard buffer to see if any data packets are ready</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if packets are ready, ERROR_NO_MORE_ITEMS if not or another error code on failure. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardRead(Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord; inline;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Read keyboard data packets from the global keyboard buffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Buffer | ||
+ | | Pointer to a buffer to copy the keyboard data packets to | ||
+ | |- | ||
+ | ! Size | ||
+ | | The size of the buffer in bytes (Must be at least TKeyboardData or greater) | ||
+ | |- | ||
+ | ! Count | ||
+ | | The number of keyboard data packets copied to the buffer | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardReadEx(Buffer:Pointer; Size,Flags:LongWord; var Count:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Read keyboard data packets from the global keyboard buffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Buffer | ||
+ | | Pointer to a buffer to copy the keyboard data packets to | ||
+ | |- | ||
+ | ! Size | ||
+ | | TThe size of the buffer in bytes (Must be at least TKeyboardData or greater) | ||
+ | |- | ||
+ | ! Flags | ||
+ | | The flags to use for the read (eg KEYBOARD_FLAG_NON_BLOCK) | ||
+ | |- | ||
+ | ! Count | ||
+ | | The number of keyboard data packets copied to the buffer | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardPut(ScanCode,KeyCode:Word; Modifiers:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Put a scan code and key code in the global keyboard buffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! ScanCode | ||
+ | | The scan code to write to the buffer (eg SCAN_CODE_A) | ||
+ | |- | ||
+ | ! KeyCode | ||
+ | | The key code to write to the buffer (eg KEY_CODE_A) | ||
+ | |- | ||
+ | ! Modifiers | ||
+ | | The modifier keys to write to the buffer (eg KEYBOARD_LEFT_CTRL) | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardWrite(Buffer:Pointer; Size,Count:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Write keyboard data packets to the global keyboard buffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Buffer | ||
+ | | Pointer to a buffer to copy the keyboard data packets from | ||
+ | |- | ||
+ | ! Size | ||
+ | | The size of the buffer in bytes (Must be at least TKeyboardData or greater) | ||
+ | |- | ||
+ | ! Count | ||
+ | | The number of keyboard data packets to copy from the buffer | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardFlush:LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Flush the contents of the global keyboard buffer</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceGet(Keyboard:PKeyboardDevice; var KeyCode:Word):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Get the first key code from the buffer of the specified keyboard</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Keyboard | ||
+ | | The keyboard device to get from | ||
+ | |- | ||
+ | ! Keycode | ||
+ | | The returned key code read from the buffer (eg KEY_CODE_A) | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | ! Note | ||
+ | | Key code is the value translated from the scan code using the current keymap it may not be a character code and it may include non printable characters | ||
+ | To translate a key code to a character call KeymapGetCharCode() | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceRead(Keyboard:PKeyboardDevice; Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Read keyboard data packets from the buffer of the specified keyboard</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Keyboard | ||
+ | | The keyboard device to read from | ||
+ | |- | ||
+ | ! Buffer | ||
+ | | Pointer to a buffer to copy the keyboard data packets to | ||
+ | |- | ||
+ | ! Size | ||
+ | | The size of the buffer in bytes (Must be at least TKeyboardData or greater) | ||
+ | |- | ||
+ | ! Count | ||
+ | | The number of keyboard data packets copied to the buffer | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceControl(Keyboard:PKeyboardDevice; Request:Integer; Argument1:PtrUInt; var Argument2:PtrUInt):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a control request on the specified keyboard device</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Keyboard | ||
+ | | The keyboard device to control | ||
+ | |- | ||
+ | ! Request | ||
+ | | The request code for the operation (eg KEYBOARD_CONTROL_GET_FLAG) | ||
+ | |- | ||
+ | ! Argument1 | ||
+ | | The first argument for the operation (Dependent on request code) | ||
+ | |- | ||
+ | ! Argument2 | ||
+ | | The second argument for the operation (Dependent on request code) | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceSetState(Keyboard:PKeyboardDevice; State:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Set the state of the specified keyboard and send a notification</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Keyboard | ||
+ | | The keyboard to set the state for | ||
+ | |- | ||
+ | ! State | ||
+ | | The new state to set and notify | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceCreate:PKeyboardDevice;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Create a new Keyboard device entry</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Return | ||
+ | | Pointer to new Keyboard device entry or nil if keyboard could not be created | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceCreateEx(Size:LongWord):PKeyboardDevice;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Create a new Keyboard device entry</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Size | ||
+ | | Size in bytes to allocate for new keyboard (Including the keyboard device entry) | ||
+ | |- | ||
+ | ! Return | ||
+ | | Pointer to new Keyboard device entry or nil if keyboard could not be created | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceDestroy(Keyboard:PKeyboardDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Destroy an existing Keyboard device entry</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Keyboard | ||
+ | | The keyboard device to destroy | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceRegister(Keyboard:PKeyboardDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Register a new Keyboard device in the Keyboard table</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Keyboard | ||
+ | | The keyboard device to register | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceDeregister(Keyboard:PKeyboardDevice):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Deregister a Keyboard device from the Keyboard table</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Keyboard | ||
+ | | The keyboard device to deregister | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceFind(KeyboardId:LongWord):PKeyboardDevice;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Find a keyboard device by ID in the keyboard table</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! KeyboardId | ||
+ | | The ID number of the keyboard to find | ||
+ | |- | ||
+ | ! Return | ||
+ | | Pointer to keyboard device entry or nil if not found | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceFindByName(const Name:String):PKeyboardDevice; inline;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Find a keyboard device by name in the keyboard table</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Name | ||
+ | | The name of the keyboard to find (eg Keyboard0) | ||
+ | |- | ||
+ | ! Return | ||
+ | | Pointer to keyboard device entry or nil if not found | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceFindByDescription(const Description:String):PKeyboardDevice; inline;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Find a keyboard device by description in the keyboard table</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Description | ||
+ | | The description of the keyboard to find (eg USB HID Keyboard) | ||
+ | |- | ||
+ | ! Return | ||
+ | | Pointer to keyboard device entry or nil if not found | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceEnumerate(Callback:TKeyboardEnumerate; Data:Pointer):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Enumerate all keyboard devices in the keyboard table</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Callback | ||
+ | | The callback function to call for each keyboard in the table | ||
+ | |- | ||
+ | ! Data | ||
+ | | A private data pointer to pass to callback for each keyboard in the table | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceNotification(Keyboard:PKeyboardDevice; Callback:TKeyboardNotification; Data:Pointer; Notification,Flags:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Register a notification for keyboard device changes</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Keyboard | ||
+ | | The keyboard device to notify changes for (Optional, pass nil for all keyboards) | ||
+ | |- | ||
+ | ! Callback | ||
+ | | The function to call when a notification event occurs | ||
+ | |- | ||
+ | ! Data | ||
+ | | A private data pointer to pass to callback when a notification event occurs | ||
+ | |- | ||
+ | ! Notification | ||
+ | | The events to register for notification of (eg DEVICE_NOTIFICATION_REGISTER) | ||
+ | |- | ||
+ | ! Flags | ||
+ | | The flags to control the notification (eg NOTIFIER_FLAG_WORKER) | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | '''RTL console functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function SysConsoleGetKey(var ACh:Char; AUserData:Pointer):Boolean;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Handler for Platform ConsoleGetKey function</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function SysConsolePeekKey(var ACh:Char; AUserData:Pointer):Boolean;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Handler for Platform ConsolePeekKey function</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function SysConsoleReadChar(var ACh:Char; AUserData:Pointer):Boolean;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Handler for Platform ConsoleReadChar function</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function SysConsoleReadWideChar(var ACh:WideChar; AUserData:Pointer):Boolean;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Handler for Platform ConsoleReadWideChar function</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | '''Keyboard helper functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardGetCount:LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Get the current keyboard count</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceCheck(Keyboard:PKeyboardDevice):PKeyboardDevice;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Check if the supplied Keyboard is in the keyboard table</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceTypeToString(KeyboardType:LongWord):String;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceStateToString(KeyboardState:LongWord):String;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardDeviceStateToNotification(State:LongWord):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Convert a Keyboard state value into the notification code for device notifications</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardRemapCtrlCode(KeyCode,CharCode:Word):Word;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Remap Ctrl-<Key> combinations to ASCII control codes</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | Caller must check for Left-Ctrl or Right-Ctrl modifiers | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardRemapKeyCode(ScanCode,KeyCode:Word; var CharCode:Byte; Modifiers:LongWord):Boolean;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Remap the SCAN_CODE_* and KEY_CODE_* values to DOS compatible scan codes</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Return | ||
+ | | Returns True if the key was remapped, False if it was not. | ||
+ | |- | ||
+ | ! See | ||
+ | | http://www.freepascal.org/docs-html/rtl/keyboard/kbdscancode.html | ||
+ | See also: \source\packages\rtl-console\src\inc\keyscan.inc | ||
+ | |- | ||
+ | ! Note | ||
+ | | See below for a version that uses SCAN_CODE_* values instead of translated KEY_CODE_* values | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardRemapScanCode(ScanCode,KeyCode:Word; var CharCode:Byte; Modifiers:LongWord):Boolean;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Remap the SCAN_CODE_* and KEY_CODE_* values to DOS compatible scan codes</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Return | ||
+ | | Returns True if the key was remapped, False if it was not | ||
+ | |- | ||
+ | ! See | ||
+ | | http://www.freepascal.org/docs-html/rtl/keyboard/kbdscancode.html | ||
+ | See also: \source\packages\rtl-console\src\inc\keyscan.inc | ||
+ | |- | ||
+ | ! Note | ||
+ | | Same as above except using SCAN_CODE_* values instead of translated KEY_CODE_* values | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function KeyboardInsertData(Keyboard:PKeyboardDevice; Data:PKeyboardData; Signal:Boolean):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Insert a TKeyboardData entry into the keyboard buffer (Direct or Global)</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Keyboard | ||
+ | | The keyboard device to insert data for | ||
+ | |- | ||
+ | ! Data | ||
+ | | The TKeyboardData entry to insert | ||
+ | |- | ||
+ | ! Signal | ||
+ | | If True then signal that new data is available in the buffer | ||
+ | |- | ||
+ | ! Return | ||
+ | | ERROR_SUCCESS if completed or another error code on failure | ||
+ | |- | ||
+ | ! Note | ||
+ | | Caller must hold the keyboard lock | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure KeyboardLog(Level:LongWord; Keyboard:PKeyboardDevice; const AText:String);</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure KeyboardLogInfo(Keyboard:PKeyboardDevice; const AText:String); inline;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure KeyboardLogWarn(Keyboard:PKeyboardDevice; const AText:String); inline;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure KeyboardLogError(Keyboard:PKeyboardDevice; const AText:String); inline;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure KeyboardLogDebug(Keyboard:PKeyboardDevice; const AText:String); inline;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! Note | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
Return to [[Unit_Reference|Unit Reference]] | Return to [[Unit_Reference|Unit Reference]] |
Latest revision as of 04:48, 10 October 2023
Return to Unit Reference
Description
Ultibo Keyboard Interface unit
Keyboard Devices
This unit provides the Keyboard device interface and keyboard API to be used by both drivers and applications.
The API includes functions to create, register, locate, read, write, control and configure each connected keyboard device.
The API supports a global keyboard buffer so multiple devices can feed data into a common buffer as well as a buffer per device to allow each device to be used for a specific purpose. For example an application with two separate displays may choose to have a keyboard device to control each one individually.
Constants
KEYBOARD_NAME_*
KEYBOARD_NAME_PREFIX = 'Keyboard';
|
Name prefix for Keyboard Devices |
KEYBOARD_TYPE_*
KEYBOARD_TYPE_NONE = 0;
|
|
KEYBOARD_TYPE_USB = 1;
|
|
KEYBOARD_TYPE_PS2 = 2;
|
|
KEYBOARD_TYPE_SERIAL = 3;
|
|
KEYBOARD_TYPE_MAX = 3;
|
KEYBOARD_STATE_*
KEYBOARD_STATE_DETACHED = 0;
|
|
KEYBOARD_STATE_DETACHING = 1;
|
|
KEYBOARD_STATE_ATTACHING = 2;
|
|
KEYBOARD_STATE_ATTACHED = 3;
|
|
KEYBOARD_STATE_MAX = 3;
|
KEYBOARD_FLAG_*
KEYBOARD_FLAG_NON_BLOCK = $00000001;
|
If set device reads are non blocking (Also supported in Flags parameter of KeyboardReadEx) |
KEYBOARD_FLAG_DIRECT_READ = $00000002;
|
If set device writes keyboard data to its local buffer which must be read using KeyboardDeviceRead |
KEYBOARD_FLAG_PEEK_BUFFER = $00000004;
|
Peek at the buffer to see if any data is available, don't remove it (Used only in Flags parameter of KeyboardReadEx) |
KEYBOARD_FLAG_PEEK_BUFFER = $00000004;
|
|
KEYBOARD_FLAG_MASK = KEYBOARD_FLAG_NON_BLOCK or KEYBOARD_FLAG_DIRECT_READ or KEYBOARD_FLAG_PEEK_BUFFER;
|
KEYBOARD_CONTROL_*
KEYBOARD_CONTROL_GET_FLAG = 1;
|
Get Flag |
KEYBOARD_CONTROL_SET_FLAG = 2;
|
Set Flag |
KEYBOARD_CONTROL_CLEAR_FLAG = 3;
|
Clear Flag |
KEYBOARD_CONTROL_FLUSH_BUFFER = 4;
|
Flush Buffer |
KEYBOARD_CONTROL_GET_LED = 5;
|
Get LED |
KEYBOARD_CONTROL_SET_LED = 6;
|
Set LED |
KEYBOARD_CONTROL_CLEAR_LED = 7;
|
Clear LED |
KEYBOARD_CONTROL_GET_REPEAT_RATE = 8;
|
Get Repeat Rate |
KEYBOARD_CONTROL_SET_REPEAT_RATE = 9;
|
Set Repeat Rate |
KEYBOARD_CONTROL_GET_REPEAT_DELAY = 10;
|
Get Repeat Delay |
KEYBOARD_CONTROL_SET_REPEAT_DELAY = 11;
|
Set Repeat Delay |
KEYBOARD_LED_*
KEYBOARD_LED_NONE = $00000000;
|
|
KEYBOARD_LED_NUMLOCK = $00000001;
|
|
KEYBOARD_LED_CAPSLOCK = $00000002;
|
|
KEYBOARD_LED_SCROLLLOCK = $00000004;
|
|
KEYBOARD_LED_COMPOSE = $00000008;
|
|
KEYBOARD_LED_KANA = $00000010;
|
|
KEYBOARD_LED_MASK = KEYBOARD_LED_NUMLOCK or KEYBOARD_LED_CAPSLOCK or KEYBOARD_LED_SCROLLLOCK or KEYBOARD_LED_COMPOSE or KEYBOARD_LED_KANA;
|
KEYBOARD_BUFFER_*
KEYBOARD_BUFFER_SIZE = 512;
|
KEYBOARD_REPEAT_*
KEYBOARD_REPEAT_RATE = 40;
|
40msec -> 25cps |
KEYBOARD_REPEAT_DELAY = 10;
|
10 x KEYBOARD_REPEAT_RATE = 400msec initial delay before repeat |
KEYBOARD_*
Values for TKeyboardData.Modifiers | |
KEYBOARD_LEFT_CTRL = $00000001;
|
The Left Control key is pressed |
KEYBOARD_LEFT_SHIFT = $00000002;
|
The Left Shift key is pressed |
KEYBOARD_LEFT_ALT = $00000004;
|
The Left Alt key is pressed |
KEYBOARD_LEFT_GUI = $00000008;
|
The Left GUI (or Windows) key is pressed |
KEYBOARD_RIGHT_CTRL = $00000010;
|
The Right Control key is pressed |
KEYBOARD_RIGHT_SHIFT = $00000020;
|
The Right Shift key is pressed |
KEYBOARD_RIGHT_ALT = $00000040;
|
The Right Alt key is pressed |
KEYBOARD_RIGHT_GUI = $00000080;
|
The Right GUI (or Windows) key is pressed |
KEYBOARD_NUM_LOCK = $00000100;
|
Num Lock is currently on |
KEYBOARD_CAPS_LOCK = $00000200;
|
Caps Lock is currently on |
KEYBOARD_SCROLL_LOCK = $00000400;
|
Scroll Lock is currently on |
KEYBOARD_COMPOSE = $00000800;
|
Compose is currently on |
KEYBOARD_KANA = $00001000;
|
Kana is currently on |
KEYBOARD_KEYUP = $00002000;
|
The key state changed to up |
KEYBOARD_KEYDOWN = $00004000;
|
The key state changed to down |
KEYBOARD_KEYREPEAT = $00008000;
|
The key is being repeated |
KEYBOARD_DEADKEY = $00010000;
|
The key is a being handled as a deadkey} |
KEYBOARD_ALTGR = $00020000;
|
The AltGr key is pressed (Normally also Right Alt but may be Ctrl-Alt) |
KEYBOARD_LOG_*
KEYBOARD_LOG_LEVEL_DEBUG = LOG_LEVEL_DEBUG;
|
Keyboard debugging messages |
KEYBOARD_LOG_LEVEL_INFO = LOG_LEVEL_INFO;
|
Keyboard informational messages, such as a device being attached or detached |
KEYBOARD_LOG_LEVEL_WARN = LOG_LEVEL_WARN;
|
Keyboard warning messages |
KEYBOARD_LOG_LEVEL_ERROR = LOG_LEVEL_ERROR;
|
Keyboard error messages |
KEYBOARD_LOG_LEVEL_NONE = LOG_LEVEL_NONE;
|
No Keyboard messages |
USBKEYBOARD_*
Note: The following constants are duplicated with the USBKeyboard unit for backwards compatibility |
USB_HID_SUBCLASS_*
See USB HID v1.11 specification | |
USB_HID_SUBCLASS_NONE = 0;
|
Section 4.2 |
USB_HID_SUBCLASS_BOOT = 1;
|
Section 4.2 |
USB_HID_BOOT_PROTOCOL_*
See USB HID v1.11 specification | |
USB_HID_BOOT_PROTOCOL_NONE = 0;
|
Section 4.3 |
USB_HID_BOOT_PROTOCOL_KEYBOARD = 1;
|
Section 4.3 |
USB_HID_BOOT_PROTOCOL_MOUSE = 2;
|
Section 4.3 |
USB_HID_DESCRIPTOR_*
See USB HID v1.11 specification | |
USB_HID_DESCRIPTOR_TYPE_HID = $21;
|
Section 7.1 |
USB_HID_DESCRIPTOR_TYPE_REPORT = $22;
|
Section 7.1 |
USB_HID_DESCRIPTOR_TYPE_PHYSICAL_DESCRIPTOR = $23;
|
Section 7.1 |
USB_HID_REQUEST_*
See USB HID v1.11 specification | |
USB_HID_REQUEST_GET_REPORT = $01;
|
Section 7.2 |
USB_HID_REQUEST_GET_IDLE = $02;
|
Section 7.2 |
USB_HID_REQUEST_GET_PROTOCOL = $03;
|
Section 7.2 |
USB_HID_REQUEST_SET_REPORT = $09;
|
Section 7.2 |
USB_HID_REQUEST_SET_IDLE = $0A;
|
Section 7.2 |
USB_HID_REQUEST_SET_PROTOCOL = $0B;
|
Section 7.2 |
USB_HID_PROTOCOL_*
See USB HID v1.11 specification | |
USB_HID_PROTOCOL_BOOT = 0;
|
Section 7.2.5 |
USB_HID_PROTOCOL_REPORT = 1;
|
Section 7.2.5 |
USB_HID_REPORT_*
See USB HID v1.11 specification | |
USB_HID_REPORT_INPUT = 1;
|
Section 7.2.1 |
USB_HID_REPORT_OUTPUT = 2;
|
Section 7.2.1 |
USB_HID_REPORT_FEATURE = 3;
|
Section 7.2.1 |
USB_HID_REPORTID_*
See USB HID v1.11 specification | |
USB_HID_REPORTID_NONE = 0;
|
Section 7.2.1 |
USB_HID_BOOT_LEFT_*, USB_HID_BOOT_RIGHT_*
USB_HID_BOOT_LEFT_CTRL = (1 shl 0);
|
|
USB_HID_BOOT_LEFT_SHIFT = (1 shl 1);
|
|
USB_HID_BOOT_LEFT_ALT = (1 shl 2);
|
|
USB_HID_BOOT_LEFT_GUI = (1 shl 3);
|
|
USB_HID_BOOT_RIGHT_CTRL = (1 shl 4);
|
|
USB_HID_BOOT_RIGHT_SHIFT = (1 shl 5);
|
|
USB_HID_BOOT_RIGHT_ALT = (1 shl 6);
|
|
USB_HID_BOOT_RIGHT_GUI = (1 shl 7);
|
USB_HID_BOOT_REPORT_*
USB_HID_BOOT_REPORT_SIZE = 8;
|
Appendix B of HID Device Class Definition 1.11 |
USB_HID_BOOT_*_LED
USB_HID_BOOT_NUMLOCK_LED = (1 shl 0);
|
|
USB_HID_BOOT_CAPSLOCK_LED = (1 shl 1);
|
|
USB_HID_BOOT_SCROLLLOCK_LED = (1 shl 2);
|
|
USB_HID_BOOT_COMPOSE_LED = (1 shl 3);
|
|
USB_HID_BOOT_KANA_LED = (1 shl 4);
|
|
USB_HID_BOOT_LEDMASK = USB_HID_BOOT_NUMLOCK_LED or USB_HID_BOOT_CAPSLOCK_LED or USB_HID_BOOT_SCROLLLOCK_LED or USB_HID_BOOT_COMPOSE_LED or USB_HID_BOOT_KANA_LED;
|
USB_HID_BOOT_OUTPUT_*
USB_HID_BOOT_OUTPUT_SIZE = 1;
|
Appendix B of HID Device Class Definition 1.11 |
USB_HID_BOOT_USAGE_NUMLOCK = SCAN_CODE_NUMLOCK;
|
83 |
USB_HID_BOOT_USAGE_CAPSLOCK = SCAN_CODE_CAPSLOCK;
|
57 |
USB_HID_BOOT_USAGE_SCROLLLOCK = SCAN_CODE_SCROLLLOCK;
|
71 |
Type definitions
Keyboard data
PKeyboardData = ^TKeyboardData;
TKeyboardData = record
Modifiers:LongWord;
|
Keyboard modifier flags for Shift, Alt, Control etc (eg KEYBOARD_LEFT_CTRL) |
ScanCode:Word;
|
Untranslated scan code value from keyboard (See SCAN_CODE_* constants) |
KeyCode:Word;
|
Translated key code value from keyboard (See KEY_CODE_* constants) |
CharCode:Char;
|
ANSI character representing the translated key code |
CharUnicode:WideChar;
|
Unicode character representing the translated key code |
Keyboard buffer
PKeyboardBuffer = ^TKeyboardBuffer;
TKeyboardBuffer = record
Wait:TSemaphoreHandle;
|
Data ready semaphore |
Start:LongWord;
|
Index of first buffer ready |
Count:LongWord;
|
Number of messages ready in buffer |
Buffer:array[0..(KEYBOARD_BUFFER_SIZE - 1)] of TKeyboardData;
|
Keyboard enumeration callback
TKeyboardEnumerate = function(Keyboard:PKeyboardDevice; Data:Pointer):LongWord;
|
Keyboard notification callback
TKeyboardNotification = function(Device:PDevice;Data:Pointer;Notification:LongWord):LongWord;
|
Keyboard device get
TKeyboardDeviceGet = function(Keyboard:PKeyboardDevice; var KeyCode:Word):LongWord;
|
Keyboard device read
TKeyboardDeviceRead = function(Keyboard:PKeyboardDevice; Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;
|
Keyboard device control
TKeyboardDeviceControl = function(Keyboard:PKeyboardDevice; Request:Integer; Argument1:PtrUInt; var Argument2:PtrUInt):LongWord;
|
Keyboard device
PKeyboardDevice = ^TKeyboardDevice;
TKeyboardDevice = record
Device Properties | |
Device:TDevice;
|
The Device entry for this Keyboard |
Keyboard Properties | |
KeyboardId:LongWord;
|
Unique Id of this Keyboard in the Keyboard table |
KeyboardState:LongWord;
|
Keyboard state (eg KEYBOARD_STATE_ATTACHED) |
KeyboardLEDs:LongWord;
|
Keyboard LEDs (eg KEYBOARD_LED_NUMLOCK) |
KeyboardRate:LongWord;
|
Keyboard repeat rate (Milliseconds) |
KeyboardDelay:LongWord;
|
Keyboard repeat delay (Number of KeyboardRate intervals before first repeat) |
DeviceGet:TKeyboardDeviceGet;
|
A Device specific DeviceGet method implementing a standard Keyboard device interface (Or nil if the default method is suitable) |
DeviceRead:TKeyboardDeviceRead;
|
A Device specific DeviceRead method implementing a standard Keyboard device interface (Or nil if the default method is suitable) |
DeviceControl:TKeyboardDeviceControl;
|
A Device specific DeviceControl method implementing a standard Keyboard device interface (Or nil if the default method is suitable) |
Driver Properties | |
Lock:TMutexHandle;
|
Keyboard lock |
Code:Word;
|
Scan code of current deadkey (If Applicable) |
Index:Word;
|
Index state for current deadkey (If Applicable) |
Modifiers:LongWord;
|
Modifier state for current deadkey (If Applicable) |
Buffer:TKeyboardBuffer;
|
Keyboard input buffer |
Statistics Properties | |
ReceiveCount:LongWord;
|
|
ReceiveErrors:LongWord;
|
|
BufferOverruns:LongWord;
|
|
Internal Properties | |
Prev:PKeyboardDevice;
|
Previous entry in Keyboard table |
Next:PKeyboardDevice;
|
Next entry in Keyboard table |
USB HID descriptor
PUSBHIDDescriptor = ^TUSBHIDDescriptor;
TUSBHIDDescriptor = packed record
bLength:Byte;
|
|
bDescriptorType:Byte;
|
|
bcdHID:Word;
|
|
bCountryCode:Byte;
|
|
bNumDescriptors:Byte;
|
|
bHIDDescriptorType:Byte;
|
|
wHIDDescriptorLength:Word;
|
|
Note: Up to two optional bHIDDescriptorType/wHIDDescriptorLength pairs after the Report descriptor details |
USB keyboard report
PUSBKeyboardReport = ^TUSBKeyboardReport;
TUSBKeyboardReport = array[0..7] of Byte;
USB keyboard device
PUSBKeyboardDevice = ^TUSBKeyboardDevice;
TUSBKeyboardDevice = record
Keyboard Properties | |
Keyboard:TKeyboardDevice;
|
|
USB Properties | |
HIDInterface:PUSBInterface;
|
USB HID Keyboard Interface |
ReportRequest:PUSBRequest;
|
USB request for keyboard report data |
ReportEndpoint:PUSBEndpointDescriptor;
|
USB Keyboard Interrupt IN Endpoint |
HIDDescriptor:PUSBHIDDescriptor;
|
USB HID Descriptor for keyboard |
ReportDescriptor:Pointer;
|
USB HID Report Descriptor for keyboard |
LastCode:Word;
|
The scan code of the last key pressed |
LastCount:LongWord;
|
The repeat count of the last key pressed |
LastReport:TUSBKeyboardReport;
|
The last keyboard report received |
PendingCount:LongWord;
|
Number of USB requests pending for this keyboard |
WaiterThread:TThreadId;
|
Thread waiting for pending requests to complete (for keyboard detachment) |
Public variables
Keyboard logging
KEYBOARD_DEFAULT_LOG_LEVEL:LongWord = KEYBOARD_LOG_LEVEL_DEBUG;
|
Minimum level for Keyboard messages. Only messages with level greater than or equal to this will be printed. |
KEYBOARD_LOG_ENABLED:Boolean;
|
Function declarations
Initialization functions
procedure KeyboardInit;
Note | Called only during system startup |
---|
Keyboard functions
function KeyboardGet(var KeyCode:Word):LongWord;
KeyCode | The returned key code read from the buffer (eg KEY_CODE_A) |
---|---|
Return | ERROR_SUCCESS if completed or another error code on failure |
Note | Key code is the value translated from the scan code using the current keymap it may not be a character code and it may include non printable characters
To translate a key code to a character call KeymapGetCharCode() |
function KeyboardPeek:LongWord;
Return | ERROR_SUCCESS if packets are ready, ERROR_NO_MORE_ITEMS if not or another error code on failure. |
---|
function KeyboardRead(Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord; inline;
Buffer | Pointer to a buffer to copy the keyboard data packets to |
---|---|
Size | The size of the buffer in bytes (Must be at least TKeyboardData or greater) |
Count | The number of keyboard data packets copied to the buffer |
Return | ERROR_SUCCESS if completed or another error code on failure |
function KeyboardReadEx(Buffer:Pointer; Size,Flags:LongWord; var Count:LongWord):LongWord;
Buffer | Pointer to a buffer to copy the keyboard data packets to |
---|---|
Size | TThe size of the buffer in bytes (Must be at least TKeyboardData or greater) |
Flags | The flags to use for the read (eg KEYBOARD_FLAG_NON_BLOCK) |
Count | The number of keyboard data packets copied to the buffer |
Return | ERROR_SUCCESS if completed or another error code on failure |
function KeyboardPut(ScanCode,KeyCode:Word; Modifiers:LongWord):LongWord;
ScanCode | The scan code to write to the buffer (eg SCAN_CODE_A) |
---|---|
KeyCode | The key code to write to the buffer (eg KEY_CODE_A) |
Modifiers | The modifier keys to write to the buffer (eg KEYBOARD_LEFT_CTRL) |
Return | ERROR_SUCCESS if completed or another error code on failure |
function KeyboardWrite(Buffer:Pointer; Size,Count:LongWord):LongWord;
Buffer | Pointer to a buffer to copy the keyboard data packets from |
---|---|
Size | The size of the buffer in bytes (Must be at least TKeyboardData or greater) |
Count | The number of keyboard data packets to copy from the buffer |
Return | ERROR_SUCCESS if completed or another error code on failure |
function KeyboardFlush:LongWord;
Return | ERROR_SUCCESS if completed or another error code on failure |
---|
function KeyboardDeviceGet(Keyboard:PKeyboardDevice; var KeyCode:Word):LongWord;
Keyboard | The keyboard device to get from |
---|---|
Keycode | The returned key code read from the buffer (eg KEY_CODE_A) |
Return | ERROR_SUCCESS if completed or another error code on failure |
Note | Key code is the value translated from the scan code using the current keymap it may not be a character code and it may include non printable characters
To translate a key code to a character call KeymapGetCharCode() |
function KeyboardDeviceRead(Keyboard:PKeyboardDevice; Buffer:Pointer; Size:LongWord; var Count:LongWord):LongWord;
Keyboard | The keyboard device to read from |
---|---|
Buffer | Pointer to a buffer to copy the keyboard data packets to |
Size | The size of the buffer in bytes (Must be at least TKeyboardData or greater) |
Count | The number of keyboard data packets copied to the buffer |
Return | ERROR_SUCCESS if completed or another error code on failure |
function KeyboardDeviceControl(Keyboard:PKeyboardDevice; Request:Integer; Argument1:PtrUInt; var Argument2:PtrUInt):LongWord;
Keyboard | The keyboard device to control |
---|---|
Request | The request code for the operation (eg KEYBOARD_CONTROL_GET_FLAG) |
Argument1 | The first argument for the operation (Dependent on request code) |
Argument2 | The second argument for the operation (Dependent on request code) |
Return | ERROR_SUCCESS if completed or another error code on failure |
function KeyboardDeviceSetState(Keyboard:PKeyboardDevice; State:LongWord):LongWord;
Keyboard | The keyboard to set the state for |
---|---|
State | The new state to set and notify |
Return | ERROR_SUCCESS if completed or another error code on failure |
function KeyboardDeviceCreate:PKeyboardDevice;
Return | Pointer to new Keyboard device entry or nil if keyboard could not be created |
---|
function KeyboardDeviceCreateEx(Size:LongWord):PKeyboardDevice;
Size | Size in bytes to allocate for new keyboard (Including the keyboard device entry) |
---|---|
Return | Pointer to new Keyboard device entry or nil if keyboard could not be created |
function KeyboardDeviceDestroy(Keyboard:PKeyboardDevice):LongWord;
Keyboard | The keyboard device to destroy |
---|---|
Return | ERROR_SUCCESS if completed or another error code on failure |
function KeyboardDeviceRegister(Keyboard:PKeyboardDevice):LongWord;
Keyboard | The keyboard device to register |
---|---|
Return | ERROR_SUCCESS if completed or another error code on failure |
function KeyboardDeviceDeregister(Keyboard:PKeyboardDevice):LongWord;
Keyboard | The keyboard device to deregister |
---|---|
Return | ERROR_SUCCESS if completed or another error code on failure |
function KeyboardDeviceFind(KeyboardId:LongWord):PKeyboardDevice;
KeyboardId | The ID number of the keyboard to find |
---|---|
Return | Pointer to keyboard device entry or nil if not found |
function KeyboardDeviceFindByName(const Name:String):PKeyboardDevice; inline;
Name | The name of the keyboard to find (eg Keyboard0) |
---|---|
Return | Pointer to keyboard device entry or nil if not found |
function KeyboardDeviceFindByDescription(const Description:String):PKeyboardDevice; inline;
Description | The description of the keyboard to find (eg USB HID Keyboard) |
---|---|
Return | Pointer to keyboard device entry or nil if not found |
function KeyboardDeviceEnumerate(Callback:TKeyboardEnumerate; Data:Pointer):LongWord;
Callback | The callback function to call for each keyboard in the table |
---|---|
Data | A private data pointer to pass to callback for each keyboard in the table |
Return | ERROR_SUCCESS if completed or another error code on failure |
function KeyboardDeviceNotification(Keyboard:PKeyboardDevice; Callback:TKeyboardNotification; Data:Pointer; Notification,Flags:LongWord):LongWord;
Keyboard | The keyboard device to notify changes for (Optional, pass nil for all keyboards) |
---|---|
Callback | The function to call when a notification event occurs |
Data | A private data pointer to pass to callback when a notification event occurs |
Notification | The events to register for notification of (eg DEVICE_NOTIFICATION_REGISTER) |
Flags | The flags to control the notification (eg NOTIFIER_FLAG_WORKER) |
RTL console functions
function SysConsoleGetKey(var ACh:Char; AUserData:Pointer):Boolean;
Note | None documented |
---|
function SysConsolePeekKey(var ACh:Char; AUserData:Pointer):Boolean;
Note | None documented |
---|
function SysConsoleReadChar(var ACh:Char; AUserData:Pointer):Boolean;
Note | None documented |
---|
function SysConsoleReadWideChar(var ACh:WideChar; AUserData:Pointer):Boolean;
Note | None documented |
---|
Keyboard helper functions
function KeyboardGetCount:LongWord;
Note | None documented |
---|
function KeyboardDeviceCheck(Keyboard:PKeyboardDevice):PKeyboardDevice;
Note | None documented |
---|
function KeyboardDeviceTypeToString(KeyboardType:LongWord):String;
Note | None documented |
---|
function KeyboardDeviceStateToString(KeyboardState:LongWord):String;
Note | None documented |
---|
function KeyboardDeviceStateToNotification(State:LongWord):LongWord;
Note | None documented |
---|
function KeyboardRemapCtrlCode(KeyCode,CharCode:Word):Word;
Note | Caller must check for Left-Ctrl or Right-Ctrl modifiers |
---|
function KeyboardRemapKeyCode(ScanCode,KeyCode:Word; var CharCode:Byte; Modifiers:LongWord):Boolean;
Return | Returns True if the key was remapped, False if it was not. |
---|---|
See | http://www.freepascal.org/docs-html/rtl/keyboard/kbdscancode.html
See also: \source\packages\rtl-console\src\inc\keyscan.inc |
Note | See below for a version that uses SCAN_CODE_* values instead of translated KEY_CODE_* values |
function KeyboardRemapScanCode(ScanCode,KeyCode:Word; var CharCode:Byte; Modifiers:LongWord):Boolean;
Return | Returns True if the key was remapped, False if it was not |
---|---|
See | http://www.freepascal.org/docs-html/rtl/keyboard/kbdscancode.html
See also: \source\packages\rtl-console\src\inc\keyscan.inc |
Note | Same as above except using SCAN_CODE_* values instead of translated KEY_CODE_* values |
function KeyboardInsertData(Keyboard:PKeyboardDevice; Data:PKeyboardData; Signal:Boolean):LongWord;
Keyboard | The keyboard device to insert data for |
---|---|
Data | The TKeyboardData entry to insert |
Signal | If True then signal that new data is available in the buffer |
Return | ERROR_SUCCESS if completed or another error code on failure |
Note | Caller must hold the keyboard lock |
procedure KeyboardLog(Level:LongWord; Keyboard:PKeyboardDevice; const AText:String);
Note | None documented |
---|
procedure KeyboardLogInfo(Keyboard:PKeyboardDevice; const AText:String); inline;
Note | None documented |
---|
procedure KeyboardLogWarn(Keyboard:PKeyboardDevice; const AText:String); inline;
Note | None documented |
---|
procedure KeyboardLogError(Keyboard:PKeyboardDevice; const AText:String); inline;
Note | None documented |
---|
procedure KeyboardLogDebug(Keyboard:PKeyboardDevice; const AText:String); inline;
Note | None documented |
---|
Return to Unit Reference