1 #include "infinity60.h"
2 #include "led_controller.h"
3 #include "keymap_jpetermans.h"
6 #define _______ KC_TRNS
15 /* ==================================
17 * ==================================*/
19 const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
20 /* Layer 0: Default Layer
21 * ,-----------------------------------------------------------.
22 * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Backs|
23 * |-----------------------------------------------------------|
24 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|
25 * |-----------------------------------------------------------|
26 * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Enter |
27 * |-----------------------------------------------------------|
28 * |Shif| | Z| X| C| V| B| N| M| ,| .| /|Shift |
29 * |-----------------------------------------------------------|
30 * |Ctrl|Gui |Alt | Space |Alt |Gui | FN | Ctrl |
31 * `-----------------------------------------------------------'
35 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,\
36 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, \
37 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, \
38 F(1), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,KC_NO, \
39 KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,TG(_NUMPAD),MO(_MEDIA), KC_RCTL \
42 /* F-, arrow, and media keys */
44 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,\
45 KC_CAPS,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,_______,_______,KC_DEL, \
46 _______,M(0),KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \
47 _______,KC_APP,KC_BTN1,KC_CALC,_______,_______,KC_END,_______,_______,_______,_______,_______,KC_NO, \
48 _______,_______,_______, _______, F(0),KC_NLCK,_______,_______ \
53 _______,_______,_______,_______,_______,_______,_______, KC_P7, KC_P8, KC_P9, KC_PSLS, _______,_______,_______,KC_NO,\
54 _______,_______,_______,_______,_______,_______,_______, KC_P4, KC_P5, KC_P6, KC_PAST, _______,_______,_______, \
55 MO(_FNAV),_______,_______,_______,_______,_______,_______, KC_P1, KC_P2, KC_P3, KC_PMNS, _______,_______, \
56 _______,_______,_______,_______,_______,_______,_______, KC_P0,KC_COMM,KC_PDOT,KC_PPLS, _______,KC_NO, \
57 _______,_______,_______, MO(_BASE), _______,_______,_______,_______ \
62 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,KC_MUTE, KC_VOLD, KC_VOLU,_______,KC_NO,\
63 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
64 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \
65 _______,_______,F(2),F(3),F(4),F(5),F(6),F(7), KC_MPRV, KC_MNXT,KC_MSTP, _______,KC_NO, \
66 _______,_______,_______, KC_MPLY, _______,_______, _______,_______ \
70 KC_GRV,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\
71 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
72 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \
73 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO, \
74 _______,_______,_______, _______, _______,_______, _______,_______ \
78 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,KC_NO,\
79 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
80 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \
81 _______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,KC_NO, \
82 _______,_______,_______, _______, _______,_______, _______,_______ \
86 //id for user defined functions and macros
99 /* ==================================
101 * ==================================*/
104 Configuring led control can be done as
105 1. full keyboard at a time - define led array, or
106 2. individual led - send specific led address (defined in keymap.h)
109 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27*
110 28 31 32 33 34 35 36 37 38 41 42 43 44 45
111 46 47 48 51 52 53 54 55 56 57 58 61 62
112 63 64 65 66 67 68 71 72 73 74 75 76 77*
113 78 81 82 83 84 85 86 87
114 *Unused in Alphabet Layout
116 The full keyboard arrays map to the mcu's LED pages
117 (8 available) desribed in led_controller.c
119 0x24 (pcb row 1) is first byte of PWM portion of LED page
120 0x34 (pcb row 2) is 17th byte of PWM portion of LED page
121 array translates to row and column positions
124 //LED Layer indicator (1 per layer 3-7)
125 const uint8_t led_single_layer[5] = {
128 //LED Page 1 - All off
129 //LED Page 2 - All on
131 const uint8_t led_nav[33] = {
132 11,12,13,14,15,16,17,18,21,22,23,24,25,
134 46,47,48, 54,55,56,57,58,
138 //LED Page 4 - _Numpad
139 const uint8_t led_numpad[17] = {
146 //LED Page 5 - _Media
147 const uint8_t led_media[12] = {
155 const uint8_t led_game[5] = {
170 const uint16_t fn_actions[] = {
171 [0] = ACTION_KEY(LALT(LCTL(KC_DEL))),
172 [1] = ACTION_LAYER_MODS(_TILDE, MOD_LSFT),
173 [2] = ACTION_FUNCTION(ACTION_LEDS_ALL),
174 [3] = ACTION_FUNCTION(ACTION_LEDS_GAME),
175 [4] = ACTION_FUNCTION(ACTION_LEDS_MEDIA),
176 [5] = ACTION_FUNCTION(ACTION_LEDS_NAV),
177 [6] = ACTION_FUNCTION(ACTION_LEDS_NUMPAD)
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 // signal the LED controller thread
189 msg=(TOGGLE_ALL << 8) | 0;
190 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
193 case ACTION_LEDS_GAME:
194 if(record->event.pressed) {
195 // signal the LED controller thread
196 msg=(TOGGLE_LED << 8) | 11;
197 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
200 case ACTION_LEDS_NAV:
201 if(record->event.pressed) {
202 // signal the LED controller thread
203 msg=(TOGGLE_LAYER_LEDS << 8) | 3;
204 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
206 case ACTION_LEDS_NUMPAD:
207 if(record->event.pressed) {
208 // signal the LED controller thread
209 msg=(TOGGLE_LAYER_LEDS << 8) | 4;
210 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
212 case ACTION_LEDS_MEDIA:
213 if(record->event.pressed) {
214 // signal the LED controller thread
215 msg=(TOGGLE_LAYER_LEDS << 8) | 5;
216 chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
221 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
225 if (record->event.pressed) {
229 if (record->event.pressed) {
237 // Runs just one time when the keyboard initializes.
238 void matrix_init_user(void) {
240 led_controller_init();
242 //TODO: do pages need to be written at init or ok on demand?
244 write_led_page(3, led_nav, 33);
245 chThdSleepMilliseconds(5);
247 write_led_page(4, led_numpad, 17);
248 chThdSleepMilliseconds(5);
250 write_led_page(5, led_media, 12);
251 chThdSleepMilliseconds(5);
253 write_led_page(6, led_game, 5);
254 chThdSleepMilliseconds(5);
257 // Runs constantly in the background, in a loop.
258 void matrix_scan_user(void) {