Conflicts: keyboards/gmmk/pro/ansi/keymaps/jonavin/rules.mk keyboards/space_space/rules.mkqmk_compile_improvements
commit
4279b14adf
@ -0,0 +1,56 @@ |
||||
{ |
||||
"keyboard_name": "3w6", |
||||
"url": "https://github.com/weteor/3W6/", |
||||
"maintainer": "weteor", |
||||
"width": 13, |
||||
"height": 5, |
||||
"layouts": { |
||||
"LAYOUT": { |
||||
"layout": [ |
||||
{"label": "k00", "x": 0, "y": 0.8}, |
||||
{"label": "k01", "x": 1, "y": 0.2}, |
||||
{"label": "k02", "x": 2, "y": 0}, |
||||
{"label": "k03", "x": 3, "y": 0.2}, |
||||
{"label": "k04", "x": 4, "y": 0.4}, |
||||
|
||||
{"label": "k05", "x": 8, "y": 0.4}, |
||||
{"label": "k06", "x": 9, "y": 0.2}, |
||||
{"label": "k07", "x": 10, "y": 0}, |
||||
{"label": "k08", "x": 11, "y": 0.2}, |
||||
{"label": "k09", "x": 12, "y": 0.8}, |
||||
|
||||
{"label": "k10", "x": 0, "y": 1.8}, |
||||
{"label": "k11", "x": 1, "y": 1.2}, |
||||
{"label": "k12", "x": 2, "y": 1}, |
||||
{"label": "k13", "x": 3, "y": 1.2}, |
||||
{"label": "k14", "x": 4, "y": 1.4}, |
||||
|
||||
{"label": "k15", "x": 8, "y": 1.4}, |
||||
{"label": "k16", "x": 9, "y": 1.2}, |
||||
{"label": "k17", "x": 10, "y": 1}, |
||||
{"label": "k18", "x": 11, "y": 1.2}, |
||||
{"label": "k19", "x": 12, "y": 1.8}, |
||||
|
||||
{"label": "k20", "x": 0, "y": 2.8}, |
||||
{"label": "k21", "x": 1, "y": 2.2}, |
||||
{"label": "k22", "x": 2, "y": 2}, |
||||
{"label": "k23", "x": 3, "y": 2.2}, |
||||
{"label": "k24", "x": 4, "y": 2.4}, |
||||
|
||||
{"label": "k25", "x": 8, "y": 2.4}, |
||||
{"label": "k26", "x": 9, "y": 2.2}, |
||||
{"label": "k27", "x": 10, "y": 2}, |
||||
{"label": "k28", "x": 11, "y": 2.2}, |
||||
{"label": "k29", "x": 12, "y": 2.8}, |
||||
|
||||
{"label": "k32", "x": 3.2, "y": 3.6}, |
||||
{"label": "k33", "x": 4.2, "y": 3.6}, |
||||
{"label": "k34", "x": 5.2, "y": 3.8}, |
||||
|
||||
{"label": "k35", "x": 6.8, "y": 3.8}, |
||||
{"label": "k36", "x": 7.8, "y": 3.6}, |
||||
{"label": "k37", "x": 8.8, "y": 3.6} |
||||
] |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,69 @@ |
||||
/* Copyright 2021 weteor
|
||||
* |
||||
* 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 |
||||
|
||||
enum layers |
||||
{ |
||||
_ALPHA_QWERTY = 0, |
||||
_ALPHA_COLEMAK, |
||||
_SYM, |
||||
_NAV, |
||||
_NUM, |
||||
_CFG, |
||||
}; |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
|
||||
|
||||
[_ALPHA_QWERTY] = LAYOUT( |
||||
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
|
||||
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, |
||||
LSFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, RSFT_T(KC_SLSH), |
||||
|
||||
LCTL_T(KC_ESC), LT(_NUM,KC_SPC), LT(_NAV, KC_TAB), LT(_SYM, KC_BSPC), KC_ENT, LALT_T(KC_DEL)
|
||||
), |
||||
[_ALPHA_COLEMAK] = LAYOUT( |
||||
KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, |
||||
KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, |
||||
LSFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, RSFT_T(KC_SCLN), |
||||
LCTL_T(KC_ENT), LT(_NUM,KC_SPC), LT(_NAV, KC_TAB), LT(_SYM, KC_BSPC), KC_ENT, LALT_T(KC_DEL)
|
||||
), |
||||
[_SYM] = LAYOUT( |
||||
KC_GRV , KC_CIRC, KC_AT, KC_DLR, KC_TILD, KC_AMPR, KC_EXLM, KC_PIPE, KC_UNDS, KC_HASH, |
||||
KC_SLSH, KC_LBRC, KC_LCBR, KC_LPRN, KC_EQL, KC_ASTR, KC_RPRN, KC_RCBR, KC_RBRC, KC_BSLS,
|
||||
_______, KC_QUES, KC_PLUS, KC_PERC, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, XXXXXXX, _______, |
||||
XXXXXXX, MO(_CFG), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
||||
), |
||||
[_NAV] = LAYOUT( |
||||
XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX, KC_PGDN, KC_UP, KC_PGUP, KC_DEL, |
||||
KC_MPRV, KC_MPLY, KC_MSTP, KC_MNXT, XXXXXXX, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, |
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, |
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MO(_CFG), XXXXXXX
|
||||
), |
||||
[_NUM] = LAYOUT( |
||||
XXXXXXX, KC_F9, KC_F10, KC_F11, KC_F12, KC_PPLS, KC_P7, KC_P8, KC_P9, KC_PSLS, |
||||
XXXXXXX, KC_F5, KC_F6, KC_F7, KC_F8, KC_P0, KC_P4, KC_P5, KC_P6, KC_PDOT, |
||||
XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_PMNS, KC_P1, KC_P2, KC_P3, KC_PAST, |
||||
XXXXXXX, XXXXXXX, XXXXXXX, KC_PEQL, KC_PENT, XXXXXXX |
||||
), |
||||
[_CFG] = LAYOUT( |
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,DF(_ALPHA_QWERTY), DF(_ALPHA_COLEMAK), |
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, |
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, |
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX |
||||
), |
||||
}; |
@ -0,0 +1,32 @@ |
||||
/* Copyright 2021 weteor
|
||||
* |
||||
* 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/>.
|
||||
*/ |
||||
|
||||
// generated from users/manna-harbour_miryoku/miryoku.org -*- buffer-read-only: t -*-
|
||||
|
||||
#pragma once |
||||
|
||||
#define LAYOUT_miryoku( \ |
||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, \
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, \
|
||||
N30, N31, K32, K33, K34, K35, K36, K37, N38, N39 \
|
||||
) \
|
||||
LAYOUT( \
|
||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, \
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, \
|
||||
K32, K33, K34, K35, K36, K37 \
|
||||
) |
@ -0,0 +1,17 @@ |
||||
/* Copyright 2021 weteor
|
||||
* |
||||
* 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/>.
|
||||
*/ |
||||
|
||||
// generated from users/manna-harbour_miryoku/miryoku.org -*- buffer-read-only: t -*-
|
@ -0,0 +1,45 @@ |
||||
# 3W6 |
||||
|
||||
 |
||||
|
||||
The 3w6 is a low profile, split ortholinear keyboard with 36 keys. |
||||
|
||||
I needed a keyboard for work and wasn't really satisfied with the available alternatives (namely Corne, Kyria and Ferris), mostly because they are either rather large and/or don't have the spacing I would like. |
||||
|
||||
The 3w6 is designed to be a simple, realiable, cheap and small keyboard to be taken everywhere. |
||||
|
||||
There are currently two revisions: |
||||
* Rev1: |
||||
- onboard microcontroller (ATMega32U4) |
||||
- USB-C connector Board <-> PC |
||||
- USB-C connectors between both split halfs |
||||
- choc spacing (18x17mm) |
||||
- aggressive pinky stagger |
||||
- support for Choc V1 switches |
||||
* Rev2: |
||||
- everything Rev1 did |
||||
- additional middle plate (2mm) |
||||
- support for [Pimoroni Trackball](https://shop.pimoroni.com/products/trackball-breakout) instead of outer thumb switch on right half, needs midplate |
||||
- mounting holes for [Tenting Puck](https://splitkb.com/collections/keyboard-parts/products/tenting-puck), only usable without mid or switchplate |
||||
|
||||
--- |
||||
|
||||
* Keyboard Maintainer: [weteor](https://github.com/weteor) |
||||
* Hardware Supported: |
||||
* 3w6 rev1 |
||||
* 3w6 rev2 (with Pimoroni support) |
||||
* Hardware Availability: |
||||
* make one yourself: [Design and Productionfiles](https://github.com/weteor/3w6) |
||||
* maintainer is selling kits when available |
||||
--- |
||||
To reach the bootloader, connect the board to the PC and push the reset button on left half. |
||||
|
||||
Make examples for this keyboard (after setting up your build environment): |
||||
|
||||
make 3w6/rev1:default |
||||
make 3w6/rev2:default |
||||
make 3w6/rev2:default_pimoroni |
||||
|
||||
--- |
||||
|
||||
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). |
@ -0,0 +1,63 @@ |
||||
/*
|
||||
Copyright 2021 weteor |
||||
|
||||
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 |
||||
|
||||
|
||||
/* USB Device descriptor parameter */ |
||||
#define VENDOR_ID 0xFEED |
||||
#define PRODUCT_ID 0x4658 |
||||
#define DEVICE_VER 0x0001 |
||||
#define MANUFACTURER weteor |
||||
#define PRODUCT 3w6 |
||||
|
||||
/* key matrix size */ |
||||
#define MATRIX_ROWS 8 |
||||
#define MATRIX_COLS 10 |
||||
|
||||
#define MATRIX_ROWS_PER_SIDE (MATRIX_ROWS / 2) |
||||
#define MATRIX_COLS_PER_SIDE (MATRIX_COLS / 2) |
||||
|
||||
/*
|
||||
* Keyboard Matrix Assignments |
||||
* |
||||
* Change this to how you wired your keyboard |
||||
* COLS: AVR pins used for columns, left to right |
||||
* ROWS: AVR pins used for rows, top to bottom |
||||
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) |
||||
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) |
||||
* |
||||
*/ |
||||
#define MATRIX_ROW_PINS_L { B0, B1, B2, B4} |
||||
#define MATRIX_COL_PINS_L { B3, E6, F7, B6, B5 } |
||||
#define UNUSED_PINS_L { B7, C6, C7, D2, D3, D4, D5, D6, D7, F0, F1, F4, F5, F6 } |
||||
|
||||
#define MATRIX_ROW_PINS_R { P10, P11, P12, P05 } |
||||
#define MATRIX_COL_PINS_R { P06, P13, P14, P01, P00 } |
||||
#define UNUSED_PINS_R { P02, P03, P04, P07, P15, P16, P17 } |
||||
|
||||
|
||||
/* COL2ROW, ROW2COL */ |
||||
#define DIODE_DIRECTION COL2ROW |
||||
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ |
||||
#define DEBOUNCE 5 |
||||
|
||||
/* disable these deprecated features by default */ |
||||
#define NO_ACTION_MACRO |
||||
#define NO_ACTION_FUNCTION |
||||
|
@ -0,0 +1,280 @@ |
||||
/*
|
||||
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com> |
||||
2020 Pierre Chevalier <pierrechevalier83@gmail.com> |
||||
2021 weteor |
||||
|
||||
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/>.
|
||||
*/ |
||||
|
||||
/*
|
||||
* This code was heavily inspired by the ergodox_ez keymap, and modernized |
||||
* to take advantage of the quantum.h microcontroller agnostics gpio control |
||||
* abstractions and use the macros defined in config.h for the wiring as opposed |
||||
* to repeating that information all over the place. |
||||
*/ |
||||
|
||||
#include QMK_KEYBOARD_H |
||||
#include "i2c_master.h" |
||||
|
||||
extern i2c_status_t tca9555_status; |
||||
#define I2C_TIMEOUT 1000 |
||||
|
||||
// I2C address:
|
||||
// All address pins of the tca9555 are connected to the ground
|
||||
// | 0 | 1 | 0 | 0 | A2 | A1 | A0 |
|
||||
// | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
|
||||
#define I2C_ADDR 0b0100000 |
||||
#define I2C_ADDR_WRITE ((I2C_ADDR << 1) | I2C_WRITE) |
||||
#define I2C_ADDR_READ ((I2C_ADDR << 1) | I2C_READ) |
||||
|
||||
// Register addresses
|
||||
#define IODIRA 0x06 // i/o direction register
|
||||
#define IODIRB 0x07 |
||||
#define IREGP0 0x00 // GPIO pull-up resistor register
|
||||
#define IREGP1 0x01 |
||||
#define OREGP0 0x02 // general purpose i/o port register (write modifies OLAT)
|
||||
#define OREGP1 0x03 |
||||
|
||||
bool i2c_initialized = 0; |
||||
i2c_status_t tca9555_status = I2C_ADDR; |
||||
|
||||
uint8_t init_tca9555(void) { |
||||
print("starting init"); |
||||
tca9555_status = I2C_ADDR; |
||||
|
||||
// I2C subsystem
|
||||
if (i2c_initialized == 0) { |
||||
i2c_init(); // on pins D(1,0)
|
||||
i2c_initialized = true; |
||||
wait_ms(I2C_TIMEOUT); |
||||
} |
||||
|
||||
// set pin direction
|
||||
// - unused : input : 1
|
||||
// - input : input : 1
|
||||
// - driving : output : 0
|
||||
tca9555_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
tca9555_status = i2c_write(IODIRA, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
// This means: write on pin 5 of port 0, read on rest
|
||||
tca9555_status = i2c_write(0b11011111, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
// This means: we will write on pins 0 to 2 on port 1. read rest
|
||||
tca9555_status = i2c_write(0b11111000, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
|
||||
out: |
||||
i2c_stop(); |
||||
return tca9555_status; |
||||
} |
||||
|
||||
/* matrix state(1:on, 0:off) */ |
||||
static matrix_row_t matrix[MATRIX_ROWS]; // debounced values
|
||||
|
||||
static matrix_row_t read_cols(uint8_t row); |
||||
static void init_cols(void); |
||||
static void unselect_rows(void); |
||||
static void select_row(uint8_t row); |
||||
|
||||
static uint8_t tca9555_reset_loop; |
||||
|
||||
void matrix_init_custom(void) { |
||||
// initialize row and col
|
||||
|
||||
tca9555_status = init_tca9555(); |
||||
|
||||
unselect_rows(); |
||||
init_cols(); |
||||
|
||||
// initialize matrix state: all keys off
|
||||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { |
||||
matrix[i] = 0; |
||||
} |
||||
} |
||||
|
||||
void matrix_power_up(void) { |
||||
tca9555_status = init_tca9555(); |
||||
|
||||
unselect_rows(); |
||||
init_cols(); |
||||
|
||||
// initialize matrix state: all keys off
|
||||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { |
||||
matrix[i] = 0; |
||||
} |
||||
} |
||||
|
||||
// Reads and stores a row, returning
|
||||
// whether a change occurred.
|
||||
static inline bool store_matrix_row(matrix_row_t current_matrix[], uint8_t index) { |
||||
matrix_row_t temp = read_cols(index); |
||||
if (current_matrix[index] != temp) { |
||||
current_matrix[index] = temp; |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
bool matrix_scan_custom(matrix_row_t current_matrix[]) { |
||||
if (tca9555_status) { // if there was an error
|
||||
if (++tca9555_reset_loop == 0) { |
||||
// since tca9555_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
|
||||
// this will be approx bit more frequent than once per second
|
||||
dprint("trying to reset tca9555\n"); |
||||
tca9555_status = init_tca9555(); |
||||
if (tca9555_status) { |
||||
dprint("right side not responding\n"); |
||||
} else { |
||||
dprint("right side attached\n"); |
||||
} |
||||
} |
||||
} |
||||
|
||||
bool changed = false; |
||||
for (uint8_t i = 0; i < MATRIX_ROWS_PER_SIDE; i++) { |
||||
// select rows from left and right hands
|
||||
uint8_t left_index = i; |
||||
uint8_t right_index = i + MATRIX_ROWS_PER_SIDE; |
||||
select_row(left_index); |
||||
select_row(right_index); |
||||
|
||||
// we don't need a 30us delay anymore, because selecting a
|
||||
// left-hand row requires more than 30us for i2c.
|
||||
|
||||
changed |= store_matrix_row(current_matrix, left_index); |
||||
changed |= store_matrix_row(current_matrix, right_index); |
||||
|
||||
unselect_rows(); |
||||
} |
||||
|
||||
return changed; |
||||
} |
||||
|
||||
static void init_cols(void) { |
||||
// init on tca9555
|
||||
// not needed, already done as part of init_tca9555()
|
||||
|
||||
// init on mcu
|
||||
pin_t matrix_col_pins_mcu[MATRIX_COLS_PER_SIDE] = MATRIX_COL_PINS_L; |
||||
for (int pin_index = 0; pin_index < MATRIX_COLS_PER_SIDE; pin_index++) { |
||||
pin_t pin = matrix_col_pins_mcu[pin_index]; |
||||
setPinInput(pin); |
||||
writePinHigh(pin); |
||||
} |
||||
} |
||||
|
||||
static matrix_row_t read_cols(uint8_t row) { |
||||
if (row < MATRIX_ROWS_PER_SIDE) { |
||||
pin_t matrix_col_pins_mcu[MATRIX_COLS_PER_SIDE] = MATRIX_COL_PINS_L; |
||||
matrix_row_t current_row_value = 0; |
||||
// For each col...
|
||||
for (uint8_t col_index = 0; col_index < MATRIX_COLS_PER_SIDE; col_index++) { |
||||
// Select the col pin to read (active low)
|
||||
uint8_t pin_state = readPin(matrix_col_pins_mcu[col_index]); |
||||
|
||||
// Populate the matrix row with the state of the col pin
|
||||
current_row_value |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index); |
||||
} |
||||
return current_row_value; |
||||
} else { |
||||
if (tca9555_status) { // if there was an error
|
||||
return 0; |
||||
} else { |
||||
uint8_t data = 0; |
||||
uint8_t port0 = 0; |
||||
uint8_t port1 = 0; |
||||
tca9555_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
tca9555_status = i2c_write(IREGP0, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
tca9555_status = i2c_start(I2C_ADDR_READ, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
tca9555_status = i2c_read_ack(I2C_TIMEOUT); |
||||
if (tca9555_status < 0) goto out; |
||||
port0 = (uint8_t)tca9555_status; |
||||
tca9555_status = i2c_read_nack(I2C_TIMEOUT); |
||||
if (tca9555_status < 0) goto out; |
||||
port1 = (uint8_t)tca9555_status; |
||||
|
||||
// The initial state was all ones and any depressed key at a given column for the currently selected row will have its bit flipped to zero.
|
||||
// The return value is a row as represented in the generic matrix code were the rightmost bits represent the lower columns and zeroes represent non-depressed keys while ones represent depressed keys.
|
||||
// Since the pins are not ordered sequentially, we have to build the correct dataset from the two ports. Refer to the schematic to see where every pin is connected.
|
||||
data |= ( port0 & 0x01 );
|
||||
data |= ( port0 & 0x02 );
|
||||
data |= ( port1 & 0x10 ) >> 2;
|
||||
data |= ( port1 & 0x08 );
|
||||
data |= ( port0 & 0x40 ) >> 2;
|
||||
data = ~(data); |
||||
|
||||
tca9555_status = I2C_STATUS_SUCCESS; |
||||
out: |
||||
i2c_stop(); |
||||
return data; |
||||
} |
||||
} |
||||
} |
||||
|
||||
static void unselect_rows(void) { |
||||
// no need to unselect on tca9555, because the select step sets all
|
||||
// the other row bits high, and it's not changing to a different
|
||||
// direction
|
||||
|
||||
// unselect rows on microcontroller
|
||||
pin_t matrix_row_pins_mcu[MATRIX_ROWS_PER_SIDE] = MATRIX_ROW_PINS_L; |
||||
for (int pin_index = 0; pin_index < MATRIX_ROWS_PER_SIDE; pin_index++) { |
||||
pin_t pin = matrix_row_pins_mcu[pin_index]; |
||||
setPinInput(pin); |
||||
writePinLow(pin); |
||||
} |
||||
} |
||||
|
||||
static void select_row(uint8_t row) { |
||||
uint8_t port0 = 0xff; |
||||
uint8_t port1 = 0xff; |
||||
|
||||
if (row < MATRIX_ROWS_PER_SIDE) { |
||||
// select on atmega32u4
|
||||
pin_t matrix_row_pins_mcu[MATRIX_ROWS_PER_SIDE] = MATRIX_ROW_PINS_L; |
||||
pin_t pin = matrix_row_pins_mcu[row]; |
||||
setPinOutput(pin); |
||||
writePinLow(pin); |
||||
} else { |
||||
// select on tca9555
|
||||
if (tca9555_status) { // if there was an error
|
||||
// do nothing
|
||||
} else { |
||||
switch(row) { |
||||
case 4: port1 &= ~(1 << 0); break; |
||||
case 5: port1 &= ~(1 << 1); break; |
||||
case 6: port1 &= ~(1 << 2); break; |
||||
case 7: port0 &= ~(1 << 5); break; |
||||
default: break; |
||||
} |
||||
|
||||
tca9555_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
tca9555_status = i2c_write(OREGP0, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
tca9555_status = i2c_write(port0, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
tca9555_status = i2c_write(port1, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
// Select the desired row by writing a byte for the entire GPIOB bus where only the bit representing the row we want to select is a zero (write instruction) and every other bit is a one.
|
||||
// Note that the row - MATRIX_ROWS_PER_SIDE reflects the fact that being on the right hand, the columns are numbered from MATRIX_ROWS_PER_SIDE to MATRIX_ROWS, but the pins we want to write to are indexed from zero up on the GPIOB bus.
|
||||
out: |
||||
i2c_stop(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,32 @@ |
||||
# 3W6 |
||||
|
||||
 |
||||
 |
||||
|
||||
The 3w6 is a low profile, split ortholinear keyboard with 36 keys. |
||||
|
||||
* Rev1: |
||||
- onboard microcontroller (ATMega32U4) |
||||
- USB-C connector Board <-> PC |
||||
- USB-C connectors between both split halfs |
||||
- choc spacing (18x17mm) |
||||
- aggressive pinky stagger |
||||
- support for Choc V1 switches |
||||
|
||||
--- |
||||
|
||||
* Keyboard Maintainer: [weteor](https://github.com/weteor) |
||||
* Hardware Supported: |
||||
* 3w6 rev1 |
||||
* Hardware Availability (this is an older version, current revision is rev2): |
||||
* make one yourself: [Design and Productionfiles](https://github.com/weteor/3w6) |
||||
--- |
||||
To reach the bootloader, connect the board to the PC and push the reset button on left half. |
||||
|
||||
Make examples for this keyboard (after setting up your build environment): |
||||
|
||||
make 3w6/rev1:default |
||||
|
||||
--- |
||||
|
||||
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). |
@ -0,0 +1,17 @@ |
||||
/* Copyright 2021 weteor
|
||||
* |
||||
* 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 "rev1.h" |
@ -0,0 +1,44 @@ |
||||
/* Copyright 2021 weteor
|
||||
* |
||||
* 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 |
||||
|
||||
#include "quantum.h" |
||||
|
||||
/* This is a shortcut to help you visually see your layout.
|
||||
* |
||||
* The first section contains all of the arguments representing the physical |
||||
* layout of the board and position of the keys. |
||||
* |
||||
* The second converts the arguments into a two-dimensional array which |
||||
* represents the switch matrix. |
||||
*/ |
||||
#define LAYOUT( \ |
||||
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09,\
|
||||
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19,\
|
||||
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29,\
|
||||
k32, k33, k34, k35, k36, k37\
|
||||
) { \
|
||||
{ k00, k01, k02, k03, k04 }, \
|
||||
{ k10, k11, k12, k13, k14 }, \
|
||||
{ k20, k21, k22, k23, k24 }, \
|
||||
{ KC_NO, KC_NO, k32, k33, k34 }, \
|
||||
\
|
||||
{ k05, k06, k07, k08, k09 }, \
|
||||
{ k15, k16, k17, k18, k19 }, \
|
||||
{ k25, k26, k27, k28, k29 }, \
|
||||
{ k35, k36, k37, KC_NO, KC_NO }, \
|
||||
} |
@ -0,0 +1,29 @@ |
||||
# MCU name
|
||||
MCU = atmega32u4
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = atmel-dfu
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
UNICODE_ENABLE = yes
|
||||
CUSTOM_MATRIX = lite
|
||||
NO_USB_STARTUP_CHECK = yes
|
||||
LTO_ENABLE = no
|
||||
|
||||
SRC += matrix.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
@ -0,0 +1,63 @@ |
||||
/*
|
||||
Copyright 2021 weteor |
||||
|
||||
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 |
||||
|
||||
|
||||
/* USB Device descriptor parameter */ |
||||
#define VENDOR_ID 0xFEED |
||||
#define PRODUCT_ID 0x4658 |
||||
#define DEVICE_VER 0x0002 |
||||
#define MANUFACTURER weteor |
||||
#define PRODUCT 3w6 |
||||
|
||||
/* key matrix size */ |
||||
#define MATRIX_ROWS 8 |
||||
#define MATRIX_COLS 10 |
||||
|
||||
#define MATRIX_ROWS_PER_SIDE (MATRIX_ROWS / 2) |
||||
#define MATRIX_COLS_PER_SIDE (MATRIX_COLS / 2) |
||||
|
||||
/*
|
||||
* Keyboard Matrix Assignments |
||||
* |
||||
* Change this to how you wired your keyboard |
||||
* COLS: AVR pins used for columns, left to right |
||||
* ROWS: AVR pins used for rows, top to bottom |
||||
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) |
||||
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) |
||||
* |
||||
*/ |
||||
#define MATRIX_ROW_PINS_L { B0, B1, B2, B4} |
||||
#define MATRIX_COL_PINS_L { B3, E6, F7, B6, B5 } |
||||
#define UNUSED_PINS_L { B7, C6, C7, D2, D3, D4, D5, D6, D7, F0, F1, F4, F5, F6 } |
||||
|
||||
#define MATRIX_ROW_PINS_R { P10, P11, P12, P05 } |
||||
#define MATRIX_COL_PINS_R { P06, P13, P14, P01, P00 } |
||||
#define UNUSED_PINS_R { P02, P03, P04, P07, P15, P16, P17 } |
||||
|
||||
|
||||
/* COL2ROW, ROW2COL */ |
||||
#define DIODE_DIRECTION COL2ROW |
||||
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ |
||||
#define DEBOUNCE 5 |
||||
|
||||
/* disable these deprecated features by default */ |
||||
#define NO_ACTION_MACRO |
||||
#define NO_ACTION_FUNCTION |
||||
|
@ -0,0 +1,21 @@ |
||||
/* Copyright 2021 weteor
|
||||
* |
||||
* 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 PIMORONI_TRACKBALL_INVERT_Y |
||||
#define PIMORONI_TRACKBALL_ROTATE |
||||
|
@ -0,0 +1,70 @@ |
||||
/*
|
||||
Copyright 2021 weteor |
||||
|
||||
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 |
||||
|
||||
enum layers |
||||
{ |
||||
_ALPHA_QWERTY = 0, |
||||
_ALPHA_COLEMAK, |
||||
_SYM, |
||||
_NAV, |
||||
_NUM, |
||||
_CFG, |
||||
}; |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
|
||||
|
||||
[_ALPHA_QWERTY] = LAYOUT( |
||||
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
|
||||
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, |
||||
LSFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, RSFT_T(KC_SLSH), |
||||
|
||||
LCTL_T(KC_ESC), LT(_NUM,KC_SPC), LT(_NAV, KC_TAB), LT(_SYM, KC_BSPC), KC_ENT, LALT_T(KC_DEL)
|
||||
), |
||||
[_ALPHA_COLEMAK] = LAYOUT( |
||||
KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, |
||||
KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, |
||||
LSFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, RSFT_T(KC_SCLN), |
||||
LCTL_T(KC_ENT), LT(_NUM,KC_SPC), LT(_NAV, KC_TAB), LT(_SYM, KC_BSPC), KC_ENT, LALT_T(KC_DEL)
|
||||
), |
||||
[_SYM] = LAYOUT( |
||||
KC_GRV , KC_CIRC, KC_AT, KC_DLR, KC_TILD, KC_AMPR, KC_EXLM, KC_PIPE, KC_UNDS, KC_HASH, |
||||
KC_SLSH, KC_LBRC, KC_LCBR, KC_LPRN, KC_EQL, KC_ASTR, KC_RPRN, KC_RCBR, KC_RBRC, KC_BSLS,
|
||||
_______, KC_QUES, KC_PLUS, KC_PERC, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, XXXXXXX, _______, |
||||
XXXXXXX, MO(_CFG), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
||||
), |
||||
[_NAV] = LAYOUT( |
||||
XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX, KC_PGDN, KC_UP, KC_PGUP, KC_DEL, |
||||
KC_MPRV, KC_MPLY, KC_MSTP, KC_MNXT, XXXXXXX, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, |
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, |
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MO(_CFG), XXXXXXX
|
||||
), |
||||
[_NUM] = LAYOUT( |
||||
XXXXXXX, KC_F9, KC_F10, KC_F11, KC_F12, KC_PPLS, KC_P7, KC_P8, KC_P9, KC_PSLS, |
||||
XXXXXXX, KC_F5, KC_F6, KC_F7, KC_F8, KC_P0, KC_P4, KC_P5, KC_P6, KC_PDOT, |
||||
XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_PMNS, KC_P1, KC_P2, KC_P3, KC_PAST, |
||||
XXXXXXX, XXXXXXX, XXXXXXX, KC_PEQL, KC_PENT, XXXXXXX |
||||
), |
||||
[_CFG] = LAYOUT( |
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,DF(_ALPHA_QWERTY), DF(_ALPHA_COLEMAK), |
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, |
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, |
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX |
||||
), |
||||
}; |
@ -0,0 +1,177 @@ |
||||
/* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
|
||||
* |
||||
* 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 "pimoroni_trackball.h" |
||||
#include "i2c_master.h" |
||||
|
||||
static uint8_t scrolling = 0; |
||||
static int16_t x_offset = 0; |
||||
static int16_t y_offset = 0; |
||||
static int16_t h_offset = 0; |
||||
static int16_t v_offset = 0; |
||||
static float precisionSpeed = 1; |
||||
|
||||
static uint16_t i2c_timeout_timer; |
||||
|
||||
#ifndef I2C_TIMEOUT |
||||
# define I2C_TIMEOUT 100 |
||||
#endif |
||||
#ifndef I2C_WAITCHECK |
||||
# define I2C_WAITCHECK 1000 |
||||
#endif |
||||
#ifndef MOUSE_DEBOUNCE |
||||
# define MOUSE_DEBOUNCE 5 |
||||
#endif |
||||
|
||||
void trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white) { |
||||
uint8_t data[] = {0x00, red, green, blue, white}; |
||||
i2c_transmit(TRACKBALL_WRITE, data, sizeof(data), I2C_TIMEOUT); |
||||
} |
||||
|
||||
int16_t mouse_offset(uint8_t positive, uint8_t negative, int16_t scale) { |
||||
int16_t offset = (int16_t)positive - (int16_t)negative; |
||||
int16_t magnitude = (int16_t)(scale * offset * offset * precisionSpeed); |
||||
return offset < 0 ? -magnitude : magnitude; |
||||
} |
||||
|
||||
void update_member(int8_t* member, int16_t* offset) { |
||||
if (*offset > 127) { |
||||
*member = 127; |
||||
*offset -= 127; |
||||
} else if (*offset < -127) { |
||||
*member = -127; |
||||
*offset += 127; |
||||
} else { |
||||
*member = *offset; |
||||
*offset = 0; |
||||
} |
||||
} |
||||
|
||||
__attribute__((weak)) void trackball_check_click(bool pressed, report_mouse_t* mouse) { |
||||
if (pressed) { |
||||
mouse->buttons |= MOUSE_BTN1; |
||||
} else { |
||||
mouse->buttons &= ~MOUSE_BTN1; |
||||
} |
||||
} |
||||
|
||||
bool process_record_kb(uint16_t keycode, keyrecord_t* record) { |
||||
if (true) { |
||||
xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed); |
||||
} |
||||
|
||||
|
||||
if (!process_record_user(keycode, record)) { return false; } |
||||
|
||||
/* If Mousekeys is disabled, then use handle the mouse button
|
||||
* keycodes. This makes things simpler, and allows usage of |
||||
* the keycodes in a consistent manner. But only do this if |
||||
* Mousekeys is not enable, so it's not handled twice. |
||||
*/ |
||||
#ifndef MOUSEKEY_ENABLE |
||||
if (IS_MOUSEKEY_BUTTON(keycode)) { |
||||
report_mouse_t currentReport = pointing_device_get_report(); |
||||
if (record->event.pressed) { |
||||
currentReport.buttons |= 1 << (keycode - KC_MS_BTN1); |
||||
} else { |
||||
currentReport.buttons &= ~(1 << (keycode - KC_MS_BTN1)); |
||||
} |
||||
pointing_device_set_report(currentReport); |
||||
pointing_device_send(); |
||||
} |
||||
#endif |
||||
|
||||
return true; |
||||
} |
||||
|
||||
void trackball_register_button(bool pressed, enum mouse_buttons button) { |
||||
report_mouse_t currentReport = pointing_device_get_report(); |
||||
if (pressed) { |
||||
currentReport.buttons |= button; |
||||
} else { |
||||
currentReport.buttons &= ~button; |
||||
} |
||||
pointing_device_set_report(currentReport); |
||||
} |
||||
|
||||
float trackball_get_precision(void) { return precisionSpeed; } |
||||
void trackball_set_precision(float precision) { precisionSpeed = precision; } |
||||
bool trackball_is_scrolling(void) { return scrolling; } |
||||
void trackball_set_scrolling(bool scroll) { scrolling = scroll; } |
||||
|
||||
|
||||
__attribute__((weak)) void pointing_device_init(void) { trackball_set_rgbw(0x80, 0x00, 0x00, 0x00); } |
||||
|
||||
void pointing_device_task(void) { |
||||
static bool debounce; |
||||
static uint16_t debounce_timer; |
||||
uint8_t state[5] = {}; |
||||
if (timer_elapsed(i2c_timeout_timer) > I2C_WAITCHECK) { |
||||
if (i2c_readReg(TRACKBALL_WRITE, 0x04, state, 5, I2C_TIMEOUT) == I2C_STATUS_SUCCESS) { |
||||
if (!state[4] && !debounce) { |
||||
if (scrolling) { |
||||
#ifdef PIMORONI_TRACKBALL_INVERT_X |
||||
h_offset += mouse_offset(state[2], state[3], 1); |
||||
#else |
||||
h_offset -= mouse_offset(state[2], state[3], 1); |
||||
#endif |
||||
#ifdef PIMORONI_TRACKBALL_INVERT_Y |
||||
v_offset += mouse_offset(state[1], state[0], 1); |
||||
#else |
||||
v_offset -= mouse_offset(state[1], state[0], 1); |
||||
#endif |
||||
} else { |
||||
#ifdef PIMORONI_TRACKBALL_INVERT_X |
||||
x_offset -= mouse_offset(state[2], state[3], 5); |
||||
#else |
||||
x_offset += mouse_offset(state[2], state[3], 5); |
||||
#endif |
||||
#ifdef PIMORONI_TRACKBALL_INVERT_Y |
||||
y_offset -= mouse_offset(state[1], state[0], 5); |
||||
#else |
||||
y_offset += mouse_offset(state[1], state[0], 5); |
||||
#endif |
||||
} |
||||
} else { |
||||
if (state[4]) { |
||||
debounce = true; |
||||
debounce_timer = timer_read(); |
||||
} |
||||
} |
||||
} else { |
||||
i2c_timeout_timer = timer_read(); |
||||
} |
||||
} |
||||
|
||||
if (timer_elapsed(debounce_timer) > MOUSE_DEBOUNCE) debounce = false; |
||||
|
||||
report_mouse_t mouse = pointing_device_get_report(); |
||||
// trackball_check_click(state[4] & (1 << 7), &mouse);
|
||||
|
||||
#ifndef PIMORONI_TRACKBALL_ROTATE |
||||
update_member(&mouse.x, &x_offset); |
||||
update_member(&mouse.y, &y_offset); |
||||
update_member(&mouse.h, &h_offset); |
||||
update_member(&mouse.v, &v_offset); |
||||
#else |
||||
update_member(&mouse.x, &y_offset); |
||||
update_member(&mouse.y, &x_offset); |
||||
update_member(&mouse.h, &v_offset); |
||||
update_member(&mouse.v, &h_offset); |
||||
#endif |
||||
pointing_device_set_report(mouse); |
||||
pointing_device_send(); |
||||
} |
@ -0,0 +1,35 @@ |
||||
/* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
|
||||
* |
||||
* 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 |
||||
|
||||
#include "quantum.h" |
||||
#include "pointing_device.h" |
||||
|
||||
#ifndef TRACKBALL_ADDRESS |
||||
# define TRACKBALL_ADDRESS 0x0A |
||||
#endif |
||||
#define TRACKBALL_WRITE ((TRACKBALL_ADDRESS << 1) | I2C_WRITE) |
||||
#define TRACKBALL_READ ((TRACKBALL_ADDRESS << 1) | I2C_READ) |
||||
|
||||
void trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white); |
||||
void trackball_check_click(bool pressed, report_mouse_t *mouse); |
||||
void trackball_register_button(bool pressed, enum mouse_buttons button); |
||||
|
||||
float trackball_get_precision(void); |
||||
void trackball_set_precision(float precision); |
||||
bool trackball_is_scrolling(void); |
||||
void trackball_set_scrolling(bool scroll); |
@ -0,0 +1,3 @@ |
||||
POINTING_DEVICE_ENABLE = yes
|
||||
SRC += pimoroni_trackball.c
|
||||
MOUSEKEY_ENABLE = no
|
@ -0,0 +1,275 @@ |
||||
/*
|
||||
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com> |
||||
2020 Pierre Chevalier <pierrechevalier83@gmail.com> |
||||
2021 weteor |
||||
|
||||
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/>.
|
||||
*/ |
||||
|
||||
/*
|
||||
* This code was heavily inspired by the ergodox_ez keymap, and modernized |
||||
* to take advantage of the quantum.h microcontroller agnostics gpio control |
||||
* abstractions and use the macros defined in config.h for the wiring as opposed |
||||
* to repeating that information all over the place. |
||||
*/ |
||||
|
||||
#include QMK_KEYBOARD_H |
||||
#include "i2c_master.h" |
||||
|
||||
extern i2c_status_t tca9555_status; |
||||
#define I2C_TIMEOUT 1000 |
||||
|
||||
// I2C address:
|
||||
// All address pins of the tca9555 are connected to the ground
|
||||
// | 0 | 1 | 0 | 0 | A2 | A1 | A0 |
|
||||
// | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
|
||||
#define I2C_ADDR 0b0100000 |
||||
#define I2C_ADDR_WRITE ((I2C_ADDR << 1) | I2C_WRITE) |
||||
#define I2C_ADDR_READ ((I2C_ADDR << 1) | I2C_READ) |
||||
|
||||
// Register addresses
|
||||
#define IODIRA 0x06 // i/o direction register
|
||||
#define IODIRB 0x07 |
||||
#define IREGP0 0x00 // GPIO pull-up resistor register
|
||||
#define IREGP1 0x01 |
||||
#define OREGP0 0x02 // general purpose i/o port register (write modifies OLAT)
|
||||
#define OREGP1 0x03 |
||||
|
||||
bool i2c_initialized = 0; |
||||
i2c_status_t tca9555_status = I2C_ADDR; |
||||
|
||||
uint8_t init_tca9555(void) { |
||||
print("starting init"); |
||||
tca9555_status = I2C_ADDR; |
||||
|
||||
// I2C subsystem
|
||||
if (i2c_initialized == 0) { |
||||
i2c_init(); // on pins D(1,0)
|
||||
i2c_initialized = true; |
||||
wait_ms(I2C_TIMEOUT); |
||||
} |
||||
|
||||
// set pin direction
|
||||
// - unused : input : 1
|
||||
// - input : input : 1
|
||||
// - driving : output : 0
|
||||
tca9555_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
tca9555_status = i2c_write(IODIRA, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
// This means: read all pins of port 0
|
||||
tca9555_status = i2c_write(0b11111111, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
// This means: we will write on pins 0 to 3 on port 1. read rest
|
||||
tca9555_status = i2c_write(0b11110000, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
|
||||
out: |
||||
i2c_stop(); |
||||
return tca9555_status; |
||||
} |
||||
|
||||
/* matrix state(1:on, 0:off) */ |
||||
static matrix_row_t matrix[MATRIX_ROWS]; // debounced values
|
||||
|
||||
static matrix_row_t read_cols(uint8_t row); |
||||
static void init_cols(void); |
||||
static void unselect_rows(void); |
||||
static void select_row(uint8_t row); |
||||
|
||||
static uint8_t tca9555_reset_loop; |
||||
|
||||
void matrix_init_custom(void) { |
||||
// initialize row and col
|
||||
|
||||
tca9555_status = init_tca9555(); |
||||
|
||||
unselect_rows(); |
||||
init_cols(); |
||||
|
||||
// initialize matrix state: all keys off
|
||||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { |
||||
matrix[i] = 0; |
||||
} |
||||
} |
||||
|
||||
void matrix_power_up(void) { |
||||
tca9555_status = init_tca9555(); |
||||
|
||||
unselect_rows(); |
||||
init_cols(); |
||||
|
||||
// initialize matrix state: all keys off
|
||||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { |
||||
matrix[i] = 0; |
||||
} |
||||
} |
||||
|
||||
// Reads and stores a row, returning
|
||||
// whether a change occurred.
|
||||
static inline bool store_matrix_row(matrix_row_t current_matrix[], uint8_t index) { |
||||
matrix_row_t temp = read_cols(index); |
||||
if (current_matrix[index] != temp) { |
||||
current_matrix[index] = temp; |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
bool matrix_scan_custom(matrix_row_t current_matrix[]) { |
||||
if (tca9555_status) { // if there was an error
|
||||
if (++tca9555_reset_loop == 0) { |
||||
// since tca9555_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
|
||||
// this will be approx bit more frequent than once per second
|
||||
dprint("trying to reset tca9555\n"); |
||||
tca9555_status = init_tca9555(); |
||||
if (tca9555_status) { |
||||
dprint("right side not responding\n"); |
||||
} else { |
||||
dprint("right side attached\n"); |
||||
} |
||||
} |
||||
} |
||||
|
||||
bool changed = false; |
||||
for (uint8_t i = 0; i < MATRIX_ROWS_PER_SIDE; i++) { |
||||
// select rows from left and right hands
|
||||
uint8_t left_index = i; |
||||
uint8_t right_index = i + MATRIX_ROWS_PER_SIDE; |
||||
select_row(left_index); |
||||
select_row(right_index); |
||||
|
||||
// we don't need a 30us delay anymore, because selecting a
|
||||
// left-hand row requires more than 30us for i2c.
|
||||
|
||||
changed |= store_matrix_row(current_matrix, left_index); |
||||
changed |= store_matrix_row(current_matrix, right_index); |
||||
|
||||
unselect_rows(); |
||||
} |
||||
|
||||
return changed; |
||||
} |
||||
|
||||
static void init_cols(void) { |
||||
// init on tca9555
|
||||
// not needed, already done as part of init_tca9555()
|
||||
|
||||
// init on mcu
|
||||
pin_t matrix_col_pins_mcu[MATRIX_COLS_PER_SIDE] = MATRIX_COL_PINS_L; |
||||
for (int pin_index = 0; pin_index < MATRIX_COLS_PER_SIDE; pin_index++) { |
||||
pin_t pin = matrix_col_pins_mcu[pin_index]; |
||||
setPinInput(pin); |
||||
writePinHigh(pin); |
||||
} |
||||
} |
||||
|
||||
static matrix_row_t read_cols(uint8_t row) { |
||||
if (row < MATRIX_ROWS_PER_SIDE) { |
||||
pin_t matrix_col_pins_mcu[MATRIX_COLS_PER_SIDE] = MATRIX_COL_PINS_L; |
||||
matrix_row_t current_row_value = 0; |
||||
// For each col...
|
||||
for (uint8_t col_index = 0; col_index < MATRIX_COLS_PER_SIDE; col_index++) { |
||||
// Select the col pin to read (active low)
|
||||
uint8_t pin_state = readPin(matrix_col_pins_mcu[col_index]); |
||||
|
||||
// Populate the matrix row with the state of the col pin
|
||||
current_row_value |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index); |
||||
} |
||||
return current_row_value; |
||||
} else { |
||||
if (tca9555_status) { // if there was an error
|
||||
return 0; |
||||
} else { |
||||
uint8_t data = 0; |
||||
uint8_t port0 = 0; |
||||
tca9555_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
tca9555_status = i2c_write(IREGP0, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
tca9555_status = i2c_start(I2C_ADDR_READ, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
tca9555_status = i2c_read_nack(I2C_TIMEOUT); |
||||
if (tca9555_status < 0) goto out; |
||||
|
||||
port0 = ~(uint8_t)tca9555_status; |
||||
|
||||
// We read all the pins on GPIOA.
|
||||
// The initial state was all ones and any depressed key at a given column for the currently selected row will have its bit flipped to zero.
|
||||
// The return value is a row as represented in the generic matrix code were the rightmost bits represent the lower columns and zeroes represent non-depressed keys while ones represent depressed keys.
|
||||
// the pins connected to eact columns are sequential, but in reverse order, and counting from zero down (col 5 -> GPIO04, col6 -> GPIO03 and so on).
|
||||
data |= ( port0 & 0x01 ) << 4;
|
||||
data |= ( port0 & 0x02 ) << 2;
|
||||
data |= ( port0 & 0x04 );
|
||||
data |= ( port0 & 0x08 ) >> 2;
|
||||
data |= ( port0 & 0x10 ) >> 4;
|
||||
|
||||
tca9555_status = I2C_STATUS_SUCCESS; |
||||
out: |
||||
i2c_stop(); |
||||
|
||||
return data; |
||||
} |
||||
} |
||||
} |
||||
|
||||
static void unselect_rows(void) { |
||||
// no need to unselect on tca9555, because the select step sets all
|
||||
// the other row bits high, and it's not changing to a different
|
||||
// direction
|
||||
|
||||
// unselect rows on microcontroller
|
||||
pin_t matrix_row_pins_mcu[MATRIX_ROWS_PER_SIDE] = MATRIX_ROW_PINS_L; |
||||
for (int pin_index = 0; pin_index < MATRIX_ROWS_PER_SIDE; pin_index++) { |
||||
pin_t pin = matrix_row_pins_mcu[pin_index]; |
||||
setPinInput(pin); |
||||
writePinLow(pin); |
||||
} |
||||
} |
||||
|
||||
static void select_row(uint8_t row) { |
||||
uint8_t port1 = 0xff; |
||||
|
||||
if (row < MATRIX_ROWS_PER_SIDE) { |
||||
// select on atmega32u4
|
||||
pin_t matrix_row_pins_mcu[MATRIX_ROWS_PER_SIDE] = MATRIX_ROW_PINS_L; |
||||
pin_t pin = matrix_row_pins_mcu[row]; |
||||
setPinOutput(pin); |
||||
writePinLow(pin); |
||||
} else { |
||||
// select on tca9555
|
||||
if (tca9555_status) { // if there was an error
|
||||
// do nothing
|
||||
} else { |
||||
switch(row) { |
||||
case 4: port1 &= ~(1 << 0); break; |
||||
case 5: port1 &= ~(1 << 1); break; |
||||
case 6: port1 &= ~(1 << 2); break; |
||||
case 7: port1 &= ~(1 << 3); break; |
||||
default: break; |
||||
} |
||||
|
||||
// Select the desired row by writing a byte for the entire GPIOB bus where only the bit representing the row we want to select is a zero (write instruction) and every other bit is a one.
|
||||
// Note that the row - MATRIX_ROWS_PER_SIDE reflects the fact that being on the right hand, the columns are numbered from MATRIX_ROWS_PER_SIDE to MATRIX_ROWS, but the pins we want to write to are indexed from zero up on the GPIOB bus.
|
||||
tca9555_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
tca9555_status = i2c_write(OREGP1, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
tca9555_status = i2c_write(port1, I2C_TIMEOUT); |
||||
if (tca9555_status) goto out; |
||||
out: |
||||
i2c_stop(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,38 @@ |
||||
# 3W6 |
||||
|
||||
 |
||||
 |
||||
|
||||
The 3w6 is a low profile, split ortholinear keyboard with 36 keys. |
||||
|
||||
* Rev2: |
||||
- onboard microcontroller (ATMega32U4) |
||||
- USB-C connector Board <-> PC |
||||
- USB-C connectors between both split halfs |
||||
- choc spacing (18x17mm) |
||||
- aggressive pinky stagger |
||||
- support for Choc V1 switches |
||||
- files for midplate (1.6 to 2mm) |
||||
- support for [Pimoroni Trackball](https://shop.pimoroni.com/products/trackball-breakout) instead of outer thumb switch on right half, needs midplate |
||||
- mounting holes for [Tenting Puck](https://splitkb.com/collections/keyboard-parts/products/tenting-puck), only usable without mid or switchplate |
||||
|
||||
--- |
||||
|
||||
* Keyboard Maintainer: [weteor](https://github.com/weteor) |
||||
* Hardware Supported: |
||||
* 3w6 rev2 (with Pimoroni support) |
||||
* Hardware Availability: |
||||
* make one yourself: [Design and Productionfiles](https://github.com/weteor/3w6) |
||||
* maintainer is selling kits when available |
||||
|
||||
--- |
||||
To reach the bootloader, connect the board to the PC and push the reset button on left half. |
||||
|
||||
Make examples for this keyboard (after setting up your build environment): |
||||
|
||||
make 3w6/rev2:default |
||||
make 3w6/rev2:default_pimoroni |
||||
|
||||
--- |
||||
|
||||
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). |
@ -0,0 +1,17 @@ |
||||
/* Copyright 2021 weteor
|
||||
* |
||||
* 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 "rev2.h" |
@ -0,0 +1,44 @@ |
||||
/* Copyright 2021 weteor
|
||||
* |
||||
* 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 |
||||
|
||||
#include "quantum.h" |
||||
|
||||
/* This is a shortcut to help you visually see your layout.
|
||||
* |
||||
* The first section contains all of the arguments representing the physical |
||||
* layout of the board and position of the keys. |
||||
* |
||||
* The second converts the arguments into a two-dimensional array which |
||||
* represents the switch matrix. |
||||
*/ |
||||
#define LAYOUT( \ |
||||
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09,\
|
||||
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19,\
|
||||
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29,\
|
||||
k32, k33, k34, k35, k36, k37\
|
||||
) { \
|
||||
{ k00, k01, k02, k03, k04 }, \
|
||||
{ k10, k11, k12, k13, k14 }, \
|
||||
{ k20, k21, k22, k23, k24 }, \
|
||||
{ KC_NO, KC_NO, k32, k33, k34 }, \
|
||||
\
|
||||
{ k05, k06, k07, k08, k09 }, \
|
||||
{ k15, k16, k17, k18, k19 }, \
|
||||
{ k25, k26, k27, k28, k29 }, \
|
||||
{ k35, k36, k37, KC_NO, KC_NO }, \
|
||||
} |
@ -0,0 +1,29 @@ |
||||
# MCU name
|
||||
MCU = atmega32u4
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = atmel-dfu
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
UNICODE_ENABLE = yes
|
||||
CUSTOM_MATRIX = lite
|
||||
NO_USB_STARTUP_CHECK = yes
|
||||
LTO_ENABLE = no
|
||||
|
||||
SRC += matrix.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
@ -0,0 +1,59 @@ |
||||
/* Copyright 2019 Chip
|
||||
* |
||||
* 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 "dumbpad.h" |
||||
|
||||
void keyboard_pre_init_kb(void) { |
||||
// Set LED IO as outputs
|
||||
setPinOutput(LED_00); |
||||
setPinOutput(LED_01); |
||||
keyboard_pre_init_user(); |
||||
} |
||||
|
||||
void shutdown_user() { |
||||
// Shutdown LEDs
|
||||
writePinLow(LED_00); |
||||
writePinLow(LED_01); |
||||
} |
||||
|
||||
layer_state_t layer_state_set_kb(layer_state_t state) { |
||||
// Layer LEDs act as binary indication of current layer
|
||||
uint8_t layer = get_highest_layer(state); |
||||
writePin(LED_00, layer & 0b1); |
||||
writePin(LED_01, (layer >> 1) & 0b1); |
||||
return layer_state_set_user(state); |
||||
} |
||||
|
||||
// Optional override functions below.
|
||||
// You can leave any or all of these undefined.
|
||||
// These are only required if you want to perform custom actions.
|
||||
|
||||
void matrix_init_kb(void) { |
||||
// put your keyboard start-up code here
|
||||
// runs once when the firmware starts up
|
||||
uint8_t led_delay_ms = 80; |
||||
for (int i = 0; i < 2; i++) { |
||||
writePinHigh(LED_00); |
||||
writePinHigh(LED_01); |
||||
wait_ms(led_delay_ms); |
||||
writePinLow(LED_00); |
||||
writePinLow(LED_01); |
||||
if (i < 1) { |
||||
wait_ms(led_delay_ms); |
||||
} |
||||
} |
||||
|
||||
matrix_init_user(); |
||||
} |
@ -0,0 +1,39 @@ |
||||
/* Copyright 2019 Chip
|
||||
* |
||||
* 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 |
||||
|
||||
#include "quantum.h" |
||||
|
||||
/* This a shortcut to help you visually see your layout.
|
||||
* |
||||
* The first section contains all of the arguments representing the physical |
||||
* layout of the board and position of the keys. |
||||
* |
||||
* The second converts the arguments into a two-dimensional array which |
||||
* represents the switch matrix. |
||||
*/ |
||||
#define LAYOUT( \ |
||||
k01, k02, k03, k04, \
|
||||
k11, k12, k13, k14, \
|
||||
k21, k22, k23, k24, \
|
||||
k30, k31, k32, k33, k34 \
|
||||
) \
|
||||
{ \
|
||||
{ KC_NO, k01, k02, k03, k04 }, \
|
||||
{ KC_NO, k11, k12, k13, k14 }, \
|
||||
{ KC_NO, k21, k22, k23, k24 }, \
|
||||
{ k30, k31, k32, k33, k34 }, \
|
||||
} |
@ -0,0 +1,18 @@ |
||||
{ |
||||
"keyboard_name": "dumbpad", |
||||
"keyboard_folder": "dumbpad", |
||||
"url": "https://www.github.com/imchipwood/dumbpad", |
||||
"maintainer": "imchipwood", |
||||
"width": 5, |
||||
"height": 4, |
||||
"layouts": { |
||||
"LAYOUT": { |
||||
"layout": [ |
||||
{"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, |
||||
{"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, |
||||
{"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, |
||||
{"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3} |
||||
] |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,89 @@ |
||||
/* Copyright 2020 imchipwood
|
||||
* |
||||
* 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 |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
/*
|
||||
BASE LAYER |
||||
/-----------------------------------------------------` |
||||
| | 7 | 8 | 9 | Bkspc | |
||||
| |---------|---------|---------|---------| |
||||
| | 4 | 5 | 6 | Esc | |
||||
| |---------|---------|---------|---------| |
||||
| | 1 | 2 | 3 | Tab | |
||||
|-------------|---------|---------|---------|---------| |
||||
| Left mouse | TT(1) | 0 | . | Enter | |
||||
\-----------------------------------------------------' |
||||
*/ |
||||
[0] = LAYOUT( |
||||
KC_7, KC_8, KC_9, KC_BSPC, |
||||
KC_4, KC_5, KC_6, KC_ESC, |
||||
KC_1, KC_2, KC_3, KC_TAB, |
||||
KC_BTN1, TT(1), KC_0, LSFT_T(KC_DOT), KC_ENTER |
||||
), |
||||
/*
|
||||
SUB LAYER |
||||
/-----------------------------------------------------` |
||||
| | | | | Reset | |
||||
| |---------|---------|---------|---------| |
||||
| | | | | + | |
||||
| |---------|---------|---------|---------| |
||||
| | | | | - | |
||||
|-------------|---------|---------|---------|---------| |
||||
| LOCK | | | | = | |
||||
\-----------------------------------------------------' |
||||
*/ |
||||
[1] = LAYOUT( |
||||
_______, _______, _______, RESET, |
||||
_______, _______, _______, KC_KP_PLUS, |
||||
_______, _______, _______, KC_KP_MINUS, |
||||
KC_LOCK, _______, _______, _______, KC_EQL |
||||
), |
||||
}; |
||||
|
||||
bool encoder_update_user(uint8_t index, bool clockwise) { |
||||
/* Custom encoder control - handles CW/CCW turning of encoder
|
||||
* Default behavior: |
||||
* main layer: |
||||
* CW: move mouse right |
||||
* CCW: move mouse left |
||||
* other layers: |
||||
* CW: = (equals/plus - increase slider in Adobe products) |
||||
* CCW: - (minus/underscore - decrease slider in adobe products) |
||||
*/ |
||||
if (index == 0) { |
||||
switch (get_highest_layer(layer_state)) { |
||||
case 0: |
||||
// main layer - move mouse right (CW) and left (CCW)
|
||||
if (clockwise) { |
||||
tap_code(KC_MS_R); |
||||
} else { |
||||
tap_code(KC_MS_L); |
||||
} |
||||
break; |
||||
|
||||
default: |
||||
// other layers - =/+ (quals/plus) (CW) and -/_ (minus/underscore) (CCW)
|
||||
if (clockwise) { |
||||
tap_code(KC_EQL); |
||||
} else { |
||||
tap_code(KC_MINS); |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
return true; |
||||
} |
@ -0,0 +1,175 @@ |
||||
/* Copyright 2019 imchipwood
|
||||
* |
||||
* 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 |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
/*
|
||||
BASE LAYER |
||||
/-----------------------------------------------------` |
||||
| | 7 | 8 | 9 | Bkspc | |
||||
| |---------|---------|---------|---------| |
||||
| | 4 | 5 | 6 | Esc | |
||||
| |---------|---------|---------|---------| |
||||
| | 1 | 2 | 3 | Tab | |
||||
|-------------|---------|---------|---------|---------| |
||||
| Left mouse | MO(1) | 0 | . | Enter | |
||||
\-----------------------------------------------------' |
||||
*/ |
||||
[0] = LAYOUT( |
||||
KC_7, KC_8, KC_9, KC_BSPC, |
||||
KC_4, KC_5, KC_6, KC_ESC, |
||||
KC_1, KC_2, KC_3, KC_TAB, |
||||
KC_BTN1, MO(1), KC_0, KC_PDOT, KC_ENTER |
||||
), |
||||
/*
|
||||
SUB LAYER |
||||
/-----------------------------------------------------` |
||||
| | | | | Reset | |
||||
| |---------|---------|---------|---------| |
||||
| | | | | + | |
||||
| |---------|---------|---------|---------| |
||||
| | | | | - | |
||||
|-------------|---------|---------|---------|---------| |
||||
| LOCK | | MO(2) | | = | |
||||
\-----------------------------------------------------' |
||||
*/ |
||||
[1] = LAYOUT( |
||||
_______, _______, _______, RESET, |
||||
_______, _______, _______, KC_KP_PLUS, |
||||
_______, _______, _______, KC_KP_MINUS, |
||||
KC_MUTE, _______, MO(2) , _______, KC_EQL |
||||
), |
||||
|
||||
/*
|
||||
DEBUG LAYER |
||||
/-----------------------------------------------------` |
||||
| | | | | Reset | |
||||
| |---------|---------|---------|---------| |
||||
| | | | | | |
||||
| |---------|---------|---------|---------| |
||||
| | | | | | |
||||
|-------------|---------|---------|---------|---------| |
||||
| | | | | | |
||||
\-----------------------------------------------------' |
||||
*/ |
||||
[2] = LAYOUT( |
||||
_______, _______, _______, RESET,
|
||||
_______, _______, _______, _______,
|
||||
_______, _______, _______, _______,
|
||||
_______, _______, _______, MO(3) , _______ |
||||
), |
||||
|
||||
/*
|
||||
EXTRA LAYER |
||||
/-----------------------------------------------------` |
||||
| | | | | | |
||||
| |---------|---------|---------|---------| |
||||
| | | | | | |
||||
| |---------|---------|---------|---------| |
||||
| | | | | | |
||||
|-------------|---------|---------|---------|---------| |
||||
| | | | | | |
||||
\-----------------------------------------------------' |
||||
*/ |
||||
[3] = LAYOUT( |
||||
_______, _______, _______, _______,
|
||||
_______, _______, _______, _______,
|
||||
_______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______ |
||||
), |
||||
}; |
||||
|
||||
bool encoder_update_user(uint8_t index, bool clockwise) { |
||||
if (index == 0) { |
||||
switch (get_highest_layer(layer_state)) { |
||||
case 0: |
||||
// sub layer - Scroll
|
||||
if (clockwise) { |
||||
tap_code(KC_MS_WH_DOWN); |
||||
} else { |
||||
tap_code(KC_MS_WH_UP); |
||||
} |
||||
break; |
||||
|
||||
case 1: |
||||
// main layer - Volume
|
||||
if (clockwise) { |
||||
tap_code(KC_VOLU); |
||||
} else { |
||||
tap_code(KC_VOLD); |
||||
} |
||||
break; |
||||
|
||||
case 2: |
||||
// debug layer - Change track
|
||||
if (clockwise) { |
||||
tap_code(KC_MNXT); |
||||
} else { |
||||
tap_code(KC_MPRV); |
||||
} |
||||
break; |
||||
|
||||
default: |
||||
// any other layer Scroll
|
||||
if (clockwise) { |
||||
tap_code(KC_MS_WH_DOWN); |
||||
} else { |
||||
tap_code(KC_MS_WH_UP); |
||||
} |
||||
break;
|
||||
} |
||||
} |
||||
else if (index == 1) { |
||||
switch (get_highest_layer(layer_state)) { |
||||
case 0: |
||||
// sub layer - Volume
|
||||
if (clockwise) { |
||||
tap_code(KC_VOLU); |
||||
} else { |
||||
tap_code(KC_VOLD); |
||||
} |
||||
break; |
||||
|
||||
case 1: |
||||
// main layer - Scroll
|
||||
if (clockwise) { |
||||
tap_code(KC_MS_WH_DOWN); |
||||
} else { |
||||
tap_code(KC_MS_WH_UP); |
||||
} |
||||
break; |
||||
|
||||
case 2: |
||||
// debug layer - Brightness
|
||||
if (clockwise) { |
||||
tap_code(KC_BRID); |
||||
} else { |
||||
tap_code(KC_BRIU); |
||||
} |
||||
break; |
||||
|
||||
default: |
||||
// any other layer Scroll
|
||||
if (clockwise) { |
||||
tap_code(KC_MS_WH_DOWN); |
||||
} else { |
||||
tap_code(KC_MS_WH_UP); |
||||
} |
||||
break;
|
||||
} |
||||
} |
||||
return true; |
||||
} |
@ -0,0 +1,3 @@ |
||||
CONSOLE_ENABLE = no
|
||||
LTO_ENABLE = yes
|
||||
VIA_ENABLE = yes
|
@ -1 +1,25 @@ |
||||
DEFAULT_FOLDER = dumbpad/v0x
|
||||
# MCU name
|
||||
MCU = atmega32u4
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = caterina
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = yes # Console for debug
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
|
||||
ENCODER_ENABLE = yes
|
||||
KEY_LOCK_ENABLE = yes
|
||||
|
@ -0,0 +1,58 @@ |
||||
/*
|
||||
Copyright 2021 Yaroslav Smirnov <elorenn@bk.ru> |
||||
* |
||||
* 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 |
||||
|
||||
#include "config_common.h" |
||||
|
||||
// Rows are doubled-up for splits
|
||||
#define MATRIX_ROWS 8 |
||||
#define MATRIX_COLS 6 |
||||
|
||||
// Wiring of each half
|
||||
#define MATRIX_ROW_PINS { B1, B3, B2, B6 } |
||||
#define MATRIX_COL_PINS { D4, C6, D7, E6, B4, B5 } |
||||
// Reversed sort
|
||||
|
||||
#define DIODE_DIRECTION COL2ROW |
||||
|
||||
/* USB Device descriptor parameter */ |
||||
#define PRODUCT Elrgo S |
||||
#define MANUFACTURER Eloren |
||||
#define VENDOR_ID 0x454C |
||||
#define PRODUCT_ID 0x3436 |
||||
#define DEVICE_VER 0x0001 |
||||
|
||||
/* Set 0 if debouncing isn't needed */ |
||||
#define DEBOUNCE 5 |
||||
|
||||
/* serial.c configuration for split keyboard */ |
||||
#define SOFT_SERIAL_PIN D0 |
||||
|
||||
|
||||
/* disable debug print */ |
||||
// #define NO_DEBUG
|
||||
|
||||
/* disable print */ |
||||
// #define NO_PRINT
|
||||
|
||||
/* disable action features */ |
||||
//#define NO_ACTION_LAYER
|
||||
//#define NO_ACTION_TAPPING
|
||||
//#define NO_ACTION_ONESHOT
|
||||
//#define NO_ACTION_MACRO
|
||||
//#define NO_ACTION_FUNCTION
|
@ -0,0 +1,17 @@ |
||||
/* Copyright 2021 Yaroslav Smirnov <elorenn@bk.ru>
|
||||
* |
||||
* 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 "elrgo_s.h" |
@ -0,0 +1,38 @@ |
||||
/* Copyright 2021 Yaroslav Smirnov <elorenn@bk.ru>
|
||||
* |
||||
* 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 |
||||
|
||||
#include "quantum.h" |
||||
|
||||
|
||||
#define LAYOUT_split_3x6_5(\ |
||||
L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \
|
||||
L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \
|
||||
L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \
|
||||
L31, L32, L33, L34, L35, R30, R31, R32, R33, R34 \
|
||||
) \
|
||||
{ \
|
||||
{ L00, L01, L02, L03, L04, L05 }, \
|
||||
{ L10, L11, L12, L13, L14, L15 }, \
|
||||
{ L20, L21, L22, L23, L24, L25 }, \
|
||||
{KC_NO, L31, L32, L33, L34, L35}, \
|
||||
\
|
||||
{ R00, R01, R02, R03, R04, R05 }, \
|
||||
{ R10, R11, R12, R13, R14, R15 }, \
|
||||
{ R20, R21, R22, R23, R24, R25 }, \
|
||||
{ R30, R31, R32, R33, R34, KC_NO} \
|
||||
} |
@ -0,0 +1,59 @@ |
||||
{ |
||||
"keyboard_name": "Elrgo S", |
||||
"url": "", |
||||
"maintainer": "qmk", |
||||
"width": 17, |
||||
"height": 4, |
||||
"layouts": { |
||||
"LAYOUT_split_3x6_5": { |
||||
"layout": [ |
||||
{"label":"L00", "x":0, "y":0}, |
||||
{"label":"L01", "x":1, "y":0}, |
||||
{"label":"L02", "x":2, "y":0}, |
||||
{"label":"L03", "x":3, "y":0}, |
||||
{"label":"L04", "x":4, "y":0}, |
||||
{"label":"L05", "x":5, "y":0}, |
||||
{"label":"R00", "x":9, "y":0}, |
||||
{"label":"R01", "x":10, "y":0}, |
||||
{"label":"R02", "x":11, "y":0}, |
||||
{"label":"R03", "x":12, "y":0}, |
||||
{"label":"R04", "x":13, "y":0}, |
||||
{"label":"R05", "x":14, "y":0}, |
||||
{"label":"L10", "x":0, "y":1}, |
||||
{"label":"L11", "x":1, "y":1}, |
||||
{"label":"L12", "x":2, "y":1}, |
||||
{"label":"L13", "x":3, "y":1}, |
||||
{"label":"L14", "x":4, "y":1}, |
||||
{"label":"L15", "x":5, "y":1}, |
||||
{"label":"R10", "x":9, "y":1}, |
||||
{"label":"R11", "x":10, "y":1}, |
||||
{"label":"R12", "x":11, "y":1}, |
||||
{"label":"R13", "x":12, "y":1}, |
||||
{"label":"R14", "x":13, "y":1}, |
||||
{"label":"R15", "x":14, "y":1}, |
||||
{"label":"L20", "x":0, "y":2}, |
||||
{"label":"L21", "x":1, "y":2}, |
||||
{"label":"L22", "x":2, "y":2}, |
||||
{"label":"L23", "x":3, "y":2}, |
||||
{"label":"L24", "x":4, "y":2}, |
||||
{"label":"L25", "x":5, "y":2}, |
||||
{"label":"R20", "x":9, "y":2}, |
||||
{"label":"R21", "x":10, "y":2}, |
||||
{"label":"R22", "x":11, "y":2}, |
||||
{"label":"R23", "x":12, "y":2}, |
||||
{"label":"R24", "x":13, "y":2}, |
||||
{"label":"R25", "x":14, "y":2}, |
||||
{"label":"L31", "x":3, "y":3}, |
||||
{"label":"L32", "x":4, "y":3}, |
||||
{"label":"L33", "x":5, "y":3}, |
||||
{"label":"L34", "x":6, "y":3}, |
||||
{"label":"L35", "x":6, "y":2}, |
||||
{"label":"R30", "x":8, "y":2}, |
||||
{"label":"R31", "x":8, "y":3}, |
||||
{"label":"R32", "x":9, "y":3}, |
||||
{"label":"R33", "x":10, "y":3}, |
||||
{"label":"R34", "x":11, "y":3} |
||||
] |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,22 @@ |
||||
/* Copyright 2021 Yaroslav Smirnov <elorenn@bk.ru>
|
||||
* |
||||
* 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 USE_SERIAL |
||||
|
||||
#define MASTER_LEFT |
||||
// #define MASTER_RIGHT
|
@ -0,0 +1,58 @@ |
||||
/* Copyright 2021 Yaroslav Smirnov <elorenn@bk.ru>
|
||||
* |
||||
* 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 |
||||
|
||||
enum layers { _QWERTY, _LOWER, _RAISE, _ADJUST }; |
||||
|
||||
#define LOWER TT(_LOWER) |
||||
#define RAISE MO(_RAISE) |
||||
|
||||
#define M_SHLL LCTL(KC_LSFT) |
||||
#define M_SHLA LCTL(KC_LALT) |
||||
#define M_BBSLS LSFT(KC_BSLS) |
||||
#define M_FLEFT LCTL(KC_LEFT) |
||||
#define M_FRIGHT LCTL(KC_RIGHT) |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
[_QWERTY] = LAYOUT_split_3x6_5( |
||||
KC_ESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC , |
||||
KC_LBRC , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_QUOT , |
||||
KC_RBRC , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_GRAVE, |
||||
KC_LGUI , KC_LCTL , KC_LSFT , LOWER , M_SHLL , M_SHLA , RAISE , KC_SPC , KC_LALT , KC_ENT |
||||
), |
||||
|
||||
[_LOWER] = LAYOUT_split_3x6_5( |
||||
KC_ESC , KC_PDOT , KC_PMNS , KC_PPLS , KC_MINS , KC_EQL , KC_MUTE , KC_MSTP , KC_MPLY , KC_MPRV , KC_MNXT , KC_BSPC , |
||||
KC_PAST , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , |
||||
KC_PSLS , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , |
||||
KC_LGUI , KC_LCTL , KC_LSFT , KC_TRNS , M_SHLL , M_SHLA , KC_TRNS , KC_SPC , KC_LALT , KC_ENT |
||||
), |
||||
|
||||
[_RAISE] = LAYOUT_split_3x6_5( |
||||
KC_ESC , KC_PDOT , M_BBSLS , KC_BSLS , LSFT(KC_MINS), LSFT(KC_EQL), KC_HOME , KC_WH_L , KC_UP , KC_WH_R , KC_PGUP , KC_BSPC , |
||||
KC_TAB , LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), LSFT(KC_4) , LSFT(KC_5) , M_FLEFT , KC_LEFT , KC_DOWN , KC_RIGHT, M_FRIGHT, KC_DEL , |
||||
LSFT(KC_TAB), LSFT(KC_6), LSFT(KC_7), LSFT(KC_8), LSFT(KC_9) , LSFT(KC_0) , KC_END , KC_F22 , KC_F23 , KC_CAPS , KC_PGDN , MO(_ADJUST), |
||||
KC_LGUI , KC_LCTL , KC_LSFT , KC_LALT , M_SHLL , M_SHLA , KC_TRNS , KC_SPC , KC_RALT , KC_ENT |
||||
), |
||||
|
||||
[_ADJUST] = LAYOUT_split_3x6_5( |
||||
KC_NO , KC_SLEP , KC_VOLU , KC_BRIU , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NLCK , |
||||
KC_NO , KC_WAKE , KC_VOLD , KC_BRID , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , |
||||
KC_NO , KC_NO , KC_NO , KC_F13 , KC_F14 , KC_F15 , KC_F16 , KC_F17 , KC_F18 , KC_NO , KC_NO , MO(_ADJUST), |
||||
RESET , KC_NO , KC_NO , KC_TRNS , KC_NO , KC_NO , KC_TRNS , KC_TRNS , KC_NO , KC_NO |
||||
) |
||||
}; |
@ -0,0 +1,28 @@ |
||||
# Elrgo S Split Keyboard |
||||
|
||||
This is a fork of the VOID Ergo S with QMK Configurator support. |
||||
|
||||
Elrgo S uses 2x Arduino Pro Micro (ATmega32U4) with 3D printed case. |
||||
|
||||
[Building guide, models for 3D printing](https://github.com/Eloren1/Elrgo_S) |
||||
|
||||
* Keyboard Maintainer: [Eloren](https://github.com/Eloren1) |
||||
* Hardware Supported: Arduino Pro Micro |
||||
* Hardware Availability: [Open Source](https://github.com/Eloren1/Elrgo_S) |
||||
|
||||
Make example for this keyboard (after setting up your build environment): |
||||
|
||||
make handwired/elrgo_s:default |
||||
|
||||
Flashing example for this keyboard: |
||||
|
||||
make handwired/elrgo_s: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 2 ways: |
||||
|
||||
* **Physical reset button**: Briefly press the button through the hole on the left side of the case. |
||||
* **Keycode in layout**: Press the key mapped to `RESET` if it is available |
@ -0,0 +1,23 @@ |
||||
# MCU name
|
||||
MCU = atmega32u4
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = caterina
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
SPLIT_KEYBOARD = yes
|
@ -0,0 +1,31 @@ |
||||
{ |
||||
"keyboard_name": "FMe", |
||||
"url": "", |
||||
"maintainer": "keebzdotnet", |
||||
"height": 4, |
||||
"width": 5, |
||||
"layout_aliases": { |
||||
"LAYOUT": "LAYOUT_all" |
||||
}, |
||||
"layouts": { |
||||
"LAYOUT_all": { |
||||
"layout": [ |
||||
{"label":"k00", "x":0, "y":0}, |
||||
{"label":"k13", "x":1, "y":0}, |
||||
{"label":"k14", "x":2, "y":0}, |
||||
{"label":"k12", "x":3, "y":0}, |
||||
{"label":"k10", "x":4, "y":0}, |
||||
|
||||
{"label":"k11", "x":0.25, "y":1}, |
||||
{"label":"k04", "x":1.25, "y":1}, |
||||
{"label":"k02", "x":2.25, "y":1}, |
||||
{"label":"k03", "x":3.25, "y":1, "w":1.75}, |
||||
|
||||
{"label":"k22", "x":0.25, "y":2, "w":2.75}, |
||||
{"label":"k32", "x":3, "y":3}, |
||||
{"label":"k21", "x":3, "y":2, "w":2}, |
||||
{"label":"k01", "x":4, "y":3} |
||||
] |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,19 @@ |
||||
/* Copyright 2021 QMK / James Young (@noroadsleft)
|
||||
* |
||||
* 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 2 |
@ -0,0 +1,90 @@ |
||||
/*
|
||||
Copyright 2021 kb-elmo<mail@elmo.space> |
||||
|
||||
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 |
||||
|
||||
#include "config_common.h" |
||||
|
||||
/* USB Device descriptor parameter */ |
||||
#define VENDOR_ID 0x4F53 |
||||
#define PRODUCT_ID 0x564F |
||||
#define DEVICE_VER 0x0001 |
||||
#define MANUFACTURER Owl Studio |
||||
#define PRODUCT Voice65 Hotswap |
||||
|
||||
/* key matrix size */ |
||||
#define MATRIX_ROWS 5 |
||||
#define MATRIX_COLS 15 |
||||
|
||||
/* Keyboard Matrix Assignments */ |
||||
#define MATRIX_ROW_PINS { B0, B1, B2, B10, B11 } |
||||
#define MATRIX_COL_PINS { A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A15, B8, B9, B12, B13 } |
||||
|
||||
/* COL2ROW, ROW2COL */ |
||||
#define DIODE_DIRECTION COL2ROW |
||||
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ |
||||
#define DEBOUNCE 5 |
||||
|
||||
/* NKRO */ |
||||
#ifdef NKRO_ENABLE |
||||
# define FORCE_NKRO |
||||
#endif |
||||
|
||||
/* RGB stripe */ |
||||
#define RGB_DI_PIN B15 |
||||
#ifdef RGB_DI_PIN |
||||
# define RGBLIGHT_EFFECT_ALTERNATING |
||||
# define RGBLIGHT_EFFECT_BREATHING |
||||
# define RGBLIGHT_EFFECT_CHRISTMAS |
||||
# define RGBLIGHT_EFFECT_KNIGHT |
||||
# define RGBLIGHT_EFFECT_RAINBOW_MOOD |
||||
# define RGBLIGHT_EFFECT_RAINBOW_SWIRL |
||||
# define RGBLIGHT_EFFECT_SNAKE |
||||
# define RGBLIGHT_EFFECT_STATIC_GRADIENT |
||||
# define RGBLIGHT_EFFECT_TWINKLE |
||||
# define RGBLED_NUM 20 |
||||
# define RGBLIGHT_HUE_STEP 8 |
||||
# define RGBLIGHT_SAT_STEP 8 |
||||
# define RGBLIGHT_VAL_STEP 10 |
||||
# define RGBLIGHT_LIMIT_VAL 180 |
||||
# define OWL_VOLUME_RANGE 50 |
||||
#endif |
||||
|
||||
/* RGB matrix */ |
||||
#ifdef RGB_MATRIX_ENABLE |
||||
# define USE_I2CV2 |
||||
# define RGB_MATRIX_DISABLE_KEYCODES |
||||
# define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
|
||||
# define RGB_DISABLE_WHEN_USB_SUSPENDED true // turn off effects when suspended
|
||||
# define RGB_MATRIX_KEYPRESSES |
||||
# define RGB_MATRIX_LED_PROCESS_LIMIT 4 |
||||
# define RGB_MATRIX_LED_FLUSH_LIMIT 26 |
||||
# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 |
||||
# define RGB_MATRIX_STARTUP_VAL 128 |
||||
# define DRIVER_ADDR_1 0b0110000 |
||||
# define DRIVER_ADDR_2 0b0110000 |
||||
# define DRIVER_COUNT 2 |
||||
# define DRIVER_1_LED_TOTAL 67 |
||||
# define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL |
||||
#endif |
||||
|
||||
/* Encoder */ |
||||
#define ENCODERS_PAD_A { B4 } |
||||
#define ENCODERS_PAD_B { B5 } |
||||
#define ENCODER_RESOLUTION 4 |
||||
#define TAP_CODE_DELAY 10 |
@ -0,0 +1,21 @@ |
||||
/* Copyright 2021 kb-elmo<mail@elmo.space>
|
||||
* |
||||
* 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 HAL_USE_I2C TRUE |
||||
|
||||
#include_next <halconf.h> |
@ -0,0 +1,451 @@ |
||||
/* Copyright 2021 kb-elmo<mail@elmo.space>
|
||||
* |
||||
* 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 "hotswap.h" |
||||
|
||||
#ifdef RGB_MATRIX_ENABLE |
||||
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { |
||||
{0, CS3_SW1, CS2_SW1, CS1_SW1}, /* RGB0-ESC ROW0*/ |
||||
{0, CS6_SW1, CS5_SW1, CS4_SW1}, /* RGB1-1 */ |
||||
{0, CS9_SW1, CS8_SW1, CS7_SW1}, /* RGB2-2 */ |
||||
{0, CS12_SW1, CS11_SW1, CS10_SW1}, /* RGB3-3 */ |
||||
{0, CS15_SW1, CS14_SW1, CS13_SW1}, /* RGB4-4 */ |
||||
{0, CS18_SW1, CS17_SW1, CS16_SW1}, /* RGB5-5 */ |
||||
{0, CS21_SW1, CS20_SW1, CS19_SW1}, /* RGB6-6 */ |
||||
{0, CS24_SW1, CS23_SW1, CS22_SW1}, /* RGB7-7 */ |
||||
{0, CS27_SW1, CS26_SW1, CS25_SW1}, /* RGB8-8 */ |
||||
{0, CS30_SW1, CS29_SW1, CS28_SW1}, /* RGB9-9 */ |
||||
{0, CS33_SW1, CS32_SW1, CS31_SW1}, /* RGB10-0 */ |
||||
{0, CS36_SW1, CS35_SW1, CS34_SW1}, /* RGB11--- */ |
||||
{0, CS39_SW1, CS38_SW1, CS37_SW1}, /* RGB12-+= */ |
||||
{0, CS36_SW6, CS35_SW6, CS34_SW6}, /* RGB13-BS */ |
||||
{0, CS27_SW7, CS26_SW7, CS25_SW7}, /* RGB14-DEL */ |
||||
{0, CS3_SW2, CS2_SW2, CS1_SW2}, /* RGB15-TAB ----ROW1*/ |
||||
{0, CS6_SW2, CS5_SW2, CS4_SW2}, /* RGB16-Q */ |
||||
{0, CS9_SW2, CS8_SW2, CS7_SW2}, /* RGB17-W */ |
||||
{0, CS12_SW2, CS11_SW2, CS10_SW2}, /* RGB18-E */ |
||||
{0, CS15_SW2, CS14_SW2, CS13_SW2}, /* RGB19-R */ |
||||
{0, CS18_SW2, CS17_SW2, CS16_SW2}, /* RGB20-T */ |
||||
{0, CS21_SW2, CS20_SW2, CS19_SW2}, /* RGB21-Y */ |
||||
{0, CS24_SW2, CS23_SW2, CS22_SW2}, /* RGB22-U */ |
||||
{0, CS27_SW2, CS26_SW2, CS25_SW2}, /* RGB23-I */ |
||||
{0, CS30_SW2, CS29_SW2, CS28_SW2}, /* RGB24-O */ |
||||
{0, CS33_SW2, CS32_SW2, CS31_SW2}, /* RGB25-P */ |
||||
{0, CS36_SW2, CS35_SW2, CS34_SW2}, /* RGB26-[ */ |
||||
{0, CS39_SW2, CS38_SW2, CS37_SW2}, /* RGB27-] */ |
||||
{0, CS39_SW6, CS38_SW6, CS37_SW6}, /* RGB28-\ */ |
||||
{0, CS30_SW7, CS29_SW7, CS28_SW7}, /* RGB29-PGUP */ |
||||
{0, CS3_SW3, CS2_SW3, CS1_SW3}, /* RGB30-CAPS---ROW2*/ |
||||
{0, CS6_SW3, CS5_SW3, CS4_SW3}, /* RGB31-A-- */ |
||||
{0, CS9_SW3, CS8_SW3, CS7_SW3}, /* RGB32-S-- */ |
||||
{0, CS12_SW3, CS11_SW3, CS10_SW3}, /* RGB33-D-- */ |
||||
{0, CS15_SW3, CS14_SW3, CS13_SW3}, /* RGB34-F-- */ |
||||
{0, CS18_SW3, CS17_SW3, CS16_SW3}, /* RGB35-G-- */ |
||||
{0, CS21_SW3, CS20_SW3, CS19_SW3}, /* RGB36-H-- */ |
||||
{0, CS24_SW3, CS23_SW3, CS22_SW3}, /* RGB37-J-- */ |
||||
{0, CS27_SW3, CS26_SW3, CS25_SW3}, /* RGB38-K-- */ |
||||
{0, CS30_SW3, CS29_SW3, CS28_SW3}, /* RGB39-L-- */ |
||||
{0, CS33_SW3, CS32_SW3, CS31_SW3}, /* RGB40-;:- */ |
||||
{0, CS36_SW3, CS35_SW3, CS34_SW3}, /* RGB41-''- */ |
||||
{0, CS39_SW3, CS38_SW3, CS37_SW3}, /* RGB42-ENTER- */ |
||||
{0, CS33_SW7, CS32_SW7, CS31_SW7}, /* RGB43-PGDN */ |
||||
{0, CS3_SW4, CS2_SW4, CS1_SW4}, /* RGB44-LSF --ROW3*/ |
||||
{0, CS6_SW4, CS5_SW4, CS4_SW4}, /* RGB45-Z -*/ |
||||
{0, CS9_SW4, CS8_SW4, CS7_SW4}, /* RGB46-X -*/ |
||||
{0, CS12_SW4, CS11_SW4, CS10_SW4}, /* RGB47-C -*/ |
||||
{0, CS15_SW4, CS14_SW4, CS13_SW4}, /* RGB48-V -*/ |
||||
{0, CS18_SW4, CS17_SW4, CS16_SW4}, /* RGB49-B -*/ |
||||
{0, CS21_SW4, CS20_SW4, CS19_SW4}, /* RGB50-N -*/ |
||||
{0, CS24_SW4, CS23_SW4, CS22_SW4}, /* RGB51-M -*/ |
||||
{0, CS27_SW4, CS26_SW4, CS25_SW4}, /* RGB52-,< -*/ |
||||
{0, CS30_SW4, CS29_SW4, CS28_SW4}, /* RGB53->. -*/ |
||||
{0, CS33_SW4, CS32_SW4, CS31_SW4}, /* RGB54-? -*/ |
||||
{0, CS36_SW4, CS35_SW4, CS34_SW4}, /* RGB55-RSF -*/ |
||||
{0, CS39_SW4, CS38_SW4, CS37_SW4}, /* RGB56-UP -*/ |
||||
{0, CS36_SW7, CS35_SW7, CS34_SW7}, /* RGB57--MO-- */ |
||||
{0, CS3_SW5, CS2_SW5, CS1_SW5}, /* RGB58-lct-- row4*/ |
||||
{0, CS6_SW5, CS5_SW5, CS4_SW5}, /* RGB59-lwin- */ |
||||
{0, CS9_SW5, CS8_SW5, CS7_SW5}, /* RGB60-lalt- */ |
||||
{0, CS18_SW5, CS17_SW5, CS16_SW5}, /* RGB61-sp- */ |
||||
{0, CS30_SW5, CS29_SW5, CS28_SW5}, /* RGB62-ralt- */ |
||||
{0, CS33_SW5, CS32_SW5, CS31_SW5}, /* RGB63-rct- */ |
||||
{0, CS36_SW5, CS35_SW5, CS34_SW5}, /* RGB64-left- */ |
||||
{0, CS39_SW5, CS38_SW5, CS37_SW5}, /* RGB65-dn- */ |
||||
{0, CS39_SW7, CS38_SW7, CS37_SW7}, /* RGB66-right- */ |
||||
}; |
||||
|
||||
led_config_t g_led_config = { { |
||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }, |
||||
{ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }, |
||||
{ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, NO_LED, 43 }, |
||||
{ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, NO_LED, 56, 57 }, |
||||
{ 58, 59, 60, NO_LED, NO_LED, 61, NO_LED, NO_LED, NO_LED, 62, 63, 64, NO_LED, 65, 66 } |
||||
}, { |
||||
{ 0, 0 }, { 16, 0 }, { 32, 0 }, { 48, 0 }, { 64, 0 }, { 80, 0 }, { 96, 0 }, { 112, 0 }, { 128, 0 }, { 144, 0 }, { 160, 0 }, { 176, 0 }, { 192, 0 }, { 208, 0 }, { 224, 0 }, |
||||
{ 2, 16 }, { 18, 16 }, { 34, 16 }, { 50, 16 }, { 66, 16 }, { 82, 16 }, { 98, 16 }, { 114, 16 }, { 130, 16 }, { 146, 16 }, { 162, 16 }, { 178, 16 }, { 194, 16 }, { 210, 16 }, { 224, 16 }, |
||||
{ 4, 32 }, { 20, 32 }, { 36, 32 }, { 52, 32 }, { 68, 32 }, { 84, 32 }, { 100, 32 }, { 116, 32 }, { 132, 32 }, { 148, 32 }, { 164, 32 }, { 180, 32 }, { 196, 32 }, { 224, 32 }, |
||||
{ 8, 48 }, { 24, 48 }, { 40, 48 }, { 56, 48 }, { 72, 48 }, { 88, 48 }, { 104, 48 }, { 120, 48 }, { 136, 48 }, { 152, 48 }, { 168, 48 }, { 184, 48 }, { 208, 48 }, { 224, 48 }, |
||||
{ 2, 64 }, { 18, 64 }, { 34, 64 }, { 82, 64 }, { 146, 64 }, { 162, 64 }, { 178, 64 }, { 210, 64 }, { 224, 64 } |
||||
}, { |
||||
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, |
||||
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, |
||||
0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, |
||||
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, |
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, |
||||
} |
||||
}; |
||||
|
||||
|
||||
#endif |
||||
|
||||
__attribute__ ((weak)) |
||||
void rgb_matrix_indicators_user(void) |
||||
{ |
||||
if (host_keyboard_led_state().caps_lock) |
||||
{ |
||||
rgb_matrix_set_color(31, 255, 255, 255); |
||||
} else { |
||||
rgb_matrix_set_color(31, 0, 0, 0); |
||||
} |
||||
} |
||||
|
||||
enum encoder_modes{ |
||||
ENCODER_MODE_ONE = 0, |
||||
ENCODER_MODE_TWO, |
||||
ENCODER_MODE_THREE, |
||||
}; |
||||
|
||||
keyboard_config_t keyboard_config; |
||||
rgblight_config_t rgblight_config; |
||||
|
||||
uint8_t pre_hue, pre_sat, pre_val;
|
||||
uint8_t previous_rgb_mode = 0;
|
||||
uint8_t dir_hue, dir_sat; |
||||
|
||||
bool encoder_in = false;
|
||||
uint32_t encoder_timer;
|
||||
|
||||
bool encoder_ani_start= false;
|
||||
uint32_t encoder_ani_timer = 0;
|
||||
|
||||
bool encoder_direction_start = false; |
||||
uint32_t encoder_direction_timer = 0; |
||||
|
||||
|
||||
bool lizm_restart_snake = false; |
||||
void rgblight_snake_restart(uint8_t hue, uint8_t sat, uint8_t val){ |
||||
lizm_restart_snake = true; // restart signal to local each effect
|
||||
rgblight_config.hue = hue; |
||||
rgblight_config.sat = sat; |
||||
rgblight_config.val = val; |
||||
} |
||||
|
||||
|
||||
void keyboard_post_init_kb(void){ |
||||
keyboard_config.raw = eeconfig_read_kb(); |
||||
if( keyboard_config.encoder_mode_index > ENCODER_MODE_THREE ){ |
||||
keyboard_config.encoder_mode_index = ENCODER_MODE_ONE; |
||||
eeconfig_update_kb(keyboard_config.raw); |
||||
} |
||||
} |
||||
|
||||
void switch_encoder_mode(uint8_t mode){ |
||||
switch(mode){ |
||||
case ENCODER_MODE_ONE: |
||||
dir_hue = 88; |
||||
dir_sat = 255; |
||||
break; |
||||
|
||||
case ENCODER_MODE_TWO: |
||||
dir_hue = 0; |
||||
dir_sat = 240; |
||||
break; |
||||
|
||||
case ENCODER_MODE_THREE: |
||||
dir_hue = 176; |
||||
dir_sat = 255; |
||||
break; |
||||
} |
||||
rgblight_sethsv_noeeprom(dir_hue,dir_sat,pre_val);
|
||||
} |
||||
|
||||
|
||||
void init_encoder_mode(uint8_t mode){ |
||||
previous_rgb_mode = rgblight_get_mode(); |
||||
pre_hue = rgblight_get_hue(); |
||||
pre_sat = rgblight_get_sat(); |
||||
pre_val = rgblight_get_val(); |
||||
encoder_in = true; |
||||
|
||||
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
|
||||
|
||||
switch_encoder_mode(mode); |
||||
} |
||||
|
||||
|
||||
void set_encoder_mode(uint8_t mode){ |
||||
if(encoder_in == false){ |
||||
init_encoder_mode(mode); |
||||
}else{ |
||||
switch_encoder_mode(mode); |
||||
} |
||||
eeconfig_update_kb(keyboard_config.raw); |
||||
encoder_timer = timer_read32(); |
||||
} |
||||
|
||||
bool process_record_kb(uint16_t keycode, keyrecord_t *record) { |
||||
if (record->event.pressed) { |
||||
switch(keycode) { |
||||
case RGB_MOD: |
||||
case RGB_RMOD: |
||||
case RGB_HUI: |
||||
case RGB_HUD: |
||||
case RGB_SAI: |
||||
case RGB_SAD: |
||||
case RGB_VAI: |
||||
case RGB_VAD: |
||||
|
||||
if(encoder_in){
|
||||
return false; |
||||
}
|
||||
break; |
||||
|
||||
case KC_F13: |
||||
rgb_matrix_toggle();
|
||||
break; |
||||
|
||||
case KC_F14: |
||||
rgb_matrix_step();
|
||||
break; |
||||
|
||||
case KC_F15:
|
||||
rgb_matrix_step_reverse();
|
||||
break; |
||||
|
||||
case KC_F16: |
||||
rgb_matrix_increase_hue(); //Increase the hue for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F17: |
||||
rgb_matrix_decrease_hue(); //Decrease the hue for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F18: |
||||
rgb_matrix_increase_sat(); //Increase the saturation for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F19: |
||||
rgb_matrix_decrease_sat(); //Decrease the saturation for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F20: |
||||
rgb_matrix_increase_val(); //Increase the value for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F21: |
||||
rgb_matrix_decrease_val();//Decrease the value for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F22: //change encoder mode upward
|
||||
|
||||
if(!encoder_direction_start){ |
||||
if(keyboard_config.encoder_mode_index < ENCODER_MODE_THREE){
|
||||
keyboard_config.encoder_mode_index++; |
||||
} |
||||
else{ |
||||
keyboard_config.encoder_mode_index = ENCODER_MODE_ONE; |
||||
} |
||||
set_encoder_mode(keyboard_config.encoder_mode_index); |
||||
} |
||||
return false; |
||||
|
||||
case KC_F23: |
||||
if(!encoder_direction_start){ |
||||
if(keyboard_config.encoder_mode_index > ENCODER_MODE_ONE){ |
||||
keyboard_config.encoder_mode_index--; |
||||
} |
||||
else{ |
||||
keyboard_config.encoder_mode_index = ENCODER_MODE_THREE; |
||||
}
|
||||
set_encoder_mode(keyboard_config.encoder_mode_index); |
||||
} |
||||
return false; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
return process_record_user(keycode, record); |
||||
} |
||||
|
||||
|
||||
void matrix_scan_kb(void) { |
||||
if(encoder_in){ |
||||
if(timer_elapsed32(encoder_timer) > 5000){ |
||||
rgblight_mode(previous_rgb_mode); |
||||
rgblight_sethsv(pre_hue, pre_sat, pre_val);
|
||||
encoder_in = false; |
||||
} |
||||
} |
||||
|
||||
if(encoder_ani_start){ |
||||
if(timer_elapsed32(encoder_ani_timer) > VOLUME_ANIMATION_TIMER){ |
||||
encoder_ani_start = false; |
||||
rgblight_sethsv_noeeprom(0,0,0); |
||||
} |
||||
} |
||||
|
||||
if(encoder_direction_start){ |
||||
if(timer_elapsed32(encoder_direction_timer) > (VOLUME_ANIMATION_TIMER+1500)){ |
||||
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); |
||||
rgblight_sethsv_noeeprom(dir_hue, dir_sat, pre_val);
|
||||
encoder_direction_start = false; |
||||
} |
||||
} |
||||
matrix_scan_user(); |
||||
} |
||||
|
||||
|
||||
void set_volume_animation(bool increase){ |
||||
if(!encoder_ani_start){ |
||||
rgblight_snake_restart(dir_hue, dir_sat, pre_val);
|
||||
} |
||||
|
||||
if(increase){ |
||||
rgblight_mode_noeeprom(17);
|
||||
} else {
|
||||
rgblight_mode_noeeprom(18); |
||||
} |
||||
|
||||
encoder_ani_timer = timer_read32(); |
||||
encoder_direction_timer = encoder_ani_timer; |
||||
encoder_ani_start = true; |
||||
encoder_direction_start = true;
|
||||
} |
||||
|
||||
|
||||
bool encoder_update_kb(uint8_t index, bool clockwise) { |
||||
uint8_t layer_now = keyboard_config.encoder_mode_index +1; |
||||
uint16_t encoder_cw_keycode = keymap_key_to_keycode(layer_now, (keypos_t){.row=2, .col=1 }); |
||||
uint16_t encoder_ccw_keycode = keymap_key_to_keycode(layer_now, (keypos_t){.row=2, .col=2 }); |
||||
if (index == 0) { /* First encoder */ |
||||
if(encoder_in == false){ |
||||
init_encoder_mode(keyboard_config.encoder_mode_index); |
||||
} |
||||
|
||||
if (!clockwise) { |
||||
switch(encoder_cw_keycode) { |
||||
|
||||
case KC_F13: |
||||
rgb_matrix_toggle();
|
||||
break; |
||||
|
||||
case KC_F14: |
||||
rgb_matrix_step();
|
||||
break; |
||||
|
||||
case KC_F15:
|
||||
rgb_matrix_step_reverse();
|
||||
break; |
||||
|
||||
case KC_F16: |
||||
rgb_matrix_increase_hue(); //Increase the hue for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F17: |
||||
rgb_matrix_decrease_hue(); //Decrease the hue for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F18: |
||||
rgb_matrix_increase_sat(); //Increase the saturation for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F19: |
||||
rgb_matrix_decrease_sat(); //Decrease the saturation for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F20: |
||||
rgb_matrix_increase_val(); //Increase the value for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F21: |
||||
rgb_matrix_decrease_val();//Decrease the value for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_VOLU: |
||||
case KC_VOLD: |
||||
tap_code(encoder_cw_keycode); |
||||
break; |
||||
|
||||
default: |
||||
tap_code(encoder_cw_keycode); |
||||
break; |
||||
} |
||||
set_volume_animation(true); |
||||
} else { |
||||
switch(encoder_ccw_keycode) { |
||||
|
||||
case KC_F13: |
||||
rgb_matrix_toggle(); |
||||
break; |
||||
|
||||
case KC_F14: |
||||
rgb_matrix_step();
|
||||
break; |
||||
|
||||
case KC_F15:
|
||||
rgb_matrix_step_reverse();
|
||||
break; |
||||
|
||||
case KC_F16: |
||||
rgb_matrix_increase_hue(); //Increase the hue for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F17: |
||||
rgb_matrix_decrease_hue(); //Decrease the hue for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F18: |
||||
rgb_matrix_increase_sat(); //Increase the saturation for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F19: |
||||
rgb_matrix_decrease_sat(); //Decrease the saturation for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F20: |
||||
rgb_matrix_increase_val(); //Increase the value for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F21: |
||||
rgb_matrix_decrease_val();//Decrease the value for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_VOLU: |
||||
case KC_VOLD: |
||||
tap_code(encoder_ccw_keycode); |
||||
break; |
||||
|
||||
default: |
||||
tap_code(encoder_ccw_keycode); |
||||
break; |
||||
} |
||||
set_volume_animation(false); |
||||
} |
||||
encoder_timer = timer_read32(); |
||||
} |
||||
return true; |
||||
} |
@ -0,0 +1,46 @@ |
||||
/* Copyright 2021 kb-elmo<mail@elmo.space>
|
||||
* |
||||
* 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 |
||||
|
||||
#include "quantum.h" |
||||
|
||||
#define ____ KC_NO |
||||
|
||||
#define LAYOUT( \ |
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, \
|
||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \
|
||||
K400, K401, K402, K405, K409, K410, K411, K413, K414 \
|
||||
) { \
|
||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
|
||||
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, ____, K214 }, \
|
||||
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, ____, K313, K314 }, \
|
||||
{ K400, K401, K402, ____, ____, K405, ____, ____, ____, K409, K410, K411, ____, K413, K414 } \
|
||||
} |
||||
|
||||
typedef union { |
||||
uint32_t raw; |
||||
struct { |
||||
uint8_t encoder_mode_index :8; |
||||
}; |
||||
} keyboard_config_t; |
||||
|
||||
extern keyboard_config_t keyboard_config; |
||||
|
||||
#define VOLUME_ANIMATION_TIMER 580 |
@ -0,0 +1,80 @@ |
||||
{ |
||||
"keyboard_name": "voice65 hotswap", |
||||
"url": "https://www.popkeyboard.com/products/67968vn00mzx", |
||||
"maintainer": "kb-elmo", |
||||
"width": 16, |
||||
"height": 5, |
||||
"layouts": { |
||||
"LAYOUT": { |
||||
"layout": [ |
||||
{"x":0, "y":0}, |
||||
{"x":1, "y":0}, |
||||
{"x":2, "y":0}, |
||||
{"x":3, "y":0}, |
||||
{"x":4, "y":0}, |
||||
{"x":5, "y":0}, |
||||
{"x":6, "y":0}, |
||||
{"x":7, "y":0}, |
||||
{"x":8, "y":0}, |
||||
{"x":9, "y":0}, |
||||
{"x":10, "y":0}, |
||||
{"x":11, "y":0}, |
||||
{"x":12, "y":0}, |
||||
{"x":13, "y":0, "w":2}, |
||||
{"x":15, "y":0}, |
||||
{"x":0, "y":1, "w":1.5}, |
||||
{"x":1.5, "y":1}, |
||||
{"x":2.5, "y":1}, |
||||
{"x":3.5, "y":1}, |
||||
{"x":4.5, "y":1}, |
||||
{"x":5.5, "y":1}, |
||||
{"x":6.5, "y":1}, |
||||
{"x":7.5, "y":1}, |
||||
{"x":8.5, "y":1}, |
||||
{"x":9.5, "y":1}, |
||||
{"x":10.5, "y":1}, |
||||
{"x":11.5, "y":1}, |
||||
{"x":12.5, "y":1}, |
||||
{"x":13.5, "y":1, "w":1.5}, |
||||
{"x":15, "y":1}, |
||||
{"x":0, "y":2, "w":1.75}, |
||||
{"x":1.75, "y":2}, |
||||
{"x":2.75, "y":2}, |
||||
{"x":3.75, "y":2}, |
||||
{"x":4.75, "y":2}, |
||||
{"x":5.75, "y":2}, |
||||
{"x":6.75, "y":2}, |
||||
{"x":7.75, "y":2}, |
||||
{"x":8.75, "y":2}, |
||||
{"x":9.75, "y":2}, |
||||
{"x":10.75, "y":2}, |
||||
{"x":11.75, "y":2}, |
||||
{"x":12.75, "y":2, "w":2.25}, |
||||
{"x":15, "y":2}, |
||||
{"x":0, "y":3, "w":2.25}, |
||||
{"x":2.25, "y":3}, |
||||
{"x":3.25, "y":3}, |
||||
{"x":4.25, "y":3}, |
||||
{"x":5.25, "y":3}, |
||||
{"x":6.25, "y":3}, |
||||
{"x":7.25, "y":3}, |
||||
{"x":8.25, "y":3}, |
||||
{"x":9.25, "y":3}, |
||||
{"x":10.25, "y":3}, |
||||
{"x":11.25, "y":3}, |
||||
{"x":12.25, "y":3, "w":1.75}, |
||||
{"x":14, "y":3}, |
||||
{"x":15, "y":3}, |
||||
{"x":0, "y":4, "w":1.25}, |
||||
{"x":1.25, "y":4, "w":1.25}, |
||||
{"x":2.5, "y":4, "w":1.25}, |
||||
{"x":3.75, "y":4, "w":6.25}, |
||||
{"x":10, "y":4, "w":1.25}, |
||||
{"x":11.25, "y":4, "w":1.25}, |
||||
{"x":13, "y":4}, |
||||
{"x":14, "y":4}, |
||||
{"x":15, "y":4} |
||||
] |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,36 @@ |
||||
/* Copyright 2021 kb-elmo<mail@elmo.space>
|
||||
* |
||||
* 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 |
||||
|
||||
// How long (in ms) to wait between animation steps for the snake mode
|
||||
const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 35, 20};
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
[0] = LAYOUT( |
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), |
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT |
||||
), |
||||
[1] = LAYOUT( |
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RESET, |
||||
KC_TRNS, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_HOME, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END,
|
||||
KC_TRNS, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_TRNS, KC_TRNS, KC_F22, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F23, KC_TRNS |
||||
) |
||||
}; |
@ -0,0 +1,51 @@ |
||||
/* Copyright 2021 kb-elmo<mail@elmo.space>
|
||||
* |
||||
* 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 |
||||
|
||||
// How long (in ms) to wait between animation steps for the snake mode
|
||||
const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 35, 20};
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
[0] = LAYOUT( |
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), |
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT |
||||
), |
||||
[1] = LAYOUT( |
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RESET, |
||||
KC_TRNS, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_HOME, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END,
|
||||
KC_TRNS, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_TRNS, KC_TRNS, KC_F22, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F23, KC_TRNS |
||||
), |
||||
[2] = LAYOUT( |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS |
||||
), |
||||
[3] = LAYOUT( |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS |
||||
) |
||||
}; |
||||
|
@ -0,0 +1,2 @@ |
||||
VIA_ENABLE = yes
|
||||
LTO_ENABLE = yes
|
@ -0,0 +1,22 @@ |
||||
/* Copyright 2021 kb-elmo<mail@elmo.space>
|
||||
* |
||||
* 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 |
||||
|
||||
#include_next <mcuconf.h> |
||||
|
||||
#undef STM32_I2C_USE_I2C1 |
||||
#define STM32_I2C_USE_I2C1 TRUE |
@ -0,0 +1,21 @@ |
||||
# Voice65 - hotswap PCB |
||||
|
||||
 |
||||
|
||||
A 65% with an LED strip and a scroll wheel |
||||
|
||||
* Keyboard Maintainer: [kb-elmo](https://github.com/kb-elmo) |
||||
* Hardware Supported: Voice65 hotswap PCB |
||||
* Hardware Availability: Ended groupbuy: https://www.popkeyboard.com/products/67968vn00mzx |
||||
|
||||
Make example for this keyboard (after setting up your build environment): |
||||
|
||||
make owlab/voice65/hotswap:default |
||||
|
||||
Flashing example for this keyboard: |
||||
|
||||
make owlab/voice65/hotswap:default:flash |
||||
|
||||
**Bootloader:** Press the physical reset button on the bottom side of the PCB (labeled SW1) or hold down ESC while plugging in the board. |
||||
|
||||
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). |
@ -0,0 +1,26 @@ |
||||
# MCU name
|
||||
MCU = STM32F303
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = stm32-dfu
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
ENCODER_ENABLE = yes # Rotary encoder
|
||||
|
||||
RGB_MATRIX_ENABLE = yes
|
||||
RGB_MATRIX_DRIVER = IS31FL3741
|
@ -0,0 +1,89 @@ |
||||
/*
|
||||
Copyright 2021 kb-elmo<mail@elmo.space> |
||||
|
||||
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 |
||||
|
||||
#include "config_common.h" |
||||
|
||||
/* USB Device descriptor parameter */ |
||||
#define VENDOR_ID 0x4F53 |
||||
#define PRODUCT_ID 0x5657 |
||||
#define DEVICE_VER 0x0001 |
||||
#define MANUFACTURER Owl Studio |
||||
#define PRODUCT Voice65 |
||||
|
||||
/* key matrix size */ |
||||
#define MATRIX_ROWS 5 |
||||
#define MATRIX_COLS 15 |
||||
|
||||
/* Keyboard Matrix Assignments */ |
||||
#define MATRIX_ROW_PINS { B0, B1, B2, B10, B11 } |
||||
#define MATRIX_COL_PINS { A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A15, B8, B9, B12, B13 } |
||||
|
||||
/* COL2ROW, ROW2COL */ |
||||
#define DIODE_DIRECTION COL2ROW |
||||
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ |
||||
#define DEBOUNCE 5 |
||||
/* NKRO */ |
||||
#ifdef NKRO_ENABLE |
||||
# define FORCE_NKRO |
||||
#endif |
||||
|
||||
/* RGB stripe */ |
||||
#define RGB_DI_PIN B15 |
||||
#ifdef RGB_DI_PIN |
||||
# define RGBLIGHT_EFFECT_ALTERNATING |
||||
# define RGBLIGHT_EFFECT_BREATHING |
||||
# define RGBLIGHT_EFFECT_CHRISTMAS |
||||
# define RGBLIGHT_EFFECT_KNIGHT |
||||
# define RGBLIGHT_EFFECT_RAINBOW_MOOD |
||||
# define RGBLIGHT_EFFECT_RAINBOW_SWIRL |
||||
# define RGBLIGHT_EFFECT_SNAKE |
||||
# define RGBLIGHT_EFFECT_STATIC_GRADIENT |
||||
# define RGBLIGHT_EFFECT_TWINKLE |
||||
# define RGBLED_NUM 20 |
||||
# define RGBLIGHT_HUE_STEP 8 |
||||
# define RGBLIGHT_SAT_STEP 8 |
||||
# define RGBLIGHT_VAL_STEP 10 |
||||
# define RGBLIGHT_LIMIT_VAL 180 |
||||
# define OWL_VOLUME_RANGE 50 |
||||
#endif |
||||
|
||||
/* RGB matrix*/ |
||||
#ifdef RGB_MATRIX_ENABLE |
||||
# define USE_I2CV2 |
||||
# define RGB_MATRIX_DISABLE_KEYCODES |
||||
# define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
|
||||
# define RGB_DISABLE_WHEN_USB_SUSPENDED true // turn off effects when suspended
|
||||
# define RGB_MATRIX_KEYPRESSES |
||||
# define RGB_MATRIX_LED_PROCESS_LIMIT 4 |
||||
# define RGB_MATRIX_LED_FLUSH_LIMIT 26 |
||||
# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 |
||||
# define RGB_MATRIX_STARTUP_VAL 128 |
||||
# define DRIVER_ADDR_1 0b0110000 |
||||
# define DRIVER_ADDR_2 0b0110000 |
||||
# define DRIVER_COUNT 2 |
||||
# define DRIVER_1_LED_TOTAL 71 |
||||
# define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL |
||||
#endif |
||||
|
||||
/* Encoder */ |
||||
#define ENCODERS_PAD_A { B4 } |
||||
#define ENCODERS_PAD_B { B5 } |
||||
#define ENCODER_RESOLUTION 4 |
||||
#define TAP_CODE_DELAY 10 |
@ -0,0 +1,21 @@ |
||||
/* Copyright 2021 kb-elmo<mail@elmo.space>
|
||||
* |
||||
* 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 HAL_USE_I2C TRUE |
||||
|
||||
#include_next <halconf.h> |
@ -0,0 +1,442 @@ |
||||
{ |
||||
"keyboard_name": "voice65 soldered", |
||||
"url": "https://www.popkeyboard.com/products/67968vn00mzx", |
||||
"maintainer": "kb-elmo", |
||||
"width": 16, |
||||
"height": 5, |
||||
"layouts": { |
||||
"LAYOUT_all": { |
||||
"layout": [ |
||||
{"x":0, "y":0}, |
||||
{"x":1, "y":0}, |
||||
{"x":2, "y":0}, |
||||
{"x":3, "y":0}, |
||||
{"x":4, "y":0}, |
||||
{"x":5, "y":0}, |
||||
{"x":6, "y":0}, |
||||
{"x":7, "y":0}, |
||||
{"x":8, "y":0}, |
||||
{"x":9, "y":0}, |
||||
{"x":10, "y":0}, |
||||
{"x":11, "y":0}, |
||||
{"x":12, "y":0}, |
||||
{"x":13, "y":0}, |
||||
{"x":14, "y":0}, |
||||
{"x":15, "y":0}, |
||||
{"x":0, "y":1, "w":1.5}, |
||||
{"x":1.5, "y":1}, |
||||
{"x":2.5, "y":1}, |
||||
{"x":3.5, "y":1}, |
||||
{"x":4.5, "y":1}, |
||||
{"x":5.5, "y":1}, |
||||
{"x":6.5, "y":1}, |
||||
{"x":7.5, "y":1}, |
||||
{"x":8.5, "y":1}, |
||||
{"x":9.5, "y":1}, |
||||
{"x":10.5, "y":1}, |
||||
{"x":11.5, "y":1}, |
||||
{"x":12.5, "y":1}, |
||||
{"x":13.5, "y":1, "w":1.5}, |
||||
{"x":15, "y":1}, |
||||
{"x":0, "y":2, "w":1.75}, |
||||
{"x":1.75, "y":2}, |
||||
{"x":2.75, "y":2}, |
||||
{"x":3.75, "y":2}, |
||||
{"x":4.75, "y":2}, |
||||
{"x":5.75, "y":2}, |
||||
{"x":6.75, "y":2}, |
||||
{"x":7.75, "y":2}, |
||||
{"x":8.75, "y":2}, |
||||
{"x":9.75, "y":2}, |
||||
{"x":10.75, "y":2}, |
||||
{"x":11.75, "y":2}, |
||||
{"x":12.75, "y":2, "w":2.25}, |
||||
{"x":15, "y":2}, |
||||
{"x":0, "y":3, "w":1.25}, |
||||
{"x":1.25, "y":3}, |
||||
{"x":2.25, "y":3}, |
||||
{"x":3.25, "y":3}, |
||||
{"x":4.25, "y":3}, |
||||
{"x":5.25, "y":3}, |
||||
{"x":6.25, "y":3}, |
||||
{"x":7.25, "y":3}, |
||||
{"x":8.25, "y":3}, |
||||
{"x":9.25, "y":3}, |
||||
{"x":10.25, "y":3}, |
||||
{"x":11.25, "y":3}, |
||||
{"x":12.25, "y":3, "w":1.75}, |
||||
{"x":14, "y":3}, |
||||
{"x":15, "y":3}, |
||||
{"x":0, "y":4, "w":1.25}, |
||||
{"x":1.25, "y":4, "w":1.25}, |
||||
{"x":2.5, "y":4, "w":1.25}, |
||||
{"x":3.75, "y":4, "w":2.25}, |
||||
{"x":6, "y":4, "w":1.25}, |
||||
{"x":7.25, "y":4, "w":2.75}, |
||||
{"x":10, "y":4, "w":1.25}, |
||||
{"x":11.25, "y":4, "w":1.25}, |
||||
{"x":13, "y":4}, |
||||
{"x":14, "y":4}, |
||||
{"x":15, "y":4} |
||||
] |
||||
}, |
||||
"LAYOUT_65_ansi_blocker": { |
||||
"layout": [ |
||||
{"x":0, "y":0}, |
||||
{"x":1, "y":0}, |
||||
{"x":2, "y":0}, |
||||
{"x":3, "y":0}, |
||||
{"x":4, "y":0}, |
||||
{"x":5, "y":0}, |
||||
{"x":6, "y":0}, |
||||
{"x":7, "y":0}, |
||||
{"x":8, "y":0}, |
||||
{"x":9, "y":0}, |
||||
{"x":10, "y":0}, |
||||
{"x":11, "y":0}, |
||||
{"x":12, "y":0}, |
||||
{"x":13, "y":0, "w":2}, |
||||
{"x":15, "y":0}, |
||||
{"x":0, "y":1, "w":1.5}, |
||||
{"x":1.5, "y":1}, |
||||
{"x":2.5, "y":1}, |
||||
{"x":3.5, "y":1}, |
||||
{"x":4.5, "y":1}, |
||||
{"x":5.5, "y":1}, |
||||
{"x":6.5, "y":1}, |
||||
{"x":7.5, "y":1}, |
||||
{"x":8.5, "y":1}, |
||||
{"x":9.5, "y":1}, |
||||
{"x":10.5, "y":1}, |
||||
{"x":11.5, "y":1}, |
||||
{"x":12.5, "y":1}, |
||||
{"x":13.5, "y":1, "w":1.5}, |
||||
{"x":15, "y":1}, |
||||
{"x":0, "y":2, "w":1.75}, |
||||
{"x":1.75, "y":2}, |
||||
{"x":2.75, "y":2}, |
||||
{"x":3.75, "y":2}, |
||||
{"x":4.75, "y":2}, |
||||
{"x":5.75, "y":2}, |
||||
{"x":6.75, "y":2}, |
||||
{"x":7.75, "y":2}, |
||||
{"x":8.75, "y":2}, |
||||
{"x":9.75, "y":2}, |
||||
{"x":10.75, "y":2}, |
||||
{"x":11.75, "y":2}, |
||||
{"x":12.75, "y":2, "w":2.25}, |
||||
{"x":15, "y":2}, |
||||
{"x":0, "y":3, "w":2.25}, |
||||
{"x":2.25, "y":3}, |
||||
{"x":3.25, "y":3}, |
||||
{"x":4.25, "y":3}, |
||||
{"x":5.25, "y":3}, |
||||
{"x":6.25, "y":3}, |
||||
{"x":7.25, "y":3}, |
||||
{"x":8.25, "y":3}, |
||||
{"x":9.25, "y":3}, |
||||
{"x":10.25, "y":3}, |
||||
{"x":11.25, "y":3}, |
||||
{"x":12.25, "y":3, "w":1.75}, |
||||
{"x":14, "y":3}, |
||||
{"x":15, "y":3}, |
||||
{"x":0, "y":4, "w":1.25}, |
||||
{"x":1.25, "y":4, "w":1.25}, |
||||
{"x":2.5, "y":4, "w":1.25}, |
||||
{"x":3.75, "y":4, "w":6.25}, |
||||
{"x":10, "y":4, "w":1.25}, |
||||
{"x":11.25, "y":4, "w":1.25}, |
||||
{"x":13, "y":4}, |
||||
{"x":14, "y":4}, |
||||
{"x":15, "y":4} |
||||
] |
||||
}, |
||||
"LAYOUT_65_ansi_blocker_split_bs": { |
||||
"layout": [ |
||||
{"x":0, "y":0}, |
||||
{"x":1, "y":0}, |
||||
{"x":2, "y":0}, |
||||
{"x":3, "y":0}, |
||||
{"x":4, "y":0}, |
||||
{"x":5, "y":0}, |
||||
{"x":6, "y":0}, |
||||
{"x":7, "y":0}, |
||||
{"x":8, "y":0}, |
||||
{"x":9, "y":0}, |
||||
{"x":10, "y":0}, |
||||
{"x":11, "y":0}, |
||||
{"x":12, "y":0}, |
||||
{"x":13, "y":0}, |
||||
{"x":14, "y":0}, |
||||
{"x":15, "y":0}, |
||||
{"x":0, "y":1, "w":1.5}, |
||||
{"x":1.5, "y":1}, |
||||
{"x":2.5, "y":1}, |
||||
{"x":3.5, "y":1}, |
||||
{"x":4.5, "y":1}, |
||||
{"x":5.5, "y":1}, |
||||
{"x":6.5, "y":1}, |
||||
{"x":7.5, "y":1}, |
||||
{"x":8.5, "y":1}, |
||||
{"x":9.5, "y":1}, |
||||
{"x":10.5, "y":1}, |
||||
{"x":11.5, "y":1}, |
||||
{"x":12.5, "y":1}, |
||||
{"x":13.5, "y":1, "w":1.5}, |
||||
{"x":15, "y":1}, |
||||
{"x":0, "y":2, "w":1.75}, |
||||
{"x":1.75, "y":2}, |
||||
{"x":2.75, "y":2}, |
||||
{"x":3.75, "y":2}, |
||||
{"x":4.75, "y":2}, |
||||
{"x":5.75, "y":2}, |
||||
{"x":6.75, "y":2}, |
||||
{"x":7.75, "y":2}, |
||||
{"x":8.75, "y":2}, |
||||
{"x":9.75, "y":2}, |
||||
{"x":10.75, "y":2}, |
||||
{"x":11.75, "y":2}, |
||||
{"x":12.75, "y":2, "w":2.25}, |
||||
{"x":15, "y":2}, |
||||
{"x":0, "y":3, "w":2.25}, |
||||
{"x":2.25, "y":3}, |
||||
{"x":3.25, "y":3}, |
||||
{"x":4.25, "y":3}, |
||||
{"x":5.25, "y":3}, |
||||
{"x":6.25, "y":3}, |
||||
{"x":7.25, "y":3}, |
||||
{"x":8.25, "y":3}, |
||||
{"x":9.25, "y":3}, |
||||
{"x":10.25, "y":3}, |
||||
{"x":11.25, "y":3}, |
||||
{"x":12.25, "y":3, "w":1.75}, |
||||
{"x":14, "y":3}, |
||||
{"x":15, "y":3}, |
||||
{"x":0, "y":4, "w":1.25}, |
||||
{"x":1.25, "y":4, "w":1.25}, |
||||
{"x":2.5, "y":4, "w":1.25}, |
||||
{"x":3.75, "y":4, "w":6.25}, |
||||
{"x":10, "y":4, "w":1.25}, |
||||
{"x":11.25, "y":4, "w":1.25}, |
||||
{"x":13, "y":4}, |
||||
{"x":14, "y":4}, |
||||
{"x":15, "y":4} |
||||
] |
||||
}, |
||||
"LAYOUT_65_ansi_blocker_tsangan": { |
||||
"layout": [ |
||||
{"x":0, "y":0}, |
||||
{"x":1, "y":0}, |
||||
{"x":2, "y":0}, |
||||
{"x":3, "y":0}, |
||||
{"x":4, "y":0}, |
||||
{"x":5, "y":0}, |
||||
{"x":6, "y":0}, |
||||
{"x":7, "y":0}, |
||||
{"x":8, "y":0}, |
||||
{"x":9, "y":0}, |
||||
{"x":10, "y":0}, |
||||
{"x":11, "y":0}, |
||||
{"x":12, "y":0}, |
||||
{"x":13, "y":0, "w":2}, |
||||
{"x":15, "y":0}, |
||||
{"x":0, "y":1, "w":1.5}, |
||||
{"x":1.5, "y":1}, |
||||
{"x":2.5, "y":1}, |
||||
{"x":3.5, "y":1}, |
||||
{"x":4.5, "y":1}, |
||||
{"x":5.5, "y":1}, |
||||
{"x":6.5, "y":1}, |
||||
{"x":7.5, "y":1}, |
||||
{"x":8.5, "y":1}, |
||||
{"x":9.5, "y":1}, |
||||
{"x":10.5, "y":1}, |
||||
{"x":11.5, "y":1}, |
||||
{"x":12.5, "y":1}, |
||||
{"x":13.5, "y":1, "w":1.5}, |
||||
{"x":15, "y":1}, |
||||
{"x":0, "y":2, "w":1.75}, |
||||
{"x":1.75, "y":2}, |
||||
{"x":2.75, "y":2}, |
||||
{"x":3.75, "y":2}, |
||||
{"x":4.75, "y":2}, |
||||
{"x":5.75, "y":2}, |
||||
{"x":6.75, "y":2}, |
||||
{"x":7.75, "y":2}, |
||||
{"x":8.75, "y":2}, |
||||
{"x":9.75, "y":2}, |
||||
{"x":10.75, "y":2}, |
||||
{"x":11.75, "y":2}, |
||||
{"x":12.75, "y":2, "w":2.25}, |
||||
{"x":15, "y":2}, |
||||
{"x":0, "y":3, "w":2.25}, |
||||
{"x":2.25, "y":3}, |
||||
{"x":3.25, "y":3}, |
||||
{"x":4.25, "y":3}, |
||||
{"x":5.25, "y":3}, |
||||
{"x":6.25, "y":3}, |
||||
{"x":7.25, "y":3}, |
||||
{"x":8.25, "y":3}, |
||||
{"x":9.25, "y":3}, |
||||
{"x":10.25, "y":3}, |
||||
{"x":11.25, "y":3}, |
||||
{"x":12.25, "y":3, "w":1.75}, |
||||
{"x":14, "y":3}, |
||||
{"x":15, "y":3}, |
||||
{"x":0, "y":4, "w":1.5}, |
||||
{"x":1.5, "y":4}, |
||||
{"x":2.5, "y":4, "w":1.5}, |
||||
{"x":4, "y":4, "w":7}, |
||||
{"x":11, "y":4, "w":1.5}, |
||||
{"x":13, "y":4}, |
||||
{"x":14, "y":4}, |
||||
{"x":15, "y":4} |
||||
] |
||||
}, |
||||
"LAYOUT_65_iso_blocker": { |
||||
"layout": [ |
||||
{"x":0, "y":0}, |
||||
{"x":1, "y":0}, |
||||
{"x":2, "y":0}, |
||||
{"x":3, "y":0}, |
||||
{"x":4, "y":0}, |
||||
{"x":5, "y":0}, |
||||
{"x":6, "y":0}, |
||||
{"x":7, "y":0}, |
||||
{"x":8, "y":0}, |
||||
{"x":9, "y":0}, |
||||
{"x":10, "y":0}, |
||||
{"x":11, "y":0}, |
||||
{"x":12, "y":0}, |
||||
{"x":13, "y":0, "w":2}, |
||||
{"x":15, "y":0}, |
||||
{"x":0, "y":1, "w":1.5}, |
||||
{"x":1.5, "y":1}, |
||||
{"x":2.5, "y":1}, |
||||
{"x":3.5, "y":1}, |
||||
{"x":4.5, "y":1}, |
||||
{"x":5.5, "y":1}, |
||||
{"x":6.5, "y":1}, |
||||
{"x":7.5, "y":1}, |
||||
{"x":8.5, "y":1}, |
||||
{"x":9.5, "y":1}, |
||||
{"x":10.5, "y":1}, |
||||
{"x":11.5, "y":1}, |
||||
{"x":12.5, "y":1}, |
||||
{"x":15, "y":1}, |
||||
{"x":0, "y":2, "w":1.75}, |
||||
{"x":1.75, "y":2}, |
||||
{"x":2.75, "y":2}, |
||||
{"x":3.75, "y":2}, |
||||
{"x":4.75, "y":2}, |
||||
{"x":5.75, "y":2}, |
||||
{"x":6.75, "y":2}, |
||||
{"x":7.75, "y":2}, |
||||
{"x":8.75, "y":2}, |
||||
{"x":9.75, "y":2}, |
||||
{"x":10.75, "y":2}, |
||||
{"x":11.75, "y":2}, |
||||
{"x":12.75, "y":2}, |
||||
{"x":13.75, "y":1, "w":1.25, "h":2}, |
||||
{"x":15, "y":2}, |
||||
{"x":0, "y":3, "w":1.25}, |
||||
{"x":1.25, "y":3}, |
||||
{"x":2.25, "y":3}, |
||||
{"x":3.25, "y":3}, |
||||
{"x":4.25, "y":3}, |
||||
{"x":5.25, "y":3}, |
||||
{"x":6.25, "y":3}, |
||||
{"x":7.25, "y":3}, |
||||
{"x":8.25, "y":3}, |
||||
{"x":9.25, "y":3}, |
||||
{"x":10.25, "y":3}, |
||||
{"x":11.25, "y":3}, |
||||
{"x":12.25, "y":3, "w":1.75}, |
||||
{"x":14, "y":3}, |
||||
{"x":15, "y":3}, |
||||
{"x":0, "y":4, "w":1.25}, |
||||
{"x":1.25, "y":4, "w":1.25}, |
||||
{"x":2.5, "y":4, "w":1.25}, |
||||
{"x":3.75, "y":4, "w":6.25}, |
||||
{"x":10, "y":4, "w":1.25}, |
||||
{"x":11.25, "y":4, "w":1.25}, |
||||
{"x":13, "y":4}, |
||||
{"x":14, "y":4}, |
||||
{"x":15, "y":4} |
||||
] |
||||
}, |
||||
"LAYOUT_65_iso_blocker_split_bs": { |
||||
"layout": [ |
||||
{"x":0, "y":0}, |
||||
{"x":1, "y":0}, |
||||
{"x":2, "y":0}, |
||||
{"x":3, "y":0}, |
||||
{"x":4, "y":0}, |
||||
{"x":5, "y":0}, |
||||
{"x":6, "y":0}, |
||||
{"x":7, "y":0}, |
||||
{"x":8, "y":0}, |
||||
{"x":9, "y":0}, |
||||
{"x":10, "y":0}, |
||||
{"x":11, "y":0}, |
||||
{"x":12, "y":0}, |
||||
{"x":13, "y":0}, |
||||
{"x":14, "y":0}, |
||||
{"x":15, "y":0}, |
||||
{"x":0, "y":1, "w":1.5}, |
||||
{"x":1.5, "y":1}, |
||||
{"x":2.5, "y":1}, |
||||
{"x":3.5, "y":1}, |
||||
{"x":4.5, "y":1}, |
||||
{"x":5.5, "y":1}, |
||||
{"x":6.5, "y":1}, |
||||
{"x":7.5, "y":1}, |
||||
{"x":8.5, "y":1}, |
||||
{"x":9.5, "y":1}, |
||||
{"x":10.5, "y":1}, |
||||
{"x":11.5, "y":1}, |
||||
{"x":12.5, "y":1}, |
||||
{"x":15, "y":1}, |
||||
{"x":0, "y":2, "w":1.75}, |
||||
{"x":1.75, "y":2}, |
||||
{"x":2.75, "y":2}, |
||||
{"x":3.75, "y":2}, |
||||
{"x":4.75, "y":2}, |
||||
{"x":5.75, "y":2}, |
||||
{"x":6.75, "y":2}, |
||||
{"x":7.75, "y":2}, |
||||
{"x":8.75, "y":2}, |
||||
{"x":9.75, "y":2}, |
||||
{"x":10.75, "y":2}, |
||||
{"x":11.75, "y":2}, |
||||
{"x":12.75, "y":2}, |
||||
{"x":13.75, "y":1, "w":1.25, "h":2}, |
||||
{"x":15, "y":2}, |
||||
{"x":0, "y":3, "w":1.25}, |
||||
{"x":1.25, "y":3}, |
||||
{"x":2.25, "y":3}, |
||||
{"x":3.25, "y":3}, |
||||
{"x":4.25, "y":3}, |
||||
{"x":5.25, "y":3}, |
||||
{"x":6.25, "y":3}, |
||||
{"x":7.25, "y":3}, |
||||
{"x":8.25, "y":3}, |
||||
{"x":9.25, "y":3}, |
||||
{"x":10.25, "y":3}, |
||||
{"x":11.25, "y":3}, |
||||
{"x":12.25, "y":3, "w":1.75}, |
||||
{"x":14, "y":3}, |
||||
{"x":15, "y":3}, |
||||
{"x":0, "y":4, "w":1.25}, |
||||
{"x":1.25, "y":4, "w":1.25}, |
||||
{"x":2.5, "y":4, "w":1.25}, |
||||
{"x":3.75, "y":4, "w":6.25}, |
||||
{"x":10, "y":4, "w":1.25}, |
||||
{"x":11.25, "y":4, "w":1.25}, |
||||
{"x":13, "y":4}, |
||||
{"x":14, "y":4}, |
||||
{"x":15, "y":4} |
||||
] |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,36 @@ |
||||
/* Copyright 2021 kb-elmo<mail@elmo.space>
|
||||
* |
||||
* 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 |
||||
|
||||
// How long (in ms) to wait between animation steps for the snake mode
|
||||
const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 35, 20};
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
[0] = LAYOUT_65_ansi_blocker( |
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), |
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT |
||||
), |
||||
[1] = LAYOUT_65_ansi_blocker( |
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RESET, |
||||
KC_TRNS, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_HOME, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END,
|
||||
KC_TRNS, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_TRNS, KC_TRNS, KC_F22, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F23, KC_TRNS |
||||
) |
||||
}; |
@ -0,0 +1,50 @@ |
||||
/* Copyright 2021 kb-elmo<mail@elmo.space>
|
||||
* |
||||
* 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 |
||||
|
||||
// How long (in ms) to wait between animation steps for the snake mode
|
||||
const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 35, 20};
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
[0] = LAYOUT_all( |
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_DEL,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
|
||||
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), |
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT |
||||
), |
||||
[1] = LAYOUT_all( |
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, RESET, |
||||
KC_TRNS, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_HOME, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END,
|
||||
KC_TRNS, KC_TRNS, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_TRNS, KC_TRNS, KC_F22, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F23, KC_TRNS |
||||
), |
||||
[2] = LAYOUT_all( |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS |
||||
), |
||||
[3] = LAYOUT_all( |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, |
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS |
||||
) |
||||
}; |
@ -0,0 +1,2 @@ |
||||
VIA_ENABLE = yes
|
||||
LTO_ENABLE = yes
|
@ -0,0 +1,22 @@ |
||||
/* Copyright 2021 kb-elmo<mail@elmo.space>
|
||||
* |
||||
* 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 |
||||
|
||||
#include_next <mcuconf.h> |
||||
|
||||
#undef STM32_I2C_USE_I2C1 |
||||
#define STM32_I2C_USE_I2C1 TRUE |
@ -0,0 +1,21 @@ |
||||
# Voice65 - soldered PCB |
||||
|
||||
 |
||||
|
||||
A 65% with an LED strip and a scroll wheel |
||||
|
||||
* Keyboard Maintainer: [kb-elmo](https://github.com/kb-elmo) |
||||
* Hardware Supported: Voice65 soldered PCB |
||||
* Hardware Availability: Ended groupbuy: https://www.popkeyboard.com/products/67968vn00mzx |
||||
|
||||
Make example for this keyboard (after setting up your build environment): |
||||
|
||||
make owlab/voice65/soldered:default |
||||
|
||||
Flashing example for this keyboard: |
||||
|
||||
make owlab/voice65/soldered:default:flash |
||||
|
||||
**Bootloader:** Press the physical reset button on the bottom side of the PCB (labeled SW1) or hold down ESC while plugging in the board. |
||||
|
||||
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). |
@ -0,0 +1,28 @@ |
||||
# MCU name
|
||||
MCU = STM32F303
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = stm32-dfu
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
ENCODER_ENABLE = yes # Rotary encoder
|
||||
|
||||
RGB_MATRIX_ENABLE = yes
|
||||
RGB_MATRIX_DRIVER = IS31FL3741
|
||||
|
||||
LAYOUTS = 65_ansi_blocker 65_ansi_blocker_split_bs 65_ansi_blocker_tsangan 65_iso_blocker 65_iso_blocker_split_bs
|
@ -0,0 +1,455 @@ |
||||
/* Copyright 2021 kb-elmo<mail@elmo.space>
|
||||
* |
||||
* 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 "soldered.h" |
||||
|
||||
#ifdef RGB_MATRIX_ENABLE |
||||
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { |
||||
{0, CS3_SW1, CS2_SW1, CS1_SW1}, /* RGB0-ESC ROW0*/ |
||||
{0, CS6_SW1, CS5_SW1, CS4_SW1}, /* RGB1-1 */ |
||||
{0, CS9_SW1, CS8_SW1, CS7_SW1}, /* RGB2-2 */ |
||||
{0, CS12_SW1, CS11_SW1, CS10_SW1}, /* RGB3-3 */ |
||||
{0, CS15_SW1, CS14_SW1, CS13_SW1}, /* RGB4-4 */ |
||||
{0, CS18_SW1, CS17_SW1, CS16_SW1}, /* RGB5-5 */ |
||||
{0, CS21_SW1, CS20_SW1, CS19_SW1}, /* RGB6-6 */ |
||||
{0, CS24_SW1, CS23_SW1, CS22_SW1}, /* RGB7-7 */ |
||||
{0, CS27_SW1, CS26_SW1, CS25_SW1}, /* RGB8-8 */ |
||||
{0, CS30_SW1, CS29_SW1, CS28_SW1}, /* RGB9-9 */ |
||||
{0, CS33_SW1, CS32_SW1, CS31_SW1}, /* RGB10-0 */ |
||||
{0, CS36_SW1, CS35_SW1, CS34_SW1}, /* RGB11--- */ |
||||
{0, CS39_SW6, CS38_SW6, CS37_SW6}, /* RGB12-+= */ |
||||
{0, CS36_SW6, CS35_SW6, CS34_SW6}, /* RGB13-BS */ |
||||
{0, CS27_SW6, CS26_SW6, CS25_SW6}, /* RGB14-BACKSPACE SPLIT */ |
||||
{0, CS36_SW8, CS35_SW8, CS34_SW8}, /* RGB15-DEL */ |
||||
{0, CS3_SW2, CS2_SW2, CS1_SW2}, /* RGB16-TAB ----ROW1*/ |
||||
{0, CS6_SW2, CS5_SW2, CS4_SW2}, /* RGB17-Q */ |
||||
{0, CS9_SW2, CS8_SW2, CS7_SW2}, /* RGB18-W */ |
||||
{0, CS12_SW2, CS11_SW2, CS10_SW2}, /* RGB19-E */ |
||||
{0, CS15_SW2, CS14_SW2, CS13_SW2}, /* RGB20-R */ |
||||
{0, CS18_SW2, CS17_SW2, CS16_SW2}, /* RGB21-T */ |
||||
{0, CS21_SW2, CS20_SW2, CS19_SW2}, /* RGB22-Y */ |
||||
{0, CS24_SW2, CS23_SW2, CS22_SW2}, /* RGB23-U */ |
||||
{0, CS27_SW2, CS26_SW2, CS25_SW2}, /* RGB24-I */ |
||||
{0, CS30_SW2, CS29_SW2, CS28_SW2}, /* RGB25-O */ |
||||
{0, CS33_SW2, CS32_SW2, CS31_SW2}, /* RGB26-P */ |
||||
{0, CS36_SW2, CS35_SW2, CS34_SW2}, /* RGB27-[ */ |
||||
{0, CS39_SW7, CS38_SW7, CS37_SW7}, /* RGB28-] */ |
||||
{0, CS36_SW7, CS35_SW7, CS34_SW7}, /* RGB29-\ */ |
||||
{0, CS27_SW7, CS26_SW7, CS25_SW7}, /* RGB30-PGUP */ |
||||
{0, CS3_SW3, CS2_SW3, CS1_SW3}, /* RGB31-CAPS---ROW2*/ |
||||
{0, CS6_SW3, CS5_SW3, CS4_SW3}, /* RGB32-A-- */ |
||||
{0, CS9_SW3, CS8_SW3, CS7_SW3}, /* RGB33-S-- */ |
||||
{0, CS12_SW3, CS11_SW3, CS10_SW3}, /* RGB34-D-- */ |
||||
{0, CS15_SW3, CS14_SW3, CS13_SW3}, /* RGB35-F-- */ |
||||
{0, CS18_SW3, CS17_SW3, CS16_SW3}, /* RGB36-G-- */ |
||||
{0, CS21_SW3, CS20_SW3, CS19_SW3}, /* RGB37-H-- */ |
||||
{0, CS24_SW3, CS23_SW3, CS22_SW3}, /* RGB38-J-- */ |
||||
{0, CS27_SW3, CS26_SW3, CS25_SW3}, /* RGB39-K-- */ |
||||
{0, CS30_SW3, CS29_SW3, CS28_SW3}, /* RGB40-L-- */ |
||||
{0, CS33_SW3, CS32_SW3, CS31_SW3}, /* RGB41-;:- */ |
||||
{0, CS36_SW3, CS35_SW3, CS34_SW3}, /* RGB42-''- */ |
||||
{0, CS39_SW8, CS38_SW8, CS37_SW8}, /* RGB43-ENTER- */ |
||||
{0, CS27_SW8, CS26_SW8, CS25_SW8}, /* RGB44-PGDN */ |
||||
{0, CS3_SW4, CS2_SW4, CS1_SW4}, /* RGB45-LSF --ROW3*/ |
||||
{0, CS6_SW4, CS5_SW4, CS4_SW4}, /* RGB46-LSF split -*/ |
||||
{0, CS9_SW4, CS8_SW4, CS7_SW4}, /* RGB47-Z -*/ |
||||
{0, CS12_SW4, CS11_SW4, CS10_SW4}, /* RGB48-X -*/ |
||||
{0, CS15_SW4, CS14_SW4, CS13_SW4}, /* RGB49-C -*/ |
||||
{0, CS18_SW4, CS17_SW4, CS16_SW4}, /* RGB50-V -*/ |
||||
{0, CS21_SW4, CS20_SW4, CS19_SW4}, /* RGB51-B -*/ |
||||
{0, CS24_SW4, CS23_SW4, CS22_SW4}, /* RGB52-N -*/ |
||||
{0, CS27_SW4, CS26_SW4, CS25_SW4}, /* RGB53-M -*/ |
||||
{0, CS30_SW4, CS29_SW4, CS28_SW4}, /* RGB54-<, -*/ |
||||
{0, CS33_SW4, CS32_SW4, CS31_SW4}, /* RGB55->. -*/ |
||||
{0, CS36_SW4, CS35_SW4, CS34_SW4}, /* RGB56-?/ -*/ |
||||
{0, CS39_SW9, CS38_SW9, CS37_SW9}, /* RGB57-RSF -*/ |
||||
{0, CS36_SW9, CS35_SW9, CS34_SW9}, /* RGB58-UP -*/ |
||||
{0, CS27_SW9, CS26_SW9, CS25_SW9}, /* RGB59--MO-- */ |
||||
{0, CS3_SW5, CS2_SW5, CS1_SW5}, /* RGB60-lct-- row4*/ |
||||
{0, CS6_SW5, CS5_SW5, CS4_SW5}, /* RGB61-lwin- */ |
||||
{0, CS9_SW5, CS8_SW5, CS7_SW5}, /* RGB62-lalt- */ |
||||
{0, CS12_SW5, CS11_SW5, CS10_SW5}, /* RGB63-sp2.25- */ |
||||
{0, CS15_SW5, CS14_SW5, CS13_SW5}, /* RGB64-sp7U6.25U1.25U- */ |
||||
{0, CS21_SW5, CS20_SW5, CS19_SW5}, /* RGB65-sp2.75U- */ |
||||
{0, CS30_SW5, CS29_SW5, CS28_SW5}, /* RGB66-ralt- */ |
||||
{0, CS33_SW5, CS32_SW5, CS31_SW5}, /* RGB67-rctrl- */ |
||||
{0, CS36_SW5, CS35_SW5, CS34_SW5}, /* RGB68-left- */ |
||||
{0, CS39_SW5, CS38_SW5, CS37_SW5}, /* RGB69-dn- */ |
||||
{0, CS27_SW5, CS26_SW5, CS25_SW5}, /* RGB70-right- */ |
||||
}; |
||||
|
||||
led_config_t g_led_config = { { |
||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }, |
||||
{ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 }, |
||||
{ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 15, 44 }, |
||||
{ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 }, |
||||
{ 60, 61, 62, 63, 64, NO_LED, 65, NO_LED, NO_LED, 66, 67, 68, 69, NO_LED, 70 } |
||||
}, { |
||||
{ 0, 0 }, { 15, 0 }, { 30, 0 }, { 45, 0 }, { 60, 0 }, { 75, 0 }, { 90, 0 }, { 105, 0 }, { 120, 0 }, { 135, 0 }, { 150, 0 }, { 165, 0}, { 180, 0}, { 195, 0 }, { 209, 0 }, { 224, 0 }, |
||||
{ 2, 16 }, { 18, 16 }, { 34, 16 }, { 50, 16 }, { 66, 16 }, { 82, 16 }, { 98, 16 }, { 114, 16 }, { 130, 16 }, { 146, 16 }, { 162, 16 }, { 178, 16 }, { 194, 16 }, { 208, 16 }, { 224, 16 }, |
||||
{ 2, 32 }, { 20, 32 }, { 36, 32 }, { 52, 32 }, { 68, 32 }, { 84, 32 }, { 100, 32 }, { 116, 32 }, { 132, 32 }, { 148, 32 }, { 164, 32 }, { 180, 32 }, { 202, 32 }, { 224, 32 }, |
||||
{ 0, 48 }, { 16, 48 }, { 32, 48 }, { 48, 48 }, { 64, 48 }, { 80, 48 }, { 96, 48 }, { 112, 48 }, { 128, 48 }, { 144, 48 }, { 160, 48 }, { 176, 48 }, { 192, 48 }, { 208, 48 }, { 224, 48 }, |
||||
{ 0, 64 }, { 20, 64 }, { 40, 64 }, { 60, 64 }, { 95, 64 }, { 132, 64 }, { 152, 64 }, { 172, 64 }, { 192, 64 }, { 208, 64 }, { 224, 64 } |
||||
}, { |
||||
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, |
||||
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, |
||||
0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, |
||||
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, |
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 |
||||
} |
||||
}; |
||||
|
||||
|
||||
#endif |
||||
|
||||
__attribute__ ((weak)) |
||||
void rgb_matrix_indicators_user(void) |
||||
{ |
||||
if (host_keyboard_led_state().caps_lock) |
||||
{ |
||||
rgb_matrix_set_color(31, 255, 255, 255); |
||||
} else { |
||||
rgb_matrix_set_color(31, 0, 0, 0); |
||||
} |
||||
} |
||||
|
||||
enum encoder_modes{ |
||||
ENCODER_MODE_ONE = 0, |
||||
ENCODER_MODE_TWO, |
||||
ENCODER_MODE_THREE, |
||||
}; |
||||
|
||||
keyboard_config_t keyboard_config; |
||||
rgblight_config_t rgblight_config; |
||||
|
||||
uint8_t pre_hue, pre_sat, pre_val;
|
||||
uint8_t previous_rgb_mode = 0;
|
||||
uint8_t dir_hue, dir_sat; |
||||
|
||||
bool encoder_in = false;
|
||||
uint32_t encoder_timer;
|
||||
|
||||
bool encoder_ani_start= false;
|
||||
uint32_t encoder_ani_timer = 0;
|
||||
|
||||
bool encoder_direction_start = false; |
||||
uint32_t encoder_direction_timer = 0; |
||||
|
||||
|
||||
bool lizm_restart_snake = false; |
||||
void rgblight_snake_restart(uint8_t hue, uint8_t sat, uint8_t val){ |
||||
lizm_restart_snake = true; // restart signal to local each effect
|
||||
rgblight_config.hue = hue; |
||||
rgblight_config.sat = sat; |
||||
rgblight_config.val = val; |
||||
} |
||||
|
||||
|
||||
void keyboard_post_init_kb(void){ |
||||
keyboard_config.raw = eeconfig_read_kb(); |
||||
if( keyboard_config.encoder_mode_index > ENCODER_MODE_THREE ){ |
||||
keyboard_config.encoder_mode_index = ENCODER_MODE_ONE; |
||||
eeconfig_update_kb(keyboard_config.raw); |
||||
} |
||||
} |
||||
|
||||
void switch_encoder_mode(uint8_t mode){ |
||||
switch(mode){ |
||||
case ENCODER_MODE_ONE: |
||||
dir_hue = 88; |
||||
dir_sat = 255; |
||||
break; |
||||
|
||||
case ENCODER_MODE_TWO: |
||||
dir_hue = 0; |
||||
dir_sat = 240; |
||||
break; |
||||
|
||||
case ENCODER_MODE_THREE: |
||||
dir_hue = 176; |
||||
dir_sat = 255; |
||||
break; |
||||
} |
||||
rgblight_sethsv_noeeprom(dir_hue,dir_sat,pre_val);
|
||||
} |
||||
|
||||
|
||||
void init_encoder_mode(uint8_t mode){ |
||||
previous_rgb_mode = rgblight_get_mode(); |
||||
pre_hue = rgblight_get_hue(); |
||||
pre_sat = rgblight_get_sat(); |
||||
pre_val = rgblight_get_val(); |
||||
encoder_in = true; |
||||
|
||||
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
|
||||
|
||||
switch_encoder_mode(mode); |
||||
} |
||||
|
||||
|
||||
void set_encoder_mode(uint8_t mode){ |
||||
if(encoder_in == false){ |
||||
init_encoder_mode(mode); |
||||
}else{ |
||||
switch_encoder_mode(mode); |
||||
} |
||||
eeconfig_update_kb(keyboard_config.raw); |
||||
encoder_timer = timer_read32(); |
||||
} |
||||
|
||||
bool process_record_kb(uint16_t keycode, keyrecord_t *record) { |
||||
if (record->event.pressed) { |
||||
switch(keycode) { |
||||
case RGB_MOD: |
||||
case RGB_RMOD: |
||||
case RGB_HUI: |
||||
case RGB_HUD: |
||||
case RGB_SAI: |
||||
case RGB_SAD: |
||||
case RGB_VAI: |
||||
case RGB_VAD: |
||||
|
||||
if(encoder_in){
|
||||
return false; |
||||
}
|
||||
break; |
||||
|
||||
case KC_F13: |
||||
rgb_matrix_toggle();
|
||||
break; |
||||
|
||||
case KC_F14: |
||||
rgb_matrix_step();
|
||||
break; |
||||
|
||||
case KC_F15:
|
||||
rgb_matrix_step_reverse();
|
||||
break; |
||||
|
||||
case KC_F16: |
||||
rgb_matrix_increase_hue(); //Increase the hue for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F17: |
||||
rgb_matrix_decrease_hue(); //Decrease the hue for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F18: |
||||
rgb_matrix_increase_sat(); //Increase the saturation for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F19: |
||||
rgb_matrix_decrease_sat(); //Decrease the saturation for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F20: |
||||
rgb_matrix_increase_val(); //Increase the value for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F21: |
||||
rgb_matrix_decrease_val();//Decrease the value for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F22: //change encoder mode upward
|
||||
|
||||
if(!encoder_direction_start){ |
||||
if(keyboard_config.encoder_mode_index < ENCODER_MODE_THREE){
|
||||
keyboard_config.encoder_mode_index++; |
||||
} |
||||
else{ |
||||
keyboard_config.encoder_mode_index = ENCODER_MODE_ONE; |
||||
} |
||||
set_encoder_mode(keyboard_config.encoder_mode_index); |
||||
} |
||||
return false; |
||||
|
||||
case KC_F23: |
||||
if(!encoder_direction_start){ |
||||
if(keyboard_config.encoder_mode_index > ENCODER_MODE_ONE){ |
||||
keyboard_config.encoder_mode_index--; |
||||
} |
||||
else{ |
||||
keyboard_config.encoder_mode_index = ENCODER_MODE_THREE; |
||||
}
|
||||
set_encoder_mode(keyboard_config.encoder_mode_index); |
||||
} |
||||
return false; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
return process_record_user(keycode, record); |
||||
} |
||||
|
||||
|
||||
void matrix_scan_kb(void) { |
||||
if(encoder_in){ |
||||
if(timer_elapsed32(encoder_timer) > 5000){ |
||||
rgblight_mode(previous_rgb_mode); |
||||
rgblight_sethsv(pre_hue, pre_sat, pre_val);
|
||||
encoder_in = false; |
||||
} |
||||
} |
||||
|
||||
if(encoder_ani_start){ |
||||
if(timer_elapsed32(encoder_ani_timer) > VOLUME_ANIMATION_TIMER){ |
||||
encoder_ani_start = false; |
||||
rgblight_sethsv_noeeprom(0,0,0); |
||||
} |
||||
} |
||||
|
||||
if(encoder_direction_start){ |
||||
if(timer_elapsed32(encoder_direction_timer) > (VOLUME_ANIMATION_TIMER+1500)){ |
||||
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); |
||||
rgblight_sethsv_noeeprom(dir_hue, dir_sat, pre_val);
|
||||
encoder_direction_start = false; |
||||
} |
||||
} |
||||
matrix_scan_user(); |
||||
} |
||||
|
||||
|
||||
void set_volume_animation(bool increase){ |
||||
if(!encoder_ani_start){ |
||||
rgblight_snake_restart(dir_hue, dir_sat, pre_val);
|
||||
} |
||||
|
||||
if(increase){ |
||||
rgblight_mode_noeeprom(17);
|
||||
} else {
|
||||
rgblight_mode_noeeprom(18); |
||||
} |
||||
|
||||
encoder_ani_timer = timer_read32(); |
||||
encoder_direction_timer = encoder_ani_timer; |
||||
encoder_ani_start = true; |
||||
encoder_direction_start = true;
|
||||
} |
||||
|
||||
|
||||
bool encoder_update_kb(uint8_t index, bool clockwise) { |
||||
uint8_t layer_now = keyboard_config.encoder_mode_index +1; |
||||
uint16_t encoder_cw_keycode = keymap_key_to_keycode(layer_now, (keypos_t){.row=2, .col=1 }); |
||||
uint16_t encoder_ccw_keycode = keymap_key_to_keycode(layer_now, (keypos_t){.row=2, .col=2 }); |
||||
if (index == 0) { /* First encoder */ |
||||
if(encoder_in == false){ |
||||
init_encoder_mode(keyboard_config.encoder_mode_index); |
||||
} |
||||
|
||||
if (!clockwise) { |
||||
switch(encoder_cw_keycode) { |
||||
|
||||
case KC_F13: |
||||
rgb_matrix_toggle();
|
||||
break; |
||||
|
||||
case KC_F14: |
||||
rgb_matrix_step();
|
||||
break; |
||||
|
||||
case KC_F15:
|
||||
rgb_matrix_step_reverse();
|
||||
break; |
||||
|
||||
case KC_F16: |
||||
rgb_matrix_increase_hue(); //Increase the hue for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F17: |
||||
rgb_matrix_decrease_hue(); //Decrease the hue for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F18: |
||||
rgb_matrix_increase_sat(); //Increase the saturation for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F19: |
||||
rgb_matrix_decrease_sat(); //Decrease the saturation for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F20: |
||||
rgb_matrix_increase_val(); //Increase the value for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F21: |
||||
rgb_matrix_decrease_val();//Decrease the value for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_VOLU: |
||||
case KC_VOLD: |
||||
tap_code(encoder_cw_keycode); |
||||
break; |
||||
|
||||
default: |
||||
tap_code(encoder_cw_keycode); |
||||
break; |
||||
} |
||||
set_volume_animation(true); |
||||
} else { |
||||
switch(encoder_ccw_keycode) { |
||||
|
||||
case KC_F13: |
||||
rgb_matrix_toggle(); |
||||
break; |
||||
|
||||
case KC_F14: |
||||
rgb_matrix_step();
|
||||
break; |
||||
|
||||
case KC_F15:
|
||||
rgb_matrix_step_reverse();
|
||||
break; |
||||
|
||||
case KC_F16: |
||||
rgb_matrix_increase_hue(); //Increase the hue for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F17: |
||||
rgb_matrix_decrease_hue(); //Decrease the hue for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F18: |
||||
rgb_matrix_increase_sat(); //Increase the saturation for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F19: |
||||
rgb_matrix_decrease_sat(); //Decrease the saturation for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F20: |
||||
rgb_matrix_increase_val(); //Increase the value for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_F21: |
||||
rgb_matrix_decrease_val();//Decrease the value for effect range LEDs
|
||||
break; |
||||
|
||||
case KC_VOLU: |
||||
case KC_VOLD: |
||||
tap_code(encoder_ccw_keycode); |
||||
break; |
||||
|
||||
default: |
||||
tap_code(encoder_ccw_keycode); |
||||
break; |
||||
} |
||||
set_volume_animation(false); |
||||
} |
||||
encoder_timer = timer_read32(); |
||||
} |
||||
return true; |
||||
} |
@ -0,0 +1,116 @@ |
||||
/* Copyright 2021 kb-elmo<mail@elmo.space>
|
||||
* |
||||
* 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 |
||||
|
||||
#include "quantum.h" |
||||
|
||||
#define ____ KC_NO |
||||
|
||||
#define LAYOUT_all( \ |
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K213, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, \
|
||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \
|
||||
K400, K401, K402, K403, K404, K406, K409, K410, K411, K412, K414 \
|
||||
) { \
|
||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
|
||||
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214 }, \
|
||||
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \
|
||||
{ K400, K401, K402, K403, K404, ____, K406, ____, ____, K409, K410, K411, K412, ____, K414 } \
|
||||
} |
||||
|
||||
#define LAYOUT_65_ansi_blocker( \ |
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K213, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, \
|
||||
K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \
|
||||
K400, K401, K402, K404, K409, K410, K411, K412, K414 \
|
||||
) { \
|
||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, ____ }, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
|
||||
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214 }, \
|
||||
{ K300, ____, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \
|
||||
{ K400, K401, K402, ____, K404, ____, ____, ____, ____, K409, K410, K411, K412, ____, K414 } \
|
||||
} |
||||
|
||||
#define LAYOUT_65_ansi_blocker_split_bs( \ |
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K213, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, \
|
||||
K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \
|
||||
K400, K401, K402, K404, K409, K410, K411, K412, K414 \
|
||||
) { \
|
||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
|
||||
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214 }, \
|
||||
{ K300, ____, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \
|
||||
{ K400, K401, K402, ____, K404, ____, ____, ____, ____, K409, K410, K411, K412, ____, K414 } \
|
||||
} |
||||
|
||||
#define LAYOUT_65_ansi_blocker_tsangan( \ |
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K213, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, \
|
||||
K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \
|
||||
K400, K401, K402, K404, K410, K411, K412, K414 \
|
||||
) { \
|
||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
|
||||
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214 }, \
|
||||
{ K300, ____, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \
|
||||
{ K400, K401, K402, ____, K404, ____, ____, ____, ____, ____, K410, K411, K412, ____, K414 } \
|
||||
} |
||||
|
||||
#define LAYOUT_65_iso_blocker( \ |
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K213, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K114, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K113, K212, K214, \
|
||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \
|
||||
K400, K401, K402, K404, K409, K410, K411, K412, K414 \
|
||||
) { \
|
||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, ____ }, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
|
||||
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214 }, \
|
||||
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \
|
||||
{ K400, K401, K402, ____, K404, ____, ____, ____, ____, K409, K410, K411, K412, ____, K414 } \
|
||||
} |
||||
|
||||
#define LAYOUT_65_iso_blocker_split_bs( \ |
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K213, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K114, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K113, K212, K214, \
|
||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \
|
||||
K400, K401, K402, K404, K409, K410, K411, K412, K414 \
|
||||
) { \
|
||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
|
||||
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214 }, \
|
||||
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \
|
||||
{ K400, K401, K402, ____, K404, ____, ____, ____, ____, K409, K410, K411, K412, ____, K414 } \
|
||||
} |
||||
|
||||
typedef union { |
||||
uint32_t raw; |
||||
struct { |
||||
uint8_t encoder_mode_index :8; |
||||
}; |
||||
} keyboard_config_t; |
||||
|
||||
extern keyboard_config_t keyboard_config; |
||||
|
||||
#define VOLUME_ANIMATION_TIMER 580 |
@ -0,0 +1,201 @@ |
||||
/* Copyright 2021 Alan Pocklington
|
||||
* |
||||
* 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 "ajp10304.h" |
||||
#include "keymap_uk.h" |
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
||||
|
||||
/* Qwerty
|
||||
* ,-----------------------------------------------------------------------------------. |
||||
* | Esc | Q | W | E | R | T | Y | U | I | O | P | Bksp | |
||||
* |------+------+------+------+------+-------------+------+------+------+------+------| |
||||
* | Tab | A | S | D | F | G | H | J | K | L | ;: | Enter| |
||||
* |------+------+------+------+------+------|------+------+------+------+------+------| |
||||
* | Shft | Z | X | C | V | B | N | M | ,< | .> | /? | Shft | |
||||
* |------+------+------+------+------+------+------+------+------+------+------+------| |
||||
* | Fn | Ctrl | Alt | GUI |Lower | Bksp |Space |Raise | Shift| MENU | Ctrl | Fn2 | |
||||
* `-----------------------------------------------------------------------------------' |
||||
*/ |
||||
[_QWERTY] = LAYOUT_ortho_4x12( |
||||
LT(_NUMPAD, KC_ESC), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC , |
||||
MT(MOD_LSFT, KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, MT(MOD_RSFT, KC_ENT) , |
||||
KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT , |
||||
MO(_FUNC), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_LSHIFT, KC_BTN2, KC_RCTL, MO(_FUNC2) |
||||
), |
||||
|
||||
/* Function
|
||||
* ,-----------------------------------------------------------------------------------. |
||||
* | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | |
||||
* |------+------+------+------+------+-------------+------+------+------+------+------| |
||||
* | 1! | 2" | 3£ | 4$ | 5% | 6^ | 7& | 8* | 9( | 0) | ~ |INSERT| |
||||
* |------+------+------+------+------+------|------+------+------+------+------+------| |
||||
* | Shift| \| | `¬ | #~ | * | -_ | =+ | \| | [{ | ]} | '@ |Shift | |
||||
* |------+------+------+------+------+------+------+------+------+------+------+------| |
||||
* | Fn | Ctrl | Alt | GUI |Lower | Bksp |Space |Mouse | MENU | Alt | Ctrl | Fn | |
||||
* `-----------------------------------------------------------------------------------' |
||||
*/ |
||||
[_FUNC] = LAYOUT_ortho_4x12( |
||||
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 , |
||||
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, UK_TILD, KC_INSERT , |
||||
KC_LSHIFT, KC_NONUS_BSLASH, KC_GRAVE, KC_NONUS_HASH, KC_PAST, KC_MINS, KC_EQL, KC_BSLASH, KC_LBRC, KC_RBRC, KC_QUOT, MT(MOD_RSFT, KC_ENT) , |
||||
_______, _______, _______, _______, _______, _______, _______, MO(_MOUSE), _______, _______, _______, _______ |
||||
), |
||||
|
||||
/* Lower
|
||||
* ,-----------------------------------------------------------------------------------. |
||||
* | 1! | 2" | 3£ | 4$ | 5% | 6^ | 7& | 8* | 9( | 0) | DEL | Bksp | |
||||
* |------+------+------+------+------+-------------+------+------+------+------+------| |
||||
* | ! | " | £ | $ | % | ^ | & | * | ( | ) |WrdDel|WrdBks| |
||||
* |------+------+------+------+------+------|------+------+------+------+------+------| |
||||
* | Shift| \| | `¬ | #~ | '@ | -_ | =+ | #~ | [{ | ]} | '@ |Shift | |
||||
* |------+------+------+------+------+------+------+------+------+------+------+------| |
||||
* | | | | |Lower | Del |Space | | Next | Vol- | Vol+ | Play | |
||||
* `-----------------------------------------------------------------------------------' |
||||
*/ |
||||
[_LOWER] = LAYOUT_ortho_4x12( |
||||
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, KC_BSPC , |
||||
LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), LSFT(KC_4), LSFT(KC_5), LSFT(KC_6), LSFT(KC_7), LSFT(KC_8), LSFT(KC_9), LSFT(KC_0), LCTL(KC_DEL), LCTL(KC_BSPC) , |
||||
KC_LSPO, KC_NONUS_BSLASH, KC_GRAVE, KC_NONUS_HASH, KC_QUOT, KC_MINS, KC_EQL, KC_NONUS_HASH, KC_LBRC, KC_RBRC, KC_QUOT, MT(MOD_RSFT, KC_ENT) , |
||||
_______, _______, _______, _______, _______, KC_DEL, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY |
||||
), |
||||
|
||||
/* Raise
|
||||
* ,-----------------------------------------------------------------------------------. |
||||
* | ` | |WRDSEL| [ | ] | | | PGUP | HOME |PGDOWN| |PRNTSC| |
||||
* |------+------+------+------+------+-------------+------+------+------+------+------| |
||||
* | ` | | | ( | ) | | | HOME | UP | END | |ZOOM +| |
||||
* |------+------+------+------+------+------|------+------+------+------+------+------| |
||||
* | | | | { | } | | |< | LEFT | DOWN |RIGHT | >| |ZOOM -| |
||||
* |------+------+------+------+------+------|------+------+------+------+------+------| |
||||
* | Mouse| | | | | Alt | Enter|Raise | | | | | |
||||
* `-----------------------------------------------------------------------------------' |
||||
*/ |
||||
[_RAISE] = LAYOUT_ortho_4x12( |
||||
KC_GRV, XXXXXXX, M_WORD_SEL, KC_LBRC, KC_RBRC, XXXXXXX, XXXXXXX, KC_PGUP, KC_HOME, KC_PGDOWN, XXXXXXX, KC_PSCREEN , |
||||
KC_GRV, XXXXXXX, XXXXXXX, LSFT(KC_9), LSFT(KC_0), XXXXXXX, XXXXXXX, KC_HOME, KC_UP, KC_END, XXXXXXX, LCTL(LSFT(KC_EQL)) , |
||||
_______, XXXXXXX, XXXXXXX, LSFT(KC_LBRC), LSFT(KC_RBRC), XXXXXXX, LCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_RIGHT), LCTL(KC_MINS) , |
||||
MO(_MOUSE), _______, _______, _______, _______, KC_LALT, KC_ENT, _______, XXXXXXX, _______, _______, _______ |
||||
), |
||||
|
||||
/* Adjust (Lower + Raise)
|
||||
* ,-----------------------------------------------------------------------------------. |
||||
* | ???? | Reset|Qwerty| | | REC1 | REC2 | | | | | Del | |
||||
* |------+------+------+------+------+-------------+------+------+------+------+------| |
||||
* | CAPS | | | | | PLAY1| PLAY2| Mute | Vol+ | Play | | | |
||||
* |------+------+------+------+------+------|------+------+------+------+------+------| |
||||
* | PC/MC| | | | | STOP | STOP | Prev | Vol- | Next | | | |
||||
* |------+------+------+------+------+------+------+------+------+------+------+------| |
||||
* | | | | | | | | | | | | |
||||
* `-----------------------------------------------------------------------------------' |
||||
*/ |
||||
[_ADJUST] = LAYOUT_ortho_4x12( |
||||
M_CUSTOM, RESET, QWERTY, BL_ON, BL_OFF, DYN_REC_START1, DYN_REC_START2, _______, _______, _______, _______, KC_DEL , |
||||
KC_CAPS, RGB_TOG, RGB_MOD, RGB_VAD, RGB_VAI, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, KC_AUDIO_MUTE, KC_AUDIO_VOL_UP, KC_MEDIA_PLAY_PAUSE, _______, _______ , |
||||
TG(_MAC), RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, DYN_REC_STOP, DYN_REC_STOP, KC_MEDIA_PREV_TRACK, KC_AUDIO_VOL_DOWN, KC_MEDIA_NEXT_TRACK, _______, _______ , |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ |
||||
), |
||||
|
||||
/* Mouse
|
||||
* ,-----------------------------------------------------------------------------------. |
||||
* | ESC | | | | | | | | BTN3 | | | | |
||||
* |------+------+------+------+------+-------------+------+------+------+------+------| |
||||
* | ACC0 | ACC1 | ACC2 | | | | | BTN1 | UP | BTN2 | | | |
||||
* |------+------+------+------+------+------|------+------+------+------+------+------| |
||||
* | ACC0 | ACC1 | ACC2 | | | | | LEFT | DOWN |RIGHT | | | |
||||
* |------+------+------+------+------+------|------+------+------+------+------+------| |
||||
* | | | | | | | | | | | | | |
||||
* `-----------------------------------------------------------------------------------' |
||||
*/ |
||||
[_MOUSE] = LAYOUT_ortho_4x12( |
||||
KC_ESC , _______, _______, _______, _______, _______, _______, _______, KC_MS_BTN3, _______, _______, _______, |
||||
KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, _______, _______, _______, _______, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, _______, _______, |
||||
KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, _______, _______, _______, _______, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, _______, _______, |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ |
||||
), |
||||
|
||||
/* Num Pad
|
||||
* ,-----------------------------------------------------------------------------------. |
||||
* | ESC | | | | | |NMLOCK| 7 | 8 | 9 | / | | |
||||
* |------+------+------+------+------+-------------+------+------+------+------+------| |
||||
* | | | | | | | | 4 | 5 | 6 | * | | |
||||
* |------+------+------+------+------+------|------+------+------+------+------+------| |
||||
* | | | | | | | | 1 | 2 | 3 | + | | |
||||
* |------+------+------+------+------+------|------+------+------+------+------+------| |
||||
* | | | | | | | | 0 | . | , | - | | |
||||
* `-----------------------------------------------------------------------------------' |
||||
*/ |
||||
[_NUMPAD] = LAYOUT_ortho_4x12( |
||||
_______, _______, _______, _______, _______, _______, KC_NLCK, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_SLASH, _______, |
||||
_______, _______, _______, _______, _______, _______, _______, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_ASTERISK, _______, |
||||
_______, _______, _______, _______, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_PLUS, _______, |
||||
_______, _______, _______, _______, _______, _______, _______, KC_KP_0, KC_KP_DOT, KC_COMM, KC_KP_MINUS, _______ |
||||
), |
||||
|
||||
/* Function 2 (Right hand side)
|
||||
* ,-----------------------------------------------------------------------------------. |
||||
* | | |WRDSEL| | | | LNDEL| | | | | | |
||||
* |------+------+------+------+------+-------------+------+------+------+------+------| |
||||
* | | | LNSEL| DUP | | | | |LNJOIN| | | | |
||||
* |------+------+------+------+------+------|------+------+------+------+------+------| |
||||
* | | UNDO | CUT | COPY | PASTE| | | | | | | MODE | |
||||
* |------+------+------+------+------+------|------+------+------+------+------+------| |
||||
* | | | | | | | | | | | | | |
||||
* `-----------------------------------------------------------------------------------' |
||||
*/ |
||||
[_FUNC2] = LAYOUT_ortho_4x12( |
||||
_______, _______, M_WORD_SEL, _______, _______, _______, M_LINE_DEL, _______, _______, _______, _______, _______, |
||||
_______, _______, M_LINE_SEL, M_DUP, _______, _______, _______, M_JOIN, _______, _______, _______, _______, |
||||
_______, LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), _______, _______, _______, _______, _______, _______, M_MODE, |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ |
||||
), |
||||
|
||||
[_MAC]= LAYOUT_ortho_4x12( |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, |
||||
MFNC, _______, _______, _______, MLWR, _______, _______, MRSE, _______, _______, _______, MFNC2 |
||||
), |
||||
|
||||
[_MLWR] = LAYOUT_ortho_4x12( |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ |
||||
), |
||||
|
||||
[_MRSE] = LAYOUT_ortho_4x12( |
||||
_______, _______, M_WORD_SEL_MAC, _______, _______, _______, _______, _______, _______, _______, _______, _______ , |
||||
_______, _______, _______, _______, _______, _______, _______, LCTL(KC_A), _______, LCTL(KC_E), _______, LGUI(KC_EQL) , |
||||
_______, _______, _______, _______, _______, _______, LALT(KC_LEFT), _______, _______, _______, LALT(KC_RIGHT), LGUI(KC_MINS) , |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ |
||||
), |
||||
|
||||
[_MFNC]= LAYOUT_ortho_4x12( |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, LGUI(KC_PENT) , |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ |
||||
), |
||||
|
||||
[_MFNC2] = LAYOUT_ortho_4x12( |
||||
_______, _______, M_WORD_SEL_MAC, _______, _______, _______, M_LINE_DEL_MAC, _______, _______, _______, _______, _______, |
||||
_______, _______, M_LINE_SEL_MAC, M_DUP_MAC, _______, _______, _______, M_JOIN_MAC, _______, _______, _______, _______, |
||||
_______, LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V), _______, _______, _______, _______, _______, _______, M_MODE_MAC, |
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ |
||||
) |
||||
|
||||
}; |
@ -0,0 +1,118 @@ |
||||
# AJP10304 Custom Quark Layout |
||||
# Also available for the Planck, JJ40 and Atreus50 |
||||
|
||||
**Note:** In the tables below where there are two characters on a key, |
||||
the second is the output when shift is applied. |
||||
|
||||
**Note:** The below tables assume a UK layout. |
||||
|
||||
#### Flashing |
||||
|
||||
`make quark:ajp10304:flash` |
||||
|
||||
##### Main Qwerty Layer |
||||
|
||||
* Tab: when held, operates as shift. |
||||
* Enter: when held, operates as shift. |
||||
* MENU: perform right-click |
||||
|
||||
| | | | | | | | | | | | | |
||||
| ---- |:----:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| ----:| |
||||
| Esc | Q | W | E | R | T | Y | U | I | O | P | Bksp | |
||||
| Tab | A | S | D | F | G | H | J | K | L | ;: | Enter| |
||||
| Shft | Z | X | C | V | B | N | M | ,< | .> | /? | Shft | |
||||
| Fn | Ctrl | Alt | GUI |Lower | Bksp |Space |Raise | Shift| MENU | Ctrl | Fn2 | |
||||
|
||||
##### Function Layer |
||||
Activated when `fn` held in the above `qwerty` layer. |
||||
|
||||
| | | | | | | | | | | | | |
||||
| :---: |:----:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| |
||||
| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | |
||||
| 1! | 2" | 3£ | 4$ | 5% | 6^ | 7& | 8* | 9( | 0) | ~ |INSERT| |
||||
| Shift | \| | `¬ | #~ | * | -_ | =+ | \| | [{ | ]} | '@ |Shift | |
||||
| Fn | Ctrl | Alt | GUI |Lower | Bksp |Space |Mouse | MENU | Alt | Ctrl | Fn2 | |
||||
|
||||
##### Lower Layer |
||||
Activated when `Lower` is held in the above `qwerty` layer. |
||||
|
||||
* Numbers are along the top row, their shifted counterparts are on row 2. |
||||
* WrdBks: `backspace` with `ctrl` applied. I.e. delete a word. |
||||
* WrdDel: `delete` with `ctrl` applied. I.e. forward delete a word. |
||||
|
||||
| | | | | | | | | | | | | |
||||
| :---: |:----:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| |
||||
| 1! | 2" | 3£ | 4$ | 5% | 6^ | 7& | 8* | 9( | 0) | DEL | Bksp | |
||||
| ! | " | £ | $ | % | ^ | & | * | ( | ) |WrdDel|WrdBks| |
||||
| Shift | \| | `¬ | #~ | '@ | -_ | =+ | #~ | [{ | ]} | '@ |Shift | |
||||
| | | | |Lower | Del |Space | | Next | Vol- | Vol+ | Play | |
||||
|
||||
##### Raise Layer |
||||
Activated when `Raise` is held in the above `qwerty` layer. |
||||
|
||||
* Preferred layer for typing brackets. |
||||
* Allows for cursor navigation to be used solely with the right hand. |
||||
* WRDSEL: Select the word where the cursor is. |
||||
* |< and >|: Apply `ctrl` to `left` and `right` respectively for word jumping. |
||||
|
||||
| | | | | | | | | | | | | |
||||
| :---: |:----:| :---:| :---:| :---:| :---:| :---: | :---:| :---:| :---:| :---: | :---:| |
||||
| ` | |WRDSEL| [ | ] | | | PGUP | HOME |PGDOWN| |PRNTSC| |
||||
| ` | | | ( | ) | | | HOME | UP | END | |ZOOM +| |
||||
| | | | { | } | ||<| LEFT | DOWN |RIGHT |>||ZOOM -| |
||||
| Mouse | | | | | Alt | Enter |Raise | | | | | |
||||
|
||||
##### Lower + Raise |
||||
Activated when `Lower` and `Raise` are held together in the above `qwerty` layer. |
||||
|
||||
* Audio controls in the same position as cursor keys from the `Raise` layer. |
||||
* ????: Runs a macro for outputting a text string. Do not use this store passwords. |
||||
* Reset: Enter bootloader for flashing firmware to the keyboard. |
||||
* CAPS: Toggle caps lock. |
||||
* Macro functions: Allows recording of macros. To start recording the macro, press either REC1 or REC2. |
||||
To finish the recording, press STOP. To replay the macro, press either PLAY1 or PLAY2. |
||||
* MAC: Toggle MAC OS extensions to layers. This allows MLWR to be enabled with LOWER, |
||||
MRSE with RAISE, MFNC with FUNC and MFNC2 with FUNC2 respectively. |
||||
|
||||
| | | | | | | | | | | | | |
||||
| :---: |:----:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| |
||||
| ???? | Reset|Qwerty| | | REC1 | REC2 | | | | | Del | |
||||
| CAPS | | | | | PLAY1|PLAY2 | Mute | Vol+ | Play | | | |
||||
| MAC | | | | | STOP1|STOP2 | Prev | Vol- | Next | | | |
||||
| | | | | | | | | DYN | | | | |
||||
|
||||
##### Function 2 Layer |
||||
Activated when `fn` held in the above `qwerty` layer. |
||||
* WRDSEL: Select the word where the cursor is. |
||||
* LNDEL: Delete the line where the cursor is. |
||||
* LNSEL: Select the line where the cursor is. |
||||
* DUP: Duplicate the selected text. |
||||
* LNJOIN: Join the line where the cursor is with the following line. |
||||
* MODE: Print either `PC` or `OSX` depending on what layer mode is active. |
||||
|
||||
| | | | | | | | | | | | | |
||||
| :---: | :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| |
||||
| | |WRDSEL| | | | LNDEL| | | | | | |
||||
| | | LNSEL| DUP | | | | |LNJOIN| | | | |
||||
| | UNDO | CUT | COPY | PASTE| | | | | | | MODE | |
||||
| | | | | | | | | | | | | |
||||
|
||||
##### Mouse Layer |
||||
Activated when `fn` and `raise` held together. |
||||
|
||||
| | | | | | | | | | | | | |
||||
| :---: | :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| |
||||
| ESC | | | | | | | | BTN3 | | | | |
||||
| ACC0 | ACC1 | ACC2 | | | | | BTN1 | UP | BTN2 | | | |
||||
| ACC0 | ACC1 | ACC2 | | | | | LEFT | DOWN | RIGHT| | | |
||||
| | | | | | | | | | | | | |
||||
|
||||
##### Number Pad Layout |
||||
Activated when holding `Esc` key. |
||||
|
||||
| | | | | | | | | | | | | |
||||
| :---: | :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| :---:| |
||||
| | | | | | |NMLOCK| 7 | 8 | 9 | / | | |
||||
| | | | | | | | 4 | 5 | 6 | * | | |
||||
| | | | | | | | 1 | 2 | 3 | + | | |
||||
| | | | | | | | 0 | . | , | - | | |
@ -0,0 +1 @@ |
||||
MOUSEKEY_ENABLE = yes
|
@ -1,18 +1,18 @@ |
||||
# space_space |
||||
|
||||
 |
||||
 |
||||
|
||||
Give your space some space |
||||
|
||||
* Keyboard Maintainer: https://github.com/qpockets |
||||
* Hardware Availability: |
||||
* Hardware Availability: [p3dstore](https://p3dstore.com/products/space-space-acrylic-case?_pos=21&_sid=c75de6a78&_ss=r&variant=39907740844216) |
||||
|
||||
Make example for this keyboard (after setting up your build environment): |
||||
|
||||
make space_space:default |
||||
make space_space/rev2:default |
||||
|
||||
Flashing example for this keyboard: |
||||
|
||||
make space_space:default:flash |
||||
make space_space/rev2: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). |
||||
|
@ -0,0 +1,18 @@ |
||||
# space_space |
||||
|
||||
 |
||||
|
||||
Give your space some space |
||||
|
||||
* Keyboard Maintainer: https://github.com/qpockets |
||||
* Hardware Availability: limited |
||||
|
||||
Make example for this keyboard (after setting up your build environment): |
||||
|
||||
make space_space/rev1:default |
||||
|
||||
Flashing example for this keyboard: |
||||
|
||||
make space_space/rev1: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). |
@ -0,0 +1,23 @@ |
||||
# MCU name
|
||||
MCU = atmega32u4
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = atmel-dfu
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = lite # Enable Bootmagic Lite
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = yes # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
ENCODER_ENABLE = yes
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue