Conflicts: keyboards/gmmk/pro/ansi/keymaps/jonavin/rules.mk keyboards/space_space/rules.mkpull/13550/head
@ -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 | |||
![3W6](https://raw.githubusercontent.com/weteor/3W6/main/images/3w6_rev2_1s.jpg) | |||
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 | |||
![3W6](https://raw.githubusercontent.com/weteor/3W6/main/images/3w6_1s.jpg) | |||
![3W6](https://raw.githubusercontent.com/weteor/3W6/main/images/3w6_3s.jpg) | |||
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 | |||
![3W6_rev2](https://raw.githubusercontent.com/weteor/3W6/main/images/3w6_rev2_2s.jpg) | |||
![3W6_rev2](https://raw.githubusercontent.com/weteor/3W6/main/images/3w6_rev2_1s.jpg) | |||
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 | |||
![voice65](https://i.imgur.com/okI07scl.jpg) | |||
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 | |||
![voice65](https://i.imgur.com/okI07scl.jpg) | |||
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 | |||
![space_space](https://i.imgur.com/qdkG8K7l.jpg) | |||
![space_space](https://i.imgur.com/SxjhzIMl.jpg) | |||
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 | |||
![space_space](https://i.imgur.com/qdkG8K7l.jpg) | |||
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 |