]> git.gir.st - tmk_keyboard.git/blob - converter/m0110_usb/keymap.c
Documentation: small mistake
[tmk_keyboard.git] / converter / m0110_usb / keymap.c
1 /*
2 Copyright 2011,2012 Jun Wako <wakojun@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 /* M0110A Support was contributed by skagon@github */
18
19 #include <stdint.h>
20 #include <stdbool.h>
21 #include <avr/pgmspace.h>
22 #include "keycode.h"
23 #include "print.h"
24 #include "debug.h"
25 #include "util.h"
26 #include "keymap.h"
27
28
29 /*
30 * The keymap works with both M0110 and M0110A keyboards. As you can see, the M0110A is a superset
31 * of the M0110 keyboard, with only one exception: 'Enter' in M0110 does not exist
32 * on the M0110A, but since it generates a unique scan code which is not used for some other key in
33 * the M0110A, they are totally interchangeable. In fact, the M0110A is functionally (almost)
34 * identical to the combination of the M0110 along with the M0120 keypad. The only difference
35 * (which is causing some problems as you will read below) is that the M0110+M0120 don't have
36 * dedicated arrow keys, while the M0110A does. However, the M0120 did have arrow keys, which
37 * doubled as the [comma], [/], [*] and [+] keys, when used with the [Shift] key. The M0110A has
38 * substituted the [comma] key with the [=] key, however its scancode is the same.
39 *
40 * Physical layout:
41 * M0110A
42 * ,---------------------------------------------------------. ,---------------.
43 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Bcksp| |Clr| =| /| *|
44 * |---------------------------------------------------------| |---------------|
45 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
46 * |-----------------------------------------------------' | |---------------|
47 * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter | | 4| 5| 6| +|
48 * |---------------------------------------------------------| |---------------|
49 * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
50 * |---------------------------------------------------------' |-----------|Ent|
51 * |Opt |Mac | Space | \|Lft|Rgt|Dn | | 0| .| |
52 * `---------------------------------------------------------' `---------------'
53 *
54 * M0110 M0120
55 * ,---------------------------------------------------------. ,---------------.
56 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| -| +| *|
57 * |---------------------------------------------------------| |---------------|
58 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9| /|
59 * |---------------------------------------------------------| |---------------|
60 * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter | | 4| 5| 6| ,|
61 * |---------------------------------------------------------| |---------------|
62 * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| |
63 * `---------------------------------------------------------' |-----------|Ent|
64 * |Opt|Mac | Space |Ent |Opt| | 0| .| |
65 * `-----------------------------------------------' `---------------'
66 * With Shift keys on M0120 work as curosor.(-:Left *:Right /:Up ,:Down)
67 *
68 * NOTE: \ is located differently.
69 * NOTE: Enter on M0110 is different from Enter on keypad(M0120 and M0110A).
70 * NOTE: Left Shift and right Shift are logically same key.
71 * NOTE: Left Option and right Option are logically same key.
72 */
73
74 /* Keymap definition Macro
75 * ,---------------------------------------------------------. ,---------------.
76 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| =| /| *|
77 * |---------------------------------------------------------| |---------------|
78 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
79 * |-----------------------------------------------------' | |---------------|
80 * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter | | 4| 5| 6| +|
81 * |---------------------------------------------------------| |---------------|
82 * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
83 * |---------------------------------------------------------| |-----------|Ent|
84 * |Opt |Mac | Space |Ent| \|Lft|Rgt|Dn | | 0| .| |
85 * `---------------------------------------------------------' `---------------'
86 * NOTE: Ent between Space and \ means Enter on M0110.
87 */
88 #define KEYMAP( \
89 K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K68,K6D,K62, \
90 K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E, K59,K5B,K5C,K4E, \
91 K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K66, \
92 K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K4D, K53,K54,K55,K4C, \
93 K3A,K37, K31, K34,K2A,K46,K42,K48, K52, K41 \
94 ) { \
95 { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
96 { KC_##K08, KC_##K09, KC_NO, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \
97 { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \
98 { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \
99 { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \
100 { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \
101 { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_NO, KC_NO, KC_##K37 }, \
102 { KC_##K38, KC_##K39, KC_##K3A, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
103 { KC_NO, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_NO, KC_##K46, KC_##K47 }, \
104 { KC_##K48, KC_NO, KC_NO, KC_NO, KC_##K4C, KC_##K4D, KC_##K4E, KC_NO }, \
105 { KC_NO, KC_NO, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \
106 { KC_##K58, KC_##K59, KC_NO, KC_##K5B, KC_##K5C, KC_NO, KC_NO, KC_NO }, \
107 { KC_NO, KC_NO, KC_##K62, KC_NO, KC_NO, KC_NO, KC_##K66, KC_NO }, \
108 { KC_##K68, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K6D, KC_NO, KC_NO }, \
109 }
110
111 #ifdef KEYMAP_SECTION_ENABLE
112 const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = {
113 #else
114 static const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {
115 #endif
116 /* Default:
117 * ,---------------------------------------------------------. ,---------------.
118 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| =| /| *|
119 * |---------------------------------------------------------| |---------------|
120 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
121 * |-----------------------------------------------------' | |---------------|
122 * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter | | 4| 5| 6| +|
123 * |---------------------------------------------------------| |---------------|
124 * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
125 * |---------------------------------------------------------| |-----------|Ent|
126 * |Ctl |Gui | Space |Alt| \|Lft|Rgt|Dn | | 0| .| |
127 * `---------------------------------------------------------' `---------------'
128 */
129 [0] = KEYMAP(
130 GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, CLR, EQL, PSLS,PAST,
131 TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS,
132 LCAP,A, S, D, F, G, H, J, K, L, SCLN,QUOT, FN15, P4, P5, P6, PPLS,
133 LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, UP, P1, P2, P3, PENT,
134 LCTL,LGUI, FN16, LALT,FN31,LEFT,RGHT,DOWN, P0, PDOT
135 ),
136 /* Cursor Layer(WASD, IJKL)
137 * ,---------------------------------------------------------. ,---------------.
138 * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk| =| /| *|
139 * |---------------------------------------------------------| |---------------|
140 * |Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up |Ins| | | 7| 8| 9| -|
141 * |-----------------------------------------------------' | |---------------|
142 * |Caps |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Enter | | 4| 5| 6| +|
143 * |---------------------------------------------------------| |---------------|
144 * |Shift |End| |PgD| | | | |End|PgD|Dow|Shif|PgU| | 1| 2| 3| |
145 * |---------------------------------------------------------| |-----------|Ent|
146 * |Ctl |Gui | Space |Alt | \|Hom|End|PgD| | 0| .| |
147 * `---------------------------------------------------------' `---------------'
148 */
149 [3] = KEYMAP(
150 ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
151 CAPS,HOME,UP, PGUP,NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, INS, P7, P8, P9, PMNS,
152 LCAP,LEFT,DOWN,RGHT,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, FN15, P4, P5, P6, PPLS,
153 LSFT,END, NO, PGDN,NO, NO, NO, NO, END, PGDN,DOWN, PGUP, P1, P2, P3, PENT,
154 LCTL,LGUI, FN16, LALT,FN31,HOME,END, PGDN, P0, PDOT
155 ),
156 [4] = KEYMAP(
157 ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST,
158 CAPS,HOME,UP, PGUP,NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, INS, P7, P8, P9, PMNS,
159 LCAP,LEFT,DOWN,RGHT,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, FN15, P4, P5, P6, PPLS,
160 LSFT,END, NO, PGDN,NO, NO, NO, NO, END, PGDN,DOWN, PGUP, P1, P2, P3, PENT,
161 LCTL,LGUI, FN16, LALT,FN31,HOME,END, PGDN, P0, PDOT
162 ),
163 [7] = {},
164 };
165
166
167 /*
168 * Fn action definition
169 */
170 #ifdef KEYMAP_SECTION_ENABLE
171 const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = {
172 #else
173 static const uint16_t fn_actions[] PROGMEM = {
174 #endif
175 [0] = ACTION_LAYER_MOMENTARY(1),
176 [1] = ACTION_LAYER_MOMENTARY(2),
177 [2] = ACTION_LAYER_MOMENTARY(3),
178 [3] = ACTION_LAYER_MOMENTARY(4),
179 [4] = ACTION_LAYER_MOMENTARY(5),
180 [5] = ACTION_LAYER_MOMENTARY(6),
181 [6] = ACTION_LAYER_MOMENTARY(7),
182 [7] = ACTION_LAYER_TOGGLE(1),
183 [8] = ACTION_LAYER_TOGGLE(2),
184 [9] = ACTION_LAYER_TOGGLE(3),
185 [10] = ACTION_LAYER_TAP_TOGGLE(1),
186 [11] = ACTION_LAYER_TAP_TOGGLE(2),
187 [12] = ACTION_LAYER_TAP_TOGGLE(3),
188 [13] = ACTION_LAYER_TAP_KEY(1, KC_F),
189 [14] = ACTION_LAYER_TAP_KEY(2, KC_J),
190 [15] = ACTION_LAYER_TAP_KEY(3, KC_ENTER),
191 [16] = ACTION_LAYER_TAP_KEY(4, KC_SPACE),
192 [17] = ACTION_LAYER_TAP_KEY(5, KC_SCOLON),
193 [18] = ACTION_LAYER_TAP_KEY(6, KC_QUOTE),
194 [19] = ACTION_LAYER_TAP_KEY(7, KC_SLASH),
195 [20] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_SPACE),
196 [21] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_SPACE),
197 [22] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_QUOTE),
198 [23] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENTER),
199 [24] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_ESC),
200 [25] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPACE),
201 [26] = ACTION_MODS_ONESHOT(MOD_LCTL),
202 [27] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_ESC),
203 [28] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_BSPACE),
204 [29] = ACTION_MODS_ONESHOT(MOD_LSFT),
205 [30] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_GRAVE),
206 [31] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_BSLASH),
207 };
208
209
210
211 /* translates key to keycode */
212 uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
213 {
214 return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
215 }
216
217 /* translates Fn index to action */
218 action_t keymap_fn_to_action(uint8_t keycode)
219 {
220 action_t action;
221 action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
222 return action;
223 }
Imprint / Impressum