|
@@ -0,0 +1,235 @@
|
|
|
+package remdeshid
|
|
|
+
|
|
|
+/*
|
|
|
+ hidconv.go
|
|
|
+
|
|
|
+ This file contains functions to convert HID commands to bytes
|
|
|
+ that can be sent over the USBKVM device
|
|
|
+*/
|
|
|
+
|
|
|
+// Operation Types
|
|
|
+const (
|
|
|
+ // Frontend Opr Types
|
|
|
+ FRONTEND_OPR_TYPE_KEYBOARD_WRITE = "kw"
|
|
|
+ FRONTEND_OPR_TYPE_MOUSE_WRITE = "mw"
|
|
|
+ FRONTEND_OPR_TYPE_MOUSE_MOVE = "mm"
|
|
|
+ FRONTEND_OPR_TYPE_MOUSE_SCROLL = "ms"
|
|
|
+
|
|
|
+ // USBKVM Operation Types
|
|
|
+ OPR_TYPE_RESERVED = 0x00
|
|
|
+ OPR_TYPE_KEYBOARD_WRITE = 0x01
|
|
|
+ OPR_TYPE_MOUSE_WRITE = 0x02
|
|
|
+ OPR_TYPE_MOUSE_MOVE = 0x03
|
|
|
+ OPR_TYPE_MOUSE_SCROLL = 0x04
|
|
|
+ OPR_TYPE_DATA_RESET = 0xFF
|
|
|
+)
|
|
|
+
|
|
|
+// Operation Sub-types
|
|
|
+const (
|
|
|
+ SUBTYPE_RESERVED = 0x00
|
|
|
+)
|
|
|
+
|
|
|
+// Keyboard Subtypes
|
|
|
+const (
|
|
|
+ // Frontend Keyboard Opr Types
|
|
|
+ FRONTEND_SUBTYPE_KEYBOARD_KEY_DOWN = "kd"
|
|
|
+ FRONTEND_SUBTYPE_KEYBOARD_KEY_UP = "ku"
|
|
|
+ FRONTEND_SUBTYPE_KEYBOARD_KEY_CLICK = "kc"
|
|
|
+
|
|
|
+ // USBKVM Keyboard Subtypes
|
|
|
+ SUBTYPE_KEYBOARD_ASCII_WRITE = 0x01
|
|
|
+ SUBTYPE_KEYBOARD_ASCII_PRESS = 0x02
|
|
|
+ SUBTYPE_KEYBOARD_ASCII_RELEASE = 0x03
|
|
|
+ SUBTYPE_KEYBOARD_MODIFIER_SET = 0x04
|
|
|
+ SUBTYPE_KEYBOARD_MODIFIER_CLEAR = 0x05
|
|
|
+ SUBTYPE_KEYBOARD_FUNCTKEY_PRESS = 0x06
|
|
|
+ SUBTYPE_KEYBOARD_FUNCTKEY_RELEASE = 0x07
|
|
|
+ SUBTYPE_KEYBOARD_OTHERKEY_PRESS = 0x08
|
|
|
+ SUBTYPE_KEYBOARD_OTHERKEY_RELEASE = 0x09
|
|
|
+ SUBTYPE_KEYBOARD_NUMPAD_PRESS = 0x0A
|
|
|
+ SUBTYPE_KEYBOARD_NUMPAD_RELEASE = 0x0B
|
|
|
+ SUBTYPE_KEYBOARD_SPECIAL_CTRLALTDEL = 0xFD
|
|
|
+ SUBTYPE_KEYBOARD_SPECIAL_RESET = 0xFE
|
|
|
+ SUBTYPE_KEYBOARD_SPECIAL_RESERVED = 0xFF
|
|
|
+
|
|
|
+ // Numpad Buttons IDs
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_0 = 0x00
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_1 = 0x01
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_2 = 0x02
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_3 = 0x03
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_4 = 0x04
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_5 = 0x05
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_6 = 0x06
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_7 = 0x07
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_8 = 0x08
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_9 = 0x09
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_DOT = 0x0A
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_TIMES = 0x0B
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_DIV = 0x0C
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_PLUS = 0x0D
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_MINUS = 0x0E
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_ENTER = 0x0F
|
|
|
+ PAYLOAD_KEYBOARD_NUMPAD_NUMLOCK = 0x10
|
|
|
+)
|
|
|
+
|
|
|
+// Response Codes
|
|
|
+const (
|
|
|
+ RESP_OK = 0x00
|
|
|
+ RESP_UNKNOWN_OPR = 0x01
|
|
|
+ RESP_INVALID_OPR_TYPE = 0x02
|
|
|
+ RESP_INVALID_KEY_VALUE = 0x03
|
|
|
+ RESP_NOT_IMPLEMENTED = 0x04
|
|
|
+)
|
|
|
+
|
|
|
+//Is a key a function key
|
|
|
+func isFuncKey(key string) bool {
|
|
|
+ switch key {
|
|
|
+ case "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12",
|
|
|
+ "F13", "F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23", "F24":
|
|
|
+ return true
|
|
|
+ default:
|
|
|
+ return false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//Convert function key string to byte
|
|
|
+func funcKeyToByte(key string) byte {
|
|
|
+ switch key {
|
|
|
+ case "F1":
|
|
|
+ return 0xC2
|
|
|
+ case "F2":
|
|
|
+ return 0xC3
|
|
|
+ case "F3":
|
|
|
+ return 0xC4
|
|
|
+ case "F4":
|
|
|
+ return 0xC5
|
|
|
+ case "F5":
|
|
|
+ return 0xC6
|
|
|
+ case "F6":
|
|
|
+ return 0xC7
|
|
|
+ case "F7":
|
|
|
+ return 0xC8
|
|
|
+ case "F8":
|
|
|
+ return 0xC9
|
|
|
+ case "F9":
|
|
|
+ return 0xCA
|
|
|
+ case "F10":
|
|
|
+ return 0xCB
|
|
|
+ case "F11":
|
|
|
+ return 0xCC
|
|
|
+ case "F12":
|
|
|
+ return 0xCD
|
|
|
+ case "F13":
|
|
|
+ return 0xF0
|
|
|
+ case "F14":
|
|
|
+ return 0xF1
|
|
|
+ case "F15":
|
|
|
+ return 0xF2
|
|
|
+ case "F16":
|
|
|
+ return 0xF3
|
|
|
+ case "F17":
|
|
|
+ return 0xF4
|
|
|
+ case "F18":
|
|
|
+ return 0xF5
|
|
|
+ case "F19":
|
|
|
+ return 0xF6
|
|
|
+ case "F20":
|
|
|
+ return 0xF7
|
|
|
+ case "F21":
|
|
|
+ return 0xF8
|
|
|
+ case "F22":
|
|
|
+ return 0xF9
|
|
|
+ case "F23":
|
|
|
+ return 0xFA
|
|
|
+ case "F24":
|
|
|
+ return 0xFB
|
|
|
+ default:
|
|
|
+ return 0xFF
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* Check for other keys */
|
|
|
+func isOtherKeys(key string) bool {
|
|
|
+ return nonAsciiKeysToBytes(key)[0] != 0xFF
|
|
|
+}
|
|
|
+
|
|
|
+func nonAsciiKeysToBytes(key string) []byte {
|
|
|
+ switch key {
|
|
|
+ case "ArrowUp":
|
|
|
+ return []byte{0xDA}
|
|
|
+ case "ArrowDown":
|
|
|
+ return []byte{0xD9}
|
|
|
+ case "ArrowLeft":
|
|
|
+ return []byte{0xD8}
|
|
|
+ case "ArrowRight":
|
|
|
+ return []byte{0xD7}
|
|
|
+ case "Backspace":
|
|
|
+ return []byte{0xB2}
|
|
|
+ case "Tab":
|
|
|
+ return []byte{0xB3}
|
|
|
+ case "Enter":
|
|
|
+ return []byte{0xB0}
|
|
|
+ case "Escape":
|
|
|
+ return []byte{0xB1}
|
|
|
+ case "Insert":
|
|
|
+ return []byte{0xD1}
|
|
|
+ case "Delete":
|
|
|
+ return []byte{0xD4}
|
|
|
+ case "PageUp":
|
|
|
+ return []byte{0xD3}
|
|
|
+ case "PageDown":
|
|
|
+ return []byte{0xD6}
|
|
|
+ case "Home":
|
|
|
+ return []byte{0xD2}
|
|
|
+ case "End":
|
|
|
+ return []byte{0xD5}
|
|
|
+ case "CapsLock":
|
|
|
+ return []byte{0xC1}
|
|
|
+ default:
|
|
|
+ return []byte{0xFF}
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* Numpad keys */
|
|
|
+func isNumpadKey(key string) bool {
|
|
|
+ return len(key) > 7 && key[:7] == "NUMPAD_"
|
|
|
+}
|
|
|
+
|
|
|
+func numpadKeyToByte(key string) byte {
|
|
|
+ switch key {
|
|
|
+ case "NUMPAD_0":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_0
|
|
|
+ case "NUMPAD_1":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_1
|
|
|
+ case "NUMPAD_2":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_2
|
|
|
+ case "NUMPAD_3":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_3
|
|
|
+ case "NUMPAD_4":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_4
|
|
|
+ case "NUMPAD_5":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_5
|
|
|
+ case "NUMPAD_6":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_6
|
|
|
+ case "NUMPAD_7":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_7
|
|
|
+ case "NUMPAD_8":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_8
|
|
|
+ case "NUMPAD_9":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_9
|
|
|
+ case "NUMPAD_.":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_DOT
|
|
|
+ case "NUMPAD_*":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_TIMES
|
|
|
+ case "NUMPAD_/":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_DIV
|
|
|
+ case "NUMPAD_+":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_PLUS
|
|
|
+ case "NUMPAD_-":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_MINUS
|
|
|
+ case "NUMPAD_Enter":
|
|
|
+ return PAYLOAD_KEYBOARD_NUMPAD_ENTER
|
|
|
+ default:
|
|
|
+ return 0xFF
|
|
|
+ }
|
|
|
+}
|