]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/crkbd/keymaps/drashna/keymap.c
Update to drashna userspace and keymaps (#4459)
[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   [_MODS] = LAYOUT_wrapper(
62       _______, ___________________BLANK___________________,                  ___________________BLANK___________________, _______,
63       _______, ___________________BLANK___________________,                  ___________________BLANK___________________, _______,
64       KC_LSFT, ___________________BLANK___________________,                  ___________________BLANK___________________, KC_RSFT,
65                                      _______, _______, _______,        _______, _______, _______
66   ),
67
68   [_LOWER] = LAYOUT_wrapper(
69     KC_F11,  _________________LOWER_L1__________________,                    _________________LOWER_R1__________________, KC_F11,
70     KC_F12,  _________________LOWER_L2__________________,                    _________________LOWER_R2__________________, KC_PIPE,
71     _______, _________________LOWER_L3__________________,                    _________________LOWER_R3__________________, _______,
72                                      _______, _______, _______,        _______, _______, _______
73   ),
74
75   [_RAISE] = LAYOUT_wrapper( \
76     _______, _________________RAISE_L1__________________,                    _________________RAISE_R1__________________, _______,
77     _______, _________________RAISE_L2__________________,                    _________________RAISE_R2__________________, KC_BSLS,
78     _______, _________________RAISE_L3__________________,                    _________________RAISE_R3__________________, _______,
79                                      _______, _______, _______,        _______, _______, _______
80   ),
81
82   [_ADJUST] = LAYOUT_wrapper( \
83     KC_MAKE, _________________ADJUST_L1_________________,                    _________________ADJUST_R1_________________, KC_RESET,
84     VRSN,    _________________ADJUST_L2_________________,                    _________________ADJUST_R2_________________, EEP_RST,
85     _______, _________________ADJUST_L3_________________,                    _________________ADJUST_R3_________________, KC_MPLY,
86                                      _______, _______, _______,        KC_NUKE, TG_MODS, _______
87   )
88 };
89
90 void matrix_init_keymap(void) {
91     //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
92     #ifdef SSD1306OLED
93         iota_gfx_init(!has_usb());   // turns on the display
94     #endif
95
96   DDRD &= ~(1<<5);
97   PORTD &= ~(1<<5);
98
99   DDRB &= ~(1<<0);
100   PORTB &= ~(1<<0);
101 }
102
103 //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
104 #ifdef SSD1306OLED
105
106 // When add source files to SRC in rules.mk, you can use functions.
107 const char *read_logo(void);
108 char layer_state_str[24];
109 char modifier_state_str[24];
110 char host_led_state_str[24];
111 char keylog_str[24] = {};
112 char keylogs_str[21] = {};
113 int keylogs_str_idx = 0;
114
115 // const char *read_mode_icon(bool swap);
116 // void set_timelog(void);
117 // const char *read_timelog(void);
118
119 const char code_to_name[60] = {
120     ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
121     'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
122     'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
123     '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
124     'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\',
125     '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
126
127 void set_keylog(uint16_t keycode, keyrecord_t *record) {
128   char name = ' ';
129   if (keycode < 60) {
130     name = code_to_name[keycode];
131   }
132
133   // update keylog
134   snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c",
135            record->event.key.row, record->event.key.col,
136            keycode, name);
137
138   // update keylogs
139   if (keylogs_str_idx == sizeof(keylogs_str) - 1) {
140     keylogs_str_idx = 0;
141     for (int i = 0; i < sizeof(keylogs_str) - 1; i++) {
142       keylogs_str[i] = ' ';
143     }
144   }
145
146   keylogs_str[keylogs_str_idx] = name;
147   keylogs_str_idx++;
148 }
149
150 const char *read_keylog(void) {
151   return keylog_str;
152 }
153
154 const char *read_keylogs(void) {
155   return keylogs_str;
156 }
157
158
159 const char* read_modifier_state(void) {
160   uint8_t modifiers = get_mods();
161   uint8_t one_shot = get_oneshot_mods();
162
163   snprintf(modifier_state_str, sizeof(modifier_state_str), "Mods:%s %s %s %s",
164     (modifiers & MODS_CTRL_MASK || one_shot & MODS_CTRL_MASK) ? "CTL" : "   ",
165     (modifiers & MODS_GUI_MASK || one_shot & MODS_GUI_MASK) ? "GUI" : "   ",
166     (modifiers & MODS_ALT_MASK || one_shot & MODS_ALT_MASK) ? "ALT" : "   ",
167     (modifiers & MODS_SHIFT_MASK || one_shot & MODS_SHIFT_MASK) ? "SFT" : "   "
168   );
169
170   return modifier_state_str;
171 }
172
173 const char *read_host_led_state(void) {
174   uint8_t leds = host_keyboard_leds();
175
176   snprintf(host_led_state_str, sizeof(host_led_state_str), "NL:%s CL:%s SL:%s",
177     (leds & (1 << USB_LED_NUM_LOCK)) ? "on" : "- ",
178     (leds & (1 << USB_LED_CAPS_LOCK)) ? "on" : "- ",
179     (leds & (1 << USB_LED_SCROLL_LOCK)) ? "on" : "- "
180   );
181
182   return host_led_state_str;
183 }
184
185 const char* read_layer_state(void) {
186   switch (biton32(layer_state)) {
187     case _RAISE:
188       snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise  ");
189       break;
190     case _LOWER:
191       snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower  ");
192       break;
193     case _ADJUST:
194       snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust ");
195       break;
196     default:
197       switch (biton32(default_layer_state)) {
198         case _QWERTY:
199           snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Qwerty ");
200           break;
201         case _COLEMAK:
202           snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Colemak");
203           break;
204         case _DVORAK:
205           snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Dvorak ");
206           break;
207         case _WORKMAN:
208           snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Workman");
209           break;
210       }
211       break;
212   }
213
214     return layer_state_str;
215 }
216
217 void matrix_scan_keymap(void) {
218    iota_gfx_task();
219 }
220
221 void matrix_render_user(struct CharacterMatrix *matrix) {
222   if (is_master) {
223     //If you want to change the display of OLED, you need to change here
224     matrix_write_ln(matrix, read_layer_state());
225     matrix_write_ln(matrix, read_modifier_state());
226     // matrix_write_ln(matrix, read_keylog());
227     matrix_write_ln(matrix, read_keylogs());
228     // matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
229     matrix_write(matrix, read_host_led_state());
230     //matrix_write_ln(matrix, read_timelog());
231   } else {
232     matrix_write(matrix, read_logo());
233   }
234 }
235
236 void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
237   if (memcmp(dest->display, source->display, sizeof(dest->display))) {
238     memcpy(dest->display, source->display, sizeof(dest->display));
239     dest->dirty = true;
240   }
241 }
242
243 void iota_gfx_task_user(void) {
244   struct CharacterMatrix matrix;
245   matrix_clear(&matrix);
246   matrix_render_user(&matrix);
247   matrix_update(&display, &matrix);
248 }
249
250 bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
251   switch (keycode) {
252     case KC_A ... KC_SLASH:
253     case KC_F1 ... KC_F12:
254     case KC_INSERT ... KC_UP:
255     case KC_KP_SLASH ... KC_KP_DOT:
256     case KC_F13 ... KC_F24:
257     if (record->event.pressed) { set_keylog(keycode, record); }
258       break;
259     // set_timelog();
260   }
261   return true;
262 }
263
264 #endif