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.

138 lines
3.6 KiB

  1. /* Copyright 2018 Ryota Goto
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include "orbit.h"
  17. #include "split_util.h"
  18. void led_init_ports(void) {
  19. // Initialize indicator LEDs to output
  20. if (isLeftHand) {
  21. setPinOutput(C6);
  22. setPinOutput(B6);
  23. setPinOutput(B5);
  24. } else {
  25. setPinOutput(F6);
  26. setPinOutput(F7);
  27. setPinOutput(C7);
  28. }
  29. set_layer_indicators(0);
  30. }
  31. // Call led_toggle to set LEDs easily
  32. // LED IDs:
  33. //
  34. // (LEFT) 0 1 2 | 3 4 5 (RIGHT)
  35. void led_toggle(uint8_t id, bool on) {
  36. if (isLeftHand) {
  37. switch (id) {
  38. case 0:
  39. // Left hand C6
  40. gpio_write_pin(C6, on);
  41. break;
  42. case 1:
  43. // Left hand B6
  44. gpio_write_pin(B6, on);
  45. break;
  46. case 2:
  47. // Left hand B5
  48. gpio_write_pin(B5, on);
  49. break;
  50. default:
  51. break;
  52. }
  53. } else {
  54. switch (id) {
  55. case 3:
  56. // Right hand F6
  57. gpio_write_pin(F6, on);
  58. break;
  59. case 4:
  60. // Right hand F7
  61. gpio_write_pin(F7, on);
  62. break;
  63. case 5:
  64. // Right hand C7
  65. gpio_write_pin(C7, on);
  66. break;
  67. default:
  68. break;
  69. }
  70. }
  71. }
  72. // Set all LEDs at once using an array of 6 booleans
  73. // LED IDs:
  74. //
  75. // (LEFT) 0 1 2 | 3 4 5 (RIGHT)
  76. //
  77. // Ex. set_all_leds({ false, false, false, true, true, true }) would turn off left hand, turn on right hand
  78. void set_all_leds(bool leds[6]) {
  79. for (int i = 0; i < 6; i++) {
  80. led_toggle(i, leds[i]);
  81. }
  82. }
  83. void set_layer_indicators(uint8_t layer) {
  84. switch (layer) {
  85. case 0:
  86. led_toggle(0, true);
  87. led_toggle(1, false);
  88. led_toggle(2, false);
  89. break;
  90. case 1:
  91. led_toggle(0, true);
  92. led_toggle(1, true);
  93. led_toggle(2, false);
  94. break;
  95. case 2:
  96. led_toggle(0, true);
  97. led_toggle(1, true);
  98. led_toggle(2, true);
  99. break;
  100. case 3:
  101. led_toggle(0, false);
  102. led_toggle(1, true);
  103. led_toggle(2, true);
  104. break;
  105. case 4:
  106. led_toggle(0, false);
  107. led_toggle(1, false);
  108. led_toggle(2, true);
  109. break;
  110. default:
  111. led_toggle(0, true);
  112. led_toggle(1, false);
  113. led_toggle(2, true);
  114. break;
  115. }
  116. }
  117. bool led_update_kb(led_t led_state) {
  118. bool res = led_update_user(led_state);
  119. if (res) {
  120. led_toggle(3, led_state.num_lock);
  121. led_toggle(4, led_state.caps_lock);
  122. led_toggle(5, led_state.scroll_lock);
  123. }
  124. return res;
  125. }
  126. layer_state_t layer_state_set_kb(layer_state_t state) {
  127. set_layer_indicators(get_highest_layer(state));
  128. return layer_state_set_user(state);
  129. }