* Added mverteuil content - Userspace - Knops keymap - Preonic keymaps * Simplified and replaced some magic numbers * Convert tabs to spaces * Clean up LED handling, better animation, better layer init * Use get_highest_layer per @drashna suggestion * Reorder prototypes/reformat * Simplified/more expessive and fixed initial layer LED * Remove changes to git ignored files
		
			
				
	
	
		
			306 lines
		
	
	
	
		
			8.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			306 lines
		
	
	
	
		
			8.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include QMK_KEYBOARD_H
 | 
						|
 | 
						|
#define MAXIMIZ A(G(KC_F))
 | 
						|
#define NXTDSPL C(A(G(KC_RIGHT)))
 | 
						|
#define BTMHALF A(G(KC_DOWN))
 | 
						|
#define TOPHALF A(G(KC_UP))
 | 
						|
#define NXTTHRD SS_LCTL(SS_LALT(SS_TAP(X_RIGHT)))
 | 
						|
#define PRVTHRD C(A(KC_LEFT))
 | 
						|
 | 
						|
#define LT_MSTP LT(_LAYER_SELECT, KC_MSTP)
 | 
						|
#define LT_ESC LT(_LAYER_SELECT, KC_ESC)
 | 
						|
#define LT_NXTH TD(TD_SPEC)
 | 
						|
 | 
						|
#define writeLayerLedState(layer) writePin(layer)
 | 
						|
#define layer_led_0_off B6, false
 | 
						|
#define layer_led_1_off D5, true
 | 
						|
#define layer_led_2_off B0, false
 | 
						|
#define layer_led_0_on B6, true
 | 
						|
#define layer_led_1_on D5, false
 | 
						|
#define layer_led_2_on B0, true
 | 
						|
 | 
						|
void led_init_animation(void);
 | 
						|
void led_set_layer(int layer);
 | 
						|
void td_spectacles_finish(qk_tap_dance_state_t *state, void *user_data);
 | 
						|
void td_spectacles_reset(qk_tap_dance_state_t *state, void *user_data);
 | 
						|
 | 
						|
enum layer_led_mode {
 | 
						|
    ALL_LAYERS_OFF = -1,
 | 
						|
    LAYER_0,
 | 
						|
    LAYER_1,
 | 
						|
    LAYER_2,
 | 
						|
    LAYER_3,
 | 
						|
    LAYER_4,
 | 
						|
    LAYER_5,
 | 
						|
    ALL_LAYERS_ON,
 | 
						|
};
 | 
						|
 | 
						|
enum mini_layers {
 | 
						|
    _MEDIA,
 | 
						|
    _COPYPASTA,
 | 
						|
    _SPECTACLES,
 | 
						|
    _LAYER_3,
 | 
						|
    _LAYER_4,
 | 
						|
    _LAYER_5,
 | 
						|
    _LAYER_SELECT,
 | 
						|
};
 | 
						|
 | 
						|
enum { TD_SPEC = 0 };
 | 
						|
 | 
						|
qk_tap_dance_action_t tap_dance_actions[] = {
 | 
						|
    /* Tap once for spectacles macro, hold for layer toggle */
 | 
						|
    [TD_SPEC] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_spectacles_finish, td_spectacles_reset),
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 *   Key Layout
 | 
						|
 *   _____   _____   _____
 | 
						|
 *  |     | |     | |     |
 | 
						|
 *  |  1  | |  2  | |  3  |
 | 
						|
 *  |_____| |_____| |_____|
 | 
						|
 *   _____   _____   _____
 | 
						|
 *  |     | |     | |     |
 | 
						|
 *  |  4  | |  5  | |  6  |
 | 
						|
 *  |_____| |_____| |_____|
 | 
						|
 *
 | 
						|
 *  Hold 1 and:
 | 
						|
 *    - press 4, 5, or 6 to change layers
 | 
						|
 *    - press 3 to reset, or press and hold 3 to enter DFU programming mode
 | 
						|
 *
 | 
						|
 *  If something prevents you from using the above to reprogram, you can hold 3 while powering on as a fallback.
 | 
						|
 */
 | 
						|
 | 
						|
