]> git.donarmstrong.com Git - tmk_firmware.git/blob - converter/terminal_bluefruit/keymap.c
716590a4564febb1b318476ac0d454213a8481fe
[tmk_firmware.git] / converter / terminal_bluefruit / keymap.c
1 /*
2 Converter for 70% IBM Terminal Keyboard
3 Author: Benjamin Gould, 2013
4 Based on code Copyright 2011 Jun Wako <wakojun@gmail.com>
5
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include <stdint.h>
21 #include <stdbool.h>
22 #include <avr/pgmspace.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
32 /* 
33  * IBM Terminal keyboard 6110345(122keys)/1392595(102keys)
34  * http://geekhack.org/showthread.php?10737-What-Can-I-Do-With-a-Terminal-Model-M
35  * http://www.seasip.info/VintagePC/ibm_1391406.html
36  *
37  * Keymap array:
38  *     8 bytes
39  *   +---------+
40  *  0|         |
41  *  :|         | 0x00-0x87
42  *  ;|         |
43  * 17|         |
44  *   +---------+
45  */
46 #define KEYMAP( \
47                   K08,K10,K18,K20,K28,K30,K38,K40,K48,K50,K57,K5F,                                         \
48                   K07,K0F,K17,K1F,K27,K2F,K37,K3F,K47,K4F,K56,K5E,                                         \
49                                                                                                            \
50     K05,K06,  K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K5D,K66,  K67,K6E,K6F,  K76,K77,K7E,K84, \
51     K04,K0C,  K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,    K5C,  K64,K65,K6D,  K6C,K75,K7D,K7C, \
52     K03,K0B,  K14,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52,    K53,K5A,      K63,      K6B,K73,K74,K7B, \
53     K83,K0A,  K12,K13,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A,    K51,K59,  K61,K62,K6A,  K69,K72,K7A,K79, \
54     K01,K09,  K11,    K19,            K29,                    K39,    K58,      K60,      K68,K70,K71,K78  \
55 ) { \
56     { KC_NO,    KC_##K01, KC_NO,    KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
57     { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \
58     { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \
59     { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \
60     { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \
61     { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \
62     { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \
63     { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \
64     { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47 }, \
65     { KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F }, \
66     { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \
67     { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_##K5E, KC_##K5F }, \
68     { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \
69     { KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_##K6D, KC_##K6E, KC_##K6F }, \
70     { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \
71     { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_##K7E, KC_NO    }, \
72     { KC_NO,    KC_NO,    KC_NO,    KC_##K83, KC_##K84, KC_NO,    KC_NO,    KC_NO,   }, \
73 }
74
75 static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
76     /* 0: default
77      * ,---.   ,---------------. ,---------------. ,---------------. ,-----------.
78      * |Esc|   |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|
79      * `---'   `---------------' `---------------' `---------------' `-----------'
80      * ,-----------------------------------------------------------. ,-----------. ,---------------.
81      * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|  \|BS | |Ins|Hom|PgU| |NmL|  /|  *|  -|
82      * |-----------------------------------------------------------| |-----------| |---------------|
83      * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|    \| |Del|End|PgD| |  7|  8|  9|   |
84      * |-----------------------------------------------------------| `-----------' |-----------|  +|
85      * |CapsLo|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|  #|Retu|               |  4|  5|  6|   |
86      * |-----------------------------------------------------------|     ,---.     |---------------|
87      * |Shif|  \|  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shift     |     |Up |     |  1|  2|  3|   |
88      * |-----------------------------------------------------------| ,-----------. |-----------|Ent|
89      * |Ctrl|    |Alt |          Space              |Alt |    |Ctrl| |Lef|Dow|Rig| |      0|  .|   |
90      * `----'    `---------------------------------------'    `----' `-----------' `---------------'
91      */
92 /*
93     KEYMAP(
94                      F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24,
95                      F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,
96
97     PSCR,ESC,   GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, JYEN,BSPC,  INS, HOME,PGUP,  NLCK,PSLS,PAST,PMNS,
98     SLCK,INT4,  TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,     BSLS,  DEL, END, PGDN,  P7,  P8,  P9,  PPLS,
99     PAUS,INT5,  CAPS,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,     NUHS,ENT,        UP,         P4,  P5,  P6,  PCMM,
100     APP, INT6,  LSFT,NUBS,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,     RO,  RSFT,  LEFT,INT2,RGHT,  P1,  P2,  P3,  PENT,
101     RGUI,LGUI,  LCTL,     LALT,               SPC,                          RALT,     RCTL,       DOWN,       NO,  P0,  PDOT,NO
102     ),
103 */
104     /*
105     KEYMAP(
106                      TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
107                      TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
108
109     TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,  TRNS,TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,
110     TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,  TRNS,TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,
111     TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,TRNS,       TRNS,       TRNS,TRNS,TRNS,TRNS,
112     TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,TRNS,  TRNS,TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,
113     TRNS,TRNS,  TRNS,     TRNS,               TRNS,                         TRNS,     TRNS,       TRNS,       TRNS,TRNS,TRNS,TRNS
114     ),
115     */
116     // pseudo ANSI
117
118     KEYMAP(
119                      FN0, NO,  NO,  NO,  NO,  NO,  NO,  NO,  NO,  NO,  NO,  NO,  
120                      PSCR,PAUS,PGUP,PGDN,HOME,END, INS, DEL, LEFT,DOWN,UP,  RGHT,
121
122     NO,  NO,    ESC, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, GRV, BSPC,  NO,  NO,  NO,    NO,  NO,  NO,  NO,
123     NO,  NO,    TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,     BSLS,  NO,  NO,  NO,    NO,  NO,  NO,  NO,
124     NO,  NO,    LCTL,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,     BSLS,ENT,        NO,         NO,  NO,  NO,  NO,
125     NO,  NO,    LSFT,FN1 ,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,     FN1, RSFT,  NO,  NO,  NO,    NO,  NO,  NO,  NO,
126     NO,  NO,    LCTL,     LALT,               SPC,                          LGUI,     APP,        NO,         NO,  NO,  NO,  NO
127     ),
128     
129     // Momentary Function Layer
130     KEYMAP(
131                      TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
132                      TRNS,MUTE,VOLD,VOLU,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
133
134     TRNS,TRNS,  TRNS,F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL,   TRNS,TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,
135     TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,HOME,UP  ,END,      TRNS,  TRNS,TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,
136     TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,MS_L,MS_D,MS_U,MS_R,LEFT,DOWN,     RGHT,TRNS,       TRNS,       TRNS,TRNS,TRNS,TRNS,
137     TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,PGDN,TRNS,     TRNS,RSFT,  TRNS,TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,
138     TRNS,TRNS,  BTN2,     TRNS,               BTN1,                         RALT,     RCTL,       TRNS,       TRNS,TRNS,TRNS,TRNS
139     ),
140     
141     // Mouse Layer
142     KEYMAP(
143                      FN0, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
144                      TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
145
146     TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,NO,  TRNS,  NO,  NO,  NO,    NO,  NO,  NO,  NO,
147     TRNS,TRNS,  TRNS,NO,  NO,  MS_U,NO,  NO,  WH_L,WH_D,WH_U,WH_R,NO,  NO,  NO,       TRNS,  NO,  NO,  NO,    NO,  NO,  NO,  NO,
148     TRNS,TRNS,  BTN2,BTN1,MS_L,MS_D,MS_R,NO,  MS_L,MS_D,MS_U,MS_R,NO,  NO,       NO,  ENT,        NO,         NO,  NO,  NO,  NO,
149     TRNS,TRNS,  TRNS,TRNS,NO,  NO,  NO,  NO,  NO,  NO,  NO,  NO,  NO,  NO,       NO,  RSFT,  NO,  NO,  NO,    NO,  NO,  NO,  NO,
150     TRNS,TRNS,  TRNS,     TRNS,               BTN1,                         BTN2,     TRNS,       NO,         NO,  NO,  NO,  NO
151     ),
152     
153     // vi Layer
154     KEYMAP(
155                      FN0, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
156                      TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
157
158     TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,NO,  TRNS,  NO,  NO,  NO,    NO,  NO,  NO,  NO,
159     TRNS,TRNS,  TRNS,HOME,PGDN,UP,  PGUP,END, HOME,PGDN,PGUP,END, NO,  NO,  NO,       TRNS,  NO,  NO,  NO,    NO,  NO,  NO,  NO,
160     TRNS,TRNS,  TRNS,NO,  LEFT,DOWN,RGHT,NO,  LEFT,DOWN,UP,  RGHT,NO,  NO,       NO,  ENT,        NO,         NO,  NO,  NO,  NO,
161     TRNS,TRNS,  TRNS,TRNS,NO,  NO,  NO,  NO,  NO,  NO,  NO,  NO,  NO,  NO,       NO,  RSFT,  NO,  NO,  NO,    NO,  NO,  NO,  NO,
162     TRNS,TRNS,  TRNS,     TRNS,               SPC,                          RALT,     RCTL,       NO,         NO,  NO,  NO,  NO
163     ),
164     
165     // num lock layer
166     KEYMAP(
167                      FN0, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
168                      TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
169
170     TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,  TRNS,TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,
171     TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,  TRNS,TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,
172     TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,TRNS,       TRNS,       TRNS,TRNS,TRNS,TRNS,
173     TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,     TRNS,TRNS,  TRNS,TRNS,TRNS,  TRNS,TRNS,TRNS,TRNS,
174     TRNS,TRNS,  TRNS,     TRNS,               TRNS,                         TRNS,     TRNS,       TRNS,       TRNS,TRNS,TRNS,TRNS
175     ),
176
177 };
178
179
180 static const uint16_t fn_actions[] PROGMEM = {
181     [0] = ACTION_DEFAULT_LAYER_SET(0),
182     [1] = ACTION_LAYER_MOMENTARY(1),
183     [2] = ACTION_LAYER_MOMENTARY(2), //ACTION_LAYER_ON(2, ON_RELEASE),
184     [3] = KC_NO, //ACTION_LAYER_ON(3, ON_RELEASE),
185     [4] = KC_NO, //ACTION_LAYER_ON(4, ON_RELEASE),
186     [5] = KC_NO,
187     [6] = KC_NO,
188     [7] = KC_NO,
189 };
190
191 /*
192 enum macro_id {
193     MS_UL,
194     MS_UR,
195     MS_DL,
196     MS_DR,
197 };
198
199 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
200 {
201     keyevent_t event = record->event;
202
203     switch (id) {
204         case MS_UL:
205             return (event.pressed ? MACRO( D(MS_L), D(MS_U), END ) : MACRO( U(MS_L), U(MS_U), END ) );
206         case MS_UR:
207             return (event.pressed ? MACRO( D(MS_R), D(MS_U), END ) : MACRO( U(MS_L), U(MS_U), END ) );
208         case MS_DL:
209             return (event.pressed ? MACRO( D(MS_L), D(MS_D), END ) : MACRO( U(MS_L), U(MS_U), END ) );
210         case MS_DR:
211             return (event.pressed ? MACRO( D(MS_R), D(MS_D), END ) : MACRO( U(MS_L), U(MS_U), END ) );
212     }
213     return MACRO_NONE;
214 }
215 */
216
217 uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
218 {
219     return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
220 }
221
222 action_t keymap_fn_to_action(uint8_t keycode)
223 {
224     action_t action;
225     action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
226     return action;
227 }