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 }