/* clang-format off */
 | 
						|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
						|
    /*
 | 
						|
     *  Layer 0 (Media Keys)
 | 
						|
     *   _____   _____   _____
 | 
						|
     *  |     | |     | |     |
 | 
						|
     *  |Stop | |VolUp| |Play |
 | 
						|
     *  |_____| |_____| |_____|
 | 
						|
     *   _____   _____   _____
 | 
						|
     *  |     | |     | |     |
 | 
						|
     *  |Prev | |VolDn| |Next |
 | 
						|
     *  |_____| |_____| |_____|
 | 
						|
     *
 | 
						|
     */
 | 
						|
    [_MEDIA] = LAYOUT(
 | 
						|
        LT_MSTP, KC_VOLU, KC_MPLY,
 | 
						|
        KC_MPRV, KC_VOLD, KC_MNXT
 | 
						|
    ),
 | 
						|
 | 
						|
    /*
 | 
						|
     *  Layer 1 (Copy and Paste Macros)
 | 
						|
     *   _____   _____   _____
 | 
						|
     *  |     | |     | |     |
 | 
						|
     *	| ESC | |Ctl+Z| |CSf+Z|
 | 
						|
     *	|_____| |_____| |_____|
 | 
						|
     *   _____   _____   _____
 | 
						|
     *  |     | |     | |     |
 | 
						|
     *	|Ctl+X| |Ctl+C| |Ctl+V|
 | 
						|
     *	|_____| |_____| |_____|
 | 
						|
     *
 | 
						|
     */
 | 
						|
 | 
						|
    [_COPYPASTA] = LAYOUT(
 | 
						|
        LT_ESC,  C(KC_Z), C(S(KC_Z)),
 | 
						|
        C(KC_X), C(KC_C), C(KC_V)
 | 
						|
    ),
 | 
						|
 | 
						|
    /*
 | 
						|
     *   Layer 2 (Spectacles Macros)
 | 
						|
     *   _LT&_   _____   _____
 | 
						|
     *  | Win | | Win | | Win |
 | 
						|
     *  | Next| | Top | |Mximze
 | 
						|
     *  |_1/3_| |_1/2_| |_____|
 | 
						|
     *   _____	 _____	 _____
 | 
						|
     *  | Win | | Win | | Win |
 | 
						|
     *  | Prev| | Bot | | Next|
 | 
						|
     *  |_1/3_| |_1/2_| |Displ|
 | 
						|
     *
 | 
						|
     */
 | 
						|
    [_SPECTACLES] = LAYOUT(
 | 
						|
        LT_NXTH,TOPHALF,MAXIMIZ,
 | 
						|
        PRVTHRD,BTMHALF,NXTDSPL
 | 
						|
    ),
 | 
						|
 | 
						|
    /*
 | 
						|
     *  Layer 6 (Layer Select/Reset)
 | 
						|
     *   _____   _____   _____
 | 
						|
     *  |     | |     | |     |
 | 
						|
     *  |None | |None | |Reset|
 | 
						|
     *  |_____| |_____| |_____|
 | 
						|
     *   _____   _____   _____
 | 
						|
     *  |Layer| |Layer| |Layer|
 | 
						|
     *  |  0  | |  1  | |  2  |
 | 
						|
     *  |_____| |_____| |_____|
 | 
						|
     *
 | 
						|
     *  Layers 0, 1, and 2 have the top left button held to activate this layer.
 | 
						|
     *  Then press the specific layer to switch to it.
 | 
						|
     *
 | 
						|
     */
 | 
						|
    [_LAYER_SELECT] = LAYOUT(
 | 
						|
        _______, _______, RESET,
 | 
						|
        TO(_MEDIA),TO(_COPYPASTA),TO(_SPECTACLES)
 | 
						|
    )
 | 
						|
};
 | 
						|
/* clang-format on */
 | 
						|
 | 
						|
/*
 | 
						|
 *	Knops Mini LED Numbers:
 | 
						|
 *   _____   _____   _____
 | 
						|
 *  |     | |     | |     |
 | 
						|
 *  |  1  | |  2  | |  3  |    <---
 | 
						|
 *  |_____| |_____| |_____|       |      These LEDs are called 'Switch LEDs'
 | 
						|
 *   _____   _____   _____        |----- To turn on/off these leds, use:
 | 
						|
 *  |     | |     | |     |       |          set_switch_led( [1-6], [true/false]);
 | 
						|
 *  |  4  | |  5  | |  6  |    <---
 | 
						|
 *  |_____| |_____| |_____|
 | 
						|
 *
 | 
						|
 *	 < 0 >   < 1 >   < 2 >     <---      These front-LEDs are called 'Layer LEDs'
 | 
						|
 *                                       To turn on/off these leds, use:
 | 
						|
 *                                           set_layer_led( [0-2], [true/false] );
 | 
						|
 */
 | 
						|
 | 
						|
