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

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