satisfaction_encoder.c 6.5 KB

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