2 #include <avr/sfr_defs.h>
3 #include <avr/timer_avr.h>
13 uint16_t click_hz = CLICK_HZ;
14 uint16_t click_time = CLICK_MS;
15 uint8_t click_toggle = CLICK_ENABLED;
18 const Layer_Info layer_info[] = {
19 // Layer Mask Red Green Blue
20 {0x00000000, 0xFFFFFFFF, {0x00, 0xFF, 0x00}}, // base layers - green
21 {0x00000002, 0xFFFFFFFE, {0x00, 0x00, 0xFF}}, // function layer - blue
22 {0x00000004, 0xFFFFFFFC, {0xFF, 0x00, 0xFF}}, // settings layer - magenta
23 {0xFFFFFFFF, 0xFFFFFFFF, {0xFF, 0xFF, 0xFF}}, // unknown layer - REQUIRED - white
26 void matrix_init_kb(void)
28 // put your keyboard start-up code here
29 // runs once when the firmware starts up
31 set_rgb(31, 0x00, 0x00, 0x00); // Caps lock
32 set_rgb(32, 0xFF, 0x00, 0x00); // Layer indicator, start red
34 // If we're not using the audio pin, drive it low
41 #ifdef WATCHDOG_ENABLE
42 // This is done after turning the layer LED red, if we're caught in a loop
43 // we should get a flashing red light
44 wdt_enable(WDTO_500MS);
48 void matrix_scan_kb(void)
50 #ifdef WATCHDOG_ENABLE
54 // switch/underglow lighting update
55 static uint32_t issi_device = 0;
56 static uint32_t twi_last_ready = 0;
57 if(twi_last_ready > 1000){
58 // Its been way too long since the last ISSI update, reset the I2C bus and start again
65 // If the i2c bus is available, kick off the issi update, alternate between devices
66 update_issi(issi_device, issi_device);
76 // Update layer indicator LED
78 // Not sure how else to reliably do this... TMK has the 'hook_layer_change'
79 // but can't find QMK equiv
80 static uint32_t layer_indicator = -1;
81 if(layer_indicator != layer_state){
82 for(uint32_t i=0;; i++){
83 // the layer_info list should end with layer 0xFFFF
84 // it will break this out of the loop and define the unknown layer color
85 if((layer_info[i].layer == (layer_state & layer_info[i].mask)) || (layer_info[i].layer == 0xFFFFFFFF)){
86 set_rgb(32, layer_info[i].color.red, layer_info[i].color.green, layer_info[i].color.blue);
87 layer_indicator = layer_state;
95 void click(uint16_t freq, uint16_t duration){
97 if(freq >= 100 && freq <= 20000 && duration < 100){
99 for (uint16_t i = 0; i < duration; i++){
107 bool process_record_kb(uint16_t keycode, keyrecord_t* record)
109 if (click_toggle && record->event.pressed){
110 click(click_hz, click_time);
112 if (keycode == RESET) {
116 return process_record_user(keycode, record);
119 void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
124 if(id == LFK_ESC_TILDE){
125 // Send ~ on shift-esc
126 void (*method)(uint8_t) = (event->event.pressed) ? &add_key : &del_key;
127 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT));
128 method(shifted ? KC_GRAVE : KC_ESCAPE);
129 send_keyboard_report();
130 }else if(event->event.pressed){
132 case LFK_SET_DEFAULT_LAYER:
133 // set/save the current base layer to eeprom, falls through to LFK_CLEAR
134 eeconfig_update_default_layer(1UL << opt);
135 default_layer_set(1UL << opt);
137 // Go back to default layer
146 case LFK_CLICK_FREQ_LOWER:
147 sign = -1; // continue to next statement
148 case LFK_CLICK_FREQ_HIGHER:
149 click_hz += sign * 100;
150 click(click_hz, click_time);
152 case LFK_CLICK_TOGGLE:
163 case LFK_CLICK_TIME_SHORTER:
164 sign = -1; // continue to next statement
165 case LFK_CLICK_TIME_LONGER:
167 click(click_hz, click_time);
174 void reset_keyboard_kb(){
175 #ifdef WATCHDOG_ENABLE
180 set_rgb(31, 0x00, 0xFF, 0xFF);
181 set_rgb(32, 0x00, 0xFF, 0xFF);
182 force_issi_refresh();
186 void led_set_kb(uint8_t usb_led)
188 // Set capslock LED to Blue
189 if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
190 set_rgb(31, 0x00, 0x00, 0x7F);
192 set_rgb(31, 0x00, 0x00, 0x00);
194 led_set_user(usb_led);
197 // Lighting info, see lighting.h for details
198 const uint8_t switch_matrices[] = {0, 1};
199 const uint8_t rgb_matrices[] = {6, 7};
206 // 23 22 21 20 14 15 11 1 2
207 const uint8_t rgb_sequence[] = {
208 27, 29, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 11, 15, 14, 20, 21, 22, 23, 24, 25, 26
211 // Maps switch LEDs from Row/Col to ISSI matrix.
213 // Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
214 // | | ISSI Col | ISSI Row |
217 const uint8_t switch_leds[MATRIX_ROWS][MATRIX_COLS] =
219 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91,
220 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0xA9, 0xA8, 0xA7, 0xA6, 0xA5, 0xA4, 0xA3, 0xA2, 0xA1,
221 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0xB9, 0xB8, 0xB7, 0xB6, 0xB5, 0xB3,
222 0x49, 0x48, 0x47, 0x45, 0x44, 0x43, 0x42, 0x41, 0xC9, 0xC8, 0xC7, 0xC6, 0xC5, 0xC4, 0xC2,
223 0x59, 0x58, 0x57, 0x56, 0x55, 0x51, 0xD6, 0xE5, 0xE4, 0xE3, 0xE2, 0xE1,
224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);