1
0
Fork 0

updated keymap for new led functions

This commit is contained in:
jpetermans 2017-05-08 15:13:02 -07:00
parent 2c5b551970
commit 5df74f3ba7
4 changed files with 242 additions and 201 deletions

View file

@ -1,6 +1,5 @@
#include "infinity60.h"
#include "led_controller.h"
#include "keymap_jpetermans.h"
//Helpful Defines
#define _______ KC_TRNS
@ -12,8 +11,33 @@
#define _MEDIA 3
#define _TILDE 4
//IS31 chip has 8 available led pages, using 0 for all leds and 7 for single toggles
#define max_pages 6
enum ic60_keycodes {
NUMPAD,
FNAV,
MEDIA,
TILDE,
CTLALTDEL,
BACKLIGHT,
BRIGHT,
DIM,
BREATH,
ALL,
GAME,
MODE_SINGLE,
MODE_PAGE,
MODE_FLASH
};
uint8_t current_layer_global = 0;
uint8_t led_mode_global = MODE_SINGLE;
uint8_t backlight_status_global = 1; //init on/off state of backlight
uint32_t led_layer_state = 0;
/* ==================================
* KEYMAPS
* KEYMAPS
* ==================================*/
const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@ -35,19 +59,10 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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,\
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, \
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, \
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, \
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, \
KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,TG(_NUMPAD),MO(_MEDIA), KC_RCTL \
),
/* F-, arrow, and media keys */
[_FNAV] = KEYMAP( \
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,\
KC_CAPS,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,_______,_______,KC_DEL, \
_______,M(0),KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \
_______,KC_APP,KC_BTN1,KC_CALC,_______,_______,KC_END,_______,_______,_______,_______,_______,KC_NO, \
_______,_______,_______, _______, F(0),KC_NLCK,_______,_______ \
),
/* numpad */
[_NUMPAD] = KEYMAP( \
_______,_______,_______,_______,_______,_______,_______, KC_P7, KC_P8, KC_P9, KC_PSLS, _______,_______,_______,KC_NO,\
@ -57,12 +72,21 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______,_______,_______, MO(_BASE), _______,_______,_______,_______ \
),
/* F-, arrow, and media keys */
[_FNAV] = KEYMAP( \
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,\
KC_CAPS,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,_______,_______,KC_DEL, \
_______,M(0),KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \
_______,KC_APP,KC_BTN1,KC_CALC,_______,_______,KC_END,_______,_______,_______,_______,_______,KC_NO, \
_______,_______,_______, _______, F(CTLALTDEL),KC_NLCK,_______,_______ \
),
/* media */
[_MEDIA] = KEYMAP( \
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,KC_MUTE, KC_VOLD, KC_VOLU,_______,KC_NO,\
_______,F(MODE_SINGLE),F(MODE_PAGE),F(MODE_FLASH),_______,_______,_______, _______, _______, _______,KC_MUTE, KC_VOLD, KC_VOLU,_______,KC_NO,\
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______,_______,\
_______,_______,_______,_______,_______,_______,_______, _______, _______, _______,_______, _______,_______, \
_______,_______,F(2),F(3),F(4),F(5),F(6),F(7), KC_MPRV, KC_MNXT,KC_MSTP, _______,KC_NO, \
_______,_______,_______,_______,_______,F(GAME),_______, _______, _______, _______,_______, _______,_______, \
_______,_______,F(ALL) ,F(BRIGHT),F(DIM),F(BACKLIGHT),_______, _______, KC_MPRV, KC_MNXT,KC_MSTP, _______,KC_NO, \
_______,_______,_______, KC_MPLY, _______,_______, _______,_______ \
),
/* ~ */
@ -91,21 +115,20 @@ enum function_id {
enum macro_id {
ACTION_LEDS_ALL,
ACTION_LEDS_GAME,
ACTION_LEDS_NAV,
ACTION_LEDS_MEDIA,
ACTION_LEDS_NUMPAD,
ACTION_LEDS_TEST
ACTION_LEDS_BACKLIGHT,
ACTION_LEDS_BRIGHT,
ACTION_LEDS_DIM,
ACTION_LEDS_BREATH,
ACTION_LEDS_SINGLE,
ACTION_LEDS_PAGE,
ACTION_LEDS_FLASH,
};
/* ==================================
* LED MAPPING
* LED MAPPING
* ==================================*/
/*
Configuring led control can be done as
1. full keyboard at a time - define led array, or
2. individual led - send specific led address (defined in keymap.h)
Infinity60 LED MAP
11 12 13 14 15 16 17 18 21 22 23 24 25 26 27*
28 31 32 33 34 35 36 37 38 41 42 43 44 45
@ -113,163 +136,182 @@ enum macro_id {
63 64 65 66 67 68 71 72 73 74 75 76 77*
78 81 82 83 84 85 86 87
*Unused in Alphabet Layout
The full keyboard arrays map to the mcu's LED pages
(8 available) desribed in led_controller.c
0x24 (pcb row 1) is first byte of PWM portion of LED page
0x34 (pcb row 2) is 17th byte of PWM portion of LED page
array translates to row and column positions
*/
//LED Layer indicator (1 per layer 3-7)
const uint8_t led_single_layer[5] = {
12,13,14,15,16
};
//LED Page 1 - All off
//LED Page 2 - All on
//LED Page 3 - _Nav
const uint8_t led_nav[33] = {
11,12,13,14,15,16,17,18,21,22,23,24,25,
28, 37,38,41,42,45,
46,47,48, 54,55,56,57,58,
64,65,66, 71,
84,85
};
//LED Page 4 - _Numpad
const uint8_t led_numpad[17] = {
//======== full page arrays =========
//LED Page 1 - _Numpad
//any change in array size needs to be mirrored in matrix_init_user
uint8_t led_numpad[16] = {
18,21,22,23,
37,38,41,42,
55,56,57,58,
72,73,74,75,
85
72,73,74,75
};
//LED Page 5 - _Media
const uint8_t led_media[12] = {
23,24,25,
38,
55,56,57,
73,74,75,
83, 86
//LED Page 2 - _Nav
uint8_t led_nav[12] = {
38,
47,48, 55,56,57,
64,65,66
};
//LED Page 6 - _Game
const uint8_t led_game[5] = {
//row 1
//LED Page 3 - _Media
uint8_t led_media[15] = {
12,13,14, 23,24,25,
65,66,67,68, 73,74,75,
83, 86
};
//LED Page 4 - _Game "WASD"
uint8_t led_game[5] = {
11,
//row 2
//row 3
32,
//row 4
47, 48,
//row 5
51
//row 6
//row 7
//row 8
32,
47,48,51
};
//======== qmk functions =========
const uint16_t fn_actions[] = {
[0] = ACTION_KEY(LALT(LCTL(KC_DEL))),
[1] = ACTION_LAYER_MODS(_TILDE, MOD_LSFT),
[2] = ACTION_FUNCTION(ACTION_LEDS_ALL),
[3] = ACTION_FUNCTION(ACTION_LEDS_GAME),
[4] = ACTION_FUNCTION(ACTION_LEDS_MEDIA),
[5] = ACTION_FUNCTION(ACTION_LEDS_NAV),
[6] = ACTION_FUNCTION(ACTION_LEDS_NUMPAD),
[7] = ACTION_FUNCTION(ACTION_LEDS_TEST)
[CTLALTDEL] = ACTION_KEY(LALT(LCTL(KC_DEL))),
[TILDE] = ACTION_LAYER_MODS(_TILDE, MOD_LSFT),
[ALL] = ACTION_FUNCTION(ACTION_LEDS_ALL),
[GAME] = ACTION_FUNCTION(ACTION_LEDS_GAME),
[BACKLIGHT] = ACTION_FUNCTION(ACTION_LEDS_BACKLIGHT),
[BRIGHT] = ACTION_FUNCTION(ACTION_LEDS_BRIGHT),
[DIM] = ACTION_FUNCTION(ACTION_LEDS_DIM),
[BREATH] = ACTION_FUNCTION(ACTION_LEDS_BREATH),
[MODE_SINGLE] = ACTION_FUNCTION(ACTION_LEDS_SINGLE),
[MODE_PAGE] = ACTION_FUNCTION(ACTION_LEDS_PAGE),
[MODE_FLASH] = ACTION_FUNCTION(ACTION_LEDS_FLASH),
};
/* custom action function */
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
(void)opt;
msg_t msg;
switch(id) {
case ACTION_LEDS_ALL:
if(record->event.pressed) {
// signal the LED controller thread
led_mode_global = led_mode_global == ALL ? MODE_SINGLE : ALL;
msg=(TOGGLE_ALL << 8) | 0;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
case ACTION_LEDS_BACKLIGHT:
if(record->event.pressed) {
backlight_status_global ^= 1;
msg=(TOGGLE_BACKLIGHT << 8) | (backlight_status_global);
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
case ACTION_LEDS_GAME:
if(record->event.pressed) {
// signal the LED controller thread
msg=(TOGGLE_LAYER_LEDS << 8) | 6;
led_mode_global = led_mode_global == GAME ? MODE_SINGLE : GAME;
msg=(DISPLAY_PAGE << 8) | 4;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
case ACTION_LEDS_MEDIA:
case ACTION_LEDS_BRIGHT:
if(record->event.pressed) {
// signal the LED controller thread
msg=(TOGGLE_LAYER_LEDS << 8) | 5;
msg=(STEP_BRIGHTNESS << 8) | 1;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
case ACTION_LEDS_NAV:
case ACTION_LEDS_DIM:
if(record->event.pressed) {
// signal the LED controller thread
msg=(OFF_LED << 8) | 12;
msg=(STEP_BRIGHTNESS << 8) | 0;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
case ACTION_LEDS_NUMPAD:
case ACTION_LEDS_BREATH:
if(record->event.pressed) {
// signal the LED controller thread
msg=(ON_LED << 8) | 12;
msg=(TOGGLE_BREATH << 8) | 0;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
break;
case ACTION_LEDS_TEST:
if(record->event.pressed) {
// signal the LED controller thread
msg=(TOGGLE_LED << 8) | 12;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
}
//set led_mode for matrix_scan to toggle leds
case ACTION_LEDS_SINGLE:
led_mode_global = MODE_SINGLE;
break;
case ACTION_LEDS_PAGE:
led_mode_global = MODE_PAGE;
break;
case ACTION_LEDS_FLASH:
led_mode_global = MODE_FLASH;
break;
}
}
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
case 0:
if (record->event.pressed) {
}
break;
case 1:
if (record->event.pressed) {
}
break;
}
return MACRO_NONE;
};
bool process_record_user (uint16_t keycode, keyrecord_t *record) {
return true;
}
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
xprintf("init start");
led_controller_init();
//TODO: do pages need to be written at init or ok on demand?
/* Write pages */
write_led_page(3, led_nav, 33);
chThdSleepMilliseconds(5);
// Write predefined led pages.
write_led_page(_NUMPAD, led_numpad, 16);
chThdSleepMilliseconds(10);
write_led_page(4, led_numpad, 17);
chThdSleepMilliseconds(5);
write_led_page(_FNAV, led_nav, 12);
chThdSleepMilliseconds(10);
write_led_page(5, led_media, 12);
chThdSleepMilliseconds(5);
write_led_page(_MEDIA, led_media, 15);
chThdSleepMilliseconds(10);
write_led_page(6, led_game, 5);
chThdSleepMilliseconds(5);
write_led_page(4, led_game, 5);
chThdSleepMilliseconds(1000);
};
// Runs constantly in the background, in a loop.
// Loops constantly in the background.
void matrix_scan_user(void) {
uint8_t page;
uint8_t led_pin_byte;
msg_t msg;
};
if (backlight_status_global == 0) {//backlight is off, skip the rest
return;
}
if (led_layer_state != layer_state && led_mode_global != GAME && led_mode_global != ALL) {
//check mode
//Turn on layer indicator or page depending on mode
switch(led_mode_global) {
case MODE_FLASH: //flash preset page leds then single indicator
page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
msg=(DISPLAY_PAGE << 8) | (page);
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
chThdSleepMilliseconds(500);
//flow to display single layer leds
case MODE_SINGLE: //light layer indicators for all active layers
led_pin_byte = layer_state & 0xFF;
msg=(DISPLAY_PAGE << 8) | 7;
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
msg=(1<<16) | (SET_FULL_ROW << 8) | (led_pin_byte);
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
break;
case MODE_PAGE: //display pre-defined led page
page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
msg=(DISPLAY_PAGE << 8) | (page);
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
break;
}
led_layer_state = layer_state;
}
}