]> git.donarmstrong.com Git - tmk_firmware.git/blob - converter/pc98_usb/keymap.c
Fix keymap MACRO of pc98 adn hhkb
[tmk_firmware.git] / converter / pc98_usb / keymap.c
1 /*
2 Copyright 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
18 #include <stdint.h>
19 #include <stdbool.h>
20 #include <avr/pgmspace.h>
21 #include "keycode.h"
22 #include "action.h"
23 #include "action_macro.h"
24 #include "layer_switch.h"
25 #include "util.h"
26 #include "keymap.h"
27
28
29
30
31 /* PC-9801-98-S02   Raku Raku keyboard(Luckyboard) Normal Mode
32   ,---------------------------------------------------------------.
33   | 60| 61| 62| 63| 64| 65| 66| 67| 68| 69| 6A| 6B| 36| 37| 3F| 3E|
34   `---------------------------------------------------------------'
35   ,---------------------------------------------------------------.
36   |    00| 01| 02| 03| 04| 05|  58|  71| 06| 07| 08| 09| 0A|    0E|
37   |---------------------------------------------------------------|
38   |   0F| 10| 11| 12| 13| 14|    3A     | 15| 16| 17| 18| 19|   1C|
39   |---------------------------------------------------------'.    |
40   |  74| 20| 21| 22| 23| 24|  3B  |  3C  | 25| 26| 27| 28| 29|    |
41   |---------------------------------------------------------------|
42   | 70| 2A| 2B| 2C| 2D| 2E| 38|  3D   | 39| 2F| 30| 31| 32| 33| 70|
43   `---------------------------------------------------------------'
44           | 73|   51|   5B|   59|       34|   5A|   35| xx|
45           `-----------------------------------------------'
46   xx: 74 35 F4 B5
47 */
48 #define KEYMAP( \
49     K60, K61, K62, K63, K64, K65, K66, K67, K68, K69, K6A, K6B, K36, K37, K3F, K3E, \
50       K00,  K01, K02, K03, K04, K05,  K58, K71,   K06, K07, K08, K09, K0A,    K0E,  \
51       K0F,  K10, K11, K12, K13, K14,     K3A,     K15, K16, K17, K18, K19,    K1C,  \
52       K74, K20, K21, K22, K23, K24,   K3B,  K3C,   K25, K26, K27, K28, K29,         \
53       K70,K2A, K2B, K2C, K2D, K2E, K38,  K3D,  K39, K2F, K30, K31, K32, K33,        \
54                K73,  K51, K5B, K59,        K34,        K5A,  K35                    \
55 ) { \
56     { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \
57     { KC_##K08, KC_##K09, KC_##K0A, KC_NO,    KC_NO,    KC_NO,    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_NO,    KC_NO,    KC_##K1C, KC_NO,    KC_NO,    KC_NO    }, \
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_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO    }, \
65     { KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO    }, \
66     { KC_NO,    KC_##K51, KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO    }, \
67     { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_NO,    KC_NO,    KC_NO,    KC_NO    }, \
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_NO,    KC_NO,    KC_NO,    KC_NO    }, \
70     { KC_##K70, KC_##K71, KC_NO,    KC_##K73, KC_##K74, KC_NO,    KC_NO,    KC_NO    }, \
71     { KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO,    KC_NO    }  \
72 }
73
74
75
76 static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
77     /*
78   ,---------------------------------------------------------------.
79   | 60| 61| 62| 63| 64| 65| 66| 67| 68| 69| 6A| 6B| 36| 37| 3F| 3E|
80   `---------------------------------------------------------------'
81   ,---------------------------------------------------------------.
82   |    00| 01| 02| 03| 04| 05|  58|  71| 06| 07| 08| 09| 0A|    0E|
83   |---------------------------------------------------------------|
84   |   0F| 10| 11| 12| 13| 14|    3A     | 15| 16| 17| 18| 19|   1C|
85   |---------------------------------------------------------------|
86   |  74| 20| 21| 22| 23| 24|  MINS|   EQL| 25| 26| 27| 28| 29|    |
87   |---------------------------------------------------------------|
88   | 70| 2A| 2B| 2C| 2D| 2E| 38|  3D   | 39| 2F| 30| 31| 32| 33| 70|
89   `---------------------------------------------------------------'
90           | 73|   51|   5B|   59|       34|   5A|   35| xx|
91           `-----------------------------------------------'
92     */
93     KEYMAP(
94   CANCEL,COPY,  F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9, F10, F11, F12, F13, FN6,
95       ESC,    1,   2,   3,   4,   5,   FN4, FN5,    6,   7,   8,   9,   0,   BSPC,
96       TAB,    Q,   W,   E,   R,   T,      UP,       Y,   U,   I,   O,   P,   ENT,
97       LCTL,  A,   S,   D,   F,   G,  MINS,  EQL,     H,   J,   K,   L, FN2,
98       LSFT, Z,   X,   C,   V,   B, GRV, BSLS, QUOT,   N,   M,COMM, DOT, FN1,
99               LGUI, LALT, LCTL, LSFT,      SPC,      SPC,   RALT
100     ),
101     KEYMAP(
102     PAUS,COPY,  F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9, F10, F11, F12, F13, F14,
103       GRV,   F1,  F2,  F3,  F4,  F5,    NO, NO,    F6,  F7,  F8,  F9, F10,    DEL,
104       TAB,    Q,   W,   E,   R,   T,      UP,    HOME,PGDN,PGUP, END,   P,   ENT,
105       LCTL,  A,   S,   D,   F,   G,  MINS,  EQL,  LEFT,DOWN,  UP,RGHT,SCLN,
106       LSFT, Z,   X,   C,   V,   B, INS, DOWN,  DEL,HOME,PGDN,PGUP, END,TRNS,
107               LGUI, LALT, LCTL, LSFT,      SPC,      SPC,   RALT
108     ),
109     KEYMAP(
110     PAUS,COPY,  F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9, F10, F11, F12, F13, F14,
111       GRV,   F1,  F2,  F3,  F4,  F5,    NO, NO,    F6,  F7,  F8,  F9, F10,    DEL,
112       TAB,    Q,   W,   E,   R,   T,      UP,    WH_L,WH_D,WH_U,WH_R,   P,   ENT,
113       LCTL,  A,   S,   D,   F,   G,  MINS,  EQL,  MS_L,MS_D,MS_U,MS_R,TRNS,
114       LSFT, Z,   X,   C,   V,   B, INS, DOWN, BTN3,BTN2,BTN1,BTN4,BTN5,TRNS,
115               LGUI, LALT, LCTL, LSFT,      SPC,      SPC,   RALT
116     ),
117 };
118 static const uint8_t PROGMEM overlays[][MATRIX_ROWS][MATRIX_COLS] = {};
119
120 /*
121  * Macro definition
122  */
123 enum macro_id {
124     LBRACKET,
125     RBRACKET,
126     DUMMY,
127 };
128
129 const prog_macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
130 {
131     keyevent_t event = record->event;
132     //uint8_t tap_count = record->tap_count;
133
134     switch (id) {
135         case LBRACKET:
136             return (event.pressed ?
137                     MACRO( T(LBRC), END ) :
138                     MACRO( T(LBRC), END ) );
139         case RBRACKET:
140             return (event.pressed ?
141                     MACRO( T(RBRC), END ) :
142                     MACRO( T(RBRC), END ) );
143     }
144     return MACRO_NONE;
145 }
146
147 /*
148  * Action function
149  */
150 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
151 {
152 /*
153     keyevent_t event = record->event;
154     uint8_t tap_count = record->tap_count;
155     switch (id) {
156         case 0xFF:
157             action_macro_play(get_macro(opt, event.pressed));
158             break;
159     }
160 */
161 }
162
163
164 /*
165  * Fn actions
166  */
167 static const uint16_t PROGMEM fn_actions[] = {
168     ACTION_KEYMAP_TAP_TOGGLE(0),                 // FN0
169     ACTION_KEYMAP_TAP_KEY(1, KC_SLASH),          // FN1
170     ACTION_KEYMAP_TAP_KEY(2, KC_SCLN),           // FN2
171     ACTION_KEYMAP(2),                            // FN3
172     ACTION_MACRO(LBRACKET),                      // FN4
173     ACTION_MACRO(RBRACKET),                      // FN5
174     ACTION_MACRO(DUMMY),                         // FN6
175 };
176
177
178
179
180
181
182 /*
183  * No need to edit.
184  */
185 #define KEYMAPS_SIZE    (sizeof(keymaps) / sizeof(keymaps[0]))
186 #define OVERLAYS_SIZE   (sizeof(overlays) / sizeof(overlays[0]))
187 #define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))
188
189 /* translates key to keycode */
190 uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
191 {
192     /* Overlay: 16-31(OVERLAY_BIT(0x10) | overlay_layer) */
193     if (layer & OVERLAY_BIT) {
194         layer &= OVERLAY_MASK;
195         if (layer < OVERLAYS_SIZE) {
196             return pgm_read_byte(&overlays[(layer)][(key.row)][(key.col)]);
197         } else {
198             return KC_TRANSPARENT;
199         }
200     } 
201     /* Keymap: 0-15 */
202     else {
203         if (layer < KEYMAPS_SIZE) {
204             return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
205         } else {
206             // fall back to layer 0
207             return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]);
208         }
209     }
210 }
211
212 /* translates Fn keycode to action */
213 action_t keymap_fn_to_action(uint8_t keycode)
214 {
215     action_t action;
216     if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
217         action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
218     } else {
219         action.code = ACTION_NO;
220     }
221     return action;
222 }