2 Copyright 2012 Jun Wako <wakojun@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/>.
20 #include <avr/pgmspace.h>
23 #include "action_macro.h"
24 #include "layer_switch.h"
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 `-----------------------------------------------'
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 \
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 } \
76 static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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 `-----------------------------------------------'
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
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
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
118 static const uint8_t PROGMEM overlays[][MATRIX_ROWS][MATRIX_COLS] = {};
129 const prog_macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
131 keyevent_t event = record->event;
132 //uint8_t tap_count = record->tap_count;
136 return (event.pressed ?
137 MACRO( T(LBRC), END ) :
138 MACRO( T(LBRC), END ) );
140 return (event.pressed ?
141 MACRO( T(RBRC), END ) :
142 MACRO( T(RBRC), END ) );
150 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
153 keyevent_t event = record->event;
154 uint8_t tap_count = record->tap_count;
157 action_macro_play(get_macro(opt, event.pressed));
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_MOMENTARY(2), // FN3
172 ACTION_MACRO(LBRACKET), // FN4
173 ACTION_MACRO(RBRACKET), // FN5
174 ACTION_MACRO(DUMMY), // FN6
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]))
189 /* translates key to keycode */
190 uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
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)]);
198 return KC_TRANSPARENT;
203 if (layer < KEYMAPS_SIZE) {
204 return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
206 // fall back to layer 0
207 return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]);
212 /* translates Fn keycode to action */
213 action_t keymap_fn_to_action(uint8_t keycode)
216 if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
217 action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
219 action.code = ACTION_NO;