]> git.donarmstrong.com Git - tmk_firmware.git/blob - keyboard/ergodox/keymap.c
6a1e4d6508ec43c46d6a4e4e5a5112e326d28b34
[tmk_firmware.git] / keyboard / ergodox / keymap.c
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_util.h"
24 #include "action_code.h"
25 #include "action_macro.h"
26 #include "action_layer.h"
27 #include "bootloader.h"
28 #include "report.h"
29 #include "host.h"
30 #include "print.h"
31 #include "debug.h"
32 #include "keymap.h"
33 #include "ergodox.h"
34
35
36 /* ErgoDox keymap definition macro */
37 #define KEYMAP(                                                 \
38                                                                 \
39     /* left hand, spatial positions */                          \
40     k00,k01,k02,k03,k04,k05,k06,                                \
41     k10,k11,k12,k13,k14,k15,k16,                                \
42     k20,k21,k22,k23,k24,k25,                                    \
43     k30,k31,k32,k33,k34,k35,k36,                                \
44     k40,k41,k42,k43,k44,                                        \
45                             k55,k56,                            \
46                                 k54,                            \
47                         k53,k52,k51,                            \
48                                                                 \
49     /* right hand, spatial positions */                         \
50         k07,k08,k09,k0A,k0B,k0C,k0D,                            \
51         k17,k18,k19,k1A,k1B,k1C,k1D,                            \
52             k28,k29,k2A,k2B,k2C,k2D,                            \
53         k37,k38,k39,k3A,k3B,k3C,k3D,                            \
54                 k49,k4A,k4B,k4C,k4D,                            \
55     k57,k58,                                                    \
56     k59,                                                        \
57     k5C,k5B,k5A )                                               \
58                                                                 \
59    /* matrix positions */                                       \
60    {                                                            \
61     { KC_##k00,KC_##k10,KC_##k20,KC_##k30,KC_##k40,KC_NO   },   \
62     { KC_##k01,KC_##k11,KC_##k21,KC_##k31,KC_##k41,KC_##k51},   \
63     { KC_##k02,KC_##k12,KC_##k22,KC_##k32,KC_##k42,KC_##k52},   \
64     { KC_##k03,KC_##k13,KC_##k23,KC_##k33,KC_##k43,KC_##k53},   \
65     { KC_##k04,KC_##k14,KC_##k24,KC_##k34,KC_##k44,KC_##k54},   \
66     { KC_##k05,KC_##k15,KC_##k25,KC_##k35,KC_NO,   KC_##k55},   \
67     { KC_##k06,KC_##k16,KC_NO,   KC_##k36,KC_NO,   KC_##k56},   \
68                                                                 \
69     { KC_##k07,KC_##k17,KC_NO,   KC_##k37,KC_NO,   KC_##k57},   \
70     { KC_##k08,KC_##k18,KC_##k28,KC_##k38,KC_NO,   KC_##k58},   \
71     { KC_##k09,KC_##k19,KC_##k29,KC_##k39,KC_##k49,KC_##k59},   \
72     { KC_##k0A,KC_##k1A,KC_##k2A,KC_##k3A,KC_##k4A,KC_##k5A},   \
73     { KC_##k0B,KC_##k1B,KC_##k2B,KC_##k3B,KC_##k4B,KC_##k5B},   \
74     { KC_##k0C,KC_##k1C,KC_##k2C,KC_##k3C,KC_##k4C,KC_##k5C},   \
75     { KC_##k0D,KC_##k1D,KC_##k2D,KC_##k3D,KC_##k4D,KC_NO   }    \
76    }
77
78 #if defined(KEYMAP_DVORAK)
79 #include "keymap_dvorak.h"
80 #elif defined(KEYMAP_COLEMAK)
81 #include "keymap_colemak.h"
82 #elif defined(KEYMAP_WORKMAN)
83 #include "keymap_workman.h"
84 #elif defined(KEYMAP_MICRO)
85 #include "keymap_micro.h"
86 #elif defined(KEYMAP_CUB)
87 #include "keymap_cub.h"
88 #else
89
90 static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
91     KEYMAP(  // layer 0 : default
92         // left hand
93         EQL, 1,   2,   3,   4,   5,   ESC,
94         BSLS,Q,   W,   E,   R,   T,   FN2,
95         TAB, A,   S,   D,   F,   G,
96         LSFT,Z,   X,   C,   V,   B,   FN1,
97         LGUI,GRV, BSLS,LEFT,RGHT,
98                                       LCTL,LALT,
99                                            HOME,
100                                  BSPC,DEL, END,
101         // right hand
102              FN3, 6,   7,   8,   9,   0,   MINS,
103              LBRC,Y,   U,   I,   O,   P,   RBRC,
104                   H,   J,   K,   L,   SCLN,QUOT,
105              FN1, N,   M,   COMM,DOT, SLSH,RSFT,
106                        LEFT,DOWN,UP,  RGHT,RGUI,
107         RALT,RCTL,
108         PGUP,
109         PGDN,ENT, SPC
110     ),
111
112     KEYMAP(  // layer 1 : function and symbol keys
113         // left hand
114         TRNS,F1,  F2,  F3,  F4,  F5,  F11,
115         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN4,
116         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
117         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
118         TRNS,TRNS,TRNS,TRNS,TRNS,
119                                       TRNS,TRNS,
120                                            TRNS,
121                                  TRNS,TRNS,TRNS,
122         // right hand
123              F12, F6,  F7,  F8,  F9,  F10, TRNS,
124              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
125                   TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
126              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
127                        TRNS,TRNS,TRNS,TRNS,TRNS,
128         TRNS,TRNS,
129         TRNS,
130         TRNS,TRNS,TRNS
131     ),
132
133     KEYMAP(  // layer 2 : keyboard functions
134         // left hand
135         FN0, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
136         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
137         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
138         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
139         TRNS,TRNS,TRNS,TRNS,TRNS,
140                                       TRNS,TRNS,
141                                            TRNS,
142                                  TRNS,TRNS,TRNS,
143         // right hand
144              FN4, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
145              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
146                   TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
147              TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
148                        TRNS,TRNS,TRNS,TRNS,TRNS,
149         TRNS,TRNS,
150         TRNS,
151         TRNS,TRNS,TRNS
152     ),
153
154     KEYMAP(  // layer 3: numpad
155         // left hand
156         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
157         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
158         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
159         TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
160         TRNS,TRNS,TRNS,TRNS,TRNS,
161                                       TRNS,TRNS,
162                                            TRNS,
163                                  TRNS,TRNS,TRNS,
164         // right hand
165              SLCK,NLCK,PSLS,PAST,PAST,PMNS,BSPC,
166              TRNS,NO,  P7,  P8,  P9,  PMNS,BSPC,
167                   NO,  P4,  P5,  P6,  PPLS,PENT,
168              TRNS,NO,  P1,  P2,  P3,  PPLS,PENT,
169                        P0,  PDOT,SLSH,PENT,PENT,
170         TRNS,TRNS,
171         TRNS,
172         TRNS,TRNS,TRNS
173     ),
174
175 };
176
177 /* id for user defined functions */
178 enum function_id {
179     TEENSY_KEY,
180 };
181
182 /*
183  * Fn action definition
184  */
185 static const uint16_t PROGMEM fn_actions[] = {
186     ACTION_FUNCTION(TEENSY_KEY),                    // FN0 - Teensy key
187     ACTION_LAYER_MOMENTARY(1),                      // FN1 - switch to Layer1
188     ACTION_LAYER_SET(2, ON_PRESS),                  // FN2 - push Layer2
189     ACTION_LAYER_SET(3, ON_PRESS),                  // FN3 - push Layer3
190     ACTION_LAYER_SET(0, ON_PRESS),                  // FN4 - push Layer0
191 };
192
193 void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
194 {
195     if (id == TEENSY_KEY) {
196         clear_keyboard();
197         print("\n\nJump to bootloader... ");
198         _delay_ms(250);
199         bootloader_jump(); // should not return
200         print("not supported.\n");
201     }
202 }
203
204 #endif
205
206
207 #define KEYMAPS_SIZE    (sizeof(keymaps) / sizeof(keymaps[0]))
208 #define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))
209
210 /* translates key to keycode */
211 uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
212 {
213     if (layer < KEYMAPS_SIZE) {
214         return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
215     } else {
216         // fall back to layer 0
217         return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]);
218     }
219 }
220
221 #if defined(KEYMAP_CUB)
222
223 // function keymap_fn_to_action will be defined in keymap_cub.h
224
225 #else
226 /* translates Fn keycode to action */
227 action_t keymap_fn_to_action(uint8_t keycode)
228 {
229     action_t action;
230     if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
231         action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
232     } else {
233         action.code = ACTION_NO;
234     }
235     return action;
236 }
237 #endif
238