]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/crkbd/keymaps/like_jis/keymap.c
Keymap: Modified like-jis keymap for crkbd (#4577)
[qmk_firmware.git] / keyboards / crkbd / keymaps / like_jis / keymap.c
1 #include QMK_KEYBOARD_H
2 #include "bootloader.h"
3 #ifdef PROTOCOL_LUFA
4   #include "lufa.h"
5   #include "split_util.h"
6 #endif
7 #ifdef SSD1306OLED
8   #include "ssd1306.h"
9 #endif
10 #include "oled_helper.h"
11
12 extern keymap_config_t keymap_config;
13
14 #ifdef RGBLIGHT_ENABLE
15 //Following line allows macro to read current RGB settings
16 extern rgblight_config_t rgblight_config;
17 #endif
18
19 extern uint8_t is_master;
20
21 // Each layer gets a name for readability, which is then used in the keymap matrix below.
22 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
23 // Layer names don't all need to be of the same length, obviously, and you can also skip them
24 // entirely and just use numbers.
25 enum layer_number {
26   _BASE = 0,
27   _LOWER,
28   _RAISE,
29   _ADJUST,
30 };
31
32 enum custom_keycodes {
33   LOWER = SAFE_RANGE,
34   RAISE,
35   ADJUST,
36   KANJI,
37   RGBRST
38 };
39
40 enum tapdances{
41   TD_CODO = 0,
42   // TD_MNUB,
43 };
44
45 // Layer Mode aliases
46 #define KC_LOWER LOWER
47 #define KC_RAISE RAISE
48
49 #define KC______ KC_TRNS
50 #define KC_XXXXX KC_NO
51 #define KC_KANJI KANJI
52
53 #define KC_RST   RESET
54 #define KC_LRST  RGBRST
55 #define KC_LTOG  RGB_TOG
56 #define KC_LHUI  RGB_HUI
57 #define KC_LHUD  RGB_HUD
58 #define KC_LSAI  RGB_SAI
59 #define KC_LSAD  RGB_SAD
60 #define KC_LVAI  RGB_VAI
61 #define KC_LVAD  RGB_VAD
62 #define KC_LMOD  RGB_MOD
63 #define KC_KNRM  AG_NORM
64 #define KC_KSWP  AG_SWAP
65
66 #define KC_TBSF  LSFT_T(KC_TAB)
67 // #define KC_SPSF  LSFT_T(KC_SPC)
68 #define KC_ALAP  LALT_T(KC_APP)
69
70 #define KC_CODO  TD(TD_CODO)
71 // #define KC_MNUB  TD(TD_MNUB)
72
73 qk_tap_dance_action_t tap_dance_actions[] = {
74   [TD_CODO] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_DOT),
75   // [TD_MNUB] = ACTION_TAP_DANCE_DOUBLE(KC_MINS, LSFT(KC_RO)),
76 };
77
78 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
79   [_BASE] = LAYOUT_kc( \
80   //,-----------------------------------------.                ,-----------------------------------------.
81         ESC,     Q,     W,     E,     R,     T,                      Y,     U,     I,     O,     P,  MINS,\
82   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
83        TBSF,     A,     S,     D,     F,     G,                      H,     J,     K,     L,    UP,   ENT,\
84   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
85       LCTRL,     Z,     X,     C,     V,     B,                      N,     M,  CODO,  LEFT,  DOWN,  RGHT,\
86   //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
87                                    LGUI, LOWER,  BSPC,      SPC, RAISE,  ALAP \
88                               //`--------------------'  `--------------------'
89   ),
90
91   [_LOWER] = LAYOUT_kc( \
92   //,-----------------------------------------.                ,-----------------------------------------.
93       _____,    F1,    F2,    F3,    F4,    F5,                  XXXXX,  MINS,   EQL,  JYEN,  LBRC,  RBRC,\
94   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
95       _____,    F6,    F7,    F8,    F9,   F10,                  XXXXX, XXXXX, XXXXX,  SCLN,  QUOT,  BSLS,\
96   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
97       _____,   F11,   F12,   TAB, KANJI,   ENT,                  XXXXX, XXXXX,  COMM,   DOT,  SLSH,    RO,\
98   //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
99                                   _____, _____,   DEL,    _____, _____,   APP \
100                               //`--------------------'  `--------------------'
101   ),
102
103   [_RAISE] = LAYOUT_kc( \
104   //,-----------------------------------------.                ,-----------------------------------------.
105       _____,     1,     2,     3,     4,     5,                      6,     7,     8,     9,     0,  PSLS,\
106   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
107       _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,                   QUOT,     4,     5,     6,  PPLS,  PAST,\
108   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
109       _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,                      0,     1,     2,     3,   DOT,  PMNS,\
110   //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
111                                   _____, _____,  BSPC,    _____, _____,  LALT \
112                               //`--------------------'  `--------------------'
113   ),
114
115   [_ADJUST] = LAYOUT_kc( \
116   //,-----------------------------------------.                ,-----------------------------------------.
117       _____,    RST,  LRST,  KNRM, KSWP, XXXXX,                  XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
118   //|------+-------+------+------+------+-----|                |------+------+------+------+------+------|
119       _____,   LTOG,  LHUI,  LSAI, LVAI, XXXXX,                  XXXXX, XXXXX, XXXXX, XXXXX,  PGUP, XXXXX,\
120   //|------+-------+------+------+------+-----|                |------+------+------+------+------+------|
121       _____,   LMOD,  LHUD,  LSAD, LVAD, XXXXX,                  XXXXX, XXXXX, XXXXX,  HOME,  PGDN,   END,\
122   //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
123                                   _____, _____, XXXXX,    _____, _____, XXXXX \
124                               //`--------------------'  `--------------------'
125   )
126 };
127
128 #define L_BASE _BASE
129 #define L_LOWER (1<<_LOWER)
130 #define L_RAISE (1<<_RAISE)
131 #define L_ADJUST (1<<_ADJUST)
132 #define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER)
133
134 #ifdef SSD1306OLED
135 typedef struct {
136   uint8_t state;
137   char name[8];
138 }LAYER_DISPLAY_NAME;
139
140 #define LAYER_DISPLAY_MAX 5
141 const LAYER_DISPLAY_NAME layer_display_name[LAYER_DISPLAY_MAX] = {
142   {L_BASE, "Base"},
143   {L_BASE + 1, "Base"},
144   {L_LOWER, "Lower"},
145   {L_RAISE, "Raise"},
146   {L_ADJUST_TRI, "Adjust"}
147 };
148
149 static inline const char* get_leyer_status(void) {
150
151   for (uint8_t i = 0; i < LAYER_DISPLAY_MAX; ++i) {
152     if (layer_state == 0 && layer_display_name[i].state == default_layer_state) {
153
154       return layer_display_name[i].name;
155     } else if (layer_state != 0 && layer_display_name[i].state == layer_state) {
156
157       return layer_display_name[i].name;
158     }
159   }
160
161   return "?";
162 }
163
164 static char layer_status_buf[24] = "Layer state ready.\n";
165 static inline void update_keymap_status(void) {
166
167   snprintf(layer_status_buf, sizeof(layer_status_buf) - 1, "OS:%s Layer:%s\n",
168     keymap_config.swap_lalt_lgui? "win" : "mac", get_leyer_status());
169 }
170
171 static inline void render_keymap_status(struct CharacterMatrix *matrix) {
172
173   matrix_write(matrix, layer_status_buf);
174 }
175
176 #define UPDATE_KEYMAP_STATUS() update_keymap_status()
177 #define RENDER_KEYMAP_STATUS(a) render_keymap_status(a)
178
179 #else
180
181 #define UPDATE_KEYMAP_STATUS()
182 #define RENDER_KEYMAP_STATUS(a)
183
184 #endif
185
186 static inline void update_change_layer(bool pressed, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
187
188   pressed ? layer_on(layer1) : layer_off(layer1);
189   IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2) ? layer_on(layer3) : layer_off(layer3);
190 }
191
192 int RGB_current_mode;
193 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
194
195   UPDATE_KEY_STATUS(keycode, record);
196
197   bool result = false;
198   switch (keycode) {
199     case LOWER:
200       update_change_layer(record->event.pressed, _LOWER, _RAISE, _ADJUST);
201       break;
202     case RAISE:
203       update_change_layer(record->event.pressed, _RAISE, _LOWER, _ADJUST);
204         break;
205     case KANJI:
206       if (record->event.pressed) {
207         if (keymap_config.swap_lalt_lgui == false) {
208           register_code(KC_LANG2);
209         } else {
210           SEND_STRING(SS_LALT("`"));
211         }
212       } else {
213         unregister_code(KC_LANG2);
214       }
215       break;
216     #ifdef RGBLIGHT_ENABLE
217       case RGB_MOD:
218           if (record->event.pressed) {
219             rgblight_mode(RGB_current_mode);
220             rgblight_step();
221             RGB_current_mode = rgblight_config.mode;
222           }
223         break;
224       case RGBRST:
225           if (record->event.pressed) {
226             eeconfig_update_rgblight_default();
227             rgblight_enable();
228             RGB_current_mode = rgblight_config.mode;
229           }
230         break;
231     #endif
232     default:
233       result = true;
234       break;
235   }
236
237   UPDATE_KEYMAP_STATUS();
238   return result;
239 }
240
241 void matrix_init_user(void) {
242   #ifdef RGBLIGHT_ENABLE
243     RGB_current_mode = rgblight_config.mode;
244   #endif
245   //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
246   #ifdef SSD1306OLED
247     iota_gfx_init(!has_usb()); // turns on the display
248   #endif
249 }
250
251 //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
252 #ifdef SSD1306OLED
253
254 void matrix_scan_user(void) {
255   iota_gfx_task();  // this is what updates the display continuously
256 }
257
258 static inline void matrix_update(struct CharacterMatrix *dest,
259                           const struct CharacterMatrix *source) {
260   if (memcmp(dest->display, source->display, sizeof(dest->display))) {
261     memcpy(dest->display, source->display, sizeof(dest->display));
262     dest->dirty = true;
263   }
264 }
265
266 static inline void render_status(struct CharacterMatrix *matrix) {
267
268   UPDATE_LED_STATUS();
269   RENDER_LED_STATUS(matrix);
270   RENDER_KEYMAP_STATUS(matrix);
271   UPDATE_LOCK_STATUS();
272   RENDER_LOCK_STATUS(matrix);
273   RENDER_KEY_STATUS(matrix);
274 }
275
276 void iota_gfx_task_user(void) {
277   struct CharacterMatrix matrix;
278
279   #if DEBUG_TO_SCREEN
280     if (debug_enable) {
281       return;
282     }
283   #endif
284
285   matrix_clear(&matrix);
286   if (is_master) {
287     render_status(&matrix);
288   } else {
289     RENDER_LOGO(&matrix);
290   }
291
292   matrix_update(&display, &matrix);
293 }
294
295 #endif