qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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 }