]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/cannonkeys/satisfaction75/satisfaction_encoder.c
New RGBKB Zen Rev1 keymap (#7609)
[qmk_firmware.git] / keyboards / cannonkeys / satisfaction75 / satisfaction_encoder.c
1 #include "satisfaction75.h"
2 #include "tmk_core/common/eeprom.h"
3
4 void pre_encoder_mode_change(){
5   if(encoder_mode == ENC_MODE_CLOCK_SET){
6     RTCDateTime timespec;
7     timespec.year = year_config;
8     timespec.month = month_config;
9     timespec.day = day_config;
10     // timespec.dayofweek = last_timespec.dayofweek;
11     // timespec.dstflag = last_timespec.dstflag;
12     timespec.millisecond = (hour_config * 60 + minute_config) * 60 * 1000;
13     rtcSetTime(&RTCD1, &timespec);
14   } else if (encoder_mode == ENC_MODE_BACKLIGHT){
15     save_backlight_config_to_eeprom();
16   }
17 }
18
19 void post_encoder_mode_change(){
20   if(encoder_mode == ENC_MODE_CLOCK_SET){
21     hour_config = (last_minute / 60);
22     minute_config = last_minute % 60;
23     year_config = last_timespec.year;
24     month_config = last_timespec.month;
25     day_config = last_timespec.day;
26     time_config_idx = 0;
27   }
28 }
29
30 void change_encoder_mode(bool negative){
31   pre_encoder_mode_change();
32   if(enabled_encoder_modes == 0){
33     enabled_encoder_modes = 0x1F;
34   }
35   do {
36     if(negative){
37       if (encoder_mode == 0){
38         encoder_mode = _NUM_ENCODER_MODES - 1;
39       } else{
40         encoder_mode = encoder_mode - 1;
41       }
42     } else {
43         encoder_mode = (encoder_mode + 1) % _NUM_ENCODER_MODES;
44     }
45   } while(((1 << encoder_mode) & enabled_encoder_modes) == 0);
46   post_encoder_mode_change();
47 }
48
49 void update_time_config(int8_t increment){
50   uint8_t day_limit = 31;
51   uint16_t adjusted_year = 1980 + year_config;
52   switch(time_config_idx){
53     case 0: // hour
54     default:
55       hour_config = (hour_config + increment) % 24;
56       if (hour_config < 0){
57         hour_config += 24;
58       }
59       break;
60     case 1: // minute
61       minute_config = (minute_config + increment) % 60;
62       if (minute_config < 0){
63         minute_config += 60;
64       }
65       break;
66     case 2: // year
67       year_config += increment;
68       break;
69     case 3: // month
70       month_config = (month_config % 12) + increment;
71       if (month_config <= 0){
72         month_config += 12;
73       }
74       break;
75     case 4: //day
76       if (month_config == 9 || month_config == 4 || month_config == 6 || month_config == 11){
77         day_limit = 30;
78       } else if(month_config == 2){
79         day_limit = adjusted_year % 4 == 0 && !(adjusted_year % 100 == 0 && adjusted_year % 400 != 0) ? 29 : 28;
80       }
81       day_config = (day_config % day_limit) + increment;
82       if(day_config <= 0){
83         day_config += day_limit;
84       }
85       break;
86   }
87 }
88
89 uint16_t handle_encoder_clockwise(){
90   uint16_t mapped_code = 0;
91   switch(encoder_mode){
92     default:
93     case ENC_MODE_VOLUME:
94       mapped_code = KC_VOLU;
95       break;
96     case ENC_MODE_MEDIA:
97       mapped_code = KC_MEDIA_NEXT_TRACK;
98       break;
99     case ENC_MODE_SCROLL:
100       mapped_code = KC_WH_D;
101       break;
102     case ENC_MODE_BACKLIGHT:
103       kb_backlight_config.level = kb_backlight_config.level + 1;
104       if(kb_backlight_config.level > BACKLIGHT_LEVELS){
105         kb_backlight_config.level = BACKLIGHT_LEVELS;
106       }
107       backlight_set(kb_backlight_config.level);
108       if (kb_backlight_config.level != 0){
109         kb_backlight_config.enable = true;
110       }
111       break;
112     case ENC_MODE_BRIGHTNESS:
113       mapped_code = KC_BRIGHTNESS_UP;
114       break;
115 #ifdef DYNAMIC_KEYMAP_ENABLE
116     case ENC_MODE_CUSTOM0:
117       mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_CW);
118       break;
119     case ENC_MODE_CUSTOM1:
120       mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_CW);
121       break;
122     case ENC_MODE_CUSTOM2:
123       mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_CW);
124       break;
125 #endif
126     case ENC_MODE_CLOCK_SET:
127       update_time_config(1);
128       queue_for_send = true;
129       break;
130   }
131   return mapped_code;
132 }
133
134 uint16_t handle_encoder_ccw(){
135   uint16_t mapped_code = 0;
136   switch(encoder_mode){
137     default:
138     case ENC_MODE_VOLUME:
139       mapped_code = KC_VOLD;
140       break;
141     case ENC_MODE_MEDIA:
142       mapped_code = KC_MEDIA_PREV_TRACK;
143       break;
144     case ENC_MODE_SCROLL:
145       mapped_code = KC_WH_U;
146       break;
147     case ENC_MODE_BACKLIGHT:
148       // mapped_code = BL_DEC;
149       if(kb_backlight_config.level != 0){
150         kb_backlight_config.level = kb_backlight_config.level - 1;
151       }
152       backlight_set(kb_backlight_config.level);
153       if (kb_backlight_config.level == 0){
154         kb_backlight_config.enable = false;
155       }
156       break;
157     case ENC_MODE_BRIGHTNESS:
158       mapped_code = KC_BRIGHTNESS_DOWN;
159       break;
160 #ifdef DYNAMIC_KEYMAP_ENABLE
161     case ENC_MODE_CUSTOM0:
162       mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_CCW);
163       break;
164     case ENC_MODE_CUSTOM1:
165       mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_CCW);
166       break;
167     case ENC_MODE_CUSTOM2:
168       mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_CCW);
169       break;
170 #endif
171
172     case ENC_MODE_CLOCK_SET:
173       update_time_config(-1);
174       queue_for_send = true;
175       break;
176   }
177   return mapped_code;
178 }
179
180 uint16_t handle_encoder_press(){
181   uint16_t mapped_code = 0;
182   switch(encoder_mode){
183     case ENC_MODE_VOLUME:
184       mapped_code = KC_MUTE;
185       break;
186     default:
187     case ENC_MODE_MEDIA:
188       mapped_code = KC_MEDIA_PLAY_PAUSE;
189       break;
190     case ENC_MODE_SCROLL:
191       mapped_code = KC_BTN3;
192       break;
193     case ENC_MODE_BACKLIGHT:
194       // mapped_code = BL_TOGG;
195       kb_backlight_config.breathing = !kb_backlight_config.breathing;
196       if(!kb_backlight_config.breathing){
197         breathing_disable();
198       } else{
199         breathing_enable();
200       }
201       break;
202 #ifdef DYNAMIC_KEYMAP_ENABLE
203     case ENC_MODE_CUSTOM0:
204       mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_PRESS);
205       break;
206     case ENC_MODE_CUSTOM1:
207       mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_PRESS);
208       break;
209     case ENC_MODE_CUSTOM2:
210       mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_PRESS);
211       break;
212 #endif
213     case ENC_MODE_CLOCK_SET:
214       time_config_idx = (time_config_idx + 1) % 5;
215     case ENC_MODE_BRIGHTNESS:
216       break;
217   }
218   return mapped_code;
219 }
220
221
222 uint16_t retrieve_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior){
223 #ifdef DYNAMIC_KEYMAP_ENABLE
224     void* addr = (void*)(DYNAMIC_KEYMAP_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
225     //big endian
226     uint16_t keycode = eeprom_read_byte(addr) << 8;
227     keycode |= eeprom_read_byte(addr + 1);
228     return keycode;
229 #else
230     return 0;
231 #endif
232 }
233
234 void set_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior, uint16_t new_code){
235 #ifdef DYNAMIC_KEYMAP_ENABLE
236     void* addr = (void*)(DYNAMIC_KEYMAP_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
237     eeprom_update_byte(addr, (uint8_t)(new_code >> 8));
238     eeprom_update_byte(addr + 1, (uint8_t)(new_code & 0xFF));
239 #endif
240 }