qmk_firmware

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

knobx1.c (2544B)


      1 // (c) 2025 Binepad (@binpad)
      2 // SPDX-License-Identifier: GPL-2.0-or-later
      3 
      4 #include "knobx1.h"
      5 
      6 #ifdef DYNAMIC_KEYMAP_LAYER_COUNT
      7 #    define X1_KEYMAP_LAYER_COUNT DYNAMIC_KEYMAP_LAYER_COUNT
      8 #else
      9 #    define X1_KEYMAP_LAYER_COUNT 4
     10 #endif
     11 
     12 __attribute__((weak)) void x1_layer_led(uint8_t lyr) {
     13     gpio_write_pin(IND1_LED, lyr >= 0);
     14     gpio_write_pin(IND2_LED, lyr >= 1);
     15     gpio_write_pin(IND3_LED, lyr >= 2);
     16     gpio_write_pin(IND4_LED, lyr >= 3);
     17 }
     18 
     19 void keyboard_pre_init_kb(void) {
     20     const pin_t indicator_leds[4] = {IND1_LED, IND2_LED, IND3_LED, IND4_LED};
     21     for (int i = 0; i < 4; i++) {
     22         gpio_set_pin_output(indicator_leds[i]); // Set Indicators as output
     23         gpio_write_pin_low(indicator_leds[i]);  // Set initial indicator low / OFF
     24     }
     25 
     26     // Call the user pre-init function if needed
     27     // Do it after ._kb incase the user wants to change pin stuff
     28     keyboard_pre_init_user();
     29 }
     30 
     31 layer_state_t layer_state_set_kb(layer_state_t state) {
     32     state         = layer_state_set_user(state);
     33     uint8_t layer = get_highest_layer(state);
     34     x1_layer_led(layer);
     35     return state;
     36 }
     37 
     38 void matrix_init_kb(void) {
     39     // Direct PINS use; gpio -> switch -> ground.
     40     // Setting Row 0 to ground makes it work like a direct pin
     41     gpio_set_pin_output(ROW0_PIN); // Set Col0 as an output
     42     gpio_write_pin_low(ROW0_PIN);  // Set Col0 to low / ground
     43 
     44     matrix_init_user();
     45 }
     46 
     47 bool process_x1_layer_up(keyrecord_t *record) {
     48     if (record->event.pressed) {
     49         uint8_t current_layer = get_highest_layer(layer_state);
     50         // Cycle through layers
     51         uint8_t next_layer    = (current_layer + 1) % X1_KEYMAP_LAYER_COUNT;
     52         layer_move(next_layer);
     53         x1_layer_led(next_layer); // Update LED indicators
     54     }
     55     return false;
     56 }
     57 
     58 bool process_x1_layer_down(keyrecord_t *record) {
     59     if (record->event.pressed) {
     60         uint8_t current_layer = get_highest_layer(layer_state);
     61         // Reverse through layers
     62         uint8_t prev_layer = (current_layer == 0) ? (X1_KEYMAP_LAYER_COUNT - 1) : (current_layer - 1);
     63         layer_move(prev_layer);
     64         x1_layer_led(prev_layer);
     65     }
     66     return false;
     67 }
     68 
     69 bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
     70     if (!process_record_user(keycode, record)) {
     71         return false;
     72     }
     73     switch (keycode) {
     74         case X1_LAYER_SELECTOR_UP:
     75             return process_x1_layer_up(record);
     76 
     77         case X1_LAYER_SELECTOR_DOWN:
     78             return process_x1_layer_down(record);
     79 
     80         default:
     81             return true;
     82     }
     83 }