// (c) 2025 Binepad (@binpad) // SPDX-License-Identifier: GPL-2.0-or-later #include "knobx1.h" #ifdef DYNAMIC_KEYMAP_LAYER_COUNT # define X1_KEYMAP_LAYER_COUNT DYNAMIC_KEYMAP_LAYER_COUNT #else # define X1_KEYMAP_LAYER_COUNT 4 #endif void keyboard_pre_init_kb(void) { const pin_t indicator_leds[4] = {IND1_LED, IND2_LED, IND3_LED, IND4_LED}; for (int i = 0; i < 4; i++) { gpio_set_pin_output(indicator_leds[i]); // Set Indicators as output gpio_write_pin_low(indicator_leds[i]); // Set initial indicator low / OFF } // Call the user pre-init function if needed // Do it after ._kb incase the user wants to change pin stuff keyboard_pre_init_user(); } layer_state_t layer_state_set_kb(layer_state_t state) { state = layer_state_set_user(state); uint8_t layer = get_highest_layer(state); x1_layer_led(layer); return state; } void matrix_init_kb(void) { // Direct PINS use; gpio -> switch -> ground. // Setting Row 0 to ground makes it work like a direct pin gpio_set_pin_output(ROW0_PIN); // Set Col0 as an output gpio_write_pin_low(ROW0_PIN); // Set Col0 to low / ground matrix_init_user(); } bool process_x1_layer_up(keyrecord_t *record) { if (record->event.pressed) { uint8_t current_layer = get_highest_layer(layer_state); // Cycle through layers uint8_t next_layer = (current_layer + 1) % X1_KEYMAP_LAYER_COUNT; layer_move(next_layer); x1_layer_led(next_layer); // Update LED indicators } return false; } bool process_x1_layer_down(keyrecord_t *record) { if (record->event.pressed) { uint8_t current_layer = get_highest_layer(layer_state); // Reverse through layers uint8_t prev_layer = (current_layer == 0) ? (X1_KEYMAP_LAYER_COUNT - 1) : (current_layer - 1); layer_move(prev_layer); x1_layer_led(prev_layer); } return false; } bool process_record_kb(uint16_t keycode, keyrecord_t *record) { if (!process_record_user(keycode, record)) { return false; } switch (keycode) { case X1_LAYER_SELECTOR_UP: return process_x1_layer_up(record); case X1_LAYER_SELECTOR_DOWN: return process_x1_layer_down(record); default: return true; } }