]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/crkbd/keymaps/default/keymap.c
Keyboard: Partial refactor of the crkbd code (#3600)
[qmk_firmware.git] / keyboards / crkbd / keymaps / default / 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 "LUFA/Drivers/Peripheral/TWI.h"
9   #include "ssd1306.h"
10 #endif
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 #define _QWERTY 0
26 #define _LOWER 3
27 #define _RAISE 4
28 #define _ADJUST 16
29
30 enum custom_keycodes {
31   QWERTY = SAFE_RANGE,
32   LOWER,
33   RAISE,
34   ADJUST,
35   BACKLIT,
36   RGBRST
37 };
38
39 enum macro_keycodes {
40   KC_SAMPLEMACRO,
41 };
42
43 #define KC______ KC_TRNS
44 #define KC_XXXXX KC_NO
45 #define KC_LOWER LOWER
46 #define KC_RAISE RAISE
47 #define KC_RST   RESET
48 #define KC_LRST  RGBRST
49 #define KC_LTOG  RGB_TOG
50 #define KC_LHUI  RGB_HUI
51 #define KC_LHUD  RGB_HUD
52 #define KC_LSAI  RGB_SAI
53 #define KC_LSAD  RGB_SAD
54 #define KC_LVAI  RGB_VAI
55 #define KC_LVAD  RGB_VAD
56 #define KC_LSMOD RGB_SMOD
57 #define KC_CTLTB CTL_T(KC_TAB)
58 #define KC_GUIEI GUI_T(KC_LANG2)
59 #define KC_ALTKN ALT_T(KC_LANG1)
60
61 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
62   [_QWERTY] = LAYOUT_kc( \
63   //,-----------------------------------------.                ,-----------------------------------------.
64         ESC,     Q,     W,     E,     R,     T,                      Y,     U,     I,     O,     P,  BSPC,\
65   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
66       CTLTB,     A,     S,     D,     F,     G,                      H,     J,     K,     L,  SCLN,  QUOT,\
67   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
68        LSFT,     Z,     X,     C,     V,     B,                      N,     M,  COMM,   DOT,  SLSH,  RSFT,\
69   //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
70                                   GUIEI, LOWER,   SPC,      ENT, RAISE, ALTKN \
71                               //`--------------------'  `--------------------'
72   ),
73
74   [_LOWER] = LAYOUT_kc( \
75   //,-----------------------------------------.                ,-----------------------------------------.
76         ESC,     1,     2,     3,     4,     5,                      6,     7,     8,     9,     0,  BSPC,\
77   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
78       CTLTB,    F1,    F2,    F3,    F4,    F5,                     F6,    F7,    F8,    F9,   F10, XXXXX,\
79   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
80        LSFT,   F11,   F12,   F13,   F14,   F15,                    F16,   F17,   F18,   F19,   F20, XXXXX,\
81   //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
82                                   GUIEI, LOWER,   SPC,      ENT, RAISE, ALTKN \
83                               //`--------------------'  `--------------------'
84   ),
85
86   [_RAISE] = LAYOUT_kc( \
87   //,-----------------------------------------.                ,-----------------------------------------.
88         ESC,  EXLM,    AT,  HASH,   DLR,  PERC,                   CIRC,  AMPR,  ASTR,  LPRN,  RPRN,  BSPC,\
89   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
90       CTLTB, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,                   MINS,   EQL,  LCBR,  RCBR,  PIPE,   GRV,\
91   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
92        LSFT, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,                   UNDS,  PLUS,  LBRC,  RBRC,  BSLS,  TILD,\
93   //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
94                                   GUIEI, LOWER,   SPC,      ENT, RAISE, ALTKN \
95                               //`--------------------'  `--------------------'
96   ),
97
98   [_ADJUST] = LAYOUT_kc( \
99   //,-----------------------------------------.                ,-----------------------------------------.
100         RST,  LRST, XXXXX, XXXXX, XXXXX, XXXXX,                  XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
101   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
102        LTOG,  LHUI,  LSAI,  LVAI, XXXXX, XXXXX,                  XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
103   //|------+------+------+------+------+------|                |------+------+------+------+------+------|
104       LSMOD,  LHUD,  LSAD,  LVAD, XXXXX, XXXXX,                  XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
105   //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
106                                   GUIEI, LOWER,   SPC,      ENT, RAISE, ALTKN \
107                               //`--------------------'  `--------------------'
108   )
109 };
110
111 int RGB_current_mode;
112
113 void persistent_default_layer_set(uint16_t default_layer) {
114   eeconfig_update_default_layer(default_layer);
115   default_layer_set(default_layer);
116 }
117
118 // Setting ADJUST layer RGB back to default
119 void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
120   if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
121     layer_on(layer3);
122   } else {
123     layer_off(layer3);
124   }
125 }
126
127 void matrix_init_user(void) {
128     #ifdef RGBLIGHT_ENABLE
129       RGB_current_mode = rgblight_config.mode;
130     #endif
131     //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
132     #ifdef SSD1306OLED
133         TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000));
134         iota_gfx_init(!has_usb());   // turns on the display
135     #endif
136 }
137
138 //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
139 #ifdef SSD1306OLED
140
141 // When add source files to SRC in rules.mk, you can use functions.
142 const char *read_layer_state(void);
143 const char *read_logo(void);
144 void set_keylog(uint16_t keycode, keyrecord_t *record);
145 const char *read_keylog(void);
146 const char *read_keylogs(void);
147
148 // const char *read_mode_icon(bool swap);
149 // const char *read_host_led_state(void);
150 // void set_timelog(void);
151 // const char *read_timelog(void);
152
153 void matrix_scan_user(void) {
154    iota_gfx_task();
155 }
156
157 void matrix_render_user(struct CharacterMatrix *matrix) {
158   if (is_master) {
159     // If you want to change the display of OLED, you need to change here
160     matrix_write_ln(matrix, read_layer_state());
161     matrix_write_ln(matrix, read_keylog());
162     matrix_write_ln(matrix, read_keylogs());
163     //matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
164     //matrix_write_ln(matrix, read_host_led_state());
165     //matrix_write_ln(matrix, read_timelog());
166   } else {
167     matrix_write(matrix, read_logo());
168   }
169 }
170
171 void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
172   if (memcmp(dest->display, source->display, sizeof(dest->display))) {
173     memcpy(dest->display, source->display, sizeof(dest->display));
174     dest->dirty = true;
175   }
176 }
177
178 void iota_gfx_task_user(void) {
179   struct CharacterMatrix matrix;
180   matrix_clear(&matrix);
181   matrix_render_user(&matrix);
182   matrix_update(&display, &matrix);
183 }
184
185 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
186   if (record->event.pressed) {
187     set_keylog(keycode, record);
188     // set_timelog();
189   }
190
191   switch (keycode) {
192     case QWERTY:
193       if (record->event.pressed) {
194         persistent_default_layer_set(1UL<<_QWERTY);
195       }
196       return false;
197       break;
198     case LOWER:
199       if (record->event.pressed) {
200         layer_on(_LOWER);
201         update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
202       } else {
203         layer_off(_LOWER);
204         update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
205       }
206       return false;
207       break;
208     case RAISE:
209       if (record->event.pressed) {
210         layer_on(_RAISE);
211         update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
212       } else {
213         layer_off(_RAISE);
214         update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
215       }
216       return false;
217       break;
218     case ADJUST:
219         if (record->event.pressed) {
220           layer_on(_ADJUST);
221         } else {
222           layer_off(_ADJUST);
223         }
224         return false;
225         break;
226     case RGB_MOD:
227       #ifdef RGBLIGHT_ENABLE
228         if (record->event.pressed) {
229           rgblight_mode(RGB_current_mode);
230           rgblight_step();
231           RGB_current_mode = rgblight_config.mode;
232         }
233       #endif
234       return false;
235       break;
236     case RGBRST:
237       #ifdef RGBLIGHT_ENABLE
238         if (record->event.pressed) {
239           eeconfig_update_rgblight_default();
240           rgblight_enable();
241           RGB_current_mode = rgblight_config.mode;
242         }
243       #endif
244       break;
245   }
246   return true;
247 }
248
249 #endif