void set_switch_led(int ledId, bool state) {
 | 
						|
    switch (ledId) {
 | 
						|
        case 1:
 | 
						|
            writePin(D7, state);
 | 
						|
            break;
 | 
						|
        case 2:
 | 
						|
            writePin(readPin(B7) ? C6 : C7, state);
 | 
						|
            break;
 | 
						|
        case 3:
 | 
						|
            writePin(D4, state);
 | 
						|
            break;
 | 
						|
        case 4:
 | 
						|
            writePin(E6, state);
 | 
						|
            break;
 | 
						|
        case 5:
 | 
						|
            writePin(B4, state);
 | 
						|
            break;
 | 
						|
        case 6:
 | 
						|
            writePin(D6, state);
 | 
						|
            break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void set_layer_led(int layerLedMode) {
 | 
						|
    writeLayerLedState(layer_led_0_off);
 | 
						|
    writeLayerLedState(layer_led_1_off);
 | 
						|
    writeLayerLedState(layer_led_2_off);
 | 
						|
 | 
						|
    switch (layerLedMode) {
 | 
						|
        case ALL_LAYERS_OFF:
 | 
						|
            break;
 | 
						|
        case LAYER_0:
 | 
						|
            writeLayerLedState(layer_led_0_on);
 | 
						|
            break;
 | 
						|
        case LAYER_1:
 | 
						|
            writeLayerLedState(layer_led_1_on);
 | 
						|
            break;
 | 
						|
        case LAYER_2:
 | 
						|
            writeLayerLedState(layer_led_2_on);
 | 
						|
            break;
 | 
						|
        case LAYER_3:
 | 
						|
            writeLayerLedState(layer_led_0_on);
 | 
						|
            writeLayerLedState(layer_led_1_on);
 | 
						|
            break;
 | 
						|
        case LAYER_4:
 | 
						|
            writeLayerLedState(layer_led_1_on);
 | 
						|
            writeLayerLedState(layer_led_2_on);
 | 
						|
            break;
 | 
						|
        case LAYER_5:
 | 
						|
            writeLayerLedState(layer_led_0_on);
 | 
						|
            writeLayerLedState(layer_led_2_on);
 | 
						|
            break;
 | 
						|
        default:
 | 
						|
            writeLayerLedState(layer_led_0_on);
 | 
						|
            writeLayerLedState(layer_led_1_on);
 | 
						|
            writeLayerLedState(layer_led_2_on);
 | 
						|
            break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void led_init_animation() {
 | 
						|
    for (int i = ALL_LAYERS_OFF; i <= ALL_LAYERS_ON; i++) {
 | 
						|
        led_set_layer(i);
 | 
						|
    }
 | 
						|
 | 
						|
    led_set_layer(LAYER_0);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * This function led_set_layer gets called when you switch between layers.
 | 
						|
 * It allows you to turn on and off leds for each different layer and do
 | 
						|
 * other cool stuff.
 | 
						|
 */
 | 
						|
void led_set_layer(int layer) {
 | 
						|
    switch (layer) {
 | 
						|
        case ALL_LAYERS_OFF:
 | 
						|
            set_switch_led(1, false);
 | 
						|
            set_switch_led(2, false);
 | 
						|
            set_switch_led(3, false);
 | 
						|
            set_switch_led(4, false);
 | 
						|
            set_switch_led(5, false);
 | 
						|
            set_switch_led(6, false);
 | 
						|
 | 
						|
        case _LAYER_SELECT:
 | 
						|
            set_switch_led(1, false);
 | 
						|
            set_switch_led(2, false);
 | 
						|
            set_switch_led(3, false);
 | 
						|
            set_switch_led(4, true);
 | 
						|
            set_switch_led(5, true);
 | 
						|
            set_switch_led(6, true);
 | 
						|
            break;
 | 
						|
 | 
						|
        default:
 | 
						|
            set_switch_led(1, true);
 | 
						|
            set_switch_led(2, true);
 | 
						|
            set_switch_led(3, true);
 | 
						|
            set_switch_led(4, true);
 | 
						|
            set_switch_led(5, true);
 | 
						|
            set_switch_led(6, true);
 | 
						|
            break;
 | 
						|
    }
 | 
						|
 | 
						|
    set_layer_led(layer);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Prepare all LED ports for output
 | 
						|
 */
 | 
						|
void led_init_ports() {
 | 
						|
    setPinOutput(D7);  // Switch 1 LED
 | 
						|
    setPinOutput(C6);  // Switch 2 LED Pin1
 | 
						|
    setPinOutput(C7);  // Switch 2 LED Pin2
 | 
						|
    setPinOutput(D4);  // Switch 3 LED
 | 
						|
    setPinOutput(E6);  // Switch 4 LED
 | 
						|
    setPinOutput(B4);  // Switch 5 LED
 | 
						|
    setPinOutput(D6);  // Switch 6 LED
 | 
						|
    setPinOutput(D5);  // Layer 0 LED
 | 
						|
    setPinOutput(B6);  // Layer 1 LED
 | 
						|
    setPinOutput(B0);  // Layer 2 LED
 | 
						|
}
 | 
						|
 | 
						|
// Runs on layer change, no matter where the change was initiated
 | 
						|
layer_state_t layer_state_set_user(layer_state_t state) {
 | 
						|
    set_layer_led(get_highest_layer(state));
 | 
						|
    led_set_layer(get_highest_layer(state));
 | 
						|
    return state;
 | 
						|
}
 | 
						|
 | 
						|
void matrix_init_user(void) {
 | 
						|
    led_init_ports();
 | 
						|
    led_init_animation();
 | 
						|
}
 | 
						|
 | 
						|
void td_spectacles_finish(qk_tap_dance_state_t *state, void *user_data) {
 | 
						|
    if (state->pressed) {
 | 
						|
        layer_on(_LAYER_SELECT);
 | 
						|
    } else {
 | 
						|
        SEND_STRING(NXTTHRD);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void td_spectacles_reset(qk_tap_dance_state_t *state, void *user_data) { layer_off(_LAYER_SELECT); }
 |