]> git.donarmstrong.com Git - tmk_firmware.git/blob - converter/m0110_usb/keymap.c
Merge branch 'm0110'
[tmk_firmware.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 "usb_keyboard.h"
23 #include "keycode.h"
24 #include "print.h"
25 #include "debug.h"
26 #include "util.h"
27 #include "keymap.h"
28
29
30 /* 
31  * The keymap works with both M0110 and M0110A keyboards. As you can see, the M0110A is a superset
32  * of the M0110 keyboard, with only one exception: 'Enter' in M0110 does not exist
33  * on the M0110A, but since it generates a unique scan code which is not used for some other key in
34  * the M0110A, they are totally interchangeable.  In fact, the M0110A is functionally (almost)
35  * identical to the combination of the M0110 along with the M0120 keypad. The only difference
36  * (which is causing some problems as you will read below) is that the M0110+M0120 don't have
37  * dedicated arrow keys, while the M0110A does. However, the M0120 did have arrow keys, which
38  * doubled as the [comma], [/], [*] and [+] keys, when used with the [Shift] key. The M0110A has
39  * substituted the [comma] key with the [=] key, however its scancode is the same.
40  *
41  * Physical layout:
42  * M0110A
43  * ,---------------------------------------------------------. ,---------------.
44  * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Bcksp| |Clr|  =|  /|  *|
45  * |---------------------------------------------------------| |---------------|
46  * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -|
47  * |-----------------------------------------------------'   | |---------------|
48  * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +|
49  * |---------------------------------------------------------| |---------------|
50  * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   |
51  * |---------------------------------------------------------' |-----------|Ent|
52  * |Opt  |Mac    |           Space           |  \|Lft|Rgt|Dn | |      0|  .|   |
53  * `---------------------------------------------------------' `---------------'
54  *
55  * M0110                                                       M0120
56  * ,---------------------------------------------------------. ,---------------.
57  * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Clr|  -|  +|  *|
58  * |---------------------------------------------------------| |---------------|
59  * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \| |  7|  8|  9|  /|
60  * |---------------------------------------------------------| |---------------|
61  * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  ,|
62  * |---------------------------------------------------------| |---------------|
63  * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift   | |  1|  2|  3|   |
64  * `---------------------------------------------------------' |-----------|Ent|
65  *      |Opt|Mac |         Space               |Ent |Opt|      |      0|  .|   |
66  *      `-----------------------------------------------'      `---------------'
67  * With Shift keys on M0120 work as curosor.(-:Left *:Right /:Up ,:Down)
68  *
69  * NOTE: \ is located differently.
70  * NOTE: Enter on M0110 is different from Enter on keypad(M0120 and M0110A).
71  * NOTE: Left Shift and right Shift are logically same key.
72  * NOTE: Left Option and right Option are logically same key.
73  */
74
75 /* Keymap definition Macro
76  * ,---------------------------------------------------------. ,---------------.
77  * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Clr|  =|  /|  *|
78  * |---------------------------------------------------------| |---------------|
79  * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -|
80  * |-----------------------------------------------------'   | |---------------|
81  * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +|
82  * |---------------------------------------------------------| |---------------|
83  * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   |
84  * |---------------------------------------------------------| |-----------|Ent|
85  * |Opt  |Mac    |         Space         |Ent|  \|Lft|Rgt|Dn | |      0|  .|   |
86  * `---------------------------------------------------------' `---------------'
87  * NOTE: Ent between Space and \ means Enter on M0110.
88  */
89 #define KEYMAP( \
90     K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33,  K47,K68,K6D,K62, \
91     K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,      K59,K5B,K5C,K4E, \
92     K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,    K24,  K56,K57,K58,K66, \
93     K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C,        K4D,  K53,K54,K55,K4C, \
94     K3A,K37,            K31,            K34,K2A,K46,K42,K48,  K52,    K41      \
95 ) { \
96     { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
97     { KC_##K08, KC_##K09, KC_NO,    KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \
98     { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \
99     { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \
100     { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \
101     { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \
102     { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_NO,    KC_NO,    KC_##K37 }, \
103     { KC_##K38, KC_##K39, KC_##K3A, KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO    }, \
104     { KC_NO,    KC_##K41, KC_##K42, KC_NO,    KC_NO,    KC_NO,    KC_##K46, KC_##K47 }, \
105     { KC_##K48, KC_NO,    KC_NO,    KC_NO,    KC_##K4C, KC_##K4D, KC_##K4E, KC_NO    }, \
106     { KC_NO,    KC_NO,    KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \
107     { KC_##K58, KC_##K59, KC_NO,    KC_##K5B, KC_##K5C, KC_NO,    KC_NO,    KC_NO    }, \
108     { KC_NO,    KC_NO,    KC_##K62, KC_NO,    KC_NO,    KC_NO,    KC_##K66, KC_NO    }, \
109     { KC_##K68, KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_##K6D, KC_NO,    KC_NO    }, \
110 }
111
112 #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
113
114
115 // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
116 static const uint8_t PROGMEM fn_layer[] = {
117     1,              // Fn0
118     0,              // Fn1
119     0,              // Fn2
120     0,              // Fn3
121     0,              // Fn4
122     0,              // Fn5
123     0,              // Fn6
124     0               // Fn7
125 };
126
127 // Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.
128 // See layer.c for details.
129 static const uint8_t PROGMEM fn_keycode[] = {
130     KC_NO,          // Fn0
131     KC_NO,          // Fn1
132     KC_NO,          // Fn2
133     KC_NO,          // Fn3
134     KC_NO,          // Fn4
135     KC_NO,          // Fn5
136     KC_NO,          // Fn6
137     KC_NO           // Fn7
138 };
139
140 static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
141     /* Default:
142      * ,---------------------------------------------------------. ,---------------.
143      * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Ctl|  =|  /|  *|
144      * |---------------------------------------------------------| |---------------|
145      * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -|
146      * |-----------------------------------------------------'   | |---------------|
147      * |Fn0   |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +|
148      * |---------------------------------------------------------| |---------------|
149      * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   |
150      * |---------------------------------------------------------| |-----------|Ent|
151      * |Alt  |Gui    |         Space         |Ctl|  \|Lft|Rgt|Dn | |      0|  .|   |
152      * `---------------------------------------------------------' `---------------'
153      */
154     KEYMAP(
155     GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,    LCTL,EQL, PSLS,PAST,
156     TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,         P7,  P8,  P9,  PMNS,
157     FN0, A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,     ENT,     P4,  P5,  P6,  PPLS,
158     LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,          UP,      P1,  P2,  P3,  PENT,
159     LALT,LGUI,               SPC,                LCTL,BSLS,LEFT,RGHT,DOWN,    P0,       PDOT
160     ),
161     /* Cursor Layer(WASD, IJKL)
162      * ,---------------------------------------------------------. ,---------------.
163      * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk|  =|  /|  *|
164      * |---------------------------------------------------------| |---------------|
165      * |Caps |Hom| Up|PgU|   |   |   |PgU| Up|Hom|Psc|Slk|Pau|   | |  7|  8|  9|  -|
166      * |-----------------------------------------------------'   | |---------------|
167      * |Fn0   |Lef|Dow|Rig|   |   |   |Lef|Dow|Rig|   |   |Return| |  4|  5|  6|  +|
168      * |---------------------------------------------------------| |---------------|
169      * |Shift   |End|   |PgD|   |   |   |PgD|   |End|   |Shif|PgU| |  1|  2|  3|   |
170      * |---------------------------------------------------------| |-----------|Ent|
171      * |Alt  |Gui    |         Space        |Gui |Ins|Hom|End|PgD| |      0|  .|   |
172      * `---------------------------------------------------------' `---------------'
173      */
174     KEYMAP(
175     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL,     NLCK,EQL, PSLS,PAST,
176     CAPS,HOME,UP,  PGUP,NO,  NO,  NO,  PGUP,UP,  HOME,PSCR,SLCK,PAUS,         P7,  P8,  P9,  PMNS,
177     FN0, LEFT,DOWN,RGHT,NO,  NO,  NO,  LEFT,DOWN,RGHT,NO,  NO,       ENT,     P4,  P5,  P6,  PPLS,
178     LSFT,END, NO,  PGDN,NO,  NO,  NO,  PGDN,NO,  END, NO,            PGUP,    P1,  P2,  P3,  PENT,
179     LALT,LGUI,               SPC,                LCTL,INS, HOME,END, PGDN,    P0,       PDOT
180     ),
181 };
182
183
184 uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
185 {
186     return KEYCODE(layer, row, col);
187 }
188
189 uint8_t keymap_fn_layer(uint8_t index)
190 {
191     return pgm_read_byte(&fn_layer[index]);
192 }
193
194 uint8_t keymap_fn_keycode(uint8_t index)
195 {
196     return pgm_read_byte(&fn_keycode[index]);
197 }