2 Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
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.
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.
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/>.
19 #include <avr/pgmspace.h>
20 #include <util/delay.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"
36 /* ErgoDox keymap definition macro */
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, \
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, \
59 /* matrix positions */ \
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}, \
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 } \
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"
90 static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
91 KEYMAP( // layer 0 : default
93 EQL, 1, 2, 3, 4, 5, ESC,
94 BSLS,Q, W, E, R, T, FN2,
96 LSFT,Z, X, C, V, B, FN1,
97 LGUI,GRV, BSLS,LEFT,RGHT,
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,
112 KEYMAP( // layer 1 : function and symbol keys
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,
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,
133 KEYMAP( // layer 2 : keyboard functions
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,
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,
154 KEYMAP( // layer 3: numpad
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,
165 TRNS,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,
177 /* id for user defined functions */
183 * Fn action definition
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 - set Layer2
189 ACTION_LAYER_TOGGLE(3), // FN3 - toggle Layer3 aka Numpad layer
190 ACTION_LAYER_SET(0, ON_PRESS), // FN4 - set Layer0
193 void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
195 if (id == TEENSY_KEY) {
197 print("\n\nJump to bootloader... ");
199 bootloader_jump(); // should not return
200 print("not supported.\n");
207 #define KEYMAPS_SIZE (sizeof(keymaps) / sizeof(keymaps[0]))
208 #define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))
210 /* translates key to keycode */
211 uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
213 if (layer < KEYMAPS_SIZE) {
214 return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
216 // fall back to layer 0
217 return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]);
221 #if defined(KEYMAP_CUB)
223 // function keymap_fn_to_action will be defined in keymap_cub.h
226 /* translates Fn keycode to action */
227 action_t keymap_fn_to_action(uint8_t keycode)
230 if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
231 action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
233 action.code = ACTION_NO;