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, 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 _______,_______,_______, MO(_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 _______,M(0),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 //LED Page 1 - _Numpad
141 //any change in array size needs to be mirrored in matrix_init_user
142 uint8_t led_numpad[16] = {
149 uint8_t led_nav[12] = {
154 //LED Page 3 - _Media
155 uint8_t led_media[15] = {
157 65,66,67,68, 73,74,75,
160 //LED Page 4 - _Game "WASD"
161 uint8_t led_game[5] = {
167 //======== qmk functions =========
168 const uint16_t fn_actions[] = {
169 [CTLALTDEL] = ACTION_KEY(LALT(LCTL(KC_DEL))),
170 [TILDE] = ACTION_LAYER_MODS(_TILDE, MOD_LSFT),
171 [ALL] = ACTION_FUNCTION(ACTION_LEDS_ALL),
172 [GAME] = ACTION_FUNCTION(ACTION_LEDS_GAME),
173 [BACKLIGHT] = ACTION_FUNCTION(ACTION_LEDS_BACKLIGHT),
174 [BRIGHT] = ACTION_FUNCTION(ACTION_LEDS_BRIGHT),
175 [DIM] = ACTION_FUNCTION(ACTION_LEDS_DIM),
176 [MODE_SINGLE] = ACTION_FUNCTION(ACTION_LEDS_SINGLE),
177 [MODE_PAGE] = ACTION_FUNCTION(ACTION_LEDS_PAGE),
178 [MODE_FLASH] = ACTION_FUNCTION(ACTION_LEDS_FLASH),
181 /* custom action function */
182 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
186 case ACTION_LEDS_ALL:
187 if(record->event.pressed) {
188 led_mode_global = led_mode_global == ALL ? MODE_SINGLE : ALL;
189 msg=(TOGGLE_ALL << 8) | 0;
190 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
194 case ACTION_LEDS_BACKLIGHT:
195 if(record->event.pressed) {
196 backlight_status_global ^= 1;
197 msg=(TOGGLE_BACKLIGHT << 8) | (backlight_status_global);
198 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
202 case ACTION_LEDS_GAME:
203 if(record->event.pressed) {
204 led_mode_global = led_mode_global == GAME ? MODE_SINGLE : GAME;
206 msg=(DISPLAY_PAGE << 8) | 4;
207 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
211 case ACTION_LEDS_BRIGHT:
212 if(record->event.pressed) {
213 msg=(STEP_BRIGHTNESS << 8) | 1;
214 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
218 case ACTION_LEDS_DIM:
219 if(record->event.pressed) {
220 msg=(STEP_BRIGHTNESS << 8) | 0;
221 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
225 //set led_mode for matrix_scan to toggle leds
226 case ACTION_LEDS_SINGLE:
227 led_mode_global = MODE_SINGLE;
229 case ACTION_LEDS_PAGE:
230 led_mode_global = MODE_PAGE;
232 case ACTION_LEDS_FLASH:
233 led_mode_global = MODE_FLASH;
239 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
245 bool process_record_user (uint16_t keycode, keyrecord_t *record) {
249 // Runs just one time when the keyboard initializes.
250 void matrix_init_user(void) {
251 xprintf("init start");
253 led_controller_init();
255 // Write predefined led pages.
256 write_led_page(_NUMPAD, led_numpad, 16);
257 chThdSleepMilliseconds(10);
259 write_led_page(_FNAV, led_nav, 12);
260 chThdSleepMilliseconds(10);
262 write_led_page(_MEDIA, led_media, 15);
263 chThdSleepMilliseconds(10);
265 write_led_page(4, led_game, 5);
266 chThdSleepMilliseconds(1000);
269 // Loops constantly in the background.
270 void matrix_scan_user(void) {
272 uint8_t led_pin_byte;
275 if (backlight_status_global == 0) {//backlight is off, skip the rest
279 if (led_layer_state != layer_state && led_mode_global != GAME && led_mode_global != ALL) {
281 //Turn on layer indicator or page depending on mode
282 switch(led_mode_global) {
283 case MODE_FLASH: //flash preset page leds then single indicator
284 page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
285 msg=(DISPLAY_PAGE << 8) | (page);
286 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
287 chThdSleepMilliseconds(500);
288 //flow to display single layer leds
290 case MODE_SINGLE: //light layer indicators for all active layers
291 led_pin_byte = layer_state & 0xFF;
292 msg=(DISPLAY_PAGE << 8) | 7;
293 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
294 msg=(1<<16) | (SET_FULL_ROW << 8) | (led_pin_byte);
295 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
298 case MODE_PAGE: //display pre-defined led page
299 page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
300 msg=(DISPLAY_PAGE << 8) | (page);
301 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
304 led_layer_state = layer_state;