You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

240 lines
6.6 KiB

  1. #include "satisfaction75.h"
  2. #include "tmk_core/common/eeprom.h"
  3. void pre_encoder_mode_change(){
  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(){
  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(){
  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. queue_for_send = true;
  124. break;
  125. }
  126. return mapped_code;
  127. }
  128. uint16_t handle_encoder_ccw(){
  129. uint16_t mapped_code = 0;
  130. switch(encoder_mode){
  131. default:
  132. case ENC_MODE_VOLUME:
  133. mapped_code = KC_VOLD;
  134. break;
  135. case ENC_MODE_MEDIA:
  136. mapped_code = KC_MEDIA_PREV_TRACK;
  137. break;
  138. case ENC_MODE_SCROLL:
  139. mapped_code = KC_WH_U;
  140. break;
  141. case ENC_MODE_BACKLIGHT:
  142. // mapped_code = BL_DEC;
  143. if(kb_backlight_config.level != 0){
  144. kb_backlight_config.level = kb_backlight_config.level - 1;
  145. }
  146. backlight_set(kb_backlight_config.level);
  147. if (kb_backlight_config.level == 0){
  148. kb_backlight_config.enable = false;
  149. }
  150. break;
  151. case ENC_MODE_BRIGHTNESS:
  152. mapped_code = KC_BRIGHTNESS_DOWN;
  153. break;
  154. #ifdef DYNAMIC_KEYMAP_ENABLE
  155. case ENC_MODE_CUSTOM0:
  156. mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_CCW);
  157. break;
  158. case ENC_MODE_CUSTOM1:
  159. mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_CCW);
  160. break;
  161. case ENC_MODE_CUSTOM2:
  162. mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_CCW);
  163. break;
  164. #endif
  165. case ENC_MODE_CLOCK_SET:
  166. update_time_config(-1);
  167. queue_for_send = true;
  168. break;
  169. }
  170. return mapped_code;
  171. }
  172. uint16_t handle_encoder_press(){
  173. uint16_t mapped_code = 0;
  174. switch(encoder_mode){
  175. case ENC_MODE_VOLUME:
  176. mapped_code = KC_MUTE;
  177. break;
  178. default:
  179. case ENC_MODE_MEDIA:
  180. mapped_code = KC_MEDIA_PLAY_PAUSE;
  181. break;
  182. case ENC_MODE_SCROLL:
  183. mapped_code = KC_BTN3;
  184. break;
  185. case ENC_MODE_BACKLIGHT:
  186. // mapped_code = BL_TOGG;
  187. kb_backlight_config.breathing = !kb_backlight_config.breathing;
  188. if(!kb_backlight_config.breathing){
  189. breathing_disable();
  190. } else{
  191. breathing_enable();
  192. }
  193. break;
  194. #ifdef DYNAMIC_KEYMAP_ENABLE
  195. case ENC_MODE_CUSTOM0:
  196. mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_PRESS);
  197. break;
  198. case ENC_MODE_CUSTOM1:
  199. mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_PRESS);
  200. break;
  201. case ENC_MODE_CUSTOM2:
  202. mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_PRESS);
  203. break;
  204. #endif
  205. case ENC_MODE_CLOCK_SET:
  206. time_config_idx = (time_config_idx + 1) % 5;
  207. case ENC_MODE_BRIGHTNESS:
  208. break;
  209. }
  210. return mapped_code;
  211. }
  212. uint16_t retrieve_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior){
  213. #ifdef DYNAMIC_KEYMAP_ENABLE
  214. void* addr = (void*)(EEPROM_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
  215. //big endian
  216. uint16_t keycode = eeprom_read_byte(addr) << 8;
  217. keycode |= eeprom_read_byte(addr + 1);
  218. return keycode;
  219. #else
  220. return 0;
  221. #endif
  222. }
  223. void set_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior, uint16_t new_code){
  224. #ifdef DYNAMIC_KEYMAP_ENABLE
  225. void* addr = (void*)(EEPROM_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
  226. eeprom_update_byte(addr, (uint8_t)(new_code >> 8));
  227. eeprom_update_byte(addr + 1, (uint8_t)(new_code & 0xFF));
  228. #endif
  229. }