1 #include "infinity60.h"
2 #include "led_controller.h"
5 #define _______ KC_TRNS
14 //IS31 chip has 8 available led pages, using 0 for all leds and 7 for single toggles
33 uint8_t current_layer_global = 0;
34 uint8_t led_mode_global = MODE_SINGLE;
35 uint8_t backlight_status_global = 1; //init on/off state of backlight
36 uint32_t led_layer_state = 0;
38 /* ==================================
40 * ==================================*/
42 const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
43 /* Layer 0: Default Layer
44 * ,-----------------------------------------------------------.
45 * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Backs|
46 * |-----------------------------------------------------------|
47 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|
48 * |-----------------------------------------------------------|
49 * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Enter |
50 * |-----------------------------------------------------------|
51 * |Shif| | Z| X| C| V| B| N| M| ,| .| /|Shift |
52 * |-----------------------------------------------------------|
53 * |Ctrl|Gui |Alt | Space |Alt |Gui | FN | Ctrl |
54 * `-----------------------------------------------------------'
58 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,\
59 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, \
60 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, \
61 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, \
62 KC_LCTL, KC_LGUI,KC_LALT, LT(_FNAV, KC_SPC), KC_RALT,TG(_NUMPAD),MO(_MEDIA), KC_RCTL \
67 _______,_______,_______,_______,_______,_______,_______, KC_P7, KC_P8, KC_P9, KC_PSLS, _______,_______,_______,KC_NO,\
68 _______,_______,_______,_______,_______,_______,_______, KC_P4, KC_P5, KC_P6, KC_PAST, _______,_______,_______, \
69 MO(_FNAV),_______,_______,_______,_______,_______,_______, KC_P1, KC_P2, KC_P3, KC_PMNS, _______,_______, \
70 _______,_______,_______,_______,_______,_______,_______, KC_P0,KC_COMM,KC_PDOT,KC_PPLS, _______,KC_NO, \
71 _______,_______,_______, TO(_BASE), _______,_______,_______,_______ \
74 /* F-, arrow, and media keys */
76 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,\
77 KC_CAPS,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,_______,_______,KC_DEL, \
78 _______,_______,KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \
79 _______,KC_APP,KC_BTN1,KC_CALC,_______,_______,KC_END,_______,_______,_______,_______,_______,KC_NO, \
80 _______,_______,_______, _______, F(CTLALTDEL),KC_NLCK,_______,_______ \
85 _______,F(MODE_SINGLE),F(MODE_PAGE),F(MODE_FLASH),_______,_______,_______, _______, _______, _______,KC_MUTE, KC_VOLD, KC_VOLU,_______,KC_NO,\
86 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
87 _______,_______,_______,_______,_______,F(GAME),_______, _______, _______, _______,_______, _______,_______, \
88 _______,_______,F(ALL) ,F(BRIGHT),F(DIM),F(BACKLIGHT),_______, _______, KC_MPRV, KC_MNXT,KC_MSTP, _______,KC_NO, \
89 _______,_______,_______, KC_MPLY, _______,_______, _______,_______ \
93 KC_GRV,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\
94 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
95 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \
96 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO, \
97 _______,_______,_______, _______, _______,_______, _______,_______ \
101 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\
102 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
103 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \
104 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO, \
105 _______,_______,_______, _______, _______,_______, _______,_______ \
109 //id for user defined functions and macros
117 ACTION_LEDS_BACKLIGHT,
125 /* ==================================
127 * ==================================*/
131 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27*
132 28 31 32 33 34 35 36 37 38 41 42 43 44 45
133 46 47 48 51 52 53 54 55 56 57 58 61 62
134 63 64 65 66 67 68 71 72 73 74 75 76 77*
135 78 81 82 83 84 85 86 87
136 *Unused in Alphabet Layout
139 //======== full page arrays =========
140 //any change in array size needs to be mirrored in matrix_init_user
141 uint8_t led_numpad[16] = {
148 uint8_t led_nav[12] = {
153 //LED Page 3 - _Media
154 uint8_t led_media[15] = {
156 65,66,67,68, 73,74,75,
159 //LED Page 4 - _Game "WASD"
160 uint8_t led_game[5] = {
166 //======== qmk functions =========
167 const uint16_t fn_actions[] = {
168 [CTLALTDEL] = ACTION_KEY(LALT(LCTL(KC_DEL))),
169 [TILDE] = ACTION_LAYER_MODS(_TILDE, MOD_LSFT),
170 [ALL] = ACTION_FUNCTION(ACTION_LEDS_ALL),
171 [GAME] = ACTION_FUNCTION(ACTION_LEDS_GAME),
172 [BACKLIGHT] = ACTION_FUNCTION(ACTION_LEDS_BACKLIGHT),
173 [BRIGHT] = ACTION_FUNCTION(ACTION_LEDS_BRIGHT),
174 [DIM] = ACTION_FUNCTION(ACTION_LEDS_DIM),
175 [MODE_SINGLE] = ACTION_FUNCTION(ACTION_LEDS_SINGLE),
176 [MODE_PAGE] = ACTION_FUNCTION(ACTION_LEDS_PAGE),
177 [MODE_FLASH] = ACTION_FUNCTION(ACTION_LEDS_FLASH),
180 /* custom action function */
181 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
185 case ACTION_LEDS_ALL:
186 if(record->event.pressed) {
187 led_mode_global = led_mode_global == ALL ? MODE_SINGLE : ALL;
189 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
193 case ACTION_LEDS_BACKLIGHT:
194 if(record->event.pressed) {
195 backlight_status_global ^= 1;
196 msg=(backlight_status_global << 8) | TOGGLE_BACKLIGHT;
197 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
201 case ACTION_LEDS_GAME:
202 if(record->event.pressed) {
203 led_mode_global = led_mode_global == GAME ? MODE_SINGLE : GAME;
205 msg=(4 << 8) | DISPLAY_PAGE;
206 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
210 case ACTION_LEDS_BRIGHT:
211 if(record->event.pressed) {
212 msg=(1 << 8) | STEP_BRIGHTNESS;
213 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
217 case ACTION_LEDS_DIM:
218 if(record->event.pressed) {
219 msg=(0 << 8) | STEP_BRIGHTNESS;
220 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
224 //set led_mode for matrix_scan to toggle leds
225 case ACTION_LEDS_SINGLE:
226 led_mode_global = MODE_SINGLE;
228 case ACTION_LEDS_PAGE:
229 led_mode_global = MODE_PAGE;
231 case ACTION_LEDS_FLASH:
232 led_mode_global = MODE_FLASH;
238 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
244 bool process_record_user (uint16_t keycode, keyrecord_t *record) {
248 // Runs just one time when the keyboard initializes.
249 void matrix_init_user(void) {
251 led_controller_init();
253 // Write predefined led pages.
254 write_led_page(_NUMPAD, led_numpad, 16);
255 chThdSleepMilliseconds(10);
257 write_led_page(_FNAV, led_nav, 12);
258 chThdSleepMilliseconds(10);
260 write_led_page(_MEDIA, led_media, 15);
261 chThdSleepMilliseconds(10);
263 write_led_page(4, led_game, 5);
264 chThdSleepMilliseconds(1000);
267 // Loops constantly in the background.
268 void matrix_scan_user(void) {
270 uint8_t led_pin_byte;
273 if (backlight_status_global == 0) {//backlight is off, skip the rest
277 if (led_layer_state != layer_state && led_mode_global != GAME && led_mode_global != ALL) {
279 //Turn on layer indicator or page depending on mode
280 switch(led_mode_global) {
281 case MODE_FLASH: //flash preset page leds then single indicator
282 page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
283 msg=(page << 8) | DISPLAY_PAGE;
284 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
285 chThdSleepMilliseconds(500);
286 //flow to display single layer leds
288 case MODE_SINGLE: //light layer indicators for all active layers
289 led_pin_byte = layer_state & 0xFF;
290 msg=(7 << 8) | DISPLAY_PAGE;
291 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
292 msg=(1 << 16) | (led_pin_byte << 8) | SET_FULL_ROW;
293 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
296 case MODE_PAGE: //display pre-defined led page
297 page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
298 msg=(page << 8) | DISPLAY_PAGE;
299 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
302 led_layer_state = layer_state;