]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/lfkeyboards/mini1800/mini1800.c
Fix the LFKeyboards so they work with the QMK Configurator (#4591)
[qmk_firmware.git] / keyboards / lfkeyboards / mini1800 / mini1800.c
1
2 #include <avr/sfr_defs.h>
3 #include <avr/timer_avr.h>
4 #include <avr/wdt.h>
5 #include "mini1800.h"
6 #include "keymap.h"
7 #include "issi.h"
8 #include "TWIlib.h"
9 #include "lighting.h"
10 #include "debug.h"
11
12 #define BACKLIGHT_BREATHING
13 #include "quantum.h"
14
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);
19
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
22 __attribute__((weak))
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
29 };
30
31 void matrix_init_kb(void)
32 {
33     // put your keyboard start-up code here
34     // runs once when the firmware starts up
35     matrix_init_user();
36     set_rgb(31, 0x00, 0x00, 0x00);  // Caps lock
37     set_rgb(32, 0xFF, 0x00, 0x00);  // Layer indicator, start red
38 #ifndef AUDIO_ENABLE
39     // If we're not using the audio pin, drive it low
40     sbi(DDRC, 6);
41     cbi(PORTC, 6);
42 #endif
43     _delay_ms(500);
44 #ifdef ISSI_ENABLE
45     issi_init();
46 #endif
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);
51 #endif
52 }
53
54 void matrix_scan_kb(void)
55 {
56 #ifdef WATCHDOG_ENABLE
57     wdt_reset();
58 #endif
59 #ifdef ISSI_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
65         twi_last_ready = 0;
66         TWIInit();
67         force_issi_refresh();
68     }
69     if(isTWIReady()){
70         twi_last_ready = 0;
71         // If the i2c bus is available, kick off the issi update, alternate between devices
72         update_issi(issi_device, issi_device);
73         if(issi_device){
74             issi_device = 0;
75         }else{
76             issi_device = 3;
77         }
78     }else{
79         twi_last_ready++;
80     }
81 #endif
82     // Update layer indicator LED
83     //
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;
94                 break;
95             }
96         }
97     }
98     matrix_scan_user();
99 }
100
101 void click(uint16_t freq, uint16_t duration){
102 #ifdef AUDIO_ENABLE
103     if(freq >= 100 && freq <= 20000 && duration < 100){
104         play_note(freq, 10);
105         for (uint16_t i = 0; i < duration; i++){
106             _delay_ms(1);
107         }
108         stop_all_notes();
109     }
110 #endif
111 }
112
113 bool process_record_kb(uint16_t keycode, keyrecord_t* record)
114 {
115     if (click_toggle && record->event.pressed){
116         click(click_hz, click_time);
117     }
118     if (keycode == RESET) {
119         reset_keyboard_kb();
120     } else {
121     }
122     return process_record_user(keycode, record);
123 }
124
125 void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
126 {
127 #ifdef AUDIO_ENABLE
128     int8_t sign = 1;
129 #endif
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){
137         switch(id){
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);
142             case LFK_CLEAR:
143                 // Go back to default layer
144                 layer_clear();
145                 break;
146 #ifdef ISSI_ENABLE
147             case LFK_LED_TEST:
148                 led_test();
149                 break;
150 #endif
151 #ifdef AUDIO_ENABLE
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);
157                 break;
158             case LFK_CLICK_TOGGLE:
159                 if(click_toggle){
160                     click_toggle = 0;
161                     click(4000, 100);
162                     click(1000, 100);
163                 }else{
164                     click_toggle = 1;
165                     click(1000, 100);
166                     click(4000, 100);
167                 }
168                 break;
169             case LFK_CLICK_TIME_SHORTER:
170                 sign = -1;  // continue to next statement
171             case LFK_CLICK_TIME_LONGER:
172                 click_time += sign;
173                 click(click_hz, click_time);
174                 break;
175 #endif
176             case LFK_PLAY_ONEUP:
177                 PLAY_SONG(my_song);
178                 break;
179         }
180     }
181 }
182
183 void reset_keyboard_kb(){
184 #ifdef WATCHDOG_ENABLE
185     MCUSR = 0;
186     wdt_disable();
187     wdt_reset();
188 #endif
189     set_rgb(31, 0x00, 0xFF, 0xFF);
190     set_rgb(32, 0x00, 0xFF, 0xFF);
191     force_issi_refresh();
192     reset_keyboard();
193 }
194
195 void led_set_kb(uint8_t usb_led)
196 {
197     // Set capslock LED to Blue
198     if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
199         set_rgb(31, 0x00, 0x00, 0x7F);
200     }else{
201         set_rgb(31, 0x00, 0x00, 0x00);
202     }
203     led_set_user(usb_led);
204 }
205
206 // Lighting info, see lighting.h for details
207 const uint8_t switch_matrices[] = {0, 1};
208 const uint8_t rgb_matrices[] = {6, 7};
209
210 // RGB Map:
211 //   27  29  10   9   8   7   6
212 // 26                                   5
213 // 25                                   4
214 // 24                                   3
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
218 };
219
220 // Maps switch LEDs from Row/Col to ISSI matrix.
221 // Value breakdown:
222 //     Bit     | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
223 //             |   | ISSI Col  |    ISSI Row   |
224 //             /   |
225 //             Device
226 const uint8_t switch_leds[MATRIX_ROWS][MATRIX_COLS] =
227 LAYOUT(
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);