keycode_lookup.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. /* Copyright 2021 Seth Bonner <fl3tching101@gmail.com>
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include "keycode_lookup.h"
  17. #include "print.h"
  18. #include "via.h"
  19. #define num_keycodes (sizeof(lookup_table)/sizeof(lookup_table[0]))
  20. static char UNKNOWN_KEYCODE[] = "UNKNOWN";
  21. int cmp(const void *v1, const void *v2)
  22. {
  23. const lookup_table_t *c1 = v1;
  24. const lookup_table_t *c2 = v2;
  25. return (c1->keycode - c2->keycode);
  26. }
  27. /*
  28. Returns a pointer to a string containing the string describing the keycode, such as those found here:
  29. https://beta.docs.qmk.fm/using-qmk/simple-keycodes/keycodes
  30. Will return a string that says "UNKNOWN" if the keycode cannot be found.
  31. */
  32. char* translate_keycode_to_string(uint16_t code)
  33. {
  34. lookup_table_t * result = NULL;
  35. lookup_table_t target = {.key_string = "", .keycode = code};
  36. char * return_p;
  37. result = bsearch(&target, lookup_table, num_keycodes, sizeof(lookup_table_t), cmp);
  38. if(result != NULL)
  39. {
  40. return_p = result->key_string;
  41. }
  42. else
  43. {
  44. return_p = UNKNOWN_KEYCODE;
  45. }
  46. return (return_p);
  47. }
  48. lookup_table_t lookup_table[334] =
  49. {
  50. {"KC_NO", KC_NO},
  51. {"KC_TRNS", KC_TRNS},
  52. {"KC_A", KC_A},
  53. {"KC_B", KC_B},
  54. {"KC_C", KC_C},
  55. {"KC_D", KC_D},
  56. {"KC_E", KC_E},
  57. {"KC_F", KC_F},
  58. {"KC_G", KC_G},
  59. {"KC_H", KC_H},
  60. {"KC_I", KC_I},
  61. {"KC_J", KC_J},
  62. {"KC_K", KC_K},
  63. {"KC_L", KC_L},
  64. {"KC_M", KC_M},
  65. {"KC_N", KC_N},
  66. {"KC_O", KC_O},
  67. {"KC_P", KC_P},
  68. {"KC_Q", KC_Q},
  69. {"KC_R", KC_R},
  70. {"KC_S", KC_S},
  71. {"KC_T", KC_T},
  72. {"KC_U", KC_U},
  73. {"KC_V", KC_V},
  74. {"KC_W", KC_W},
  75. {"KC_X", KC_X},
  76. {"KC_Y", KC_Y},
  77. {"KC_Z", KC_Z},
  78. {"KC_1", KC_1},
  79. {"KC_2", KC_2},
  80. {"KC_3", KC_3},
  81. {"KC_4", KC_4},
  82. {"KC_5", KC_5},
  83. {"KC_6", KC_6},
  84. {"KC_7", KC_7},
  85. {"KC_8", KC_8},
  86. {"KC_9", KC_9},
  87. {"KC_0", KC_0},
  88. {"KC_ENT", KC_ENT},
  89. {"KC_ESC", KC_ESC},
  90. {"KC_BSPC", KC_BSPC},
  91. {"KC_TAB", KC_TAB},
  92. {"KC_SPC", KC_SPC},
  93. {"KC_MINS", KC_MINS},
  94. {"KC_EQL", KC_EQL},
  95. {"KC_LBRC", KC_LBRC},
  96. {"KC_RBRC", KC_RBRC},
  97. {"KC_BSLS", KC_BSLS},
  98. {"KC_NUHS", KC_NUHS},
  99. {"KC_SCLN", KC_SCLN},
  100. {"KC_QUOT", KC_QUOT},
  101. {"KC_GRV", KC_GRV},
  102. {"KC_ZKHK", KC_ZKHK},
  103. {"KC_COMM", KC_COMM},
  104. {"KC_DOT", KC_DOT},
  105. {"KC_SLSH", KC_SLSH},
  106. {"KC_CAPS", KC_CAPS},
  107. {"KC_F1", KC_F1},
  108. {"KC_F2", KC_F2},
  109. {"KC_F3", KC_F3},
  110. {"KC_F4", KC_F4},
  111. {"KC_F5", KC_F5},
  112. {"KC_F6", KC_F6},
  113. {"KC_F7", KC_F7},
  114. {"KC_F8", KC_F8},
  115. {"KC_F9", KC_F9},
  116. {"KC_F10", KC_F10},
  117. {"KC_F11", KC_F11},
  118. {"KC_F12", KC_F12},
  119. {"KC_PSCR", KC_PSCR},
  120. {"KC_SLCK", KC_SLCK},
  121. {"KC_PAUS", KC_PAUS},
  122. {"KC_INS", KC_INS},
  123. {"KC_HOME", KC_HOME},
  124. {"KC_PGUP", KC_PGUP},
  125. {"KC_DEL", KC_DEL},
  126. {"KC_END", KC_END},
  127. {"KC_PGDN", KC_PGDN},
  128. {"KC_RGHT", KC_RGHT},
  129. {"KC_LEFT", KC_LEFT},
  130. {"KC_DOWN", KC_DOWN},
  131. {"KC_UP", KC_UP},
  132. {"KC_NLCK", KC_NLCK},
  133. {"KC_PSLS", KC_PSLS},
  134. {"KC_PAST", KC_PAST},
  135. {"KC_PMNS", KC_PMNS},
  136. {"KC_PPLS", KC_PPLS},
  137. {"KC_PENT", KC_PENT},
  138. {"KC_P1", KC_P1},
  139. {"KC_P2", KC_P2},
  140. {"KC_P3", KC_P3},
  141. {"KC_P4", KC_P4},
  142. {"KC_P5", KC_P5},
  143. {"KC_P6", KC_P6},
  144. {"KC_P7", KC_P7},
  145. {"KC_P8", KC_P8},
  146. {"KC_P9", KC_P9},
  147. {"KC_P0", KC_P0},
  148. {"KC_PDOT", KC_PDOT},
  149. {"KC_NUBS", KC_NUBS},
  150. {"KC_APP", KC_APP},
  151. {"KC_POWER", KC_POWER},
  152. {"KC_PEQL", KC_PEQL},
  153. {"KC_F13", KC_F13},
  154. {"KC_F14", KC_F14},
  155. {"KC_F15", KC_F15},
  156. {"KC_F16", KC_F16},
  157. {"KC_F17", KC_F17},
  158. {"KC_F18", KC_F18},
  159. {"KC_F19", KC_F19},
  160. {"KC_F20", KC_F20},
  161. {"KC_F21", KC_F21},
  162. {"KC_F22", KC_F22},
  163. {"KC_F23", KC_F23},
  164. {"KC_F24", KC_F24},
  165. {"KC_EXECUTE", KC_EXECUTE},
  166. {"KC_HELP", KC_HELP},
  167. {"KC_MENU", KC_MENU},
  168. {"KC_SELECT", KC_SELECT},
  169. {"KC_STOP", KC_STOP},
  170. {"KC_AGAIN", KC_AGAIN},
  171. {"KC_UNDO", KC_UNDO},
  172. {"KC_CUT", KC_CUT},
  173. {"KC_COPY", KC_COPY},
  174. {"KC_PASTE", KC_PASTE},
  175. {"KC_FIND", KC_FIND},
  176. {"KC_LCAP", KC_LCAP},
  177. {"KC_LNUM", KC_LNUM},
  178. {"KC_LSCR", KC_LSCR},
  179. {"KC_PCMM", KC_PCMM},
  180. {"KC_KP_EQUAL_AS400", KC_KP_EQUAL_AS400},
  181. {"KC_RO", KC_RO},
  182. {"KC_KANA", KC_KANA},
  183. {"KC_JYEN", KC_JYEN},
  184. {"KC_HENK", KC_HENK},
  185. {"KC_MHEN", KC_MHEN},
  186. {"KC_INT6", KC_INT6},
  187. {"KC_INT7", KC_INT7},
  188. {"KC_INT8", KC_INT8},
  189. {"KC_INT9", KC_INT9},
  190. {"KC_HAEN", KC_HAEN},
  191. {"KC_HANJ", KC_HANJ},
  192. {"KC_LANG3", KC_LANG3},
  193. {"KC_LANG4", KC_LANG4},
  194. {"KC_LANG5", KC_LANG5},
  195. {"KC_LANG6", KC_LANG6},
  196. {"KC_LANG7", KC_LANG7},
  197. {"KC_LANG8", KC_LANG8},
  198. {"KC_LANG9", KC_LANG9},
  199. {"KC_ERAS", KC_ERAS},
  200. {"KC_SYSREQ", KC_SYSREQ},
  201. {"KC_CANCEL", KC_CANCEL},
  202. {"KC_CLR", KC_CLR},
  203. {"KC_CLEAR", KC_CLEAR},
  204. {"KC_PRIOR", KC_PRIOR},
  205. {"KC_OUT", KC_OUT},
  206. {"KC_OPER", KC_OPER},
  207. {"KC_CLEAR_AGAIN", KC_CLEAR_AGAIN},
  208. {"KC_CRSEL", KC_CRSEL},
  209. {"KC_EXSEL", KC_EXSEL},
  210. {"KC_PWR", KC_PWR},
  211. {"KC_SLEP", KC_SLEP},
  212. {"KC_WAKE", KC_WAKE},
  213. {"KC_MUTE", KC_MUTE},
  214. {"KC_VOLU", KC_VOLU},
  215. {"KC_VOLD", KC_VOLD},
  216. {"KC_MNXT", KC_MNXT},
  217. {"KC_MPRV", KC_MPRV},
  218. {"KC_MSTP", KC_MSTP},
  219. {"KC_MPLY", KC_MPLY},
  220. {"KC_MSEL", KC_MSEL},
  221. {"KC_EJCT", KC_EJCT},
  222. {"KC_MAIL", KC_MAIL},
  223. {"KC_CALC", KC_CALC},
  224. {"KC_MYCM", KC_MYCM},
  225. {"KC_WWW_SEARCH", KC_WWW_SEARCH},
  226. {"KC_WWW_HOME", KC_WWW_HOME},
  227. {"KC_WWW_BACK", KC_WWW_BACK},
  228. {"KC_WWW_FORWARD", KC_WWW_FORWARD},
  229. {"KC_WWW_STOP", KC_WWW_STOP},
  230. {"KC_WWW_REFRESH", KC_WWW_REFRESH},
  231. {"KC_WWW_FAVORITES", KC_WWW_FAVORITES},
  232. {"KC_MFFD", KC_MFFD},
  233. {"KC_MRWD", KC_MRWD},
  234. {"KC_BRIU", KC_BRIU},
  235. {"KC_BRID", KC_BRID},
  236. {"KC_LCTL", KC_LCTL},
  237. {"KC_LSFT", KC_LSFT},
  238. {"KC_LALT", KC_LALT},
  239. {"KC_LGUI", KC_LGUI},
  240. {"KC_RCTL", KC_RCTL},
  241. {"KC_RSFT", KC_RSFT},
  242. {"KC_RALT", KC_RALT},
  243. {"KC_RGUI", KC_RGUI},
  244. {"KC_MS_UP", KC_MS_UP},
  245. {"KC_MS_DOWN", KC_MS_DOWN},
  246. {"KC_MS_LEFT", KC_MS_LEFT},
  247. {"KC_MS_RIGHT", KC_MS_RIGHT},
  248. {"KC_MS_BTN1", KC_MS_BTN1},
  249. {"KC_MS_BTN2", KC_MS_BTN2},
  250. {"KC_MS_BTN3", KC_MS_BTN3},
  251. {"KC_MS_BTN4", KC_MS_BTN4},
  252. {"KC_MS_BTN5", KC_MS_BTN5},
  253. {"KC_MS_WH_UP", KC_MS_WH_UP},
  254. {"KC_MS_WH_DOWN", KC_MS_WH_DOWN},
  255. {"KC_MS_WH_LEFT", KC_MS_WH_LEFT},
  256. {"KC_MS_WH_RIGHT", KC_MS_WH_RIGHT},
  257. {"KC_MS_ACCEL0", KC_MS_ACCEL0},
  258. {"KC_MS_ACCEL1", KC_MS_ACCEL1},
  259. {"KC_MS_ACCEL2", KC_MS_ACCEL2},
  260. {"KC_EXLM", KC_EXLM},
  261. {"KC_AT", KC_AT},
  262. {"KC_HASH", KC_HASH},
  263. {"KC_DLR", KC_DLR},
  264. {"KC_PERC", KC_PERC},
  265. {"KC_CIRC", KC_CIRC},
  266. {"KC_AMPR", KC_AMPR},
  267. {"KC_ASTR", KC_ASTR},
  268. {"KC_LPRN", KC_LPRN},
  269. {"KC_RPRN", KC_RPRN},
  270. {"KC_UNDS", KC_UNDS},
  271. {"KC_PLUS", KC_PLUS},
  272. {"KC_LCBR", KC_LCBR},
  273. {"KC_RCBR", KC_RCBR},
  274. {"KC_PIPE", KC_PIPE},
  275. {"KC_COLN", KC_COLN},
  276. {"KC_DQUO", KC_DQUO},
  277. {"KC_TILD", KC_TILD},
  278. {"KC_LT", KC_LT},
  279. {"KC_GT", KC_GT},
  280. {"KC_QUES", KC_QUES},
  281. {"RESET", RESET},
  282. {"DEBUG", DEBUG},
  283. {"MAGIC_TOGGLE_NKRO", MAGIC_TOGGLE_NKRO},
  284. {"KC_GESC", KC_GESC},
  285. {"AU_ON", AU_ON},
  286. {"AU_OFF", AU_OFF},
  287. {"AU_TOG", AU_TOG},
  288. {"CLICKY_TOGGLE", CLICKY_TOGGLE},
  289. {"CLICKY_ENABLE", CLICKY_ENABLE},
  290. {"CLICKY_DISABLE", CLICKY_DISABLE},
  291. {"CLICKY_UP", CLICKY_UP},
  292. {"CLICKY_DOWN", CLICKY_DOWN},
  293. {"CLICKY_RESET", CLICKY_RESET},
  294. {"MU_ON", MU_ON},
  295. {"MU_OFF", MU_OFF},
  296. {"MU_TOG", MU_TOG},
  297. {"MU_MOD", MU_MOD},
  298. {"BL_ON", BL_ON},
  299. {"BL_OFF", BL_OFF},
  300. {"BL_DEC", BL_DEC},
  301. {"BL_INC", BL_INC},
  302. {"BL_TOGG", BL_TOGG},
  303. {"BL_STEP", BL_STEP},
  304. {"BL_BRTG", BL_BRTG},
  305. {"RGB_TOG", RGB_TOG},
  306. {"RGB_MOD", RGB_MOD},
  307. {"RGB_RMOD", RGB_RMOD},
  308. {"RGB_HUI", RGB_HUI},
  309. {"RGB_HUD", RGB_HUD},
  310. {"RGB_SAI", RGB_SAI},
  311. {"RGB_SAD", RGB_SAD},
  312. {"RGB_VAI", RGB_VAI},
  313. {"RGB_VAD", RGB_VAD},
  314. {"RGB_SPI", RGB_SPI},
  315. {"RGB_SPD", RGB_SPD},
  316. {"RGB_M_P", RGB_M_P},
  317. {"RGB_M_B", RGB_M_B},
  318. {"RGB_M_R", RGB_M_R},
  319. {"RGB_M_SW", RGB_M_SW},
  320. {"RGB_M_SN", RGB_M_SN},
  321. {"RGB_M_K", RGB_M_K},
  322. {"RGB_M_X", RGB_M_X},
  323. {"RGB_M_G", RGB_M_G},
  324. {"KC_LSPO", KC_LSPO},
  325. {"KC_RSPC", KC_RSPC},
  326. {"KC_SFTENT", KC_SFTENT},
  327. {"KC_LCPO", KC_LCPO},
  328. {"KC_RCPC", KC_RCPC},
  329. {"KC_LAPO", KC_LAPO},
  330. {"KC_RAPC", KC_RAPC},
  331. {"FN_MO13", FN_MO13},
  332. {"FN_MO23", FN_MO23},
  333. {"MACRO00", MACRO00},
  334. {"MACRO01", MACRO01},
  335. {"MACRO02", MACRO02},
  336. {"MACRO03", MACRO03},
  337. {"MACRO04", MACRO04},
  338. {"MACRO05", MACRO05},
  339. {"MACRO06", MACRO06},
  340. {"MACRO07", MACRO07},
  341. {"MACRO08", MACRO08},
  342. {"MACRO09", MACRO09},
  343. {"MACRO10", MACRO10},
  344. {"MACRO11", MACRO11},
  345. {"MACRO12", MACRO12},
  346. {"MACRO13", MACRO13},
  347. {"MACRO14", MACRO14},
  348. {"MACRO15", MACRO15},
  349. {"USER00", USER00},
  350. {"USER01", USER01},
  351. {"USER02", USER02},
  352. {"USER03", USER03},
  353. {"USER04", USER04},
  354. {"USER05", USER05},
  355. {"USER06", USER06},
  356. {"USER07", USER07},
  357. {"USER08", USER08},
  358. {"USER09", USER09},
  359. {"USER10", USER10},
  360. {"USER11", USER11},
  361. {"USER12", USER12},
  362. {"USER13", USER13},
  363. {"USER14", USER14},
  364. {"USER15", USER15}
  365. };