logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

satisfaction_encoder.c (6369B)


  1. // Copyright 2023 Andrew Kannan
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "satisfaction_core.h"
  4. #include "eeprom.h"
  5. #ifdef BACKLIGHT_ENABLE
  6. # include "backlight.h"
  7. #endif
  8. void pre_encoder_mode_change(void){
  9. if(encoder_mode == ENC_MODE_CLOCK_SET){
  10. RTCDateTime timespec;
  11. timespec.year = year_config;
  12. timespec.month = month_config;
  13. timespec.day = day_config;
  14. // timespec.dayofweek = last_timespec.dayofweek;
  15. // timespec.dstflag = last_timespec.dstflag;
  16. timespec.millisecond = (hour_config * 60 + minute_config) * 60 * 1000;
  17. rtcSetTime(&RTCD1, &timespec);
  18. }
  19. }
  20. void post_encoder_mode_change(void){
  21. if(encoder_mode == ENC_MODE_CLOCK_SET){
  22. hour_config = (last_minute / 60);
  23. minute_config = last_minute % 60;
  24. year_config = last_timespec.year;
  25. month_config = last_timespec.month;
  26. day_config = last_timespec.day;
  27. time_config_idx = 0;
  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. void update_time_config(int8_t increment){
  49. uint8_t day_limit = 31;
  50. uint16_t adjusted_year = 1980 + year_config;
  51. switch(time_config_idx){
  52. case 0: // hour
  53. default:
  54. hour_config = (hour_config + increment) % 24;
  55. if (hour_config < 0){
  56. hour_config += 24;
  57. }
  58. break;
  59. case 1: // minute
  60. minute_config = (minute_config + increment) % 60;
  61. if (minute_config < 0){
  62. minute_config += 60;
  63. }
  64. break;
  65. case 2: // year
  66. year_config += increment;
  67. break;
  68. case 3: // month
  69. month_config = (month_config % 12) + increment;
  70. if (month_config <= 0){
  71. month_config += 12;
  72. }
  73. break;
  74. case 4: //day
  75. if (month_config == 9 || month_config == 4 || month_config == 6 || month_config == 11){
  76. day_limit = 30;
  77. } else if(month_config == 2){
  78. day_limit = adjusted_year % 4 == 0 && !(adjusted_year % 100 == 0 && adjusted_year % 400 != 0) ? 29 : 28;
  79. }
  80. day_config = (day_config % day_limit) + increment;
  81. if(day_config <= 0){
  82. day_config += day_limit;
  83. }
  84. break;
  85. }
  86. }
  87. uint16_t handle_encoder_clockwise(void){
  88. uint16_t mapped_code = 0;
  89. switch(encoder_mode){
  90. default:
  91. case ENC_MODE_VOLUME:
  92. mapped_code = KC_VOLU;
  93. break;
  94. case ENC_MODE_MEDIA:
  95. mapped_code = KC_MEDIA_NEXT_TRACK;
  96. break;
  97. case ENC_MODE_SCROLL:
  98. mapped_code = QK_MOUSE_WHEEL_DOWN;
  99. break;
  100. #ifdef BACKLIGHT_ENABLE
  101. case ENC_MODE_BACKLIGHT:
  102. backlight_increase();
  103. if(get_backlight_level() != 0){
  104. backlight_enable();
  105. }
  106. break;
  107. #endif
  108. case ENC_MODE_BRIGHTNESS:
  109. mapped_code = KC_BRIGHTNESS_UP;
  110. break;
  111. #ifdef DYNAMIC_KEYMAP_ENABLE
  112. case ENC_MODE_CUSTOM0:
  113. mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_CW);
  114. break;
  115. case ENC_MODE_CUSTOM1:
  116. mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_CW);
  117. break;
  118. case ENC_MODE_CUSTOM2:
  119. mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_CW);
  120. break;
  121. #endif
  122. case ENC_MODE_CLOCK_SET:
  123. update_time_config(1);
  124. break;
  125. }
  126. return mapped_code;
  127. }
  128. uint16_t handle_encoder_ccw(void){
  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 = QK_MOUSE_WHEEL_UP;
  140. break;
  141. #ifdef BACKLIGHT_ENABLE
  142. case ENC_MODE_BACKLIGHT:
  143. backlight_decrease();
  144. if(get_backlight_level() == 0){
  145. backlight_disable();
  146. }
  147. break;
  148. #endif
  149. case ENC_MODE_BRIGHTNESS:
  150. mapped_code = KC_BRIGHTNESS_DOWN;
  151. break;
  152. #ifdef DYNAMIC_KEYMAP_ENABLE
  153. case ENC_MODE_CUSTOM0:
  154. mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_CCW);
  155. break;
  156. case ENC_MODE_CUSTOM1:
  157. mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_CCW);
  158. break;
  159. case ENC_MODE_CUSTOM2:
  160. mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_CCW);
  161. break;
  162. #endif
  163. case ENC_MODE_CLOCK_SET:
  164. update_time_config(-1);
  165. break;
  166. }
  167. return mapped_code;
  168. }
  169. uint16_t handle_encoder_press(void){
  170. uint16_t mapped_code = 0;
  171. switch(encoder_mode){
  172. case ENC_MODE_VOLUME:
  173. mapped_code = KC_MUTE;
  174. break;
  175. default:
  176. case ENC_MODE_MEDIA:
  177. mapped_code = KC_MEDIA_PLAY_PAUSE;
  178. break;
  179. case ENC_MODE_SCROLL:
  180. mapped_code = QK_MOUSE_BUTTON_3;
  181. break;
  182. #ifdef BACKLIGHT_ENABLE
  183. case ENC_MODE_BACKLIGHT:
  184. breathing_toggle();
  185. break;
  186. #endif
  187. #ifdef DYNAMIC_KEYMAP_ENABLE
  188. case ENC_MODE_CUSTOM0:
  189. mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_PRESS);
  190. break;
  191. case ENC_MODE_CUSTOM1:
  192. mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_PRESS);
  193. break;
  194. case ENC_MODE_CUSTOM2:
  195. mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_PRESS);
  196. break;
  197. #endif
  198. case ENC_MODE_CLOCK_SET:
  199. time_config_idx = (time_config_idx + 1) % 5;
  200. case ENC_MODE_BRIGHTNESS:
  201. break;
  202. }
  203. return mapped_code;
  204. }
  205. uint16_t retrieve_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior){
  206. #ifdef DYNAMIC_KEYMAP_ENABLE
  207. uint32_t offset = EEPROM_CUSTOM_ENCODER_OFFSET + (encoder_idx * 6) + (behavior * 2);
  208. //big endian
  209. uint8_t hi, lo;
  210. read_custom_config(&hi, offset+0, 1);
  211. read_custom_config(&lo, offset+1, 1);
  212. uint16_t keycode = hi << 8;
  213. keycode |= lo;
  214. return keycode;
  215. #else
  216. return 0;
  217. #endif
  218. }
  219. void set_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior, uint16_t new_code){
  220. #ifdef DYNAMIC_KEYMAP_ENABLE
  221. uint32_t offset = EEPROM_CUSTOM_ENCODER_OFFSET + (encoder_idx * 6) + (behavior * 2);
  222. uint8_t hi = new_code >> 8;
  223. uint8_t lo = new_code & 0xFF;
  224. write_custom_config(&hi, offset+0, 1);
  225. write_custom_config(&lo, offset+1, 1);
  226. #endif
  227. }