makeymakey.c (4211B)
1 /* Copyright 2022 Jose Pablo Ramirez <jp.ramangulo@gmail.com> 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 17 #include "quantum.h" 18 19 static pin_t pins[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS; 20 static pin_t led_pins[LED_PINS] = LED_PINS_HW; 21 static bool led_state[MATRIX_COLS] = {0}; 22 static uint8_t led_cycle_counter = 0; 23 24 void keyboard_post_init_kb(void) { 25 for(uint8_t row = 0; row < MATRIX_ROWS; row++) 26 { 27 for(uint8_t col = 0; col < MATRIX_COLS; col++) 28 { 29 gpio_write_pin_low(pins[row][col]); //Disable internal pull-up resistors 30 } 31 } 32 33 keyboard_post_init_user(); 34 } 35 36 void cycle_leds(void) { 37 for(uint8_t i = 0; i < 3; i++) { 38 gpio_set_pin_input(led_pins[i]); 39 gpio_write_pin_low(led_pins[i]); 40 } 41 42 led_cycle_counter++; 43 led_cycle_counter %= 6; 44 45 switch (led_cycle_counter) { 46 case 0: 47 if (led_state[0]) { // Up Arrow 48 gpio_set_pin_input(led_pins[0]); 49 gpio_write_pin_low(led_pins[0]); 50 gpio_set_pin_output(led_pins[1]); 51 gpio_write_pin_high(led_pins[1]); 52 gpio_set_pin_output(led_pins[2]); 53 gpio_write_pin_low(led_pins[2]); 54 } 55 break; 56 case 1: 57 if (led_state[1]) { // Down Arrow 58 gpio_set_pin_output(led_pins[0]); 59 gpio_write_pin_high(led_pins[0]); 60 gpio_set_pin_output(led_pins[1]); 61 gpio_write_pin_low(led_pins[1]); 62 gpio_set_pin_input(led_pins[2]); 63 gpio_write_pin_low(led_pins[2]); 64 } 65 break; 66 case 2: 67 if (led_state[2]) { // Left Arrow 68 gpio_set_pin_output(led_pins[0]); 69 gpio_write_pin_low(led_pins[0]); 70 gpio_set_pin_output(led_pins[1]); 71 gpio_write_pin_high(led_pins[1]); 72 gpio_set_pin_input(led_pins[2]); 73 gpio_write_pin_low(led_pins[2]); 74 } 75 break; 76 case 3: 77 if (led_state[3]) { // Right Arrow 78 gpio_set_pin_input(led_pins[0]); 79 gpio_write_pin_low(led_pins[0]); 80 gpio_set_pin_output(led_pins[1]); 81 gpio_write_pin_low(led_pins[1]); 82 gpio_set_pin_output(led_pins[2]); 83 gpio_write_pin_high(led_pins[2]); 84 } 85 break; 86 case 4: 87 if (led_state[4]) { // Space 88 gpio_set_pin_output(led_pins[0]); 89 gpio_write_pin_low(led_pins[0]); 90 gpio_set_pin_input(led_pins[1]); 91 gpio_write_pin_low(led_pins[1]); 92 gpio_set_pin_output(led_pins[2]); 93 gpio_write_pin_high(led_pins[2]); 94 } 95 break; 96 case 5: 97 if (led_state[5]) { // Right Click 98 gpio_set_pin_output(led_pins[0]); 99 gpio_write_pin_high(led_pins[0]); 100 gpio_set_pin_input(led_pins[1]); 101 gpio_write_pin_low(led_pins[1]); 102 gpio_set_pin_output(led_pins[2]); 103 gpio_write_pin_low(led_pins[2]); 104 } 105 break; 106 default: 107 break; 108 } 109 } 110 111 void housekeeping_task_kb(void) { 112 cycle_leds(); 113 } 114 115 bool process_record_kb(uint16_t keycode, keyrecord_t *record) { 116 117 uint8_t row = record->event.key.row; 118 uint8_t col = record->event.key.col; 119 120 if(row == 0 && col >= 0 && col < MATRIX_COLS) { 121 led_state[col] = record->event.pressed; 122 } 123 124 return process_record_user(keycode, record); 125 }