]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/crkbd/keymaps/drashna/keymap.c
Update keyboards/kbdfans/kbd67/readme.md
[qmk_firmware.git] / keyboards / crkbd / keymaps / drashna / keymap.c
1 #include QMK_KEYBOARD_H
2 #include "drashna.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
11 extern keymap_config_t keymap_config;
12 extern uint8_t is_master;
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 enum crkbd_keycodes {
20   RGBRST = NEW_SAFE_RANGE
21 };
22
23 #define LAYOUT_crkbd_base( \
24     K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
25     K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
26     K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A  \
27   ) \
28   LAYOUT_wrapper( \
29     KC_ESC,  K01,    K02,     K03,      K04,     K05,                        K06,     K07,     K08,     K09,     K0A,     KC_MINS, \
30     KC_TAB, ALT_T(K11),  K12, K13,      K14,     K15,                        K16,     K17,     K18,     K19,     K1A, RGUI_T(KC_QUOT), \
31     OS_LSFT, CTL_T(K21), K22, K23,      K24,     K25,                        K26,     K27,     K28,     K29,  CTL_T(K2A), OS_RSFT, \
32                            LT(_LOWER,KC_GRV), KC_SPC,  KC_BSPC,     KC_DEL,  KC_ENT,  RAISE                                        \
33   )
34 #define LAYOUT_crkbd_base_wrapper(...)       LAYOUT_crkbd_base(__VA_ARGS__)
35
36 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
37   [_QWERTY] = LAYOUT_crkbd_base_wrapper(
38     _________________QWERTY_L1_________________, _________________QWERTY_R1_________________,
39     _________________QWERTY_L2_________________, _________________QWERTY_R2_________________,
40     _________________QWERTY_L3_________________, _________________QWERTY_R3_________________
41   ),
42
43   [_COLEMAK] = LAYOUT_crkbd_base_wrapper(
44     _________________COLEMAK_L1________________, _________________COLEMAK_R1________________,
45     _________________COLEMAK_L2________________, _________________COLEMAK_R2________________,
46     _________________COLEMAK_L3________________, _________________COLEMAK_R3________________
47   ),
48
49   [_DVORAK] = LAYOUT_crkbd_base_wrapper(
50     _________________DVORAK_L1_________________, _________________DVORAK_R1_________________,
51     _________________DVORAK_L2_________________, _________________DVORAK_R2_________________,
52     _________________DVORAK_L3_________________, _________________DVORAK_R3_________________
53   ),
54
55   [_WORKMAN] = LAYOUT_crkbd_base_wrapper(
56     _________________WORKMAN_L1________________, _________________WORKMAN_R1________________,
57     _________________WORKMAN_L2________________, _________________WORKMAN_R2________________,
58     _________________WORKMAN_L3________________, _________________WORKMAN_R3________________
59   ),
60
61   [_NORMAN] = LAYOUT_crkbd_base_wrapper(
62     _________________NORMAN_L1_________________, _________________NORMAN_L1_________________,
63     _________________NORMAN_L2_________________, _________________NORMAN_R2_________________,
64     _________________NORMAN_L3_________________, _________________NORMAN_R3_________________
65   ),
66
67   [_MALTRON] = LAYOUT_crkbd_base_wrapper(
68     _________________MALTRON_L1________________, _________________MALTRON_R1________________,
69     _________________MALTRON_L2________________, _________________MALTRON_R2________________,
70     _________________MALTRON_L3________________, _________________MALTRON_R3________________
71   ),
72
73   [_EUCALYN] = LAYOUT_crkbd_base_wrapper(
74     _________________EUCALYN_L1________________, _________________EUCALYN_R1________________,
75     _________________EUCALYN_L2________________, _________________EUCALYN_R2________________,
76     _________________EUCALYN_L3________________, _________________EUCALYN_R3________________
77   ),
78
79   [_CARPLAX] = LAYOUT_crkbd_base_wrapper(
80     _____________CARPLAX_QFMLWY_L1_____________, _____________CARPLAX_QFMLWY_R1_____________,
81     _____________CARPLAX_QFMLWY_L2_____________, _____________CARPLAX_QFMLWY_R2_____________,
82     _____________CARPLAX_QFMLWY_L3_____________, _____________CARPLAX_QFMLWY_R3_____________
83   ),
84
85   [_MODS] = LAYOUT_wrapper(
86       _______, ___________________BLANK___________________,                  ___________________BLANK___________________, _______,
87       _______, ___________________BLANK___________________,                  ___________________BLANK___________________, _______,
88       KC_LSFT, ___________________BLANK___________________,                  ___________________BLANK___________________, KC_RSFT,
89                                      _______, _______, _______,        _______, _______, _______
90   ),
91
92   [_LOWER] = LAYOUT_wrapper(
93     KC_F11,  _________________LOWER_L1__________________,                    _________________LOWER_R1__________________, KC_F11,
94     KC_F12,  _________________LOWER_L2__________________,                    _________________LOWER_R2__________________, KC_PIPE,
95     _______, _________________LOWER_L3__________________,                    _________________LOWER_R3__________________, _______,
96                                      _______, _______, _______,        _______, _______, _______
97   ),
98
99   [_RAISE] = LAYOUT_wrapper( \
100     _______, _________________RAISE_L1__________________,                    _________________RAISE_R1__________________, _______,
101     _______, _________________RAISE_L2__________________,                    _________________RAISE_R2__________________, KC_BSLS,
102     _______, _________________RAISE_L3__________________,                    _________________RAISE_R3__________________, _______,
103                                      _______, _______, _______,        _______, _______, _______
104   ),
105
106   [_ADJUST] = LAYOUT_wrapper( \
107     KC_MAKE, _________________ADJUST_L1_________________,                    _________________ADJUST_R1_________________, KC_RESET,
108     VRSN,    _________________ADJUST_L2_________________,                    _________________ADJUST_R2_________________, EEP_RST,
109     _______, _________________ADJUST_L3_________________,                    _________________ADJUST_R3_________________, KC_MPLY,
110                                      _______, _______, _______,        KC_NUKE, TG_MODS, _______
111   )
112 };
113
114 void matrix_init_keymap(void) {
115   //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
116   #ifdef SSD1306OLED
117     iota_gfx_init(!has_usb());   // turns on the display
118   #endif
119
120   #ifndef CONVERT_TO_PROTON_C
121     setPinOutput(D5);
122     writePinHigh(D5);
123
124     setPinOutput(B0);
125     writePinHigh(B0);
126   #endif
127 }
128
129 //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
130 #ifdef SSD1306OLED
131
132 // When add source files to SRC in rules.mk, you can use functions.
133 const char *read_logo(void);
134 char layer_state_str[24];
135 char modifier_state_str[24];
136 char host_led_state_str[24];
137 char keylog_str[24] = {};
138 char keylogs_str[21] = {};
139 int keylogs_str_idx = 0;
140
141 // const char *read_mode_icon(bool swap);
142 // void set_timelog(void);
143 // const char *read_timelog(void);
144
145 const char code_to_name[60] = {
146     ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
147     'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
148     'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
149     '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
150     'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\',
151     '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
152
153 void set_keylog(uint16_t keycode, keyrecord_t *record) {
154   char name = ' ';
155   if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { keycode = keycode & 0xFF; }
156   if (keycode < 60) {
157     name = code_to_name[keycode];
158   }
159   // update keylog
160   snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c",
161            record->event.key.row, record->event.key.col,
162            keycode, name);
163
164   // update keylogs
165   if (keylogs_str_idx == sizeof(keylogs_str) - 1) {
166     keylogs_str_idx = 0;
167     for (int i = 0; i < sizeof(keylogs_str) - 1; i++) {
168       keylogs_str[i] = ' ';
169     }
170   }
171
172   keylogs_str[keylogs_str_idx] = name;
173   keylogs_str_idx++;
174 }
175
176 const char *read_keylog(void) {
177   return keylog_str;
178 }
179
180 const char *read_keylogs(void) {
181   return keylogs_str;
182 }
183
184
185 const char* read_modifier_state(void) {
186   uint8_t modifiers = get_mods();
187   uint8_t one_shot = get_oneshot_mods();
188
189   snprintf(modifier_state_str, sizeof(modifier_state_str), "Mods:%s %s %s %s",
190     (modifiers & MODS_CTRL_MASK || one_shot & MODS_CTRL_MASK) ? "CTL" : "   ",
191     (modifiers & MODS_GUI_MASK || one_shot & MODS_GUI_MASK) ? "GUI" : "   ",
192     (modifiers & MODS_ALT_MASK || one_shot & MODS_ALT_MASK) ? "ALT" : "   ",
193     (modifiers & MODS_SHIFT_MASK || one_shot & MODS_SHIFT_MASK) ? "SFT" : "   "
194   );
195
196   return modifier_state_str;
197 }
198
199 const char *read_host_led_state(void) {
200   uint8_t leds = host_keyboard_leds();
201
202   snprintf(host_led_state_str, sizeof(host_led_state_str), "NL:%s CL:%s SL:%s",
203     (leds & (1 << USB_LED_NUM_LOCK)) ? "on" : "- ",
204     (leds & (1 << USB_LED_CAPS_LOCK)) ? "on" : "- ",
205     (leds & (1 << USB_LED_SCROLL_LOCK)) ? "on" : "- "
206   );
207
208   return host_led_state_str;
209 }
210
211 const char* read_layer_state(void) {
212   switch (biton32(layer_state)) {
213     case _RAISE:
214       snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise  ");
215       break;
216     case _LOWER:
217       snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower  ");
218       break;
219     case _ADJUST:
220       snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust ");
221       break;
222     default:
223       switch (biton32(default_layer_state)) {
224         case _QWERTY:
225           snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Qwerty ");
226           break;
227         case _COLEMAK:
228           snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Colemak");
229           break;
230         case _DVORAK:
231           snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Dvorak ");
232           break;
233         case _WORKMAN:
234           snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Workman");
235           break;
236       }
237       break;
238   }
239
240     return layer_state_str;
241 }
242
243 void matrix_scan_keymap(void) {
244    iota_gfx_task();
245 }
246
247 void matrix_render_user(struct CharacterMatrix *matrix) {
248   if (is_master) {
249     //If you want to change the display of OLED, you need to change here
250     matrix_write_ln(matrix, read_layer_state());
251     matrix_write_ln(matrix, read_modifier_state());
252     // matrix_write_ln(matrix, read_keylog());
253     matrix_write_ln(matrix, read_keylogs());
254     // matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
255     matrix_write(matrix, read_host_led_state());
256     //matrix_write_ln(matrix, read_timelog());
257   } else {
258     matrix_write(matrix, read_logo());
259   }
260 }
261
262 void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
263   if (memcmp(dest->display, source->display, sizeof(dest->display))) {
264     memcpy(dest->display, source->display, sizeof(dest->display));
265     dest->dirty = true;
266   }
267 }
268
269 void iota_gfx_task_user(void) {
270   struct CharacterMatrix matrix;
271   matrix_clear(&matrix);
272   matrix_render_user(&matrix);
273   matrix_update(&display, &matrix);
274 }
275
276 bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
277   switch (keycode) {
278     case KC_A ... KC_SLASH:
279     case KC_F1 ... KC_F12:
280     case KC_INSERT ... KC_UP:
281     case KC_KP_SLASH ... KC_KP_DOT:
282     case KC_F13 ... KC_F24:
283     if (record->event.pressed) { set_keylog(keycode, record); }
284       break;
285     // set_timelog();
286   }
287   return true;
288 }
289
290 #endif