Advertisement
Guest User

keymap.c

a guest
Apr 16th, 2014
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.76 KB | None | 0 0
  1. /*
  2. Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
  3.  
  4. This program is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 2 of the License, or
  7. (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. GNU General Public License for more details.
  13.  
  14. You should have received a copy of the GNU General Public License
  15. along with this program.  If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. #include <stdint.h>
  18. #include <stdbool.h>
  19. #include <avr/pgmspace.h>
  20. #include <util/delay.h>
  21. #include "keycode.h"
  22. #include "action.h"
  23. #include "action_code.h"
  24. #include "action_macro.h"
  25. #include "bootloader.h"
  26. #include "report.h"
  27. #include "host.h"
  28. #include "print.h"
  29. #include "debug.h"
  30. #include "keymap.h"
  31. #include "ergodox.h"
  32.  
  33.  
  34. /* ErgoDox keymap definition macro */
  35. #define KEYMAP(                                                 \
  36.                                                                 \
  37.     /* left hand, spatial positions */                          \
  38.     k00,k01,k02,k03,k04,k05,k06,                                \
  39.     k10,k11,k12,k13,k14,k15,k16,                                \
  40.     k20,k21,k22,k23,k24,k25,                                    \
  41.     k30,k31,k32,k33,k34,k35,k36,                                \
  42.     k40,k41,k42,k43,k44,                                        \
  43.                             k55,k56,                            \
  44.                                 k54,                            \
  45.                         k53,k52,k51,                            \
  46.                                                                 \
  47.     /* right hand, spatial positions */                         \
  48.         k07,k08,k09,k0A,k0B,k0C,k0D,                            \
  49.         k17,k18,k19,k1A,k1B,k1C,k1D,                            \
  50.             k28,k29,k2A,k2B,k2C,k2D,                            \
  51.         k37,k38,k39,k3A,k3B,k3C,k3D,                            \
  52.                 k49,k4A,k4B,k4C,k4D,                            \
  53.     k57,k58,                                                    \
  54.     k59,                                                        \
  55.     k5C,k5B,k5A )                                               \
  56.                                                                 \
  57.    /* matrix positions */                                       \
  58.    {                                                            \
  59.     { KC_##k00,KC_##k10,KC_##k20,KC_##k30,KC_##k40,KC_NO   },   \
  60.     { KC_##k01,KC_##k11,KC_##k21,KC_##k31,KC_##k41,KC_##k51},   \
  61.     { KC_##k02,KC_##k12,KC_##k22,KC_##k32,KC_##k42,KC_##k52},   \
  62.     { KC_##k03,KC_##k13,KC_##k23,KC_##k33,KC_##k43,KC_##k53},   \
  63.     { KC_##k04,KC_##k14,KC_##k24,KC_##k34,KC_##k44,KC_##k54},   \
  64.     { KC_##k05,KC_##k15,KC_##k25,KC_##k35,KC_NO,   KC_##k55},   \
  65.     { KC_##k06,KC_##k16,KC_NO,   KC_##k36,KC_NO,   KC_##k56},   \
  66.                                                                 \
  67.     { KC_##k07,KC_##k17,KC_NO,   KC_##k37,KC_NO,   KC_##k57},   \
  68.     { KC_##k08,KC_##k18,KC_##k28,KC_##k38,KC_NO,   KC_##k58},   \
  69.     { KC_##k09,KC_##k19,KC_##k29,KC_##k39,KC_##k49,KC_##k59},   \
  70.     { KC_##k0A,KC_##k1A,KC_##k2A,KC_##k3A,KC_##k4A,KC_##k5A},   \
  71.     { KC_##k0B,KC_##k1B,KC_##k2B,KC_##k3B,KC_##k4B,KC_##k5B},   \
  72.     { KC_##k0C,KC_##k1C,KC_##k2C,KC_##k3C,KC_##k4C,KC_##k5C},   \
  73.     { KC_##k0D,KC_##k1D,KC_##k2D,KC_##k3D,KC_##k4D,KC_NO   }    \
  74.    }
  75.  
  76. #if defined(KEYMAP_DVORAK)
  77. #include "keymap_dvorak.h"
  78. #elif defined(KEYMAP_COLEMAK)
  79. #include "keymap_colemak.h"
  80. #elif defined(KEYMAP_WORKMAN)
  81. #include "keymap_workman.h"
  82. #elif defined(KEYMAP_CUB)
  83. #include "keymap_cub.h"
  84. #else
  85.  
  86. static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  87.     KEYMAP(  // layer 0: default Querty
  88.         // left hand
  89.         EQL, 1,   2,   3,   4,   5,   ESC,
  90.         BSLS,Q,   W,   E,   R,   T,   FN2,
  91.         TAB, A,   S,   D,   F,   G,
  92.         LSFT,Z,   X,   C,   V,   B,   FN1,
  93.         LGUI,GRV, BSLS,LEFT,RGHT,
  94.                                       LCTL,LALT,
  95.                                            HOME,
  96.                                  BSPC,DEL, END,
  97.         // right hand
  98.              ESC, 6,   7,   8,   9,   0,   MINS, // First key free to remap
  99.              LBRC,Y,   U,   I,   O,   P,   RBRC,
  100.                   H,   J,   K,   L,   SCLN,QUOT,
  101.              FN3, N,   M,   COMM,DOT, SLSH,RSFT,
  102.                        LEFT,DOWN,UP,  RGHT,RGUI,
  103.         RALT,RCTL,
  104.         PGUP,
  105.         PGDN,ENT, SPC
  106.     ),
  107.    
  108.     KEYMAP(  // layer 1: Colemak mapping
  109.         // left hand
  110.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  111.         TRNS,TRNS,TRNS,   F,   P,   G,TRNS,
  112.         TRNS,TRNS,   R,   S,   T,   D,
  113.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  114.         TRNS,TRNS,TRNS,TRNS,TRNS,
  115.                                       TRNS,TRNS,
  116.                                            TRNS,
  117.                                  TRNS,TRNS,TRNS,
  118.         // right hand
  119.              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  120.              TRNS,   J,   L,   U,   Y,SCLN,TRNS,
  121.                   TRNS,   N,   E,   I,   O,TRNS,
  122.              TRNS,   K,TRNS,TRNS,TRNS,TRNS,TRNS,
  123.                        TRNS,TRNS,TRNS,TRNS,TRNS,
  124.         TRNS,TRNS,
  125.         TRNS,
  126.         TRNS,TRNS,TRNS
  127.     ),
  128.    
  129.     KEYMAP(  // layer 2: Plover stenographic keyboard
  130.         // left hand
  131.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  132.          TAB,   Q,   W,   E,  R,  T,TRNS,
  133.         TRNS,   A,   S,   D,  F,  G,
  134.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  135.         TRNS,TRNS,TRNS,TRNS,TRNS,
  136.                                       TRNS,TRNS,
  137.                                            TRNS,
  138.                                     C,   V, SPC,
  139.         // right hand
  140.              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  141.              TRNS,   Y,   U,   I,   O,   P,LBRC,
  142.                      H,   J,   K,   L,SCLN,QUOT,
  143.              TRNS,BSPC,HOME,  UP, END,PGUP,ENT,
  144.                        LEFT,DOWN,RGHT,PGDN,TRNS,
  145.         TRNS,TRNS,
  146.         TRNS,
  147.          ENT,   N,   M
  148.     ),    
  149.  
  150.     KEYMAP(  // layer 3: Gaming layer
  151.         // left hand
  152.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  153.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  154.          TAB,   Z,   X,   C,   V,   B,
  155.         LCTL,   Q,   W,   E,   R,   T,TRNS,
  156.         LSFT,   A,   S,   D,   F,
  157.                                       TRNS,TRNS,
  158.                                            TRNS,
  159.                                   SPC,LALT,TRNS,
  160.         // right hand
  161.              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  162.              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  163.                   TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  164.              TRNS,BSPC,HOME,  UP, END,PGUP,ENT,
  165.                        LEFT,DOWN,RGHT,PGDN,TRNS,
  166.         TRNS,TRNS,
  167.         TRNS,
  168.         TRNS,TRNS,TRNS
  169.     ),
  170.    
  171.     KEYMAP(  // layer 4: Metalayer
  172.         // left hand
  173.          FN0,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  174.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  175.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  176.          FN7,TRNS,TRNS, FN4, FN5, FN6,TRNS,
  177.         TRNS,TRNS,TRNS,TRNS,TRNS,
  178.                                       TRNS,TRNS,
  179.                                            TRNS,
  180.                                  TRNS,TRNS,TRNS,
  181.         // right hand
  182.              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  183.              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  184.                   TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  185.              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  186.                        TRNS,TRNS,TRNS,TRNS,TRNS,
  187.         TRNS,TRNS,
  188.         TRNS,
  189.         TRNS,TRNS,TRNS
  190.     ),
  191.  
  192.     KEYMAP(  // layer 5: function, system, and media layer
  193.         // left hand
  194.         TRNS,F1,  F2,  F3,  F4,  F5,  F11,
  195.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN4,
  196.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  197.         TRNS,TRNS,MPLY,MSEL,VOLU,MUTE,TRNS,
  198.         TRNS,MPRV,MSTP,MNXT,VOLD,
  199.                                       TRNS,TRNS,
  200.                                            TRNS,
  201.                                  TRNS,TRNS,TRNS,
  202.         // right hand
  203.              F12, F6,  F7,  F8,  F9,  F10, TRNS,
  204.              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  205.                   TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  206.              TRNS,MAIL,CALC,TRNS,WBAK,WFWD,WSCH,
  207.                        TRNS,TRNS,TRNS,WSTP,WHOM,
  208.         TRNS,TRNS,
  209.         TRNS,
  210.         TRNS,TRNS,TRNS
  211.     ),
  212.  
  213.     KEYMAP(  // layer 6: Numpad Layer
  214.         // left hand
  215.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  216.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  217.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  218.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  219.         TRNS,TRNS,TRNS,TRNS,TRNS,
  220.                                       TRNS,TRNS,
  221.                                            TRNS,
  222.                                  TRNS,TRNS,TRNS,
  223.         // right hand
  224.              SLCK,NLCK,PSLS,PAST,PAST,PMNS,BSPC,
  225.              TRNS,NO,  P7,  P8,  P9,  PMNS,BSPC,
  226.                   NO,  P4,  P5,  P6,  PPLS,PENT,
  227.              TRNS,NO,  P1,  P2,  P3,  PPLS,PENT,
  228.                        P0,  PDOT,SLSH,PENT,PENT,
  229.         TRNS,TRNS,
  230.         TRNS,
  231.         TRNS,TRNS,TRNS
  232.     ),
  233.    
  234.     KEYMAP(  // layer 7: Mouse layer
  235.         // left hand
  236.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  237.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  238.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  239.         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  240.         TRNS,TRNS,TRNS,TRNS,TRNS,
  241.                                       TRNS,TRNS,
  242.                                            TRNS,
  243.                                  TRNS,TRNS,TRNS,
  244.         // right hand
  245.              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  246.              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  247.                   TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
  248.              TRNS,BTN1,WH_L,MS_U,WH_R,WH_U,BTN3,
  249.                        MS_L,MS_D,MS_R,WH_D,BTN2,
  250.         TRNS,TRNS,
  251.         TRNS,
  252.         TRNS,TRNS,TRNS
  253.     ),
  254.    
  255. };
  256.  
  257. /* id for user defined functions */
  258. enum function_id {
  259.     TEENSY_KEY,
  260. };
  261.  
  262. /*
  263.  * Fn action definition
  264.  */
  265. static const uint16_t PROGMEM fn_actions[] = {
  266.     ACTION_FUNCTION(TEENSY_KEY),                    // FN0 - Teensy key
  267.     ACTION_LAYER_MOMENTARY(4),                      // FN1 - hold for Metalayer
  268.     ACTION_LAYER_TOGGLE(6),                         // FN2 - toggle Numpad
  269.     ACTION_LAYER_MOMENTARY(5),                      // FN3 - hold for F keys
  270.    
  271.     ACTION_LAYER_TOGGLE(1),                         // FN4 - toggle Colemak
  272.     ACTION_LAYER_TOGGLE(2),                         // FN5 - toggle Stenographic
  273.     ACTION_LAYER_TOGGLE(3),                         // FN6 - toggle Gaming
  274.     ACTION_LAYER_TOGGLE(7),                         // FN6 - toggle Mouse
  275. };
  276.  
  277. void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
  278. {
  279.     if (id == TEENSY_KEY) {
  280.         clear_keyboard();
  281.         print("\n\nJump to bootloader... ");
  282.         _delay_ms(250);
  283.         bootloader_jump(); // should not return
  284.         print("not supported.\n");
  285.     }
  286. }
  287.  
  288. #endif
  289.  
  290.  
  291. #define KEYMAPS_SIZE    (sizeof(keymaps) / sizeof(keymaps[0]))
  292. #define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))
  293.  
  294. /* translates key to keycode */
  295. uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
  296. {
  297.     if (layer < KEYMAPS_SIZE) {
  298.         return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
  299.     } else {
  300.         // fall back to layer 0
  301.         return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]);
  302.     }
  303. }
  304.  
  305. /* translates Fn keycode to action */
  306. action_t keymap_fn_to_action(uint8_t keycode)
  307. {
  308.     action_t action;
  309.     if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
  310.         action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
  311.     } else {
  312.         action.code = ACTION_NO;
  313.     }
  314.     return action;
  315. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement