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_NO, KC_NO, KC_##K5A, KC_NO, 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_NO, 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, F14,
95 ESC, 1, 2, 3, 4, 5, NO, NO, 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, INS, DOWN, DEL, 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
119 static const uint8_t PROGMEM overlays[][MATRIX_ROWS][MATRIX_COLS] = {};
121 static const uint16_t PROGMEM fn_actions[] = {
122 ACTION_KEYMAP_TAP_TOGGLE(0), // FN0
123 ACTION_KEYMAP_TAP_KEY(1, KC_SLASH), // FN1
124 ACTION_KEYMAP_TAP_KEY(2, KC_SCLN), // FN2
125 ACTION_KEYMAP(2), // FN3
133 #define KEYMAPS_SIZE (sizeof(keymaps) / sizeof(keymaps[0]))
134 #define OVERLAYS_SIZE (sizeof(overlays) / sizeof(overlays[0]))
135 #define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))
137 /* translates key to keycode */
138 uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
140 /* Overlay: 16-31(OVERLAY_BIT(0x10) | overlay_layer) */
141 if (layer & OVERLAY_BIT) {
142 layer &= OVERLAY_MASK;
143 if (layer < OVERLAYS_SIZE) {
144 return pgm_read_byte(&overlays[(layer)][(key.row)][(key.col)]);
146 return KC_TRANSPARENT;
151 if (layer < KEYMAPS_SIZE) {
152 return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
154 // fall back to layer 0
155 return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]);
160 /* translates Fn keycode to action */
161 action_t keymap_fn_to_action(uint8_t keycode)
164 if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
165 action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
167 action.code = ACTION_NO;