Compare commits
88 Commits
40aadc97ea
...
master
Author | SHA1 | Date | |
---|---|---|---|
3991994177 | |||
6bfd7c5f12 | |||
fab75ada44 | |||
a36926391a | |||
41b6c60810 | |||
2845481490 | |||
08f3cee0a7 | |||
e6318b045d | |||
741d87e0a8 | |||
e0d54f8e79 | |||
0856908bec | |||
1067fcc4b5 | |||
7cb29a6bba | |||
87029d00c1 | |||
e3e82a1109 | |||
ae7c2b9534 | |||
19b4ddfce9 | |||
80276758fd | |||
c0c1312a6b | |||
7f1253abe7
|
|||
1eac64a26f
|
|||
46cf1032b9
|
|||
dd94895986
|
|||
a98c750a27
|
|||
461050a2ca
|
|||
9fb112feb1
|
|||
18596b85e9
|
|||
5165e637e7
|
|||
2bf3317bf5
|
|||
0d99adf288
|
|||
254c0f8de0
|
|||
b20b5b1271
|
|||
d132a5951a
|
|||
f4a7960eed
|
|||
afa07ce83c
|
|||
d795d84f41
|
|||
6f60ddc9cf
|
|||
1c213ed8da
|
|||
065ab5b166
|
|||
7082172bc4
|
|||
6e84592338
|
|||
b951674cd9
|
|||
779965ff33
|
|||
2545f15b30
|
|||
7fe192e4b3
|
|||
7004285fd7
|
|||
bf6faeb94f
|
|||
c757a1686c
|
|||
7be80e97fd
|
|||
7835772425
|
|||
e6cc6bfa10
|
|||
4cb3fe0ee9
|
|||
584b39f4c2
|
|||
9fef820caf
|
|||
417abd2697
|
|||
c5003d5104
|
|||
2d7b6544fc
|
|||
ad63cbabc6
|
|||
7a2ac34a23
|
|||
12e65bf02b
|
|||
86585658e3
|
|||
900d9a5d1d
|
|||
a4759176b1
|
|||
092fdc64ba
|
|||
fab3cef86d
|
|||
225f89c91f
|
|||
2ccfa47ce6
|
|||
99e8360c5f
|
|||
27bbf48cba
|
|||
eec4251201
|
|||
c7a193a7d2
|
|||
464528faaf
|
|||
a7d92cb868
|
|||
e02056c49d
|
|||
37d5d7ac3d
|
|||
242913a642
|
|||
234b3ad91f
|
|||
213b56a132
|
|||
cbacb36de2
|
|||
9c7159dc36
|
|||
4ad4992000
|
|||
3ffc43bd5e
|
|||
8673848cee
|
|||
01e1e510a0
|
|||
068134e368
|
|||
3c9ddd89fa
|
|||
754279cbfb
|
|||
238d32cf77
|
14
.editorconfig
Normal file
14
.editorconfig
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# EditorConfig is awesome: https://EditorConfig.org
|
||||||
|
|
||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
tab_width = 4
|
||||||
|
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = false
|
8
.gitignore
vendored
8
.gitignore
vendored
@ -1 +1,7 @@
|
|||||||
*.gch
|
# The docker container places firmware
|
||||||
|
# in this directory
|
||||||
|
output
|
||||||
|
|
||||||
|
# Secret information that shouldn't be
|
||||||
|
# added to git.
|
||||||
|
secrets.h
|
6
.gitmodules
vendored
Normal file
6
.gitmodules
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[submodule "docker/qmk_cli"]
|
||||||
|
path = docker/qmk_cli
|
||||||
|
url = ssh://git@git.betalupi.com:33/QMK/qmk_cli.git
|
||||||
|
[submodule "docker/qmk_firmware"]
|
||||||
|
path = docker/qmk_firmware
|
||||||
|
url = ssh://git@git.betalupi.com:33/QMK/qmk_firmware.git
|
26
.vscode/settings.json
vendored
Normal file
26
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
//"files.exclude": {
|
||||||
|
// "**/.build": true,
|
||||||
|
// "**/*.hex": true,
|
||||||
|
// "**/*.bin": true,
|
||||||
|
// "**/*.uf2": true
|
||||||
|
//},
|
||||||
|
"files.associations": {
|
||||||
|
"*.h": "c",
|
||||||
|
"*.c": "c",
|
||||||
|
"*.inc": "c",
|
||||||
|
"*.cpp": "cpp",
|
||||||
|
"*.hpp": "cpp",
|
||||||
|
"xstddef": "c",
|
||||||
|
"type_traits": "c",
|
||||||
|
"utility": "c",
|
||||||
|
"ranges": "c",
|
||||||
|
"compare": "c",
|
||||||
|
"cstdint": "c",
|
||||||
|
"chrono": "c",
|
||||||
|
"typeindex": "c",
|
||||||
|
"typeinfo": "c",
|
||||||
|
"unordered_map": "c"
|
||||||
|
},
|
||||||
|
"C_Cpp.errorSquiggles": "disabled",
|
||||||
|
}
|
28
Makefile
Executable file
28
Makefile
Executable file
@ -0,0 +1,28 @@
|
|||||||
|
all: voyager ergodox
|
||||||
|
|
||||||
|
voyager:
|
||||||
|
@mkdir -p "$$(pwd)/output"
|
||||||
|
docker run -it --rm \
|
||||||
|
--user $$(id -u):$$(id -g) \
|
||||||
|
-v "$$(pwd)/output:/build_output" \
|
||||||
|
-v "$$(pwd)/keyboards:/qmk_firmware/keyboards:ro" \
|
||||||
|
-e QMK_TARGET="betalupi_voyager:default" \
|
||||||
|
git.betalupi.com/mark/qmk
|
||||||
|
|
||||||
|
ergodox:
|
||||||
|
@mkdir -p "$$(pwd)/output"
|
||||||
|
docker run -it --rm \
|
||||||
|
--user $$(id -u):$$(id -g) \
|
||||||
|
-v "$$(pwd)/output:/build_output" \
|
||||||
|
-v "$$(pwd)/keyboards:/qmk_firmware/keyboards:ro" \
|
||||||
|
-e QMK_TARGET="betalupi_ergodox:default" \
|
||||||
|
git.betalupi.com/mark/qmk
|
||||||
|
|
||||||
|
ergodox_upload:
|
||||||
|
wally-cli output/betalupi_ergodox_default.hex
|
||||||
|
|
||||||
|
docker:
|
||||||
|
docker build docker -t git.betalupi.com/mark/qmk
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: voyager ergodox ergodox_upload docker all
|
15
README.md
Normal file
15
README.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# Betalupi QMK environment
|
||||||
|
|
||||||
|
This repository contains my keyboards' firmware and everything you need to build it. It includes a docker container for building QMK firmware, since QMK installation modifies my computer a bit more than I'd like.
|
||||||
|
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
You do not need a local install of QMK to build this firmware.
|
||||||
|
You'll need docker, but there's a good chance you have that installed anyway.
|
||||||
|
|
||||||
|
1. `make docker`
|
||||||
|
2. `make`
|
||||||
|
3. `make upload`
|
||||||
|
|
||||||
|
Read [`Makefile`](./Makefile) for details.
|
110
animations/fft.h
110
animations/fft.h
@ -1,110 +0,0 @@
|
|||||||
#ifdef RGB_MATRIX_DATAPOINTER_ENABLED
|
|
||||||
#ifndef DISABLE_RGB_MATRIX_FFT_ANIM
|
|
||||||
RGB_MATRIX_EFFECT(FFT_ANIM)
|
|
||||||
|
|
||||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
|
||||||
|
|
||||||
// Maps fft columns to leds.
|
|
||||||
// fft_col_to_array[i] returns an array of leds in the ith bin of the fft.
|
|
||||||
// Negative indices are "invisible" leds.
|
|
||||||
// Use them when your keyboard has gaps.
|
|
||||||
//
|
|
||||||
// This layout is for the Ergodox EZ.
|
|
||||||
static int8_t fft_col_to_array[10][5] = {
|
|
||||||
{ 47, 43, 38, 33, 28 },
|
|
||||||
{ 46, 42, 37, 32, 27 },
|
|
||||||
{ 45, 41, 36, 31, 26 },
|
|
||||||
{ 44, 40, 35, 30, 25 },
|
|
||||||
{ -1, 39, 34, 29, 24 },
|
|
||||||
{ -1, 15, 10, 5, 0 },
|
|
||||||
{ 20, 16, 11, 6, 1 },
|
|
||||||
{ 21, 17, 12, 7, 2 },
|
|
||||||
{ 22, 18, 13, 8, 3 },
|
|
||||||
{ 23, 19, 14, 9, 4 }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// TODO:
|
|
||||||
// Dynamic color settings
|
|
||||||
bool FFT_ANIM(effect_params_t* params) {
|
|
||||||
RGB_MATRIX_USE_LIMITS(led_min, led_max);
|
|
||||||
|
|
||||||
// REQUIRED for any animation that uses this pointer.
|
|
||||||
// Clears any previous data.
|
|
||||||
if (params->init) {
|
|
||||||
rgb_matrix_anim_data = NULL;
|
|
||||||
return led_max < DRIVER_LED_TOTAL;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (rgb_matrix_anim_data == NULL) {
|
|
||||||
// If animation data is empty, turn off all leds and exit.
|
|
||||||
for (uint8_t i = led_min; i < led_max; i++) {
|
|
||||||
rgb_matrix_set_color(
|
|
||||||
i,
|
|
||||||
0x00, 0x00, 0x00
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// Data should be a pointer to 10 uint8_ts, each representing
|
|
||||||
// the height of a bar on the display.
|
|
||||||
uint8_t* data = (uint8_t*) rgb_matrix_anim_data;
|
|
||||||
|
|
||||||
for (uint8_t bin = 0; bin < 10; bin++) {
|
|
||||||
// Scale data values
|
|
||||||
uint8_t d = data[bin];
|
|
||||||
uint8_t bin_height = d / 50;
|
|
||||||
// Brightness of topmost key
|
|
||||||
uint8_t last_brightness = ((d % 50)/50.0) * 0xFF;
|
|
||||||
|
|
||||||
|
|
||||||
// Turn off leds that should be off.
|
|
||||||
// There are 5 keys in each column.
|
|
||||||
for (uint8_t i = bin_height; i < 6; i++) {
|
|
||||||
// Ignore negative indices.
|
|
||||||
// See fft_col_to_array definition.
|
|
||||||
if (fft_col_to_array[bin][i] < 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
rgb_matrix_set_color(
|
|
||||||
fft_col_to_array[bin][i],
|
|
||||||
0x00, 0x00, 0x00
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Turn on leds that should be on.
|
|
||||||
for (uint8_t i = 0; i < bin_height; i++) {
|
|
||||||
// Ignore negative indices.
|
|
||||||
// See fft_col_to_array definition.
|
|
||||||
if (fft_col_to_array[bin][i] < 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If this is the topmost lit key, its
|
|
||||||
// brightness depends on the height of the bar.
|
|
||||||
if (i == bin_height - 1) {
|
|
||||||
rgb_matrix_set_color(
|
|
||||||
fft_col_to_array[bin][i],
|
|
||||||
last_brightness, 0x00, last_brightness
|
|
||||||
);
|
|
||||||
|
|
||||||
// If this isn't the topmost key,
|
|
||||||
// it has a plain full-brightness color.
|
|
||||||
} else {
|
|
||||||
rgb_matrix_set_color(
|
|
||||||
fft_col_to_array[bin][i],
|
|
||||||
0x00, 0x00, 0xFF
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return led_max < DRIVER_LED_TOTAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
@ -1,537 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
|
||||||
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
|
|
||||||
Copyright 2015 ZSA Technology Labs Inc (@zsa)
|
|
||||||
Copyright 2020 Christopher Courtney <drashna@live.com> (@drashna)
|
|
||||||
|
|
||||||
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 "betalupi_ergodox.h"
|
|
||||||
#include "rawhid.h"
|
|
||||||
|
|
||||||
extern inline void ergodox_board_led_on(void);
|
|
||||||
extern inline void ergodox_right_led_1_on(void);
|
|
||||||
extern inline void ergodox_right_led_2_on(void);
|
|
||||||
extern inline void ergodox_right_led_3_on(void);
|
|
||||||
extern inline void ergodox_right_led_on(uint8_t led);
|
|
||||||
|
|
||||||
extern inline void ergodox_board_led_off(void);
|
|
||||||
extern inline void ergodox_right_led_1_off(void);
|
|
||||||
extern inline void ergodox_right_led_2_off(void);
|
|
||||||
extern inline void ergodox_right_led_3_off(void);
|
|
||||||
extern inline void ergodox_right_led_off(uint8_t led);
|
|
||||||
|
|
||||||
extern inline void ergodox_led_all_on(void);
|
|
||||||
extern inline void ergodox_led_all_off(void);
|
|
||||||
|
|
||||||
extern inline void ergodox_right_led_1_set(uint8_t n);
|
|
||||||
extern inline void ergodox_right_led_2_set(uint8_t n);
|
|
||||||
extern inline void ergodox_right_led_3_set(uint8_t n);
|
|
||||||
extern inline void ergodox_right_led_set(uint8_t led, uint8_t n);
|
|
||||||
|
|
||||||
extern inline void ergodox_led_all_set(uint8_t n);
|
|
||||||
|
|
||||||
keyboard_config_t keyboard_config;
|
|
||||||
bool i2c_initialized = 0;
|
|
||||||
i2c_status_t mcp23018_status = 0x20;
|
|
||||||
|
|
||||||
void matrix_init_kb(void) {
|
|
||||||
// keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md")
|
|
||||||
TCCR1A = 0b10101001; // set and configure fast PWM
|
|
||||||
TCCR1B = 0b00001001; // set and configure fast PWM
|
|
||||||
|
|
||||||
// (tied to Vcc for hardware convenience)
|
|
||||||
DDRB &= ~(1<<4); // set B(4) as input
|
|
||||||
PORTB &= ~(1<<4); // set B(4) internal pull-up disabled
|
|
||||||
|
|
||||||
// unused pins - C7, D4, D5, D7, E6
|
|
||||||
// set as input with internal pull-up enabled
|
|
||||||
DDRC &= ~(1<<7);
|
|
||||||
DDRD &= ~(1<<5 | 1<<4);
|
|
||||||
DDRE &= ~(1<<6);
|
|
||||||
PORTC |= (1<<7);
|
|
||||||
PORTD |= (1<<5 | 1<<4);
|
|
||||||
PORTE |= (1<<6);
|
|
||||||
|
|
||||||
keyboard_config.raw = eeconfig_read_kb();
|
|
||||||
#ifdef RGB_MATRIX_ENABLE
|
|
||||||
if (keyboard_config.rgb_matrix_enable) {
|
|
||||||
rgb_matrix_set_flags(LED_FLAG_ALL);
|
|
||||||
} else {
|
|
||||||
rgb_matrix_set_flags(LED_FLAG_NONE);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ergodox_blink_all_leds();
|
|
||||||
|
|
||||||
matrix_init_user();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ergodox_blink_all_leds(void) {
|
|
||||||
ergodox_led_all_off();
|
|
||||||
ergodox_led_all_set(LED_BRIGHTNESS_DEFAULT);
|
|
||||||
|
|
||||||
ergodox_right_led_1_on();
|
|
||||||
_delay_ms(50);
|
|
||||||
ergodox_right_led_2_on();
|
|
||||||
_delay_ms(50);
|
|
||||||
ergodox_right_led_3_on();
|
|
||||||
_delay_ms(50);
|
|
||||||
|
|
||||||
ergodox_right_led_1_off();
|
|
||||||
_delay_ms(50);
|
|
||||||
ergodox_right_led_2_off();
|
|
||||||
_delay_ms(50);
|
|
||||||
ergodox_right_led_3_off();
|
|
||||||
|
|
||||||
ergodox_led_all_off();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t init_mcp23018(void) {
|
|
||||||
mcp23018_status = 0x20;
|
|
||||||
|
|
||||||
// I2C subsystem
|
|
||||||
|
|
||||||
// uint8_t sreg_prev;
|
|
||||||
// sreg_prev=SREG;
|
|
||||||
// cli();
|
|
||||||
|
|
||||||
if (i2c_initialized == 0) {
|
|
||||||
i2c_init(); // on pins D(1,0)
|
|
||||||
i2c_initialized = true;
|
|
||||||
_delay_ms(1000);
|
|
||||||
}
|
|
||||||
// i2c_init(); // on pins D(1,0)
|
|
||||||
// _delay_ms(1000);
|
|
||||||
|
|
||||||
// set pin direction
|
|
||||||
// - unused : input : 1
|
|
||||||
// - input : input : 1
|
|
||||||
// - driving : output : 0
|
|
||||||
mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
|
||||||
mcp23018_status = i2c_write(IODIRA, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
|
||||||
mcp23018_status = i2c_write(0b00000000, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
|
||||||
mcp23018_status = i2c_write(0b00111111, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
|
||||||
i2c_stop();
|
|
||||||
|
|
||||||
// set pull-up
|
|
||||||
// - unused : on : 1
|
|
||||||
// - input : on : 1
|
|
||||||
// - driving : off : 0
|
|
||||||
mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
|
||||||
mcp23018_status = i2c_write(GPPUA, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
|
||||||
mcp23018_status = i2c_write(0b00000000, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
|
||||||
mcp23018_status = i2c_write(0b00111111, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
|
||||||
|
|
||||||
out:
|
|
||||||
i2c_stop();
|
|
||||||
|
|
||||||
// SREG=sreg_prev;
|
|
||||||
|
|
||||||
return mcp23018_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef SWAP_HANDS_ENABLE
|
|
||||||
__attribute__ ((weak))
|
|
||||||
// swap-hands action needs a matrix to define the swap
|
|
||||||
const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
|
|
||||||
/* Left hand, matrix positions */
|
|
||||||
{{0,13}, {1,13}, {2,13}, {3,13}, {4,13}, {5,13}},
|
|
||||||
{{0,12}, {1,12}, {2,12}, {3,12}, {4,12}, {5,12}},
|
|
||||||
{{0,11}, {1,11}, {2,11}, {3,11}, {4,11}, {5,11}},
|
|
||||||
{{0,10}, {1,10}, {2,10}, {3,10}, {4,10}, {5,10}},
|
|
||||||
{{0,9}, {1,9}, {2,9}, {3,9}, {4,9}, {5,9}},
|
|
||||||
{{0,8}, {1,8}, {2,8}, {3,8}, {4,8}, {5,8}},
|
|
||||||
{{0,7}, {1,7}, {2,7}, {3,7}, {4,7}, {5,7}},
|
|
||||||
/* Right hand, matrix positions */
|
|
||||||
{{0,6}, {1,6}, {2,6}, {3,6}, {4,6}, {5,6}},
|
|
||||||
{{0,5}, {1,5}, {2,5}, {3,5}, {4,5}, {5,5}},
|
|
||||||
{{0,4}, {1,4}, {2,4}, {3,4}, {4,4}, {5,4}},
|
|
||||||
{{0,3}, {1,3}, {2,3}, {3,3}, {4,3}, {5,3}},
|
|
||||||
{{0,2}, {1,2}, {2,2}, {3,2}, {4,2}, {5,2}},
|
|
||||||
{{0,1}, {1,1}, {2,1}, {3,1}, {4,1}, {5,1}},
|
|
||||||
{{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}},
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef RGB_MATRIX_ENABLE
|
|
||||||
|
|
||||||
void suspend_power_down_kb(void) {
|
|
||||||
rgb_matrix_set_suspend_state(true);
|
|
||||||
suspend_power_down_user();
|
|
||||||
}
|
|
||||||
|
|
||||||
void suspend_wakeup_init_kb(void) {
|
|
||||||
rgb_matrix_set_suspend_state(false);
|
|
||||||
suspend_wakeup_init_user();
|
|
||||||
}
|
|
||||||
|
|
||||||
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
|
|
||||||
//{driver, R location, G location, B location}
|
|
||||||
|
|
||||||
{0, C3_1, C2_1, C4_1}, // LED1 on right
|
|
||||||
{0, C6_1, C5_1, C7_1}, // LED2
|
|
||||||
{0, C4_2, C3_2, C5_2}, // LED3
|
|
||||||
{0, C7_2, C6_2, C8_2}, // LED4
|
|
||||||
{0, C2_3, C1_3, C3_3}, // LED5
|
|
||||||
{0, C5_3, C4_3, C6_3}, // LED6
|
|
||||||
{0, C8_3, C7_3, C9_3}, // LED7
|
|
||||||
{0, C2_4, C1_4, C3_4}, // LED8
|
|
||||||
{0, C6_4, C5_4, C7_4}, // LED9
|
|
||||||
{0, C2_5, C1_5, C3_5}, // LED10
|
|
||||||
{0, C7_5, C6_5, C8_5}, // LED11
|
|
||||||
{0, C2_6, C1_6, C3_6}, // LED12
|
|
||||||
{0, C5_6, C4_6, C6_6}, // LED13
|
|
||||||
{0, C8_6, C7_6, C9_6}, // LED14
|
|
||||||
{0, C2_7, C1_7, C3_7}, // LED15
|
|
||||||
{0, C5_7, C4_7, C6_7}, // LED16
|
|
||||||
{0, C2_8, C1_8, C3_8}, // LED17
|
|
||||||
{0, C5_8, C4_8, C6_8}, // LED18
|
|
||||||
|
|
||||||
{0, C3_9, C2_9, C4_9}, // LED19
|
|
||||||
{0, C6_9, C5_9, C7_9}, // LED20
|
|
||||||
{0, C4_10, C3_10, C5_10}, // LED21
|
|
||||||
{0, C7_10, C6_10, C8_10}, // LED22
|
|
||||||
{0, C2_11, C1_11, C3_11}, // LED23
|
|
||||||
{0, C5_11, C4_11, C6_11}, // LED24
|
|
||||||
|
|
||||||
{1, C3_1, C2_1, C4_1}, // LED1 on left
|
|
||||||
{1, C6_1, C5_1, C7_1}, // LED2
|
|
||||||
{1, C4_2, C3_2, C5_2}, // LED3
|
|
||||||
{1, C7_2, C6_2, C8_2}, // LED4
|
|
||||||
{1, C2_3, C1_3, C3_3}, // LED5
|
|
||||||
{1, C5_3, C4_3, C6_3}, // LED6
|
|
||||||
{1, C8_3, C7_3, C9_3}, // LED7
|
|
||||||
{1, C2_4, C1_4, C3_4}, // LED8
|
|
||||||
{1, C6_4, C5_4, C7_4}, // LED9
|
|
||||||
{1, C2_5, C1_5, C3_5}, // LED10
|
|
||||||
{1, C7_5, C6_5, C8_5}, // LED11
|
|
||||||
{1, C2_6, C1_6, C3_6}, // LED12
|
|
||||||
{1, C5_6, C4_6, C6_6}, // LED13
|
|
||||||
{1, C8_6, C7_6, C9_6}, // LED14
|
|
||||||
{1, C2_7, C1_7, C3_7}, // LED15
|
|
||||||
{1, C5_7, C4_7, C6_7}, // LED16
|
|
||||||
{1, C2_8, C1_8, C3_8}, // LED17
|
|
||||||
{1, C5_8, C4_8, C6_8}, // LED18
|
|
||||||
|
|
||||||
{1, C3_9, C2_9, C4_9}, // LED19
|
|
||||||
{1, C6_9, C5_9, C7_9}, // LED20
|
|
||||||
{1, C4_10, C3_10, C5_10}, // LED21
|
|
||||||
{1, C7_10, C6_10, C8_10}, // LED22
|
|
||||||
{1, C2_11, C1_11, C3_11}, // LED23
|
|
||||||
{1, C5_11, C4_11, C6_11} // LED24
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
led_config_t g_led_config = { {
|
|
||||||
// Key matrix to LED index
|
|
||||||
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED },
|
|
||||||
{ 28, 33, 38, 43, 47, NO_LED },
|
|
||||||
{ 27, 32, 37, 42, 46, NO_LED },
|
|
||||||
{ 26, 31, 36, 41, 45, NO_LED },
|
|
||||||
{ 25, 30, 35, 40, 44, NO_LED },
|
|
||||||
{ 24, 29, 34, 39, NO_LED, NO_LED },
|
|
||||||
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED },
|
|
||||||
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED },
|
|
||||||
{ 0, 5, 10, 15, NO_LED, NO_LED },
|
|
||||||
{ 1, 6, 11, 16, 20, NO_LED },
|
|
||||||
{ 2, 7, 12, 17, 21, NO_LED },
|
|
||||||
{ 3, 8, 13, 18, 22, NO_LED },
|
|
||||||
{ 4, 9, 14, 19, 23, NO_LED },
|
|
||||||
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED }
|
|
||||||
}, {
|
|
||||||
// LED index to physical position
|
|
||||||
{ 137, 0 }, { 154, 0 }, { 172, 0 }, { 189, 0 }, { 206, 0 }, { 137, 12 },
|
|
||||||
{ 154, 12 }, { 172, 12 }, { 189, 12 }, { 206, 12 }, { 137, 25 }, { 154, 25 },
|
|
||||||
{ 172, 25 }, { 189, 25 }, { 206, 25 }, { 137, 38 }, { 154, 38 }, { 172, 38 },
|
|
||||||
{ 189, 38 }, { 206, 38 }, { 154, 51 }, { 172, 51 }, { 189, 51 }, { 206, 51 },
|
|
||||||
{ 86, 0 }, { 68, 0 }, { 51, 0 }, { 34, 0 }, { 17, 0 }, { 86, 12 },
|
|
||||||
{ 68, 12 }, { 51, 12 }, { 34, 12 }, { 17, 12 }, { 86, 25 }, { 68, 25 },
|
|
||||||
{ 51, 25 }, { 34, 25 }, { 17, 25 }, { 86, 38 }, { 68, 38 }, { 51, 38 },
|
|
||||||
{ 34, 38 }, { 17, 38 }, { 68, 51 }, { 51, 51 }, { 34, 51 }, { 17, 51 }
|
|
||||||
}, {
|
|
||||||
// LED index to flag
|
|
||||||
4, 4, 4, 4, 4, 4,
|
|
||||||
4, 4, 4, 4, 4, 4,
|
|
||||||
4, 4, 4, 4, 4, 4,
|
|
||||||
4, 4, 1, 1, 1, 1,
|
|
||||||
4, 4, 4, 4, 4, 4,
|
|
||||||
4, 4, 4, 4, 4, 4,
|
|
||||||
4, 4, 4, 4, 4, 4,
|
|
||||||
4, 4, 1, 1, 1, 1
|
|
||||||
} };
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void keyboard_post_init_kb(void) {
|
|
||||||
|
|
||||||
// Start with matrix enabled
|
|
||||||
// (We enable RGB effects and layer colors seperately)
|
|
||||||
#ifdef RGB_MATRIX_ENABLE
|
|
||||||
rgb_matrix_enable_noeeprom();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Start with backlight disabled
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
|
||||||
#ifdef RGBLIGHT_OFF_AT_START
|
|
||||||
rgblight_disable_noeeprom();
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
keyboard_post_init_user();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
|
||||||
switch (keycode) {
|
|
||||||
case LED_LEVEL:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
keyboard_config.led_level++;
|
|
||||||
if (keyboard_config.led_level > 4) {
|
|
||||||
keyboard_config.led_level = 0;
|
|
||||||
}
|
|
||||||
ergodox_led_all_set((uint8_t)keyboard_config.led_level * 255 / 4 );
|
|
||||||
eeconfig_update_kb(keyboard_config.raw);
|
|
||||||
layer_state_set_kb(layer_state);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#ifdef RGB_MATRIX_ENABLE
|
|
||||||
case TOGGLE_LAYER_COLOR:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
keyboard_config.disable_layer_led ^= 1;
|
|
||||||
if (keyboard_config.disable_layer_led) {
|
|
||||||
rgb_matrix_set_color_all(0, 0, 0);
|
|
||||||
}
|
|
||||||
eeconfig_update_kb(keyboard_config.raw);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RGB_TOG:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
switch (rgb_matrix_get_flags()) {
|
|
||||||
case LED_FLAG_ALL: {
|
|
||||||
rgb_matrix_set_flags(LED_FLAG_NONE);
|
|
||||||
keyboard_config.rgb_matrix_enable = false;
|
|
||||||
rgb_matrix_set_color_all(0, 0, 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default: {
|
|
||||||
rgb_matrix_set_flags(LED_FLAG_ALL);
|
|
||||||
keyboard_config.rgb_matrix_enable = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
eeconfig_update_kb(keyboard_config.raw);
|
|
||||||
}
|
|
||||||
|
|
||||||
hid_send_state();
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case RGB_MOD:
|
|
||||||
// Tell the host whenever we change animation mode.
|
|
||||||
hid_send_state();
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Custom RGBLIGHT macros
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
|
||||||
#ifdef RGBLIGHT_NO_EEPROM
|
|
||||||
case LIGHT_TOG:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_toggle_noeeprom();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_MOD:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_step_noeeprom();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_HUI:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_increase_hue_noeeprom();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_HUD:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_decrease_hue_noeeprom();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_SAI:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_increase_sat_noeeprom();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_SAD:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_decrease_sat_noeeprom();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_VAI:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_increase_val_noeeprom();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_VAD:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_decrease_val_noeeprom();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_SPI:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_increase_speed_noeeprom();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_SPD:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_decrease_speed_noeeprom();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#else
|
|
||||||
case LIGHT_TOG:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_toggle();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_MOD:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_step();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_HUI:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_increase_hue();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_HUD:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_decrease_hue();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_SAI:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_increase_sat();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_SAD:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_decrease_sat();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_VAI:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_increase_val();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_VAD:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_decrease_val();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_SPI:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_increase_speed();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LIGHT_SPD:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_decrease_speed();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return process_record_user(keycode, record);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// EEPROM is getting reset!
|
|
||||||
void eeconfig_init_kb(void) {
|
|
||||||
keyboard_config.raw = 0;
|
|
||||||
keyboard_config.led_level = 4;
|
|
||||||
keyboard_config.rgb_matrix_enable = true;
|
|
||||||
eeconfig_update_kb(keyboard_config.raw);
|
|
||||||
eeconfig_init_user();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DYNAMIC_MACRO_ENABLE
|
|
||||||
static bool is_dynamic_recording = false;
|
|
||||||
static uint16_t dynamic_loop_timer;
|
|
||||||
|
|
||||||
void dynamic_macro_record_start_user(void) {
|
|
||||||
is_dynamic_recording = true;
|
|
||||||
dynamic_loop_timer = timer_read();
|
|
||||||
ergodox_right_led_1_on();
|
|
||||||
}
|
|
||||||
|
|
||||||
void dynamic_macro_record_end_user(int8_t direction) {
|
|
||||||
is_dynamic_recording = false;
|
|
||||||
layer_state_set_user(layer_state);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void matrix_scan_kb(void) {
|
|
||||||
#ifdef DYNAMIC_MACRO_ENABLE
|
|
||||||
if (is_dynamic_recording) {
|
|
||||||
ergodox_right_led_1_off();
|
|
||||||
// if (timer_elapsed(dynamic_loop_timer) > 5)
|
|
||||||
{
|
|
||||||
static uint8_t counter;
|
|
||||||
counter++;
|
|
||||||
if (counter > 100) ergodox_right_led_1_on();
|
|
||||||
dynamic_loop_timer = timer_read();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CAPS_LOCK_STATUS
|
|
||||||
led_t led_state = host_keyboard_led_state();
|
|
||||||
if(led_state.caps_lock) {
|
|
||||||
ergodox_right_led_3_on();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
uint8_t layer = get_highest_layer(layer_state);
|
|
||||||
if(layer != 3) {
|
|
||||||
ergodox_right_led_3_off();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
matrix_scan_user();
|
|
||||||
}
|
|
@ -1,307 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
|
||||||
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
|
|
||||||
Copyright 2015 ZSA Technology Labs Inc (@zsa)
|
|
||||||
Copyright 2020 Christopher Courtney <drashna@live.com> (@drashna)
|
|
||||||
|
|
||||||
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 <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "i2c_master.h"
|
|
||||||
|
|
||||||
// I2C aliases and register addresses (see "mcp23018.md")
|
|
||||||
#define I2C_ADDR 0b0100000
|
|
||||||
#define I2C_ADDR_WRITE ( (I2C_ADDR<<1) | I2C_WRITE )
|
|
||||||
#define I2C_ADDR_READ ( (I2C_ADDR<<1) | I2C_READ )
|
|
||||||
#define IODIRA 0x00 // i/o direction register
|
|
||||||
#define IODIRB 0x01
|
|
||||||
#define GPPUA 0x0C // GPIO pull-up resistor register
|
|
||||||
#define GPPUB 0x0D
|
|
||||||
#define GPIOA 0x12 // general purpose i/o port register (write modifies OLAT)
|
|
||||||
#define GPIOB 0x13
|
|
||||||
#define OLATA 0x14 // output latch register
|
|
||||||
#define OLATB 0x15
|
|
||||||
|
|
||||||
extern i2c_status_t mcp23018_status;
|
|
||||||
#define ERGODOX_EZ_I2C_TIMEOUT 100
|
|
||||||
|
|
||||||
void init_ergodox(void);
|
|
||||||
void ergodox_blink_all_leds(void);
|
|
||||||
uint8_t init_mcp23018(void);
|
|
||||||
|
|
||||||
#ifndef LED_BRIGHTNESS_LO
|
|
||||||
#define LED_BRIGHTNESS_LO 15
|
|
||||||
#endif
|
|
||||||
#ifndef LED_BRIGHTNESS_HI
|
|
||||||
#define LED_BRIGHTNESS_HI 255
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
inline void ergodox_board_led_on(void) { DDRD |= (1<<6); PORTD |= (1<<6); }
|
|
||||||
inline void ergodox_right_led_1_on(void) { DDRB |= (1<<5); PORTB |= (1<<5); }
|
|
||||||
inline void ergodox_right_led_2_on(void) { DDRB |= (1<<6); PORTB |= (1<<6); }
|
|
||||||
inline void ergodox_right_led_3_on(void) { DDRB |= (1<<7); PORTB |= (1<<7); }
|
|
||||||
inline void ergodox_right_led_on(uint8_t led) { DDRB |= (1<<(led+4)); PORTB |= (1<<(led+4)); }
|
|
||||||
|
|
||||||
inline void ergodox_board_led_off(void) { DDRD &= ~(1<<6); PORTD &= ~(1<<6); }
|
|
||||||
inline void ergodox_right_led_1_off(void) { DDRB &= ~(1<<5); PORTB &= ~(1<<5); }
|
|
||||||
inline void ergodox_right_led_2_off(void) { DDRB &= ~(1<<6); PORTB &= ~(1<<6); }
|
|
||||||
inline void ergodox_right_led_3_off(void) { DDRB &= ~(1<<7); PORTB &= ~(1<<7); }
|
|
||||||
inline void ergodox_right_led_off(uint8_t led) { DDRB &= ~(1<<(led+4)); PORTB &= ~(1<<(led+4)); }
|
|
||||||
|
|
||||||
|
|
||||||
inline void ergodox_led_all_on(void) {
|
|
||||||
ergodox_board_led_on();
|
|
||||||
ergodox_right_led_1_on();
|
|
||||||
ergodox_right_led_2_on();
|
|
||||||
ergodox_right_led_3_on();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void ergodox_led_all_off(void) {
|
|
||||||
ergodox_board_led_off();
|
|
||||||
ergodox_right_led_1_off();
|
|
||||||
ergodox_right_led_2_off();
|
|
||||||
ergodox_right_led_3_off();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void ergodox_right_led_1_set(uint8_t n) { OCR1A = n; }
|
|
||||||
inline void ergodox_right_led_2_set(uint8_t n) { OCR1B = n; }
|
|
||||||
inline void ergodox_right_led_3_set(uint8_t n) { OCR1C = n; }
|
|
||||||
inline void ergodox_right_led_set(uint8_t led, uint8_t n) {
|
|
||||||
(led == 1) ? (OCR1A = n) :
|
|
||||||
(led == 2) ? (OCR1B = n) :
|
|
||||||
(OCR1C = n);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void ergodox_led_all_set(uint8_t n) {
|
|
||||||
ergodox_right_led_1_set(n);
|
|
||||||
ergodox_right_led_2_set(n);
|
|
||||||
ergodox_right_led_3_set(n);
|
|
||||||
}
|
|
||||||
|
|
||||||
enum ergodox_ez_keycodes {
|
|
||||||
LED_LEVEL = SAFE_RANGE,
|
|
||||||
TOGGLE_LAYER_COLOR,
|
|
||||||
// Custom RGBLIGHT macros
|
|
||||||
LIGHT_TOG, // Toggle backlight
|
|
||||||
LIGHT_HUI, // Increase backlight hue
|
|
||||||
LIGHT_HUD, // Decrease backlight hue
|
|
||||||
LIGHT_SAI, // Increase backlight sat
|
|
||||||
LIGHT_SAD, // Decrease backlight sat
|
|
||||||
LIGHT_VAI, // Increase backlight val
|
|
||||||
LIGHT_VAD, // Decrease backlight val
|
|
||||||
LIGHT_SPI, // Increase backlight speed
|
|
||||||
LIGHT_SPD, // Decrease backlight speed
|
|
||||||
LIGHT_MOD, // Change backlight animation mode
|
|
||||||
BETA_SAFE_RANGE
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
uint32_t raw;
|
|
||||||
struct {
|
|
||||||
uint8_t led_level :3;
|
|
||||||
bool disable_layer_led :1;
|
|
||||||
bool rgb_matrix_enable :1;
|
|
||||||
};
|
|
||||||
} keyboard_config_t;
|
|
||||||
|
|
||||||
extern keyboard_config_t keyboard_config;
|
|
||||||
|
|
||||||
// Turns {h, s, v} triples into a macro, so that
|
|
||||||
// the LEDS_ergodox macro can take them as inputs.
|
|
||||||
#define LC_HSV(h, s, v) {h, s, v}
|
|
||||||
|
|
||||||
// Rearrange a human-readable LED layout into the correct Ergodox order.
|
|
||||||
// LEDS_ergodox ONLY WORKS WITH MACROS.
|
|
||||||
// Don't input a standalone triple {h, s, v};
|
|
||||||
// Use LC_HSV if you need a single-instance color.
|
|
||||||
#define LEDS_ergodox( \
|
|
||||||
l01,l02,l03,l04,l05, \
|
|
||||||
l06,l07,l08,l09,l10, \
|
|
||||||
l11,l12,l13,l14,l15, \
|
|
||||||
l16,l17,l18,l19,l20, \
|
|
||||||
l21,l22,l23,l24, \
|
|
||||||
\
|
|
||||||
l25,l26,l27,l28,l29, \
|
|
||||||
l30,l31,l32,l33,l34, \
|
|
||||||
l35,l36,l37,l38,l39, \
|
|
||||||
l40,l41,l42,l43,l44, \
|
|
||||||
l45,l46,l47,l48 \
|
|
||||||
) \
|
|
||||||
{ \
|
|
||||||
l25,l26,l27,l28,l29, \
|
|
||||||
l30,l31,l32,l33,l34, \
|
|
||||||
l35,l36,l37,l38,l39, \
|
|
||||||
l40,l41,l42,l43,l44, \
|
|
||||||
l45,l46,l47,l48, \
|
|
||||||
\
|
|
||||||
l05,l04,l03,l02,l01, \
|
|
||||||
l10,l09,l08,l07,l06, \
|
|
||||||
l15,l14,l13,l12,l11, \
|
|
||||||
l20,l19,l18,l17,l16, \
|
|
||||||
l24,l23,l22,l21 \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
LEFT HAND: LINES 115-122
|
|
||||||
RIGHT HAND: LINES 124-131
|
|
||||||
*/
|
|
||||||
#define LAYOUT_ergodox( \
|
|
||||||
\
|
|
||||||
k00,k01,k02,k03,k04,k05,k06, \
|
|
||||||
k10,k11,k12,k13,k14,k15,k16, \
|
|
||||||
k20,k21,k22,k23,k24,k25, \
|
|
||||||
k30,k31,k32,k33,k34,k35,k36, \
|
|
||||||
k40,k41,k42,k43,k44, \
|
|
||||||
k55,k56, \
|
|
||||||
k54, \
|
|
||||||
k53,k52,k51, \
|
|
||||||
\
|
|
||||||
k07,k08,k09,k0A,k0B,k0C,k0D, \
|
|
||||||
k17,k18,k19,k1A,k1B,k1C,k1D, \
|
|
||||||
k28,k29,k2A,k2B,k2C,k2D, \
|
|
||||||
k37,k38,k39,k3A,k3B,k3C,k3D, \
|
|
||||||
k49,k4A,k4B,k4C,k4D, \
|
|
||||||
k57,k58, \
|
|
||||||
k59, \
|
|
||||||
k5C,k5B,k5A ) \
|
|
||||||
\
|
|
||||||
/* matrix positions */ \
|
|
||||||
{ \
|
|
||||||
{ k00, k10, k20, k30, k40, KC_NO }, \
|
|
||||||
{ k01, k11, k21, k31, k41, k51 }, \
|
|
||||||
{ k02, k12, k22, k32, k42, k52 }, \
|
|
||||||
{ k03, k13, k23, k33, k43, k53 }, \
|
|
||||||
{ k04, k14, k24, k34, k44, k54 }, \
|
|
||||||
{ k05, k15, k25, k35, KC_NO, k55 }, \
|
|
||||||
{ k06, k16, KC_NO, k36, KC_NO, k56 }, \
|
|
||||||
\
|
|
||||||
{ k07, k17, KC_NO, k37,KC_NO, k57 }, \
|
|
||||||
{ k08, k18, k28, k38,KC_NO, k58 }, \
|
|
||||||
{ k09, k19, k29, k39, k49, k59 }, \
|
|
||||||
{ k0A, k1A, k2A, k3A, k4A, k5A }, \
|
|
||||||
{ k0B, k1B, k2B, k3B, k4B, k5B }, \
|
|
||||||
{ k0C, k1C, k2C, k3C, k4C, k5C }, \
|
|
||||||
{ k0D, k1D, k2D, k3D, k4D, KC_NO } \
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
LEFT HAND: LINES 158-165
|
|
||||||
RIGHT HAND: LINES 167-174
|
|
||||||
*/
|
|
||||||
#define LAYOUT_ergodox_80( \
|
|
||||||
\
|
|
||||||
k00,k01,k02,k03,k04,k05,k06, \
|
|
||||||
k10,k11,k12,k13,k14,k15,k16, \
|
|
||||||
k20,k21,k22,k23,k24,k25, \
|
|
||||||
k30,k31,k32,k33,k34,k35,k36, \
|
|
||||||
k40,k41,k42,k43,k44, \
|
|
||||||
k55,k56, \
|
|
||||||
k45,k46,k54, \
|
|
||||||
k53,k52,k51, \
|
|
||||||
\
|
|
||||||
k07,k08,k09,k0A,k0B,k0C,k0D, \
|
|
||||||
k17,k18,k19,k1A,k1B,k1C,k1D, \
|
|
||||||
k28,k29,k2A,k2B,k2C,k2D, \
|
|
||||||
k37,k38,k39,k3A,k3B,k3C,k3D, \
|
|
||||||
k49,k4A,k4B,k4C,k4D, \
|
|
||||||
k57,k58, \
|
|
||||||
k59,k47,k48, \
|
|
||||||
k5C,k5B,k5A ) \
|
|
||||||
\
|
|
||||||
/* matrix positions */ \
|
|
||||||
{ \
|
|
||||||
{ k00, k10, k20, k30, k40, KC_NO }, \
|
|
||||||
{ k01, k11, k21, k31, k41, k51 }, \
|
|
||||||
{ k02, k12, k22, k32, k42, k52 }, \
|
|
||||||
{ k03, k13, k23, k33, k43, k53 }, \
|
|
||||||
{ k04, k14, k24, k34, k44, k54 }, \
|
|
||||||
{ k05, k15, k25, k35, k45, k55 }, \
|
|
||||||
{ k06, k16, KC_NO, k36, k46, k56 }, \
|
|
||||||
\
|
|
||||||
{ k07, k17, KC_NO, k37, k47, k57 }, \
|
|
||||||
{ k08, k18, k28, k38, k48, k58 }, \
|
|
||||||
{ k09, k19, k29, k39, k49, k59 }, \
|
|
||||||
{ k0A, k1A, k2A, k3A, k4A, k5A }, \
|
|
||||||
{ k0B, k1B, k2B, k3B, k4B, k5B }, \
|
|
||||||
{ k0C, k1C, k2C, k3C, k4C, k5C }, \
|
|
||||||
{ k0D, k1D, k2D, k3D, k4D, KC_NO } \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------- LEFT HAND ----------- ---------- RIGHT HAND ---------- */
|
|
||||||
#define LAYOUT_ergodox_pretty( \
|
|
||||||
L00,L01,L02,L03,L04,L05,L06, R00,R01,R02,R03,R04,R05,R06, \
|
|
||||||
L10,L11,L12,L13,L14,L15,L16, R10,R11,R12,R13,R14,R15,R16, \
|
|
||||||
L20,L21,L22,L23,L24,L25, R21,R22,R23,R24,R25,R26, \
|
|
||||||
L30,L31,L32,L33,L34,L35,L36, R30,R31,R32,R33,R34,R35,R36, \
|
|
||||||
L40,L41,L42,L43,L44, R42,R43,R44,R45,R46, \
|
|
||||||
L55,L56, R50,R51, \
|
|
||||||
L54, R52, \
|
|
||||||
L53,L52,L51, R55,R54,R53 ) \
|
|
||||||
\
|
|
||||||
/* matrix positions */ \
|
|
||||||
{ \
|
|
||||||
{ L00, L10, L20, L30, L40, KC_NO }, \
|
|
||||||
{ L01, L11, L21, L31, L41, L51 }, \
|
|
||||||
{ L02, L12, L22, L32, L42, L52 }, \
|
|
||||||
{ L03, L13, L23, L33, L43, L53 }, \
|
|
||||||
{ L04, L14, L24, L34, L44, L54 }, \
|
|
||||||
{ L05, L15, L25, L35, KC_NO, L55 }, \
|
|
||||||
{ L06, L16, KC_NO, L36, KC_NO, L56 }, \
|
|
||||||
\
|
|
||||||
{ R00, R10, KC_NO, R30,KC_NO, R50 }, \
|
|
||||||
{ R01, R11, R21, R31,KC_NO, R51 }, \
|
|
||||||
{ R02, R12, R22, R32, R42, R52 }, \
|
|
||||||
{ R03, R13, R23, R33, R43, R53 }, \
|
|
||||||
{ R04, R14, R24, R34, R44, R54 }, \
|
|
||||||
{ R05, R15, R25, R35, R45, R55 }, \
|
|
||||||
{ R06, R16, R26, R36, R46, KC_NO } \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------- LEFT HAND ----------- ---------- RIGHT HAND ---------- */
|
|
||||||
#define LAYOUT_ergodox_pretty_80( \
|
|
||||||
L00,L01,L02,L03,L04,L05,L06, R00,R01,R02,R03,R04,R05,R06, \
|
|
||||||
L10,L11,L12,L13,L14,L15,L16, R10,R11,R12,R13,R14,R15,R16, \
|
|
||||||
L20,L21,L22,L23,L24,L25, R21,R22,R23,R24,R25,R26, \
|
|
||||||
L30,L31,L32,L33,L34,L35,L36, R30,R31,R32,R33,R34,R35,R36, \
|
|
||||||
L40,L41,L42,L43,L44, R42,R43,R44,R45,R46, \
|
|
||||||
L55,L56, R50,R51, \
|
|
||||||
L45,L46,L54, R52,R40,R41, \
|
|
||||||
L53,L52,L51, R55,R54,R53 ) \
|
|
||||||
\
|
|
||||||
/* matrix positions */ \
|
|
||||||
{ \
|
|
||||||
{ L00, L10, L20, L30, L40, KC_NO }, \
|
|
||||||
{ L01, L11, L21, L31, L41, L51 }, \
|
|
||||||
{ L02, L12, L22, L32, L42, L52 }, \
|
|
||||||
{ L03, L13, L23, L33, L43, L53 }, \
|
|
||||||
{ L04, L14, L24, L34, L44, L54 }, \
|
|
||||||
{ L05, L15, L25, L35, L45, L55 }, \
|
|
||||||
{ L06, L16, KC_NO, L36, L46, L56 }, \
|
|
||||||
\
|
|
||||||
{ R00, R10, KC_NO, R30, R40, R50 }, \
|
|
||||||
{ R01, R11, R21, R31, R41, R51 }, \
|
|
||||||
{ R02, R12, R22, R32, R42, R52 }, \
|
|
||||||
{ R03, R13, R23, R33, R43, R53 }, \
|
|
||||||
{ R04, R14, R24, R34, R44, R54 }, \
|
|
||||||
{ R05, R15, R25, R35, R45, R55 }, \
|
|
||||||
{ R06, R16, R26, R36, R46, KC_NO } \
|
|
||||||
}
|
|
77
docker/Dockerfile
Normal file
77
docker/Dockerfile
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
## Build qmk-cli
|
||||||
|
FROM python:3.8-slim-buster AS qmk_cli_builder
|
||||||
|
WORKDIR /app
|
||||||
|
COPY qmk_cli .
|
||||||
|
RUN pip3 install build
|
||||||
|
RUN python3 -m build
|
||||||
|
|
||||||
|
|
||||||
|
## Base container
|
||||||
|
FROM debian:11-slim
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install --no-install-recommends -y \
|
||||||
|
avrdude \
|
||||||
|
binutils-arm-none-eabi \
|
||||||
|
binutils-riscv64-unknown-elf \
|
||||||
|
build-essential \
|
||||||
|
ca-certificates \
|
||||||
|
clang-format-11 \
|
||||||
|
dfu-programmer \
|
||||||
|
dfu-util \
|
||||||
|
dos2unix \
|
||||||
|
ca-certificates \
|
||||||
|
gcc \
|
||||||
|
gcc-arm-none-eabi \
|
||||||
|
gcc-riscv64-unknown-elf \
|
||||||
|
git \
|
||||||
|
libfl2 \
|
||||||
|
libnewlib-arm-none-eabi \
|
||||||
|
picolibc-riscv64-unknown-elf \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
software-properties-common \
|
||||||
|
tar \
|
||||||
|
teensy-loader-cli \
|
||||||
|
unzip \
|
||||||
|
tar \
|
||||||
|
wget \
|
||||||
|
zip \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Install python packages
|
||||||
|
RUN python3 -m pip install --upgrade \
|
||||||
|
pip \
|
||||||
|
setuptools \
|
||||||
|
wheel \
|
||||||
|
nose2 \
|
||||||
|
yapf
|
||||||
|
|
||||||
|
# upgrade avr-gcc... for reasons?
|
||||||
|
RUN /bin/bash -c "set -o pipefail && \
|
||||||
|
wget -q https://github.com/ZakKemble/avr-gcc-build/releases/download/v8.3.0-1/avr-gcc-8.3.0-x64-linux.tar.bz2 -O - | tee /tmp/asdf.tar.bz2 | md5sum -c <(echo '588D0BEA4C5D21A1A06AA17625684417 -') && \
|
||||||
|
tar xfj /tmp/asdf.tar.bz2 --strip-components=1 -C / && \
|
||||||
|
rm -rf /share/ /tmp/*"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Install qmk-cli
|
||||||
|
COPY --from=qmk_cli_builder /app/dist /tmp/dist
|
||||||
|
RUN python3 -m pip install /tmp/dist/qmk-*.whl && \
|
||||||
|
rm -rf /tmp/dist
|
||||||
|
|
||||||
|
# Copy qmk repo.
|
||||||
|
# Make sure you've pulled submodules first!
|
||||||
|
COPY qmk_firmware /qmk_firmware
|
||||||
|
RUN chmod -R 777 /qmk_firmware
|
||||||
|
|
||||||
|
VOLUME /qmk_firmware/keyboards
|
||||||
|
VOLUME /build_output
|
||||||
|
WORKDIR /qmk_firmware
|
||||||
|
|
||||||
|
ENV SKIP_GIT true
|
||||||
|
|
||||||
|
COPY entrypoint.sh /entrypoint.sh
|
||||||
|
CMD ["/bin/bash", "/entrypoint.sh"]
|
25
docker/README.md
Normal file
25
docker/README.md
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# QMK Build Container
|
||||||
|
|
||||||
|
This container contains everything you need to build QMK, including a pinned version of QMK itself. **Be careful, this container may not use the latest version of QMK.**
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
This container takes two volumes:
|
||||||
|
- `/build_output`: QMK binaries are copied here.
|
||||||
|
- `/qmk_firmware/keyboards`: QMK keyboard dir. Link this to your code.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -it \
|
||||||
|
--user $(id -u):$(id -g) \
|
||||||
|
-v "$(pwd)/output:/build_output" \
|
||||||
|
-v "$(pwd)/kb:/qmk_firmware/keyboards:ro" \
|
||||||
|
-e QMK_TARGET="betalupi_ergodox:default" \
|
||||||
|
git.betalupi.com/mark/qmk
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
1. Before building, run `git submodule update --init --recursive`.
|
||||||
|
- Note that the submodules in this repo are linked to my local mirrors for speed. You'll probably need to update `qmk_cli` and `qmk_firmware` with github links.
|
||||||
|
2. Checkout whatever version of `qmk_firmware` you need (optional).
|
||||||
|
3. Run `docker build . -t git.betalupi.com/mark/qmk`
|
14
docker/entrypoint.sh
Normal file
14
docker/entrypoint.sh
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
if [[ -z "$QMK_TARGET" ]]; then
|
||||||
|
echo "You must provide a target to build!" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
make $QMK_TARGET
|
||||||
|
|
||||||
|
# Move output files to output directory.
|
||||||
|
# These are the only extensions qmk can produce,
|
||||||
|
# as far as I know.
|
||||||
|
mv *.{bin,hex,uf2} /build_output > /dev/null 2>&1
|
||||||
|
|
||||||
|
exit 0
|
1
docker/qmk_cli
Submodule
1
docker/qmk_cli
Submodule
Submodule docker/qmk_cli added at aecd02e850
1
docker/qmk_firmware
Submodule
1
docker/qmk_firmware
Submodule
Submodule docker/qmk_firmware added at 0f341dfdd3
104
info.json
104
info.json
@ -1,104 +0,0 @@
|
|||||||
{
|
|
||||||
"keyboard_name": "Betalupi ErgoDox",
|
|
||||||
"url": "betalupi.com",
|
|
||||||
"maintainer": "mark@betalupi",
|
|
||||||
"width": 17,
|
|
||||||
"height": 8,
|
|
||||||
|
|
||||||
"layouts": {
|
|
||||||
"LAYOUT_ergodox": {
|
|
||||||
"layout": [
|
|
||||||
{"x":0, "y":0.375, "w":1.5}, {"x":1.5, "y":0.375}, {"x":2.5, "y":0.125}, {"x":3.5, "y":0}, {"x":4.5, "y":0.125}, {"x":5.5, "y":0.25}, {"x":6.5, "y":0.25},
|
|
||||||
{"x":0, "y":1.375, "w":1.5}, {"x":1.5, "y":1.375}, {"x":2.5, "y":1.125}, {"x":3.5, "y":1}, {"x":4.5, "y":1.125}, {"x":5.5, "y":1.25}, {"x":6.5, "y":1.25, "h":1.5},
|
|
||||||
{"x":0, "y":2.375, "w":1.5}, {"x":1.5, "y":2.375}, {"x":2.5, "y":2.125}, {"x":3.5, "y":2}, {"x":4.5, "y":2.125}, {"x":5.5, "y":2.25},
|
|
||||||
{"x":0, "y":3.375, "w":1.5}, {"x":1.5, "y":3.375}, {"x":2.5, "y":3.125}, {"x":3.5, "y":3}, {"x":4.5, "y":3.125}, {"x":5.5, "y":3.25}, {"x":6.5, "y":2.75, "h":1.5},
|
|
||||||
{"x":0.5, "y":4.375}, {"x":1.5, "y":4.375}, {"x":2.5, "y":4.125}, {"x":3.5, "y":4}, {"x":4.5, "y":4.125},
|
|
||||||
|
|
||||||
{"x":6, "y":5}, {"x":7, "y":5},
|
|
||||||
{"x":7, "y":6},
|
|
||||||
{"x":5, "y":6, "h":2}, {"x":6, "y":6, "h":2}, {"x":7, "y":7},
|
|
||||||
|
|
||||||
|
|
||||||
{"x":9.5, "y":0.25}, {"x":10.5, "y":0.25}, {"x":11.5, "y":0.125}, {"x":12.5, "y":0}, {"x":13.5, "y":0.125}, {"x":14.5, "y":0.375}, {"x":15.5, "y":0.375, "w":1.5},
|
|
||||||
{"x":9.5, "y":1.25, "h":1.5}, {"x":10.5, "y":1.25}, {"x":11.5, "y":1.125}, {"x":12.5, "y":1}, {"x":13.5, "y":1.125}, {"x":14.5, "y":1.375}, {"x":15.5, "y":1.375, "w":1.5},
|
|
||||||
{"x":10.5, "y":2.25}, {"x":11.5, "y":2.125}, {"x":12.5, "y":2}, {"x":13.5, "y":2.125}, {"x":14.5, "y":2.375}, {"x":15.5, "y":2.375, "w":1.5},
|
|
||||||
{"x":9.5, "y":2.75, "h":1.5}, {"x":10.5, "y":3.25}, {"x":11.5, "y":3.125}, {"x":12.5, "y":3}, {"x":13.5, "y":3.125}, {"x":14.5, "y":3.375}, {"x":15.5, "y":3.375, "w":1.5},
|
|
||||||
{"x":11.5, "y":4.125}, {"x":12.5, "y":4}, {"x":13.5, "y":4.125}, {"x":14.5, "y":4.375}, {"x":15.5, "y":4.375},
|
|
||||||
|
|
||||||
|
|
||||||
{"x":9, "y":5}, {"x":10, "y":5},
|
|
||||||
{"x":9, "y":6},
|
|
||||||
{"x":9, "y":7}, {"x":10, "y":6, "h":2}, {"x":11, "y":6, "h":2}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"LAYOUT_ergodox_pretty": {
|
|
||||||
"layout": [
|
|
||||||
{"x":0, "y":0.375, "w":1.5}, {"x":1.5, "y":0.375}, {"x":2.5, "y":0.125}, {"x":3.5, "y":0}, {"x":4.5, "y":0.125}, {"x":5.5, "y":0.25}, {"x":6.5, "y":0.25},
|
|
||||||
{"x":9.5, "y":0.25}, {"x":10.5, "y":0.25}, {"x":11.5, "y":0.125}, {"x":12.5, "y":0}, {"x":13.5, "y":0.125}, {"x":14.5, "y":0.375}, {"x":15.5, "y":0.375, "w":1.5},
|
|
||||||
|
|
||||||
{"x":0, "y":1.375, "w":1.5}, {"x":1.5, "y":1.375}, {"x":2.5, "y":1.125}, {"x":3.5, "y":1}, {"x":4.5, "y":1.125}, {"x":5.5, "y":1.25}, {"x":6.5, "y":1.25, "h":1.5},
|
|
||||||
{"x":9.5, "y":1.25, "h":1.5}, {"x":10.5, "y":1.25}, {"x":11.5, "y":1.125}, {"x":12.5, "y":1}, {"x":13.5, "y":1.125}, {"x":14.5, "y":1.375}, {"x":15.5, "y":1.375, "w":1.5},
|
|
||||||
|
|
||||||
{"x":0, "y":2.375, "w":1.5}, {"x":1.5, "y":2.375}, {"x":2.5, "y":2.125}, {"x":3.5, "y":2}, {"x":4.5, "y":2.125}, {"x":5.5, "y":2.25},
|
|
||||||
{"x":10.5, "y":2.25}, {"x":11.5, "y":2.125}, {"x":12.5, "y":2}, {"x":13.5, "y":2.125}, {"x":14.5, "y":2.375}, {"x":15.5, "y":2.375, "w":1.5},
|
|
||||||
|
|
||||||
{"x":0, "y":3.375, "w":1.5}, {"x":1.5, "y":3.375}, {"x":2.5, "y":3.125}, {"x":3.5, "y":3}, {"x":4.5, "y":3.125}, {"x":5.5, "y":3.25}, {"x":6.5, "y":2.75, "h":1.5},
|
|
||||||
{"x":9.5, "y":2.75, "h":1.5}, {"x":10.5, "y":3.25}, {"x":11.5, "y":3.125}, {"x":12.5, "y":3}, {"x":13.5, "y":3.125}, {"x":14.5, "y":3.375}, {"x":15.5, "y":3.375, "w":1.5},
|
|
||||||
|
|
||||||
{"x":0.5, "y":4.375}, {"x":1.5, "y":4.375}, {"x":2.5, "y":4.125}, {"x":3.5, "y":4}, {"x":4.5, "y":4.125},
|
|
||||||
{"x":11.5, "y":4.125}, {"x":12.5, "y":4}, {"x":13.5, "y":4.125}, {"x":14.5, "y":4.375}, {"x":15.5, "y":4.375},
|
|
||||||
|
|
||||||
{"x":6, "y":5}, {"x":7, "y":5}, {"x":9, "y":5}, {"x":10, "y":5},
|
|
||||||
{"x":7, "y":6}, {"x":9, "y":6},
|
|
||||||
{"x":5, "y":6, "h":2}, {"x":6, "y":6, "h":2}, {"x":7, "y":7}, {"x":9, "y":7}, {"x":10, "y":6, "h":2}, {"x":11, "y":6, "h":2}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"LAYOUT_ergodox_80": {
|
|
||||||
"layout": [
|
|
||||||
{"x":0, "y":0.375, "w":1.5}, {"x":1.5, "y":0.375}, {"x":2.5, "y":0.125}, {"x":3.5, "y":0}, {"x":4.5, "y":0.125}, {"x":5.5, "y":0.25}, {"x":6.5, "y":0.25},
|
|
||||||
{"x":0, "y":1.375, "w":1.5}, {"x":1.5, "y":1.375}, {"x":2.5, "y":1.125}, {"x":3.5, "y":1}, {"x":4.5, "y":1.125}, {"x":5.5, "y":1.25}, {"x":6.5, "y":1.25, "h":1.5},
|
|
||||||
{"x":0, "y":2.375, "w":1.5}, {"x":1.5, "y":2.375}, {"x":2.5, "y":2.125}, {"x":3.5, "y":2}, {"x":4.5, "y":2.125}, {"x":5.5, "y":2.25},
|
|
||||||
{"x":0, "y":3.375, "w":1.5}, {"x":1.5, "y":3.375}, {"x":2.5, "y":3.125}, {"x":3.5, "y":3}, {"x":4.5, "y":3.125}, {"x":5.5, "y":3.25}, {"x":6.5, "y":2.75, "h":1.5},
|
|
||||||
{"x":0.5, "y":4.375}, {"x":1.5, "y":4.375}, {"x":2.5, "y":4.125}, {"x":3.5, "y":4}, {"x":4.5, "y":4.125},
|
|
||||||
|
|
||||||
{"x":6, "y":5}, {"x":7, "y":5},
|
|
||||||
{"x":5, "y":6}, {"x":6, "y":6}, {"x":7, "y":6},
|
|
||||||
{"x":5, "y":7}, {"x":6, "y":7}, {"x":7, "y":7},
|
|
||||||
|
|
||||||
|
|
||||||
{"x":9.5, "y":0.25}, {"x":10.5, "y":0.25}, {"x":11.5, "y":0.125}, {"x":12.5, "y":0}, {"x":13.5, "y":0.125}, {"x":14.5, "y":0.375}, {"x":15.5, "y":0.375, "w":1.5},
|
|
||||||
{"x":9.5, "y":1.25, "h":1.5}, {"x":10.5, "y":1.25}, {"x":11.5, "y":1.125}, {"x":12.5, "y":1}, {"x":13.5, "y":1.125}, {"x":14.5, "y":1.375}, {"x":15.5, "y":1.375, "w":1.5},
|
|
||||||
{"x":10.5, "y":2.25}, {"x":11.5, "y":2.125}, {"x":12.5, "y":2}, {"x":13.5, "y":2.125}, {"x":14.5, "y":2.375}, {"x":15.5, "y":2.375, "w":1.5},
|
|
||||||
{"x":9.5, "y":2.75, "h":1.5}, {"x":10.5, "y":3.25}, {"x":11.5, "y":3.125}, {"x":12.5, "y":3}, {"x":13.5, "y":3.125}, {"x":14.5, "y":3.375}, {"x":15.5, "y":3.375, "w":1.5},
|
|
||||||
{"x":11.5, "y":4.125}, {"x":12.5, "y":4}, {"x":13.5, "y":4.125}, {"x":14.5, "y":4.375}, {"x":15.5, "y":4.375},
|
|
||||||
|
|
||||||
|
|
||||||
{"x":9, "y":5}, {"x":10, "y":5},
|
|
||||||
{"x":9, "y":6}, {"x":10, "y":6}, {"x":11, "y":6},
|
|
||||||
{"x":9, "y":7}, {"x":10, "y":7}, {"x":11, "y":7}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"LAYOUT_ergodox_pretty_80": {
|
|
||||||
"layout": [
|
|
||||||
{"x":0, "y":0.375, "w":1.5}, {"x":1.5, "y":0.375}, {"x":2.5, "y":0.125}, {"x":3.5, "y":0}, {"x":4.5, "y":0.125}, {"x":5.5, "y":0.25}, {"x":6.5, "y":0.25},
|
|
||||||
{"x":9.5, "y":0.25}, {"x":10.5, "y":0.25}, {"x":11.5, "y":0.125}, {"x":12.5, "y":0}, {"x":13.5, "y":0.125}, {"x":14.5, "y":0.375}, {"x":15.5, "y":0.375, "w":1.5},
|
|
||||||
|
|
||||||
{"x":0, "y":1.375, "w":1.5}, {"x":1.5, "y":1.375}, {"x":2.5, "y":1.125}, {"x":3.5, "y":1}, {"x":4.5, "y":1.125}, {"x":5.5, "y":1.25}, {"x":6.5, "y":1.25, "h":1.5},
|
|
||||||
{"x":9.5, "y":1.25, "h":1.5}, {"x":10.5, "y":1.25}, {"x":11.5, "y":1.125}, {"x":12.5, "y":1}, {"x":13.5, "y":1.125}, {"x":14.5, "y":1.375}, {"x":15.5, "y":1.375, "w":1.5},
|
|
||||||
|
|
||||||
{"x":0, "y":2.375, "w":1.5}, {"x":1.5, "y":2.375}, {"x":2.5, "y":2.125}, {"x":3.5, "y":2}, {"x":4.5, "y":2.125}, {"x":5.5, "y":2.25},
|
|
||||||
{"x":10.5, "y":2.25}, {"x":11.5, "y":2.125}, {"x":12.5, "y":2}, {"x":13.5, "y":2.125}, {"x":14.5, "y":2.375}, {"x":15.5, "y":2.375, "w":1.5},
|
|
||||||
|
|
||||||
{"x":0, "y":3.375, "w":1.5}, {"x":1.5, "y":3.375}, {"x":2.5, "y":3.125}, {"x":3.5, "y":3}, {"x":4.5, "y":3.125}, {"x":5.5, "y":3.25}, {"x":6.5, "y":2.75, "h":1.5},
|
|
||||||
{"x":9.5, "y":2.75, "h":1.5}, {"x":10.5, "y":3.25}, {"x":11.5, "y":3.125}, {"x":12.5, "y":3}, {"x":13.5, "y":3.125}, {"x":14.5, "y":3.375}, {"x":15.5, "y":3.375, "w":1.5},
|
|
||||||
|
|
||||||
{"x":0.5, "y":4.375}, {"x":1.5, "y":4.375}, {"x":2.5, "y":4.125}, {"x":3.5, "y":4}, {"x":4.5, "y":4.125},
|
|
||||||
{"x":11.5, "y":4.125}, {"x":12.5, "y":4}, {"x":13.5, "y":4.125}, {"x":14.5, "y":4.375}, {"x":15.5, "y":4.375},
|
|
||||||
|
|
||||||
{"x":6, "y":5}, {"x":7, "y":5}, {"x":9, "y":5}, {"x":10, "y":5},
|
|
||||||
{"x":5, "y":6}, {"x":6, "y":6}, {"x":7, "y":6}, {"x":9, "y":6}, {"x":10, "y":6}, {"x":11, "y":6},
|
|
||||||
{"x":5, "y":7}, {"x":6, "y":7}, {"x":7, "y":7}, {"x":9, "y":7}, {"x":10, "y":7}, {"x":11, "y":7}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
59
keyboards/betalupi_ergodox/animations/fft.h
Normal file
59
keyboards/betalupi_ergodox/animations/fft.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#ifndef RGB_MATRIX_FRAMEBUFFER_EFFECTS
|
||||||
|
#undef ENABLE_RGB_MATRIX_FFT_ANIM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_RGB_MATRIX_FFT_ANIM
|
||||||
|
RGB_MATRIX_EFFECT(FFT_ANIM)
|
||||||
|
|
||||||
|
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||||
|
|
||||||
|
#include "extra_mappings.h"
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
// Dynamic color settings
|
||||||
|
bool FFT_ANIM(effect_params_t* params) {
|
||||||
|
uint8_t led_min = RGB_MATRIX_LED_PROCESS_LIMIT * params->iter;
|
||||||
|
uint8_t led_max = led_min + RGB_MATRIX_LED_PROCESS_LIMIT;
|
||||||
|
if (led_max > sizeof(g_rgb_frame_buffer)) led_max = sizeof(g_rgb_frame_buffer);
|
||||||
|
|
||||||
|
if (params->init) {
|
||||||
|
rgb_matrix_set_color_all(0, 0, 0);
|
||||||
|
memset(g_rgb_frame_buffer, 0, sizeof g_rgb_frame_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = led_min; i < led_max; i++) {
|
||||||
|
uint8_t row = i % MATRIX_ROWS;
|
||||||
|
uint8_t col = i / MATRIX_ROWS;
|
||||||
|
uint8_t val = g_rgb_frame_buffer[row][col];
|
||||||
|
|
||||||
|
bool is_topmost = false;
|
||||||
|
int8_t height = fft_array_to_col[col][row] % 5;
|
||||||
|
int8_t bin = fft_array_to_col[col][row] / 5;
|
||||||
|
if (height == 5 - 1) {
|
||||||
|
is_topmost = true;
|
||||||
|
} else {
|
||||||
|
// Row and col of key above this one
|
||||||
|
if (
|
||||||
|
g_rgb_frame_buffer[
|
||||||
|
fft_col_to_array[bin][height + 1] % MATRIX_ROWS
|
||||||
|
][
|
||||||
|
fft_col_to_array[bin][height + 1] / MATRIX_ROWS
|
||||||
|
] == 0
|
||||||
|
) {
|
||||||
|
is_topmost = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_topmost) {
|
||||||
|
rgb_matrix_set_color(i, val, 0x00, val);
|
||||||
|
} else {
|
||||||
|
rgb_matrix_set_color(i, 0x00, 0x00, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return led_max < sizeof(g_rgb_frame_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
181
keyboards/betalupi_ergodox/betalupi_ergodox.c
Normal file
181
keyboards/betalupi_ergodox/betalupi_ergodox.c
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
#include "betalupi_ergodox.h"
|
||||||
|
#include "features/beta_rawhid.h"
|
||||||
|
|
||||||
|
extern inline void ergodox_board_led_on(void);
|
||||||
|
extern inline void ergodox_right_led_1_on(void);
|
||||||
|
extern inline void ergodox_right_led_2_on(void);
|
||||||
|
extern inline void ergodox_right_led_3_on(void);
|
||||||
|
extern inline void ergodox_right_led_on(uint8_t led);
|
||||||
|
|
||||||
|
extern inline void ergodox_board_led_off(void);
|
||||||
|
extern inline void ergodox_right_led_1_off(void);
|
||||||
|
extern inline void ergodox_right_led_2_off(void);
|
||||||
|
extern inline void ergodox_right_led_3_off(void);
|
||||||
|
extern inline void ergodox_right_led_off(uint8_t led);
|
||||||
|
|
||||||
|
extern inline void ergodox_led_all_on(void);
|
||||||
|
extern inline void ergodox_led_all_off(void);
|
||||||
|
|
||||||
|
extern inline void ergodox_right_led_1_set(uint8_t n);
|
||||||
|
extern inline void ergodox_right_led_2_set(uint8_t n);
|
||||||
|
extern inline void ergodox_right_led_3_set(uint8_t n);
|
||||||
|
extern inline void ergodox_right_led_set(uint8_t led, uint8_t n);
|
||||||
|
|
||||||
|
extern inline void ergodox_led_all_set(uint8_t n);
|
||||||
|
|
||||||
|
keyboard_config_t keyboard_config;
|
||||||
|
bool i2c_initialized = 0;
|
||||||
|
i2c_status_t mcp23018_status = 0x20;
|
||||||
|
|
||||||
|
void matrix_init_kb(void) {
|
||||||
|
// keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md")
|
||||||
|
TCCR1A = 0b10101001; // set and configure fast PWM
|
||||||
|
TCCR1B = 0b00001001; // set and configure fast PWM
|
||||||
|
|
||||||
|
// (tied to Vcc for hardware convenience)
|
||||||
|
DDRB &= ~(1<<4); // set B(4) as input
|
||||||
|
PORTB &= ~(1<<4); // set B(4) internal pull-up disabled
|
||||||
|
|
||||||
|
// unused pins - C7, D4, D5, D7, E6
|
||||||
|
// set as input with internal pull-up enabled
|
||||||
|
DDRC &= ~(1<<7);
|
||||||
|
DDRD &= ~(1<<5 | 1<<4);
|
||||||
|
DDRE &= ~(1<<6);
|
||||||
|
PORTC |= (1<<7);
|
||||||
|
PORTD |= (1<<5 | 1<<4);
|
||||||
|
PORTE |= (1<<6);
|
||||||
|
|
||||||
|
keyboard_config.raw = eeconfig_read_kb();
|
||||||
|
|
||||||
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
|
if (keyboard_config.rgb_matrix_enable) {
|
||||||
|
rgb_matrix_set_flags(LED_FLAG_ALL);
|
||||||
|
} else {
|
||||||
|
rgb_matrix_set_flags(LED_FLAG_NONE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ergodox_blink_all_leds();
|
||||||
|
matrix_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ergodox_blink_all_leds(void) {
|
||||||
|
ergodox_led_all_off();
|
||||||
|
ergodox_led_all_set(LED_BRIGHTNESS_DEFAULT);
|
||||||
|
|
||||||
|
ergodox_right_led_1_on();
|
||||||
|
_delay_ms(50);
|
||||||
|
ergodox_right_led_2_on();
|
||||||
|
_delay_ms(50);
|
||||||
|
ergodox_right_led_3_on();
|
||||||
|
_delay_ms(50);
|
||||||
|
|
||||||
|
ergodox_right_led_1_off();
|
||||||
|
_delay_ms(50);
|
||||||
|
ergodox_right_led_2_off();
|
||||||
|
_delay_ms(50);
|
||||||
|
ergodox_right_led_3_off();
|
||||||
|
|
||||||
|
ergodox_led_all_off();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t init_mcp23018(void) {
|
||||||
|
mcp23018_status = 0x20;
|
||||||
|
|
||||||
|
// I2C subsystem
|
||||||
|
|
||||||
|
// uint8_t sreg_prev;
|
||||||
|
// sreg_prev=SREG;
|
||||||
|
// cli();
|
||||||
|
|
||||||
|
if (i2c_initialized == 0) {
|
||||||
|
i2c_init(); // on pins D(1,0)
|
||||||
|
i2c_initialized = true;
|
||||||
|
_delay_ms(1000);
|
||||||
|
}
|
||||||
|
// i2c_init(); // on pins D(1,0)
|
||||||
|
// _delay_ms(1000);
|
||||||
|
|
||||||
|
// set pin direction
|
||||||
|
// - unused : input : 1
|
||||||
|
// - input : input : 1
|
||||||
|
// - driving : output : 0
|
||||||
|
mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
|
mcp23018_status = i2c_write(IODIRA, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
|
mcp23018_status = i2c_write(0b00000000, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
|
mcp23018_status = i2c_write(0b00111111, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
|
i2c_stop();
|
||||||
|
|
||||||
|
// set pull-up
|
||||||
|
// - unused : on : 1
|
||||||
|
// - input : on : 1
|
||||||
|
// - driving : off : 0
|
||||||
|
mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
|
mcp23018_status = i2c_write(GPPUA, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
|
mcp23018_status = i2c_write(0b00000000, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
|
mcp23018_status = i2c_write(0b00111111, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
|
|
||||||
|
out:
|
||||||
|
i2c_stop();
|
||||||
|
|
||||||
|
// SREG=sreg_prev;
|
||||||
|
|
||||||
|
return mcp23018_status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void keyboard_post_init_kb(void) {
|
||||||
|
|
||||||
|
// Start with matrix enabled
|
||||||
|
// (We enable RGB effects and layer colors seperately)
|
||||||
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
|
rgb_matrix_enable_noeeprom();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Start with backlight disabled
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
#ifdef RGBLIGHT_OFF_AT_START
|
||||||
|
rgblight_disable_noeeprom();
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
keyboard_post_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
// EEPROM is getting reset!
|
||||||
|
void eeconfig_init_kb(void) {
|
||||||
|
keyboard_config.raw = 0;
|
||||||
|
keyboard_config.led_level = 4;
|
||||||
|
keyboard_config.rgb_matrix_enable = true;
|
||||||
|
eeconfig_update_kb(keyboard_config.raw);
|
||||||
|
eeconfig_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
layer_state_t layer_state_set_kb(layer_state_t state) {
|
||||||
|
//uint8_t layer = biton32(state);
|
||||||
|
|
||||||
|
hid_send_state(
|
||||||
|
.state = state
|
||||||
|
);
|
||||||
|
return layer_state_set_user(state);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void matrix_scan_kb(void) {
|
||||||
|
|
||||||
|
#ifdef CAPS_LOCK_STATUS
|
||||||
|
led_t led_state = host_keyboard_led_state();
|
||||||
|
if(led_state.caps_lock) {
|
||||||
|
ergodox_right_led_3_on();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
uint8_t layer = get_highest_layer(layer_state);
|
||||||
|
if(layer != 3) {
|
||||||
|
ergodox_right_led_3_off();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
matrix_scan_user();
|
||||||
|
}
|
105
keyboards/betalupi_ergodox/betalupi_ergodox.h
Normal file
105
keyboards/betalupi_ergodox/betalupi_ergodox.h
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "quantum.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "i2c_master.h"
|
||||||
|
#include "hardware/macros.h"
|
||||||
|
|
||||||
|
// I2C aliases and register addresses (see "mcp23018.md")
|
||||||
|
#define I2C_ADDR 0b0100000
|
||||||
|
#define I2C_ADDR_WRITE ( (I2C_ADDR<<1) | I2C_WRITE )
|
||||||
|
#define I2C_ADDR_READ ( (I2C_ADDR<<1) | I2C_READ )
|
||||||
|
#define IODIRA 0x00 // i/o direction register
|
||||||
|
#define IODIRB 0x01
|
||||||
|
#define GPPUA 0x0C // GPIO pull-up resistor register
|
||||||
|
#define GPPUB 0x0D
|
||||||
|
#define GPIOA 0x12 // general purpose i/o port register (write modifies OLAT)
|
||||||
|
#define GPIOB 0x13
|
||||||
|
#define OLATA 0x14 // output latch register
|
||||||
|
#define OLATB 0x15
|
||||||
|
|
||||||
|
extern i2c_status_t mcp23018_status;
|
||||||
|
#define ERGODOX_EZ_I2C_TIMEOUT 100
|
||||||
|
|
||||||
|
void init_ergodox(void);
|
||||||
|
void ergodox_blink_all_leds(void);
|
||||||
|
uint8_t init_mcp23018(void);
|
||||||
|
|
||||||
|
#ifndef LED_BRIGHTNESS_LO
|
||||||
|
#define LED_BRIGHTNESS_LO 15
|
||||||
|
#endif
|
||||||
|
#ifndef LED_BRIGHTNESS_HI
|
||||||
|
#define LED_BRIGHTNESS_HI 255
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
inline void ergodox_board_led_on(void) { DDRD |= (1<<6); PORTD |= (1<<6); }
|
||||||
|
inline void ergodox_right_led_1_on(void) { DDRB |= (1<<5); PORTB |= (1<<5); }
|
||||||
|
inline void ergodox_right_led_2_on(void) { DDRB |= (1<<6); PORTB |= (1<<6); }
|
||||||
|
inline void ergodox_right_led_3_on(void) { DDRB |= (1<<7); PORTB |= (1<<7); }
|
||||||
|
inline void ergodox_right_led_on(uint8_t led) { DDRB |= (1<<(led+4)); PORTB |= (1<<(led+4)); }
|
||||||
|
|
||||||
|
inline void ergodox_board_led_off(void) { DDRD &= ~(1<<6); PORTD &= ~(1<<6); }
|
||||||
|
inline void ergodox_right_led_1_off(void) { DDRB &= ~(1<<5); PORTB &= ~(1<<5); }
|
||||||
|
inline void ergodox_right_led_2_off(void) { DDRB &= ~(1<<6); PORTB &= ~(1<<6); }
|
||||||
|
inline void ergodox_right_led_3_off(void) { DDRB &= ~(1<<7); PORTB &= ~(1<<7); }
|
||||||
|
inline void ergodox_right_led_off(uint8_t led) { DDRB &= ~(1<<(led+4)); PORTB &= ~(1<<(led+4)); }
|
||||||
|
|
||||||
|
|
||||||
|
inline void ergodox_led_all_on(void) {
|
||||||
|
ergodox_board_led_on();
|
||||||
|
ergodox_right_led_1_on();
|
||||||
|
ergodox_right_led_2_on();
|
||||||
|
ergodox_right_led_3_on();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ergodox_led_all_off(void) {
|
||||||
|
ergodox_board_led_off();
|
||||||
|
ergodox_right_led_1_off();
|
||||||
|
ergodox_right_led_2_off();
|
||||||
|
ergodox_right_led_3_off();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ergodox_right_led_1_set(uint8_t n) { OCR1A = n; }
|
||||||
|
inline void ergodox_right_led_2_set(uint8_t n) { OCR1B = n; }
|
||||||
|
inline void ergodox_right_led_3_set(uint8_t n) { OCR1C = n; }
|
||||||
|
inline void ergodox_right_led_set(uint8_t led, uint8_t n) {
|
||||||
|
(led == 1) ? (OCR1A = n) :
|
||||||
|
(led == 2) ? (OCR1B = n) :
|
||||||
|
(OCR1C = n);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ergodox_led_all_set(uint8_t n) {
|
||||||
|
ergodox_right_led_1_set(n);
|
||||||
|
ergodox_right_led_2_set(n);
|
||||||
|
ergodox_right_led_3_set(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum betalupi_keycodes {
|
||||||
|
LED_LEVEL = SAFE_RANGE,
|
||||||
|
TOGGLE_LAYER_COLOR,
|
||||||
|
// Custom RGBLIGHT macros
|
||||||
|
LIGHT_TOG, // Toggle backlight
|
||||||
|
LIGHT_HUI, // Increase backlight hue
|
||||||
|
LIGHT_HUD, // Decrease backlight hue
|
||||||
|
LIGHT_SAI, // Increase backlight sat
|
||||||
|
LIGHT_SAD, // Decrease backlight sat
|
||||||
|
LIGHT_VAI, // Increase backlight val
|
||||||
|
LIGHT_VAD, // Decrease backlight val
|
||||||
|
LIGHT_SPI, // Increase backlight speed
|
||||||
|
LIGHT_SPD, // Decrease backlight speed
|
||||||
|
LIGHT_MOD, // Change backlight animation mode
|
||||||
|
BETA_SAFE_RANGE
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
uint32_t raw;
|
||||||
|
struct {
|
||||||
|
uint8_t led_level :3;
|
||||||
|
bool disable_layer_led :1;
|
||||||
|
bool rgb_matrix_enable :1;
|
||||||
|
};
|
||||||
|
} keyboard_config_t;
|
||||||
|
|
||||||
|
extern keyboard_config_t keyboard_config;
|
@ -1,15 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "config_common.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// USB parameters
|
// USB parameters
|
||||||
#define VENDOR_ID 0x3297 // ZSA Labs
|
|
||||||
#define PRODUCT_ID 0x4976 // Ergodox glow variant
|
|
||||||
#define DEVICE_VER 0x0002
|
|
||||||
#define MANUFACTURER Betalupi
|
|
||||||
#define PRODUCT Betalupi ErgoDox
|
|
||||||
#define WEBUSB_LANDING_PAGE_URL u8"betalupi.com"
|
|
||||||
#define USB_MAX_POWER_CONSUMPTION 500
|
#define USB_MAX_POWER_CONSUMPTION 500
|
||||||
#define USB_SUSPEND_WAKEUP_DELAY 0
|
#define USB_SUSPEND_WAKEUP_DELAY 0
|
||||||
|
|
||||||
@ -56,7 +48,7 @@
|
|||||||
// with keys that convert to other keys on hold
|
// with keys that convert to other keys on hold
|
||||||
// (z becomes ctrl when you hold it, and when this option isn't
|
// (z becomes ctrl when you hold it, and when this option isn't
|
||||||
// enabled, z rapidly followed by x actually sends Ctrl-x)
|
// enabled, z rapidly followed by x actually sends Ctrl-x)
|
||||||
#define IGNORE_MOD_TAP_INTERRUPT
|
//#define IGNORE_MOD_TAP_INTERRUPT
|
||||||
|
|
||||||
#define MOUSEKEY_INTERVAL 20
|
#define MOUSEKEY_INTERVAL 20
|
||||||
#define MOUSEKEY_DELAY 0
|
#define MOUSEKEY_DELAY 0
|
||||||
@ -75,10 +67,9 @@
|
|||||||
#define LED_BRIGHTNESS_DEFAULT (LED_BRIGHTNESS_LO)
|
#define LED_BRIGHTNESS_DEFAULT (LED_BRIGHTNESS_LO)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// RGBLight (Underglow) config
|
// RGBLight (Underglow) config
|
||||||
#define RGBLED_NUM 8
|
#define RGBLED_NUM 8
|
||||||
#define RGB_DI_PIN D7
|
#define WS2812_DI_PIN D7
|
||||||
|
|
||||||
#define RGBLIGHT_HUE_STEP 10
|
#define RGBLIGHT_HUE_STEP 10
|
||||||
#define RGBLIGHT_SAT_STEP 16
|
#define RGBLIGHT_SAT_STEP 16
|
||||||
@ -86,7 +77,7 @@
|
|||||||
// Max brightness
|
// Max brightness
|
||||||
#define RGBLIGHT_LIMIT_VAL 200
|
#define RGBLIGHT_LIMIT_VAL 200
|
||||||
|
|
||||||
//#define RGBLIGHT_OFF_AT_START
|
#define RGBLIGHT_OFF_AT_START
|
||||||
//#define RGBLIGHT_NO_EEPROM
|
//#define RGBLIGHT_NO_EEPROM
|
||||||
|
|
||||||
// Prevents RGB keycodes from affecting underglow.
|
// Prevents RGB keycodes from affecting underglow.
|
||||||
@ -107,7 +98,7 @@
|
|||||||
#define DRIVER_COUNT 2
|
#define DRIVER_COUNT 2
|
||||||
#define DRIVER_1_LED_TOTAL 24
|
#define DRIVER_1_LED_TOTAL 24
|
||||||
#define DRIVER_2_LED_TOTAL 24
|
#define DRIVER_2_LED_TOTAL 24
|
||||||
#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||||
|
|
||||||
#define RGB_MATRIX_HUE_STEP 10
|
#define RGB_MATRIX_HUE_STEP 10
|
||||||
#define RGB_MATRIX_SAT_STEP 16
|
#define RGB_MATRIX_SAT_STEP 16
|
||||||
@ -121,34 +112,12 @@
|
|||||||
// limits in milliseconds how frequently an animation will update the LEDs.
|
// limits in milliseconds how frequently an animation will update the LEDs.
|
||||||
// 16 (16ms) is equivalent to limiting to 60fps
|
// 16 (16ms) is equivalent to limiting to 60fps
|
||||||
// (increases keyboard responsiveness)
|
// (increases keyboard responsiveness)
|
||||||
#define RGB_MATRIX_LED_FLUSH_LIMIT 26
|
#define RGB_MATRIX_LED_FLUSH_LIMIT 16
|
||||||
|
|
||||||
// turn off effects when suspended
|
// turn off effects when suspended
|
||||||
#define RGB_DISABLE_WHEN_USB_SUSPENDED true
|
#define RGB_DISABLE_WHEN_USB_SUSPENDED true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Misc
|
|
||||||
/* key combination for command */
|
|
||||||
#define IS_COMMAND() ( \
|
|
||||||
get_mods() == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) || \
|
|
||||||
get_mods() == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \
|
|
||||||
)
|
|
||||||
|
|
||||||
// Not sure what this does.
|
// Not sure what this does.
|
||||||
// ZSA says: "fixes space cadet rollover issue"
|
// ZSA says: "fixes space cadet rollover issue"
|
||||||
#define DISABLE_SPACE_CADET_ROLLOVER
|
#define DISABLE_SPACE_CADET_ROLLOVER
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Disable unnecessary features
|
|
||||||
//#define NO_DEBUG
|
|
||||||
//#define NO_PRINT
|
|
||||||
//#define DEBUG_MATRIX_SCAN_RATE
|
|
||||||
|
|
||||||
//#define NO_ACTION_LAYER
|
|
||||||
//#define NO_ACTION_TAPPING
|
|
||||||
//#define NO_ACTION_ONESHOT
|
|
||||||
#define NO_ACTION_MACRO
|
|
||||||
#define NO_ACTION_FUNCTION
|
|
||||||
|
|
48
keyboards/betalupi_ergodox/extra_mappings.c
Normal file
48
keyboards/betalupi_ergodox/extra_mappings.c
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#include "extra_mappings.h"
|
||||||
|
|
||||||
|
// Maps fft columns to leds.
|
||||||
|
// fft_col_to_array[i] returns an array of leds in the ith bin of the fft.
|
||||||
|
// Negative indices are "invisible" leds.
|
||||||
|
// Use them when your keyboard has gaps.
|
||||||
|
//
|
||||||
|
// This layout is for the Ergodox EZ.
|
||||||
|
const int8_t fft_col_to_array[10][5] = {
|
||||||
|
{ 47, 43, 38, 33, 28 },
|
||||||
|
{ 46, 42, 37, 32, 27 },
|
||||||
|
{ 45, 41, 36, 31, 26 },
|
||||||
|
{ 44, 40, 35, 30, 25 },
|
||||||
|
{ -1, 39, 34, 29, 24 },
|
||||||
|
{ -1, 15, 10, 5, 0 },
|
||||||
|
{ 20, 16, 11, 6, 1 },
|
||||||
|
{ 21, 17, 12, 7, 2 },
|
||||||
|
{ 22, 18, 13, 8, 3 },
|
||||||
|
{ 23, 19, 14, 9, 4 }
|
||||||
|
};
|
||||||
|
|
||||||
|
// This is the inverse of fft_col_to_array.
|
||||||
|
//
|
||||||
|
// Each number represets a bin and a height:
|
||||||
|
// x % bin_height = height,
|
||||||
|
// x / bin_height = bin
|
||||||
|
//
|
||||||
|
// Indices are [col][row].
|
||||||
|
const int8_t fft_array_to_col[4][14] = {
|
||||||
|
// Right side
|
||||||
|
{ 29, 34, 39, 44, 49,
|
||||||
|
28, 33, 38, 43, 48,
|
||||||
|
27, 32, 37, 42},{47,
|
||||||
|
26, 31, 36, 41, 46,
|
||||||
|
30, 35, 40, 45,
|
||||||
|
|
||||||
|
// Left side, mirrored
|
||||||
|
24, 19, 14, 9},{ 4,
|
||||||
|
23, 18, 13, 8, 3,
|
||||||
|
22, 17, 12, 7, 2,
|
||||||
|
21, 16, 11},{ 6, 1,
|
||||||
|
20, 15, 10, 5, 0,
|
||||||
|
|
||||||
|
// No keys here, fill array length
|
||||||
|
0, 0, 0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
16
keyboards/betalupi_ergodox/extra_mappings.h
Normal file
16
keyboards/betalupi_ergodox/extra_mappings.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
extern const int8_t fft_array_to_col[4][14];
|
||||||
|
extern const int8_t fft_col_to_array[10][5];
|
||||||
|
|
||||||
|
extern uint8_t layer_layouts[];
|
||||||
|
|
||||||
|
// Language keymap ids for layers.
|
||||||
|
// See layers/definitions/symbols.h.
|
||||||
|
enum layer_layout_ids {
|
||||||
|
LAYOUT_NULL, // This layer doesn't care what keymap the OS is using
|
||||||
|
LAYOUT_EN, // This layer is designed for the standard keymapping
|
||||||
|
LAYOUT_RU,
|
||||||
|
};
|
184
keyboards/betalupi_ergodox/features/autocorrect/autocorrect.c
Normal file
184
keyboards/betalupi_ergodox/features/autocorrect/autocorrect.c
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
#include "autocorrect.h"
|
||||||
|
#include <string.h>
|
||||||
|
#include "autocorrect_data.h"
|
||||||
|
|
||||||
|
#if AUTOCORRECTION_MIN_LENGTH < 4
|
||||||
|
// Odd output or hard locks on the board have been observed when the min typo
|
||||||
|
// length is 3 or lower (https://github.com/getreuer/qmk-keymap/issues/2).
|
||||||
|
// Additionally, autocorrection entries for short typos are more likely to false
|
||||||
|
// trigger, so it is suggested that typos be at least 5 characters.
|
||||||
|
#error "Min typo length is less than 4. Autocorrection may behave poorly."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool process_autocorrection(uint16_t keycode, keyrecord_t* record) {
|
||||||
|
static uint8_t typo_buffer[AUTOCORRECTION_MAX_LENGTH] = {0};
|
||||||
|
static uint8_t typo_buffer_size = 0;
|
||||||
|
|
||||||
|
// Ignore key release; we only process key presses.
|
||||||
|
if (!record->event.pressed) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef NO_ACTION_ONESHOT
|
||||||
|
const uint8_t mods = get_mods() | get_oneshot_mods();
|
||||||
|
#else
|
||||||
|
const uint8_t mods = get_mods();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Disable autocorrection while a mod other than shift is active.
|
||||||
|
if ((mods & ~MOD_MASK_SHIFT) != 0) {
|
||||||
|
typo_buffer_size = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The following switch cases address various kinds of keycodes. This logic is
|
||||||
|
// split over two switches rather than merged into one. The first switch may
|
||||||
|
// extract a basic keycode which is then further handled by the second switch,
|
||||||
|
// e.g. a layer-tap key with Caps Lock `LT(layer, KC_CAPS)`.
|
||||||
|
switch (keycode) {
|
||||||
|
#ifndef NO_ACTION_TAPPING
|
||||||
|
case QK_MOD_TAP ... QK_MOD_TAP_MAX: // Tap-hold keys.
|
||||||
|
#ifndef NO_ACTION_LAYER
|
||||||
|
case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (record->tap.count == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// Otherwise when tapped, get the basic keycode.
|
||||||
|
// Fallthrough intended.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Handle shifted keys, e.g. symbols like KC_EXLM = S(KC_1).
|
||||||
|
case QK_LSFT ... QK_LSFT + 255:
|
||||||
|
case QK_RSFT ... QK_RSFT + 255:
|
||||||
|
keycode &= 0xff; // Get the basic keycode.
|
||||||
|
break;
|
||||||
|
|
||||||
|
// NOTE: Space Cadet keys expose no info to check whether they are being
|
||||||
|
// tapped vs. held. This makes autocorrection ambiguous, e.g. KC_LCPO
|
||||||
|
// might be '(', which we would treat as a word break, or it might be
|
||||||
|
// shift, which we would treat as having no effect. To behave cautiously,
|
||||||
|
// we allow Space Cadet keycodes to fall to the logic below and clear
|
||||||
|
// autocorrection state.
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (keycode) {
|
||||||
|
// Ignore shifts, Caps Lock, one-shot mods, and layer switch keys.
|
||||||
|
case KC_NO:
|
||||||
|
case KC_LSFT:
|
||||||
|
case KC_RSFT:
|
||||||
|
case KC_CAPS:
|
||||||
|
case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX:
|
||||||
|
case QK_TO ... QK_TO_MAX:
|
||||||
|
case QK_MOMENTARY ... QK_MOMENTARY_MAX:
|
||||||
|
case QK_DEF_LAYER ... QK_DEF_LAYER_MAX:
|
||||||
|
case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX:
|
||||||
|
case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX:
|
||||||
|
case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX:
|
||||||
|
case QK_LAYER_MOD ... QK_LAYER_MOD_MAX:
|
||||||
|
return true; // Ignore these keys.
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keycode == KC_QUOT) {
|
||||||
|
// Treat " (shifted ') as a word boundary.
|
||||||
|
if ((mods & MOD_MASK_SHIFT) != 0) {
|
||||||
|
keycode = KC_SPC;
|
||||||
|
}
|
||||||
|
} else if (!(KC_A <= keycode && keycode <= KC_Z)) {
|
||||||
|
if (keycode == KC_BSPC) {
|
||||||
|
// Remove last character from the buffer.
|
||||||
|
if (typo_buffer_size > 0) {
|
||||||
|
--typo_buffer_size;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else if (KC_1 <= keycode && keycode <= KC_SLSH && keycode != KC_ESC) {
|
||||||
|
// Set a word boundary if space, period, digit, etc. is pressed.
|
||||||
|
// Behave more conservatively for the enter key. Reset, so that enter
|
||||||
|
// can't be used on a word ending.
|
||||||
|
if (keycode == KC_ENT) {
|
||||||
|
typo_buffer_size = 0;
|
||||||
|
}
|
||||||
|
keycode = KC_SPC;
|
||||||
|
} else {
|
||||||
|
// Clear state if some other non-alpha key is pressed.
|
||||||
|
typo_buffer_size = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the buffer is full, rotate it to discard the oldest character.
|
||||||
|
if (typo_buffer_size >= AUTOCORRECTION_MAX_LENGTH) {
|
||||||
|
memmove(typo_buffer, typo_buffer + 1, AUTOCORRECTION_MAX_LENGTH - 1);
|
||||||
|
typo_buffer_size = AUTOCORRECTION_MAX_LENGTH - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append `keycode` to the buffer.
|
||||||
|
// NOTE: `keycode` must be a basic keycode (0-255) by this point.
|
||||||
|
typo_buffer[typo_buffer_size++] = (uint8_t)keycode;
|
||||||
|
// Early return if not many characters have been buffered so far.
|
||||||
|
if (typo_buffer_size < AUTOCORRECTION_MIN_LENGTH) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check whether the buffer ends in a typo. This is done using a trie
|
||||||
|
// stored in `autocorrection_data`.
|
||||||
|
uint16_t state = 0;
|
||||||
|
uint8_t code = pgm_read_byte(autocorrection_data + state);
|
||||||
|
for (int i = typo_buffer_size - 1; i >= 0; --i) {
|
||||||
|
const uint8_t key_i = typo_buffer[i];
|
||||||
|
|
||||||
|
if (code & 64) { // Check for match in node with multiple children.
|
||||||
|
code &= 63;
|
||||||
|
for (; code != key_i; code = pgm_read_byte(autocorrection_data + (state += 3))) {
|
||||||
|
if (!code) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Follow link to child node.
|
||||||
|
state = (uint16_t)(
|
||||||
|
(uint_fast16_t) pgm_read_byte(
|
||||||
|
autocorrection_data + state + 1
|
||||||
|
) |
|
||||||
|
(uint_fast16_t) pgm_read_byte(
|
||||||
|
autocorrection_data + state + 2
|
||||||
|
) << 8
|
||||||
|
);
|
||||||
|
|
||||||
|
// Otherwise check for match in node with a single child.
|
||||||
|
} else if (code != key_i) {
|
||||||
|
return true;
|
||||||
|
} else if (!(code = pgm_read_byte(autocorrection_data + (++state)))) {
|
||||||
|
++state;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop if `state` becomes an invalid index. This should not normally
|
||||||
|
// happen, it is a safeguard in case of a bug, data corruption, etc.
|
||||||
|
if (state >= sizeof(autocorrection_data)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read first byte of the next node.
|
||||||
|
code = pgm_read_byte(autocorrection_data + state);
|
||||||
|
|
||||||
|
if (code & 128) { // A typo was found! Apply autocorrection.
|
||||||
|
const int backspaces = code & 63;
|
||||||
|
for (int i = 0; i < backspaces; ++i) {
|
||||||
|
tap_code(KC_BSPC);
|
||||||
|
}
|
||||||
|
send_string_P((char const*)(autocorrection_data + state + 1));
|
||||||
|
|
||||||
|
if (keycode == KC_SPC) {
|
||||||
|
typo_buffer[0] = KC_SPC;
|
||||||
|
typo_buffer_size = 1;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
typo_buffer_size = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
111
keyboards/betalupi_ergodox/features/autocorrect/autocorrect.h
Normal file
111
keyboards/betalupi_ergodox/features/autocorrect/autocorrect.h
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
// Copyright 2021-2022 Google LLC
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file autocorrection.h
|
||||||
|
* @brief Autocorrection on your keyboard.
|
||||||
|
*
|
||||||
|
* Overview
|
||||||
|
* --------
|
||||||
|
*
|
||||||
|
* Some words are more prone to typos than others. This userspace QMK library
|
||||||
|
* implements rudimentary autocorrection, automatically detecting and fixing
|
||||||
|
* some misspellings.
|
||||||
|
*
|
||||||
|
* Features:
|
||||||
|
*
|
||||||
|
* * It runs on your keyboard, so it is always active no matter what software.
|
||||||
|
* * Low resource cost.
|
||||||
|
* * It is case insensitive.
|
||||||
|
* * It works within words, useful for programming to catch typos within longer
|
||||||
|
* identifiers.
|
||||||
|
*
|
||||||
|
* Limitations:
|
||||||
|
*
|
||||||
|
* * It is limited to alphabet characters a–z, apostrophes ', and word breaks.
|
||||||
|
* I'm sorry this probably isn't useful for languages besides English.
|
||||||
|
* * It does not follow mouse or hotkey driven cursor movement.
|
||||||
|
*
|
||||||
|
* Changing the autocorrection dictionary
|
||||||
|
* --------------------------------------
|
||||||
|
*
|
||||||
|
* The file autocorrection_data.h encodes the typos to correct. While you could
|
||||||
|
* simply use the version of this file provided above for a practical
|
||||||
|
* configuration, you can make your own to personalize the autocorrection to
|
||||||
|
* your most troublesome typos:
|
||||||
|
*
|
||||||
|
* Step 1: First, create an autocorrection dictionary autocorrection_dict.txt,
|
||||||
|
* in a form like
|
||||||
|
*
|
||||||
|
* :thier -> their
|
||||||
|
* dosen't -> doesn't
|
||||||
|
* fitler -> filter
|
||||||
|
* ouput -> output
|
||||||
|
* widht -> width
|
||||||
|
*
|
||||||
|
* For a practical 71-entry example, see autocorrection_dict.txt. And for a yet
|
||||||
|
* larger 400-entry example, see autocorrection_dict_extra.txt.
|
||||||
|
*
|
||||||
|
* The syntax is `typo -> correction`. Typos and corrections are case
|
||||||
|
* insensitive, and any whitespace before or after the typo and correction is
|
||||||
|
* ignored. The typo must be only the characters a-z, ', or the special
|
||||||
|
* character : representing a word break. The correction may have just about any
|
||||||
|
* printable ASCII characters.
|
||||||
|
*
|
||||||
|
* Step 2: Use the make_autocorrection_data.py Python script to process the
|
||||||
|
* dictionary. Put autocorrection_dict.txt in the same directory as the Python
|
||||||
|
* script and run
|
||||||
|
*
|
||||||
|
* $ python3 make_autocorrection_data.py
|
||||||
|
* Processed 71 autocorrection entries to table with 1120 bytes.
|
||||||
|
*
|
||||||
|
* The script arranges the entries in autocorrection_dict.txt into a trie and
|
||||||
|
* generates autocorrection_data.h with the serialized trie embedded as an
|
||||||
|
* array. The .h file will be written in the same directory.
|
||||||
|
*
|
||||||
|
* Step 3: Finally, recompile and flash your keymap.
|
||||||
|
*
|
||||||
|
* For full documentation, see
|
||||||
|
* <https://getreuer.info/posts/keyboards/autocorrection>
|
||||||
|
*
|
||||||
|
* @author Pascal Getreuer
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "quantum.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler function for autocorrection.
|
||||||
|
*
|
||||||
|
* Call this function in keymap.c from `process_record_user()` like
|
||||||
|
*
|
||||||
|
* #include "features/autocorrection.h"
|
||||||
|
*
|
||||||
|
* bool process_record_user(uint16_t keycode, keyrecord_t* record) {
|
||||||
|
* if (!process_autocorrection(keycode, record)) { return false; }
|
||||||
|
* // Your macros...
|
||||||
|
*
|
||||||
|
* return true;
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
bool process_autocorrection(uint16_t keycode, keyrecord_t* record);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
@ -0,0 +1,238 @@
|
|||||||
|
// Generated code.
|
||||||
|
|
||||||
|
// Autocorrection dictionary (132 entries):
|
||||||
|
// :agian -> again
|
||||||
|
// :agred -> agreed
|
||||||
|
// :ajust -> adjust
|
||||||
|
// :alot: -> a lot
|
||||||
|
// :andteh -> and the
|
||||||
|
// :andthe -> and the
|
||||||
|
// :anual -> annual
|
||||||
|
// :asign -> assign
|
||||||
|
// :asthe -> as the
|
||||||
|
// :atthe -> at the
|
||||||
|
// :casue -> cause
|
||||||
|
// :eveyr -> every
|
||||||
|
// :foudn -> found
|
||||||
|
// :gaurd -> guard
|
||||||
|
// :goign -> going
|
||||||
|
// :gonig -> going
|
||||||
|
// :graet -> great
|
||||||
|
// :haev -> have
|
||||||
|
// :htere -> there
|
||||||
|
// :htikn -> think
|
||||||
|
// :htink -> think
|
||||||
|
// :hwihc -> which
|
||||||
|
// :hwile -> while
|
||||||
|
// :idaes -> ideas
|
||||||
|
// :jstu: -> just
|
||||||
|
// :jsut: -> just
|
||||||
|
// :knwo -> know
|
||||||
|
// :konw -> know
|
||||||
|
// :kwno -> know
|
||||||
|
// :moeny -> money
|
||||||
|
// :olther -> other
|
||||||
|
// :otehr -> other
|
||||||
|
// :owudl -> would
|
||||||
|
// :sicne -> since
|
||||||
|
// :the:the: -> the
|
||||||
|
// :theri -> their
|
||||||
|
// :thier -> their
|
||||||
|
// :thsoe -> those
|
||||||
|
// :tothe -> to the
|
||||||
|
// :yaers -> years
|
||||||
|
// :yeasr -> years
|
||||||
|
// abbout -> about
|
||||||
|
// abotu -> about
|
||||||
|
// abouta -> about a
|
||||||
|
// aboutit -> about it
|
||||||
|
// aboutthe -> about the
|
||||||
|
// almsot -> almost
|
||||||
|
// alomst -> almost
|
||||||
|
// alwasy -> always
|
||||||
|
// alwyas -> always
|
||||||
|
// anohter -> another
|
||||||
|
// aroud -> around
|
||||||
|
// arround -> around
|
||||||
|
// arund -> around
|
||||||
|
// baceause -> because
|
||||||
|
// baout -> about
|
||||||
|
// beacuse -> because
|
||||||
|
// becasue -> because
|
||||||
|
// beccause -> because
|
||||||
|
// becouse -> because
|
||||||
|
// becuase -> because
|
||||||
|
// bedore -> before
|
||||||
|
// beeing -> being
|
||||||
|
// befoer -> before
|
||||||
|
// beteen -> between
|
||||||
|
// beween -> between
|
||||||
|
// bewteen -> between
|
||||||
|
// chekc -> check
|
||||||
|
// childen -> children
|
||||||
|
// chnage -> change
|
||||||
|
// claer -> clear
|
||||||
|
// comapny -> company
|
||||||
|
// contian -> contain
|
||||||
|
// coudl -> could
|
||||||
|
// didnot -> did not
|
||||||
|
// elasped -> elapsed
|
||||||
|
// firend -> friend
|
||||||
|
// firts -> first
|
||||||
|
// fitler -> filter
|
||||||
|
// follwo -> follow
|
||||||
|
// freind -> friend
|
||||||
|
// frequecy -> frequency
|
||||||
|
// fromthe -> from the
|
||||||
|
// heigth -> height
|
||||||
|
// iamge -> image
|
||||||
|
// inital -> initial
|
||||||
|
// intput -> input
|
||||||
|
// laguage -> language
|
||||||
|
// lenght -> length
|
||||||
|
// levle -> level
|
||||||
|
// libary -> library
|
||||||
|
// littel -> little
|
||||||
|
// mysefl -> myself
|
||||||
|
// ouptut -> output
|
||||||
|
// ouput -> output
|
||||||
|
// peaple -> people
|
||||||
|
// peolpe -> people
|
||||||
|
// peopel -> people
|
||||||
|
// poeople -> people
|
||||||
|
// poeple -> people
|
||||||
|
// probaly -> probably
|
||||||
|
// probelm -> problem
|
||||||
|
// raelly -> really
|
||||||
|
// realy -> really
|
||||||
|
// recrod -> record
|
||||||
|
// relaly -> really
|
||||||
|
// reponse -> response
|
||||||
|
// reprot -> report
|
||||||
|
// shoudl -> should
|
||||||
|
// singel -> single
|
||||||
|
// stregth -> strength
|
||||||
|
// strengh -> strength
|
||||||
|
// theese -> these
|
||||||
|
// therfore -> therefore
|
||||||
|
// thign -> thing
|
||||||
|
// thigsn -> things
|
||||||
|
// thikn -> think
|
||||||
|
// thiunk -> think
|
||||||
|
// thnigs -> things
|
||||||
|
// throught -> thought
|
||||||
|
// tihkn -> think
|
||||||
|
// tkaes -> takes
|
||||||
|
// todya -> today
|
||||||
|
// toghether -> together
|
||||||
|
// unkown -> unknown
|
||||||
|
// unqiue -> unique
|
||||||
|
// whcih -> which
|
||||||
|
// whihc -> which
|
||||||
|
// whlch -> which
|
||||||
|
// widht -> width
|
||||||
|
// wihch -> which
|
||||||
|
// woudl -> would
|
||||||
|
|
||||||
|
#define AUTOCORRECTION_MIN_LENGTH 5 // "abotu"
|
||||||
|
#define AUTOCORRECTION_MAX_LENGTH 9 // "toghether"
|
||||||
|
|
||||||
|
static const uint8_t autocorrection_data[1881] PROGMEM = {108, 61, 0, 4, 117, 0,
|
||||||
|
6, 141, 0, 7, 181, 0, 8, 52, 1, 10, 237, 2, 11, 8, 3, 12, 105, 3, 14, 115, 3,
|
||||||
|
15, 143, 3, 16, 12, 4, 17, 24, 4, 18, 234, 4, 21, 16, 5, 22, 152, 5, 23, 233,
|
||||||
|
5, 24, 190, 6, 25, 199, 6, 26, 208, 6, 28, 218, 6, 0, 72, 71, 0, 23, 81, 0,
|
||||||
|
24, 107, 0, 0, 11, 23, 44, 8, 11, 23, 44, 0, 132, 0, 82, 88, 0, 24, 98, 0, 0,
|
||||||
|
15, 4, 44, 0, 131, 32, 108, 111, 116, 0, 22, 13, 44, 0, 131, 117, 115, 116, 0,
|
||||||
|
23, 22, 13, 44, 0, 131, 117, 115, 116, 0, 87, 124, 0, 28, 133, 0, 0, 24, 18,
|
||||||
|
5, 4, 0, 128, 32, 97, 0, 7, 18, 23, 0, 129, 97, 121, 0, 75, 148, 0, 14, 173,
|
||||||
|
0, 0, 12, 0, 75, 157, 0, 26, 163, 0, 0, 26, 0, 129, 99, 104, 0, 11, 44, 0,
|
||||||
|
132, 119, 104, 105, 99, 104, 0, 8, 11, 6, 0, 129, 99, 107, 0, 72, 197, 0, 17,
|
||||||
|
223, 0, 18, 23, 1, 21, 33, 1, 24, 44, 1, 0, 83, 204, 0, 21, 215, 0, 0, 22, 4,
|
||||||
|
15, 8, 0, 131, 112, 115, 101, 100, 0, 10, 4, 44, 0, 128, 101, 100, 0, 72, 233,
|
||||||
|
0, 12, 244, 0, 24, 254, 0, 0, 21, 12, 9, 0, 132, 114, 105, 101, 110, 100, 0,
|
||||||
|
8, 21, 9, 0, 131, 105, 101, 110, 100, 0, 82, 5, 1, 21, 15, 1, 0, 21, 21, 4, 0,
|
||||||
|
132, 111, 117, 110, 100, 0, 4, 0, 130, 111, 117, 110, 100, 0, 21, 6, 8, 21, 0,
|
||||||
|
130, 111, 114, 100, 0, 24, 4, 10, 44, 0, 131, 117, 97, 114, 100, 0, 18, 21, 4,
|
||||||
|
0, 128, 110, 100, 0, 74, 80, 1, 11, 124, 1, 15, 205, 1, 17, 17, 2, 18, 27, 2,
|
||||||
|
19, 37, 2, 21, 47, 2, 22, 93, 2, 24, 198, 2, 0, 68, 87, 1, 16, 115, 1, 0, 81,
|
||||||
|
94, 1, 24, 103, 1, 0, 11, 6, 0, 131, 97, 110, 103, 101, 0, 10, 4, 15, 0, 132,
|
||||||
|
110, 103, 117, 97, 103, 101, 0, 4, 12, 0, 131, 109, 97, 103, 101, 0, 23, 0,
|
||||||
|
71, 142, 1, 16, 152, 1, 18, 162, 1, 22, 171, 1, 23, 180, 1, 0, 17, 4, 44, 0,
|
||||||
|
130, 32, 116, 104, 101, 0, 18, 21, 9, 0, 130, 32, 116, 104, 101, 0, 23, 44, 0,
|
||||||
|
130, 32, 116, 104, 101, 0, 4, 44, 0, 130, 32, 116, 104, 101, 0, 68, 187, 1,
|
||||||
|
24, 195, 1, 0, 44, 0, 130, 32, 116, 104, 101, 0, 18, 5, 4, 0, 130, 32, 116,
|
||||||
|
104, 101, 0, 76, 215, 1, 19, 226, 1, 25, 10, 2, 0, 26, 11, 44, 0, 132, 119,
|
||||||
|
104, 105, 108, 101, 0, 68, 236, 1, 8, 245, 1, 18, 255, 1, 0, 8, 19, 0, 131,
|
||||||
|
111, 112, 108, 101, 0, 18, 19, 0, 132, 101, 111, 112, 108, 101, 0, 8, 18, 19,
|
||||||
|
0, 133, 101, 111, 112, 108, 101, 0, 8, 15, 0, 129, 101, 108, 0, 6, 12, 22, 44,
|
||||||
|
0, 130, 110, 99, 101, 0, 22, 11, 23, 44, 0, 130, 111, 115, 101, 0, 15, 18, 8,
|
||||||
|
19, 0, 130, 112, 108, 101, 0, 72, 54, 2, 18, 65, 2, 0, 23, 11, 44, 0, 132,
|
||||||
|
116, 104, 101, 114, 101, 0, 71, 72, 2, 9, 81, 2, 0, 8, 5, 0, 131, 102, 111,
|
||||||
|
114, 101, 0, 21, 8, 11, 23, 0, 131, 101, 102, 111, 114, 101, 0, 68, 106, 2, 8,
|
||||||
|
117, 2, 17, 125, 2, 24, 138, 2, 0, 24, 6, 8, 5, 0, 131, 97, 117, 115, 101, 0,
|
||||||
|
8, 11, 23, 0, 130, 115, 101, 0, 18, 19, 8, 21, 0, 132, 115, 112, 111, 110,
|
||||||
|
115, 101, 0, 68, 148, 2, 6, 177, 2, 18, 188, 2, 0, 70, 155, 2, 8, 165, 2, 0,
|
||||||
|
6, 8, 5, 0, 132, 97, 117, 115, 101, 0, 6, 4, 5, 0, 134, 101, 99, 97, 117, 115,
|
||||||
|
101, 0, 4, 8, 5, 0, 132, 99, 97, 117, 115, 101, 0, 6, 8, 5, 0, 131, 97, 117,
|
||||||
|
115, 101, 0, 76, 205, 2, 22, 215, 2, 0, 20, 17, 24, 0, 131, 105, 113, 117,
|
||||||
|
101, 0, 4, 6, 0, 108, 225, 2, 8, 230, 2, 0, 130, 117, 115, 101, 0, 5, 0, 130,
|
||||||
|
117, 115, 101, 0, 76, 244, 2, 17, 254, 2, 0, 17, 18, 10, 44, 0, 130, 105, 110,
|
||||||
|
103, 0, 12, 8, 8, 5, 0, 131, 105, 110, 103, 0, 70, 24, 3, 8, 48, 3, 10, 60, 3,
|
||||||
|
12, 70, 3, 23, 79, 3, 0, 75, 31, 3, 15, 40, 3, 0, 12, 26, 0, 131, 104, 105,
|
||||||
|
99, 104, 0, 11, 26, 0, 130, 105, 99, 104, 0, 23, 7, 17, 4, 44, 0, 130, 32,
|
||||||
|
116, 104, 101, 0, 17, 8, 21, 23, 22, 0, 128, 116, 104, 0, 6, 11, 26, 0, 130,
|
||||||
|
105, 99, 104, 0, 10, 0, 72, 88, 3, 12, 98, 3, 0, 21, 23, 22, 0, 130, 110, 103,
|
||||||
|
116, 104, 0, 8, 11, 0, 129, 104, 116, 0, 21, 8, 11, 23, 44, 0, 129, 105, 114,
|
||||||
|
0, 17, 0, 76, 124, 3, 24, 135, 3, 0, 23, 11, 44, 0, 132, 116, 104, 105, 110,
|
||||||
|
107, 0, 12, 11, 23, 0, 130, 110, 107, 0, 68, 156, 3, 7, 182, 3, 8, 225, 3, 9,
|
||||||
|
3, 4, 0, 87, 163, 3, 24, 172, 3, 0, 12, 17, 12, 0, 129, 105, 97, 108, 0, 17,
|
||||||
|
4, 44, 0, 130, 110, 117, 97, 108, 0, 24, 0, 82, 191, 3, 26, 215, 3, 0, 70,
|
||||||
|
201, 3, 11, 205, 3, 26, 211, 3, 0, 129, 108, 100, 0, 22, 0, 129, 108, 100, 0,
|
||||||
|
129, 108, 100, 0, 18, 44, 0, 132, 119, 111, 117, 108, 100, 0, 74, 235, 3, 19,
|
||||||
|
243, 3, 23, 251, 3, 0, 17, 12, 22, 0, 129, 108, 101, 0, 18, 8, 19, 0, 129,
|
||||||
|
108, 101, 0, 23, 12, 15, 0, 129, 108, 101, 0, 8, 22, 28, 16, 0, 129, 108, 102,
|
||||||
|
0, 15, 8, 5, 18, 21, 19, 0, 130, 108, 101, 109, 0, 68, 46, 4, 7, 72, 4, 8, 81,
|
||||||
|
4, 10, 140, 4, 14, 174, 4, 22, 213, 4, 26, 223, 4, 0, 12, 0, 74, 55, 4, 23,
|
||||||
|
63, 4, 0, 4, 44, 0, 130, 97, 105, 110, 0, 17, 18, 6, 0, 130, 97, 105, 110, 0,
|
||||||
|
24, 18, 9, 44, 0, 129, 110, 100, 0, 71, 88, 4, 8, 98, 4, 0, 15, 12, 11, 6, 0,
|
||||||
|
129, 114, 101, 110, 0, 87, 105, 4, 26, 130, 4, 0, 72, 112, 4, 26, 120, 4, 0,
|
||||||
|
5, 0, 130, 119, 101, 101, 110, 0, 8, 5, 0, 132, 116, 119, 101, 101, 110, 0, 8,
|
||||||
|
5, 0, 131, 116, 119, 101, 101, 110, 0, 12, 0, 75, 152, 4, 18, 158, 4, 22, 165,
|
||||||
|
4, 0, 23, 0, 129, 110, 103, 0, 10, 44, 0, 129, 110, 103, 0, 4, 44, 0, 130,
|
||||||
|
115, 105, 103, 110, 0, 75, 181, 4, 12, 190, 4, 0, 12, 23, 0, 131, 104, 105,
|
||||||
|
110, 107, 0, 75, 197, 4, 23, 203, 4, 0, 23, 0, 129, 110, 107, 0, 11, 44, 0,
|
||||||
|
132, 116, 104, 105, 110, 107, 0, 10, 12, 11, 23, 0, 130, 110, 103, 115, 0, 18,
|
||||||
|
14, 17, 24, 0, 130, 110, 111, 119, 110, 0, 81, 241, 4, 26, 250, 4, 0, 26, 14,
|
||||||
|
44, 0, 130, 110, 111, 119, 0, 79, 1, 5, 17, 9, 5, 0, 15, 18, 9, 0, 129, 111,
|
||||||
|
119, 0, 14, 44, 0, 129, 111, 119, 0, 72, 29, 5, 11, 124, 5, 22, 134, 5, 28,
|
||||||
|
143, 5, 0, 68, 48, 5, 11, 56, 5, 12, 86, 5, 15, 95, 5, 18, 105, 5, 23, 113, 5,
|
||||||
|
0, 15, 6, 0, 130, 101, 97, 114, 0, 23, 0, 72, 65, 5, 15, 77, 5, 0, 11, 10, 18,
|
||||||
|
23, 0, 133, 101, 116, 104, 101, 114, 0, 18, 44, 0, 132, 116, 104, 101, 114, 0,
|
||||||
|
11, 23, 44, 0, 130, 101, 105, 114, 0, 23, 12, 9, 0, 131, 108, 116, 101, 114,
|
||||||
|
0, 9, 8, 5, 0, 129, 114, 101, 0, 11, 18, 17, 4, 0, 131, 116, 104, 101, 114, 0,
|
||||||
|
8, 23, 18, 44, 0, 130, 104, 101, 114, 0, 4, 8, 28, 44, 0, 129, 114, 115, 0, 8,
|
||||||
|
25, 8, 44, 0, 129, 114, 121, 0, 68, 168, 5, 8, 178, 5, 10, 203, 5, 21, 214, 5,
|
||||||
|
23, 225, 5, 0, 28, 26, 15, 4, 0, 130, 97, 121, 115, 0, 4, 0, 71, 187, 5, 14,
|
||||||
|
195, 5, 0, 12, 44, 0, 130, 101, 97, 115, 0, 23, 0, 131, 97, 107, 101, 115, 0,
|
||||||
|
12, 17, 11, 23, 0, 131, 105, 110, 103, 115, 0, 8, 4, 28, 44, 0, 131, 101, 97,
|
||||||
|
114, 115, 0, 21, 12, 9, 0, 129, 115, 116, 0, 72, 252, 5, 11, 6, 6, 12, 46, 6,
|
||||||
|
18, 57, 6, 22, 95, 6, 24, 123, 6, 0, 4, 21, 10, 44, 0, 130, 101, 97, 116, 0,
|
||||||
|
71, 13, 6, 10, 20, 6, 0, 12, 26, 0, 129, 116, 104, 0, 81, 27, 6, 24, 34, 6, 0,
|
||||||
|
8, 15, 0, 129, 116, 104, 0, 18, 21, 11, 23, 0, 133, 111, 117, 103, 104, 116,
|
||||||
|
0, 23, 24, 18, 5, 4, 0, 129, 32, 105, 116, 0, 81, 67, 6, 21, 77, 6, 22, 86, 6,
|
||||||
|
0, 7, 12, 7, 0, 130, 32, 110, 111, 116, 0, 19, 8, 21, 0, 130, 111, 114, 116,
|
||||||
|
0, 16, 15, 4, 0, 130, 111, 115, 116, 0, 80, 102, 6, 24, 112, 6, 0, 18, 15, 4,
|
||||||
|
0, 131, 109, 111, 115, 116, 0, 13, 4, 44, 0, 131, 100, 106, 117, 115, 116, 0,
|
||||||
|
82, 133, 6, 19, 157, 6, 23, 180, 6, 0, 68, 140, 6, 5, 149, 6, 0, 5, 0, 132,
|
||||||
|
97, 98, 111, 117, 116, 0, 5, 4, 0, 131, 111, 117, 116, 0, 87, 164, 6, 24, 172,
|
||||||
|
6, 0, 17, 12, 0, 131, 112, 117, 116, 0, 18, 0, 130, 116, 112, 117, 116, 0, 19,
|
||||||
|
24, 18, 0, 131, 116, 112, 117, 116, 0, 23, 18, 5, 4, 0, 129, 117, 116, 0, 8,
|
||||||
|
4, 11, 44, 0, 129, 118, 101, 0, 17, 18, 14, 44, 0, 130, 110, 111, 119, 0, 70,
|
||||||
|
234, 6, 15, 246, 6, 17, 42, 7, 21, 69, 7, 22, 80, 7, 0, 8, 24, 20, 8, 21, 9,
|
||||||
|
0, 129, 110, 99, 121, 0, 68, 253, 6, 15, 31, 7, 0, 69, 7, 7, 8, 16, 7, 15, 22,
|
||||||
|
7, 0, 18, 21, 19, 0, 129, 98, 108, 121, 0, 21, 0, 128, 108, 121, 0, 8, 21, 0,
|
||||||
|
131, 97, 108, 108, 121, 0, 8, 4, 21, 0, 132, 101, 97, 108, 108, 121, 0, 72,
|
||||||
|
49, 7, 19, 58, 7, 0, 18, 16, 44, 0, 130, 110, 101, 121, 0, 4, 16, 18, 6, 0,
|
||||||
|
131, 112, 97, 110, 121, 0, 4, 5, 12, 15, 0, 130, 114, 97, 114, 121, 0, 4, 26,
|
||||||
|
15, 4, 0, 129, 121, 115, 0};
|
||||||
|
|
148
keyboards/betalupi_ergodox/features/autocorrect/dict.txt
Normal file
148
keyboards/betalupi_ergodox/features/autocorrect/dict.txt
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
# Dictionary syntax:
|
||||||
|
# Each line of this file defines one typo correction entry with the syntax
|
||||||
|
# "typo -> correction". Typos and corrections are case insensitive, and any
|
||||||
|
# whitespace before or after the typo and correction is ignored. The typo must be
|
||||||
|
# only the letters a-z, or the special character : representing a word break.
|
||||||
|
|
||||||
|
:htere -> there
|
||||||
|
abbout -> about
|
||||||
|
abotu -> about
|
||||||
|
baout -> about
|
||||||
|
:theri -> their
|
||||||
|
:thier -> their
|
||||||
|
:owudl -> would
|
||||||
|
woudl -> would
|
||||||
|
peaple -> people
|
||||||
|
peolpe -> people
|
||||||
|
peopel -> people
|
||||||
|
poeple -> people
|
||||||
|
poeople -> people
|
||||||
|
:hwihc -> which
|
||||||
|
whcih -> which
|
||||||
|
whihc -> which
|
||||||
|
whlch -> which
|
||||||
|
wihch -> which
|
||||||
|
coudl -> could
|
||||||
|
:htikn -> think
|
||||||
|
:htink -> think
|
||||||
|
thikn -> think
|
||||||
|
thiunk -> think
|
||||||
|
tihkn -> think
|
||||||
|
:olther -> other
|
||||||
|
:otehr -> other
|
||||||
|
baceause -> because
|
||||||
|
beacuse -> because
|
||||||
|
becasue -> because
|
||||||
|
beccause -> because
|
||||||
|
becouse -> because
|
||||||
|
becuase -> because
|
||||||
|
|
||||||
|
theese -> these
|
||||||
|
:goign -> going
|
||||||
|
:gonig -> going
|
||||||
|
:yaers -> years
|
||||||
|
:yeasr -> years
|
||||||
|
:thsoe -> those
|
||||||
|
shoudl -> should
|
||||||
|
raelly -> really
|
||||||
|
realy -> really
|
||||||
|
relaly -> really
|
||||||
|
bedore -> before
|
||||||
|
befoer -> before
|
||||||
|
littel -> little
|
||||||
|
beeing -> being
|
||||||
|
:hwile -> while
|
||||||
|
|
||||||
|
aroud -> around
|
||||||
|
arround -> around
|
||||||
|
arund -> around
|
||||||
|
thign -> thing
|
||||||
|
thigsn -> things
|
||||||
|
thnigs -> things
|
||||||
|
anohter -> another
|
||||||
|
beteen -> between
|
||||||
|
beween -> between
|
||||||
|
bewteen -> between
|
||||||
|
:eveyr -> every
|
||||||
|
:graet -> great
|
||||||
|
:agian -> again
|
||||||
|
:sicne -> since
|
||||||
|
alwasy -> always
|
||||||
|
alwyas -> always
|
||||||
|
throught -> thought
|
||||||
|
|
||||||
|
|
||||||
|
almsot -> almost
|
||||||
|
alomst -> almost
|
||||||
|
chnage -> change
|
||||||
|
chekc -> check
|
||||||
|
childen -> children
|
||||||
|
claer -> clear
|
||||||
|
comapny -> company
|
||||||
|
contian -> contain
|
||||||
|
elasped -> elapsed
|
||||||
|
fitler -> filter
|
||||||
|
firts -> first
|
||||||
|
follwo -> follow
|
||||||
|
:foudn -> found
|
||||||
|
frequecy -> frequency
|
||||||
|
firend -> friend
|
||||||
|
freind -> friend
|
||||||
|
heigth -> height
|
||||||
|
iamge -> image
|
||||||
|
inital -> initial
|
||||||
|
intput -> input
|
||||||
|
laguage -> language
|
||||||
|
lenght -> length
|
||||||
|
levle -> level
|
||||||
|
libary -> library
|
||||||
|
:moeny -> money
|
||||||
|
mysefl -> myself
|
||||||
|
ouptut -> output
|
||||||
|
ouput -> output
|
||||||
|
probaly -> probably
|
||||||
|
probelm -> problem
|
||||||
|
recrod -> record
|
||||||
|
reponse -> response
|
||||||
|
reprot -> report
|
||||||
|
singel -> single
|
||||||
|
stregth -> strength
|
||||||
|
strengh -> strength
|
||||||
|
tkaes -> takes
|
||||||
|
therfore -> therefore
|
||||||
|
todya -> today
|
||||||
|
toghether -> together
|
||||||
|
unkown -> unknown
|
||||||
|
unqiue -> unique
|
||||||
|
widht -> width
|
||||||
|
|
||||||
|
|
||||||
|
## Catch skipped spaces between common words.
|
||||||
|
:alot: -> a lot
|
||||||
|
:andteh -> and the
|
||||||
|
:andthe -> and the
|
||||||
|
:asthe -> as the
|
||||||
|
:atthe -> at the
|
||||||
|
abouta -> about a
|
||||||
|
aboutit -> about it
|
||||||
|
aboutthe -> about the
|
||||||
|
:tothe -> to the
|
||||||
|
didnot -> did not
|
||||||
|
fromthe -> from the
|
||||||
|
:the:the: -> the
|
||||||
|
|
||||||
|
|
||||||
|
## Various additional entries.
|
||||||
|
:agred -> agreed
|
||||||
|
:ajust -> adjust
|
||||||
|
:anual -> annual
|
||||||
|
:asign -> assign
|
||||||
|
:casue -> cause
|
||||||
|
:gaurd -> guard
|
||||||
|
:haev -> have
|
||||||
|
:idaes -> ideas
|
||||||
|
:jsut: -> just
|
||||||
|
:jstu: -> just
|
||||||
|
:knwo -> know
|
||||||
|
:konw -> know
|
||||||
|
:kwno -> know
|
@ -0,0 +1,352 @@
|
|||||||
|
"""Python program to make autocorrection_data.h.
|
||||||
|
|
||||||
|
This program reads "autocorrection_dict.txt" from the current directory and
|
||||||
|
generates a C source file "autocorrection_data.h" with a serialized trie
|
||||||
|
embedded as an array. Run this program without arguments like
|
||||||
|
|
||||||
|
$ python3 make_autocorrection_data.py
|
||||||
|
|
||||||
|
Or specify a dict file as the first argument like
|
||||||
|
|
||||||
|
$ python3 make_autocorrection_data.py mykeymap/dict.txt
|
||||||
|
|
||||||
|
The output is written to "autocorrection_data.h" in the same directory as the
|
||||||
|
dictionary. Or optionally specify the output .h file as well like
|
||||||
|
|
||||||
|
$ python3 make_autocorrection_data.py dict.txt somewhere/out.h
|
||||||
|
|
||||||
|
Each line of the dict file defines one typo and its correction with the syntax
|
||||||
|
"typo -> correction". Blank lines or lines starting with '#' are ignored.
|
||||||
|
Example:
|
||||||
|
|
||||||
|
:thier -> their
|
||||||
|
dosen't -> doesn't
|
||||||
|
fitler -> filter
|
||||||
|
lenght -> length
|
||||||
|
ouput -> output
|
||||||
|
widht -> width
|
||||||
|
|
||||||
|
See autocorrection_dict_extra.txt for a larger example.
|
||||||
|
|
||||||
|
For full documentation, see
|
||||||
|
https://getreuer.info/posts/keyboards/autocorrection
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os.path
|
||||||
|
import sys
|
||||||
|
import textwrap
|
||||||
|
from typing import Any, Dict, Iterator, List, Tuple
|
||||||
|
|
||||||
|
try:
|
||||||
|
from english_words import english_words_lower_alpha_set as CORRECT_WORDS
|
||||||
|
except ImportError:
|
||||||
|
print(
|
||||||
|
"Autocorrection will falsely trigger when a typo is a substring of a "
|
||||||
|
"correctly spelled word. To check for this, install the english_words "
|
||||||
|
"package and rerun this script:\n\n pip install english_words\n"
|
||||||
|
)
|
||||||
|
# Use a minimal word list as a fallback.
|
||||||
|
CORRECT_WORDS = (
|
||||||
|
"apparent",
|
||||||
|
"association",
|
||||||
|
"available",
|
||||||
|
"classification",
|
||||||
|
"effect",
|
||||||
|
"entertainment",
|
||||||
|
"fantastic",
|
||||||
|
"information",
|
||||||
|
"integrate",
|
||||||
|
"international",
|
||||||
|
"language",
|
||||||
|
"loosest",
|
||||||
|
"manual",
|
||||||
|
"nothing",
|
||||||
|
"provides",
|
||||||
|
"reference",
|
||||||
|
"statehood",
|
||||||
|
"technology",
|
||||||
|
"virtually",
|
||||||
|
"wealthier",
|
||||||
|
"wonderful",
|
||||||
|
)
|
||||||
|
|
||||||
|
KC_A = 4
|
||||||
|
KC_SPC = 0x2C
|
||||||
|
KC_QUOT = 0x34
|
||||||
|
|
||||||
|
TYPO_CHARS = dict(
|
||||||
|
[
|
||||||
|
("'", KC_QUOT),
|
||||||
|
(":", KC_SPC), # "Word break" character.
|
||||||
|
]
|
||||||
|
+
|
||||||
|
# Characters a-z.
|
||||||
|
[(chr(c), c + KC_A - ord("a")) for c in range(ord("a"), ord("z") + 1)]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def parse_file(file_name: str) -> List[Tuple[str, str]]:
|
||||||
|
"""Parses autocorrections dictionary file.
|
||||||
|
|
||||||
|
Each line of the file defines one typo and its correction with the syntax
|
||||||
|
"typo -> correction". Blank lines or lines starting with '#' are ignored. The
|
||||||
|
function validates that typos only have characters in TYPO_CHARS, that
|
||||||
|
typos are not substrings of other typos, and checking that typos don't trigger
|
||||||
|
on CORRECT_WORDS.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
file_name: String, path of the autocorrections dictionary.
|
||||||
|
Returns:
|
||||||
|
List of (typo, correction) tuples.
|
||||||
|
"""
|
||||||
|
|
||||||
|
autocorrections = []
|
||||||
|
typos = set()
|
||||||
|
for line_number, typo, correction in parse_file_lines(file_name):
|
||||||
|
if typo in typos:
|
||||||
|
print(f'Warning:{line_number}: Ignoring duplicate typo: "{typo}"')
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Check that `typo` is valid.
|
||||||
|
if not (all([c in TYPO_CHARS for c in typo])):
|
||||||
|
print(
|
||||||
|
f'Error:{line_number}: Typo "{typo}" has '
|
||||||
|
"characters other than " + "".join(TYPO_CHARS.keys())
|
||||||
|
)
|
||||||
|
sys.exit(1)
|
||||||
|
for other_typo in typos:
|
||||||
|
if typo in other_typo or other_typo in typo:
|
||||||
|
print(
|
||||||
|
f"Error:{line_number}: Typos may not be substrings of one "
|
||||||
|
f"another, otherwise the longer typo would never trigger: "
|
||||||
|
f'"{typo}" vs. "{other_typo}".'
|
||||||
|
)
|
||||||
|
sys.exit(1)
|
||||||
|
if len(typo) < 5:
|
||||||
|
print(
|
||||||
|
f"Warning:{line_number}: It is suggested that typos are at "
|
||||||
|
f'least 5 characters long to avoid false triggers: "{typo}"'
|
||||||
|
)
|
||||||
|
|
||||||
|
check_typo_against_dictionary(line_number, typo)
|
||||||
|
|
||||||
|
autocorrections.append((typo, correction))
|
||||||
|
typos.add(typo)
|
||||||
|
|
||||||
|
return autocorrections
|
||||||
|
|
||||||
|
|
||||||
|
def make_trie(autocorrections: List[Tuple[str, str]]) -> Dict[str, Any]:
|
||||||
|
"""Makes a trie from the the typos, writing in reverse.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
autocorrections: List of (typo, correction) tuples.
|
||||||
|
Returns:
|
||||||
|
Dict of dict, representing the trie.
|
||||||
|
"""
|
||||||
|
trie = {}
|
||||||
|
for typo, correction in autocorrections:
|
||||||
|
node = trie
|
||||||
|
for letter in typo[::-1]:
|
||||||
|
node = node.setdefault(letter, {})
|
||||||
|
node["LEAF"] = (typo, correction)
|
||||||
|
|
||||||
|
return trie
|
||||||
|
|
||||||
|
|
||||||
|
def parse_file_lines(file_name: str) -> Iterator[Tuple[int, str, str]]:
|
||||||
|
"""Parses lines read from `file_name` into typo-correction pairs."""
|
||||||
|
|
||||||
|
line_number = 0
|
||||||
|
for line in open(file_name, "rt"):
|
||||||
|
line_number += 1
|
||||||
|
line = line.strip()
|
||||||
|
if line and line[0] != "#":
|
||||||
|
# Parse syntax "typo -> correction", using strip to ignore indenting.
|
||||||
|
tokens = [token.strip() for token in line.split("->", 1)]
|
||||||
|
if len(tokens) != 2 or not tokens[0]:
|
||||||
|
print(f'Error:{line_number}: Invalid syntax: "{line}"')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
typo, correction = tokens
|
||||||
|
typo = typo.lower() # Force typos to lowercase.
|
||||||
|
typo = typo.replace(" ", ":")
|
||||||
|
|
||||||
|
yield line_number, typo, correction
|
||||||
|
|
||||||
|
|
||||||
|
def check_typo_against_dictionary(line_number: int, typo: str) -> None:
|
||||||
|
"""Checks `typo` against English dictionary words."""
|
||||||
|
|
||||||
|
if typo.startswith(":") and typo.endswith(":"):
|
||||||
|
if typo[1:-1] in CORRECT_WORDS:
|
||||||
|
print(
|
||||||
|
f'Warning:{line_number}: Typo "{typo}" is a correctly spelled '
|
||||||
|
"dictionary word."
|
||||||
|
)
|
||||||
|
elif typo.startswith(":") and not typo.endswith(":"):
|
||||||
|
for word in CORRECT_WORDS:
|
||||||
|
if word.startswith(typo[1:]):
|
||||||
|
print(
|
||||||
|
f'Warning:{line_number}: Typo "{typo}" would falsely trigger '
|
||||||
|
f'on correctly spelled word "{word}".'
|
||||||
|
)
|
||||||
|
elif not typo.startswith(":") and typo.endswith(":"):
|
||||||
|
for word in CORRECT_WORDS:
|
||||||
|
if word.endswith(typo[:-1]):
|
||||||
|
print(
|
||||||
|
f'Warning:{line_number}: Typo "{typo}" would falsely trigger '
|
||||||
|
f'on correctly spelled word "{word}".'
|
||||||
|
)
|
||||||
|
elif not typo.startswith(":") and not typo.endswith(":"):
|
||||||
|
for word in CORRECT_WORDS:
|
||||||
|
if typo in word:
|
||||||
|
print(
|
||||||
|
f'Warning:{line_number}: Typo "{typo}" would falsely trigger '
|
||||||
|
f'on correctly spelled word "{word}".'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def serialize_trie(
|
||||||
|
autocorrections: List[Tuple[str, str]], trie: Dict[str, Any]
|
||||||
|
) -> List[int]:
|
||||||
|
"""Serializes trie and correction data in a form readable by the C code.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
autocorrections: List of (typo, correction) tuples.
|
||||||
|
trie: Dict of dicts.
|
||||||
|
Returns:
|
||||||
|
List of ints in the range 0-255.
|
||||||
|
"""
|
||||||
|
table = []
|
||||||
|
|
||||||
|
# Traverse trie in depth first order.
|
||||||
|
def traverse(trie_node: Dict[str, Any]) -> Dict[str, Any]:
|
||||||
|
if "LEAF" in trie_node: # Handle a leaf trie node.
|
||||||
|
typo, correction = trie_node["LEAF"]
|
||||||
|
word_boundary_ending = typo[-1] == ":"
|
||||||
|
typo = typo.strip(":")
|
||||||
|
i = 0 # Make the autocorrection data for this entry and serialize it.
|
||||||
|
while i < min(len(typo), len(correction)) and typo[i] == correction[i]:
|
||||||
|
i += 1
|
||||||
|
backspaces = len(typo) - i - 1 + word_boundary_ending
|
||||||
|
assert 0 <= backspaces <= 63
|
||||||
|
correction = correction[i:]
|
||||||
|
data = [backspaces + 128] + list(bytes(correction, "ascii")) + [0]
|
||||||
|
|
||||||
|
entry = {"data": data, "links": [], "byte_offset": 0}
|
||||||
|
table.append(entry)
|
||||||
|
elif len(trie_node) == 1: # Handle trie node with a single child.
|
||||||
|
c, trie_node = next(iter(trie_node.items()))
|
||||||
|
entry = {"chars": c, "byte_offset": 0}
|
||||||
|
|
||||||
|
# It's common for a trie to have long chains of single-child nodes. We
|
||||||
|
# find the whole chain so that we can serialize it more efficiently.
|
||||||
|
while len(trie_node) == 1 and "LEAF" not in trie_node:
|
||||||
|
c, trie_node = next(iter(trie_node.items()))
|
||||||
|
entry["chars"] += c
|
||||||
|
|
||||||
|
table.append(entry)
|
||||||
|
entry["links"] = [traverse(trie_node)]
|
||||||
|
else: # Handle trie node with multiple children.
|
||||||
|
entry = {"chars": "".join(sorted(trie_node.keys())), "byte_offset": 0}
|
||||||
|
table.append(entry)
|
||||||
|
entry["links"] = [traverse(trie_node[c]) for c in entry["chars"]]
|
||||||
|
return entry
|
||||||
|
|
||||||
|
traverse(trie)
|
||||||
|
|
||||||
|
def serialize(e: Dict[str, Any]) -> List[int]:
|
||||||
|
if not e["links"]: # Handle a leaf table entry.
|
||||||
|
return e["data"]
|
||||||
|
elif len(e["links"]) == 1: # Handle a chain table entry.
|
||||||
|
return [TYPO_CHARS[c] for c in e["chars"]] + [0]
|
||||||
|
else: # Handle a branch table entry.
|
||||||
|
data = []
|
||||||
|
for c, link in zip(e["chars"], e["links"]):
|
||||||
|
data += [TYPO_CHARS[c] | (0 if data else 64)] + encode_link(link)
|
||||||
|
return data + [0]
|
||||||
|
|
||||||
|
byte_offset = 0
|
||||||
|
for e in table: # To encode links, first compute byte offset of each entry.
|
||||||
|
e["byte_offset"] = byte_offset
|
||||||
|
byte_offset += len(serialize(e))
|
||||||
|
|
||||||
|
return [b for e in table for b in serialize(e)] # Serialize final table.
|
||||||
|
|
||||||
|
|
||||||
|
def encode_link(link: Dict[str, Any]) -> List[int]:
|
||||||
|
"""Encodes a node link as two bytes."""
|
||||||
|
byte_offset = link["byte_offset"]
|
||||||
|
if not (0 <= byte_offset <= 0xFFFF):
|
||||||
|
print(
|
||||||
|
"Error: The autocorrection table is too large, a node link exceeds "
|
||||||
|
"64KB limit. Try reducing the autocorrection dict to fewer entries."
|
||||||
|
)
|
||||||
|
sys.exit(1)
|
||||||
|
return [byte_offset & 255, byte_offset >> 8]
|
||||||
|
|
||||||
|
|
||||||
|
def write_generated_code(
|
||||||
|
autocorrections: List[Tuple[str, str]], data: List[int], file_name: str
|
||||||
|
) -> None:
|
||||||
|
"""Writes autocorrection data as generated C code to `file_name`.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
autocorrections: List of (typo, correction) tuples.
|
||||||
|
data: List of ints in 0-255, the serialized trie.
|
||||||
|
file_name: String, path of the output C file.
|
||||||
|
"""
|
||||||
|
assert all(0 <= b <= 255 for b in data)
|
||||||
|
|
||||||
|
def typo_len(e: Tuple[str, str]) -> int:
|
||||||
|
return len(e[0])
|
||||||
|
|
||||||
|
min_typo = min(autocorrections, key=typo_len)[0]
|
||||||
|
max_typo = max(autocorrections, key=typo_len)[0]
|
||||||
|
generated_code = "".join(
|
||||||
|
[
|
||||||
|
"// Generated code.\n\n",
|
||||||
|
f"// Autocorrection dictionary ({len(autocorrections)} entries):\n",
|
||||||
|
"".join(
|
||||||
|
sorted(
|
||||||
|
f"// {typo:<{len(max_typo)}} -> {correction}\n"
|
||||||
|
for typo, correction in autocorrections
|
||||||
|
)
|
||||||
|
),
|
||||||
|
f'\n#define AUTOCORRECTION_MIN_LENGTH {len(min_typo)} // "{min_typo}"\n',
|
||||||
|
f'#define AUTOCORRECTION_MAX_LENGTH {len(max_typo)} // "{max_typo}"\n\n',
|
||||||
|
textwrap.fill(
|
||||||
|
"static const uint8_t autocorrection_data[%d] PROGMEM = {%s};"
|
||||||
|
% (len(data), ", ".join(map(str, data))),
|
||||||
|
width=80,
|
||||||
|
subsequent_indent=" ",
|
||||||
|
),
|
||||||
|
"\n\n",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
with open(file_name, "wt") as f:
|
||||||
|
f.write(generated_code)
|
||||||
|
|
||||||
|
|
||||||
|
def get_default_h_file(dict_file: str) -> str:
|
||||||
|
return os.path.join(os.path.dirname(dict_file), "autocorrect_data.h")
|
||||||
|
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
dict_file = argv[1] if len(argv) > 1 else "dict.txt"
|
||||||
|
h_file = argv[2] if len(argv) > 2 else get_default_h_file(dict_file)
|
||||||
|
|
||||||
|
autocorrections = parse_file(dict_file)
|
||||||
|
trie = make_trie(autocorrections)
|
||||||
|
data = serialize_trie(autocorrections, trie)
|
||||||
|
print(
|
||||||
|
f"Processed %d autocorrection entries to table with %d bytes."
|
||||||
|
% (len(autocorrections), len(data))
|
||||||
|
)
|
||||||
|
write_generated_code(autocorrections, data, h_file)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main(sys.argv)
|
187
keyboards/betalupi_ergodox/features/beta_rawhid.c
Normal file
187
keyboards/betalupi_ergodox/features/beta_rawhid.c
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
#include "betalupi_ergodox.h"
|
||||||
|
#include "extra_mappings.h"
|
||||||
|
|
||||||
|
#include "features/beta_rawhid.h"
|
||||||
|
#include "features/rawhid_commands.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern uint8_t layer_layouts[];
|
||||||
|
|
||||||
|
#ifdef ENABLE_HID_SPELLCHECK
|
||||||
|
#include "features/hid_spellcheck.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// See features/beta_rawhid.h for prococol documentation
|
||||||
|
void raw_hid_receive(uint8_t *data, uint8_t length) {
|
||||||
|
uint8_t cmd = data[0];
|
||||||
|
|
||||||
|
switch (cmd) {
|
||||||
|
case CMD_HELLO:
|
||||||
|
ergodox_right_led_1_on();
|
||||||
|
_delay_ms(50);
|
||||||
|
ergodox_right_led_1_off();
|
||||||
|
|
||||||
|
hid_send_state();
|
||||||
|
break;
|
||||||
|
|
||||||
|
#ifdef ENABLE_RGB_MATRIX_FFT_ANIM
|
||||||
|
case CMD_ANIM_DATA:
|
||||||
|
cmd_animation(data, length);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_HID_SPELLCHECK
|
||||||
|
case CMD_SPELLCHECK_WORD:
|
||||||
|
if (data[1]) {
|
||||||
|
ergodox_right_led_1_on();
|
||||||
|
_delay_ms(50);
|
||||||
|
ergodox_right_led_1_off();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t nth_byte(size_t n, uint32_t data) {
|
||||||
|
return (data >> (8 * n)) & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// state: layer state.
|
||||||
|
// If this is 0, we'll use global layer_state instead.
|
||||||
|
void _hid_send_state(_hid_send_state_args args) {
|
||||||
|
|
||||||
|
uint32_t state = args.state ? args.state : layer_state;
|
||||||
|
|
||||||
|
uint8_t packet[RAW_EPSIZE] = {
|
||||||
|
CMD_SEND_STATE,
|
||||||
|
|
||||||
|
// Animation state, set later
|
||||||
|
0x00,
|
||||||
|
|
||||||
|
// Layer state
|
||||||
|
nth_byte(0, state),
|
||||||
|
nth_byte(1, state),
|
||||||
|
nth_byte(2, state),
|
||||||
|
nth_byte(3, state),
|
||||||
|
|
||||||
|
// Keymap for active layer
|
||||||
|
layer_layouts[biton32(state)]
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Set second byte
|
||||||
|
if (rgb_matrix_get_flags() != LED_FLAG_ALL) {
|
||||||
|
// RGB matrix is disabled
|
||||||
|
packet[1] = 0x00;
|
||||||
|
} else {
|
||||||
|
uint8_t mode = rgb_matrix_get_mode();
|
||||||
|
switch (mode) {
|
||||||
|
|
||||||
|
#ifdef ENABLE_RGB_MATRIX_FFT_ANIM
|
||||||
|
case RGB_MATRIX_CUSTOM_FFT_ANIM:
|
||||||
|
// FFT Animation is active
|
||||||
|
packet[1] = 0x02;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Normal animation is active
|
||||||
|
packet[1] = 0x01;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note that all sent packets MUST be
|
||||||
|
// RAW_EPSIZE long.
|
||||||
|
raw_hid_send(packet, RAW_EPSIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void hid_send_special_char(uint16_t char_id) {
|
||||||
|
uint8_t packet[RAW_EPSIZE] = {
|
||||||
|
CMD_SPECIAL_CHAR,
|
||||||
|
(char_id >> 0) & 0xFF,
|
||||||
|
(char_id >> 8) & 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
|
raw_hid_send(packet, RAW_EPSIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ENABLE_HID_SPELLCHECK
|
||||||
|
void hid_send_word() {
|
||||||
|
uint8_t packet[RAW_EPSIZE] = {
|
||||||
|
CMD_SPELLCHECK_WORD,
|
||||||
|
spellcheck_buffer_size
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int i = 0; i < 2 + spellcheck_buffer_size; i++) {
|
||||||
|
packet[i + 2] = spellcheck_buffer[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
raw_hid_send(packet, RAW_EPSIZE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ENABLE_RGB_MATRIX_FFT_ANIM
|
||||||
|
#define FFT_PER_KEY 50
|
||||||
|
void cmd_animation(uint8_t *data, uint8_t length) {
|
||||||
|
switch (data[1]) {
|
||||||
|
case CMD_ANIM_DATA_fft:
|
||||||
|
// Only read data if animation is in fft mode
|
||||||
|
if (rgb_matrix_get_mode() == RGB_MATRIX_CUSTOM_FFT_ANIM) {
|
||||||
|
// Data should be a pointer to 10 uint8_ts, each representing
|
||||||
|
// the height of a bar on the display.
|
||||||
|
|
||||||
|
for (uint8_t bin = 0; bin < 10; bin++) {
|
||||||
|
// Scale data values
|
||||||
|
uint8_t d = data[bin + 2];
|
||||||
|
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < 5; i++) {
|
||||||
|
// Ignore negative indices.
|
||||||
|
// See fft_col_to_array definition.
|
||||||
|
if (fft_col_to_array[bin][i] < 0) {
|
||||||
|
if (d >= FFT_PER_KEY) {
|
||||||
|
d -= FFT_PER_KEY;
|
||||||
|
} else {
|
||||||
|
d = 0;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t row = fft_col_to_array[bin][i] % MATRIX_ROWS;
|
||||||
|
uint8_t col = fft_col_to_array[bin][i] / MATRIX_ROWS;
|
||||||
|
|
||||||
|
if (d >= FFT_PER_KEY) {
|
||||||
|
g_rgb_frame_buffer[row][col] = 0xFF;
|
||||||
|
d -= FFT_PER_KEY;
|
||||||
|
} else if (d > 0) {
|
||||||
|
g_rgb_frame_buffer[row][col] = ((double) d / FFT_PER_KEY) * 0xFF;
|
||||||
|
d = 0;
|
||||||
|
} else {
|
||||||
|
g_rgb_frame_buffer[row][col] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
rgb_matrix_set_color(
|
||||||
|
fft_col_to_array[bin][i],
|
||||||
|
last_brightness, 0x00, last_brightness
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If not in fft mode and we receive fft data, send a state packet so host stops sending data.
|
||||||
|
hid_send_state();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
34
keyboards/betalupi_ergodox/features/beta_rawhid.h
Normal file
34
keyboards/betalupi_ergodox/features/beta_rawhid.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "raw_hid.h"
|
||||||
|
|
||||||
|
#define RAW_EPSIZE 32
|
||||||
|
|
||||||
|
|
||||||
|
void raw_hid_receive(uint8_t *data, uint8_t length);
|
||||||
|
|
||||||
|
|
||||||
|
// hid_send_state with advanced arguments
|
||||||
|
typedef struct {
|
||||||
|
uint32_t state;
|
||||||
|
} _hid_send_state_args;
|
||||||
|
void _hid_send_state(_hid_send_state_args args);
|
||||||
|
|
||||||
|
#define hid_send_state(...) _hid_send_state( \
|
||||||
|
(_hid_send_state_args) { \
|
||||||
|
.state = 0, \
|
||||||
|
__VA_ARGS__ \
|
||||||
|
} \
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
void hid_send_special_char(uint16_t char_utf_8);
|
||||||
|
|
||||||
|
#ifdef ENABLE_HID_SPELLCHECK
|
||||||
|
void hid_send_word(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ENABLE_RGB_MATRIX_FFT_ANIM
|
||||||
|
void cmd_animation(uint8_t *data, uint8_t length);
|
||||||
|
extern uint8_t g_rgb_frame_buffer[MATRIX_ROWS][MATRIX_COLS];
|
||||||
|
#endif
|
185
keyboards/betalupi_ergodox/features/hid_spellcheck.c
Normal file
185
keyboards/betalupi_ergodox/features/hid_spellcheck.c
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
#ifdef ENABLE_HID_SPELLCHECK
|
||||||
|
|
||||||
|
#include "keymap_russian.h"
|
||||||
|
#include "keymap_us_international.h"
|
||||||
|
|
||||||
|
#include "features/hid_spellcheck.h"
|
||||||
|
#include "features/beta_rawhid.h"
|
||||||
|
#include "extra_mappings.h"
|
||||||
|
|
||||||
|
uint8_t spellcheck_buffer[SPELLCHECK_BUFFER_MAX] = {0};
|
||||||
|
uint8_t spellcheck_buffer_size = 0;
|
||||||
|
|
||||||
|
// Return one of the following.
|
||||||
|
#define SPELLCHECK_WORD 2
|
||||||
|
#define SPELLCHECK_SPACE 1
|
||||||
|
#define SPELLCHECK_NEITHER 0
|
||||||
|
uint8_t keycode_type_en(uint8_t mods, uint16_t keycode) {
|
||||||
|
if (
|
||||||
|
KC_A <= keycode && keycode <= KC_Z // basic letters
|
||||||
|
) {
|
||||||
|
return SPELLCHECK_WORD;
|
||||||
|
|
||||||
|
} else if (
|
||||||
|
( // Include these
|
||||||
|
(KC_1 <= keycode && keycode <= KC_SLSH) || // Symbols
|
||||||
|
// Treat " (shifted ') as a word boundary.
|
||||||
|
((keycode == KC_QUOT) && ((mods & MOD_MASK_SHIFT) != 0))
|
||||||
|
) && !( // Don't include these
|
||||||
|
(keycode == KC_ESC) ||
|
||||||
|
(keycode == KC_ENTER)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return SPELLCHECK_SPACE;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return SPELLCHECK_NEITHER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t keycode_type_ru(uint8_t mods, uint16_t keycode) {
|
||||||
|
if (
|
||||||
|
KC_A <= keycode && keycode <= KC_Z // basic letters
|
||||||
|
) {
|
||||||
|
return SPELLCHECK_WORD;
|
||||||
|
} else if (
|
||||||
|
KC_1 <= keycode && keycode <= KC_0
|
||||||
|
) {
|
||||||
|
return SPELLCHECK_SPACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (keycode) {
|
||||||
|
case RU_YO:
|
||||||
|
case RU_HA:
|
||||||
|
case RU_HARD:
|
||||||
|
case RU_E:
|
||||||
|
case RU_BE:
|
||||||
|
case RU_YU:
|
||||||
|
return SPELLCHECK_WORD;
|
||||||
|
|
||||||
|
case RU_MINS:
|
||||||
|
case RU_EQL:
|
||||||
|
case RU_DOT:
|
||||||
|
case RU_BSLS:
|
||||||
|
return SPELLCHECK_SPACE;
|
||||||
|
}
|
||||||
|
return SPELLCHECK_NEITHER;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_spellcheck(uint16_t keycode, keyrecord_t* record) {
|
||||||
|
|
||||||
|
|
||||||
|
// Ignore key release; we only process key presses.
|
||||||
|
if (!record->event.pressed) { return true; }
|
||||||
|
|
||||||
|
#ifndef NO_ACTION_ONESHOT
|
||||||
|
const uint8_t mods = get_mods() | get_oneshot_mods();
|
||||||
|
#else
|
||||||
|
const uint8_t mods = get_mods();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// Disable autocorrection while a mod other than shift is active.
|
||||||
|
if ((mods & ~MOD_MASK_SHIFT) != 0) {
|
||||||
|
spellcheck_buffer_size = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The following switch cases address various kinds of keycodes. This logic is
|
||||||
|
// split over two switches rather than merged into one. The first switch may
|
||||||
|
// extract a basic keycode which is then further handled by the second switch,
|
||||||
|
// e.g. a layer-tap key with Caps Lock `LT(layer, KC_CAPS)`.
|
||||||
|
switch (keycode) {
|
||||||
|
#ifndef NO_ACTION_TAPPING
|
||||||
|
case QK_MOD_TAP ... QK_MOD_TAP_MAX: // Tap-hold keys.
|
||||||
|
#ifndef NO_ACTION_LAYER
|
||||||
|
case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
|
||||||
|
#endif
|
||||||
|
// Ignore when tap-hold keys are held.
|
||||||
|
if (record->tap.count == 0) { return true; }
|
||||||
|
// Otherwise when tapped, get the basic keycode.
|
||||||
|
// Fallthrough intended.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Handle shifted keys, e.g. symbols like KC_EXLM = S(KC_1).
|
||||||
|
case QK_LSFT ... QK_LSFT + 255:
|
||||||
|
case QK_RSFT ... QK_RSFT + 255:
|
||||||
|
keycode &= 0xff; // Get the basic keycode.
|
||||||
|
break;
|
||||||
|
|
||||||
|
// NOTE: Space Cadet keys expose no info to check whether they are being
|
||||||
|
// tapped vs. held. This makes autocorrection ambiguous, e.g. KC_LCPO might
|
||||||
|
// be '(', which we would treat as a word break, or it might be shift, which
|
||||||
|
// we would treat as having no effect. To behave cautiously, we allow Space
|
||||||
|
// Cadet keycodes to fall to the logic below and clear autocorrection state.
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (keycode) {
|
||||||
|
// Ignore shifts, Caps Lock, one-shot mods, and layer switch keys.
|
||||||
|
case KC_NO:
|
||||||
|
case KC_LSFT:
|
||||||
|
case KC_RSFT:
|
||||||
|
case KC_CAPS:
|
||||||
|
case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX:
|
||||||
|
case QK_TO ... QK_TO_MAX:
|
||||||
|
case QK_MOMENTARY ... QK_MOMENTARY_MAX:
|
||||||
|
case QK_DEF_LAYER ... QK_DEF_LAYER_MAX:
|
||||||
|
case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX:
|
||||||
|
case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX:
|
||||||
|
case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX:
|
||||||
|
case QK_LAYER_MOD ... QK_LAYER_MOD_MAX:
|
||||||
|
return true; // Ignore these keys.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (keycode == KC_BSPC) {
|
||||||
|
// Remove last character from buffer
|
||||||
|
if (spellcheck_buffer_size > 0) { --spellcheck_buffer_size; }
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t keycode_type;
|
||||||
|
switch (layer_layouts[biton32(layer_state)]) {
|
||||||
|
case LAYOUT_EN:
|
||||||
|
keycode_type = keycode_type_en(mods, keycode);
|
||||||
|
break;
|
||||||
|
case LAYOUT_RU:
|
||||||
|
keycode_type = keycode_type_ru(mods, keycode);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
keycode_type = SPELLCHECK_NEITHER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
switch(keycode_type) {
|
||||||
|
// No modifications are needed if this is a regular word character
|
||||||
|
case SPELLCHECK_WORD:
|
||||||
|
|
||||||
|
// If the buffer is full, rotate it to discard the oldest character.
|
||||||
|
if (spellcheck_buffer_size >= SPELLCHECK_BUFFER_MAX) {
|
||||||
|
memmove(spellcheck_buffer, spellcheck_buffer + 1, SPELLCHECK_BUFFER_MAX - 1);
|
||||||
|
spellcheck_buffer_size = SPELLCHECK_BUFFER_MAX - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
spellcheck_buffer[spellcheck_buffer_size++] = (uint8_t) keycode;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case SPELLCHECK_SPACE:
|
||||||
|
// If this is a word break, send word and reset buffer
|
||||||
|
if (spellcheck_buffer_size > 0) {
|
||||||
|
hid_send_word();
|
||||||
|
spellcheck_buffer_size = 0;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case SPELLCHECK_NEITHER:
|
||||||
|
spellcheck_buffer_size = 0;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
20
keyboards/betalupi_ergodox/features/hid_spellcheck.h
Normal file
20
keyboards/betalupi_ergodox/features/hid_spellcheck.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef ENABLE_HID_SPELLCHECK
|
||||||
|
|
||||||
|
#include "quantum.h"
|
||||||
|
|
||||||
|
|
||||||
|
// spellcheck_buffer holds keycode history.
|
||||||
|
// It can only contain values 0x00 - 0xFF, aka standard usb hid codes.
|
||||||
|
// Host software is responsible for turning this into a usable string.
|
||||||
|
//
|
||||||
|
// Note that SOME preprocessing is done,see spellcheck.c
|
||||||
|
#define SPELLCHECK_BUFFER_MAX 16
|
||||||
|
uint8_t spellcheck_buffer[SPELLCHECK_BUFFER_MAX];
|
||||||
|
uint8_t spellcheck_buffer_size;
|
||||||
|
|
||||||
|
|
||||||
|
bool process_spellcheck(uint16_t keycode, keyrecord_t* record);
|
||||||
|
|
||||||
|
#endif
|
39
keyboards/betalupi_ergodox/features/leader/beta_leader.h
Normal file
39
keyboards/betalupi_ergodox/features/leader/beta_leader.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifdef ENABLE_BETA_LEADER
|
||||||
|
|
||||||
|
#include "quantum.h"
|
||||||
|
|
||||||
|
bool beta_process_leader(uint16_t keycode, keyrecord_t *record);
|
||||||
|
|
||||||
|
void beta_leader_start(void);
|
||||||
|
void beta_leader_end(void);
|
||||||
|
bool beta_leader_check(void);
|
||||||
|
void beta_qk_leader_check(void);
|
||||||
|
void beta_qk_leader_start(void);
|
||||||
|
|
||||||
|
|
||||||
|
#define BETA_LEADER_EXTERNS() \
|
||||||
|
extern bool beta_leading; \
|
||||||
|
extern uint16_t beta_leader_time; \
|
||||||
|
extern uint16_t beta_leader_sequence[5]; \
|
||||||
|
extern uint8_t beta_leader_sequence_size
|
||||||
|
|
||||||
|
// Normal sequence
|
||||||
|
// These do the same thing as SEQ_X_KEYS from qmk.
|
||||||
|
#define BETA_SEQ_1_LONG(key) if (beta_leader_sequence[0] == (key) && beta_leader_sequence[1] == 0 && beta_leader_sequence[2] == 0 && beta_leader_sequence[3] == 0 && beta_leader_sequence[4] == 0 && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT)
|
||||||
|
#define BETA_SEQ_2_LONG(key1, key2) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2) && beta_leader_sequence[2] == 0 && beta_leader_sequence[3] == 0 && beta_leader_sequence[4] == 0 && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT)
|
||||||
|
#define BETA_SEQ_3_LONG(key1, key2, key3) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2) && beta_leader_sequence[2] == (key3) && beta_leader_sequence[3] == 0 && beta_leader_sequence[4] == 0 && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT)
|
||||||
|
#define BETA_SEQ_4_LONG(key1, key2, key3, key4) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2) && beta_leader_sequence[2] == (key3) && beta_leader_sequence[3] == (key4) && beta_leader_sequence[4] == 0 && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT)
|
||||||
|
#define BETA_SEQ_5_LONG(key1, key2, key3, key4, key5) if (leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2) && beta_leader_sequence[2] == (key3) && beta_leader_sequence[3] == (key4) && beta_leader_sequence[4] == (key5) && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT)
|
||||||
|
|
||||||
|
// Short-circuit sequence
|
||||||
|
// These match as soon as a matching sequence is seen,
|
||||||
|
// not waiting for the leader timeout. They thus register
|
||||||
|
// immediately, but cannot be used in longer sequences.
|
||||||
|
#define BETA_SEQ_1_SHORT(key) if (beta_leader_sequence[0] == (key))
|
||||||
|
#define BETA_SEQ_2_SHORT(key1, key2) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2))
|
||||||
|
#define BETA_SEQ_3_SHORT(key1, key2, key3) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2))
|
||||||
|
#define BETA_SEQ_4_SHORT(key1, key2, key3, key4) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2))
|
||||||
|
#define BETA_SEQ_5_SHORT(key1, key2, key3, key4, key5) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2))
|
||||||
|
|
||||||
|
#endif
|
103
keyboards/betalupi_ergodox/features/leader/leader.c
Normal file
103
keyboards/betalupi_ergodox/features/leader/leader.c
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
#ifdef ENABLE_BETA_LEADER
|
||||||
|
|
||||||
|
#include "beta_leader.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifndef LEADER_TIMEOUT
|
||||||
|
#define LEADER_TIMEOUT 300
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__attribute__((weak)) void beta_leader_start(void) {}
|
||||||
|
__attribute__((weak)) void beta_leader_end(void) {}
|
||||||
|
__attribute__((weak)) bool beta_leader_check(void) { return true; }
|
||||||
|
|
||||||
|
// Leader key stuff
|
||||||
|
bool beta_leading = false;
|
||||||
|
uint16_t beta_leader_time = 0;
|
||||||
|
bool beta_leader_change = false;
|
||||||
|
|
||||||
|
uint16_t beta_leader_sequence[5] = {0, 0, 0, 0, 0};
|
||||||
|
uint8_t beta_leader_sequence_size = 0;
|
||||||
|
|
||||||
|
void beta_qk_leader_start(void) {
|
||||||
|
if (beta_leading) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
beta_leader_start();
|
||||||
|
beta_leading = true;
|
||||||
|
beta_leader_time = timer_read();
|
||||||
|
beta_leader_sequence_size = 0;
|
||||||
|
beta_leader_change = false; // If true, run
|
||||||
|
memset(beta_leader_sequence, 0, sizeof(beta_leader_sequence));
|
||||||
|
}
|
||||||
|
|
||||||
|
void beta_qk_leader_check() {
|
||||||
|
|
||||||
|
#ifdef LEADER_NO_TIMEOUT
|
||||||
|
bool timeout = (beta_leading && beta_leader_sequence_size > 0 && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT);
|
||||||
|
#else
|
||||||
|
bool timeout = (beta_leading && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (beta_leader_change || timeout) {
|
||||||
|
beta_leader_change = false;
|
||||||
|
|
||||||
|
if (
|
||||||
|
beta_leader_sequence[beta_leader_sequence_size - 1] == (QK_LEAD)
|
||||||
|
) {
|
||||||
|
beta_leading = false;
|
||||||
|
beta_leader_end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timeout) {
|
||||||
|
beta_leading = false;
|
||||||
|
beta_leader_end();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!beta_leader_check()) {
|
||||||
|
beta_leading = false;
|
||||||
|
beta_leader_end();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool beta_process_leader(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
// Leader key set-up
|
||||||
|
if (record->event.pressed) {
|
||||||
|
if (beta_leading) {
|
||||||
|
# ifndef LEADER_NO_TIMEOUT
|
||||||
|
if (timer_elapsed(beta_leader_time) < LEADER_TIMEOUT)
|
||||||
|
# endif // LEADER_NO_TIMEOUT
|
||||||
|
{
|
||||||
|
# ifndef LEADER_KEY_STRICT_KEY_PROCESSING
|
||||||
|
if (IS_QK_MOD_TAP(keycode)) {
|
||||||
|
keycode = QK_MOD_TAP_GET_TAP_KEYCODE(keycode);
|
||||||
|
} else if (IS_QK_LAYER_TAP(keycode)) {
|
||||||
|
keycode = QK_LAYER_TAP_GET_TAP_KEYCODE(keycode);
|
||||||
|
}
|
||||||
|
# endif // LEADER_KEY_STRICT_KEY_PROCESSING
|
||||||
|
if (beta_leader_sequence_size < ARRAY_SIZE(beta_leader_sequence)) {
|
||||||
|
beta_leader_sequence[beta_leader_sequence_size] = keycode;
|
||||||
|
beta_leader_sequence_size++;
|
||||||
|
beta_leader_change = true;
|
||||||
|
} else {
|
||||||
|
beta_leading = false;
|
||||||
|
beta_leader_end();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
# ifdef LEADER_PER_KEY_TIMING
|
||||||
|
beta_leader_time = timer_read();
|
||||||
|
# endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (keycode == QK_LEADER) {
|
||||||
|
beta_qk_leader_start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
106
keyboards/betalupi_ergodox/features/rawhid_commands.h
Normal file
106
keyboards/betalupi_ergodox/features/rawhid_commands.h
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Sent by host when connection is initiated.
|
||||||
|
//
|
||||||
|
// Packet structure:
|
||||||
|
// Data: | cmd |
|
||||||
|
// # of Bytes: | 1 |
|
||||||
|
#define CMD_HELLO 0x00
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Sent periodically by host to test connection.
|
||||||
|
// Keyboard should ignore this command.
|
||||||
|
//
|
||||||
|
// Packet structure:
|
||||||
|
// Data: | cmd |
|
||||||
|
// # of Bytes: | 1 |
|
||||||
|
#define CMD_RUTHERE 0x01
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Send keyboard state to host.
|
||||||
|
//
|
||||||
|
// Packet structure:
|
||||||
|
// Data: | cmd | anim state | layer state | layer layout |
|
||||||
|
// # of Bytes: | 1 | 1 | 4 | 1 |
|
||||||
|
//
|
||||||
|
// anim state:
|
||||||
|
// 0x00: RGBMatrix disabled
|
||||||
|
// 0x01: normal animation, no HID data.
|
||||||
|
// 0x02: FFT Animation
|
||||||
|
//
|
||||||
|
// layer state: layer state right now.
|
||||||
|
// This is a uint32_t, where each bit corresponds to a layer index.
|
||||||
|
// Lowest-order bit is base layer, highest bit is layer 31.
|
||||||
|
// Layer indices are defined by the LAYER_* enum in layer.h,
|
||||||
|
// host interface should have a matching enum.
|
||||||
|
// Make sure to update it when you change your layers!
|
||||||
|
//
|
||||||
|
// layer layout:
|
||||||
|
// The layout this layer was designed for.
|
||||||
|
// 0x00: en_us
|
||||||
|
// 0x01: russian
|
||||||
|
#define CMD_SEND_STATE 0x02
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Animation data. Sent by host.
|
||||||
|
//
|
||||||
|
// Packet structure:
|
||||||
|
// Data: | cmd | data type | data |
|
||||||
|
// # of Bytes: | 1 | 1 | ? |
|
||||||
|
//
|
||||||
|
// data type:
|
||||||
|
// Which animation this data is for. These are defined below.
|
||||||
|
//
|
||||||
|
// data:
|
||||||
|
// Animation data. Content depends on data type.
|
||||||
|
#define CMD_ANIM_DATA 0x03
|
||||||
|
|
||||||
|
// Data for FFT animation.
|
||||||
|
// Data segment consists of 10 bits, each representing the height of a column.
|
||||||
|
// Minimum height is 0, maximum is 250.
|
||||||
|
#define CMD_ANIM_DATA_fft 0x00
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Sent by keyboard to host when a complete word is typed.
|
||||||
|
// Host checks if this is a known word.
|
||||||
|
// If it is not, host responds with the same CMD (see below).
|
||||||
|
//
|
||||||
|
// Packet structure (sent by keyboard):
|
||||||
|
// Data: | cmd | word length | keycodes |
|
||||||
|
// # of Bytes: | 1 | 1 | ? |
|
||||||
|
//
|
||||||
|
// word length: number of bytes in `keycodes` block
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Packet structure (sent by host):
|
||||||
|
// Data: | cmd | typo? |
|
||||||
|
// # of Bytes: | 1 | 1 |
|
||||||
|
//
|
||||||
|
// typo: If this is 0x01, the word we got was a typo.
|
||||||
|
#define CMD_SPELLCHECK_WORD 0x04
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Sent by host when a "special char" key is pressed.
|
||||||
|
// Handled by host interface.
|
||||||
|
//
|
||||||
|
// Packet structure:
|
||||||
|
// Data: | cmd | character |
|
||||||
|
// # of Bytes: | 1 | 2 |
|
||||||
|
//
|
||||||
|
// character:
|
||||||
|
// uint16_t, character id
|
||||||
|
//
|
||||||
|
#define CMD_SPECIAL_CHAR 0x05
|
34
keyboards/betalupi_ergodox/hardware/macros.h
Normal file
34
keyboards/betalupi_ergodox/hardware/macros.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
// Turns {h, s, v} triples into a macro, so that
|
||||||
|
// the LEDS_ergodox macro can take them as inputs.
|
||||||
|
#define LC_HSV(h, s, v) {h, s, v}
|
||||||
|
|
||||||
|
// Rearrange a human-readable LED layout into the correct Ergodox order.
|
||||||
|
// LEDS_ergodox ONLY WORKS WITH MACROS.
|
||||||
|
// Don't input a standalone triple {h, s, v};
|
||||||
|
// Use LC_HSV if you need a single-instance color.
|
||||||
|
#define LEDS_ergodox( \
|
||||||
|
l01,l02,l03,l04,l05, \
|
||||||
|
l06,l07,l08,l09,l10, \
|
||||||
|
l11,l12,l13,l14,l15, \
|
||||||
|
l16,l17,l18,l19,l20, \
|
||||||
|
l21,l22,l23,l24, \
|
||||||
|
\
|
||||||
|
l25,l26,l27,l28,l29, \
|
||||||
|
l30,l31,l32,l33,l34, \
|
||||||
|
l35,l36,l37,l38,l39, \
|
||||||
|
l40,l41,l42,l43,l44, \
|
||||||
|
l45,l46,l47,l48 \
|
||||||
|
) \
|
||||||
|
{ \
|
||||||
|
l25,l26,l27,l28,l29, \
|
||||||
|
l30,l31,l32,l33,l34, \
|
||||||
|
l35,l36,l37,l38,l39, \
|
||||||
|
l40,l41,l42,l43,l44, \
|
||||||
|
l45,l46,l47,l48, \
|
||||||
|
\
|
||||||
|
l05,l04,l03,l02,l01, \
|
||||||
|
l10,l09,l08,l07,l06, \
|
||||||
|
l15,l14,l13,l12,l11, \
|
||||||
|
l20,l19,l18,l17,l16, \
|
||||||
|
l24,l23,l22,l21 \
|
||||||
|
}
|
133
keyboards/betalupi_ergodox/hardware/maps.c
Normal file
133
keyboards/betalupi_ergodox/hardware/maps.c
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
#include "betalupi_ergodox.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SWAP_HANDS_ENABLE
|
||||||
|
__attribute__ ((weak))
|
||||||
|
// swap-hands action needs a matrix to define the swap
|
||||||
|
const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* Left hand, matrix positions */
|
||||||
|
{{0,13}, {1,13}, {2,13}, {3,13}, {4,13}, {5,13}},
|
||||||
|
{{0,12}, {1,12}, {2,12}, {3,12}, {4,12}, {5,12}},
|
||||||
|
{{0,11}, {1,11}, {2,11}, {3,11}, {4,11}, {5,11}},
|
||||||
|
{{0,10}, {1,10}, {2,10}, {3,10}, {4,10}, {5,10}},
|
||||||
|
{{0,9}, {1,9}, {2,9}, {3,9}, {4,9}, {5,9}},
|
||||||
|
{{0,8}, {1,8}, {2,8}, {3,8}, {4,8}, {5,8}},
|
||||||
|
{{0,7}, {1,7}, {2,7}, {3,7}, {4,7}, {5,7}},
|
||||||
|
/* Right hand, matrix positions */
|
||||||
|
{{0,6}, {1,6}, {2,6}, {3,6}, {4,6}, {5,6}},
|
||||||
|
{{0,5}, {1,5}, {2,5}, {3,5}, {4,5}, {5,5}},
|
||||||
|
{{0,4}, {1,4}, {2,4}, {3,4}, {4,4}, {5,4}},
|
||||||
|
{{0,3}, {1,3}, {2,3}, {3,3}, {4,3}, {5,3}},
|
||||||
|
{{0,2}, {1,2}, {2,2}, {3,2}, {4,2}, {5,2}},
|
||||||
|
{{0,1}, {1,1}, {2,1}, {3,1}, {4,1}, {5,1}},
|
||||||
|
{{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}},
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
|
void suspend_power_down_kb(void) {
|
||||||
|
rgb_matrix_set_suspend_state(true);
|
||||||
|
suspend_power_down_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
void suspend_wakeup_init_kb(void) {
|
||||||
|
rgb_matrix_set_suspend_state(false);
|
||||||
|
suspend_wakeup_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
const is31_led g_is31_leds[RGB_MATRIX_LED_COUNT] = {
|
||||||
|
//{driver, R location, G location, B location}
|
||||||
|
|
||||||
|
{0, C3_1, C2_1, C4_1}, // LED1 on right
|
||||||
|
{0, C6_1, C5_1, C7_1}, // LED2
|
||||||
|
{0, C4_2, C3_2, C5_2}, // LED3
|
||||||
|
{0, C7_2, C6_2, C8_2}, // LED4
|
||||||
|
{0, C2_3, C1_3, C3_3}, // LED5
|
||||||
|
{0, C5_3, C4_3, C6_3}, // LED6
|
||||||
|
{0, C8_3, C7_3, C9_3}, // LED7
|
||||||
|
{0, C2_4, C1_4, C3_4}, // LED8
|
||||||
|
{0, C6_4, C5_4, C7_4}, // LED9
|
||||||
|
{0, C2_5, C1_5, C3_5}, // LED10
|
||||||
|
{0, C7_5, C6_5, C8_5}, // LED11
|
||||||
|
{0, C2_6, C1_6, C3_6}, // LED12
|
||||||
|
{0, C5_6, C4_6, C6_6}, // LED13
|
||||||
|
{0, C8_6, C7_6, C9_6}, // LED14
|
||||||
|
{0, C2_7, C1_7, C3_7}, // LED15
|
||||||
|
{0, C5_7, C4_7, C6_7}, // LED16
|
||||||
|
{0, C2_8, C1_8, C3_8}, // LED17
|
||||||
|
{0, C5_8, C4_8, C6_8}, // LED18
|
||||||
|
|
||||||
|
{0, C3_9, C2_9, C4_9}, // LED19
|
||||||
|
{0, C6_9, C5_9, C7_9}, // LED20
|
||||||
|
{0, C4_10, C3_10, C5_10}, // LED21
|
||||||
|
{0, C7_10, C6_10, C8_10}, // LED22
|
||||||
|
{0, C2_11, C1_11, C3_11}, // LED23
|
||||||
|
{0, C5_11, C4_11, C6_11}, // LED24
|
||||||
|
|
||||||
|
{1, C3_1, C2_1, C4_1}, // LED1 on left
|
||||||
|
{1, C6_1, C5_1, C7_1}, // LED2
|
||||||
|
{1, C4_2, C3_2, C5_2}, // LED3
|
||||||
|
{1, C7_2, C6_2, C8_2}, // LED4
|
||||||
|
{1, C2_3, C1_3, C3_3}, // LED5
|
||||||
|
{1, C5_3, C4_3, C6_3}, // LED6
|
||||||
|
{1, C8_3, C7_3, C9_3}, // LED7
|
||||||
|
{1, C2_4, C1_4, C3_4}, // LED8
|
||||||
|
{1, C6_4, C5_4, C7_4}, // LED9
|
||||||
|
{1, C2_5, C1_5, C3_5}, // LED10
|
||||||
|
{1, C7_5, C6_5, C8_5}, // LED11
|
||||||
|
{1, C2_6, C1_6, C3_6}, // LED12
|
||||||
|
{1, C5_6, C4_6, C6_6}, // LED13
|
||||||
|
{1, C8_6, C7_6, C9_6}, // LED14
|
||||||
|
{1, C2_7, C1_7, C3_7}, // LED15
|
||||||
|
{1, C5_7, C4_7, C6_7}, // LED16
|
||||||
|
{1, C2_8, C1_8, C3_8}, // LED17
|
||||||
|
{1, C5_8, C4_8, C6_8}, // LED18
|
||||||
|
|
||||||
|
{1, C3_9, C2_9, C4_9}, // LED19
|
||||||
|
{1, C6_9, C5_9, C7_9}, // LED20
|
||||||
|
{1, C4_10, C3_10, C5_10}, // LED21
|
||||||
|
{1, C7_10, C6_10, C8_10}, // LED22
|
||||||
|
{1, C2_11, C1_11, C3_11}, // LED23
|
||||||
|
{1, C5_11, C4_11, C6_11} // LED24
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
led_config_t g_led_config = { {
|
||||||
|
// Key matrix to LED index
|
||||||
|
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED },
|
||||||
|
{ 28, 33, 38, 43, 47, NO_LED },
|
||||||
|
{ 27, 32, 37, 42, 46, NO_LED },
|
||||||
|
{ 26, 31, 36, 41, 45, NO_LED },
|
||||||
|
{ 25, 30, 35, 40, 44, NO_LED },
|
||||||
|
{ 24, 29, 34, 39, NO_LED, NO_LED },
|
||||||
|
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED },
|
||||||
|
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED },
|
||||||
|
{ 0, 5, 10, 15, NO_LED, NO_LED },
|
||||||
|
{ 1, 6, 11, 16, 20, NO_LED },
|
||||||
|
{ 2, 7, 12, 17, 21, NO_LED },
|
||||||
|
{ 3, 8, 13, 18, 22, NO_LED },
|
||||||
|
{ 4, 9, 14, 19, 23, NO_LED },
|
||||||
|
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED }
|
||||||
|
}, {
|
||||||
|
// LED index to physical position
|
||||||
|
{ 137, 0 }, { 154, 0 }, { 172, 0 }, { 189, 0 }, { 206, 0 }, { 137, 12 },
|
||||||
|
{ 154, 12 }, { 172, 12 }, { 189, 12 }, { 206, 12 }, { 137, 25 }, { 154, 25 },
|
||||||
|
{ 172, 25 }, { 189, 25 }, { 206, 25 }, { 137, 38 }, { 154, 38 }, { 172, 38 },
|
||||||
|
{ 189, 38 }, { 206, 38 }, { 154, 51 }, { 172, 51 }, { 189, 51 }, { 206, 51 },
|
||||||
|
{ 86, 0 }, { 68, 0 }, { 51, 0 }, { 34, 0 }, { 17, 0 }, { 86, 12 },
|
||||||
|
{ 68, 12 }, { 51, 12 }, { 34, 12 }, { 17, 12 }, { 86, 25 }, { 68, 25 },
|
||||||
|
{ 51, 25 }, { 34, 25 }, { 17, 25 }, { 86, 38 }, { 68, 38 }, { 51, 38 },
|
||||||
|
{ 34, 38 }, { 17, 38 }, { 68, 51 }, { 51, 51 }, { 34, 51 }, { 17, 51 }
|
||||||
|
}, {
|
||||||
|
// LED index to flag
|
||||||
|
4, 4, 4, 4, 4, 4,
|
||||||
|
4, 4, 4, 4, 4, 4,
|
||||||
|
4, 4, 4, 4, 4, 4,
|
||||||
|
4, 4, 1, 1, 1, 1,
|
||||||
|
4, 4, 4, 4, 4, 4,
|
||||||
|
4, 4, 4, 4, 4, 4,
|
||||||
|
4, 4, 4, 4, 4, 4,
|
||||||
|
4, 4, 1, 1, 1, 1
|
||||||
|
} };
|
||||||
|
#endif
|
@ -1,32 +1,3 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
Note for ErgoDox EZ customizers: Here be dragons!
|
|
||||||
This is not a file you want to be messing with.
|
|
||||||
All of the interesting stuff for you is under keymaps/ :)
|
|
||||||
Love, Erez
|
|
||||||
|
|
||||||
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
|
||||||
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
|
|
||||||
Copyright 2015 ZSA Technology Labs Inc (@zsa)
|
|
||||||
Copyright 2020 Christopher Courtney <drashna@live.com> (@drashna)
|
|
||||||
|
|
||||||
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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* scan matrix
|
|
||||||
*/
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
403
keyboards/betalupi_ergodox/info.json
Normal file
403
keyboards/betalupi_ergodox/info.json
Normal file
@ -0,0 +1,403 @@
|
|||||||
|
{
|
||||||
|
"keyboard_name": "Betalupi ErgoDox",
|
||||||
|
"url": "betalupi.com",
|
||||||
|
"maintainer": "mark@betalupi",
|
||||||
|
"manufacturer": "Betalupi",
|
||||||
|
|
||||||
|
"usb": {
|
||||||
|
// ZSA Labs
|
||||||
|
"vid": "0x3297",
|
||||||
|
// Ergodox glow variant
|
||||||
|
"pid": "0x4976",
|
||||||
|
"device_version": "1.0.0"
|
||||||
|
},
|
||||||
|
|
||||||
|
"width": 17,
|
||||||
|
"height": 8,
|
||||||
|
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT_ergodox": {
|
||||||
|
"layout": [
|
||||||
|
{"matrix": [0, 0], "x": 0, "y": 0.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 0], "x": 1.5, "y": 0.375},
|
||||||
|
{"matrix": [2, 0], "x": 2.5, "y": 0.125},
|
||||||
|
{"matrix": [3, 0], "x": 3.5, "y": 0},
|
||||||
|
{"matrix": [4, 0], "x": 4.5, "y": 0.125},
|
||||||
|
{"matrix": [5, 0], "x": 5.5, "y": 0.25},
|
||||||
|
{"matrix": [6, 0], "x": 6.5, "y": 0.25},
|
||||||
|
|
||||||
|
{"matrix": [0, 1], "x": 0, "y": 1.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 1], "x": 1.5, "y": 1.375},
|
||||||
|
{"matrix": [2, 1], "x": 2.5, "y": 1.125},
|
||||||
|
{"matrix": [3, 1], "x": 3.5, "y": 1},
|
||||||
|
{"matrix": [4, 1], "x": 4.5, "y": 1.125},
|
||||||
|
{"matrix": [5, 1], "x": 5.5, "y": 1.25},
|
||||||
|
{"matrix": [6, 1], "x": 6.5, "y": 1.25, "h": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [0, 2], "x": 0, "y": 2.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 2], "x": 1.5, "y": 2.375},
|
||||||
|
{"matrix": [2, 2], "x": 2.5, "y": 2.125},
|
||||||
|
{"matrix": [3, 2], "x": 3.5, "y": 2},
|
||||||
|
{"matrix": [4, 2], "x": 4.5, "y": 2.125},
|
||||||
|
{"matrix": [5, 2], "x": 5.5, "y": 2.25},
|
||||||
|
|
||||||
|
{"matrix": [0, 3], "x": 0, "y": 3.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 3], "x": 1.5, "y": 3.375},
|
||||||
|
{"matrix": [2, 3], "x": 2.5, "y": 3.125},
|
||||||
|
{"matrix": [3, 3], "x": 3.5, "y": 3},
|
||||||
|
{"matrix": [4, 3], "x": 4.5, "y": 3.125},
|
||||||
|
{"matrix": [5, 3], "x": 5.5, "y": 3.25},
|
||||||
|
{"matrix": [6, 3], "x": 6.5, "y": 2.75, "h": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [0, 4], "x": 0.5, "y": 4.375},
|
||||||
|
{"matrix": [1, 4], "x": 1.5, "y": 4.375},
|
||||||
|
{"matrix": [2, 4], "x": 2.5, "y": 4.125},
|
||||||
|
{"matrix": [3, 4], "x": 3.5, "y": 4},
|
||||||
|
{"matrix": [4, 4], "x": 4.5, "y": 4.125},
|
||||||
|
|
||||||
|
{"matrix": [5, 5], "x": 6, "y": 5},
|
||||||
|
{"matrix": [6, 5], "x": 7, "y": 5},
|
||||||
|
{"matrix": [4, 5], "x": 7, "y": 6},
|
||||||
|
{"matrix": [3, 5], "x": 5, "y": 6, "h": 2},
|
||||||
|
{"matrix": [2, 5], "x": 6, "y": 6, "h": 2},
|
||||||
|
{"matrix": [1, 5], "x": 7, "y": 7},
|
||||||
|
|
||||||
|
{"matrix": [7, 0], "x": 9.5, "y": 0.25},
|
||||||
|
{"matrix": [8, 0], "x": 10.5, "y": 0.25},
|
||||||
|
{"matrix": [9, 0], "x": 11.5, "y": 0.125},
|
||||||
|
{"matrix": [10, 0], "x": 12.5, "y": 0},
|
||||||
|
{"matrix": [11, 0], "x": 13.5, "y": 0.125},
|
||||||
|
{"matrix": [12, 0], "x": 14.5, "y": 0.375},
|
||||||
|
{"matrix": [13, 0], "x": 15.5, "y": 0.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [7, 1], "x": 9.5, "y": 1.25, "h": 1.5},
|
||||||
|
{"matrix": [8, 1], "x": 10.5, "y": 1.25},
|
||||||
|
{"matrix": [9, 1], "x": 11.5, "y": 1.125},
|
||||||
|
{"matrix": [10, 1], "x": 12.5, "y": 1},
|
||||||
|
{"matrix": [11, 1], "x": 13.5, "y": 1.125},
|
||||||
|
{"matrix": [12, 1], "x": 14.5, "y": 1.375},
|
||||||
|
{"matrix": [13, 1], "x": 15.5, "y": 1.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [8, 2], "x": 10.5, "y": 2.25},
|
||||||
|
{"matrix": [9, 2], "x": 11.5, "y": 2.125},
|
||||||
|
{"matrix": [10, 2], "x": 12.5, "y": 2},
|
||||||
|
{"matrix": [11, 2], "x": 13.5, "y": 2.125},
|
||||||
|
{"matrix": [12, 2], "x": 14.5, "y": 2.375},
|
||||||
|
{"matrix": [13, 2], "x": 15.5, "y": 2.375, "w": 1.5},
|
||||||
|
{"matrix": [7, 3], "x": 9.5, "y": 2.75, "h": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [8, 3], "x": 10.5, "y": 3.25},
|
||||||
|
{"matrix": [9, 3], "x": 11.5, "y": 3.125},
|
||||||
|
{"matrix": [10, 3], "x": 12.5, "y": 3},
|
||||||
|
{"matrix": [11, 3], "x": 13.5, "y": 3.125},
|
||||||
|
{"matrix": [12, 3], "x": 14.5, "y": 3.375},
|
||||||
|
{"matrix": [13, 3], "x": 15.5, "y": 3.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [9, 4], "x": 11.5, "y": 4.125},
|
||||||
|
{"matrix": [10, 4], "x": 12.5, "y": 4},
|
||||||
|
{"matrix": [11, 4], "x": 13.5, "y": 4.125},
|
||||||
|
{"matrix": [12, 4], "x": 14.5, "y": 4.375},
|
||||||
|
{"matrix": [13, 4], "x": 15.5, "y": 4.375},
|
||||||
|
|
||||||
|
{"matrix": [7, 5], "x": 9, "y": 5},
|
||||||
|
{"matrix": [8, 5], "x": 10, "y": 5},
|
||||||
|
{"matrix": [9, 5], "x": 9, "y": 6},
|
||||||
|
{"matrix": [12, 5], "x": 9, "y": 7},
|
||||||
|
{"matrix": [11, 5], "x": 10, "y": 6, "h": 2},
|
||||||
|
{"matrix": [10, 5], "x": 11, "y": 6, "h": 2}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"LAYOUT_ergodox_pretty": {
|
||||||
|
"layout": [
|
||||||
|
{"matrix": [0, 0], "x": 0, "y": 0.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 0], "x": 1.5, "y": 0.375},
|
||||||
|
{"matrix": [2, 0], "x": 2.5, "y": 0.125},
|
||||||
|
{"matrix": [3, 0], "x": 3.5, "y": 0},
|
||||||
|
{"matrix": [4, 0], "x": 4.5, "y": 0.125},
|
||||||
|
{"matrix": [5, 0], "x": 5.5, "y": 0.25},
|
||||||
|
{"matrix": [6, 0], "x": 6.5, "y": 0.25},
|
||||||
|
|
||||||
|
{"matrix": [7, 0], "x": 9.5, "y": 0.25},
|
||||||
|
{"matrix": [8, 0], "x": 10.5, "y": 0.25},
|
||||||
|
{"matrix": [9, 0], "x": 11.5, "y": 0.125},
|
||||||
|
{"matrix": [10, 0], "x": 12.5, "y": 0},
|
||||||
|
{"matrix": [11, 0], "x": 13.5, "y": 0.125},
|
||||||
|
{"matrix": [12, 0], "x": 14.5, "y": 0.375},
|
||||||
|
{"matrix": [13, 0], "x": 15.5, "y": 0.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [0, 1], "x": 0, "y": 1.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 1], "x": 1.5, "y": 1.375},
|
||||||
|
{"matrix": [2, 1], "x": 2.5, "y": 1.125},
|
||||||
|
{"matrix": [3, 1], "x": 3.5, "y": 1},
|
||||||
|
{"matrix": [4, 1], "x": 4.5, "y": 1.125},
|
||||||
|
{"matrix": [5, 1], "x": 5.5, "y": 1.25},
|
||||||
|
{"matrix": [6, 1], "x": 6.5, "y": 1.25, "h": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [7, 1], "x": 9.5, "y": 1.25, "h": 1.5},
|
||||||
|
{"matrix": [8, 1], "x": 10.5, "y": 1.25},
|
||||||
|
{"matrix": [9, 1], "x": 11.5, "y": 1.125},
|
||||||
|
{"matrix": [10, 1], "x": 12.5, "y": 1},
|
||||||
|
{"matrix": [11, 1], "x": 13.5, "y": 1.125},
|
||||||
|
{"matrix": [12, 1], "x": 14.5, "y": 1.375},
|
||||||
|
{"matrix": [13, 1], "x": 15.5, "y": 1.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [0, 2], "x": 0, "y": 2.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 2], "x": 1.5, "y": 2.375},
|
||||||
|
{"matrix": [2, 2], "x": 2.5, "y": 2.125},
|
||||||
|
{"matrix": [3, 2], "x": 3.5, "y": 2},
|
||||||
|
{"matrix": [4, 2], "x": 4.5, "y": 2.125},
|
||||||
|
{"matrix": [5, 2], "x": 5.5, "y": 2.25},
|
||||||
|
|
||||||
|
{"matrix": [8, 2], "x": 10.5, "y": 2.25},
|
||||||
|
{"matrix": [9, 2], "x": 11.5, "y": 2.125},
|
||||||
|
{"matrix": [10, 2], "x": 12.5, "y": 2},
|
||||||
|
{"matrix": [11, 2], "x": 13.5, "y": 2.125},
|
||||||
|
{"matrix": [12, 2], "x": 14.5, "y": 2.375},
|
||||||
|
{"matrix": [13, 2], "x": 15.5, "y": 2.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [0, 3], "x": 0, "y": 3.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 3], "x": 1.5, "y": 3.375},
|
||||||
|
{"matrix": [2, 3], "x": 2.5, "y": 3.125},
|
||||||
|
{"matrix": [3, 3], "x": 3.5, "y": 3},
|
||||||
|
{"matrix": [4, 3], "x": 4.5, "y": 3.125},
|
||||||
|
{"matrix": [5, 3], "x": 5.5, "y": 3.25},
|
||||||
|
{"matrix": [6, 3], "x": 6.5, "y": 2.75, "h": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [7, 3], "x": 9.5, "y": 2.75, "h": 1.5},
|
||||||
|
{"matrix": [8, 3], "x": 10.5, "y": 3.25},
|
||||||
|
{"matrix": [9, 3], "x": 11.5, "y": 3.125},
|
||||||
|
{"matrix": [10, 3], "x": 12.5, "y": 3},
|
||||||
|
{"matrix": [11, 3], "x": 13.5, "y": 3.125},
|
||||||
|
{"matrix": [12, 3], "x": 14.5, "y": 3.375},
|
||||||
|
{"matrix": [13, 3], "x": 15.5, "y": 3.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [0, 4], "x": 0.5, "y": 4.375},
|
||||||
|
{"matrix": [1, 4], "x": 1.5, "y": 4.375},
|
||||||
|
{"matrix": [2, 4], "x": 2.5, "y": 4.125},
|
||||||
|
{"matrix": [3, 4], "x": 3.5, "y": 4},
|
||||||
|
{"matrix": [4, 4], "x": 4.5, "y": 4.125},
|
||||||
|
|
||||||
|
{"matrix": [9, 4], "x": 11.5, "y": 4.125},
|
||||||
|
{"matrix": [10, 4], "x": 12.5, "y": 4},
|
||||||
|
{"matrix": [11, 4], "x": 13.5, "y": 4.125},
|
||||||
|
{"matrix": [12, 4], "x": 14.5, "y": 4.375},
|
||||||
|
{"matrix": [13, 4], "x": 15.5, "y": 4.375},
|
||||||
|
|
||||||
|
{"matrix": [5, 5], "x": 6, "y": 5},
|
||||||
|
{"matrix": [6, 5], "x": 7, "y": 5},
|
||||||
|
|
||||||
|
{"matrix": [7, 5], "x": 9, "y": 5},
|
||||||
|
{"matrix": [8, 5], "x": 10, "y": 5},
|
||||||
|
|
||||||
|
{"matrix": [4, 5], "x": 7, "y": 6},
|
||||||
|
{"matrix": [9, 5], "x": 9, "y": 6},
|
||||||
|
|
||||||
|
{"matrix": [3, 5], "x": 5, "y": 6, "h": 2},
|
||||||
|
{"matrix": [2, 5], "x": 6, "y": 6, "h": 2},
|
||||||
|
{"matrix": [1, 5], "x": 7, "y": 7},
|
||||||
|
|
||||||
|
{"matrix": [12, 5], "x": 9, "y": 7},
|
||||||
|
{"matrix": [11, 5], "x": 10, "y": 6, "h": 2},
|
||||||
|
{"matrix": [10, 5], "x": 11, "y": 6, "h": 2}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"LAYOUT_ergodox_80": {
|
||||||
|
"layout": [
|
||||||
|
{"matrix": [0, 0], "x": 0, "y": 0.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 0], "x": 1.5, "y": 0.375},
|
||||||
|
{"matrix": [2, 0], "x": 2.5, "y": 0.125},
|
||||||
|
{"matrix": [3, 0], "x": 3.5, "y": 0},
|
||||||
|
{"matrix": [4, 0], "x": 4.5, "y": 0.125},
|
||||||
|
{"matrix": [5, 0], "x": 5.5, "y": 0.25},
|
||||||
|
{"matrix": [6, 0], "x": 6.5, "y": 0.25},
|
||||||
|
|
||||||
|
{"matrix": [0, 1], "x": 0, "y": 1.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 1], "x": 1.5, "y": 1.375},
|
||||||
|
{"matrix": [2, 1], "x": 2.5, "y": 1.125},
|
||||||
|
{"matrix": [3, 1], "x": 3.5, "y": 1},
|
||||||
|
{"matrix": [4, 1], "x": 4.5, "y": 1.125},
|
||||||
|
{"matrix": [5, 1], "x": 5.5, "y": 1.25},
|
||||||
|
{"matrix": [6, 1], "x": 6.5, "y": 1.25, "h": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [0, 2], "x": 0, "y": 2.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 2], "x": 1.5, "y": 2.375},
|
||||||
|
{"matrix": [2, 2], "x": 2.5, "y": 2.125},
|
||||||
|
{"matrix": [3, 2], "x": 3.5, "y": 2},
|
||||||
|
{"matrix": [4, 2], "x": 4.5, "y": 2.125},
|
||||||
|
{"matrix": [5, 2], "x": 5.5, "y": 2.25},
|
||||||
|
|
||||||
|
{"matrix": [0, 3], "x": 0, "y": 3.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 3], "x": 1.5, "y": 3.375},
|
||||||
|
{"matrix": [2, 3], "x": 2.5, "y": 3.125},
|
||||||
|
{"matrix": [3, 3], "x": 3.5, "y": 3},
|
||||||
|
{"matrix": [4, 3], "x": 4.5, "y": 3.125},
|
||||||
|
{"matrix": [5, 3], "x": 5.5, "y": 3.25},
|
||||||
|
{"matrix": [6, 3], "x": 6.5, "y": 2.75, "h": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [0, 4], "x": 0.5, "y": 4.375},
|
||||||
|
{"matrix": [1, 4], "x": 1.5, "y": 4.375},
|
||||||
|
{"matrix": [2, 4], "x": 2.5, "y": 4.125},
|
||||||
|
{"matrix": [3, 4], "x": 3.5, "y": 4},
|
||||||
|
{"matrix": [4, 4], "x": 4.5, "y": 4.125},
|
||||||
|
|
||||||
|
{"matrix": [5, 5], "x": 6, "y": 5},
|
||||||
|
{"matrix": [6, 5], "x": 7, "y": 5},
|
||||||
|
|
||||||
|
{"matrix": [5, 4], "x": 5, "y": 6},
|
||||||
|
{"matrix": [6, 4], "x": 6, "y": 6},
|
||||||
|
{"matrix": [4, 5], "x": 7, "y": 6},
|
||||||
|
|
||||||
|
{"matrix": [3, 5], "x": 5, "y": 7},
|
||||||
|
{"matrix": [2, 5], "x": 6, "y": 7},
|
||||||
|
{"matrix": [1, 5], "x": 7, "y": 7},
|
||||||
|
|
||||||
|
{"matrix": [7, 0], "x": 9.5, "y": 0.25},
|
||||||
|
{"matrix": [8, 0], "x": 10.5, "y": 0.25},
|
||||||
|
{"matrix": [9, 0], "x": 11.5, "y": 0.125},
|
||||||
|
{"matrix": [10, 0], "x": 12.5, "y": 0},
|
||||||
|
{"matrix": [11, 0], "x": 13.5, "y": 0.125},
|
||||||
|
{"matrix": [12, 0], "x": 14.5, "y": 0.375},
|
||||||
|
{"matrix": [13, 0], "x": 15.5, "y": 0.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [7, 1], "x": 9.5, "y": 1.25, "h": 1.5},
|
||||||
|
{"matrix": [8, 1], "x": 10.5, "y": 1.25},
|
||||||
|
{"matrix": [9, 1], "x": 11.5, "y": 1.125},
|
||||||
|
{"matrix": [10, 1], "x": 12.5, "y": 1},
|
||||||
|
{"matrix": [11, 1], "x": 13.5, "y": 1.125},
|
||||||
|
{"matrix": [12, 1], "x": 14.5, "y": 1.375},
|
||||||
|
{"matrix": [13, 1], "x": 15.5, "y": 1.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [8, 2], "x": 10.5, "y": 2.25},
|
||||||
|
{"matrix": [9, 2], "x": 11.5, "y": 2.125},
|
||||||
|
{"matrix": [10, 2], "x": 12.5, "y": 2},
|
||||||
|
{"matrix": [11, 2], "x": 13.5, "y": 2.125},
|
||||||
|
{"matrix": [12, 2], "x": 14.5, "y": 2.375},
|
||||||
|
{"matrix": [13, 2], "x": 15.5, "y": 2.375, "w": 1.5},
|
||||||
|
{"matrix": [7, 3], "x": 9.5, "y": 2.75, "h": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [8, 3], "x": 10.5, "y": 3.25},
|
||||||
|
{"matrix": [9, 3], "x": 11.5, "y": 3.125},
|
||||||
|
{"matrix": [10, 3], "x": 12.5, "y": 3},
|
||||||
|
{"matrix": [11, 3], "x": 13.5, "y": 3.125},
|
||||||
|
{"matrix": [12, 3], "x": 14.5, "y": 3.375},
|
||||||
|
{"matrix": [13, 3], "x": 15.5, "y": 3.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [9, 4], "x": 11.5, "y": 4.125},
|
||||||
|
{"matrix": [10, 4], "x": 12.5, "y": 4},
|
||||||
|
{"matrix": [11, 4], "x": 13.5, "y": 4.125},
|
||||||
|
{"matrix": [12, 4], "x": 14.5, "y": 4.375},
|
||||||
|
{"matrix": [13, 4], "x": 15.5, "y": 4.375},
|
||||||
|
|
||||||
|
{"matrix": [7, 5], "x": 9, "y": 5},
|
||||||
|
{"matrix": [8, 5], "x": 10, "y": 5},
|
||||||
|
|
||||||
|
{"matrix": [9, 5], "x": 9, "y": 6},
|
||||||
|
{"matrix": [7, 4], "x": 10, "y": 6},
|
||||||
|
{"matrix": [8, 4], "x": 11, "y": 6},
|
||||||
|
|
||||||
|
{"matrix": [12, 5], "x": 9, "y": 7},
|
||||||
|
{"matrix": [11, 5], "x": 10, "y": 7},
|
||||||
|
{"matrix": [10, 5], "x": 11, "y": 7}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"LAYOUT_ergodox_pretty_80": {
|
||||||
|
"layout": [
|
||||||
|
{"matrix": [0, 0], "x": 0, "y": 0.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 0], "x": 1.5, "y": 0.375},
|
||||||
|
{"matrix": [2, 0], "x": 2.5, "y": 0.125},
|
||||||
|
{"matrix": [3, 0], "x": 3.5, "y": 0},
|
||||||
|
{"matrix": [4, 0], "x": 4.5, "y": 0.125},
|
||||||
|
{"matrix": [5, 0], "x": 5.5, "y": 0.25},
|
||||||
|
{"matrix": [6, 0], "x": 6.5, "y": 0.25},
|
||||||
|
|
||||||
|
{"matrix": [7, 0], "x": 9.5, "y": 0.25},
|
||||||
|
{"matrix": [8, 0], "x": 10.5, "y": 0.25},
|
||||||
|
{"matrix": [9, 0], "x": 11.5, "y": 0.125},
|
||||||
|
{"matrix": [10, 0], "x": 12.5, "y": 0},
|
||||||
|
{"matrix": [11, 0], "x": 13.5, "y": 0.125},
|
||||||
|
{"matrix": [12, 0], "x": 14.5, "y": 0.375},
|
||||||
|
{"matrix": [13, 0], "x": 15.5, "y": 0.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [0, 1], "x": 0, "y": 1.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 1], "x": 1.5, "y": 1.375},
|
||||||
|
{"matrix": [2, 1], "x": 2.5, "y": 1.125},
|
||||||
|
{"matrix": [3, 1], "x": 3.5, "y": 1},
|
||||||
|
{"matrix": [4, 1], "x": 4.5, "y": 1.125},
|
||||||
|
{"matrix": [5, 1], "x": 5.5, "y": 1.25},
|
||||||
|
{"matrix": [6, 1], "x": 6.5, "y": 1.25, "h": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [7, 1], "x": 9.5, "y": 1.25, "h": 1.5},
|
||||||
|
{"matrix": [8, 1], "x": 10.5, "y": 1.25},
|
||||||
|
{"matrix": [9, 1], "x": 11.5, "y": 1.125},
|
||||||
|
{"matrix": [10, 1], "x": 12.5, "y": 1},
|
||||||
|
{"matrix": [11, 1], "x": 13.5, "y": 1.125},
|
||||||
|
{"matrix": [12, 1], "x": 14.5, "y": 1.375},
|
||||||
|
{"matrix": [13, 1], "x": 15.5, "y": 1.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [0, 2], "x": 0, "y": 2.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 2], "x": 1.5, "y": 2.375},
|
||||||
|
{"matrix": [2, 2], "x": 2.5, "y": 2.125},
|
||||||
|
{"matrix": [3, 2], "x": 3.5, "y": 2},
|
||||||
|
{"matrix": [4, 2], "x": 4.5, "y": 2.125},
|
||||||
|
{"matrix": [5, 2], "x": 5.5, "y": 2.25},
|
||||||
|
|
||||||
|
{"matrix": [8, 2], "x": 10.5, "y": 2.25},
|
||||||
|
{"matrix": [9, 2], "x": 11.5, "y": 2.125},
|
||||||
|
{"matrix": [10, 2], "x": 12.5, "y": 2},
|
||||||
|
{"matrix": [11, 2], "x": 13.5, "y": 2.125},
|
||||||
|
{"matrix": [12, 2], "x": 14.5, "y": 2.375},
|
||||||
|
{"matrix": [13, 2], "x": 15.5, "y": 2.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [0, 3], "x": 0, "y": 3.375, "w": 1.5},
|
||||||
|
{"matrix": [1, 3], "x": 1.5, "y": 3.375},
|
||||||
|
{"matrix": [2, 3], "x": 2.5, "y": 3.125},
|
||||||
|
{"matrix": [3, 3], "x": 3.5, "y": 3},
|
||||||
|
{"matrix": [4, 3], "x": 4.5, "y": 3.125},
|
||||||
|
{"matrix": [5, 3], "x": 5.5, "y": 3.25},
|
||||||
|
{"matrix": [6, 3], "x": 6.5, "y": 2.75, "h": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [7, 3], "x": 9.5, "y": 2.75, "h": 1.5},
|
||||||
|
{"matrix": [8, 3], "x": 10.5, "y": 3.25},
|
||||||
|
{"matrix": [9, 3], "x": 11.5, "y": 3.125},
|
||||||
|
{"matrix": [10, 3], "x": 12.5, "y": 3},
|
||||||
|
{"matrix": [11, 3], "x": 13.5, "y": 3.125},
|
||||||
|
{"matrix": [12, 3], "x": 14.5, "y": 3.375},
|
||||||
|
{"matrix": [13, 3], "x": 15.5, "y": 3.375, "w": 1.5},
|
||||||
|
|
||||||
|
{"matrix": [0, 4], "x": 0.5, "y": 4.375},
|
||||||
|
{"matrix": [1, 4], "x": 1.5, "y": 4.375},
|
||||||
|
{"matrix": [2, 4], "x": 2.5, "y": 4.125},
|
||||||
|
{"matrix": [3, 4], "x": 3.5, "y": 4},
|
||||||
|
{"matrix": [4, 4], "x": 4.5, "y": 4.125},
|
||||||
|
|
||||||
|
{"matrix": [9, 4], "x": 11.5, "y": 4.125},
|
||||||
|
{"matrix": [10, 4], "x": 12.5, "y": 4},
|
||||||
|
{"matrix": [11, 4], "x": 13.5, "y": 4.125},
|
||||||
|
{"matrix": [12, 4], "x": 14.5, "y": 4.375},
|
||||||
|
{"matrix": [13, 4], "x": 15.5, "y": 4.375},
|
||||||
|
|
||||||
|
{"matrix": [5, 5], "x": 6, "y": 5},
|
||||||
|
{"matrix": [6, 5], "x": 7, "y": 5},
|
||||||
|
|
||||||
|
{"matrix": [7, 5], "x": 9, "y": 5},
|
||||||
|
{"matrix": [8, 5], "x": 10, "y": 5},
|
||||||
|
|
||||||
|
{"matrix": [5, 4], "x": 5, "y": 6},
|
||||||
|
{"matrix": [6, 4], "x": 6, "y": 6},
|
||||||
|
{"matrix": [4, 5], "x": 7, "y": 6},
|
||||||
|
|
||||||
|
{"matrix": [9, 5], "x": 9, "y": 6},
|
||||||
|
{"matrix": [7, 4], "x": 10, "y": 6},
|
||||||
|
{"matrix": [8, 4], "x": 11, "y": 6},
|
||||||
|
|
||||||
|
{"matrix": [3, 5], "x": 5, "y": 7},
|
||||||
|
{"matrix": [2, 5], "x": 6, "y": 7},
|
||||||
|
{"matrix": [1, 5], "x": 7, "y": 7},
|
||||||
|
|
||||||
|
{"matrix": [12, 5], "x": 9, "y": 7},
|
||||||
|
{"matrix": [11, 5], "x": 10, "y": 7},
|
||||||
|
{"matrix": [10, 5], "x": 11, "y": 7}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
32
keyboards/betalupi_ergodox/keymaps/default/config.h
Normal file
32
keyboards/betalupi_ergodox/keymaps/default/config.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#define ENABLE_BETA_LEADER
|
||||||
|
|
||||||
|
// No timeout after initial leader key press
|
||||||
|
#define LEADER_NO_TIMEOUT
|
||||||
|
|
||||||
|
// Timeout resets after each keypress
|
||||||
|
#define LEADER_PER_KEY_TIMING
|
||||||
|
#define LEADER_TIMEOUT 500
|
||||||
|
|
||||||
|
|
||||||
|
// Enable spellcheck over HID
|
||||||
|
//#define ENABLE_HID_SPELLCHECK
|
||||||
|
|
||||||
|
#define ENABLE_AUTOCORRECT
|
||||||
|
|
||||||
|
// RGBLight effects
|
||||||
|
// Static color is always enabled.
|
||||||
|
//#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_RGB_TEST
|
||||||
|
//#define RGBLIGHT_EFFECT_SNAKE
|
||||||
|
//#define RGBLIGHT_EFFECT_STATIC_GRADIENT
|
||||||
|
//#define RGBLIGHT_EFFECT_TWINKLE
|
||||||
|
|
||||||
|
// Custom effects
|
||||||
|
// #define RGB_MATRIX_FRAMEBUFFER_EFFECTS
|
||||||
|
// #define ENABLE_RGB_MATRIX_FFT_ANIM // Requires framebuffer
|
||||||
|
|
182
keyboards/betalupi_ergodox/keymaps/default/keymap.c
Normal file
182
keyboards/betalupi_ergodox/keymaps/default/keymap.c
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
#include "version.h"
|
||||||
|
#include "keymap_russian.h"
|
||||||
|
#include "keymap_us_international.h"
|
||||||
|
|
||||||
|
|
||||||
|
// Values that should not be saved to git.
|
||||||
|
// There should be a`secrets.h` in this directory
|
||||||
|
// with the following contents:
|
||||||
|
//
|
||||||
|
// #define SECRET_EMAIL "value"
|
||||||
|
// #define SECRET_GMAIL "value"
|
||||||
|
// #define SECRET_SCHOOL_EMAIL "value"
|
||||||
|
#include "secrets.h"
|
||||||
|
|
||||||
|
// Macro keycodes
|
||||||
|
enum custom_keycodes {
|
||||||
|
M_SHUTDOWN = BETA_SAFE_RANGE,
|
||||||
|
|
||||||
|
// Macros
|
||||||
|
M_RESETWM,
|
||||||
|
M_RU_CTRL,
|
||||||
|
M_RU_ALT,
|
||||||
|
M_GUI,
|
||||||
|
|
||||||
|
// Special characters.
|
||||||
|
// M_SPECIAL_TOP and M_SPECIAL_BOTTOM are
|
||||||
|
// bounds used to parse these. Only special
|
||||||
|
// characters should be between them.
|
||||||
|
//
|
||||||
|
// Сharacters here should be in the same
|
||||||
|
// order as they are in the host inteface.
|
||||||
|
M_SPECIAL_TOP,
|
||||||
|
M_SC_GRAVE,
|
||||||
|
M_SC_TILD,
|
||||||
|
M_SC_QUOT,
|
||||||
|
M_SC_LBR,
|
||||||
|
M_SC_RBR,
|
||||||
|
M_SC_LCBR,
|
||||||
|
M_SC_RCBR,
|
||||||
|
M_SC_LKVCH,
|
||||||
|
M_SC_RKVCH,
|
||||||
|
M_SPECIAL_BOTTOM
|
||||||
|
};
|
||||||
|
|
||||||
|
// Tapdance keycodes
|
||||||
|
enum tap_dance_codes {
|
||||||
|
TD_WMLAYOUT,
|
||||||
|
TD_SCREENSHOT,
|
||||||
|
TD_OCR
|
||||||
|
};
|
||||||
|
|
||||||
|
// LED colors
|
||||||
|
#define LC_OFF LC_HSV( 0, 0, 0)
|
||||||
|
#define LC_GREEN LC_HSV( 85, 203, 158)
|
||||||
|
#define LC_YELLOW LC_HSV( 32, 176, 255)
|
||||||
|
#define LC_PINK LC_HSV(243, 222, 234)
|
||||||
|
#define LC_CYAN LC_HSV(134, 255, 213)
|
||||||
|
#define LC_ORANGE LC_HSV( 14, 255, 255)
|
||||||
|
#define LC_WHITE LC_HSV( 0, 0, 150)
|
||||||
|
#define LC_RED LC_HSV( 0, 255, 145)
|
||||||
|
|
||||||
|
#define LC_RU_B LC_HSV( 0, 0, 165)
|
||||||
|
#define LC_RU_G LC_HSV(153, 255, 153)
|
||||||
|
#define LC_RU_K LC_HSV( 0, 255, 145)
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ENABLE_HID_SPELLCHECK
|
||||||
|
#include "features/hid_spellcheck.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_AUTOCORRECT
|
||||||
|
#include "features/autocorrect/autocorrect.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_BETA_LEADER
|
||||||
|
#include "features/leader/beta_leader.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "features/beta_rawhid.h"
|
||||||
|
|
||||||
|
// Send a special character.
|
||||||
|
// Returns false if character was caught, true otherwise.
|
||||||
|
bool send_special_character(uint16_t keycode) {
|
||||||
|
if ( (keycode > M_SPECIAL_TOP) && (keycode < M_SPECIAL_BOTTOM) ) {
|
||||||
|
hid_send_special_char(keycode - M_SPECIAL_TOP - 1);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
#ifdef ENABLE_BETA_LEADER
|
||||||
|
beta_qk_leader_check();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const uint16_t PROGMEM test_combo2[] = {KC_D, KC_F, COMBO_END};
|
||||||
|
combo_t key_combos[] = {
|
||||||
|
COMBO(test_combo2, KC_TAB),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Include all other parts of configuration
|
||||||
|
#include "layers/layers.c"
|
||||||
|
#include "parts/leader.c"
|
||||||
|
#include "parts/tapdance.c"
|
||||||
|
|
||||||
|
// Process macros.
|
||||||
|
// Return FALSE to halt key processing,
|
||||||
|
// Return TRUE to allow QMK to handle keypress.
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
|
||||||
|
#ifdef ENABLE_BETA_LEADER
|
||||||
|
if (!beta_process_leader(keycode, record)) { return false; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_HID_SPELLCHECK
|
||||||
|
if (!process_spellcheck(keycode, record)) { return false; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_AUTOCORRECT
|
||||||
|
if (!process_autocorrection(keycode, record)) { return false; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Handle special chars
|
||||||
|
if (record->event.pressed) {
|
||||||
|
if (!send_special_character(keycode)) { return false; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle macros
|
||||||
|
switch (keycode) {
|
||||||
|
case M_RESETWM:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
SEND_STRING(SS_LCTL(SS_LGUI(SS_LSFT(SS_TAP(X_R)))));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Workaround for one-shot LGUI key.
|
||||||
|
// Using just LGUI with LAYER_DESKTOP as OSL
|
||||||
|
// does not allow you to hold lgui. This does.
|
||||||
|
case M_GUI:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
register_code16(KC_LGUI);
|
||||||
|
} else {
|
||||||
|
unregister_code16(KC_LGUI);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case M_SHUTDOWN:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
SEND_STRING(SS_LGUI(SS_TAP(X_P)) SS_DELAY(100) SS_TAP(X_Y) SS_DELAY(100) SS_TAP(X_ENTER));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case M_RU_CTRL:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_move(LAYER_MAIN);
|
||||||
|
register_code16(KC_LCTL);
|
||||||
|
} else {
|
||||||
|
unregister_code16(KC_LCTL);
|
||||||
|
layer_move(LAYER_RUSSIAN);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case M_RU_ALT:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_move(LAYER_MAIN);
|
||||||
|
register_code16(KC_LALT);
|
||||||
|
} else {
|
||||||
|
unregister_code16(KC_LALT);
|
||||||
|
layer_move(LAYER_RUSSIAN);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
# EditorConfig is awesome: https://EditorConfig.org
|
||||||
|
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = false
|
@ -0,0 +1,57 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(ARROWS)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_NULL
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_ergodox(\
|
||||||
|
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_TRNS, KC_NO, LGUI(KC_LEFT), KC_UP, LGUI(KC_RIGHT), KC_PGUP, KC_NO,\
|
||||||
|
KC_LGUI, LALT(KC_LCTL), KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN,\
|
||||||
|
KC_TRNS, LGUI(KC_LCTL), KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO,\
|
||||||
|
KC_NO, KC_TRNS, KC_TRNS\
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LEDS_ergodox(\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_CYAN, LC_GREEN, LC_CYAN, LC_ORANGE, \
|
||||||
|
LC_ORANGE, LC_GREEN, LC_GREEN, LC_GREEN, LC_ORANGE, \
|
||||||
|
LC_ORANGE, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_RED, \
|
||||||
|
\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,57 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(DESKTOP)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_ergodox(\
|
||||||
|
KC_MEDIA_PLAY_PAUSE, LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4), LGUI(KC_5), KC_NO,\
|
||||||
|
LGUI(KC_TAB), KC_NO, LGUI(LCTL(KC_ENTER)), KC_NO, KC_NO, LGUI(KC_T), KC_NO,\
|
||||||
|
KC_NO, LGUI(KC_EQL), LGUI(KC_MINUS), KC_NO, LGUI(KC_F), LGUI(KC_G),\
|
||||||
|
KC_NO, KC_NO, KC_NO, LGUI(LSFT(KC_C)), LGUI(KC_N), LGUI(KC_M), KC_NO,\
|
||||||
|
M_GUI, KC_NO, KC_NO, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK,\
|
||||||
|
\
|
||||||
|
KC_NO, M_RESETWM,\
|
||||||
|
KC_NO,\
|
||||||
|
LGUI(KC_ENTER), LGUI(KC_BSLS), KC_NO,\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
M_SHUTDOWN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, LGUI(KC_P), KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO\
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LEDS_ergodox(\
|
||||||
|
LC_PINK, LC_PINK, LC_PINK, LC_PINK, LC_PINK, \
|
||||||
|
LC_OFF, LC_GREEN, LC_OFF, LC_OFF, LC_CYAN, \
|
||||||
|
LC_GREEN, LC_GREEN, LC_OFF, LC_CYAN, LC_CYAN, \
|
||||||
|
LC_OFF, LC_OFF, LC_ORANGE, LC_CYAN, LC_CYAN, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_ORANGE, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
||||||
|
)
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,58 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(FKEYS)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_NULL
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_ergodox(\
|
||||||
|
TO(LAYER_MAIN), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_NO,\
|
||||||
|
KC_NO, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NO,\
|
||||||
|
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO, \
|
||||||
|
KC_NO, KC_TRNS, KC_NO \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LEDS_ergodox(\
|
||||||
|
LC_CYAN, LC_CYAN, LC_CYAN, LC_CYAN, LC_CYAN, \
|
||||||
|
LC_CYAN, LC_CYAN, LC_CYAN, LC_CYAN, LC_CYAN, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,118 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(FLIP)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_ergodox(\
|
||||||
|
KC_ESCAPE, KC_0, KC_9, KC_8, KC_7, KC_6, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_O, KC_I, KC_U, KC_Y, KC_NO,\
|
||||||
|
KC_NO, KC_L, OSL(LAYER_FLIP_SYMBOLS_A), KC_K, KC_J, KC_H,\
|
||||||
|
KC_NO, KC_COMMA, KC_DOT, KC_P, KC_M, KC_N, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO,\
|
||||||
|
KC_ENTER, KC_RSFT, KC_NO,\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO\
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LEDS_ergodox(\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF,\
|
||||||
|
\
|
||||||
|
LC_RED, LC_RED, LC_RED, LC_RED, LC_RED, \
|
||||||
|
LC_RED, LC_RED, LC_RED, LC_RED, LC_RED, \
|
||||||
|
LC_RED, LC_RED, LC_RED, LC_RED, LC_RED, \
|
||||||
|
LC_RED, LC_RED, LC_RED, LC_RED, LC_RED, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(FLIP_SYMBOLS_A)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_ergodox(\
|
||||||
|
KC_NO, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_NO,\
|
||||||
|
KC_NO, KC_GRAVE, KC_LPRN, KC_RPRN, KC_QUES, KC_LCBR, KC_NO,\
|
||||||
|
KC_NO, KC_TILD, KC_QUOTE, KC_COMMA, KC_DOT, KC_DQUO,\
|
||||||
|
KC_NO, KC_NO, KC_LBRC, KC_RBRC, KC_EXLM, KC_RCBR, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO\
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LEDS_ergodox(\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_ORANGE, LC_CYAN, LC_CYAN, LC_PINK, LC_CYAN, \
|
||||||
|
LC_ORANGE, LC_PINK, LC_PINK, LC_PINK, LC_PINK, \
|
||||||
|
LC_OFF, LC_CYAN, LC_CYAN, LC_PINK, LC_CYAN, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
\
|
||||||
|
LC_RED, LC_RED, LC_RED, LC_RED, LC_RED, \
|
||||||
|
LC_RED, LC_RED, LC_RED, LC_RED, LC_RED, \
|
||||||
|
LC_RED, LC_RED, LC_RED, LC_RED, LC_RED, \
|
||||||
|
LC_RED, LC_RED, LC_RED, LC_RED, LC_RED, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,24 @@
|
|||||||
|
// First layer will be "default" layer in QMK.
|
||||||
|
// Second will have index 1, etc. See layers.h
|
||||||
|
|
||||||
|
|
||||||
|
// These MUST be first.
|
||||||
|
// (For example, LAYER_ARROWS overlays on top of LAYER_MAIN.)
|
||||||
|
#include "main.h"
|
||||||
|
#include "russian.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include "numbers.h" // Must be under symbols and arrows
|
||||||
|
|
||||||
|
|
||||||
|
// The order of the layers below doesn't matter,
|
||||||
|
// since they avoid transparent keys.
|
||||||
|
#include "symbols.h"
|
||||||
|
#include "symbols_ru.h"
|
||||||
|
#include "flip.h"
|
||||||
|
|
||||||
|
#include "arrows.h"
|
||||||
|
#include "desktop.h"
|
||||||
|
//#include "fkeys.h"
|
||||||
|
#include "keyboard.h"
|
||||||
|
|
@ -0,0 +1,46 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(KEYBOARD)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_ergodox(\
|
||||||
|
TO(LAYER_MAIN), RGB_HUD, RGB_HUI, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
TOGGLE_LAYER_COLOR, RGB_SAD, RGB_SAI, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, RGB_VAD, RGB_VAI, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, RGB_SPD, RGB_SPI, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, RGB_MOD,\
|
||||||
|
\
|
||||||
|
RGB_TOG, KC_NO,\
|
||||||
|
KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
KC_NO, LIGHT_HUD, LIGHT_HUI, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, LIGHT_SAD, LIGHT_SAI, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
LIGHT_VAD, LIGHT_VAI, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, LIGHT_SPD, LIGHT_SPI, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
LIGHT_MOD, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
KC_NO, LIGHT_TOG,\
|
||||||
|
KC_NO,\
|
||||||
|
QK_BOOTLOADER, KC_NO, KC_NO\
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_INDICATORS
|
||||||
|
case BETA_LAYER_MAGIC_MACRO:
|
||||||
|
ergodox_right_led_1_on();
|
||||||
|
ergodox_right_led_2_on();
|
||||||
|
ergodox_right_led_3_on();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,38 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(MAIN)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_ergodox(\
|
||||||
|
KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, TO(LAYER_NUMBERS),\
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, QK_LEAD, \
|
||||||
|
KC_DELETE, KC_A, KC_S, KC_D, KC_F, KC_G,\
|
||||||
|
KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LALT,\
|
||||||
|
OSL(LAYER_DESKTOP), KC_NO, KC_NO, KC_LSFT, MO(LAYER_ARROWS),\
|
||||||
|
\
|
||||||
|
TD(TD_SCREENSHOT), TD(TD_OCR),\
|
||||||
|
TD(TD_WMLAYOUT),\
|
||||||
|
KC_SPACE, KC_BSPC, OSL(LAYER_FLIP),\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0, LGUI(KC_TAB),\
|
||||||
|
KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_NO, KC_NO,\
|
||||||
|
KC_H, KC_J, KC_K, MO(LAYER_SYMBOLS), KC_L, QK_LEAD,\
|
||||||
|
KC_NO, KC_N, KC_M, KC_P, KC_V, KC_NO, KC_NO,\
|
||||||
|
KC_RIGHT, KC_NO, KC_NO, KC_NO, LGUI(KC_SPACE),\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO, \
|
||||||
|
TO(LAYER_RUSSIAN), KC_RSFT, KC_ENTER\
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,58 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(NUMBERS)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_ergodox(\
|
||||||
|
KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, TO(LAYER_MAIN),\
|
||||||
|
KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NO,\
|
||||||
|
KC_TRNS, MO(LAYER_SYMBOLS), KC_NO, KC_NO, KC_DOT, KC_MINUS, \
|
||||||
|
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_NO,\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
\
|
||||||
|
KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS\
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LEDS_ergodox(\
|
||||||
|
LC_GREEN, LC_GREEN, LC_GREEN, LC_GREEN, LC_GREEN, \
|
||||||
|
LC_GREEN, LC_GREEN, LC_GREEN, LC_GREEN, LC_GREEN, \
|
||||||
|
LC_RED, LC_OFF, LC_OFF, LC_PINK, LC_CYAN, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,58 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(RUSSIAN)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_RU
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_ergodox(\
|
||||||
|
KC_TRANSPARENT, RU_1, RU_2, RU_3, RU_4, RU_5, KC_TRANSPARENT,\
|
||||||
|
KC_TRANSPARENT, RU_CHE, RU_SHA, RU_IE, RU_ER, RU_TE, RU_YO,\
|
||||||
|
KC_TRANSPARENT, RU_A, RU_ES, RU_DE, RU_EF, RU_GHE,\
|
||||||
|
M_RU_CTRL, RU_ZE, RU_YA, RU_TSE, RU_VE, RU_BE, RU_E,\
|
||||||
|
KC_TRANSPARENT, KC_TRANSPARENT, M_RU_ALT, KC_TRANSPARENT, MO(LAYER_ARROWS),\
|
||||||
|
\
|
||||||
|
KC_TRANSPARENT, KC_TRANSPARENT,\
|
||||||
|
KC_TRANSPARENT,\
|
||||||
|
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
KC_NO, RU_6, RU_7, RU_8, RU_9, RU_0, KC_TRANSPARENT,\
|
||||||
|
RU_SOFT, RU_U, RU_YU, RU_I, RU_O, RU_SHCH, KC_NO,\
|
||||||
|
RU_HA, RU_ZHE, RU_KA, MO(LAYER_SYMBOLS_RU), RU_EL, KC_NO,\
|
||||||
|
RU_HARD, RU_EN, RU_EM, RU_PE, RU_YERU, RU_SHTI, KC_TRANSPARENT,\
|
||||||
|
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
||||||
|
\
|
||||||
|
KC_TRANSPARENT, KC_TRANSPARENT,\
|
||||||
|
KC_TRANSPARENT,\
|
||||||
|
TO(LAYER_MAIN), KC_TRANSPARENT, KC_TRANSPARENT\
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LEDS_ergodox(\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_RU_B, LC_RU_B, LC_RU_B, LC_RU_B, LC_RU_B, \
|
||||||
|
LC_RU_G, LC_RU_G, LC_RU_G, LC_RU_G, LC_RU_G, \
|
||||||
|
LC_RU_K, LC_RU_K, LC_RU_K, LC_RU_K, LC_RU_K, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_RU_B, LC_RU_B, LC_RU_B, LC_RU_B, LC_RU_B, \
|
||||||
|
LC_RU_G, LC_RU_G, LC_RU_G, LC_RU_G, LC_RU_G, \
|
||||||
|
LC_RU_K, LC_RU_K, LC_RU_K, LC_RU_K, LC_RU_K, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,119 @@
|
|||||||
|
// Layers are defined in macros,
|
||||||
|
// so that all supporting code can be
|
||||||
|
// auto-generated by the preprocessor.
|
||||||
|
//
|
||||||
|
// When making a new layer, make sure you update EVERY
|
||||||
|
// reference to BETA_LAYER() with your layer's name!
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// This macro isn't used anywhere else.
|
||||||
|
// It's here for convenience, so we only have to write
|
||||||
|
// the layer name in one place.
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(SYMBOLS)
|
||||||
|
|
||||||
|
|
||||||
|
// What OS keyboard layout this layer is designed for.
|
||||||
|
// See extra_mappings.h for possible values.
|
||||||
|
//
|
||||||
|
// Every layer must have this section.
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// If BETA_LAYER_NAME is defined, the preprocessor is making
|
||||||
|
// enums for this layer. See keymap.h.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// Things will break if BETA_LAYER_MAGIC_MACRO is written outside #ifdef/#endif guards.
|
||||||
|
|
||||||
|
// If BETA_LAYER_KEYS is defined, the preprocessor is either...
|
||||||
|
// - making LAYER_* enums (see keymap.h)
|
||||||
|
// - filling the keymap array (see keymap.c)
|
||||||
|
//
|
||||||
|
// Every layer must have this section.
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_ergodox(\
|
||||||
|
KC_NO, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_NO,\
|
||||||
|
KC_NO, KC_GRAVE, KC_LPRN, KC_RPRN, KC_QUES, KC_LCBR, KC_NO,\
|
||||||
|
KC_NO, KC_TILD, KC_QUOT, KC_COMMA, KC_DOT, KC_DQUO,\
|
||||||
|
KC_NO, KC_NO, KC_LBRC, KC_RBRC, KC_EXLM, KC_RCBR, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
KC_NO, KC_CIRC, KC_AMPR, KC_ASTR, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_LABK, KC_RABK, KC_SLASH, KC_NO, KC_BSLS, KC_NO,\
|
||||||
|
KC_UNDS, KC_MINUS, KC_COLN, KC_TRANSPARENT, KC_PIPE, KC_NO,\
|
||||||
|
KC_NO, KC_EQUAL, KC_PLUS, KC_SCLN, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO\
|
||||||
|
)
|
||||||
|
|
||||||
|
// This is important.d
|
||||||
|
// The magic macro MUST be here, AFTER the keymap data.
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// If BETA_LAYER_KEYS is defined, the preprocessor is either...
|
||||||
|
// - making LAYER_*_LEDS enums (see keymap.h)
|
||||||
|
// - filling the ledmap array (see keymap.c)
|
||||||
|
// - building the layer color switch statement (see keymap.c)
|
||||||
|
//
|
||||||
|
// This section is optional. If it is missing, this layer will not have
|
||||||
|
// an RGBMatrix color.
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LEDS_ergodox(\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_ORANGE, LC_CYAN, LC_CYAN, LC_PINK, LC_CYAN, \
|
||||||
|
LC_ORANGE, LC_PINK, LC_PINK, LC_PINK, LC_PINK, \
|
||||||
|
LC_OFF, LC_CYAN, LC_CYAN, LC_PINK, LC_CYAN, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_GREEN, LC_GREEN, LC_CYAN, LC_OFF, LC_CYAN, \
|
||||||
|
LC_CYAN, LC_GREEN, LC_PINK, LC_RED, LC_CYAN, \
|
||||||
|
LC_GREEN, LC_GREEN, LC_PINK, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
||||||
|
)
|
||||||
|
|
||||||
|
// This is important.
|
||||||
|
// The magic macro MUST be here, AFTER the RGBMatrix data.
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// If BETA_LAYER_INDICATORS is defined, the preprocessor is
|
||||||
|
// building the indicator led switch statement (see keymap.c)
|
||||||
|
//
|
||||||
|
// This should be a `case` statement that looks exactly like the following example.
|
||||||
|
//
|
||||||
|
// This section is optional. If it is missing, this layer will
|
||||||
|
// not set indicator leds.
|
||||||
|
/*
|
||||||
|
#ifdef BETA_LAYER_INDICATORS
|
||||||
|
case LAYER_MAGIC_MACRO:
|
||||||
|
ergodox_right_led_1_on();
|
||||||
|
//ergodox_right_led_2_on();
|
||||||
|
//ergodox_right_led_3_on();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// Cleanup.
|
||||||
|
// This is not optional,
|
||||||
|
// we MUST undef these here so the next layer
|
||||||
|
// we load can re-define them.
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,58 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(SYMBOLS_RU)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_RU
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_ergodox(\
|
||||||
|
KC_NO, RU_EXLM, RU_DQUO, RU_NUM, RU_SCLN, RU_PERC, KC_NO,\
|
||||||
|
KC_NO, M_SC_GRAVE, RU_LPRN, RU_RPRN, RU_QUES, M_SC_LCBR, KC_NO,\
|
||||||
|
KC_NO, M_SC_TILD, M_SC_QUOT, RU_COMM, RU_DOT, RU_DQUO,\
|
||||||
|
KC_NO, KC_NO, M_SC_LBR, M_SC_RBR, RU_EXLM, M_SC_RCBR, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, M_SC_LKVCH, M_SC_RKVCH,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
KC_NO, RU_COLN, RU_QUES, RU_ASTR, RU_LPRN, RU_RPRN, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, RU_SLSH, KC_NO, RU_BSLS, KC_NO,\
|
||||||
|
RU_UNDS, RU_MINS, RU_COLN, KC_TRANSPARENT, KC_NO, KC_NO,\
|
||||||
|
KC_NO, RU_EQL, RU_PLUS, RU_SCLN, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
KC_NO,\
|
||||||
|
KC_NO, KC_NO, KC_NO\
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LEDS_ergodox(\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_WHITE, LC_CYAN, LC_CYAN, LC_PINK, LC_WHITE, \
|
||||||
|
LC_WHITE, LC_WHITE, LC_PINK, LC_PINK, LC_PINK, \
|
||||||
|
LC_OFF, LC_WHITE, LC_WHITE, LC_PINK, LC_WHITE, \
|
||||||
|
LC_OFF, LC_OFF, LC_WHITE, LC_WHITE, \
|
||||||
|
\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_CYAN, LC_OFF, LC_CYAN, \
|
||||||
|
LC_CYAN, LC_GREEN, LC_PINK, LC_ORANGE, LC_OFF, \
|
||||||
|
LC_GREEN, LC_GREEN, LC_PINK, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
140
keyboards/betalupi_ergodox/keymaps/default/layers/layers.c
Normal file
140
keyboards/betalupi_ergodox/keymaps/default/layers/layers.c
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
#include "extra_mappings.h"
|
||||||
|
#define LAYER_INCLUDE_FILE "definitions/include.c"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Setup
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Generate layer ids
|
||||||
|
#define BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER(name) LAYER_##name,
|
||||||
|
enum layer_indices {
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
X_LAYER_MAX
|
||||||
|
};
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_KEYS
|
||||||
|
|
||||||
|
|
||||||
|
// Generate RGBMatrix ids
|
||||||
|
// We don't use the same id for layers and layer colors
|
||||||
|
// to save memory. Not every layer has colors!
|
||||||
|
#define BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER(name) LAYER_##name##_LEDS,
|
||||||
|
enum led_indices {
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
X_LAYER_LEDS_MAX
|
||||||
|
};
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_LEDS
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Load layers
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// Create keymap array
|
||||||
|
#define BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER(name) [LAYER_##name] = BETA_LAYER_CONTEXT_DATA,
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
};
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_KEYS
|
||||||
|
|
||||||
|
|
||||||
|
// Create led map array
|
||||||
|
#define BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER(name) [LAYER_##name##_LEDS] = BETA_LAYER_CONTEXT_DATA,
|
||||||
|
const uint8_t PROGMEM ledmaps[][RGB_MATRIX_LED_COUNT][3] = {
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
};
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_LEDS
|
||||||
|
|
||||||
|
// Create os layout array
|
||||||
|
#define BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER(name) [LAYER_##name] = BETA_LAYER_CONTEXT_DATA,
|
||||||
|
uint8_t layer_layouts[] = {
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
};
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_LAYOUTS
|
||||||
|
|
||||||
|
|
||||||
|
void set_layer_color(int layer) {
|
||||||
|
for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
|
||||||
|
HSV hsv = {
|
||||||
|
.h = pgm_read_byte(&ledmaps[layer][i][0]),
|
||||||
|
.s = pgm_read_byte(&ledmaps[layer][i][1]),
|
||||||
|
.v = pgm_read_byte(&ledmaps[layer][i][2]),
|
||||||
|
};
|
||||||
|
if (!hsv.h && !hsv.s && !hsv.v) {
|
||||||
|
rgb_matrix_set_color( i, 0, 0, 0 );
|
||||||
|
} else {
|
||||||
|
RGB rgb = hsv_to_rgb( hsv );
|
||||||
|
float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX;
|
||||||
|
rgb_matrix_set_color( i, f * rgb.r, f * rgb.g, f * rgb.b );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool rgb_matrix_indicators_user(void) {
|
||||||
|
if (keyboard_config.disable_layer_led) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (biton32(layer_state)) {
|
||||||
|
|
||||||
|
// Load layer RGBMatrix colors
|
||||||
|
#define BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER(name)\
|
||||||
|
case LAYER_##name:\
|
||||||
|
set_layer_color(LAYER_##name##_LEDS);\
|
||||||
|
break;
|
||||||
|
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_LEDS
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (rgb_matrix_get_flags() == LED_FLAG_NONE) {
|
||||||
|
rgb_matrix_set_color_all(0, 0, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
layer_state_t layer_state_set_user(layer_state_t state) {
|
||||||
|
uint8_t layer = biton32(state);
|
||||||
|
|
||||||
|
ergodox_board_led_off();
|
||||||
|
ergodox_right_led_1_off();
|
||||||
|
ergodox_right_led_2_off();
|
||||||
|
ergodox_right_led_3_off();
|
||||||
|
|
||||||
|
switch (layer) {
|
||||||
|
|
||||||
|
// Load indicator LED cases
|
||||||
|
#define BETA_LAYER_INDICATORS
|
||||||
|
#define BETA_LAYER(name) LAYER_##name
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_INDICATORS
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return state;
|
||||||
|
};
|
||||||
|
|
56
keyboards/betalupi_ergodox/keymaps/default/parts/leader.c
Normal file
56
keyboards/betalupi_ergodox/keymaps/default/parts/leader.c
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#include "features/leader/beta_leader.h"
|
||||||
|
|
||||||
|
BETA_LEADER_EXTERNS();
|
||||||
|
|
||||||
|
void beta_leader_start(void) {
|
||||||
|
ergodox_right_led_3_on();
|
||||||
|
}
|
||||||
|
|
||||||
|
void beta_leader_end(void) {
|
||||||
|
ergodox_right_led_3_off();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool beta_leader_check(void) {
|
||||||
|
|
||||||
|
BETA_SEQ_2_SHORT(KC_E, KC_M) {
|
||||||
|
SEND_STRING(SECRET_EMAIL);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
BETA_SEQ_2_SHORT(KC_G, KC_M) {
|
||||||
|
SEND_STRING(SECRET_GMAIL);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
BETA_SEQ_2_SHORT(KC_L, KC_I) {
|
||||||
|
SEND_STRING(SECRET_SCHOOL_EMAIL);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
BETA_SEQ_2_LONG(KC_K, KC_B) {
|
||||||
|
layer_move(LAYER_KEYBOARD);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
BETA_SEQ_1_SHORT(KC_F) {
|
||||||
|
// doesn't work, no deactivate
|
||||||
|
// also, this is slow since laeder key uses dumb logic
|
||||||
|
set_oneshot_layer(LAYER_FKEYS, ONESHOT_START);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
BETA_SEQ_2_SHORT(KC_F, KC_1) { tap_code(KC_F1); return false; }
|
||||||
|
BETA_SEQ_2_SHORT(KC_F, KC_2) { tap_code(KC_F2); return false; }
|
||||||
|
BETA_SEQ_2_SHORT(KC_F, KC_3) { tap_code(KC_F3); return false; }
|
||||||
|
BETA_SEQ_2_SHORT(KC_F, KC_4) { tap_code(KC_F4); return false; }
|
||||||
|
BETA_SEQ_2_SHORT(KC_F, KC_5) { tap_code(KC_F5); return false; }
|
||||||
|
BETA_SEQ_2_SHORT(KC_F, KC_Q) { tap_code(KC_F6); return false; }
|
||||||
|
BETA_SEQ_2_SHORT(KC_F, KC_W) { tap_code(KC_F7); return false; }
|
||||||
|
BETA_SEQ_2_SHORT(KC_F, KC_E) { tap_code(KC_F8); return false; }
|
||||||
|
BETA_SEQ_2_SHORT(KC_F, KC_R) { tap_code(KC_F9); return false; }
|
||||||
|
BETA_SEQ_2_SHORT(KC_F, KC_T) { tap_code(KC_F10); return false; }
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
37
keyboards/betalupi_ergodox/keymaps/default/parts/tapdance.c
Normal file
37
keyboards/betalupi_ergodox/keymaps/default/parts/tapdance.c
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
void td_screenshot(tap_dance_state_t *state, void *user_data) {
|
||||||
|
if (state->count == 1) {
|
||||||
|
tap_code16(KC_PSCR);
|
||||||
|
} else if (state->count == 2) {
|
||||||
|
tap_code16(LSFT(KC_PSCR));
|
||||||
|
} else if (state->count == 3) {
|
||||||
|
tap_code16(LALT(KC_PSCR));
|
||||||
|
} else {
|
||||||
|
reset_tap_dance(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void td_ocr(tap_dance_state_t *state, void *user_data) {
|
||||||
|
if (state->count == 1) {
|
||||||
|
tap_code16(LCTL(KC_PSCR));
|
||||||
|
} else if (state->count == 2) {
|
||||||
|
tap_code16(LCTL(LSFT(KC_PSCR)));
|
||||||
|
} else {
|
||||||
|
reset_tap_dance(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void td_wmlayout(tap_dance_state_t *state, void *user_data) {
|
||||||
|
if (state->count == 1) {
|
||||||
|
tap_code16(LGUI(KC_COMMA));
|
||||||
|
} else if (state->count == 2) {
|
||||||
|
tap_code16(LGUI(KC_DOT));
|
||||||
|
} else {
|
||||||
|
reset_tap_dance(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tap_dance_action_t tap_dance_actions[] = {
|
||||||
|
[TD_WMLAYOUT] = ACTION_TAP_DANCE_FN(td_wmlayout),
|
||||||
|
[TD_SCREENSHOT] = ACTION_TAP_DANCE_FN(td_screenshot),
|
||||||
|
[TD_OCR] = ACTION_TAP_DANCE_FN(td_ocr),
|
||||||
|
};
|
4
keyboards/betalupi_ergodox/keymaps/default/rules.mk
Normal file
4
keyboards/betalupi_ergodox/keymaps/default/rules.mk
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# rules.mk overrides
|
||||||
|
|
||||||
|
TAP_DANCE_ENABLE = yes
|
||||||
|
COMBO_ENABLE = yes
|
22
keyboards/betalupi_ergodox/post_config.h
Normal file
22
keyboards/betalupi_ergodox/post_config.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
/*
|
||||||
|
#if !defined(ERGODOX_LED_15) && !defined(ERGODOX_LED_30)
|
||||||
|
// if no value is defined, assume previous behavior
|
||||||
|
// # define ERGODOX_LED_15
|
||||||
|
// # define ERGODOX_LED_30
|
||||||
|
# define ERGODOX_LED_15_MIRROR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(ERGODOX_LED_30) + defined(ERGODOX_LED_15) + defined(ERGODOX_LED_15_MIRROR)) != 1
|
||||||
|
# error "You must only define one of the ERGODOX_LED options."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ERGODOX_LED_30
|
||||||
|
// If using 30 LEDs, then define that many
|
||||||
|
# define RGBLED_NUM 30 // Number of LEDs
|
||||||
|
#else
|
||||||
|
// If not, then only define 15
|
||||||
|
# define RGBLED_NUM 15 // Number of LEDs
|
||||||
|
#endif
|
||||||
|
*/
|
187
keyboards/betalupi_ergodox/process_record.c
Normal file
187
keyboards/betalupi_ergodox/process_record.c
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
#include "betalupi_ergodox.h"
|
||||||
|
#include "features/beta_rawhid.h"
|
||||||
|
|
||||||
|
|
||||||
|
// Handle a keypress.
|
||||||
|
// Returns true if we should keep looking for keypresses,
|
||||||
|
// returns false if we should stop.
|
||||||
|
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
switch (keycode) {
|
||||||
|
case LED_LEVEL:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
keyboard_config.led_level++;
|
||||||
|
if (keyboard_config.led_level > 4) {
|
||||||
|
keyboard_config.led_level = 0;
|
||||||
|
}
|
||||||
|
ergodox_led_all_set((uint8_t)keyboard_config.led_level * 255 / 4 );
|
||||||
|
eeconfig_update_kb(keyboard_config.raw);
|
||||||
|
layer_state_set_kb(layer_state);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
|
case TOGGLE_LAYER_COLOR:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
keyboard_config.disable_layer_led ^= 1;
|
||||||
|
if (keyboard_config.disable_layer_led) {
|
||||||
|
rgb_matrix_set_color_all(0, 0, 0);
|
||||||
|
}
|
||||||
|
eeconfig_update_kb(keyboard_config.raw);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RGB_TOG:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
switch (rgb_matrix_get_flags()) {
|
||||||
|
case LED_FLAG_ALL: {
|
||||||
|
rgb_matrix_set_flags(LED_FLAG_NONE);
|
||||||
|
keyboard_config.rgb_matrix_enable = false;
|
||||||
|
rgb_matrix_set_color_all(0, 0, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: {
|
||||||
|
rgb_matrix_set_flags(LED_FLAG_ALL);
|
||||||
|
keyboard_config.rgb_matrix_enable = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
eeconfig_update_kb(keyboard_config.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
hid_send_state();
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case RGB_MOD:
|
||||||
|
// Tell the host whenever we change animation mode.
|
||||||
|
hid_send_state();
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Custom RGBLIGHT macros
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
#ifdef RGBLIGHT_NO_EEPROM
|
||||||
|
case LIGHT_TOG:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_toggle_noeeprom();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_MOD:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_step_noeeprom();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_HUI:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_hue_noeeprom();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_HUD:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_hue_noeeprom();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_SAI:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_sat_noeeprom();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_SAD:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_sat_noeeprom();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_VAI:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_val_noeeprom();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_VAD:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_val_noeeprom();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_SPI:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_speed_noeeprom();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_SPD:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_speed_noeeprom();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#else
|
||||||
|
case LIGHT_TOG:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_toggle();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_MOD:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_step();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_HUI:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_hue();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_HUD:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_hue();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_SAI:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_sat();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_SAD:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_sat();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_VAI:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_val();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_VAD:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_val();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_SPI:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_increase_speed();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LIGHT_SPD:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_decrease_speed();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return process_record_user(keycode, record);
|
||||||
|
}
|
53
keyboards/betalupi_ergodox/rules.mk
Normal file
53
keyboards/betalupi_ergodox/rules.mk
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
MCU = atmega32u4
|
||||||
|
BOOTLOADER = halfkay
|
||||||
|
|
||||||
|
# Enable raw HID for bi-directional communication
|
||||||
|
RAW_ENABLE = yes
|
||||||
|
|
||||||
|
BOOTMAGIC_ENABLE = no
|
||||||
|
MOUSEKEY_ENABLE = no
|
||||||
|
EXTRAKEY_ENABLE = yes
|
||||||
|
CONSOLE_ENABLE = no
|
||||||
|
COMMAND_ENABLE = no
|
||||||
|
CUSTOM_MATRIX = lite
|
||||||
|
NKRO_ENABLE = yes
|
||||||
|
UNICODE_ENABLE = no
|
||||||
|
SWAP_HANDS_ENABLE = no
|
||||||
|
SLEEP_LED_ENABLE = no
|
||||||
|
API_SYSEX_ENABLE = no
|
||||||
|
MOUSE_SHARED_EP = no
|
||||||
|
MAGIC_ENABLE = no
|
||||||
|
LEADER_ENABLE = no
|
||||||
|
TAP_DANCE_ENABLE = yes
|
||||||
|
AUDIO_SUPPORTED = no
|
||||||
|
BACKLIGHT_SUPPORTED = no
|
||||||
|
|
||||||
|
DEBOUNCE_TYPE = sym_eager_pr
|
||||||
|
|
||||||
|
SRC += \
|
||||||
|
extra_mappings.c \
|
||||||
|
process_record.c \
|
||||||
|
hardware/matrix.c \
|
||||||
|
hardware/led_i2c.c \
|
||||||
|
hardware/maps.c \
|
||||||
|
features/beta_rawhid.c \
|
||||||
|
features/hid_spellcheck.c \
|
||||||
|
features/autocorrect/autocorrect.c \
|
||||||
|
features/leader/leader.c
|
||||||
|
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
|
||||||
|
LAYOUTS = ergodox
|
||||||
|
|
||||||
|
# Link-time optimization.
|
||||||
|
# Significantly reduces firmware size.
|
||||||
|
LTO_ENABLE = yes
|
||||||
|
|
||||||
|
# Enable keyboard-specific effects
|
||||||
|
RGB_MATRIX_CUSTOM_KB = yes
|
||||||
|
|
||||||
|
# From glow dir
|
||||||
|
RGB_MATRIX_ENABLE = yes
|
||||||
|
RGB_MATRIX_DRIVER = is31fl3731
|
||||||
|
RGBLIGHT_ENABLE = yes
|
||||||
|
RGBLIGHT_DRIVER = ws2812
|
221
keyboards/betalupi_voyager/betalupi_voyager.c
Normal file
221
keyboards/betalupi_voyager/betalupi_voyager.c
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
#include "betalupi_voyager.h"
|
||||||
|
#include "raw_hid.h"
|
||||||
|
|
||||||
|
keyboard_config_t keyboard_config;
|
||||||
|
|
||||||
|
bool mcp23018_leds[2] = {0, 0};
|
||||||
|
bool is_launching = false;
|
||||||
|
|
||||||
|
void voyager_led_task(void) {
|
||||||
|
if (is_launching) {
|
||||||
|
STATUS_LED_1(false);
|
||||||
|
STATUS_LED_2(false);
|
||||||
|
STATUS_LED_3(false);
|
||||||
|
STATUS_LED_4(false);
|
||||||
|
wait_ms(250);
|
||||||
|
|
||||||
|
STATUS_LED_1(true);
|
||||||
|
STATUS_LED_2(true);
|
||||||
|
wait_ms(250);
|
||||||
|
STATUS_LED_3(true);
|
||||||
|
STATUS_LED_4(true);
|
||||||
|
wait_ms(250);
|
||||||
|
STATUS_LED_1(false);
|
||||||
|
STATUS_LED_2(false);
|
||||||
|
wait_ms(250);
|
||||||
|
STATUS_LED_3(false);
|
||||||
|
STATUS_LED_4(false);
|
||||||
|
wait_ms(250);
|
||||||
|
is_launching = false;
|
||||||
|
layer_state_set_kb(layer_state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static THD_WORKING_AREA(waLEDThread, 128);
|
||||||
|
static THD_FUNCTION(LEDThread, arg) {
|
||||||
|
(void)arg;
|
||||||
|
chRegSetThreadName("LEDThread");
|
||||||
|
while (true) {
|
||||||
|
voyager_led_task();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void keyboard_pre_init_kb(void) {
|
||||||
|
// Initialize Reset pins
|
||||||
|
setPinInput(A8);
|
||||||
|
setPinOutput(A9);
|
||||||
|
writePinLow(A9);
|
||||||
|
|
||||||
|
setPinOutput(B5);
|
||||||
|
setPinOutput(B4);
|
||||||
|
setPinOutput(B3);
|
||||||
|
|
||||||
|
writePinLow(B5);
|
||||||
|
writePinLow(B4);
|
||||||
|
writePinLow(B3);
|
||||||
|
|
||||||
|
chThdCreateStatic(waLEDThread, sizeof(waLEDThread), NORMALPRIO - 16, LEDThread, NULL);
|
||||||
|
keyboard_pre_init_user();
|
||||||
|
|
||||||
|
rgb_matrix_set_flags(LED_FLAG_NONE);
|
||||||
|
rgb_matrix_set_color_all(0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
layer_state_t layer_state_set_kb(layer_state_t state) {
|
||||||
|
state = layer_state_set_user(state);
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
|
// clang-format off
|
||||||
|
const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
|
||||||
|
/* Refer to IS31 manual for these locations
|
||||||
|
* driver
|
||||||
|
* | R location
|
||||||
|
* | | G location
|
||||||
|
* | | | B location
|
||||||
|
* | | | | */
|
||||||
|
{0, C2_2, C1_2, C4_3},
|
||||||
|
{0, C2_3, C1_3, C3_3},
|
||||||
|
{0, C2_4, C1_4, C3_4},
|
||||||
|
{0, C2_5, C1_5, C3_5},
|
||||||
|
{0, C2_6, C1_6, C3_6},
|
||||||
|
{0, C2_7, C1_7, C3_7},
|
||||||
|
{0, C2_8, C1_8, C3_8},
|
||||||
|
{0, C8_1, C7_1, C9_1},
|
||||||
|
{0, C8_2, C7_2, C9_2},
|
||||||
|
{0, C8_3, C7_3, C9_3},
|
||||||
|
{0, C8_4, C7_4, C9_4},
|
||||||
|
{0, C8_5, C7_5, C9_5},
|
||||||
|
{0, C8_6, C7_6, C9_6},
|
||||||
|
{0, C2_10, C1_10, C4_11},
|
||||||
|
{0, C2_11, C1_11, C3_11},
|
||||||
|
{0, C2_12, C1_12, C3_12},
|
||||||
|
{0, C2_13, C1_13, C3_13},
|
||||||
|
{0, C2_14, C1_14, C3_14},
|
||||||
|
{0, C2_15, C1_15, C3_15},
|
||||||
|
{0, C2_16, C1_16, C3_16},
|
||||||
|
{0, C8_9, C7_9, C9_9},
|
||||||
|
{0, C8_10, C7_10, C9_10},
|
||||||
|
{0, C8_11, C7_11, C9_11},
|
||||||
|
{0, C8_12, C7_12, C9_12},
|
||||||
|
{0, C8_13, C7_13, C9_13},
|
||||||
|
{0, C8_14, C7_14, C9_14},
|
||||||
|
|
||||||
|
{1, C2_7, C1_7, C3_7},
|
||||||
|
{1, C2_6, C1_6, C3_6},
|
||||||
|
{1, C2_5, C1_5, C3_5},
|
||||||
|
{1, C2_4, C1_4, C3_4},
|
||||||
|
{1, C2_3, C1_3, C3_3},
|
||||||
|
{1, C2_2, C1_2, C4_3},
|
||||||
|
|
||||||
|
{1, C8_5, C7_5, C9_5},
|
||||||
|
{1, C8_4, C7_4, C9_4},
|
||||||
|
{1, C8_3, C7_3, C9_3},
|
||||||
|
{1, C8_2, C7_2, C9_2},
|
||||||
|
{1, C8_1, C7_1, C9_1},
|
||||||
|
{1, C2_8, C1_8, C3_8},
|
||||||
|
|
||||||
|
{1, C2_14, C1_14, C3_14},
|
||||||
|
{1, C2_13, C1_13, C3_13},
|
||||||
|
{1, C2_12, C1_12, C3_12},
|
||||||
|
{1, C2_11, C1_11, C3_11},
|
||||||
|
{1, C2_10, C1_10, C4_11},
|
||||||
|
{1, C8_6, C7_6, C9_6},
|
||||||
|
|
||||||
|
{1, C8_12, C7_12, C9_12},
|
||||||
|
{1, C8_11, C7_11, C9_11},
|
||||||
|
{1, C8_10, C7_10, C9_10},
|
||||||
|
{1, C8_9, C7_9, C9_9},
|
||||||
|
{1, C2_16, C1_16, C3_16},
|
||||||
|
{1, C2_15, C1_15, C3_15},
|
||||||
|
|
||||||
|
{1, C8_14, C7_14, C9_14},
|
||||||
|
{1, C8_13, C7_13, C9_13},
|
||||||
|
};
|
||||||
|
|
||||||
|
led_config_t g_led_config = { {
|
||||||
|
{ NO_LED, 0, 1, 2, 3, 4, 5 },
|
||||||
|
{ NO_LED, 6, 7, 8, 9, 10, 11 },
|
||||||
|
{ NO_LED, 12, 13, 14, 15, 16, 17 },
|
||||||
|
{ NO_LED, 18, 19, 20, 21, 22, NO_LED },
|
||||||
|
{ NO_LED, NO_LED, NO_LED, NO_LED, 23, NO_LED, NO_LED },
|
||||||
|
{ 24, 25, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED },
|
||||||
|
|
||||||
|
{ 26, 27, 28, 29, 30, 31, NO_LED },
|
||||||
|
{ 32, 33, 34, 35, 36, 37, NO_LED },
|
||||||
|
{ 38, 39, 40, 41, 42, 43, NO_LED },
|
||||||
|
{ NO_LED, 45, 46, 47, 48, 49, NO_LED },
|
||||||
|
{ NO_LED, NO_LED, 44, NO_LED, NO_LED, NO_LED, NO_LED },
|
||||||
|
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, 50, 51 },
|
||||||
|
}, {
|
||||||
|
{0, 10}, {17, 10}, {34,8}, {52, 5}, {69, 8}, {86, 10},
|
||||||
|
{0, 21}, {17, 21}, {34, 19}, {52, 17}, {69, 19}, {86, 21},
|
||||||
|
{0, 32}, {17, 32}, {34, 30}, {52, 28}, {69, 30}, {86, 32},
|
||||||
|
{0, 43}, {17, 43}, {34, 41}, {52, 39}, {69, 41}, {86, 43},
|
||||||
|
{86, 53}, {96, 58},
|
||||||
|
|
||||||
|
{138, 10}, {155, 10}, {172, 8}, {190, 5}, {207, 8}, {224, 10},
|
||||||
|
{138, 21}, {155, 21}, {172, 19}, {190, 17}, {207, 19}, {224, 21},
|
||||||
|
{138, 32}, {155, 32}, {172, 30}, {190, 28}, {207, 30}, {224, 32},
|
||||||
|
{138, 43}, {155,43}, {172, 41}, {190, 39}, {207, 41}, {224, 43},
|
||||||
|
{128, 58}, {138, 53}
|
||||||
|
}, {
|
||||||
|
1, 4, 4, 4, 4, 4,
|
||||||
|
1, 4, 4, 4, 4, 4,
|
||||||
|
1, 4, 4, 4, 4, 4,
|
||||||
|
1, 4, 4, 4, 4, 4,
|
||||||
|
1, 1, 4, 4, 4, 4,
|
||||||
|
4, 1, 4, 4, 4, 4,
|
||||||
|
4, 1, 4, 4, 4, 4,
|
||||||
|
4, 1, 4, 4, 4, 4,
|
||||||
|
4, 1, 1, 1
|
||||||
|
} };
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
if (!process_record_user(keycode, record)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
switch (keycode) {
|
||||||
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
|
case RGB_TOG:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
switch (rgb_matrix_get_flags()) {
|
||||||
|
case LED_FLAG_ALL: {
|
||||||
|
rgb_matrix_set_flags(LED_FLAG_NONE);
|
||||||
|
rgb_matrix_set_color_all(0, 0, 0);
|
||||||
|
} break;
|
||||||
|
default: {
|
||||||
|
rgb_matrix_set_flags(LED_FLAG_ALL);
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init_kb(void) {
|
||||||
|
keyboard_config.raw = eeconfig_read_kb();
|
||||||
|
|
||||||
|
if (!keyboard_config.led_level && !keyboard_config.led_level_res) {
|
||||||
|
keyboard_config.led_level = true;
|
||||||
|
keyboard_config.led_level_res = 0b11;
|
||||||
|
eeconfig_update_kb(keyboard_config.raw);
|
||||||
|
}
|
||||||
|
matrix_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeconfig_init_kb(void) { // EEPROM is getting reset!
|
||||||
|
keyboard_config.raw = 0;
|
||||||
|
keyboard_config.led_level = true;
|
||||||
|
keyboard_config.led_level_res = 0b11;
|
||||||
|
keyboard_config.disable_layer_led = false;
|
||||||
|
|
||||||
|
eeconfig_update_kb(keyboard_config.raw);
|
||||||
|
eeconfig_init_user();
|
||||||
|
}
|
87
keyboards/betalupi_voyager/betalupi_voyager.h
Normal file
87
keyboards/betalupi_voyager/betalupi_voyager.h
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "quantum.h"
|
||||||
|
|
||||||
|
extern bool mcp23018_leds[];
|
||||||
|
|
||||||
|
#define MCP23018_DEFAULT_ADDRESS 0b0100000
|
||||||
|
#define STATUS_LED_1(status) writePin(B5, (bool)status)
|
||||||
|
#define STATUS_LED_2(status) writePin(B4, (bool)status)
|
||||||
|
#define STATUS_LED_3(status) mcp23018_leds[0] = (bool)status
|
||||||
|
#define STATUS_LED_4(status) mcp23018_leds[1] = (bool)status
|
||||||
|
|
||||||
|
/*
|
||||||
|
// clang-format off
|
||||||
|
#define LAYOUT( \
|
||||||
|
k00, k01, k02, k03, k04, k05, k26, k27, k28, k29, k30, k31, \
|
||||||
|
k06, k07, k08, k09, k10, k11, k32, k33, k34, k35, k36, k37, \
|
||||||
|
k12, k13, k14, k15, k16, k17, k38, k39, k40, k41, k42, k43, \
|
||||||
|
k18, k19, k20, k21, k22, k23, k44, k45, k46, k47, k48, k49, \
|
||||||
|
k24, k25, k50, k51 \
|
||||||
|
)\
|
||||||
|
{ \
|
||||||
|
{ KC_NO, k00, k01, k02, k03, k04, k05 }, \
|
||||||
|
{ KC_NO, k06, k07, k08, k09, k10, k11 }, \
|
||||||
|
{ KC_NO, k12, k13, k14, k15, k16, k17 }, \
|
||||||
|
{ KC_NO, k18, k19, k20, k21, k22, KC_NO }, \
|
||||||
|
{ KC_NO, KC_NO, KC_NO, KC_NO, k23, KC_NO, KC_NO }, \
|
||||||
|
{ k24, k25, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||||
|
\
|
||||||
|
{ k26, k27, k28, k29, k30, k31, KC_NO }, \
|
||||||
|
{ k32, k33, k34, k35, k36, k37, KC_NO }, \
|
||||||
|
{ k38, k39, k40, k41, k42, k43, KC_NO }, \
|
||||||
|
{ KC_NO, k45, k46, k47, k48, k49, KC_NO }, \
|
||||||
|
{ KC_NO, KC_NO, k44, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||||
|
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k50, k51 }, \
|
||||||
|
}
|
||||||
|
// clang-format on
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
#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, k30, k31, \
|
||||||
|
k32, k33, k34, k35, k36, k37, \
|
||||||
|
k38, k39, k40, k41, k42, k43, \
|
||||||
|
k44, k45, k46, k47, k48, k49, \
|
||||||
|
k50, k51 \
|
||||||
|
)\
|
||||||
|
{ \
|
||||||
|
{ KC_NO, k00, k01, k02, k03, k04, k05 }, \
|
||||||
|
{ KC_NO, k06, k07, k08, k09, k10, k11 }, \
|
||||||
|
{ KC_NO, k12, k13, k14, k15, k16, k17 }, \
|
||||||
|
{ KC_NO, k18, k19, k20, k21, k22, KC_NO }, \
|
||||||
|
{ KC_NO, KC_NO, KC_NO, KC_NO, k23, KC_NO, KC_NO }, \
|
||||||
|
{ k24, k25, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||||
|
\
|
||||||
|
{ k26, k27, k28, k29, k30, k31, KC_NO }, \
|
||||||
|
{ k32, k33, k34, k35, k36, k37, KC_NO }, \
|
||||||
|
{ k38, k39, k40, k41, k42, k43, KC_NO }, \
|
||||||
|
{ KC_NO, k45, k46, k47, k48, k49, KC_NO }, \
|
||||||
|
{ KC_NO, KC_NO, k44, KC_NO, KC_NO, KC_NO, KC_NO }, \
|
||||||
|
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k50, k51 }, \
|
||||||
|
}
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
enum voyager_keycodes {
|
||||||
|
LED_LEVEL = SAFE_RANGE,
|
||||||
|
BETA_SAFE_RANGE,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
uint32_t raw;
|
||||||
|
struct {
|
||||||
|
bool disable_layer_led : 1;
|
||||||
|
bool placeholder : 1;
|
||||||
|
bool led_level : 1;
|
||||||
|
uint8_t led_level_res : 2; // DO NOT REMOVE
|
||||||
|
};
|
||||||
|
} keyboard_config_t;
|
||||||
|
|
||||||
|
extern keyboard_config_t keyboard_config;
|
||||||
|
|
||||||
|
bool is_transport_connected(void);
|
63
keyboards/betalupi_voyager/config.h
Normal file
63
keyboards/betalupi_voyager/config.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
#define MATRIX_ROWS 12
|
||||||
|
#define MATRIX_COLS 7
|
||||||
|
|
||||||
|
/* PCB default pin-out */
|
||||||
|
// #define MATRIX_ROW_PINS { B10, B11, B12, B13, B14, B15 }
|
||||||
|
// #define MATRIX_COL_PINS { A0, A1, A2, A3, A6, A7, B0 }
|
||||||
|
|
||||||
|
// #define MCP23_ROW_PINS { GPB5, GBP4, GBP3, GBP2, GBP1, GBP0 }
|
||||||
|
// #define MCP23_COL_PINS { GPA0, GBA1, GBA2, GBA3, GBA4, GBA5, GBA6 }
|
||||||
|
|
||||||
|
// #define MCP23_LED_R GPB7
|
||||||
|
// #define MCP23_LED_G GPB6
|
||||||
|
// #define MCP23_LED_B GPA7
|
||||||
|
|
||||||
|
// Not needed, is default address:
|
||||||
|
// #define EXTERNAL_EEPROM_I2C_BASE_ADDRESS 0b10100000
|
||||||
|
|
||||||
|
/* COL2ROW or ROW2COL */
|
||||||
|
#define DIODE_DIRECTION ROW2COL
|
||||||
|
|
||||||
|
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||||
|
#define LOCKING_SUPPORT_ENABLE
|
||||||
|
/* Locking resynchronize hack */
|
||||||
|
#define LOCKING_RESYNC_ENABLE
|
||||||
|
|
||||||
|
#define LED_BRIGHTNESS_LO 5
|
||||||
|
#define LED_BRIGHTNESS_HI 100
|
||||||
|
#define LED_BRIGHTNESS_DEFAULT (LED_BRIGHTNESS_LO)
|
||||||
|
|
||||||
|
#define DRIVER_ADDR_1 0b1110100
|
||||||
|
#define DRIVER_ADDR_2 0b1110111
|
||||||
|
|
||||||
|
#define DRIVER_COUNT 2
|
||||||
|
#define DRIVER_1_LED_TOTAL 36
|
||||||
|
#define DRIVER_2_LED_TOTAL 36
|
||||||
|
#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||||
|
#define RGB_MATRIX_CENTER { 125, 26 }
|
||||||
|
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 175
|
||||||
|
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
|
||||||
|
#define RGB_MATRIX_KEYPRESSES
|
||||||
|
#define RGB_DISABLE_WHEN_USB_SUSPENDED
|
||||||
|
|
||||||
|
#ifndef ISSI_TIMEOUT
|
||||||
|
#define ISSI_TIMEOUT 5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MOUSEKEY_INTERVAL 20
|
||||||
|
#define MOUSEKEY_DELAY 0
|
||||||
|
#define MOUSEKEY_TIME_TO_MAX 60
|
||||||
|
#define MOUSEKEY_MAX_SPEED 7
|
||||||
|
#define MOUSEKEY_WHEEL_DELAY 400
|
||||||
|
#define MOUSEKEY_WHEEL_INTERVAL MOUSEKEY_INTERVAL
|
||||||
|
#define MOUSEKEY_WHEEL_MAX_SPEED MOUSEKEY_MAX_SPEED
|
||||||
|
#define MOUSEKEY_WHEEL_TIME_TO_MAX MOUSEKEY_TIME_TO_MAX
|
||||||
|
|
||||||
|
#define TAPPING_TOGGLE 1
|
||||||
|
|
||||||
|
// Delay between each i2c io expander ops (in MCU cycles)
|
||||||
|
#define IO_EXPANDER_OP_DELAY 500
|
39
keyboards/betalupi_voyager/features/leader/beta_leader.h
Normal file
39
keyboards/betalupi_voyager/features/leader/beta_leader.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifdef ENABLE_BETA_LEADER
|
||||||
|
|
||||||
|
#include "quantum.h"
|
||||||
|
|
||||||
|
bool beta_process_leader(uint16_t keycode, keyrecord_t *record);
|
||||||
|
|
||||||
|
void beta_leader_start(void);
|
||||||
|
void beta_leader_end(void);
|
||||||
|
bool beta_leader_check(void);
|
||||||
|
void beta_qk_leader_check(void);
|
||||||
|
void beta_qk_leader_start(void);
|
||||||
|
|
||||||
|
|
||||||
|
#define BETA_LEADER_EXTERNS() \
|
||||||
|
extern bool beta_leading; \
|
||||||
|
extern uint16_t beta_leader_time; \
|
||||||
|
extern uint16_t beta_leader_sequence[5]; \
|
||||||
|
extern uint8_t beta_leader_sequence_size
|
||||||
|
|
||||||
|
// Normal sequence
|
||||||
|
// These do the same thing as SEQ_X_KEYS from qmk.
|
||||||
|
#define BETA_SEQ_1_LONG(key) if (beta_leader_sequence[0] == (key) && beta_leader_sequence[1] == 0 && beta_leader_sequence[2] == 0 && beta_leader_sequence[3] == 0 && beta_leader_sequence[4] == 0 && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT)
|
||||||
|
#define BETA_SEQ_2_LONG(key1, key2) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2) && beta_leader_sequence[2] == 0 && beta_leader_sequence[3] == 0 && beta_leader_sequence[4] == 0 && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT)
|
||||||
|
#define BETA_SEQ_3_LONG(key1, key2, key3) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2) && beta_leader_sequence[2] == (key3) && beta_leader_sequence[3] == 0 && beta_leader_sequence[4] == 0 && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT)
|
||||||
|
#define BETA_SEQ_4_LONG(key1, key2, key3, key4) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2) && beta_leader_sequence[2] == (key3) && beta_leader_sequence[3] == (key4) && beta_leader_sequence[4] == 0 && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT)
|
||||||
|
#define BETA_SEQ_5_LONG(key1, key2, key3, key4, key5) if (leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2) && beta_leader_sequence[2] == (key3) && beta_leader_sequence[3] == (key4) && beta_leader_sequence[4] == (key5) && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT)
|
||||||
|
|
||||||
|
// Short-circuit sequence
|
||||||
|
// These match as soon as a matching sequence is seen,
|
||||||
|
// not waiting for the leader timeout. They thus register
|
||||||
|
// immediately, but cannot be used in longer sequences.
|
||||||
|
#define BETA_SEQ_1_SHORT(key) if (beta_leader_sequence[0] == (key))
|
||||||
|
#define BETA_SEQ_2_SHORT(key1, key2) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2))
|
||||||
|
#define BETA_SEQ_3_SHORT(key1, key2, key3) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2))
|
||||||
|
#define BETA_SEQ_4_SHORT(key1, key2, key3, key4) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2))
|
||||||
|
#define BETA_SEQ_5_SHORT(key1, key2, key3, key4, key5) if (beta_leader_sequence[0] == (key1) && beta_leader_sequence[1] == (key2))
|
||||||
|
|
||||||
|
#endif
|
103
keyboards/betalupi_voyager/features/leader/leader.c
Normal file
103
keyboards/betalupi_voyager/features/leader/leader.c
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
#ifdef ENABLE_BETA_LEADER
|
||||||
|
|
||||||
|
#include "beta_leader.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifndef LEADER_TIMEOUT
|
||||||
|
#define LEADER_TIMEOUT 300
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__attribute__((weak)) void beta_leader_start(void) {}
|
||||||
|
__attribute__((weak)) void beta_leader_end(void) {}
|
||||||
|
__attribute__((weak)) bool beta_leader_check(void) { return true; }
|
||||||
|
|
||||||
|
// Leader key stuff
|
||||||
|
bool beta_leading = false;
|
||||||
|
uint16_t beta_leader_time = 0;
|
||||||
|
bool beta_leader_change = false;
|
||||||
|
|
||||||
|
uint16_t beta_leader_sequence[5] = {0, 0, 0, 0, 0};
|
||||||
|
uint8_t beta_leader_sequence_size = 0;
|
||||||
|
|
||||||
|
void beta_qk_leader_start(void) {
|
||||||
|
if (beta_leading) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
beta_leader_start();
|
||||||
|
beta_leading = true;
|
||||||
|
beta_leader_time = timer_read();
|
||||||
|
beta_leader_sequence_size = 0;
|
||||||
|
beta_leader_change = false; // If true, run
|
||||||
|
memset(beta_leader_sequence, 0, sizeof(beta_leader_sequence));
|
||||||
|
}
|
||||||
|
|
||||||
|
void beta_qk_leader_check() {
|
||||||
|
|
||||||
|
#ifdef LEADER_NO_TIMEOUT
|
||||||
|
bool timeout = (beta_leading && beta_leader_sequence_size > 0 && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT);
|
||||||
|
#else
|
||||||
|
bool timeout = (beta_leading && timer_elapsed(beta_leader_time) > LEADER_TIMEOUT);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (beta_leader_change || timeout) {
|
||||||
|
beta_leader_change = false;
|
||||||
|
|
||||||
|
if (
|
||||||
|
beta_leader_sequence[beta_leader_sequence_size - 1] == (QK_LEAD)
|
||||||
|
) {
|
||||||
|
beta_leading = false;
|
||||||
|
beta_leader_end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timeout) {
|
||||||
|
beta_leading = false;
|
||||||
|
beta_leader_end();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!beta_leader_check()) {
|
||||||
|
beta_leading = false;
|
||||||
|
beta_leader_end();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool beta_process_leader(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
// Leader key set-up
|
||||||
|
if (record->event.pressed) {
|
||||||
|
if (beta_leading) {
|
||||||
|
# ifndef LEADER_NO_TIMEOUT
|
||||||
|
if (timer_elapsed(beta_leader_time) < LEADER_TIMEOUT)
|
||||||
|
# endif // LEADER_NO_TIMEOUT
|
||||||
|
{
|
||||||
|
# ifndef LEADER_KEY_STRICT_KEY_PROCESSING
|
||||||
|
if (IS_QK_MOD_TAP(keycode)) {
|
||||||
|
keycode = QK_MOD_TAP_GET_TAP_KEYCODE(keycode);
|
||||||
|
} else if (IS_QK_LAYER_TAP(keycode)) {
|
||||||
|
keycode = QK_LAYER_TAP_GET_TAP_KEYCODE(keycode);
|
||||||
|
}
|
||||||
|
# endif // LEADER_KEY_STRICT_KEY_PROCESSING
|
||||||
|
if (beta_leader_sequence_size < ARRAY_SIZE(beta_leader_sequence)) {
|
||||||
|
beta_leader_sequence[beta_leader_sequence_size] = keycode;
|
||||||
|
beta_leader_sequence_size++;
|
||||||
|
beta_leader_change = true;
|
||||||
|
} else {
|
||||||
|
beta_leading = false;
|
||||||
|
beta_leader_end();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
# ifdef LEADER_PER_KEY_TIMING
|
||||||
|
beta_leader_time = timer_read();
|
||||||
|
# endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (keycode == QK_LEADER) {
|
||||||
|
beta_qk_leader_start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
22
keyboards/betalupi_voyager/halconf.h
Normal file
22
keyboards/betalupi_voyager/halconf.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/* Copyright 2021 QMK
|
||||||
|
*
|
||||||
|
* 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 3 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define HAL_USE_I2C TRUE
|
||||||
|
#define HAL_USE_GPT TRUE
|
||||||
|
#define HAL_USE_DAC TRUE
|
||||||
|
|
||||||
|
#include_next <halconf.h>
|
230
keyboards/betalupi_voyager/info.json
Normal file
230
keyboards/betalupi_voyager/info.json
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
{
|
||||||
|
"keyboard_name": "Betalupi Voyager",
|
||||||
|
"manufacturer": "ZSA Technology Labs",
|
||||||
|
"url": "zsa.io/voyager",
|
||||||
|
"maintainer": "ZSA Technology Labs",
|
||||||
|
"usb": {
|
||||||
|
"vid": "0x3297",
|
||||||
|
"pid": "0x1977",
|
||||||
|
"device_version": "0.0.1"
|
||||||
|
},
|
||||||
|
"layout_aliases": {
|
||||||
|
"LAYOUT_voyager": "LAYOUT"
|
||||||
|
},
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT": {
|
||||||
|
"layout": [
|
||||||
|
{
|
||||||
|
"x": 3,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 12,
|
||||||
|
"y": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 2,
|
||||||
|
"y": 0.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 4,
|
||||||
|
"y": 0.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 11,
|
||||||
|
"y": 0.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 13,
|
||||||
|
"y": 0.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 0,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 5,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 10,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 14,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 15,
|
||||||
|
"y": 0.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 3,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 12,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 2,
|
||||||
|
"y": 1.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 4,
|
||||||
|
"y": 1.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 11,
|
||||||
|
"y": 1.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 13,
|
||||||
|
"y": 1.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 0,
|
||||||
|
"y": 1.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"y": 1.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 5,
|
||||||
|
"y": 1.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 10,
|
||||||
|
"y": 1.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 14,
|
||||||
|
"y": 1.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 15,
|
||||||
|
"y": 1.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 3,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 12,
|
||||||
|
"y": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 2,
|
||||||
|
"y": 2.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 4,
|
||||||
|
"y": 2.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 11,
|
||||||
|
"y": 2.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 13,
|
||||||
|
"y": 2.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 0,
|
||||||
|
"y": 2.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"y": 2.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 5,
|
||||||
|
"y": 2.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 10,
|
||||||
|
"y": 2.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 14,
|
||||||
|
"y": 2.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 15,
|
||||||
|
"y": 2.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 3,
|
||||||
|
"y": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 12,
|
||||||
|
"y": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 2,
|
||||||
|
"y": 3.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 4,
|
||||||
|
"y": 3.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 11,
|
||||||
|
"y": 3.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 13,
|
||||||
|
"y": 3.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 0,
|
||||||
|
"y": 3.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"y": 3.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 5,
|
||||||
|
"y": 3.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 10,
|
||||||
|
"y": 3.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 14,
|
||||||
|
"y": 3.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 15,
|
||||||
|
"y": 3.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 0,
|
||||||
|
"y": 4.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 1,
|
||||||
|
"y": 4.5,
|
||||||
|
"h": 1.75
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": -0.75,
|
||||||
|
"y": 4.75,
|
||||||
|
"h": 1.75
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"x": 0.25,
|
||||||
|
"y": 4.75
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
keyboards/betalupi_voyager/keymaps/.DS_Store
vendored
Normal file
BIN
keyboards/betalupi_voyager/keymaps/.DS_Store
vendored
Normal file
Binary file not shown.
40
keyboards/betalupi_voyager/keymaps/default/config.h
Normal file
40
keyboards/betalupi_voyager/keymaps/default/config.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#define ENABLE_BETA_LEADER
|
||||||
|
|
||||||
|
// No timeout after initial leader key press
|
||||||
|
#define LEADER_NO_TIMEOUT
|
||||||
|
|
||||||
|
#define COMBO_SHOULD_TRIGGER
|
||||||
|
|
||||||
|
// Timeout resets after each keypress
|
||||||
|
#define LEADER_PER_KEY_TIMING
|
||||||
|
#define LEADER_TIMEOUT 500
|
||||||
|
|
||||||
|
// Enable spellcheck over HID
|
||||||
|
//#define ENABLE_HID_SPELLCHECK
|
||||||
|
|
||||||
|
//#define ENABLE_AUTOCORRECT
|
||||||
|
|
||||||
|
// RGBLight effects
|
||||||
|
// Static color is always enabled.
|
||||||
|
//#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_RGB_TEST
|
||||||
|
//#define RGBLIGHT_EFFECT_SNAKE
|
||||||
|
//#define RGBLIGHT_EFFECT_STATIC_GRADIENT
|
||||||
|
//#define RGBLIGHT_EFFECT_TWINKLE
|
||||||
|
|
||||||
|
// Custom effects
|
||||||
|
// #define RGB_MATRIX_FRAMEBUFFER_EFFECTS
|
||||||
|
// #define ENABLE_RGB_MATRIX_FFT_ANIM // Requires framebuffer
|
||||||
|
|
||||||
|
|
||||||
|
#define USB_SUSPEND_WAKEUP_DELAY 200
|
||||||
|
#define RAW_USAGE_PAGE 0xFF60
|
||||||
|
#define RAW_USAGE_ID 0x61
|
||||||
|
#define LAYER_STATE_32BIT
|
||||||
|
|
||||||
|
#define RGB_MATRIX_STARTUP_SPD 60
|
238
keyboards/betalupi_voyager/keymaps/default/keymap.c
Normal file
238
keyboards/betalupi_voyager/keymaps/default/keymap.c
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
#include "version.h"
|
||||||
|
#include "keymap_russian.h"
|
||||||
|
#include "keymap_us_international.h"
|
||||||
|
|
||||||
|
// Values that should not be saved to git.
|
||||||
|
// There should be a`secrets.h` in this directory
|
||||||
|
// with the following contents:
|
||||||
|
//
|
||||||
|
// #define SECRET_EMAIL "value"
|
||||||
|
// #define SECRET_GMAIL "value"
|
||||||
|
// #define SECRET_SCHOOL_EMAIL "value"
|
||||||
|
#include "secrets.h"
|
||||||
|
|
||||||
|
// Macro keycodes
|
||||||
|
enum custom_keycodes
|
||||||
|
{
|
||||||
|
M_SHUTDOWN = BETA_SAFE_RANGE,
|
||||||
|
|
||||||
|
// Macros
|
||||||
|
M_RESETWM,
|
||||||
|
M_RU_CTRL,
|
||||||
|
M_RU_ALT,
|
||||||
|
M_GUI,
|
||||||
|
|
||||||
|
// Special characters.
|
||||||
|
// M_SPECIAL_TOP and M_SPECIAL_BOTTOM are
|
||||||
|
// bounds used to parse these. Only special
|
||||||
|
// characters should be between them.
|
||||||
|
//
|
||||||
|
// Сharacters here should be in the same
|
||||||
|
// order as they are in the host inteface.
|
||||||
|
M_SPECIAL_TOP,
|
||||||
|
M_SC_GRAVE,
|
||||||
|
M_SC_TILD,
|
||||||
|
M_SC_QUOT,
|
||||||
|
M_SC_LBR,
|
||||||
|
M_SC_RBR,
|
||||||
|
M_SC_LCBR,
|
||||||
|
M_SC_RCBR,
|
||||||
|
M_SC_LKVCH,
|
||||||
|
M_SC_RKVCH,
|
||||||
|
M_SPECIAL_BOTTOM
|
||||||
|
};
|
||||||
|
|
||||||
|
// LED colors
|
||||||
|
#define LC_OFF {0, 0, 0}
|
||||||
|
#define LC_GRN {85, 203, 158}
|
||||||
|
#define LC_YLW {32, 176, 255}
|
||||||
|
#define LC_PNK {243, 222, 234}
|
||||||
|
#define LC_CYN {134, 255, 213}
|
||||||
|
#define LC_ORN {14, 255, 255}
|
||||||
|
#define LC_WHT {0, 0, 150}
|
||||||
|
#define LC_RED {0, 255, 145}
|
||||||
|
#define LC_BLU {153, 255, 153}
|
||||||
|
|
||||||
|
#define LC_RUB {0, 0, 165}
|
||||||
|
#define LC_RUG {153, 255, 153}
|
||||||
|
#define LC_RUK {0, 255, 145}
|
||||||
|
|
||||||
|
#ifdef ENABLE_HID_SPELLCHECK
|
||||||
|
#include "features/hid_spellcheck.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_AUTOCORRECT
|
||||||
|
#include "features/autocorrect/autocorrect.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_BETA_LEADER
|
||||||
|
#include "features/leader/beta_leader.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// #include "features/beta_rawhid.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Send a special character.
|
||||||
|
// Returns false if character was caught, true otherwise.
|
||||||
|
bool send_special_character(uint16_t keycode) {
|
||||||
|
if ( (keycode > M_SPECIAL_TOP) && (keycode < M_SPECIAL_BOTTOM) ) {
|
||||||
|
hid_send_special_char(keycode - M_SPECIAL_TOP - 1);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
const uint16_t PROGMEM combo2[] = {KC_D, KC_F, COMBO_END};
|
||||||
|
const uint16_t PROGMEM combo3[] = {KC_M, KC_P, COMBO_END};
|
||||||
|
const uint16_t PROGMEM combo4[] = {RU_ER, RU_TE, COMBO_END};
|
||||||
|
const uint16_t PROGMEM combo5[] = {RU_EF, RU_GHE, COMBO_END};
|
||||||
|
const uint16_t PROGMEM combo6[] = {KC_DELETE, KC_A, COMBO_END};
|
||||||
|
combo_t key_combos[] = {
|
||||||
|
COMBO(combo2, KC_TAB),
|
||||||
|
COMBO(combo3, KC_RIGHT),
|
||||||
|
COMBO(combo4, RU_YO),
|
||||||
|
COMBO(combo5, RU_E),
|
||||||
|
COMBO(combo6, LCTL(KC_DELETE)),
|
||||||
|
};
|
||||||
|
|
||||||
|
void matrix_scan_user(void)
|
||||||
|
{
|
||||||
|
#ifdef ENABLE_BETA_LEADER
|
||||||
|
beta_qk_leader_check();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Must be done early, layers need this enum
|
||||||
|
enum tap_dance_codes
|
||||||
|
{
|
||||||
|
TD_WMLAYOUT,
|
||||||
|
TD_SCREENSHOT,
|
||||||
|
TD_ESCAPE,
|
||||||
|
TD_NOGAME
|
||||||
|
};
|
||||||
|
|
||||||
|
// Include all other parts of configuration
|
||||||
|
#include "layers/layers.c"
|
||||||
|
#include "parts/leader.c"
|
||||||
|
#include "parts/tapdance.c"
|
||||||
|
|
||||||
|
bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record)
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
false
|
||||||
|
//|| layer_state_is(LAYER_SIMPLEARROWS)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable combo `SOME_COMBO` on layer `_LAYER_A` */
|
||||||
|
if (
|
||||||
|
combo_index == 0 ||
|
||||||
|
combo_index == 1)
|
||||||
|
{
|
||||||
|
if (layer_state_is(LAYER_RUSSIAN))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (
|
||||||
|
combo_index == 2 ||
|
||||||
|
combo_index == 3)
|
||||||
|
{
|
||||||
|
if (!layer_state_is(LAYER_RUSSIAN))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process macros.
|
||||||
|
// Return FALSE to halt key processing,
|
||||||
|
// Return TRUE to allow QMK to handle keypress.
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record)
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef ENABLE_BETA_LEADER
|
||||||
|
if (!beta_process_leader(keycode, record))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_HID_SPELLCHECK
|
||||||
|
if (!process_spellcheck(keycode, record))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_AUTOCORRECT
|
||||||
|
if (!process_autocorrection(keycode, record))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Handle special chars
|
||||||
|
// if (record->event.pressed) {
|
||||||
|
// if (!send_special_character(keycode)) { return false; }
|
||||||
|
//}
|
||||||
|
|
||||||
|
// Handle macros
|
||||||
|
switch (keycode)
|
||||||
|
{
|
||||||
|
case M_RESETWM:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
SEND_STRING(SS_LCTL(SS_LGUI(SS_LSFT(SS_TAP(X_R)))));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Workaround for one-shot LGUI key.
|
||||||
|
// Using just LGUI with LAYER_DESKTOP as OSL
|
||||||
|
// does not allow you to hold lgui. This does.
|
||||||
|
case M_GUI:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
register_code16(KC_LGUI);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unregister_code16(KC_LGUI);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case M_SHUTDOWN:
|
||||||
|
if (record->event.pressed)
|
||||||
|
{
|
||||||
|
SEND_STRING(SS_LGUI(SS_TAP(X_P)) SS_DELAY(100) SS_TAP(X_Y) SS_DELAY(100) SS_TAP(X_ENTER));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
/*
|
||||||
|
case M_RU_CTRL:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_move(LAYER_MAIN);
|
||||||
|
register_code16(KC_LCTL);
|
||||||
|
} else {
|
||||||
|
unregister_code16(KC_LCTL);
|
||||||
|
layer_move(LAYER_RUSSIAN);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case M_RU_ALT:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_move(LAYER_MAIN);
|
||||||
|
register_code16(KC_LALT);
|
||||||
|
} else {
|
||||||
|
unregister_code16(KC_LALT);
|
||||||
|
layer_move(LAYER_RUSSIAN);
|
||||||
|
}
|
||||||
|
return false;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
# EditorConfig is awesome: https://EditorConfig.org
|
||||||
|
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = false
|
@ -0,0 +1,47 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(ARROWS)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_NULL
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_voyager(\
|
||||||
|
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_TRNS, KC_NO, KC_NO, KC_UP, KC_NO, KC_PGUP, \
|
||||||
|
KC_TRNS, KC_LCTL, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN, \
|
||||||
|
KC_LCTL, LGUI(KC_LCTL), KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, \
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_PGUP, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, LCTL(KC_LEFT), KC_PGDN, LCTL(KC_RIGHT), KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_TRNS, KC_TRNS \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA {\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_GRN, LC_OFF, LC_ORN, \
|
||||||
|
LC_OFF, LC_ORN, LC_GRN, LC_GRN, LC_GRN, LC_ORN, \
|
||||||
|
LC_OFF, LC_ORN, LC_OFF, LC_OFF, LC_RED, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_ORN, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_GRN, LC_ORN, LC_GRN, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF \
|
||||||
|
}
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,49 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(CTRL)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_voyager(\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, LGUI(KC_A), LGUI(KC_S), LGUI(KC_D), KC_TRNS, KC_TRNS,\
|
||||||
|
KC_NO, LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V), KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, \
|
||||||
|
\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA {\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_RED, LC_ORN, LC_GRN, LC_GRN, LC_CYN, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF \
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is important.
|
||||||
|
// The magic macro MUST be here, AFTER the RGBMatrix data.
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,48 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(FKEYS)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_NULL
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_voyager(\
|
||||||
|
TO(LAYER_MAIN), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, \
|
||||||
|
KC_NO, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, \
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA {\
|
||||||
|
LC_RED, LC_BLU, LC_BLU, LC_BLU, LC_BLU, LC_BLU, \
|
||||||
|
LC_OFF, LC_BLU, LC_BLU, LC_BLU, LC_BLU, LC_BLU, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF \
|
||||||
|
}
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,47 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(GAME)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_voyager( \
|
||||||
|
KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, \
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, \
|
||||||
|
KC_DELETE, KC_A, KC_S, KC_D, KC_F, KC_G, \
|
||||||
|
KC_LCTL, KC_Z, KC_X, KC_C, MO(LAYER_ARROWS), TD(TD_NOGAME), \
|
||||||
|
\
|
||||||
|
KC_SPACE, KC_BSPC, \
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA { \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_RED, \
|
||||||
|
LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF}
|
||||||
|
|
||||||
|
// This is important.
|
||||||
|
// The magic macro MUST be here, AFTER the RGBMatrix data.
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,25 @@
|
|||||||
|
// ORDER MATTERS!
|
||||||
|
// Don't forget how QMK layers work...
|
||||||
|
//
|
||||||
|
// Learned that the hard way.
|
||||||
|
|
||||||
|
// First layer will be "default" layer in QMK.
|
||||||
|
// Second will have index 1, etc. See layers.h
|
||||||
|
|
||||||
|
// These MUST be first.
|
||||||
|
// (For example, LAYER_ARROWS overlays on top of LAYER_MAIN)
|
||||||
|
#include "main.h"
|
||||||
|
#include "game.h"
|
||||||
|
#include "ctrl.h"
|
||||||
|
|
||||||
|
#include "russian.h"
|
||||||
|
|
||||||
|
#include "numbers.h" // Must be under symbols and arrows
|
||||||
|
|
||||||
|
// The order of the layers below doesn't matter,
|
||||||
|
// since they avoid transparent keys.
|
||||||
|
#include "symbols.h"
|
||||||
|
#include "arrows.h"
|
||||||
|
#include "macros.h"
|
||||||
|
#include "fkeys.h"
|
||||||
|
#include "keyboard.h"
|
@ -0,0 +1,29 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(KEYBOARD)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_voyager(\
|
||||||
|
TO(LAYER_MAIN), RGB_HUD, RGB_HUI, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, RGB_SAD, RGB_SAI, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, RGB_VAD, RGB_VAI, KC_NO, KC_NO, KC_NO, \
|
||||||
|
RGB_MOD, RGB_TOG, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, \
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,44 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(MACROS)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_voyager( \
|
||||||
|
TO(LAYER_MAIN), LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4), LGUI(KC_5), \
|
||||||
|
KC_LGUI, KC_NO, TD(TD_SCREENSHOT), KC_NO, KC_NO, LGUI(KC_T), \
|
||||||
|
KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, KC_NO, KC_NO, OSL(LAYER_FKEYS), KC_NO, \
|
||||||
|
KC_NO, KC_MEDIA_PREV_TRACK, KC_NO, LGUI(KC_W), KC_NO, TO(LAYER_GAME), \
|
||||||
|
LGUI(KC_ENTER), LGUI(KC_BSLS), \
|
||||||
|
\
|
||||||
|
M_SHUTDOWN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, LGUI(KC_SPACE), TD(TD_WMLAYOUT), \
|
||||||
|
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, TT(LAYER_RUSSIAN), \
|
||||||
|
LCTL(LGUI(LSFT(KC_R))), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
|
||||||
|
KC_NO, KC_NO)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA { \
|
||||||
|
LC_RED, LC_PNK, LC_PNK, LC_PNK, LC_PNK, LC_PNK, \
|
||||||
|
LC_CYN, LC_OFF, LC_CYN, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_GRN, LC_GRN, LC_OFF, LC_OFF, LC_BLU, LC_OFF, \
|
||||||
|
LC_OFF, LC_GRN, LC_OFF, LC_ORN, LC_OFF, LC_RED, \
|
||||||
|
LC_PNK, LC_PNK, \
|
||||||
|
LC_RED, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_RED, LC_RED, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_BLU, \
|
||||||
|
LC_ORN, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF}
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,37 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(MAIN)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
// russian
|
||||||
|
// spellcheck
|
||||||
|
// shared features
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_voyager(\
|
||||||
|
KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, \
|
||||||
|
OSL(LAYER_MACROS), KC_Q, KC_W, KC_E, KC_R, KC_T, \
|
||||||
|
KC_DELETE, MT(MOD_LALT, KC_A), KC_S, KC_D, KC_F, KC_G, \
|
||||||
|
MO(LAYER_CTRL), KC_Z, MT(MOD_LSFT, KC_X), KC_C, MO(LAYER_ARROWS), KC_B, \
|
||||||
|
\
|
||||||
|
KC_SPACE, KC_BSPC, \
|
||||||
|
\
|
||||||
|
\
|
||||||
|
KC_6, KC_7, KC_8, KC_9, KC_0, LGUI(KC_SPACE), \
|
||||||
|
KC_Y, KC_U, KC_I, KC_O, KC_NO, KC_NO, \
|
||||||
|
KC_H, KC_J, KC_K, MO(LAYER_SYMBOLS), KC_L, QK_LEAD, \
|
||||||
|
KC_N, KC_M, KC_P, KC_V, KC_NO, KC_NO, \
|
||||||
|
\
|
||||||
|
KC_RSFT, KC_ENTER \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,49 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(NUMBERS)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_voyager(\
|
||||||
|
TO(LAYER_MAIN), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, \
|
||||||
|
KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, \
|
||||||
|
KC_TRNS, KC_NO, KC_NO, KC_DOT, KC_COMMA, KC_NO,\
|
||||||
|
KC_TRNS, KC_TRNS, \
|
||||||
|
\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
|
||||||
|
KC_TRNS, KC_TRNS \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA {\
|
||||||
|
LC_RED, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_GRN, LC_GRN, LC_GRN, LC_GRN, LC_GRN, \
|
||||||
|
LC_OFF, LC_GRN, LC_GRN, LC_GRN, LC_GRN, LC_GRN, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_PNK, LC_PNK, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF \
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is important.
|
||||||
|
// The magic macro MUST be here, AFTER the RGBMatrix data.
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,47 @@
|
|||||||
|
// See symbols.h for docs
|
||||||
|
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(RUSSIAN)
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_voyager(\
|
||||||
|
KC_ESCAPE, RU_1, RU_2, RU_3, RU_4, RU_5, \
|
||||||
|
OSL(LAYER_MACROS), RU_CHE, RU_SHA, RU_IE, RU_ER, RU_TE, \
|
||||||
|
KC_DELETE, MT(MOD_LALT, RU_A), RU_ES, RU_DE, RU_EF, RU_GHE, \
|
||||||
|
LM(MOD_LCTL, LAYER_CTRL), RU_ZE, MT(MOD_LSFT, RU_YA), RU_TSE, MO(LAYER_ARROWS), RU_BE, \
|
||||||
|
KC_SPACE, KC_BSPC, \
|
||||||
|
\
|
||||||
|
RU_6, RU_7, RU_8, RU_9, RU_0, LGUI(KC_TAB), \
|
||||||
|
RU_U, RU_YU, RU_I, RU_O, RU_SHCH, RU_HARD, \
|
||||||
|
RU_HA, RU_ZHE, RU_KA, MO(LAYER_SYMBOLS), RU_EL, RU_SOFT, \
|
||||||
|
RU_EN, RU_EM, RU_PE, RU_VE, RU_YERU, RU_SHTI, \
|
||||||
|
KC_RSFT, KC_ENTER \
|
||||||
|
)
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA {\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_RUB, LC_RUB, LC_RUB, LC_RUB, LC_RUB, LC_RUB, \
|
||||||
|
LC_RUG, LC_RUG, LC_RUG, LC_RUG, LC_RUG, LC_RUG, \
|
||||||
|
LC_RUK, LC_RUK, LC_RUK, LC_RUK, LC_RUK, LC_RUK, \
|
||||||
|
LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_RUB, LC_RUB, LC_RUB, LC_RUB, LC_RUB, LC_RUB, \
|
||||||
|
LC_RUG, LC_RUG, LC_RUG, LC_RUG, LC_RUG, LC_RUG, \
|
||||||
|
LC_RUK, LC_RUK, LC_RUK, LC_RUK, LC_RUK, LC_RUK, \
|
||||||
|
LC_OFF, LC_OFF \
|
||||||
|
}
|
||||||
|
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
@ -0,0 +1,112 @@
|
|||||||
|
// Layers are defined in macros,
|
||||||
|
// so that all supporting code can be
|
||||||
|
// auto-generated by the preprocessor.
|
||||||
|
//
|
||||||
|
// When making a new layer, make sure you update EVERY
|
||||||
|
// reference to BETA_LAYER() with your layer's name!
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// This macro isn't used anywhere else.
|
||||||
|
// It's here for convenience, so we only have to write
|
||||||
|
// the layer name in one place.
|
||||||
|
#define BETA_LAYER_MAGIC_MACRO BETA_LAYER(SYMBOLS)
|
||||||
|
|
||||||
|
|
||||||
|
// What OS keyboard layout this layer is designed for.
|
||||||
|
// See extra_mappings.h for possible values.
|
||||||
|
//
|
||||||
|
// Every layer must have this section.
|
||||||
|
#ifdef BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_EN
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// If BETA_LAYER_NAME is defined, the preprocessor is making
|
||||||
|
// enums for this layer. See keymap.h.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// Things will break if BETA_LAYER_MAGIC_MACRO is written outside #ifdef/#endif guards.
|
||||||
|
|
||||||
|
// If BETA_LAYER_KEYS is defined, the preprocessor is either...
|
||||||
|
// - making LAYER_* enums (see keymap.h)
|
||||||
|
// - filling the keymap array (see keymap.c)
|
||||||
|
//
|
||||||
|
// Every layer must have this section.
|
||||||
|
#ifdef BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA LAYOUT_voyager(\
|
||||||
|
KC_NO, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC,\
|
||||||
|
KC_NO, KC_GRAVE, KC_LPRN, KC_RPRN, KC_QUES, KC_LCBR,\
|
||||||
|
KC_NO, KC_TILD, KC_QUOT, KC_COMMA, KC_DOT, KC_DQUO,\
|
||||||
|
KC_NO, KC_NO, KC_LBRC, KC_RBRC, KC_EXLM, KC_RCBR,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
KC_CIRC, KC_AMPR, KC_ASTR, KC_NO, KC_NO, KC_NO,\
|
||||||
|
KC_LABK, KC_RABK, KC_SLASH, KC_NO, KC_BSLS, KC_NO,\
|
||||||
|
KC_UNDS, KC_MINUS, KC_COLN, KC_TRANSPARENT, KC_PIPE, KC_NO,\
|
||||||
|
KC_EQUAL, KC_PLUS, KC_SCLN, KC_NO, KC_NO, KC_NO,\
|
||||||
|
\
|
||||||
|
KC_NO, KC_NO\
|
||||||
|
)
|
||||||
|
|
||||||
|
// This is important.d
|
||||||
|
// The magic macro MUST be here, AFTER the keymap data.
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// If BETA_LAYER_KEYS is defined, the preprocessor is either...
|
||||||
|
// - making LAYER_*_LEDS enums (see keymap.h)
|
||||||
|
// - filling the ledmap array (see keymap.c)
|
||||||
|
// - building the layer color switch statement (see keymap.c)
|
||||||
|
//
|
||||||
|
// This section is optional. If it is missing, this layer will not have
|
||||||
|
// an RGBMatrix color.
|
||||||
|
#ifdef BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER_CONTEXT_DATA {\
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_ORN, LC_CYN, LC_CYN, LC_PNK, LC_CYN, \
|
||||||
|
LC_OFF, LC_ORN, LC_PNK, LC_PNK, LC_PNK, LC_PNK, \
|
||||||
|
LC_OFF, LC_OFF, LC_CYN, LC_CYN, LC_PNK, LC_CYN, \
|
||||||
|
LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_GRN, LC_GRN, LC_CYN, LC_OFF, LC_CYN, LC_OFF, \
|
||||||
|
LC_CYN, LC_GRN, LC_PNK, LC_RED, LC_CYN, LC_OFF, \
|
||||||
|
LC_GRN, LC_GRN, LC_PNK, LC_OFF, LC_OFF, LC_OFF, \
|
||||||
|
LC_OFF, LC_OFF \
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is important.
|
||||||
|
// The magic macro MUST be here, AFTER the RGBMatrix data.
|
||||||
|
BETA_LAYER_MAGIC_MACRO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// If BETA_LAYER_INDICATORS is defined, the preprocessor is
|
||||||
|
// building the indicator led switch statement (see keymap.c)
|
||||||
|
//
|
||||||
|
// This should be a `case` statement that looks exactly like the following example.
|
||||||
|
//
|
||||||
|
// This section is optional. If it is missing, this layer will
|
||||||
|
// not set indicator leds.
|
||||||
|
/*
|
||||||
|
#ifdef BETA_LAYER_INDICATORS
|
||||||
|
case LAYER_MAGIC_MACRO:
|
||||||
|
ergodox_right_led_1_on();
|
||||||
|
//ergodox_right_led_2_on();
|
||||||
|
//ergodox_right_led_3_on();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// Cleanup.
|
||||||
|
// This is not optional,
|
||||||
|
// we MUST undef these here so the next layer
|
||||||
|
// we load can re-define them.
|
||||||
|
#undef BETA_LAYER_CONTEXT_DATA
|
||||||
|
#undef BETA_LAYER_MAGIC_MACRO
|
160
keyboards/betalupi_voyager/keymaps/default/layers/layers.c
Normal file
160
keyboards/betalupi_voyager/keymaps/default/layers/layers.c
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
//#include "extra_mappings.h"
|
||||||
|
#define LAYER_INCLUDE_FILE "definitions/include.c"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Setup
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// Generate layer ids
|
||||||
|
#define BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER(name) LAYER_##name,
|
||||||
|
enum layer_indices {
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
X_LAYER_MAX
|
||||||
|
};
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_KEYS
|
||||||
|
|
||||||
|
|
||||||
|
// Generate RGBMatrix ids
|
||||||
|
// We don't use the same id for layers and layer colors
|
||||||
|
// to save memory. Not every layer has colors!
|
||||||
|
#define BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER(name) LAYER_##name##_LEDS,
|
||||||
|
enum led_indices {
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
X_LAYER_LEDS_MAX
|
||||||
|
};
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_LEDS
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Load layers
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// Create keymap array
|
||||||
|
#define BETA_LAYER_KEYS
|
||||||
|
#define BETA_LAYER(name) [LAYER_##name] = BETA_LAYER_CONTEXT_DATA,
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
};
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_KEYS
|
||||||
|
|
||||||
|
|
||||||
|
// Create led map array
|
||||||
|
#define BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER(name) [LAYER_##name##_LEDS] = BETA_LAYER_CONTEXT_DATA,
|
||||||
|
const uint8_t PROGMEM ledmaps[][RGB_MATRIX_LED_COUNT][3] = {
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
};
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_LEDS
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Create os layout array
|
||||||
|
#define BETA_LAYER_LAYOUTS
|
||||||
|
#define BETA_LAYER(name) [LAYER_##name] = BETA_LAYER_CONTEXT_DATA,
|
||||||
|
uint8_t layer_layouts[] = {
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
};
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_LAYOUTS
|
||||||
|
*/
|
||||||
|
|
||||||
|
void set_layer_color(int layer) {
|
||||||
|
for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
|
||||||
|
HSV hsv = {
|
||||||
|
.h = pgm_read_byte(&ledmaps[layer][i][0]),
|
||||||
|
.s = pgm_read_byte(&ledmaps[layer][i][1]),
|
||||||
|
.v = pgm_read_byte(&ledmaps[layer][i][2]),
|
||||||
|
};
|
||||||
|
if (!hsv.h && !hsv.s && !hsv.v) {
|
||||||
|
rgb_matrix_set_color( i, 0, 0, 0 );
|
||||||
|
} else {
|
||||||
|
RGB rgb = hsv_to_rgb( hsv );
|
||||||
|
float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX;
|
||||||
|
rgb_matrix_set_color( i, f * rgb.r, f * rgb.g, f * rgb.b );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern bool beta_leading;
|
||||||
|
|
||||||
|
bool rgb_matrix_indicators_user(void) {
|
||||||
|
if (keyboard_config.disable_layer_led) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (biton32(layer_state)) {
|
||||||
|
|
||||||
|
// Load layer RGBMatrix colors
|
||||||
|
#define BETA_LAYER_LEDS
|
||||||
|
#define BETA_LAYER(name)\
|
||||||
|
case LAYER_##name:\
|
||||||
|
set_layer_color(LAYER_##name##_LEDS);\
|
||||||
|
break;
|
||||||
|
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_LEDS
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (rgb_matrix_get_flags() == LED_FLAG_NONE) {
|
||||||
|
rgb_matrix_set_color_all(0, 0, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (beta_leading) {
|
||||||
|
rgb_matrix_set_color(43, 0x00, 0x00, 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (biton32(layer_state) == LAYER_KEYBOARD) {
|
||||||
|
rgb_matrix_set_color(0, 0xFF, 0x00, 0x00);
|
||||||
|
rgb_matrix_set_color(18, 0x95, 0xFF, 0x00);
|
||||||
|
rgb_matrix_set_color(19, 0x95, 0xFF, 0x00);
|
||||||
|
|
||||||
|
rgb_matrix_set_color(14, 0x00, 0xFF, 0x8C);
|
||||||
|
rgb_matrix_set_color(13, 0x00, 0xFF, 0x8C);
|
||||||
|
rgb_matrix_set_color(8, 0x00, 0xFF, 0x8C);
|
||||||
|
rgb_matrix_set_color(7, 0x00, 0xFF, 0x8C);
|
||||||
|
rgb_matrix_set_color(2, 0x00, 0xFF, 0x8C);
|
||||||
|
rgb_matrix_set_color(1, 0x00, 0xFF, 0x8C);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
layer_state_t layer_state_set_user(layer_state_t state) {
|
||||||
|
uint8_t layer = biton32(state);
|
||||||
|
|
||||||
|
STATUS_LED_1(false);
|
||||||
|
STATUS_LED_2(false);
|
||||||
|
STATUS_LED_3(false);
|
||||||
|
STATUS_LED_4(false);
|
||||||
|
|
||||||
|
switch (layer) {
|
||||||
|
|
||||||
|
// Load indicator LED cases
|
||||||
|
#define BETA_LAYER_INDICATORS
|
||||||
|
#define BETA_LAYER(name) LAYER_##name
|
||||||
|
#include LAYER_INCLUDE_FILE
|
||||||
|
#undef BETA_LAYER
|
||||||
|
#undef BETA_LAYER_INDICATORS
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return state;
|
||||||
|
};
|
||||||
|
|
37
keyboards/betalupi_voyager/keymaps/default/parts/leader.c
Normal file
37
keyboards/betalupi_voyager/keymaps/default/parts/leader.c
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#include "features/leader/beta_leader.h"
|
||||||
|
|
||||||
|
BETA_LEADER_EXTERNS();
|
||||||
|
|
||||||
|
void beta_leader_start(void) {}
|
||||||
|
void beta_leader_end(void) {}
|
||||||
|
|
||||||
|
|
||||||
|
bool beta_leader_check(void) {
|
||||||
|
|
||||||
|
BETA_SEQ_2_SHORT(KC_E, KC_M) {
|
||||||
|
SEND_STRING(SECRET_EMAIL);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
BETA_SEQ_2_SHORT(KC_G, KC_M) {
|
||||||
|
SEND_STRING(SECRET_GMAIL);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
BETA_SEQ_2_SHORT(KC_L, KC_I) {
|
||||||
|
SEND_STRING(SECRET_SCHOOL_EMAIL);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
BETA_SEQ_2_SHORT(KC_K, KC_B) {
|
||||||
|
layer_move(LAYER_KEYBOARD);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
BETA_SEQ_1_SHORT(KC_N) {
|
||||||
|
layer_move(LAYER_NUMBERS);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
57
keyboards/betalupi_voyager/keymaps/default/parts/tapdance.c
Normal file
57
keyboards/betalupi_voyager/keymaps/default/parts/tapdance.c
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
void td_screenshot(tap_dance_state_t *state, void *user_data)
|
||||||
|
{
|
||||||
|
if (state->count == 1)
|
||||||
|
{
|
||||||
|
tap_code16(KC_PSCR);
|
||||||
|
}
|
||||||
|
else if (state->count == 2)
|
||||||
|
{
|
||||||
|
tap_code16(LSFT(KC_PSCR));
|
||||||
|
}
|
||||||
|
else if (state->count == 3)
|
||||||
|
{
|
||||||
|
tap_code16(LALT(KC_PSCR));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reset_tap_dance(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void td_wmlayout(tap_dance_state_t *state, void *user_data)
|
||||||
|
{
|
||||||
|
if (state->count == 1)
|
||||||
|
{
|
||||||
|
tap_code16(LGUI(KC_COMMA));
|
||||||
|
}
|
||||||
|
else if (state->count == 2)
|
||||||
|
{
|
||||||
|
tap_code16(LGUI(KC_DOT));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reset_tap_dance(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void td_nogame(tap_dance_state_t *state, void *user_data)
|
||||||
|
{
|
||||||
|
if (state->count == 1)
|
||||||
|
{
|
||||||
|
tap_code16(KC_B);
|
||||||
|
}
|
||||||
|
else if (state->count == 2)
|
||||||
|
{
|
||||||
|
layer_move(LAYER_MAIN);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reset_tap_dance(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tap_dance_action_t tap_dance_actions[] = {
|
||||||
|
[TD_WMLAYOUT] = ACTION_TAP_DANCE_FN(td_wmlayout),
|
||||||
|
[TD_SCREENSHOT] = ACTION_TAP_DANCE_FN(td_screenshot),
|
||||||
|
[TD_NOGAME] = ACTION_TAP_DANCE_FN(td_nogame),
|
||||||
|
};
|
3
keyboards/betalupi_voyager/keymaps/default/rules.mk
Normal file
3
keyboards/betalupi_voyager/keymaps/default/rules.mk
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# rules.mk overrides
|
||||||
|
|
||||||
|
TAP_DANCE_ENABLE = yes
|
85
keyboards/betalupi_voyager/ld/IGNITION.ld
Normal file
85
keyboards/betalupi_voyager/ld/IGNITION.ld
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* STM32F303xC memory setup.
|
||||||
|
*/
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
flash0 (rx) : org = 0x08002000, len = 256k - 0x2000
|
||||||
|
flash1 (rx) : org = 0x00000000, len = 0
|
||||||
|
flash2 (rx) : org = 0x00000000, len = 0
|
||||||
|
flash3 (rx) : org = 0x00000000, len = 0
|
||||||
|
flash4 (rx) : org = 0x00000000, len = 0
|
||||||
|
flash5 (rx) : org = 0x00000000, len = 0
|
||||||
|
flash6 (rx) : org = 0x00000000, len = 0
|
||||||
|
flash7 (rx) : org = 0x00000000, len = 0
|
||||||
|
ram0 (wx) : org = 0x20000000, len = 40k
|
||||||
|
ram1 (wx) : org = 0x00000000, len = 0
|
||||||
|
ram2 (wx) : org = 0x00000000, len = 0
|
||||||
|
ram3 (wx) : org = 0x00000000, len = 0
|
||||||
|
ram4 (wx) : org = 0x10000000, len = 8k
|
||||||
|
ram5 (wx) : org = 0x00000000, len = 0
|
||||||
|
ram6 (wx) : org = 0x00000000, len = 0
|
||||||
|
ram7 (wx) : org = 0x00000000, len = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For each data/text section two region are defined, a virtual region
|
||||||
|
and a load region (_LMA suffix).*/
|
||||||
|
|
||||||
|
/* Flash region to be used for exception vectors.*/
|
||||||
|
REGION_ALIAS("VECTORS_FLASH", flash0);
|
||||||
|
REGION_ALIAS("VECTORS_FLASH_LMA", flash0);
|
||||||
|
|
||||||
|
/* Flash region to be used for constructors and destructors.*/
|
||||||
|
REGION_ALIAS("XTORS_FLASH", flash0);
|
||||||
|
REGION_ALIAS("XTORS_FLASH_LMA", flash0);
|
||||||
|
|
||||||
|
/* Flash region to be used for code text.*/
|
||||||
|
REGION_ALIAS("TEXT_FLASH", flash0);
|
||||||
|
REGION_ALIAS("TEXT_FLASH_LMA", flash0);
|
||||||
|
|
||||||
|
/* Flash region to be used for read only data.*/
|
||||||
|
REGION_ALIAS("RODATA_FLASH", flash0);
|
||||||
|
REGION_ALIAS("RODATA_FLASH_LMA", flash0);
|
||||||
|
|
||||||
|
/* Flash region to be used for various.*/
|
||||||
|
REGION_ALIAS("VARIOUS_FLASH", flash0);
|
||||||
|
REGION_ALIAS("VARIOUS_FLASH_LMA", flash0);
|
||||||
|
|
||||||
|
/* Flash region to be used for RAM(n) initialization data.*/
|
||||||
|
REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0);
|
||||||
|
|
||||||
|
/* RAM region to be used for Main stack. This stack accommodates the processing
|
||||||
|
of all exceptions and interrupts.*/
|
||||||
|
REGION_ALIAS("MAIN_STACK_RAM", ram0);
|
||||||
|
|
||||||
|
/* RAM region to be used for the process stack. This is the stack used by
|
||||||
|
the main() function.*/
|
||||||
|
REGION_ALIAS("PROCESS_STACK_RAM", ram0);
|
||||||
|
|
||||||
|
/* RAM region to be used for data segment.*/
|
||||||
|
REGION_ALIAS("DATA_RAM", ram0);
|
||||||
|
REGION_ALIAS("DATA_RAM_LMA", flash0);
|
||||||
|
|
||||||
|
/* RAM region to be used for BSS segment.*/
|
||||||
|
REGION_ALIAS("BSS_RAM", ram0);
|
||||||
|
|
||||||
|
/* RAM region to be used for the default heap.*/
|
||||||
|
REGION_ALIAS("HEAP_RAM", ram0);
|
||||||
|
|
||||||
|
/* Generic rules inclusion.*/
|
||||||
|
INCLUDE rules.ld
|
241
keyboards/betalupi_voyager/matrix.c
Normal file
241
keyboards/betalupi_voyager/matrix.c
Normal file
@ -0,0 +1,241 @@
|
|||||||
|
/* Copyright 2020 ZSA Technology Labs, Inc <@zsa>
|
||||||
|
* Copyright 2020 Jack Humbert <jack.humb@gmail.com>
|
||||||
|
* 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 "betalupi_voyager.h"
|
||||||
|
#include "is31fl3731.h"
|
||||||
|
#include "i2c_master.h"
|
||||||
|
|
||||||
|
extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values
|
||||||
|
extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values
|
||||||
|
static matrix_row_t raw_matrix_right[MATRIX_COLS];
|
||||||
|
|
||||||
|
#define ROWS_PER_HAND (MATRIX_ROWS / 2)
|
||||||
|
#ifndef VOYAGER_I2C_TIMEOUT
|
||||||
|
# define VOYAGER_I2C_TIMEOUT 100
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern bool mcp23018_leds[2];
|
||||||
|
extern bool is_launching;
|
||||||
|
|
||||||
|
bool mcp23018_initd = false;
|
||||||
|
// extern bool IS31FL3731_initd;
|
||||||
|
static uint8_t mcp23018_reset_loop;
|
||||||
|
// static uint8_t is31fl3731_reset_loop;
|
||||||
|
|
||||||
|
uint8_t mcp23018_tx[3];
|
||||||
|
uint8_t mcp23018_rx[1];
|
||||||
|
|
||||||
|
void mcp23018_init(void) {
|
||||||
|
i2c_init();
|
||||||
|
|
||||||
|
mcp23018_tx[0] = 0x00; // IODIRA
|
||||||
|
mcp23018_tx[1] = 0b00000000; // A is output
|
||||||
|
mcp23018_tx[2] = 0b00111111; // B is inputs
|
||||||
|
|
||||||
|
if (MSG_OK == i2c_transmit(MCP23018_DEFAULT_ADDRESS << 1, mcp23018_tx, 3, VOYAGER_I2C_TIMEOUT)) {
|
||||||
|
mcp23018_tx[0] = 0x0C; // GPPUA
|
||||||
|
mcp23018_tx[1] = 0b10000000; // A is not pulled-up
|
||||||
|
mcp23018_tx[2] = 0b11111111; // B is pulled-up
|
||||||
|
wait_ms(5);
|
||||||
|
|
||||||
|
if (MSG_OK == i2c_transmit(MCP23018_DEFAULT_ADDRESS << 1, mcp23018_tx, 3, VOYAGER_I2C_TIMEOUT)) {
|
||||||
|
wait_ms(5);
|
||||||
|
mcp23018_initd = is_launching = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool io_expander_ready(void) {
|
||||||
|
uint8_t tx[1] = {0x13};
|
||||||
|
if (MSG_OK == i2c_readReg(MCP23018_DEFAULT_ADDRESS << 1, tx[0], &tx[0], 1, VOYAGER_I2C_TIMEOUT)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init_custom(void) {
|
||||||
|
// outputs
|
||||||
|
setPinOutput(B10);
|
||||||
|
setPinOutput(B11);
|
||||||
|
setPinOutput(B12);
|
||||||
|
setPinOutput(B13);
|
||||||
|
setPinOutput(B14);
|
||||||
|
setPinOutput(B15);
|
||||||
|
|
||||||
|
// inputs
|
||||||
|
setPinInputLow(A0);
|
||||||
|
setPinInputLow(A1);
|
||||||
|
setPinInputLow(A2);
|
||||||
|
setPinInputLow(A3);
|
||||||
|
setPinInputLow(A6);
|
||||||
|
setPinInputLow(A7);
|
||||||
|
setPinInputLow(B0);
|
||||||
|
|
||||||
|
mcp23018_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
|
||||||
|
bool changed = false;
|
||||||
|
// Attempt to reset the mcp23018 if it's not initialized
|
||||||
|
if (!mcp23018_initd) {
|
||||||
|
if (++mcp23018_reset_loop == 0) {
|
||||||
|
// Since mcp23018_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.
|
||||||
|
if (io_expander_ready()) {
|
||||||
|
// If we managed to initialize the mcp23018 - we need to reinitialize the matrix / layer state. During an electric discharge the i2c peripherals might be in a weird state. Giving a delay and resetting the MCU allows to recover from this.
|
||||||
|
wait_ms(200);
|
||||||
|
mcu_reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scanning left and right side of the keyboard for key presses.
|
||||||
|
// Left side is scanned by reading the gpio pins directly, right side is scanned by reading the mcp23018 registers.
|
||||||
|
|
||||||
|
matrix_row_t data = 0;
|
||||||
|
for (uint8_t row = 0; row <= ROWS_PER_HAND; row++) {
|
||||||
|
// strobe row
|
||||||
|
switch (row) {
|
||||||
|
case 0:
|
||||||
|
writePinHigh(B10);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
writePinHigh(B11);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
writePinHigh(B12);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
writePinHigh(B13);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
writePinHigh(B14);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
writePinHigh(B15);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
break; // Left hand has 6 rows
|
||||||
|
}
|
||||||
|
|
||||||
|
// Selecting the row on the right side of the keyboard.
|
||||||
|
if (mcp23018_initd) {
|
||||||
|
// select row
|
||||||
|
mcp23018_tx[0] = 0x12; // GPIOA
|
||||||
|
mcp23018_tx[1] = (0b01111111 & ~(1 << (row))) | ((uint8_t)!mcp23018_leds[2] << 7); // activate row
|
||||||
|
mcp23018_tx[2] = ((uint8_t)!mcp23018_leds[1] << 6) | ((uint8_t)!mcp23018_leds[0] << 7); // activate row
|
||||||
|
|
||||||
|
if (MSG_OK != i2c_transmit(MCP23018_DEFAULT_ADDRESS << 1, mcp23018_tx, 3, VOYAGER_I2C_TIMEOUT)) {
|
||||||
|
mcp23018_initd = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Reading the left side of the keyboard.
|
||||||
|
if (row < ROWS_PER_HAND) {
|
||||||
|
// i2c comm incur enough wait time
|
||||||
|
if (!mcp23018_initd) {
|
||||||
|
// need wait to settle pin state
|
||||||
|
matrix_io_delay();
|
||||||
|
}
|
||||||
|
// read col data
|
||||||
|
data = ((readPin(A0) << 0) | (readPin(A1) << 1) | (readPin(A2) << 2) | (readPin(A3) << 3) | (readPin(A6) << 4) | (readPin(A7) << 5) | (readPin(B0) << 6));
|
||||||
|
// unstrobe row
|
||||||
|
switch (row) {
|
||||||
|
case 0:
|
||||||
|
writePinLow(B10);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
writePinLow(B11);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
writePinLow(B12);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
writePinLow(B13);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
writePinLow(B14);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
writePinLow(B15);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current_matrix[row] != data) {
|
||||||
|
current_matrix[row] = data;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reading the right side of the keyboard.
|
||||||
|
if (mcp23018_initd) {
|
||||||
|
for (uint16_t i = 0; i < IO_EXPANDER_OP_DELAY; i++) {
|
||||||
|
__asm__("nop");
|
||||||
|
}
|
||||||
|
|
||||||
|
mcp23018_tx[0] = 0x13; // GPIOB
|
||||||
|
if (MSG_OK != i2c_readReg(MCP23018_DEFAULT_ADDRESS << 1, mcp23018_tx[0], &mcp23018_rx[0], 1, VOYAGER_I2C_TIMEOUT)) {
|
||||||
|
mcp23018_initd = false;
|
||||||
|
}
|
||||||
|
data = ~(mcp23018_rx[0] & 0b00111111);
|
||||||
|
for (uint16_t i = 0; i < IO_EXPANDER_OP_DELAY; i++) {
|
||||||
|
__asm__("nop");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
data = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (raw_matrix_right[row] != data) {
|
||||||
|
raw_matrix_right[row] = data;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint8_t row = 0; row < ROWS_PER_HAND; row++) {
|
||||||
|
current_matrix[11 - row] = 0;
|
||||||
|
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
|
||||||
|
current_matrix[11 - row] |= ((raw_matrix_right[6 - col] & (1 << row) ? 1 : 0) << col);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// DO NOT REMOVE
|
||||||
|
// Needed for proper wake/sleep
|
||||||
|
void matrix_power_up(void) {
|
||||||
|
bool temp_launching = is_launching;
|
||||||
|
|
||||||
|
matrix_init_custom();
|
||||||
|
|
||||||
|
is_launching = temp_launching;
|
||||||
|
if (!temp_launching) {
|
||||||
|
STATUS_LED_1(false);
|
||||||
|
STATUS_LED_2(false);
|
||||||
|
STATUS_LED_3(false);
|
||||||
|
STATUS_LED_4(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize matrix state: all keys off
|
||||||
|
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
|
||||||
|
matrix[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_transport_connected(void) {
|
||||||
|
return mcp23018_initd;
|
||||||
|
}
|
39
keyboards/betalupi_voyager/mcuconf.h
Normal file
39
keyboards/betalupi_voyager/mcuconf.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/* Copyright 2021 QMK
|
||||||
|
*
|
||||||
|
* 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 3 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include_next <mcuconf.h>
|
||||||
|
|
||||||
|
// for i2c expander, and ISSI
|
||||||
|
#undef STM32_I2C_USE_I2C1
|
||||||
|
#define STM32_I2C_USE_I2C1 TRUE
|
||||||
|
|
||||||
|
// for future hardware
|
||||||
|
#undef STM32_I2C_USE_I2C2
|
||||||
|
#define STM32_I2C_USE_I2C2 TRUE
|
||||||
|
|
||||||
|
// for audio
|
||||||
|
#undef STM32_DAC_USE_DAC1_CH1
|
||||||
|
#define STM32_DAC_USE_DAC1_CH1 TRUE
|
||||||
|
#undef STM32_DAC_USE_DAC1_CH2
|
||||||
|
#define STM32_DAC_USE_DAC1_CH2 TRUE
|
||||||
|
#undef STM32_GPT_USE_TIM6
|
||||||
|
#define STM32_GPT_USE_TIM6 TRUE
|
||||||
|
#undef STM32_GPT_USE_TIM7
|
||||||
|
#define STM32_GPT_USE_TIM7 TRUE
|
||||||
|
#undef STM32_GPT_USE_TIM8
|
||||||
|
#define STM32_GPT_USE_TIM8 TRUE
|
58
keyboards/betalupi_voyager/readme.md
Normal file
58
keyboards/betalupi_voyager/readme.md
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# Voyager
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
A next-gen split, ergonomic keyboard with an active left side, USB type C, integrated wrist rest, and a thumb cluster that can move.
|
||||||
|
|
||||||
|
|
||||||
|
* Keyboard Maintainer: [drashna](https://github.com/drashna), [ZSA](https://github.com/zsa/)
|
||||||
|
* Hardware Supported: Voyager (STM32F303xC)
|
||||||
|
* Hardware Availability: [ZSA Store](https://zsa.io/voyager/)
|
||||||
|
|
||||||
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
|
make voyager:default
|
||||||
|
|
||||||
|
Flashing example for this keyboard:
|
||||||
|
|
||||||
|
make voyager: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).
|
||||||
|
|
||||||
|
|
||||||
|
## Voyager Customization
|
||||||
|
|
||||||
|
### Indicator LEDs
|
||||||
|
|
||||||
|
There are 6 functions for enabling and disabling the LEDs on the top of the boards. The functions are `ML_LED_1(bool)` through `ML_LED_6(bool)`, with the first LED being the left most LED on the left hand, and the sixth LED being the right most LED on the right side.
|
||||||
|
|
||||||
|
By default, the Indicator LEDs are used to indicate the layer state for the keyboard. If you wish to change this (and indicate caps/num/scroll lock status instead), then define `VOYAGER_USER_LEDS` in your `config.h` file.
|
||||||
|
|
||||||
|
|
||||||
|
### Oryx Configuration
|
||||||
|
|
||||||
|
To enable the features from Oryx (ZSA's Configurator), either compile the `default` keymap, or add `#define ORYX_CONFIGURATOR` to your `config.h` file.
|
||||||
|
|
||||||
|
This enables the front Indicator LEDs, and the `TOGGLE_LAYER_COLOR` keycode. The `TOGGLE_LAYER_COLOR` keycode toggles the customized LED map configured on Oryx.
|
||||||
|
|
||||||
|
### RGB Matrix Features
|
||||||
|
|
||||||
|
If you're using the Smart LED (layer indication) feature from the Oryx Configurator, you want to make sure that you enable these options by adding `#define ORYX_CONFIGURATOR` to your keymap's `config.h`.
|
||||||
|
|
||||||
|
This changes the `RGB_TOG` keycode so that it will toggle the lights on and off, in a way that will allow the Smart LEDs to continue to work, even with the rest of the LEDs turned off.
|
||||||
|
|
||||||
|
Additionally, a new keycode has been added to toggle the Smart LEDs. Use `TOGGLE_LAYER_COLOR`, if you aren't already.
|
||||||
|
|
||||||
|
### Detecting split / Gaming mode
|
||||||
|
|
||||||
|
To make it extra gaming friendly, you can configure what happens when you disconnect the right half. This is especially useful when using gaming unfriendly layers or layouts (e.g. home row mods, dvorak, colemak).
|
||||||
|
|
||||||
|
Example for enabling a specific layer while right side is disconnected:
|
||||||
|
|
||||||
|
```
|
||||||
|
void housekeeping_task_user(void) {
|
||||||
|
if (!is_transport_connected()) {
|
||||||
|
// set layer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
29
keyboards/betalupi_voyager/rules.mk
Normal file
29
keyboards/betalupi_voyager/rules.mk
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
MCU = STM32F303
|
||||||
|
BOOTLOADER = ignition
|
||||||
|
DFU_SUFFIX_ARGS = -v 3297 -p 0791
|
||||||
|
|
||||||
|
BOOTMAGIC_ENABLE = yes
|
||||||
|
MOUSEKEY_ENABLE = no
|
||||||
|
EXTRAKEY_ENABLE = yes
|
||||||
|
CONSOLE_ENABLE = no
|
||||||
|
COMMAND_ENABLE = no
|
||||||
|
NKRO_ENABLE = yes
|
||||||
|
BACKLIGHT_ENABLE = no
|
||||||
|
RGBLIGHT_ENABLE = no
|
||||||
|
AUDIO_ENABLE = no
|
||||||
|
CUSTOM_MATRIX = lite
|
||||||
|
SWAP_HANDS_ENABLE = no
|
||||||
|
RGB_MATRIX_ENABLE = yes
|
||||||
|
RGB_MATRIX_DRIVER = is31fl3731
|
||||||
|
EEPROM_DRIVER = vendor
|
||||||
|
MOUSE_SHARED_EP = no
|
||||||
|
LTO_ENABLE = yes
|
||||||
|
DEBUG_ENABLE = no
|
||||||
|
MOUSE_SHARED_EP = no
|
||||||
|
COMBO_ENABLE = yes
|
||||||
|
|
||||||
|
SRC += matrix.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
|
||||||
|
SRC += \
|
||||||
|
features/leader/leader.c
|
@ -1,73 +0,0 @@
|
|||||||
// RGBLight effects
|
|
||||||
// Static color is always enabled.
|
|
||||||
//#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_RGB_TEST
|
|
||||||
//#define RGBLIGHT_EFFECT_SNAKE
|
|
||||||
//#define RGBLIGHT_EFFECT_STATIC_GRADIENT
|
|
||||||
//#define RGBLIGHT_EFFECT_TWINKLE
|
|
||||||
|
|
||||||
|
|
||||||
// Custom effects
|
|
||||||
#define RGB_MATRIX_DATAPOINTER_ENABLED
|
|
||||||
|
|
||||||
|
|
||||||
// Normal matrix effects
|
|
||||||
//#define DISABLE_RGB_MATRIX_SOLID_COLOR
|
|
||||||
#define DISABLE_RGB_MATRIX_ALPHAS_MODS // Static dual hue, speed is hue for secondary hue
|
|
||||||
//#define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN // Static gradient top to bottom, speed controls how much gradient changes
|
|
||||||
#define DISABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT // Static gradient left to right, speed controls how much gradient changes
|
|
||||||
#define DISABLE_RGB_MATRIX_BREATHING // Single hue brightness cycling animation
|
|
||||||
#define DISABLE_RGB_MATRIX_BAND_SAT // Single hue band fading saturation scrolling left to right
|
|
||||||
#define DISABLE_RGB_MATRIX_BAND_VAL // Single hue band fading brightness scrolling left to right
|
|
||||||
#define DISABLE_RGB_MATRIX_BAND_PINWHEEL_SAT // Single hue 3 blade spinning pinwheel fades saturation
|
|
||||||
#define DISABLE_RGB_MATRIX_BAND_PINWHEEL_VAL // Single hue 3 blade spinning pinwheel fades brightness
|
|
||||||
#define DISABLE_RGB_MATRIX_BAND_SPIRAL_SAT // Single hue spinning spiral fades saturation
|
|
||||||
#define DISABLE_RGB_MATRIX_BAND_SPIRAL_VAL // Single hue spinning spiral fades brightness
|
|
||||||
#define DISABLE_RGB_MATRIX_CYCLE_ALL // Full keyboard solid hue cycling through full gradient
|
|
||||||
#define DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT // Full gradient scrolling left to right
|
|
||||||
#define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN // Full gradient scrolling top to bottom
|
|
||||||
#define DISABLE_RGB_MATRIX_CYCLE_OUT_IN // Full gradient scrolling out to in
|
|
||||||
#define DISABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL // Full dual gradients scrolling out to in
|
|
||||||
#define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON // Full gradent Chevron shapped scrolling left to right
|
|
||||||
#define DISABLE_RGB_MATRIX_CYCLE_PINWHEEL // Full gradient spinning pinwheel around center of keyboard
|
|
||||||
#define DISABLE_RGB_MATRIX_CYCLE_SPIRAL // Full gradient spinning spiral around center of keyboard
|
|
||||||
#define DISABLE_RGB_MATRIX_DUAL_BEACON // Full gradient spinning around center of keyboard
|
|
||||||
#define DISABLE_RGB_MATRIX_RAINBOW_BEACON // Full tighter gradient spinning around center of keyboard
|
|
||||||
#define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS // Full dual gradients spinning two halfs of keyboard
|
|
||||||
#define DISABLE_RGB_MATRIX_RAINDROPS // Randomly changes a single key's hue
|
|
||||||
#define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS // Randomly changes a single key's hue and saturation
|
|
||||||
#define DISABLE_RGB_MATRIX_HUE_BREATHING // Hue shifts up a slight ammount at the same time, then shifts back
|
|
||||||
#define DISABLE_RGB_MATRIX_HUE_PENDULUM // Hue shifts up a slight ammount in a wave to the right, then back to the left
|
|
||||||
#define DISABLE_RGB_MATRIX_HUE_WAVE // Hue shifts up a slight ammount and then back down in a wave to the right
|
|
||||||
#define DISABLE_RGB_MATRIX_PIXEL_FRACTAL // Single hue fractal filled keys pulsing horizontally out to edges
|
|
||||||
#define DISABLE_RGB_MATRIX_PIXEL_FLOW // Pulsing RGB flow along LED wiring with random hues
|
|
||||||
#define DISABLE_RGB_MATRIX_PIXEL_RAIN // Randomly light keys with random hues
|
|
||||||
|
|
||||||
// Framebuffer matrix effects
|
|
||||||
//#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
|
|
||||||
#ifdef RGB_MATRIX_FRAMEBUFFER_EFFECTS
|
|
||||||
#define DISABLE_RGB_MATRIX_TYPING_HEATMAP
|
|
||||||
#define DISABLE_RGB_MATRIX_DIGITAL_RAIN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Keypress matrix effects
|
|
||||||
//#define RGB_MATRIX_KEYPRESSES
|
|
||||||
#ifdef RGB_MATRIX_KEYPRESSES
|
|
||||||
#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE // Pulses keys hit to hue & value then fades value out
|
|
||||||
#define DISABLE_RGB_MATRIX_SOLID_REACTIVE // Static single hue, pulses keys hit to shifted hue then fades to current hue
|
|
||||||
#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE // Hue & value pulse near a single key hit then fades value out
|
|
||||||
#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE // Hue & value pulse near multiple key hits then fades value out
|
|
||||||
#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS // Hue & value pulse the same column and row of a single key hit then fades value out
|
|
||||||
#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS // Hue & value pulse the same column and row of multiple key hits then fades value out
|
|
||||||
#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS // Hue & value pulse away on the same column and row of a single key hit then fades value out
|
|
||||||
#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS // Hue & value pulse away on the same column and row of multiple key hits then fades value out
|
|
||||||
#define DISABLE_RGB_MATRIX_SPLASH // Full gradient & value pulse away from a single key hit then fades value out
|
|
||||||
#define DISABLE_RGB_MATRIX_MULTISPLASH // Full gradient & value pulse away from multiple key hits then fades value out
|
|
||||||
#define DISABLE_RGB_MATRIX_SOLID_SPLASH // Hue & value pulse away from a single key hit then fades value out
|
|
||||||
#define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH // Hue & value pulse away from multiple key hits then fades value out
|
|
||||||
#endif
|
|
@ -1,262 +0,0 @@
|
|||||||
#include "keymap.h"
|
|
||||||
|
|
||||||
|
|
||||||
// Define custom keys
|
|
||||||
// (Must be done BEFORE keymaps)
|
|
||||||
enum custom_keycodes {
|
|
||||||
M_SHUTDOWN = BETA_SAFE_RANGE,
|
|
||||||
M_RESETWM,
|
|
||||||
RU_LAYER,
|
|
||||||
EN_LAYER,
|
|
||||||
M_RU_CTRL,
|
|
||||||
M_RU_ALT
|
|
||||||
};
|
|
||||||
|
|
||||||
enum tap_dance_codes {
|
|
||||||
TD_WMLAYOUT,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Assemble key and LED maps
|
|
||||||
enum layer_indices {
|
|
||||||
LAYER_MAIN_IDX = 0,
|
|
||||||
LAYER_RUSSIAN_IDX,
|
|
||||||
LAYER_COLEMAK_IDX,
|
|
||||||
LAYER_NUMPAD_IDX,
|
|
||||||
LAYER_SYMBOLS_IDX,
|
|
||||||
LAYER_ARROWS_IDX,
|
|
||||||
LAYER_FKEYS_IDX,
|
|
||||||
LAYER_DESKTOP_IDX,
|
|
||||||
LAYER_KEYBOARD_IDX,
|
|
||||||
|
|
||||||
};
|
|
||||||
// Used to set system keymap
|
|
||||||
enum key_encodings {
|
|
||||||
LANG_NULL, // For layers that don't care about input lang
|
|
||||||
LANG_EN,
|
|
||||||
LANG_RU
|
|
||||||
};
|
|
||||||
enum led_indices {
|
|
||||||
// We have seperate indexes for LEDs because
|
|
||||||
// some layers may not need an led map.
|
|
||||||
// This saves memory by avoiding extra empty led maps.
|
|
||||||
LAYER_COLEMAK_LEDS_IDX = 0,
|
|
||||||
LAYER_RUSSIAN_LEDS_IDX,
|
|
||||||
LAYER_NUMPAD_LEDS_IDX,
|
|
||||||
LAYER_SYMBOLS_LEDS_IDX,
|
|
||||||
LAYER_ARROWS_LEDS_IDX,
|
|
||||||
LAYER_FKEYS_LEDS_IDX,
|
|
||||||
LAYER_DESKTOP_LEDS_IDX
|
|
||||||
};
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|
||||||
[LAYER_MAIN_IDX] = LAYER_MAIN,
|
|
||||||
[LAYER_RUSSIAN_IDX] = LAYER_RUSSIAN,
|
|
||||||
[LAYER_COLEMAK_IDX] = LAYER_COLEMAK,
|
|
||||||
[LAYER_NUMPAD_IDX] = LAYER_NUMPAD,
|
|
||||||
[LAYER_SYMBOLS_IDX] = LAYER_SYMBOLS,
|
|
||||||
[LAYER_ARROWS_IDX] = LAYER_ARROWS,
|
|
||||||
[LAYER_FKEYS_IDX] = LAYER_FKEYS,
|
|
||||||
[LAYER_DESKTOP_IDX] = LAYER_DESKTOP,
|
|
||||||
[LAYER_KEYBOARD_IDX] = LAYER_KEYBOARD
|
|
||||||
};
|
|
||||||
const uint8_t PROGMEM ledmap[][DRIVER_LED_TOTAL][3] = {
|
|
||||||
[LAYER_COLEMAK_LEDS_IDX] = LAYER_COLEMAK_LEDS,
|
|
||||||
[LAYER_RUSSIAN_LEDS_IDX] = LAYER_RUSSIAN_LEDS,
|
|
||||||
[LAYER_NUMPAD_LEDS_IDX] = LAYER_NUMPAD_LEDS,
|
|
||||||
[LAYER_SYMBOLS_LEDS_IDX] = LAYER_SYMBOLS_LEDS,
|
|
||||||
[LAYER_ARROWS_LEDS_IDX] = LAYER_ARROWS_LEDS,
|
|
||||||
[LAYER_FKEYS_LEDS_IDX] = LAYER_FKEYS_LEDS,
|
|
||||||
[LAYER_DESKTOP_LEDS_IDX] = LAYER_DESKTOP_LEDS
|
|
||||||
};
|
|
||||||
|
|
||||||
int current_lang = LANG_EN;
|
|
||||||
|
|
||||||
void keyboard_post_init_user(void) {}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void set_layer_color(int layer) {
|
|
||||||
for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
|
|
||||||
HSV hsv = {
|
|
||||||
.h = pgm_read_byte(&ledmap[layer][i][0]),
|
|
||||||
.s = pgm_read_byte(&ledmap[layer][i][1]),
|
|
||||||
.v = pgm_read_byte(&ledmap[layer][i][2]),
|
|
||||||
};
|
|
||||||
if (!hsv.h && !hsv.s && !hsv.v) {
|
|
||||||
rgb_matrix_set_color( i, 0, 0, 0 );
|
|
||||||
} else {
|
|
||||||
RGB rgb = hsv_to_rgb( hsv );
|
|
||||||
float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX;
|
|
||||||
rgb_matrix_set_color( i, f * rgb.r, f * rgb.g, f * rgb.b );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgb_matrix_indicators_user(void) {
|
|
||||||
if (g_suspend_state || keyboard_config.disable_layer_led) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (biton32(layer_state)) {
|
|
||||||
case LAYER_COLEMAK_IDX:
|
|
||||||
set_layer_color(LAYER_COLEMAK_LEDS_IDX);
|
|
||||||
break;
|
|
||||||
case LAYER_RUSSIAN_IDX:
|
|
||||||
set_layer_color(LAYER_RUSSIAN_LEDS_IDX);
|
|
||||||
break;
|
|
||||||
case LAYER_NUMPAD_IDX:
|
|
||||||
set_layer_color(LAYER_NUMPAD_LEDS_IDX);
|
|
||||||
break;
|
|
||||||
case LAYER_SYMBOLS_IDX:
|
|
||||||
set_layer_color(LAYER_SYMBOLS_LEDS_IDX);
|
|
||||||
break;
|
|
||||||
case LAYER_ARROWS_IDX:
|
|
||||||
set_layer_color(LAYER_ARROWS_LEDS_IDX);
|
|
||||||
break;
|
|
||||||
case LAYER_FKEYS_IDX:
|
|
||||||
set_layer_color(LAYER_FKEYS_LEDS_IDX);
|
|
||||||
break;
|
|
||||||
case LAYER_DESKTOP_IDX:
|
|
||||||
set_layer_color(LAYER_DESKTOP_LEDS_IDX);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (rgb_matrix_get_flags() == LED_FLAG_NONE) {
|
|
||||||
rgb_matrix_set_color_all(0, 0, 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_lang(int lang) { set_lang_long(lang, false); }
|
|
||||||
void set_lang_long(int lang, bool force) {
|
|
||||||
if (current_lang != lang || force) {
|
|
||||||
switch (lang) {
|
|
||||||
case LANG_EN:
|
|
||||||
SEND_STRING(SS_LGUI(SS_LSFT(SS_LCTL(SS_TAP(X_0)))));
|
|
||||||
current_lang = lang;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LANG_RU:
|
|
||||||
SEND_STRING(SS_LGUI(SS_LSFT(SS_LCTL(SS_TAP(X_9)))));
|
|
||||||
current_lang = lang;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LANG_NULL:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|
||||||
switch (keycode) {
|
|
||||||
case M_RESETWM:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
SEND_STRING(SS_LCTL(SS_LGUI(SS_LSFT(SS_TAP(X_R)))));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case M_SHUTDOWN:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
SEND_STRING(SS_LGUI(SS_TAP(X_P)) SS_DELAY(100) SS_TAP(X_Y) SS_DELAY(100) SS_TAP(X_ENTER));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RU_LAYER:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
set_lang(LANG_RU);
|
|
||||||
layer_move(LAYER_RUSSIAN_IDX);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EN_LAYER:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
set_lang(LANG_EN);
|
|
||||||
layer_move(LAYER_MAIN_IDX);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case M_RU_CTRL:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
if (current_lang == LANG_RU) {
|
|
||||||
set_lang_long(LANG_EN, true);
|
|
||||||
layer_move(LAYER_MAIN_IDX);
|
|
||||||
current_lang = LANG_RU;
|
|
||||||
}
|
|
||||||
register_code16(KC_LCTRL);
|
|
||||||
} else {
|
|
||||||
unregister_code16(KC_LCTRL);
|
|
||||||
if (current_lang == LANG_RU) {
|
|
||||||
layer_move(LAYER_RUSSIAN_IDX);
|
|
||||||
set_lang_long(LANG_RU, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t layer_state_set_user(uint32_t state) {
|
|
||||||
|
|
||||||
uint8_t layer = biton32(state);
|
|
||||||
|
|
||||||
ergodox_board_led_off();
|
|
||||||
ergodox_right_led_1_off();
|
|
||||||
ergodox_right_led_2_off();
|
|
||||||
ergodox_right_led_3_off();
|
|
||||||
|
|
||||||
switch (layer) {
|
|
||||||
case LAYER_MAIN_IDX:
|
|
||||||
set_lang(LANG_EN);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LAYER_RUSSIAN_IDX:
|
|
||||||
set_lang(LANG_RU);
|
|
||||||
ergodox_right_led_2_on();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LAYER_COLEMAK_IDX:
|
|
||||||
set_lang(LANG_EN);
|
|
||||||
ergodox_right_led_2_on();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LAYER_NUMPAD_IDX:
|
|
||||||
set_lang(LANG_EN);
|
|
||||||
ergodox_right_led_1_on();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LAYER_SYMBOLS_IDX:
|
|
||||||
set_lang(LANG_EN);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LAYER_ARROWS_IDX:
|
|
||||||
set_lang(LANG_EN);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LAYER_FKEYS_IDX:
|
|
||||||
set_lang(LANG_EN);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LAYER_DESKTOP_IDX:
|
|
||||||
set_lang(LANG_EN);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LAYER_KEYBOARD_IDX:
|
|
||||||
set_lang(LANG_NULL);
|
|
||||||
ergodox_right_led_1_on();
|
|
||||||
ergodox_right_led_2_on();
|
|
||||||
ergodox_right_led_3_on();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return state;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
qk_tap_dance_action_t tap_dance_actions[] = {
|
|
||||||
[TD_WMLAYOUT] = ACTION_TAP_DANCE_FN_ADVANCED(td_wmlayout_dance, td_wmlayout_finished, td_wmlayout_reset),
|
|
||||||
};
|
|
@ -1,109 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "betalupi_ergodox.h"
|
|
||||||
#include "version.h"
|
|
||||||
//#include "keymap_german.h"
|
|
||||||
//#include "keymap_nordic.h"
|
|
||||||
//#include "keymap_french.h"
|
|
||||||
//#include "keymap_spanish.h"
|
|
||||||
//#include "keymap_hungarian.h"
|
|
||||||
//#include "keymap_swedish.h"
|
|
||||||
//#include "keymap_br_abnt2.h"
|
|
||||||
//#include "keymap_canadian_multilingual.h"
|
|
||||||
//#include "keymap_german_ch.h"
|
|
||||||
//#include "keymap_jp.h"
|
|
||||||
//#include "keymap_korean.h"
|
|
||||||
//#include "keymap_bepo.h"
|
|
||||||
//#include "keymap_italian.h"
|
|
||||||
//#include "keymap_slovenian.h"
|
|
||||||
//#include "keymap_lithuanian_azerty.h"
|
|
||||||
//#include "keymap_danish.h"
|
|
||||||
//#include "keymap_norwegian.h"
|
|
||||||
//#include "keymap_portuguese.h"
|
|
||||||
//#include "keymap_contributions.h"
|
|
||||||
//#include "keymap_czech.h"
|
|
||||||
//#include "keymap_romanian.h"
|
|
||||||
#include "keymap_russian.h"
|
|
||||||
//#include "keymap_uk.h"
|
|
||||||
//#include "keymap_estonian.h"
|
|
||||||
//#include "keymap_belgian.h"
|
|
||||||
#include "keymap_us_international.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include "layers.h"
|
|
||||||
#include "tapdance.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define KC_MAC_UNDO LGUI(KC_Z)
|
|
||||||
#define KC_MAC_CUT LGUI(KC_X)
|
|
||||||
#define KC_MAC_COPY LGUI(KC_C)
|
|
||||||
#define KC_MAC_PASTE LGUI(KC_V)
|
|
||||||
#define KC_PC_UNDO LCTL(KC_Z)
|
|
||||||
#define KC_PC_CUT LCTL(KC_X)
|
|
||||||
#define KC_PC_COPY LCTL(KC_C)
|
|
||||||
#define KC_PC_PASTE LCTL(KC_V)
|
|
||||||
#define ES_LESS_MAC KC_GRAVE
|
|
||||||
#define ES_GRTR_MAC LSFT(KC_GRAVE)
|
|
||||||
#define ES_BSLS_MAC ALGR(KC_6)
|
|
||||||
#define NO_PIPE_ALT KC_GRAVE
|
|
||||||
#define NO_BSLS_ALT KC_EQUAL
|
|
||||||
#define LSA_T(kc) MT(MOD_LSFT | MOD_LALT, kc)
|
|
||||||
#define BP_NDSH_MAC ALGR(KC_8)
|
|
||||||
|
|
||||||
/* Text keyboard
|
|
||||||
*
|
|
||||||
* ,--------------------------------------------------. ,--------------------------------------------------.
|
|
||||||
* | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - |
|
|
||||||
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
|
|
||||||
* | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ |
|
|
||||||
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
|
||||||
* | BkSp | A | S | D | F | G |------| |------| H | J | K | L |; / L2|' / Cmd |
|
|
||||||
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
|
|
||||||
* | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift |
|
|
||||||
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|
|
||||||
* |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 |
|
|
||||||
* `----------------------------------' `----------------------------------'
|
|
||||||
* ,-------------. ,-------------.
|
|
||||||
* | App | LGui | | Alt |Ctrl/Esc|
|
|
||||||
* ,------|------|------| |------+--------+------.
|
|
||||||
* | | | Home | | PgUp | | |
|
|
||||||
* | Space|Backsp|------| |------| Tab |Enter |
|
|
||||||
* | |ace | End | | PgDn | | |
|
|
||||||
* `--------------------' `----------------------'
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* LED layout template
|
|
||||||
#define LAYER_COLEMAK_LEDS LEDS_ergodox(\
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
\
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
|
||||||
)
|
|
||||||
*/
|
|
||||||
|
|
||||||
// LED colors, in HSV.
|
|
||||||
#define LC_OFF LC_HSV( 0, 0, 0)
|
|
||||||
#define LC_GREEN LC_HSV( 85, 203, 158)
|
|
||||||
#define LC_YELLOW LC_HSV( 32, 176, 255)
|
|
||||||
#define LC_PINK LC_HSV(243, 222, 234)
|
|
||||||
#define LC_CYAN LC_HSV(134, 255, 213)
|
|
||||||
#define LC_ORANGE LC_HSV( 14, 255, 255)
|
|
||||||
|
|
||||||
#define LC_RU_B LC_HSV( 0, 0, 165)
|
|
||||||
#define LC_RU_G LC_HSV(153, 255, 153)
|
|
||||||
#define LC_RU_K LC_HSV( 0, 255, 145)
|
|
||||||
|
|
||||||
|
|
||||||
extern int current_lang;
|
|
||||||
extern bool g_suspend_state;
|
|
||||||
extern rgb_config_t rgb_matrix_config;
|
|
||||||
|
|
||||||
void set_lang(int lang);
|
|
||||||
void set_lang_long(int lang, bool force);
|
|
@ -1,11 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "layers/main.h"
|
|
||||||
#include "layers/colemak.h"
|
|
||||||
#include "layers/numpad.h"
|
|
||||||
#include "layers/symbols.h"
|
|
||||||
#include "layers/arrows.h"
|
|
||||||
#include "layers/fkeys.h"
|
|
||||||
#include "layers/desktop.h"
|
|
||||||
#include "layers/keyboard.h"
|
|
||||||
#include "layers/russian.h"
|
|
@ -1,39 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "keymap.h"
|
|
||||||
|
|
||||||
#define LAYER_ARROWS LAYOUT_ergodox(\
|
|
||||||
KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
|
||||||
KC_TRANSPARENT, KC_LEFT, KC_RIGHT, KC_UP, KC_NO, KC_NO, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, LALT(KC_LCTRL), KC_LEFT, KC_DOWN, KC_RIGHT, KC_NO,\
|
|
||||||
KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
|
||||||
KC_TRANSPARENT, KC_NO, KC_PGUP, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,\
|
|
||||||
KC_NO, KC_PGDOWN, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT\
|
|
||||||
)
|
|
||||||
|
|
||||||
#define LAYER_ARROWS_LEDS LEDS_ergodox(\
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_YELLOW, LC_YELLOW, LC_GREEN, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_GREEN, LC_GREEN, LC_GREEN, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_PINK, \
|
|
||||||
\
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_GREEN, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_GREEN, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
|
||||||
)
|
|
@ -1,39 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "keymap.h"
|
|
||||||
|
|
||||||
#define LAYER_COLEMAK LAYOUT_ergodox(\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_A, KC_R, KC_S, KC_T, KC_G,\
|
|
||||||
KC_TRANSPARENT, KC_Z, KC_X, KC_C, KC_D, KC_V, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_J, KC_L, KC_U, KC_O, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_M, KC_N, KC_E, KC_TRANSPARENT, KC_I, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_K, KC_H, KC_O, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT\
|
|
||||||
)
|
|
||||||
|
|
||||||
#define LAYER_COLEMAK_LEDS LEDS_ergodox(\
|
|
||||||
LC_PINK, LC_PINK, LC_PINK, LC_PINK, LC_PINK, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
\
|
|
||||||
LC_PINK, LC_PINK, LC_PINK, LC_PINK, LC_PINK, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
|
||||||
)
|
|
@ -1,39 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "keymap.h"
|
|
||||||
|
|
||||||
#define LAYER_DESKTOP LAYOUT_ergodox(\
|
|
||||||
KC_TRANSPARENT, LCTL(LGUI(LSFT(KC_1))), LCTL(LGUI(LSFT(KC_2))),LCTL(LGUI(LSFT(KC_3))), LCTL(LGUI(LSFT(KC_4))), KC_NO, M_RESETWM,\
|
|
||||||
KC_NO, KC_NO, KC_NO, KC_NO, LCTL(LGUI(KC_SPACE)), LGUI(KC_T), KC_NO,\
|
|
||||||
KC_NO, KC_NO, KC_NO, KC_NO, LGUI(KC_F), LGUI(KC_M),\
|
|
||||||
KC_NO, KC_NO, KC_NO, LGUI(LSFT(KC_C)), LGUI(KC_N), KC_NO, KC_NO,\
|
|
||||||
TO(LAYER_MAIN_IDX), KC_NO, KC_NO, KC_NO, KC_NO,\
|
|
||||||
\
|
|
||||||
KC_NO, KC_NO,\
|
|
||||||
KC_NO,\
|
|
||||||
LGUI(KC_ENTER), LGUI(KC_BSLASH), KC_NO,\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
M_SHUTDOWN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
|
||||||
KC_NO, KC_NO, KC_NO, LCTL(LGUI(KC_UP)), KC_NO, LGUI(KC_P), KC_NO,\
|
|
||||||
KC_NO, LCTL(LGUI(KC_LEFT)), LCTL(LGUI(KC_DOWN)), LCTL(LGUI(KC_RIGHT)), KC_NO, KC_NO,\
|
|
||||||
KC_NO, KC_NO, LGUI(KC_H), LGUI(KC_J), KC_NO, KC_NO, KC_NO,\
|
|
||||||
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
|
||||||
\
|
|
||||||
KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK,\
|
|
||||||
KC_AUDIO_VOL_UP,\
|
|
||||||
KC_AUDIO_VOL_DOWN, KC_MEDIA_STOP, KC_MEDIA_PLAY_PAUSE\
|
|
||||||
)
|
|
||||||
|
|
||||||
#define LAYER_DESKTOP_LEDS LEDS_ergodox(\
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_CYAN, LC_CYAN, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_CYAN, LC_CYAN, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_CYAN, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
\
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_GREEN, LC_OFF, LC_ORANGE, \
|
|
||||||
LC_OFF, LC_GREEN, LC_GREEN, LC_GREEN, LC_OFF, \
|
|
||||||
LC_OFF, LC_CYAN, LC_CYAN, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
|
||||||
)
|
|
@ -1,39 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "keymap.h"
|
|
||||||
|
|
||||||
#define LAYER_FKEYS LAYOUT_ergodox(\
|
|
||||||
KC_TRANSPARENT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
KC_TRANSPARENT, KC_F6, KC_F7, KC_F9, KC_F9, KC_F10, KC_TRANSPARENT, \
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, \
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, \
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, \
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, \
|
|
||||||
\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, \
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define LAYER_FKEYS_LEDS LEDS_ergodox(\
|
|
||||||
LC_CYAN, LC_CYAN, LC_CYAN, LC_CYAN, LC_CYAN, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
\
|
|
||||||
LC_CYAN, LC_CYAN, LC_CYAN, LC_CYAN, LC_CYAN, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
|
||||||
)
|
|
@ -1,25 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "keymap.h"
|
|
||||||
|
|
||||||
#define LAYER_KEYBOARD LAYOUT_ergodox(\
|
|
||||||
RGB_TOG, RGB_HUD, RGB_HUI, KC_NO, KC_NO, KC_NO, KC_NO,\
|
|
||||||
TOGGLE_LAYER_COLOR, RGB_SAD, RGB_SAI, KC_NO, KC_NO, KC_NO, RGB_HUI,\
|
|
||||||
KC_NO, RGB_VAD, RGB_VAI, KC_NO, KC_NO, KC_NO,\
|
|
||||||
KC_NO, RGB_SPD, RGB_SPI, KC_NO, KC_NO, KC_NO, RGB_HUD,\
|
|
||||||
KC_NO, KC_NO, KC_NO, KC_NO, RGB_MOD,\
|
|
||||||
\
|
|
||||||
KC_NO, KC_NO,\
|
|
||||||
KC_NO,\
|
|
||||||
KC_NO, KC_NO, KC_NO,\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
KC_NO, LIGHT_HUD, LIGHT_HUI, KC_NO, KC_NO, KC_NO, LIGHT_TOG,\
|
|
||||||
KC_NO, LIGHT_SAD, LIGHT_SAI, KC_NO, KC_NO, KC_NO, KC_NO,\
|
|
||||||
LIGHT_VAD, LIGHT_VAI, KC_NO, KC_NO, KC_NO, KC_NO,\
|
|
||||||
KC_NO, LIGHT_SPD, LIGHT_SPI, KC_NO, KC_NO, KC_NO, KC_NO,\
|
|
||||||
LIGHT_MOD, KC_NO, KC_NO, TO(LAYER_MAIN_IDX), KC_NO,\
|
|
||||||
\
|
|
||||||
KC_NO, RGB_TOG,\
|
|
||||||
KC_NO,\
|
|
||||||
RESET, KC_NO, KC_NO\
|
|
||||||
)
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user