]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/infinity60/keymaps/jpetermans/keymap.c
59249ff728432fa34b4d3b664413a9879757ebca
[qmk_firmware.git] / keyboards / infinity60 / keymaps / jpetermans / keymap.c
1 #include "infinity60.h"
2 #include "led_controller.h"
3
4 //Helpful Defines
5 #define _______ KC_TRNS
6
7 //Define Layer Names
8 #define _BASE 0
9 #define _NUMPAD 1
10 #define _FNAV 2
11 #define _MEDIA 3
12 #define _TILDE 4
13
14 //IS31 chip has 8 available led pages, using 0 for all leds and 7 for single toggles
15 #define max_pages 6
16
17 enum ic60_keycodes {
18   NUMPAD,
19   FNAV,
20   MEDIA,
21   TILDE,
22   CTLALTDEL,
23   BACKLIGHT,
24   BRIGHT,
25   DIM,
26   ALL,
27   GAME,
28   MODE_SINGLE,
29   MODE_PAGE,
30   MODE_FLASH
31 };
32
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;
37
38 /* ==================================
39  *             KEYMAPS
40  * ==================================*/
41
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      * `-----------------------------------------------------------'
55      */
56     /* default */
57     [_BASE] = KEYMAP( \
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         \
63     ),
64
65     /* numpad */
66     [_NUMPAD] = KEYMAP( \
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),           _______,_______,_______,_______   \
72     ),
73
74     /* F-, arrow, and media keys */
75     [_FNAV] = KEYMAP( \
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,_______,_______   \
81     ),
82
83     /* media */
84     [_MEDIA] = KEYMAP( \
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,             _______,_______, _______,_______      \
90     ),
91     /* ~ */
92     [_TILDE] = KEYMAP( \
93         KC_GRV,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\
94         _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
95         _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,     \
96         _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO,       \
97         _______,_______,_______,               _______,             _______,_______, _______,_______      \
98     ),
99     /* template */
100     [5] = KEYMAP( \
101         _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\
102         _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
103         _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,     \
104         _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO,       \
105         _______,_______,_______,               _______,             _______,_______, _______,_______      \
106     ),
107 };
108
109 //id for user defined functions and macros
110 enum function_id {
111     NONE,
112 };
113
114 enum macro_id {
115     ACTION_LEDS_ALL,
116     ACTION_LEDS_GAME,
117     ACTION_LEDS_BACKLIGHT,
118     ACTION_LEDS_BRIGHT,
119     ACTION_LEDS_DIM,
120     ACTION_LEDS_SINGLE,
121     ACTION_LEDS_PAGE,
122     ACTION_LEDS_FLASH
123 };
124
125 /* ==================================
126  *          LED MAPPING
127  * ==================================*/
128
129 /*
130     Infinity60 LED MAP
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
137 */
138
139 //======== full page arrays =========
140 //any change in array size needs to be mirrored in matrix_init_user
141 uint8_t led_numpad[16] = {
142   18,21,22,23,
143   37,38,41,42,
144   55,56,57,58,
145   72,73,74,75
146 };
147 //LED Page 2 - _Nav
148 uint8_t led_nav[12] = {
149                         38,
150   47,48,              55,56,57,
151      64,65,66
152 };
153 //LED Page 3 - _Media
154 uint8_t led_media[15] = {
155   12,13,14,           23,24,25,
156      65,66,67,68,    73,74,75,
157            83,          86
158 };
159 //LED Page 4 - _Game "WASD"
160 uint8_t led_game[5] = {
161   11,
162         32,
163      47,48,51
164 };
165
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),
178 };
179
180 /* custom action function */
181 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
182   msg_t msg;
183
184   switch(id) {
185     case ACTION_LEDS_ALL:
186       if(record->event.pressed) {
187         led_mode_global = led_mode_global == ALL ? MODE_SINGLE : ALL;
188         msg=TOGGLE_ALL;
189         chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
190       }
191       break;
192
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);
198       }
199       break;
200
201     case ACTION_LEDS_GAME:
202       if(record->event.pressed) {
203         led_mode_global = led_mode_global == GAME ? MODE_SINGLE : GAME;
204
205         msg=(4 << 8) | DISPLAY_PAGE;
206         chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
207       }
208       break;
209
210     case ACTION_LEDS_BRIGHT:
211       if(record->event.pressed) {
212         msg=(1 << 8) | STEP_BRIGHTNESS;
213         chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
214       }
215       break;
216
217     case ACTION_LEDS_DIM:
218       if(record->event.pressed) {
219         msg=(0 << 8) | STEP_BRIGHTNESS;
220         chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
221       }
222       break;
223
224     //set led_mode for matrix_scan to toggle leds
225     case ACTION_LEDS_SINGLE:
226       led_mode_global = MODE_SINGLE;
227       break;
228     case ACTION_LEDS_PAGE:
229       led_mode_global = MODE_PAGE;
230       break;
231     case ACTION_LEDS_FLASH:
232       led_mode_global = MODE_FLASH;
233       break;
234
235   }
236 }
237
238 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
239 {
240     return MACRO_NONE;
241 };
242
243
244 bool process_record_user (uint16_t keycode, keyrecord_t *record) {
245   return true;
246 }
247
248 // Runs just one time when the keyboard initializes.
249 void matrix_init_user(void) {
250
251     led_controller_init();
252
253     // Write predefined led pages.
254     write_led_page(_NUMPAD, led_numpad, 16);
255     chThdSleepMilliseconds(10);
256
257     write_led_page(_FNAV, led_nav, 12);
258     chThdSleepMilliseconds(10);
259
260     write_led_page(_MEDIA, led_media, 15);
261     chThdSleepMilliseconds(10);
262
263     write_led_page(4, led_game, 5);
264     chThdSleepMilliseconds(1000);
265 };
266
267 // Loops constantly in the background.
268 void matrix_scan_user(void) {
269   uint8_t page;
270   uint8_t led_pin_byte;
271   msg_t msg;
272
273   if (backlight_status_global == 0) {//backlight is off, skip the rest
274     return;
275   }
276
277   if (led_layer_state != layer_state && led_mode_global != GAME && led_mode_global != ALL) {
278     //check mode
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
287
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);
294         break;
295
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);
300         break;
301       }
302   led_layer_state = layer_state;
303   }
304 }