@ -0,0 +1,35 @@ | |||
/* | |||
Copyright 2023 QVEX Tech | |||
This program is free software: you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation, either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#pragma once | |||
#define DYNAMIC_KEYMAP_LAYER_COUNT 5 | |||
//Digital joystick (4-way switch + encoder) | |||
#define PIN_JU D4 | |||
#define PIN_JD B6 | |||
#define PIN_JL D7 | |||
#define PIN_JR B4 | |||
#define PIN_JC C6 | |||
//Thumbwheel | |||
#define PIN_TC D2 | |||
//Backlighting | |||
#define BACKLIGHT_DEFAULT_LEVEL 5 | |||
//RGB arc | |||
#define RGBLIGHT_DEFAULT_VAL 64 |
@ -0,0 +1,69 @@ | |||
{ | |||
"manufacturer": "QVEX Tech", | |||
"keyboard_name": "Lynepad", | |||
"maintainer": "QVEX-Tech", | |||
"bootloader": "caterina", | |||
"diode_direction": "COL2ROW", | |||
"matrix_pins": { | |||
"cols": [ "F0", "F1", "F4", "F5"], | |||
"rows": [ "C7", "F7" ,"F6", null, null] | |||
}, | |||
"processor": "atmega32u4", | |||
"url": "https://qvex.eu", | |||
"usb": { | |||
"device_version": "1.0.0", | |||
"vid": "0x04D8", | |||
"pid": "0xE678" | |||
}, | |||
"encoder": { | |||
"rotary": [ | |||
{"pin_a": "D6", "pin_b": "B5", "resolution": 2}, | |||
{"pin_a": "D1", "pin_b": "D0", "resolution": 2} | |||
] | |||
}, | |||
"features": { | |||
"backlight": true, | |||
"bootmagic": true, | |||
"encoder": true, | |||
"extrakey": true, | |||
"mousekey": true, | |||
"rgblight": true | |||
}, | |||
"rgblight": { | |||
"led_count": 5, | |||
"max_brightness": 192, | |||
"sleep": true | |||
}, | |||
"ws2812": { | |||
"pin": "D3" | |||
}, | |||
"backlight": { | |||
"breathing": true, | |||
"levels": 8, | |||
"max_brightness": 192, | |||
"pin": "B7" | |||
}, | |||
"layouts": { | |||
"LAYOUT": { | |||
"layout": [ | |||
{ "matrix": [0, 0], "x": 0, "y": 0 }, | |||
{ "matrix": [0, 1], "x": 1, "y": 0 }, | |||
{ "matrix": [0, 2], "x": 2, "y": 0 }, | |||
{ "matrix": [0, 3], "x": 3, "y": 0 }, | |||
{ "matrix": [1, 0], "x": 0, "y": 1 }, | |||
{ "matrix": [1, 1], "x": 1, "y": 1 }, | |||
{ "matrix": [1, 2], "x": 2, "y": 1 }, | |||
{ "matrix": [1, 3], "x": 3, "y": 1 }, | |||
{ "matrix": [2, 0], "x": 0, "y": 2 }, | |||
{ "matrix": [2, 1], "x": 1, "y": 2 }, | |||
{ "matrix": [2, 2], "x": 2, "y": 2 }, | |||
{ "matrix": [3, 0], "x": 0, "y": 3 }, | |||
{ "matrix": [3, 1], "x": 1, "y": 3 }, | |||
{ "matrix": [3, 2], "x": 2, "y": 3 }, | |||
{ "matrix": [3, 3], "x": 3, "y": 3 }, | |||
{ "matrix": [4, 0], "x": 0, "y": 4 }, | |||
{ "matrix": [4, 1], "x": 1, "y": 4 } | |||
] | |||
} | |||
} | |||
} |
@ -0,0 +1,142 @@ | |||
/* | |||
Copyright 2023 QVEX Tech | |||
This program is free software: you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation, either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#include QMK_KEYBOARD_H | |||
#define RGB_HUE_LAYER0 0 //default layer | |||
#define RGB_HUE_LAYER1 50 | |||
#define RGB_HUE_LAYER2 100 | |||
#define RGB_HUE_LAYER3 150 | |||
#define RGB_HUE_LAYER4 200 | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[0] = LAYOUT //Default | |||
( | |||
G(KC_D), G(KC_TAB), C(G(KC_LEFT)), C(G(KC_RIGHT)), | |||
G(KC_E), XXXXXXX, C(KC_C), C(KC_V), | |||
KC_LGUI, XXXXXXX, XXXXXXX, | |||
KC_VOLU, KC_VOLD, KC_MPRV, KC_MNXT, //joystick up, down, left, right | |||
KC_MPLY, MO(4) //joystick center push, thumbwheel push | |||
), | |||
[1] = LAYOUT //KiCad | |||
( | |||
KC_ESC, KC_R, KC_M, KC_DEL, | |||
KC_V, KC_G, KC_D, KC_X, | |||
MO(3), KC_B, C(KC_V), | |||
KC_PLUS, KC_MINUS, C(KC_Y), C(KC_Z), //joystick up, down, left, right | |||
KC_PGDN, MO(4) //joystick center push, thumbwheel push | |||
), | |||
[2] = LAYOUT | |||
( | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //joystick up, down, left, right | |||
XXXXXXX, MO(4) //joystick center push, thumbwheel push | |||
), | |||
[3] = LAYOUT | |||
( | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //joystick up, down, left, right | |||
XXXXXXX, MO(4) //joystick center push, thumbwheel push | |||
), | |||
[4] = LAYOUT | |||
( | |||
TO(0), TO(1), TO(2), TO(3), | |||
BL_TOGG, BL_STEP, XXXXXXX, XXXXXXX, | |||
QK_RBT, EE_CLR, QK_BOOT, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //joystick up, down, left, right | |||
RGB_TOG, XXXXXXX //joystick center push, thumbwheel push | |||
) | |||
}; | |||
#if defined(ENCODER_MAP_ENABLE) | |||
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { | |||
[0] = { | |||
ENCODER_CCW_CW(KC_VOLD, KC_VOLU), | |||
ENCODER_CCW_CW(KC_VOLD, KC_VOLU) | |||
}, | |||
[1] = { | |||
ENCODER_CCW_CW(LSFT(KC_W), KC_W), | |||
ENCODER_CCW_CW(KC_N, LSFT(KC_N)) | |||
}, | |||
[2] = { | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX), | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX) | |||
}, | |||
[3] = { | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX), | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX) | |||
}, | |||
[4] = { | |||
ENCODER_CCW_CW(RGB_VAD, RGB_VAI), | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX) | |||
} | |||
}; | |||
#endif | |||
//set only hue, retain saturation, and value | |||
void rgblight_sethue_noeeprom(uint8_t hue){ | |||
//only if rgb led ring is on | |||
if (rgblight_get_mode()) { | |||
rgblight_sethsv_noeeprom(hue,rgblight_get_sat(),rgblight_get_val()); | |||
} | |||
} | |||
//set correct layer hue on layer change | |||
layer_state_t layer_state_set_user(layer_state_t state) { | |||
switch (get_highest_layer(state)) { | |||
case 1: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER1); | |||
break; | |||
case 2: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER2); | |||
break; | |||
case 3: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER3); | |||
break; | |||
case 4: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER4); | |||
break; | |||
default: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER0); | |||
break; | |||
} | |||
return state; | |||
} | |||
//set default layer hue upon init | |||
void keyboard_post_init_user(void) { | |||
rgblight_init(); | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER0); | |||
} |
@ -0,0 +1 @@ | |||
ENCODER_MAP_ENABLE = yes |
@ -0,0 +1,142 @@ | |||
/* | |||
Copyright 2023 QVEX Tech | |||
This program is free software: you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation, either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#include QMK_KEYBOARD_H | |||
#define RGB_HUE_LAYER0 0 //default layer | |||
#define RGB_HUE_LAYER1 50 | |||
#define RGB_HUE_LAYER2 100 | |||
#define RGB_HUE_LAYER3 150 | |||
#define RGB_HUE_LAYER4 200 | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[0] = LAYOUT //Default | |||
( | |||
KC_MS_BTN4, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, | |||
KC_MS_BTN5, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, | |||
KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, | |||
KC_VOLU, KC_VOLD, KC_MPRV, KC_MNXT, //joystick up, down, left, right | |||
KC_MPLY, MO(4) //joystick center push, thumbwheel push | |||
), | |||
[1] = LAYOUT //KiCad | |||
( | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //joystick up, down, left, right | |||
XXXXXXX, MO(4) //joystick center push, thumbwheel push | |||
), | |||
[2] = LAYOUT | |||
( | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //joystick up, down, left, right | |||
XXXXXXX, MO(4) //joystick center push, thumbwheel push | |||
), | |||
[3] = LAYOUT | |||
( | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //joystick up, down, left, right | |||
XXXXXXX, MO(4) //joystick center push, thumbwheel push | |||
), | |||
[4] = LAYOUT | |||
( | |||
TO(0), TO(1), TO(2), TO(3), | |||
BL_TOGG, BL_STEP, XXXXXXX, XXXXXXX, | |||
QK_RBT, EE_CLR, QK_BOOT, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //joystick up, down, left, right | |||
RGB_TOG, XXXXXXX //joystick center push, thumbwheel push | |||
) | |||
}; | |||
#if defined(ENCODER_MAP_ENABLE) | |||
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { | |||
[0] = { | |||
ENCODER_CCW_CW(KC_VOLD, KC_VOLU), | |||
ENCODER_CCW_CW(KC_MS_WH_DOWN, KC_MS_WH_UP) | |||
}, | |||
[1] = { | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX), | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX) | |||
}, | |||
[2] = { | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX), | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX) | |||
}, | |||
[3] = { | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX), | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX) | |||
}, | |||
[4] = { | |||
ENCODER_CCW_CW(RGB_VAD, RGB_VAI), | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX) | |||
} | |||
}; | |||
#endif | |||
//set only hue, retain saturation, and value | |||
void rgblight_sethue_noeeprom(uint8_t hue) { | |||
//only if rgb led ring is on | |||
if (rgblight_get_mode()) { | |||
rgblight_sethsv_noeeprom(hue,rgblight_get_sat(),rgblight_get_val()); | |||
} | |||
} | |||
//set correct layer hue on layer change | |||
layer_state_t layer_state_set_user(layer_state_t state) { | |||
switch (get_highest_layer(state)) { | |||
case 1: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER1); | |||
break; | |||
case 2: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER2); | |||
break; | |||
case 3: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER3); | |||
break; | |||
case 4: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER4); | |||
break; | |||
default: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER0); | |||
break; | |||
} | |||
return state; | |||
} | |||
//set default layer hue upon init | |||
void keyboard_post_init_user(void) { | |||
rgblight_init(); | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER0); | |||
} |
@ -0,0 +1 @@ | |||
ENCODER_MAP_ENABLE = yes |
@ -0,0 +1,142 @@ | |||
/* | |||
Copyright 2023 QVEX Tech | |||
This program is free software: you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation, either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#include QMK_KEYBOARD_H | |||
#define RGB_HUE_LAYER0 0 //default layer | |||
#define RGB_HUE_LAYER1 50 | |||
#define RGB_HUE_LAYER2 100 | |||
#define RGB_HUE_LAYER3 150 | |||
#define RGB_HUE_LAYER4 200 | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[0] = LAYOUT //Default | |||
( | |||
G(KC_D), G(KC_TAB), C(G(KC_LEFT)), C(G(KC_RIGHT)), | |||
G(KC_E), XXXXXXX, C(KC_C), C(KC_V), | |||
KC_LGUI, XXXXXXX, XXXXXXX, | |||
KC_VOLU, KC_VOLD, KC_MPRV, KC_MNXT, //joystick up, down, left, right | |||
KC_MPLY, MO(4) //joystick center push, thumbwheel push | |||
), | |||
[1] = LAYOUT //KiCad | |||
( | |||
KC_ESC, KC_R, KC_M, KC_DEL, | |||
KC_V, KC_G, KC_D, KC_X, | |||
MO(3), KC_B, C(KC_V), | |||
KC_PLUS, KC_MINUS, C(KC_Y), C(KC_Z), //joystick up, down, left, right | |||
KC_PGDN, MO(4) //joystick center push, thumbwheel push | |||
), | |||
[2] = LAYOUT | |||
( | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //joystick up, down, left, right | |||
XXXXXXX, MO(4) //joystick center push, thumbwheel push | |||
), | |||
[3] = LAYOUT | |||
( | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //joystick up, down, left, right | |||
XXXXXXX, MO(4) //joystick center push, thumbwheel push | |||
), | |||
[4] = LAYOUT | |||
( | |||
TO(0), TO(1), TO(2), TO(3), | |||
BL_TOGG, BL_STEP, XXXXXXX, XXXXXXX, | |||
QK_RBT, EE_CLR, QK_BOOT, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //joystick up, down, left, right | |||
RGB_TOG, XXXXXXX //joystick center push, thumbwheel push | |||
) | |||
}; | |||
#if defined(ENCODER_MAP_ENABLE) | |||
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { | |||
[0] = { | |||
ENCODER_CCW_CW(KC_VOLD, KC_VOLU), | |||
ENCODER_CCW_CW(KC_VOLD, KC_VOLU) | |||
}, | |||
[1] = { | |||
ENCODER_CCW_CW(LSFT(KC_W), KC_W), | |||
ENCODER_CCW_CW(KC_N, LSFT(KC_N)) | |||
}, | |||
[2] = { | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX), | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX) | |||
}, | |||
[3] = { | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX), | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX) | |||
}, | |||
[4] = { | |||
ENCODER_CCW_CW(RGB_VAD, RGB_VAI), | |||
ENCODER_CCW_CW(XXXXXXX, XXXXXXX) | |||
} | |||
}; | |||
#endif | |||
//set only hue, retain saturation, and value | |||
void rgblight_sethue_noeeprom(uint8_t hue) { | |||
//only if rgb led ring is on | |||
if (rgblight_get_mode()) { | |||
rgblight_sethsv_noeeprom(hue,rgblight_get_sat(),rgblight_get_val()); | |||
} | |||
} | |||
//set correct layer hue on layer change | |||
layer_state_t layer_state_set_user(layer_state_t state) { | |||
switch (get_highest_layer(state)) { | |||
case 1: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER1); | |||
break; | |||
case 2: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER2); | |||
break; | |||
case 3: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER3); | |||
break; | |||
case 4: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER4); | |||
break; | |||
default: | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER0); | |||
break; | |||
} | |||
return state; | |||
} | |||
//set default layer hue upon init | |||
void keyboard_post_init_user(void) { | |||
rgblight_init(); | |||
rgblight_sethue_noeeprom(RGB_HUE_LAYER0); | |||
} |
@ -0,0 +1,2 @@ | |||
ENCODER_MAP_ENABLE = yes | |||
VIA_ENABLE = yes |
@ -0,0 +1,119 @@ | |||
/* | |||
Copyright 2023 QVEX Tech | |||
This program is free software: you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation, either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#include <stdint.h> | |||
#include <stdbool.h> | |||
#include <string.h> | |||
#include "util.h" | |||
#include "matrix.h" | |||
#include "debounce.h" | |||
#include "quantum.h" | |||
static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; | |||
static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; | |||
extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values | |||
extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values | |||
static void select_row(uint8_t row) { | |||
setPinOutput(row_pins[row]); | |||
writePinLow(row_pins[row]); | |||
} | |||
static void unselect_row(uint8_t row) { | |||
setPinInputHigh(row_pins[row]); | |||
} | |||
static void unselect_rows(void) { | |||
for (uint8_t x = 0; x < MATRIX_ROWS; x++) { | |||
setPinInputHigh(row_pins[x]); | |||
} | |||
} | |||
static void init_pins(void) { | |||
unselect_rows(); | |||
for (uint8_t x = 0; x < MATRIX_COLS; x++) { | |||
setPinInputHigh(col_pins[x]); | |||
} | |||
setPinInputHigh(PIN_JU); | |||
setPinInputHigh(PIN_JD); | |||
setPinInputHigh(PIN_JL); | |||
setPinInputHigh(PIN_JR); | |||
setPinInputHigh(PIN_JC); | |||
setPinInputHigh(PIN_TC); | |||
} | |||
static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { | |||
if (current_row > 2) return false; | |||
matrix_row_t last_row_value = current_matrix[current_row]; | |||
current_matrix[current_row] = 0; | |||
select_row(current_row); | |||
wait_us(30); | |||
for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { | |||
uint8_t pin_state = readPin(col_pins[col_index]); | |||
current_matrix[current_row] |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index); | |||
} | |||
unselect_row(current_row); | |||
return (last_row_value != current_matrix[current_row]); | |||
} | |||
static bool read_encoder_switches(matrix_row_t current_matrix[]) { | |||
matrix_row_t last_fourth_row = current_matrix[3]; | |||
matrix_row_t last_fifth_row = current_matrix[4]; | |||
current_matrix[3] = 0; | |||
current_matrix[4] = 0; | |||
current_matrix[4] |= !readPin(PIN_TC) ? (1 << 1) : 0; | |||
if (!readPin(PIN_JC)) { | |||
if (!readPin(PIN_JU)) { | |||
current_matrix[3] |= (1 << 0); | |||
} else if (!readPin(PIN_JD)) { | |||
current_matrix[3] |= (1 << 1); | |||
} else if (!readPin(PIN_JL)) { | |||
current_matrix[3] |= (1 << 2); | |||
} else if (!readPin(PIN_JR)) { | |||
current_matrix[3] |= (1 << 3); | |||
} else { | |||
current_matrix[4] |= (1 << 0); | |||
} | |||
} | |||
return last_fourth_row != current_matrix[3] || last_fifth_row != current_matrix[4]; | |||
} | |||
void matrix_init_custom(void) { | |||
init_pins(); | |||
} | |||
bool matrix_scan_custom(void) { | |||
bool changed = false; | |||
for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { | |||
changed |= read_cols_on_row(raw_matrix, current_row); | |||
} | |||
changed |= read_encoder_switches(raw_matrix); | |||
return changed; | |||
} |
@ -0,0 +1,27 @@ | |||
# QVEX Lynepad 2 | |||
![QVEX Lynepad 2.1](https://i.imgur.com/eDvVaE4h.jpeg) | |||
*Macropad with 11 keys, thumbwheel, and a rotary 4-way switch* | |||
* Keyboard Maintainer: [QVEX Tech](https://github.com/QVEX-Tech) ([seflm](https://github.com/seflm)) | |||
* Hardware Supported: QVEX Lynepad | |||
* Hardware Availability: [QVEX Lynepad on Tindie](https://www.tindie.com/products/qvex_tech/lynepad-21-hot-swap-macropad-w-joystick/) | |||
Make example for this keyboard (after setting up your build environment): | |||
make qvex/lynepad:default | |||
Flashing example for this keyboard: | |||
make qvex/lynepad:default:flash | |||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). | |||
### Bootloader | |||
Enter the bootloader in 3 ways: | |||
* **Bootmagic reset**: Hold down the top left key and plug in the keyboard | |||
* **Physical reset button**: Briefly press the reset button on the back of the Lynepad using SIM tool (rev.2.0 or newer) | |||
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available |
@ -0,0 +1,2 @@ | |||
CUSTOM_MATRIX = lite | |||
SRC += matrix.c |