keyboard.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "keyboard.h"
  2. #include "ch.h"
  3. #include "hal.h"
  4. #include "led_custom.h"
  5. #include "util.h"
  6. #include "quantum.h"
  7. #include "tmk_core/common/eeprom.h"
  8. #include "ws2812.h"
  9. backlight_config_t kb_backlight_config = {
  10. .enable = true,
  11. .breathing = true,
  12. .level = BACKLIGHT_LEVELS
  13. };
  14. bool eeprom_is_valid(void)
  15. {
  16. return (eeprom_read_word(((void*)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC &&
  17. eeprom_read_byte(((void*)EEPROM_VERSION_ADDR)) == EEPROM_VERSION);
  18. }
  19. void eeprom_set_valid(bool valid)
  20. {
  21. eeprom_update_word(((void*)EEPROM_MAGIC_ADDR), valid ? EEPROM_MAGIC : 0xFFFF);
  22. eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF);
  23. }
  24. void eeprom_reset(void)
  25. {
  26. eeprom_set_valid(false);
  27. eeconfig_disable();
  28. }
  29. void save_backlight_config_to_eeprom(){
  30. eeprom_update_byte((uint8_t*)EEPROM_CUSTOM_BACKLIGHT, kb_backlight_config.raw);
  31. }
  32. void load_custom_config(){
  33. kb_backlight_config.raw = eeprom_read_byte((uint8_t*)EEPROM_CUSTOM_BACKLIGHT);
  34. }
  35. void eeprom_init_kb(void)
  36. {
  37. // If the EEPROM has the magic, the data is good.
  38. // OK to load from EEPROM.
  39. if (eeprom_is_valid()) {
  40. load_custom_config();
  41. } else {
  42. // Save the magic number last, in case saving was interrupted
  43. eeprom_set_valid(true);
  44. save_backlight_config_to_eeprom();
  45. }
  46. }
  47. __attribute__ ((weak))
  48. void matrix_init_board(void);
  49. void matrix_init_kb(void){
  50. eeprom_init_kb();
  51. /* MOSI pin*/
  52. palSetPadMode(PORT_WS2812, PIN_WS2812, PAL_MODE_ALTERNATE(0));
  53. wait_ms(500);
  54. #ifdef RGBLIGHT_ENABLE
  55. leds_init();
  56. #endif
  57. backlight_init_ports();
  58. matrix_init_board();
  59. }
  60. void matrix_scan_kb(void)
  61. {
  62. #ifdef RGBLIGHT_ENABLE
  63. rgblight_task();
  64. #endif
  65. }
  66. bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
  67. switch (keycode) {
  68. case BL_INC:
  69. if (record->event.pressed) {
  70. kb_backlight_config.level = kb_backlight_config.level + 1;
  71. if(kb_backlight_config.level > BACKLIGHT_LEVELS){
  72. kb_backlight_config.level = BACKLIGHT_LEVELS;
  73. }
  74. backlight_set(kb_backlight_config.level);
  75. save_backlight_config_to_eeprom();
  76. }
  77. return false;
  78. case BL_TOGG:
  79. if (record->event.pressed) {
  80. kb_backlight_config.enable = !kb_backlight_config.enable;
  81. if(kb_backlight_config.enable){
  82. backlight_set(kb_backlight_config.level);
  83. } else {
  84. backlight_set(0);
  85. }
  86. save_backlight_config_to_eeprom();
  87. }
  88. return false;
  89. case BL_DEC:
  90. if (record->event.pressed) {
  91. if(kb_backlight_config.level <= 1){
  92. kb_backlight_config.level = 0;
  93. } else {
  94. kb_backlight_config.level = kb_backlight_config.level - 1;
  95. }
  96. backlight_set(kb_backlight_config.level);
  97. save_backlight_config_to_eeprom();
  98. }
  99. return false;
  100. case BL_BRTG:
  101. if (record->event.pressed) {
  102. kb_backlight_config.breathing = !kb_backlight_config.breathing;
  103. breathing_toggle();
  104. save_backlight_config_to_eeprom();
  105. }
  106. return false;
  107. }
  108. return true;
  109. }