2 #include <avr/sfr_defs.h>
3 #include <avr/timer_avr.h>
12 #define BACKLIGHT_BREATHING
15 uint16_t click_hz = CLICK_HZ;
16 uint16_t click_time = CLICK_MS;
17 uint8_t click_toggle = CLICK_ENABLED;
18 float my_song[][2] = SONG(ZELDA_PUZZLE);
20 // Colors of the layer indicator LED
21 // This list needs to define layer 0xFFFFFFFF, it is the end of the list, and the unknown layer
23 const Layer_Info layer_info[] = {
24 // Layer Mask Red Green Blue
25 {0x00000000, 0xFFFFFFFF, {0x00, 0xFF, 0x00}}, // base layers - green
26 {0x00000002, 0xFFFFFFFE, {0x00, 0x00, 0xFF}}, // function layer - blue
27 {0x00000004, 0xFFFFFFFC, {0xFF, 0x00, 0xFF}}, // settings layer - magenta
28 {0xFFFFFFFF, 0xFFFFFFFF, {0xFF, 0xFF, 0xFF}}, // unknown layer - REQUIRED - white
31 void matrix_init_kb(void)
33 // put your keyboard start-up code here
34 // runs once when the firmware starts up
36 set_rgb(31, 0x00, 0x00, 0x00); // Caps lock
37 set_rgb(32, 0xFF, 0x00, 0x00); // Layer indicator, start red
39 // If we're not using the audio pin, drive it low
47 #ifdef WATCHDOG_ENABLE
48 // This is done after turning the layer LED red, if we're caught in a loop
49 // we should get a flashing red light
50 wdt_enable(WDTO_500MS);
54 void matrix_scan_kb(void)
56 #ifdef WATCHDOG_ENABLE
60 // switch/underglow lighting update
61 static uint32_t issi_device = 0;
62 static uint32_t twi_last_ready = 0;
63 if(twi_last_ready > 1000){
64 // Its been way too long since the last ISSI update, reset the I2C bus and start again
71 // If the i2c bus is available, kick off the issi update, alternate between devices
72 update_issi(issi_device, issi_device);
82 // Update layer indicator LED
84 // Not sure how else to reliably do this... TMK has the 'hook_layer_change'
85 // but can't find QMK equiv
86 static uint32_t layer_indicator = -1;
87 if(layer_indicator != layer_state){
88 for(uint32_t i=0;; i++){
89 // the layer_info list should end with layer 0xFFFF
90 // it will break this out of the loop and define the unknown layer color
91 if((layer_info[i].layer == (layer_state & layer_info[i].mask)) || (layer_info[i].layer == 0xFFFFFFFF)){
92 set_rgb(32, layer_info[i].color.red, layer_info[i].color.green, layer_info[i].color.blue);
93 layer_indicator = layer_state;
101 void click(uint16_t freq, uint16_t duration){
103 if(freq >= 100 && freq <= 20000 && duration < 100){
105 for (uint16_t i = 0; i < duration; i++){
113 bool process_record_kb(uint16_t keycode, keyrecord_t* record)
115 if (click_toggle && record->event.pressed){
116 click(click_hz, click_time);
118 if (keycode == RESET) {
122 return process_record_user(keycode, record);
125 void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
130 if(id == LFK_ESC_TILDE){
131 // Send ~ on shift-esc
132 void (*method)(uint8_t) = (event->event.pressed) ? &add_key : &del_key;
133 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT));
134 method(shifted ? KC_GRAVE : KC_ESCAPE);
135 send_keyboard_report();
136 }else if(event->event.pressed){
138 case LFK_SET_DEFAULT_LAYER:
139 // set/save the current base layer to eeprom, falls through to LFK_CLEAR
140 eeconfig_update_default_layer(1UL << opt);
141 default_layer_set(1UL << opt);
143 // Go back to default layer
152 case LFK_CLICK_FREQ_LOWER:
153 sign = -1; // continue to next statement
154 case LFK_CLICK_FREQ_HIGHER:
155 click_hz += sign * 100;
156 click(click_hz, click_time);
158 case LFK_CLICK_TOGGLE:
169 case LFK_CLICK_TIME_SHORTER:
170 sign = -1; // continue to next statement
171 case LFK_CLICK_TIME_LONGER:
173 click(click_hz, click_time);
183 void reset_keyboard_kb(){
184 #ifdef WATCHDOG_ENABLE
189 set_rgb(31, 0x00, 0xFF, 0xFF);
190 set_rgb(32, 0x00, 0xFF, 0xFF);
191 force_issi_refresh();
195 void led_set_kb(uint8_t usb_led)
197 // Set capslock LED to Blue
198 if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
199 set_rgb(31, 0x00, 0x00, 0x7F);
201 set_rgb(31, 0x00, 0x00, 0x00);
203 led_set_user(usb_led);
206 // Lighting info, see lighting.h for details
207 const uint8_t switch_matrices[] = {0, 1};
208 const uint8_t rgb_matrices[] = {6, 7};
215 // 23 22 21 20 14 15 11 1 2
216 const uint8_t rgb_sequence[] = {
217 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 1, 2, 3, 4, 5, 6, 7, 8, 13, 14, 15, 16
220 // Maps switch LEDs from Row/Col to ISSI matrix.
222 // Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
223 // | | ISSI Col | ISSI Row |
226 const uint8_t switch_leds[MATRIX_ROWS][MATRIX_COLS] =
228 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91,
229 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0xA9, 0xA8, 0xA7, 0xA6, 0xA5, 0xA4, 0xA3, 0xA2, 0xA1,
230 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0xB9, 0xB8, 0xB7, 0xB6, 0xB5, 0xB3,
231 0x49, 0x48, 0x47, 0x45, 0x44, 0x43, 0x42, 0x41, 0xC9, 0xC8, 0xC7, 0xC6, 0xC5, 0xC4, 0xC2,
232 0x59, 0x58, 0x57, 0x56, 0x55, 0x51, 0xD6, 0xE5, 0xE4, 0xE3, 0xE2, 0xE1,
233 0x00, 0x00, 0x00, 0x00);