orbit.c (3701B)
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 19 void led_init_ports(void) { 20 // Initialize indicator LEDs to output 21 if (isLeftHand) { 22 gpio_set_pin_output(C6); 23 gpio_set_pin_output(B6); 24 gpio_set_pin_output(B5); 25 } else { 26 gpio_set_pin_output(F6); 27 gpio_set_pin_output(F7); 28 gpio_set_pin_output(C7); 29 } 30 31 set_layer_indicators(0); 32 } 33 34 // Call led_toggle to set LEDs easily 35 // LED IDs: 36 // 37 // (LEFT) 0 1 2 | 3 4 5 (RIGHT) 38 void led_toggle(uint8_t id, bool on) { 39 if (isLeftHand) { 40 switch (id) { 41 case 0: 42 // Left hand C6 43 gpio_write_pin(C6, on); 44 break; 45 case 1: 46 // Left hand B6 47 gpio_write_pin(B6, on); 48 break; 49 case 2: 50 // Left hand B5 51 gpio_write_pin(B5, on); 52 break; 53 default: 54 break; 55 } 56 } else { 57 switch (id) { 58 case 3: 59 // Right hand F6 60 gpio_write_pin(F6, on); 61 break; 62 case 4: 63 // Right hand F7 64 gpio_write_pin(F7, on); 65 break; 66 case 5: 67 // Right hand C7 68 gpio_write_pin(C7, on); 69 break; 70 default: 71 break; 72 } 73 } 74 } 75 76 // Set all LEDs at once using an array of 6 booleans 77 // LED IDs: 78 // 79 // (LEFT) 0 1 2 | 3 4 5 (RIGHT) 80 // 81 // Ex. set_all_leds({ false, false, false, true, true, true }) would turn off left hand, turn on right hand 82 83 void set_all_leds(bool leds[6]) { 84 for (int i = 0; i < 6; i++) { 85 led_toggle(i, leds[i]); 86 } 87 } 88 89 void set_layer_indicators(uint8_t layer) { 90 switch (layer) { 91 case 0: 92 led_toggle(0, true); 93 led_toggle(1, false); 94 led_toggle(2, false); 95 break; 96 case 1: 97 led_toggle(0, true); 98 led_toggle(1, true); 99 led_toggle(2, false); 100 break; 101 case 2: 102 led_toggle(0, true); 103 led_toggle(1, true); 104 led_toggle(2, true); 105 break; 106 case 3: 107 led_toggle(0, false); 108 led_toggle(1, true); 109 led_toggle(2, true); 110 break; 111 case 4: 112 led_toggle(0, false); 113 led_toggle(1, false); 114 led_toggle(2, true); 115 break; 116 default: 117 led_toggle(0, true); 118 led_toggle(1, false); 119 led_toggle(2, true); 120 break; 121 } 122 } 123 124 bool led_update_kb(led_t led_state) { 125 bool res = led_update_user(led_state); 126 if (res) { 127 led_toggle(3, led_state.num_lock); 128 led_toggle(4, led_state.caps_lock); 129 led_toggle(5, led_state.scroll_lock); 130 } 131 return res; 132 } 133 134 layer_state_t layer_state_set_kb(layer_state_t state) { 135 set_layer_indicators(get_highest_layer(state)); 136 137 return layer_state_set_user(state); 138 }