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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

ledmap.c 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include "ledmap.h"
  2. #include "ledmap_in_eeprom.h"
  3. #include "led.h"
  4. #include "softpwm_led.h"
  5. #include "action_layer.h"
  6. static led_state_t led_state = 0;
  7. static led_state_t led_state_last = 0;
  8. static void update_led_state(void);
  9. void led_set(uint8_t usb_led)
  10. {
  11. for (uint8_t i = 0; i < LED_COUNT; i++) {
  12. uint8_t code = ledmap_get_code(i);
  13. switch (code) {
  14. case LEDMAP_NUM_LOCK:
  15. usb_led & (1 << USB_LED_NUM_LOCK) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
  16. break;
  17. case LEDMAP_CAPS_LOCK:
  18. usb_led & (1 << USB_LED_CAPS_LOCK) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
  19. break;
  20. case LEDMAP_SCROLL_LOCK:
  21. usb_led & (1 << USB_LED_SCROLL_LOCK) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
  22. break;
  23. case LEDMAP_COMPOSE:
  24. usb_led & (1 << USB_LED_COMPOSE) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
  25. break;
  26. case LEDMAP_KANA:
  27. usb_led & (1 << USB_LED_KANA) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
  28. break;
  29. default:
  30. break;
  31. }
  32. }
  33. update_led_state();
  34. }
  35. #ifndef NO_ACTION_LAYER
  36. void default_layer_state_change(uint32_t state)
  37. {
  38. for (uint8_t i = 0; i < LED_COUNT; i++) {
  39. uint8_t code = ledmap_get_code(i);
  40. if (code >= LEDMAP_DEFAULT_LAYER_0 && code < LEDMAP_DEFAULT_LAYER_31) {
  41. state & (1UL << (code - LEDMAP_DEFAULT_LAYER_0)) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
  42. }
  43. }
  44. update_led_state();
  45. }
  46. void layer_state_change(uint32_t state)
  47. {
  48. for (uint8_t i = 0; i < LED_COUNT; i++) {
  49. uint8_t code = ledmap_get_code(i);
  50. if (code >= LEDMAP_LAYER_0 && code < LEDMAP_LAYER_31) {
  51. state & (1UL << (code - LEDMAP_LAYER_0)) ? LED_BIT_ON(led_state, i) : LED_BIT_OFF(led_state, i);
  52. }
  53. }
  54. update_led_state();
  55. }
  56. #endif
  57. #ifdef SOFTPWM_LED_ENABLE
  58. void softpwm_led_on()
  59. {
  60. for (uint8_t i = 0; i < LED_COUNT; i++) {
  61. uint8_t code = ledmap_get_code(i);
  62. if (code == LEDMAP_BACKLIGHT) {
  63. ledmap_led_on(i);
  64. }
  65. }
  66. }
  67. void softpwm_led_off()
  68. {
  69. for (uint8_t i = 0; i < LED_COUNT; i++) {
  70. uint8_t code = ledmap_get_code(i);
  71. if (code == LEDMAP_BACKLIGHT) {
  72. ledmap_led_off(i);
  73. }
  74. }
  75. }
  76. #endif
  77. void update_led_state(void)
  78. {
  79. uint8_t diff = led_state_last ^ led_state;
  80. if (diff) {
  81. for (uint8_t i = 0; i < LED_COUNT; i++) {
  82. if (diff & LED_BIT(i)) {
  83. if (led_state & LED_BIT(i)) {
  84. ledmap_led_on(i);
  85. }
  86. else {
  87. ledmap_led_off(i);
  88. }
  89. }
  90. }
  91. led_state_last = led_state;
  92. }
  93. }