1 #include "satisfaction75.h"
2 #include "tmk_core/common/eeprom.h"
4 void pre_encoder_mode_change(){
5 if(encoder_mode == ENC_MODE_CLOCK_SET){
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, ×pec);
14 } else if (encoder_mode == ENC_MODE_BACKLIGHT){
15 save_backlight_config_to_eeprom();
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;
30 void change_encoder_mode(bool negative){
31 pre_encoder_mode_change();
32 if(enabled_encoder_modes == 0){
33 enabled_encoder_modes = 0x1F;
37 if (encoder_mode == 0){
38 encoder_mode = _NUM_ENCODER_MODES - 1;
40 encoder_mode = encoder_mode - 1;
43 encoder_mode = (encoder_mode + 1) % _NUM_ENCODER_MODES;
45 } while(((1 << encoder_mode) & enabled_encoder_modes) == 0);
46 post_encoder_mode_change();
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){
55 hour_config = (hour_config + increment) % 24;
61 minute_config = (minute_config + increment) % 60;
62 if (minute_config < 0){
67 year_config += increment;
70 month_config = (month_config % 12) + increment;
71 if (month_config <= 0){
76 if (month_config == 9 || month_config == 4 || month_config == 6 || month_config == 11){
78 } else if(month_config == 2){
79 day_limit = adjusted_year % 4 == 0 && !(adjusted_year % 100 == 0 && adjusted_year % 400 != 0) ? 29 : 28;
81 day_config = (day_config % day_limit) + increment;
83 day_config += day_limit;
89 uint16_t handle_encoder_clockwise(){
90 uint16_t mapped_code = 0;
94 mapped_code = KC_VOLU;
97 mapped_code = KC_MEDIA_NEXT_TRACK;
100 mapped_code = KC_WH_D;
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;
107 backlight_set(kb_backlight_config.level);
108 if (kb_backlight_config.level != 0){
109 kb_backlight_config.enable = true;
112 case ENC_MODE_BRIGHTNESS:
113 mapped_code = KC_BRIGHTNESS_UP;
115 #ifdef DYNAMIC_KEYMAP_ENABLE
116 case ENC_MODE_CUSTOM0:
117 mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_CW);
119 case ENC_MODE_CUSTOM1:
120 mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_CW);
122 case ENC_MODE_CUSTOM2:
123 mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_CW);
126 case ENC_MODE_CLOCK_SET:
127 update_time_config(1);
128 queue_for_send = true;
134 uint16_t handle_encoder_ccw(){
135 uint16_t mapped_code = 0;
136 switch(encoder_mode){
138 case ENC_MODE_VOLUME:
139 mapped_code = KC_VOLD;
142 mapped_code = KC_MEDIA_PREV_TRACK;
144 case ENC_MODE_SCROLL:
145 mapped_code = KC_WH_U;
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;
152 backlight_set(kb_backlight_config.level);
153 if (kb_backlight_config.level == 0){
154 kb_backlight_config.enable = false;
157 case ENC_MODE_BRIGHTNESS:
158 mapped_code = KC_BRIGHTNESS_DOWN;
160 #ifdef DYNAMIC_KEYMAP_ENABLE
161 case ENC_MODE_CUSTOM0:
162 mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_CCW);
164 case ENC_MODE_CUSTOM1:
165 mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_CCW);
167 case ENC_MODE_CUSTOM2:
168 mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_CCW);
172 case ENC_MODE_CLOCK_SET:
173 update_time_config(-1);
174 queue_for_send = true;
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;
188 mapped_code = KC_MEDIA_PLAY_PAUSE;
190 case ENC_MODE_SCROLL:
191 mapped_code = KC_BTN3;
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){
202 #ifdef DYNAMIC_KEYMAP_ENABLE
203 case ENC_MODE_CUSTOM0:
204 mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_PRESS);
206 case ENC_MODE_CUSTOM1:
207 mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_PRESS);
209 case ENC_MODE_CUSTOM2:
210 mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_PRESS);
213 case ENC_MODE_CLOCK_SET:
214 time_config_idx = (time_config_idx + 1) % 5;
215 case ENC_MODE_BRIGHTNESS:
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));
226 uint16_t keycode = eeprom_read_byte(addr) << 8;
227 keycode |= eeprom_read_byte(addr + 1);
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));