keymap.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. //placeholder until the new keymaps tree is built
  2. //#include QMK_KEYBOARD_H
  3. #include "virtser.h"
  4. #include <print.h>
  5. #include "milestogo.h"
  6. #define LAYOUT_local LAYOUT_mobile_XUW
  7. #define LAYOUT LAYOUT_mobile_XUW
  8. #ifndef USERSPACE_ACTIVE
  9. enum layer_keycodes {
  10. QWR = SAFE_RANGE,
  11. CDH,
  12. SYM,
  13. MOV,
  14. NUM,
  15. TRAN
  16. };
  17. enum layer_names {
  18. _QWR,
  19. _CDH,
  20. _SYM,
  21. _MOV,
  22. _TRAN
  23. };
  24. #endif
  25. // Shorter spacing
  26. #define XXXX KC_NO
  27. #define ____ KC_TRNS
  28. // Custom macros
  29. /* Fn Keys */
  30. #define TT_SYM MO(_SYM)
  31. #define TT_NUM MO(_NUM)
  32. #define SSFT ACTION_MODS_ONESHOT(MOD_LSFT)
  33. #define SSYM LT(_SYM, KC_SPC)
  34. #define MVTAB LT(_MOV,KC_TAB)
  35. #define BKMV TT(_MOV)
  36. #define MV2 LT(_MOV, KC_2)
  37. #define MV3 LT(_MOV, KC_3)
  38. #define MV4 LT(_MOV, KC_4)
  39. #define MV8 LT(_MOV, KC_8)
  40. #define MV9 LT(_MOV, KC_9)
  41. #define MV0 LT(_MOV, KC_0)
  42. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  43. /* QWERTY
  44. *
  45. * |ESC | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10| F11| F12|Vol-|Vol+|_CDH|
  46. * -------------------------------------------------------------------------------'
  47. * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace| Del|
  48. * ---------------------------------------------------------------------------
  49. * | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | \ | |
  50. * -------------------------------------------------------------------------------'
  51. * |Bak/Mov| a | s | d | f | g | h | j | k | l | ; | ' | enter |PgUp|
  52. * --------------------------------------------------------------------------------
  53. * |Lsft | z | x | c | v | b | n | m | , | . | / | Rsft| Up| PgDn|
  54. * ---------------------------------------------------------------------------------
  55. * |Lctl |Lgui |Lalt | Space/Sym | GUI | Sym | Rctl |Left|Down|Rght|
  56. * ---------------------------------------------------------------------------------
  57. */
  58. [_QWERTY] = LAYOUT_local( \
  59. KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLD, KC_VOLU, TG(_CDH),\
  60. KC_GRAVE, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,\
  61. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS,\
  62. BKMV, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,\
  63. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT,KC_SLSH,KC_RSFT, KC_UP, KC_PGDN,\
  64. KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, TT_SYM,KC_CDH, KC_LEFT, KC_DOWN, KC_RIGHT
  65. ),
  66. [_CDH] = LAYOUT_local(\
  67. ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
  68. KC_GRAVE, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_DEL,\
  69. KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, ____, ____, ____,\
  70. KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_2,\
  71. KC_LSFT, KC_Z, KC_X, KC_C, DHPASTE,KC_V, KC_K, KC_H, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, ____, KC_1,\
  72. TG(_MOV), ____, ____ , ____, ____, ____, KC_QWERTY, ____, ____, ____
  73. ),
  74. /* SYMBOL layer, several to chose from
  75. */
  76. [_SYM] = LAYOUT_wrapper(\
  77. ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
  78. ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
  79. ____, _________________EXCEL_L1__________________, _________________EXCEL_R1__________________, ____, ____, ____,\
  80. ____, _________________EXCEL_L2__________________, _________________EXCEL_R2__________________, KC_GRV, ____, ____,\
  81. ____, _________________EXCEL_L3__________________, _________________EXCEL_R3__________________, B_SAVE, ____, ____,\
  82. ____, ____, ____, ____, ____, ____, ____, ____, ____, ____
  83. ),
  84. #ifndef USE_BABLPASTE
  85. [_MOV] = LAYOUT_local(\
  86. ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, ____ , \
  87. ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, \
  88. ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, KC_UP, XXXX, XXXX, XXXX, XXXX, XXXX, \
  89. ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, KC_LEFT, KC_DOWN, KC_RIGHT,XXXX, XXXX, XXXX, XXXX, \
  90. ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, \
  91. ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX
  92. )
  93. #else
  94. /* MOVE babble version version
  95. * |ESC | MAC|Read|Linx| VI | | | | | | | | | | | |
  96. * -------------------------------------------------------------------------------'
  97. * | | | - | = |Bakspace| Del|
  98. * ---------------------------------------------------------------------------
  99. * | tab | | [ | ] | \ | |
  100. * -------------------------------------------------------------------------------'
  101. * |Bak/Mov| | ' |Launch App |PgUp|
  102. * ---------------------------------------------------------------------------------
  103. * |Lsft | | Rsft| Up| PgDn|
  104. * ---------------------------------------------------------------------------------
  105. * | |Lgui |Lalt | Exit Move Mode | GUI | Sym | Rctl |Left|Down|Rght|
  106. * ---------------------------------------------------------------------------------
  107. */
  108. /* ,--------------------------------------------. ,--------------------------------------------.
  109. * 01 | ESC |FindPrev| Find |FindNext| \n cell| |ParStart|LineStrt| Up | EOL | ParEnd |
  110. * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
  111. * 02 | SelA | Do_DEL | Shift | Undo |Hsplit+ | | WrdLft | Left | Down | Right | WrdRght|
  112. * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
  113. * 03 |Vspli+ | Cut | Copy | Paste | Paste | | WinPrv | Tab-- | NewTab | Tab++ | WinNxt |
  114. * `--------------------------------------------' `--------------------------------------------'
  115. */
  116. [_MOV] = LAYOUT_wrapper(\
  117. ____, ____________BABBLE_SWITCH_L________________, ____________BABBLE_SWITCH_R________________, XXXX, XXXX, XXXX, XXXX, ____, \
  118. ____, ____________BABBLE_MOV_LNUM________________, ____________BABBLE_MOV_RNUM________________, XXXX, XXXX, XXXX, XXXX,\
  119. ____, ____________BABBLE_MOV_L1__________________, ____________BABBLE_MOV_R1__________________, XXXX, XXXX, XXXX, \
  120. ____, ____________BABBLE_MOV_L2__________________, ____________BABBLE_MOV_R2__________________, XXXX, B_RUNAPP, XXXX,\
  121. ____, ____________BABBLE_MOV_L3__________________, ____________BABBLE_MOV_R2__________________, XXXX, XXXX, XXXX, \
  122. ____, ____, ____, TG(_MOV), XXXX, XXXX, XXXX, XXXX, XXXX, XXXX
  123. ),
  124. // Move in a direction, deleting as we go, or do opposite of Mov layer action */
  125. /* ,--------------------------------------------. ,--------------------------------------------.
  126. * 01 | Esc | |Replace |MultiSel|PasteVal| | . |LineStrt| . | EOL | . |
  127. * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
  128. * 02 | | Do_Mov | Shift | Redo |Hsplit- | | WrdLft | Left | . | Right | WrdRght|
  129. * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
  130. * 03 |Vsplit- | Cut | Copy | Paste |Paste | | App-- | ZoomOut| NewWin | ZoomIn | App+ |
  131. * `--------------------------------------------' `--------------------------------------------'
  132. */
  133. [_DMOV] = LAYOUT_wrapper(\
  134. ____, ____________BABBLE_SWITCH_L________________, ____________BABBLE_SWITCH_R________________, XXXX, XXXX, XXXX, ____, \
  135. ____, ____________BABBLE_MOV_LNUM________________, ____________BABBLE_MOV_RNUM________________, XXXX, XXXX, XXXX, XXXX, \
  136. ____, _________BABBLE_DELMOV_L1__________________ , _________BABBLE_DELMOV_R1__________________ , XXXX, XXXX, XXXX, \
  137. ____, _________BABBLE_DELMOV_L2__________________ , _________BABBLE_DELMOV_R2__________________ , XXXX, XXXX, XXXX,\
  138. ____, _________BABBLE_DELMOV_L3__________________ , _________BABBLE_DELMOV_R3__________________ , XXXX, XXXX, XXXX, \
  139. ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX
  140. ),
  141. #endif // Bablepaste
  142. /*
  143. [_TRAN] = LAYOUT_local(\
  144. ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
  145. ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
  146. ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
  147. ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
  148. ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
  149. ____, ____, ____, ____, ____, ____, ____, ____, ____, ____
  150. )
  151. */
  152. };
  153. #ifndef USERSPACE_ACTIVE
  154. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  155. switch (keycode) {
  156. case QWR:
  157. if (record->event.pressed) {
  158. layer_off(_CDH);
  159. }
  160. return false;
  161. break;
  162. case CDH:
  163. if (record->event.pressed) {
  164. layer_on(_CDH);
  165. }
  166. return false;
  167. break;
  168. case SYM:
  169. if (record->event.pressed) {
  170. layer_on(_SYM);
  171. } else {
  172. layer_off(_SYM);
  173. }
  174. return false;
  175. break;
  176. case SAVE:
  177. if (record->event.pressed) {
  178. SEND_STRING(SS_LCTL("s"));
  179. }
  180. return false;
  181. break;
  182. /* Colemak mod-dh moves the D key to the qwerty V position
  183. This hack makes apple-V_position do what I mean */
  184. case DHPASTE:
  185. if(get_mods() & MOD_BIT(KC_LGUI) ) {
  186. if (record->event.pressed) {
  187. clear_keyboard_but_mods();
  188. register_code(KC_V);
  189. } else {
  190. unregister_code(KC_V);
  191. }
  192. } else {
  193. if (record->event.pressed) {
  194. register_code(KC_D);
  195. } else {
  196. unregister_code(KC_D);
  197. }
  198. }
  199. return false;
  200. break;
  201. return false;
  202. break;
  203. }
  204. return true;
  205. }
  206. #endif
  207. void keyboard_post_init_user(void) {
  208. // Customise these values to desired behaviour
  209. // debug_enable=true;
  210. //debug_matrix=true;
  211. //debug_keyboard=true;
  212. //debug_mouse=true;
  213. }
  214. void matrix_init_user(void) {
  215. #ifdef RGBLIGHT_ENABLE
  216. #ifdef RGB_DI_PIN
  217. rgblight_setrgb(RGB_GREEN);
  218. #endif
  219. #endif //RGB_matrix
  220. }
  221. // Runs whenever there is a layer state change.
  222. layer_state_t layer_state_set_user(layer_state_t state) {
  223. uint8_t layer = get_highest_layer(state);
  224. switch (layer) {
  225. case 0:
  226. #ifdef RGBLIGHT_COLOR_LAYER_0
  227. rgblight_setrgb(RGBLIGHT_COLOR_LAYER_0);
  228. #else
  229. #ifdef RGBLIGHT_ENABLE
  230. rgblight_init();
  231. #endif
  232. #endif
  233. break;
  234. case 1:
  235. #ifdef RGBLIGHT_COLOR_LAYER_1
  236. rgblight_setrgb(RGBLIGHT_COLOR_LAYER_1);
  237. #endif
  238. break;
  239. case 2: // symbol
  240. #ifdef RGBLIGHT_COLOR_LAYER_2
  241. rgblight_setrgb(RGBLIGHT_COLOR_LAYER_2);
  242. #endif
  243. break;
  244. case 3: // move
  245. #ifdef RGBLIGHT_COLOR_LAYER_3
  246. rgblight_setrgb(RGBLIGHT_COLOR_LAYER_3);
  247. #endif
  248. #ifdef USE_BABLPASTE
  249. babble_led_user(); // poke led to update
  250. #endif // bablepaste
  251. break;
  252. case 4: //delmove ideally we'd turn on a red pixel in addition to the layer indicator.
  253. #ifdef RGBLIGHT_COLOR_LAYER_4
  254. rgblight_setrgb(RGBLIGHT_COLOR_LAYER_4);
  255. #endif
  256. break;
  257. case 5:
  258. #ifdef RGBLIGHT_COLOR_LAYER_5
  259. rgblight_setrgb(RGBLIGHT_COLOR_LAYER_5);
  260. #endif
  261. break;
  262. default:
  263. break;
  264. }
  265. #ifdef VIRTSER_ENABLE
  266. //virtser_send(layer + 48); // ascii 0 is 48
  267. #endif
  268. return state;
  269. };
  270. // custom tapping term lengths.
  271. uint16_t get_tapping_term(uint16_t keycode) {
  272. switch (keycode) {
  273. case LT(_MOV, KC_TAB):
  274. return TAPPING_TERM ;
  275. break;
  276. default:
  277. return TAPPING_TERM;
  278. }
  279. }
  280. #ifdef VIRTSER_ENABLE
  281. /* listen on serial for commands. Either a set of lower case letters mapped to colors,
  282. / or upper case letters that change RGB mode.
  283. / special command C takes 3 numbers as arguments, terminated with a newline or comma or excess digits.
  284. Command C takes 3-5octets of RGB settings. Numbers can be terminated with a comma or period.
  285. 3 octets = set all LED, 4th argument specfies specfic LED, 4+5 specify start and stop LEDs.
  286. */
  287. uint8_t ser_rgbByte[18] ; //ascii string
  288. uint8_t ser_cmd_started =0 ; // are we in process
  289. uint8_t ser_got_RGBbytes =0 ; // how many bytes we've recived.
  290. uint8_t rgb_r[6]; // R, g, b, P1, p2
  291. uint8_t bs=0; // how many bytes into our rgbBytestring.
  292. void virtser_recv(uint8_t serIn) {
  293. #ifdef RGBLIGHT_ENABLE
  294. if ((serIn == 10 ) || (serIn == 13) || ser_got_RGBbytes >=5) { //reached newline or max digits
  295. if (ser_cmd_started) {
  296. ser_cmd_started =0 ; // end loop at newline
  297. virtser_send('|');
  298. if (ser_got_RGBbytes==3) {
  299. rgblight_setrgb( rgb_r[0], rgb_r[1], rgb_r[2]);
  300. }
  301. if (ser_got_RGBbytes ==4) {
  302. if (( rgb_r[3] >=0) && (rgb_r[3] <= RGBLED_NUM) ) { // is pos1 plausible
  303. rgblight_setrgb_at ( rgb_r[0], rgb_r[1], rgb_r[2], rgb_r[3]);
  304. } else {
  305. rgblight_setrgb( rgb_r[0], rgb_r[1], rgb_r[2]);
  306. }
  307. }
  308. if (ser_got_RGBbytes == 5) { // are start and end positions plausible?
  309. if ( (rgb_r[4] >0) && (rgb_r[4] <= RGBLED_NUM) && (rgb_r[4] > rgb_r[3]) &&
  310. (rgb_r[3] >=0) && (rgb_r[3] <= (RGBLED_NUM -1)) ) {
  311. rgblight_setrgb_range(rgb_r[0], rgb_r[1], rgb_r[2], rgb_r[3], rgb_r[4]);
  312. } else {
  313. rgblight_setrgb( rgb_r[0], rgb_r[1], rgb_r[2]);
  314. }
  315. }
  316. } else { // newline outside of command loop, or something that can be ignored.
  317. //virtser_send('.');
  318. }
  319. }
  320. if (1 == ser_cmd_started) { // collecting bytes.
  321. if ( // it is time to compute a byte
  322. ( ( (serIn == ',') || (serIn == '.') ) && (bs > 0) ) || // signal done with the byte.
  323. (bs ==2 )){ //or we know this is last.
  324. if ( (serIn <= '9') && (serIn >='0') ) { //3rd asci digit
  325. ser_rgbByte[bs] = serIn;
  326. bs++;
  327. // virtser_send(serIn);
  328. }
  329. if (bs>3) {
  330. rgb_r[ser_got_RGBbytes]=255;
  331. ser_got_RGBbytes ++;
  332. }
  333. if (bs==3) {
  334. rgb_r[ser_got_RGBbytes] = (ser_rgbByte[0] -'0')*100 + (ser_rgbByte[1] -'0')*10 + (ser_rgbByte[2] -'0' );
  335. ser_got_RGBbytes ++;
  336. }
  337. if (bs ==2 ) {
  338. rgb_r[ser_got_RGBbytes] = (ser_rgbByte[0] -'0')*10 + (ser_rgbByte[1] -'0' );
  339. ser_got_RGBbytes ++;
  340. }
  341. if (bs ==1) {
  342. rgb_r[ser_got_RGBbytes] = (ser_rgbByte[0] -'0');
  343. ser_got_RGBbytes ++;
  344. } // {else wipe & start over}
  345. bs=0;
  346. // virtser_send(ser_got_RGBbytes+'0');
  347. } else { // haven't got enough for our byte / no terminal marker
  348. if ( (serIn <= '9') && (serIn >='0') ) { //ascii only
  349. ser_rgbByte[bs] = serIn;
  350. bs++;
  351. // virtser_send(serIn);
  352. }
  353. }
  354. } else { //not in command loop - next is command w/o arguments, or start of one.
  355. switch (serIn) {
  356. case 'C': // color switch
  357. ser_cmd_started=1;
  358. ser_got_RGBbytes = bs =0;
  359. virtser_send('/');
  360. break;
  361. case 'r': //red
  362. rgblight_setrgb(RGB_RED);
  363. break;
  364. case 'g':
  365. rgblight_setrgb(RGB_GREEN);
  366. break;
  367. case 'b': // color switch
  368. rgblight_setrgb(RGB_BLUE);
  369. break;
  370. case 'w': // color switch
  371. rgblight_setrgb(RGB_WHITE);
  372. break;
  373. case 'o': // color black/off
  374. rgblight_setrgb(0,0,0);
  375. break;
  376. case 'T': // toggle
  377. rgblight_toggle();
  378. break;
  379. case 'P': // pulse led
  380. rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING);
  381. break;
  382. case 'S': // Static
  383. rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT);
  384. break;
  385. case 'U': // Rainbow
  386. rgblight_mode_noeeprom(RGBLIGHT_MODE_RAINBOW_MOOD);
  387. break;
  388. default:
  389. // virtser_send(serIn);
  390. break;
  391. }
  392. }
  393. #endif // RGBLIGHT_ENABLE
  394. }
  395. #endif // VirtSerial