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