]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/lfkeyboards/lfk87/lfk87.c
Fix some Configurator Warnings regarding LAYOUT vs KEYMAP (#2708)
[qmk_firmware.git] / keyboards / lfkeyboards / lfk87 / lfk87.c
1
2 #include <avr/sfr_defs.h>
3 #include <avr/timer_avr.h>
4 #include <avr/wdt.h>
5 #include "lfk87.h"
6 #include "keymap.h"
7 #include "issi.h"
8 #include "TWIlib.h"
9 #include "lighting.h"
10 #include "debug.h"
11 #include "quantum.h"
12
13 uint16_t click_hz = CLICK_HZ;
14 uint16_t click_time = CLICK_MS;
15 uint8_t click_toggle = CLICK_ENABLED;
16
17 void matrix_init_kb(void)
18 {
19     // put your keyboard start-up code here
20     // runs once when the firmware starts up
21     matrix_init_user();
22     set_rgb(31, 0x00, 0x00, 0x00);  // Caps lock
23     set_rgb(32, 0xFF, 0x00, 0x00);  // Layer indicator, start red
24 #ifndef AUDIO_ENABLE
25     // If we're not using the audio pin, drive it low
26     sbi(DDRC, 6);
27     cbi(PORTC, 6);
28 #endif
29 #ifdef ISSI_ENABLE
30     issi_init();
31 #endif
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);
36 #endif
37 }
38
39 void matrix_scan_kb(void)
40 {
41 #ifdef WATCHDOG_ENABLE
42     wdt_reset();
43 #endif
44 #ifdef ISSI_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
50         twi_last_ready = 0;
51         TWIInit();
52         force_issi_refresh();
53     }
54     if(isTWIReady()){
55         twi_last_ready = 0;
56         // If the i2c bus is available, kick off the issi update, alternate between devices
57         update_issi(issi_device, issi_device);
58         if(issi_device){
59             issi_device = 0;
60         }else{
61             issi_device = 3;
62         }
63     }else{
64         twi_last_ready++;
65     }
66 #endif
67     // Update layer indicator LED
68     //
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;
79                 break;
80             }
81         }
82     }
83     matrix_scan_user();
84 }
85
86 void click(uint16_t freq, uint16_t duration){
87 #ifdef AUDIO_ENABLE
88     if(freq >= 100 && freq <= 20000 && duration < 100){
89         play_note(freq, 10);
90         for (uint16_t i = 0; i < duration; i++){
91             _delay_ms(1);
92         }
93         stop_all_notes();
94     }
95 #endif
96 }
97
98 bool process_record_kb(uint16_t keycode, keyrecord_t* record)
99 {
100     if (click_toggle && record->event.pressed){
101         click(click_hz, click_time);
102     }
103     if (keycode == RESET) {
104         reset_keyboard_kb();
105     } else {
106     }
107     return process_record_user(keycode, record);
108 }
109
110 void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
111 {
112 #ifdef AUDIO_ENABLE
113     int8_t sign = 1;
114 #endif
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){
122         switch(id){
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);
127             case LFK_CLEAR:
128                 // Go back to default layer
129                 layer_clear();
130                 break;
131 #ifdef ISSI_ENABLE
132             case LFK_LED_TEST:
133                 led_test();
134                 break;
135 #endif
136 #ifdef AUDIO_ENABLE
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);
142                 break;
143             case LFK_CLICK_TOGGLE:
144                 if(click_toggle){
145                     click_toggle = 0;
146                     click(4000, 100);
147                     click(1000, 100);
148                 }else{
149                     click_toggle = 1;
150                     click(1000, 100);
151                     click(4000, 100);
152                 }
153                 break;
154             case LFK_CLICK_TIME_SHORTER:
155                 sign = -1;  // continue to next statement
156             case LFK_CLICK_TIME_LONGER:
157                 click_time += sign;
158                 click(click_hz, click_time);
159                 break;
160 #endif
161         }
162     }
163 }
164
165 void reset_keyboard_kb(){
166 #ifdef WATCHDOG_ENABLE
167     MCUSR = 0;
168     wdt_disable();
169     wdt_reset();
170 #endif
171     set_rgb(31, 0x00, 0xFF, 0xFF);
172     set_rgb(32, 0x00, 0xFF, 0xFF);
173     force_issi_refresh();
174     reset_keyboard();
175 }
176
177 void led_set_kb(uint8_t usb_led)
178 {
179     // Set capslock LED to Blue
180     if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
181         set_rgb(31, 0x00, 0x00, 0x7F);
182     }else{
183         set_rgb(31, 0x00, 0x00, 0x00);
184     }
185     led_set_user(usb_led);
186 }
187
188 // Lighting info, see lighting.h for details
189 const uint8_t switch_matrices[] = {0, 1};
190 const uint8_t rgb_matrices[] = {6, 7};
191
192 // RGB Map:
193 //   27  29  10   9   8   7   6
194 // 26                                   5
195 // 25                                   4
196 // 24                                   3
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
200 };
201
202 // Maps switch LEDs from Row/Col to ISSI matrix.
203 // Value breakdown:
204 //     Bit     | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
205 //             |   | ISSI Col  |    ISSI Row   |
206 //             /   |
207 //             Device
208 const uint8_t switch_leds[MATRIX_ROWS][MATRIX_COLS] =
209 LAYOUT(
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);