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 _______,_______,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) {
250 xprintf("init start");
252 led_controller_init();
254 // Write predefined led pages.
255 write_led_page(_NUMPAD, led_numpad, 16);
256 chThdSleepMilliseconds(10);
258 write_led_page(_FNAV, led_nav, 12);
259 chThdSleepMilliseconds(10);
261 write_led_page(_MEDIA, led_media, 15);
262 chThdSleepMilliseconds(10);
264 write_led_page(4, led_game, 5);
265 chThdSleepMilliseconds(1000);
268 // Loops constantly in the background.
269 void matrix_scan_user(void) {
271 uint8_t led_pin_byte;
274 if (backlight_status_global == 0) {//backlight is off, skip the rest
278 if (led_layer_state != layer_state && led_mode_global != GAME && led_mode_global != ALL) {
280 //Turn on layer indicator or page depending on mode
281 switch(led_mode_global) {
282 case MODE_FLASH: //flash preset page leds then single indicator
283 page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
284 msg=(page << 8) | DISPLAY_PAGE;
285 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
286 chThdSleepMilliseconds(500);
287 //flow to display single layer leds
289 case MODE_SINGLE: //light layer indicators for all active layers
290 led_pin_byte = layer_state & 0xFF;
291 msg=(7 << 8) | DISPLAY_PAGE;
292 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
293 msg=(1<<16) | (led_pin_byte << 8) | SET_FULL_ROW;
294 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
297 case MODE_PAGE: //display pre-defined led page
298 page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
299 msg=(page << 8) | DISPLAY_PAGE;
300 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
303 led_layer_state = layer_state;