hidconv.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. package remdeshid
  2. /*
  3. hidconv.go
  4. This file contains functions to convert HID commands to bytes
  5. that can be sent over the USBKVM device
  6. */
  7. // Operation Types
  8. const (
  9. // Frontend Opr Types
  10. FRONTEND_OPR_TYPE_KEYBOARD_WRITE = "kw"
  11. FRONTEND_OPR_TYPE_MOUSE_WRITE = "mw"
  12. FRONTEND_OPR_TYPE_MOUSE_MOVE = "mm"
  13. FRONTEND_OPR_TYPE_MOUSE_SCROLL = "ms"
  14. FRONTEND_OPR_TYPE_SWITCH = "sw"
  15. // USBKVM Operation Types
  16. OPR_TYPE_RESERVED = 0x00
  17. OPR_TYPE_KEYBOARD_WRITE = 0x01
  18. OPR_TYPE_MOUSE_WRITE = 0x02
  19. OPR_TYPE_MOUSE_MOVE = 0x03
  20. OPR_TYPE_MOUSE_SCROLL = 0x04
  21. OPR_TYPE_SWITCH_SET = 0x05
  22. OPR_TYPE_DATA_RESET = 0xFF
  23. )
  24. // Operation Sub-types
  25. const (
  26. SUBTYPE_RESERVED = 0x00
  27. )
  28. // Keyboard Subtypes
  29. const (
  30. // Frontend Keyboard Opr Types
  31. FRONTEND_SUBTYPE_KEYBOARD_KEY_DOWN = "kd"
  32. FRONTEND_SUBTYPE_KEYBOARD_KEY_UP = "ku"
  33. FRONTEND_SUBTYPE_KEYBOARD_KEY_CLICK = "kc"
  34. // USBKVM Keyboard Subtypes
  35. SUBTYPE_KEYBOARD_ASCII_WRITE = 0x01
  36. SUBTYPE_KEYBOARD_ASCII_PRESS = 0x02
  37. SUBTYPE_KEYBOARD_ASCII_RELEASE = 0x03
  38. SUBTYPE_KEYBOARD_MODIFIER_PRESS = 0x04
  39. SUBTYPE_KEYBOARD_MODIFIER_RELEASE = 0x05
  40. SUBTYPE_KEYBOARD_FUNCTKEY_PRESS = 0x06
  41. SUBTYPE_KEYBOARD_FUNCTKEY_RELEASE = 0x07
  42. SUBTYPE_KEYBOARD_OTHERKEY_PRESS = 0x08
  43. SUBTYPE_KEYBOARD_OTHERKEY_RELEASE = 0x09
  44. SUBTYPE_KEYBOARD_NUMPAD_PRESS = 0x0A
  45. SUBTYPE_KEYBOARD_NUMPAD_RELEASE = 0x0B
  46. SUBTYPE_KEYBOARD_SPECIAL_PAUSE = 0xF9
  47. SUBTYPE_KEYBOARD_SPECIAL_PRINT_SCREEN = 0xFA
  48. SUBTYPE_KEYBOARD_SPECIAL_SCROLL_LOCK = 0xFB
  49. SUBTYPE_KEYBOARD_SPECIAL_NUMLOCK = 0xFC
  50. SUBTYPE_KEYBOARD_SPECIAL_CTRLALTDEL = 0xFD
  51. SUBTYPE_KEYBOARD_SPECIAL_RESET = 0xFE
  52. SUBTYPE_KEYBOARD_SPECIAL_RESERVED = 0xFF
  53. // Numpad Buttons IDs
  54. PAYLOAD_KEYBOARD_NUMPAD_0 = 0x00
  55. PAYLOAD_KEYBOARD_NUMPAD_1 = 0x01
  56. PAYLOAD_KEYBOARD_NUMPAD_2 = 0x02
  57. PAYLOAD_KEYBOARD_NUMPAD_3 = 0x03
  58. PAYLOAD_KEYBOARD_NUMPAD_4 = 0x04
  59. PAYLOAD_KEYBOARD_NUMPAD_5 = 0x05
  60. PAYLOAD_KEYBOARD_NUMPAD_6 = 0x06
  61. PAYLOAD_KEYBOARD_NUMPAD_7 = 0x07
  62. PAYLOAD_KEYBOARD_NUMPAD_8 = 0x08
  63. PAYLOAD_KEYBOARD_NUMPAD_9 = 0x09
  64. PAYLOAD_KEYBOARD_NUMPAD_DOT = 0x0A
  65. PAYLOAD_KEYBOARD_NUMPAD_TIMES = 0x0B
  66. PAYLOAD_KEYBOARD_NUMPAD_DIV = 0x0C
  67. PAYLOAD_KEYBOARD_NUMPAD_PLUS = 0x0D
  68. PAYLOAD_KEYBOARD_NUMPAD_MINUS = 0x0E
  69. PAYLOAD_KEYBOARD_NUMPAD_ENTER = 0x0F
  70. PAYLOAD_KEYBOARD_NUMPAD_NUMLOCK = 0x10
  71. // Modifier Keys IDs
  72. PAYLOAD_KEY_LEFT_CTRL = 0x00
  73. PAYLOAD_KEY_LEFT_SHIFT = 0x01
  74. PAYLOAD_KEY_LEFT_ALT = 0x02
  75. PAYLOAD_KEY_LEFT_GUI = 0x03
  76. PAYLOAD_KEY_RIGHT_CTRL = 0x04
  77. PAYLOAD_KEY_RIGHT_SHIFT = 0x05
  78. PAYLOAD_KEY_RIGHT_ALT = 0x06
  79. PAYLOAD_KEY_RIGHT_GUI = 0x07
  80. )
  81. const (
  82. //Frontend Mouse Opr Types
  83. FRONTEND_MOUSE_CLICK = "mc"
  84. FRONTEND_MOUSE_PRESS = "md"
  85. FRONTEND_MOUSE_RELEASE = "mu"
  86. FRONTEND_MOUSE_BTN_LEFT = "0"
  87. FRONTEND_MOUSE_BTN_MIDDLE = "1"
  88. FRONTEND_MOUSE_BTN_RIGHT = "2"
  89. // Mouse Subtypes
  90. SUBTYPE_MOUSE_CLICK = 0x01 // Mouse button click
  91. SUBTYPE_MOUSE_PRESS = 0x02 // Mouse button press
  92. SUBTYPE_MOUSE_RELEASE = 0x03 // Mouse button release
  93. SUBTYPE_MOUSE_SETPOS = 0x04 // Mouse presets position
  94. SUBTYPE_MOUSE_RESET = 0x05 // Reset all mouse button states
  95. // Mouse Buttons IDs
  96. PAYLOAD_MOUSE_BTN_LEFT = 0x01
  97. PAYLOAD_MOUSE_BTN_RIGHT = 0x02
  98. PAYLOAD_MOUSE_BTN_MID = 0x03
  99. )
  100. // Switch Subtypes
  101. const (
  102. SUBTYPE_SWITCH_USB_HID = 0x01
  103. SUBTYPE_SWITCH_USB_MASS = 0x02
  104. )
  105. // Control Code
  106. const (
  107. FRONT_END_OPR_RESET = "reset" // Reset all the mouse and keyboard states
  108. )
  109. // Response Codes
  110. const (
  111. RESP_OK = 0x00
  112. RESP_UNKNOWN_OPR = 0x01
  113. RESP_INVALID_OPR_TYPE = 0x02
  114. RESP_INVALID_KEY_VALUE = 0x03
  115. RESP_NOT_IMPLEMENTED = 0x04
  116. )
  117. //isModifierKey checks if a key is a modifier key
  118. func isModifierKey(key string) bool {
  119. switch key {
  120. case "LEFT_Shift", "RIGHT_Shift", "LEFT_Control", "RIGHT_Control", "LEFT_Alt", "RIGHT_Alt", "Meta", "ContextMenu":
  121. return true
  122. default:
  123. return false
  124. }
  125. }
  126. //Convert modifier key string to byte
  127. func modifierKeyToByte(key string) byte {
  128. switch key {
  129. case "LEFT_Shift":
  130. return PAYLOAD_KEY_LEFT_SHIFT
  131. case "RIGHT_Shift":
  132. return PAYLOAD_KEY_RIGHT_SHIFT
  133. case "LEFT_Control":
  134. return PAYLOAD_KEY_LEFT_CTRL
  135. case "RIGHT_Control":
  136. return PAYLOAD_KEY_RIGHT_CTRL
  137. case "LEFT_Alt":
  138. return PAYLOAD_KEY_LEFT_ALT
  139. case "RIGHT_Alt":
  140. return PAYLOAD_KEY_RIGHT_ALT
  141. case "Meta":
  142. return PAYLOAD_KEY_LEFT_GUI
  143. case "ContextMenu":
  144. return PAYLOAD_KEY_RIGHT_GUI
  145. default:
  146. return 0xFF
  147. }
  148. }
  149. //Is a key a function key
  150. func isFuncKey(key string) bool {
  151. switch key {
  152. case "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12",
  153. "F13", "F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23", "F24":
  154. return true
  155. default:
  156. return false
  157. }
  158. }
  159. //Convert function key string to byte
  160. func funcKeyToByte(key string) byte {
  161. switch key {
  162. case "F1":
  163. return 0xC2
  164. case "F2":
  165. return 0xC3
  166. case "F3":
  167. return 0xC4
  168. case "F4":
  169. return 0xC5
  170. case "F5":
  171. return 0xC6
  172. case "F6":
  173. return 0xC7
  174. case "F7":
  175. return 0xC8
  176. case "F8":
  177. return 0xC9
  178. case "F9":
  179. return 0xCA
  180. case "F10":
  181. return 0xCB
  182. case "F11":
  183. return 0xCC
  184. case "F12":
  185. return 0xCD
  186. case "F13":
  187. return 0xF0
  188. case "F14":
  189. return 0xF1
  190. case "F15":
  191. return 0xF2
  192. case "F16":
  193. return 0xF3
  194. case "F17":
  195. return 0xF4
  196. case "F18":
  197. return 0xF5
  198. case "F19":
  199. return 0xF6
  200. case "F20":
  201. return 0xF7
  202. case "F21":
  203. return 0xF8
  204. case "F22":
  205. return 0xF9
  206. case "F23":
  207. return 0xFA
  208. case "F24":
  209. return 0xFB
  210. default:
  211. return 0xFF
  212. }
  213. }
  214. /* Check for other keys */
  215. func isOtherKeys(key string) bool {
  216. return nonAsciiKeysToBytes(key)[0] != 0xFF
  217. }
  218. func nonAsciiKeysToBytes(key string) []byte {
  219. switch key {
  220. case "ArrowUp":
  221. return []byte{0xDA}
  222. case "ArrowDown":
  223. return []byte{0xD9}
  224. case "ArrowLeft":
  225. return []byte{0xD8}
  226. case "ArrowRight":
  227. return []byte{0xD7}
  228. case "Backspace":
  229. return []byte{0xB2}
  230. case "Tab":
  231. return []byte{0xB3}
  232. case "Enter":
  233. return []byte{0xB0}
  234. case "Escape":
  235. return []byte{0xB1}
  236. case "Insert":
  237. return []byte{0xD1}
  238. case "Delete":
  239. return []byte{0xD4}
  240. case "PageUp":
  241. return []byte{0xD3}
  242. case "PageDown":
  243. return []byte{0xD6}
  244. case "Home":
  245. return []byte{0xD2}
  246. case "End":
  247. return []byte{0xD5}
  248. case "CapsLock":
  249. return []byte{0xC1}
  250. default:
  251. return []byte{0xFF}
  252. }
  253. }
  254. /* Numpad keys */
  255. func isNumpadKey(key string) bool {
  256. return len(key) > 7 && key[:7] == "NUMPAD_"
  257. }
  258. func numpadKeyToByte(key string) byte {
  259. switch key {
  260. case "NUMPAD_0":
  261. return PAYLOAD_KEYBOARD_NUMPAD_0
  262. case "NUMPAD_1":
  263. return PAYLOAD_KEYBOARD_NUMPAD_1
  264. case "NUMPAD_2":
  265. return PAYLOAD_KEYBOARD_NUMPAD_2
  266. case "NUMPAD_3":
  267. return PAYLOAD_KEYBOARD_NUMPAD_3
  268. case "NUMPAD_4":
  269. return PAYLOAD_KEYBOARD_NUMPAD_4
  270. case "NUMPAD_5":
  271. return PAYLOAD_KEYBOARD_NUMPAD_5
  272. case "NUMPAD_6":
  273. return PAYLOAD_KEYBOARD_NUMPAD_6
  274. case "NUMPAD_7":
  275. return PAYLOAD_KEYBOARD_NUMPAD_7
  276. case "NUMPAD_8":
  277. return PAYLOAD_KEYBOARD_NUMPAD_8
  278. case "NUMPAD_9":
  279. return PAYLOAD_KEYBOARD_NUMPAD_9
  280. case "NUMPAD_.":
  281. return PAYLOAD_KEYBOARD_NUMPAD_DOT
  282. case "NUMPAD_*":
  283. return PAYLOAD_KEYBOARD_NUMPAD_TIMES
  284. case "NUMPAD_/":
  285. return PAYLOAD_KEYBOARD_NUMPAD_DIV
  286. case "NUMPAD_+":
  287. return PAYLOAD_KEYBOARD_NUMPAD_PLUS
  288. case "NUMPAD_-":
  289. return PAYLOAD_KEYBOARD_NUMPAD_MINUS
  290. case "NUMPAD_Enter":
  291. return PAYLOAD_KEYBOARD_NUMPAD_ENTER
  292. default:
  293. return 0xFF
  294. }
  295. }