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;
17 void matrix_init_kb(void)
19 // put your keyboard start-up code here
20 // runs once when the firmware starts up
22 set_rgb(31, 0x00, 0x00, 0x00); // Caps lock
23 set_rgb(32, 0xFF, 0x00, 0x00); // Layer indicator, start red
25 // If we're not using the audio pin, drive it low
32 #ifdef WATCHDOG_ENABLE
33 // This is done after turning the layer LED red, if we're caught in a loop
34 // we should get a flashing red light
35 wdt_enable(WDTO_500MS);
39 void matrix_scan_kb(void)
41 #ifdef WATCHDOG_ENABLE
45 // switch/underglow lighting update
46 static uint32_t issi_device = 0;
47 static uint32_t twi_last_ready = 0;
48 if(twi_last_ready > 1000){
49 // Its been way too long since the last ISSI update, reset the I2C bus and start again
56 // If the i2c bus is available, kick off the issi update, alternate between devices
57 update_issi(issi_device, issi_device);
67 // Update layer indicator LED
69 // Not sure how else to reliably do this... TMK has the 'hook_layer_change'
70 // but can't find QMK equiv
71 static uint32_t layer_indicator = -1;
72 if(layer_indicator != layer_state){
73 for(uint32_t i=0;; i++){
74 // the layer_info list should end with layer 0xFFFF
75 // it will break this out of the loop and define the unknown layer color
76 if((layer_info[i].layer == (layer_state & layer_info[i].mask)) || (layer_info[i].layer == 0xFFFFFFFF)){
77 set_rgb(32, layer_info[i].color.red, layer_info[i].color.green, layer_info[i].color.blue);
78 layer_indicator = layer_state;
86 void click(uint16_t freq, uint16_t duration){
88 if(freq >= 100 && freq <= 20000 && duration < 100){
90 for (uint16_t i = 0; i < duration; i++){
98 bool process_record_kb(uint16_t keycode, keyrecord_t* record)
100 if (click_toggle && record->event.pressed){
101 click(click_hz, click_time);
103 if (keycode == RESET) {
107 return process_record_user(keycode, record);
110 void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
115 if(id == LFK_ESC_TILDE){
116 // Send ~ on shift-esc
117 void (*method)(uint8_t) = (event->event.pressed) ? &add_key : &del_key;
118 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT));
119 method(shifted ? KC_GRAVE : KC_ESCAPE);
120 send_keyboard_report();
121 }else if(event->event.pressed){
123 case LFK_SET_DEFAULT_LAYER:
124 // set/save the current base layer to eeprom, falls through to LFK_CLEAR
125 eeconfig_update_default_layer(1UL << opt);
126 default_layer_set(1UL << opt);
128 // Go back to default layer
137 case LFK_CLICK_FREQ_LOWER:
138 sign = -1; // continue to next statement
139 case LFK_CLICK_FREQ_HIGHER:
140 click_hz += sign * 100;
141 click(click_hz, click_time);
143 case LFK_CLICK_TOGGLE:
154 case LFK_CLICK_TIME_SHORTER:
155 sign = -1; // continue to next statement
156 case LFK_CLICK_TIME_LONGER:
158 click(click_hz, click_time);
165 void reset_keyboard_kb(){
166 #ifdef WATCHDOG_ENABLE
171 set_rgb(31, 0x00, 0xFF, 0xFF);
172 set_rgb(32, 0x00, 0xFF, 0xFF);
173 force_issi_refresh();
177 void led_set_kb(uint8_t usb_led)
179 // Set capslock LED to Blue
180 if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
181 set_rgb(31, 0x00, 0x00, 0x7F);
183 set_rgb(31, 0x00, 0x00, 0x00);
185 led_set_user(usb_led);
188 // Lighting info, see lighting.h for details
189 const uint8_t switch_matrices[] = {0, 1};
190 const uint8_t rgb_matrices[] = {6, 7};
197 // 23 22 21 20 14 15 11 1 2
198 const uint8_t rgb_sequence[] = {
199 27, 29, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 11, 15, 14, 20, 21, 22, 23, 24, 25, 26
202 // Maps switch LEDs from Row/Col to ISSI matrix.
204 // Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
205 // | | ISSI Col | ISSI Row |
208 const uint8_t switch_leds[MATRIX_ROWS][MATRIX_COLS] =
210 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91,
211 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0xA9, 0xA8, 0xA7, 0xA6, 0xA5, 0xA4, 0xA3, 0xA2, 0xA1,
212 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0xB9, 0xB8, 0xB7, 0xB6, 0xB5, 0xB3,
213 0x49, 0x48, 0x47, 0x45, 0x44, 0x43, 0x42, 0x41, 0xC9, 0xC8, 0xC7, 0xC6, 0xC5, 0xC4, 0xC2,
214 0x59, 0x58, 0x57, 0x56, 0x55, 0x51, 0xD6, 0xE5, 0xE4, 0xE3, 0xE2, 0xE1,
215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);