1 #include QMK_KEYBOARD_H
2 #include "led_controller.h"
11 //IS31 chip has 8 available led pages, using 0 for all leds and 7 for single toggles
30 uint8_t current_layer_global = 0;
31 uint8_t led_mode_global = MODE_SINGLE;
32 uint8_t backlight_status_global = 1; //init on/off state of backlight
33 uint32_t led_layer_state = 0;
35 /* ==================================
37 * ==================================*/
39 const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
40 /* Layer 0: Default Layer
41 * ,-----------------------------------------------------------.
42 * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Backs|
43 * |-----------------------------------------------------------|
44 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|
45 * |-----------------------------------------------------------|
46 * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Enter |
47 * |-----------------------------------------------------------|
48 * |Shif| | Z| X| C| V| B| N| M| ,| .| /|Shift |
49 * |-----------------------------------------------------------|
50 * |Ctrl|Gui |Alt | Space |Alt |Gui | FN | Ctrl |
51 * `-----------------------------------------------------------'
54 [_BASE] = LAYOUT_60_ansi_split_bs_rshift( \
55 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSLS,KC_NO,\
56 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSPC, \
57 TT(_FNAV), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_ENT, \
58 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,F(TILDE),KC_NO, \
59 KC_LCTL, KC_LGUI,KC_LALT, LT(_FNAV, KC_SPC), KC_RALT,TG(_NUMPAD),MO(_MEDIA), KC_RCTL \
63 [_NUMPAD] = LAYOUT_60_ansi_split_bs_rshift( \
64 _______,_______,_______,_______,_______,_______,_______, KC_P7, KC_P8, KC_P9, KC_PSLS, _______,_______,_______,KC_NO,\
65 _______,_______,_______,_______,_______,_______,_______, KC_P4, KC_P5, KC_P6, KC_PAST, _______,_______,_______, \
66 MO(_FNAV),_______,_______,_______,_______,_______,_______, KC_P1, KC_P2, KC_P3, KC_PMNS, _______,_______, \
67 _______,_______,_______,_______,_______,_______,_______, KC_P0,KC_COMM,KC_PDOT,KC_PPLS, _______,KC_NO, \
68 _______,_______,_______, TO(_BASE), _______,_______,_______,_______ \
71 /* F-, arrow, and media keys */
72 [_FNAV] = LAYOUT_60_ansi_split_bs_rshift( \
73 KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,KC_NO,\
74 KC_CAPS,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,_______,_______,KC_DEL, \
75 _______,_______,KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \
76 _______,KC_APP,KC_BTN1,KC_CALC,_______,_______,KC_END,_______,_______,_______,_______,_______,KC_NO, \
77 _______,_______,_______, _______, F(CTLALTDEL),KC_NLCK,_______,_______ \
81 [_MEDIA] = LAYOUT_60_ansi_split_bs_rshift( \
82 _______,F(MODE_SINGLE),F(MODE_PAGE),F(MODE_FLASH),_______,_______,_______, _______, _______, _______,KC_MUTE, KC_VOLD, KC_VOLU,_______,KC_NO,\
83 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
84 _______,_______,_______,_______,_______,F(GAME),_______, _______, _______, _______,_______, _______,_______, \
85 _______,_______,F(ALL) ,F(BRIGHT),F(DIM),F(BACKLIGHT),_______, _______, KC_MPRV, KC_MNXT,KC_MSTP, _______,KC_NO, \
86 _______,_______,_______, KC_MPLY, _______,_______, _______,_______ \
89 [_TILDE] = LAYOUT_60_ansi_split_bs_rshift( \
90 KC_GRV,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\
91 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
92 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \
93 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO, \
94 _______,_______,_______, _______, _______,_______, _______,_______ \
97 [5] = LAYOUT_60_ansi_split_bs_rshift( \
98 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\
99 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
100 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \
101 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO, \
102 _______,_______,_______, _______, _______,_______, _______,_______ \
106 //id for user defined functions and macros
114 ACTION_LEDS_BACKLIGHT,
122 /* ==================================
124 * ==================================*/
128 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27*
129 28 31 32 33 34 35 36 37 38 41 42 43 44 45
130 46 47 48 51 52 53 54 55 56 57 58 61 62
131 63 64 65 66 67 68 71 72 73 74 75 76 77*
132 78 81 82 83 84 85 86 87
133 *Unused in Alphabet Layout
136 //======== full page arrays =========
137 //any change in array size needs to be mirrored in matrix_init_user
138 uint8_t led_numpad[16] = {
145 uint8_t led_nav[12] = {
150 //LED Page 3 - _Media
151 uint8_t led_media[15] = {
153 65,66,67,68, 73,74,75,
156 //LED Page 4 - _Game "WASD"
157 uint8_t led_game[5] = {
163 //======== qmk functions =========
164 const uint16_t fn_actions[] = {
165 [CTLALTDEL] = ACTION_KEY(LALT(LCTL(KC_DEL))),
166 [TILDE] = ACTION_LAYER_MODS(_TILDE, MOD_LSFT),
167 [ALL] = ACTION_FUNCTION(ACTION_LEDS_ALL),
168 [GAME] = ACTION_FUNCTION(ACTION_LEDS_GAME),
169 [BACKLIGHT] = ACTION_FUNCTION(ACTION_LEDS_BACKLIGHT),
170 [BRIGHT] = ACTION_FUNCTION(ACTION_LEDS_BRIGHT),
171 [DIM] = ACTION_FUNCTION(ACTION_LEDS_DIM),
172 [MODE_SINGLE] = ACTION_FUNCTION(ACTION_LEDS_SINGLE),
173 [MODE_PAGE] = ACTION_FUNCTION(ACTION_LEDS_PAGE),
174 [MODE_FLASH] = ACTION_FUNCTION(ACTION_LEDS_FLASH),
177 /* custom action function */
178 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
182 case ACTION_LEDS_ALL:
183 if(record->event.pressed) {
184 led_mode_global = led_mode_global == ALL ? MODE_SINGLE : ALL;
186 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
190 case ACTION_LEDS_BACKLIGHT:
191 if(record->event.pressed) {
192 backlight_status_global ^= 1;
193 msg=(backlight_status_global << 8) | TOGGLE_BACKLIGHT;
194 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
198 case ACTION_LEDS_GAME:
199 if(record->event.pressed) {
200 led_mode_global = led_mode_global == GAME ? MODE_SINGLE : GAME;
202 msg=(4 << 8) | DISPLAY_PAGE;
203 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
207 case ACTION_LEDS_BRIGHT:
208 if(record->event.pressed) {
209 msg=(1 << 8) | STEP_BRIGHTNESS;
210 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
214 case ACTION_LEDS_DIM:
215 if(record->event.pressed) {
216 msg=(0 << 8) | STEP_BRIGHTNESS;
217 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
221 //set led_mode for matrix_scan to toggle leds
222 case ACTION_LEDS_SINGLE:
223 led_mode_global = MODE_SINGLE;
225 case ACTION_LEDS_PAGE:
226 led_mode_global = MODE_PAGE;
228 case ACTION_LEDS_FLASH:
229 led_mode_global = MODE_FLASH;
235 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
241 bool process_record_user (uint16_t keycode, keyrecord_t *record) {
245 // Runs just one time when the keyboard initializes.
246 void matrix_init_user(void) {
248 led_controller_init();
250 // Write predefined led pages.
251 write_led_page(_NUMPAD, led_numpad, 16);
252 chThdSleepMilliseconds(10);
254 write_led_page(_FNAV, led_nav, 12);
255 chThdSleepMilliseconds(10);
257 write_led_page(_MEDIA, led_media, 15);
258 chThdSleepMilliseconds(10);
260 write_led_page(4, led_game, 5);
261 chThdSleepMilliseconds(1000);
264 // Loops constantly in the background.
265 void matrix_scan_user(void) {
267 uint8_t led_pin_byte;
270 if (backlight_status_global == 0) {//backlight is off, skip the rest
274 if (led_layer_state != layer_state && led_mode_global != GAME && led_mode_global != ALL) {
276 //Turn on layer indicator or page depending on mode
277 switch(led_mode_global) {
278 case MODE_FLASH: //flash preset page leds then single indicator
279 page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
280 msg=(page << 8) | DISPLAY_PAGE;
281 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
282 chThdSleepMilliseconds(500);
283 //flow to display single layer leds
285 case MODE_SINGLE: //light layer indicators for all active layers
286 led_pin_byte = layer_state & 0xFF;
287 msg=(7 << 8) | DISPLAY_PAGE;
288 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
289 msg=(1 << 16) | (led_pin_byte << 8) | SET_FULL_ROW;
290 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
293 case MODE_PAGE: //display pre-defined led page
294 page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
295 msg=(page << 8) | DISPLAY_PAGE;
296 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
299 led_layer_state = layer_state;