Compare commits
83 Commits
01e1e510a0
...
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
|
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
|
10
.gitignore
vendored
10
.gitignore
vendored
@ -1,3 +1,7 @@
|
|||||||
/venv
|
# The docker container places firmware
|
||||||
/build
|
# in this directory
|
||||||
qmk/qmk.conf
|
output
|
||||||
|
|
||||||
|
# Secret information that shouldn't be
|
||||||
|
# added to git.
|
||||||
|
secrets.h
|
12
.gitmodules
vendored
12
.gitmodules
vendored
@ -1,6 +1,6 @@
|
|||||||
[submodule "qmk/qmk_fw"]
|
[submodule "docker/qmk_cli"]
|
||||||
path = qmk/qmk_fw
|
path = docker/qmk_cli
|
||||||
url = ssh://git@git.betalupi.com:33/mirrors-QMK/qmk_firmware.git
|
url = ssh://git@git.betalupi.com:33/QMK/qmk_cli.git
|
||||||
[submodule "qmk/qmk_cli"]
|
[submodule "docker/qmk_firmware"]
|
||||||
path = qmk/qmk_cli
|
path = docker/qmk_firmware
|
||||||
url = ssh://git@git.betalupi.com:33/mirrors-QMK/qmk_cli.git
|
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",
|
||||||
|
}
|
91
Makefile
Normal file → Executable file
91
Makefile
Normal file → Executable file
@ -1,75 +1,28 @@
|
|||||||
QMK_REPO := ssh://git@git.betalupi.com:33/Mark/qmk_betalupi.git
|
all: voyager ergodox
|
||||||
|
|
||||||
# QMK command
|
voyager:
|
||||||
QMK_CONF := $(shell pwd)/qmk/qmk.conf
|
@mkdir -p "$$(pwd)/output"
|
||||||
QMK := qmk --config-file $(QMK_CONF)
|
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
|
||||||
|
|
||||||
# Where to create venv
|
ergodox:
|
||||||
VENV := $(shell pwd)/venv
|
@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
|
||||||
|
|
||||||
# Where to build firmware
|
ergodox_upload:
|
||||||
BUILD_DIR := $(shell pwd)/build
|
wally-cli output/betalupi_ergodox_default.hex
|
||||||
|
|
||||||
# Path to submodules
|
docker:
|
||||||
QMK_CLI := $(shell pwd)/qmk/qmk_cli
|
docker build docker -t git.betalupi.com/mark/qmk
|
||||||
QMK_DIR := $(shell pwd)/qmk/qmk_fw
|
|
||||||
|
|
||||||
|
|
||||||
.PHONY: git-submodule
|
.PHONY: voyager ergodox ergodox_upload docker all
|
||||||
git-submodule:
|
|
||||||
@git submodule sync --recursive
|
|
||||||
@git submodule update --init --recursive --progress
|
|
||||||
@echo ""
|
|
||||||
|
|
||||||
|
|
||||||
# Link keyboards into qmk_fw
|
|
||||||
KEYBOARDS := $(notdir $(shell find keyboards -maxdepth 1 -mindepth 1 -type d))
|
|
||||||
.PHONY: $(KEYBOARDS)
|
|
||||||
$(KEYBOARDS):
|
|
||||||
@echo "Linking keyboards into $(QMK_DIR)/keyboards..."
|
|
||||||
@ln -s \
|
|
||||||
$(shell pwd)/keyboards/$@ \
|
|
||||||
$(QMK_DIR)/keyboards/$@
|
|
||||||
|
|
||||||
@echo ""
|
|
||||||
|
|
||||||
# Clone all repos and configure qmk
|
|
||||||
.PHONY: setup
|
|
||||||
setup: git-submodule $(KEYBOARDS)
|
|
||||||
@echo "Preparing venv..."
|
|
||||||
@python -m venv $(VENV) --prompt=qmk_venv
|
|
||||||
|
|
||||||
@echo "Building and installing qmk_cli"
|
|
||||||
@source $(VENV)/bin/activate && \
|
|
||||||
cd $(QMK_CLI) && \
|
|
||||||
python3 -m pip install build --quiet && \
|
|
||||||
python3 -m build > /dev/null && \
|
|
||||||
python3 -m pip install $$(find dist -name 'qmk-*.tar.gz') --quiet
|
|
||||||
|
|
||||||
@echo ""
|
|
||||||
@echo ""
|
|
||||||
|
|
||||||
@source $(VENV)/bin/activate && \
|
|
||||||
$(QMK) config user.qmk_home=$(QMK_DIR) && \
|
|
||||||
$(QMK) doctor
|
|
||||||
|
|
||||||
|
|
||||||
# Undo all changes done in setup
|
|
||||||
.PHONY: unsetup
|
|
||||||
unsetup:
|
|
||||||
-rm -drf $(VENV) $(BUILD_DIR)
|
|
||||||
-rm $(QMK_CONF)
|
|
||||||
-rm -dr $(QMK_CLI)/dist $(QMK_CLI)/qmk.egg-info
|
|
||||||
-rm $(KEYBOARDS:%=$(QMK_DIR)/keyboards/%)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Compile and flash a keyboard
|
|
||||||
.PHONY: flash
|
|
||||||
flash:
|
|
||||||
@source $(VENV)/bin/activate && \
|
|
||||||
$(QMK) flash \
|
|
||||||
-e AVR_CFLAGS="-Wno-array-bounds" \
|
|
||||||
-e BUILD_DIR=$(BUILD_DIR) \
|
|
||||||
-kb betalupi_ergodox \
|
|
||||||
-km default
|
|
32
README.md
32
README.md
@ -1,31 +1,15 @@
|
|||||||
# Betalupi QMK environment
|
# Betalupi QMK environment
|
||||||
|
|
||||||
This repository contains everything required to build qmk firmware.
|
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.
|
||||||
|
|
||||||
|
|
||||||
### TODO
|
## Usage
|
||||||
[ ] Better build/flash command
|
|
||||||
[ ] Warning when directory is moved
|
|
||||||
|
|
||||||
|
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`
|
||||||
## Setup
|
3. `make upload`
|
||||||
|
|
||||||
To initialize the build environment, run `make setup`. This does a few things:
|
|
||||||
|
|
||||||
- Updates all submodules
|
|
||||||
- Symlinks all directories in `keyboards` into `qmk/qmk_fm/keyboards`
|
|
||||||
- Creates a python virtualenv in `venv`
|
|
||||||
- Builds and installs `qmk/qmk_cli` into that venv
|
|
||||||
- Creates a QMK config file in `qmk/qmk.conf`
|
|
||||||
- Runs `qmk doctor` to make sure everything worked.
|
|
||||||
|
|
||||||
ONCE `make setup` has been run, this directory (or its parents) CANNOT BE RENAMED OR MOVED! \\
|
|
||||||
If you want to move this directory, run `make unsetup`, then run `make setup` again. No data should be lost.
|
|
||||||
|
|
||||||
|
|
||||||
## Using QMK
|
|
||||||
|
|
||||||
Run `make flash` to build and flash firmware. If you want to execute qmk manually, activate the virtualenv and use `./qmk.sh`.
|
|
||||||
|
|
||||||
|
Read [`Makefile`](./Makefile) for details.
|
||||||
|
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
@ -1,110 +1,59 @@
|
|||||||
#ifdef RGB_MATRIX_DATAPOINTER_ENABLED
|
#ifndef RGB_MATRIX_FRAMEBUFFER_EFFECTS
|
||||||
#ifndef DISABLE_RGB_MATRIX_FFT_ANIM
|
#undef ENABLE_RGB_MATRIX_FFT_ANIM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_RGB_MATRIX_FFT_ANIM
|
||||||
RGB_MATRIX_EFFECT(FFT_ANIM)
|
RGB_MATRIX_EFFECT(FFT_ANIM)
|
||||||
|
|
||||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||||
|
|
||||||
// Maps fft columns to leds.
|
#include "extra_mappings.h"
|
||||||
// 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:
|
// TODO:
|
||||||
// Dynamic color settings
|
// Dynamic color settings
|
||||||
bool FFT_ANIM(effect_params_t* params) {
|
bool FFT_ANIM(effect_params_t* params) {
|
||||||
RGB_MATRIX_USE_LIMITS(led_min, led_max);
|
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);
|
||||||
|
|
||||||
// REQUIRED for any animation that uses this pointer.
|
|
||||||
// Clears any previous data.
|
|
||||||
if (params->init) {
|
if (params->init) {
|
||||||
rgb_matrix_anim_data = NULL;
|
rgb_matrix_set_color_all(0, 0, 0);
|
||||||
return led_max < DRIVER_LED_TOTAL;
|
memset(g_rgb_frame_buffer, 0, sizeof g_rgb_frame_buffer);
|
||||||
};
|
|
||||||
|
|
||||||
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
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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 {
|
} else {
|
||||||
|
// Row and col of key above this one
|
||||||
// Data should be a pointer to 10 uint8_ts, each representing
|
if (
|
||||||
// the height of a bar on the display.
|
g_rgb_frame_buffer[
|
||||||
uint8_t* data = (uint8_t*) rgb_matrix_anim_data;
|
fft_col_to_array[bin][height + 1] % MATRIX_ROWS
|
||||||
|
][
|
||||||
for (uint8_t bin = 0; bin < 10; bin++) {
|
fft_col_to_array[bin][height + 1] / MATRIX_ROWS
|
||||||
// Scale data values
|
] == 0
|
||||||
uint8_t d = data[bin];
|
) {
|
||||||
uint8_t bin_height = d / 50;
|
is_topmost = true;
|
||||||
// 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(
|
if (is_topmost) {
|
||||||
fft_col_to_array[bin][i],
|
rgb_matrix_set_color(i, val, 0x00, val);
|
||||||
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 {
|
} else {
|
||||||
rgb_matrix_set_color(
|
rgb_matrix_set_color(i, 0x00, 0x00, val);
|
||||||
fft_col_to_array[bin][i],
|
|
||||||
0x00, 0x00, 0xFF
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return led_max < DRIVER_LED_TOTAL;
|
return led_max < sizeof(g_rgb_frame_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
@ -1,25 +1,5 @@
|
|||||||
/*
|
|
||||||
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 "betalupi_ergodox.h"
|
||||||
#include "rawhid.h"
|
#include "features/beta_rawhid.h"
|
||||||
|
|
||||||
extern inline void ergodox_board_led_on(void);
|
extern inline void ergodox_board_led_on(void);
|
||||||
extern inline void ergodox_right_led_1_on(void);
|
extern inline void ergodox_right_led_1_on(void);
|
||||||
@ -66,16 +46,16 @@ void matrix_init_kb(void) {
|
|||||||
PORTE |= (1<<6);
|
PORTE |= (1<<6);
|
||||||
|
|
||||||
keyboard_config.raw = eeconfig_read_kb();
|
keyboard_config.raw = eeconfig_read_kb();
|
||||||
#ifdef RGB_MATRIX_ENABLE
|
|
||||||
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
if (keyboard_config.rgb_matrix_enable) {
|
if (keyboard_config.rgb_matrix_enable) {
|
||||||
rgb_matrix_set_flags(LED_FLAG_ALL);
|
rgb_matrix_set_flags(LED_FLAG_ALL);
|
||||||
} else {
|
} else {
|
||||||
rgb_matrix_set_flags(LED_FLAG_NONE);
|
rgb_matrix_set_flags(LED_FLAG_NONE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ergodox_blink_all_leds();
|
ergodox_blink_all_leds();
|
||||||
|
|
||||||
matrix_init_user();
|
matrix_init_user();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,139 +124,6 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#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) {
|
void keyboard_post_init_kb(void) {
|
||||||
|
|
||||||
// Start with matrix enabled
|
// Start with matrix enabled
|
||||||
@ -295,188 +142,6 @@ void keyboard_post_init_kb(void) {
|
|||||||
keyboard_post_init_user();
|
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!
|
// EEPROM is getting reset!
|
||||||
void eeconfig_init_kb(void) {
|
void eeconfig_init_kb(void) {
|
||||||
keyboard_config.raw = 0;
|
keyboard_config.raw = 0;
|
||||||
@ -487,40 +152,19 @@ void eeconfig_init_kb(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
layer_state_t layer_state_set_kb(layer_state_t state) {
|
||||||
|
//uint8_t layer = biton32(state);
|
||||||
|
|
||||||
#ifdef DYNAMIC_MACRO_ENABLE
|
hid_send_state(
|
||||||
static bool is_dynamic_recording = false;
|
.state = state
|
||||||
static uint16_t dynamic_loop_timer;
|
);
|
||||||
|
return layer_state_set_user(state);
|
||||||
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) {
|
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
|
#ifdef CAPS_LOCK_STATUS
|
||||||
led_t led_state = host_keyboard_led_state();
|
led_t led_state = host_keyboard_led_state();
|
||||||
if(led_state.caps_lock) {
|
if(led_state.caps_lock) {
|
||||||
ergodox_right_led_3_on();
|
ergodox_right_led_3_on();
|
||||||
@ -531,7 +175,7 @@ void matrix_scan_kb(void) {
|
|||||||
ergodox_right_led_3_off();
|
ergodox_right_led_3_off();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
matrix_scan_user();
|
matrix_scan_user();
|
||||||
}
|
}
|
@ -1,29 +1,10 @@
|
|||||||
/*
|
|
||||||
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
|
#pragma once
|
||||||
|
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "i2c_master.h"
|
#include "i2c_master.h"
|
||||||
|
#include "hardware/macros.h"
|
||||||
|
|
||||||
// I2C aliases and register addresses (see "mcp23018.md")
|
// I2C aliases and register addresses (see "mcp23018.md")
|
||||||
#define I2C_ADDR 0b0100000
|
#define I2C_ADDR 0b0100000
|
||||||
@ -95,7 +76,7 @@ inline void ergodox_led_all_set(uint8_t n) {
|
|||||||
ergodox_right_led_3_set(n);
|
ergodox_right_led_3_set(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ergodox_ez_keycodes {
|
enum betalupi_keycodes {
|
||||||
LED_LEVEL = SAFE_RANGE,
|
LED_LEVEL = SAFE_RANGE,
|
||||||
TOGGLE_LAYER_COLOR,
|
TOGGLE_LAYER_COLOR,
|
||||||
// Custom RGBLIGHT macros
|
// Custom RGBLIGHT macros
|
||||||
@ -122,186 +103,3 @@ typedef union {
|
|||||||
} keyboard_config_t;
|
} keyboard_config_t;
|
||||||
|
|
||||||
extern keyboard_config_t keyboard_config;
|
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 } \
|
|
||||||
}
|
|
||||||
|
@ -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,20 +112,11 @@
|
|||||||
// 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
|
||||||
|
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>
|
@ -2,102 +2,401 @@
|
|||||||
"keyboard_name": "Betalupi ErgoDox",
|
"keyboard_name": "Betalupi ErgoDox",
|
||||||
"url": "betalupi.com",
|
"url": "betalupi.com",
|
||||||
"maintainer": "mark@betalupi",
|
"maintainer": "mark@betalupi",
|
||||||
|
"manufacturer": "Betalupi",
|
||||||
|
|
||||||
|
"usb": {
|
||||||
|
// ZSA Labs
|
||||||
|
"vid": "0x3297",
|
||||||
|
// Ergodox glow variant
|
||||||
|
"pid": "0x4976",
|
||||||
|
"device_version": "1.0.0"
|
||||||
|
},
|
||||||
|
|
||||||
"width": 17,
|
"width": 17,
|
||||||
"height": 8,
|
"height": 8,
|
||||||
|
|
||||||
"layouts": {
|
"layouts": {
|
||||||
"LAYOUT_ergodox": {
|
"LAYOUT_ergodox": {
|
||||||
"layout": [
|
"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},
|
{"matrix": [0, 0], "x": 0, "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},
|
{"matrix": [1, 0], "x": 1.5, "y": 0.375},
|
||||||
{"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},
|
{"matrix": [2, 0], "x": 2.5, "y": 0.125},
|
||||||
{"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},
|
{"matrix": [3, 0], "x": 3.5, "y": 0},
|
||||||
{"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},
|
{"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},
|
||||||
|
|
||||||
{"x":6, "y":5}, {"x":7, "y":5},
|
{"matrix": [0, 1], "x": 0, "y": 1.375, "w": 1.5},
|
||||||
{"x":7, "y":6},
|
{"matrix": [1, 1], "x": 1.5, "y": 1.375},
|
||||||
{"x":5, "y":6, "h":2}, {"x":6, "y":6, "h":2}, {"x":7, "y":7},
|
{"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},
|
||||||
|
|
||||||
{"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},
|
{"matrix": [0, 3], "x": 0, "y": 3.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},
|
{"matrix": [1, 3], "x": 1.5, "y": 3.375},
|
||||||
{"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},
|
{"matrix": [2, 3], "x": 2.5, "y": 3.125},
|
||||||
{"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},
|
{"matrix": [3, 3], "x": 3.5, "y": 3},
|
||||||
{"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},
|
{"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},
|
||||||
|
|
||||||
{"x":9, "y":5}, {"x":10, "y":5},
|
{"matrix": [5, 5], "x": 6, "y": 5},
|
||||||
{"x":9, "y":6},
|
{"matrix": [6, 5], "x": 7, "y": 5},
|
||||||
{"x":9, "y":7}, {"x":10, "y":6, "h":2}, {"x":11, "y":6, "h":2}
|
{"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_ergodox_pretty": {
|
||||||
"layout": [
|
"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},
|
{"matrix": [0, 0], "x": 0, "y": 0.375, "w": 1.5},
|
||||||
{"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},
|
{"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},
|
||||||
|
|
||||||
{"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},
|
{"matrix": [7, 0], "x": 9.5, "y": 0.25},
|
||||||
{"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},
|
{"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},
|
||||||
|
|
||||||
{"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},
|
{"matrix": [0, 1], "x": 0, "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},
|
{"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},
|
||||||
|
|
||||||
{"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},
|
{"matrix": [7, 1], "x": 9.5, "y": 1.25, "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},
|
{"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},
|
||||||
|
|
||||||
{"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},
|
{"matrix": [0, 2], "x": 0, "y": 2.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},
|
{"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},
|
||||||
|
|
||||||
{"x":6, "y":5}, {"x":7, "y":5}, {"x":9, "y":5}, {"x":10, "y":5},
|
{"matrix": [8, 2], "x": 10.5, "y": 2.25},
|
||||||
{"x":7, "y":6}, {"x":9, "y":6},
|
{"matrix": [9, 2], "x": 11.5, "y": 2.125},
|
||||||
{"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}
|
{"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_ergodox_80": {
|
||||||
"layout": [
|
"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},
|
{"matrix": [0, 0], "x": 0, "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},
|
{"matrix": [1, 0], "x": 1.5, "y": 0.375},
|
||||||
{"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},
|
{"matrix": [2, 0], "x": 2.5, "y": 0.125},
|
||||||
{"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},
|
{"matrix": [3, 0], "x": 3.5, "y": 0},
|
||||||
{"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},
|
{"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},
|
||||||
|
|
||||||
{"x":6, "y":5}, {"x":7, "y":5},
|
{"matrix": [0, 1], "x": 0, "y": 1.375, "w": 1.5},
|
||||||
{"x":5, "y":6}, {"x":6, "y":6}, {"x":7, "y":6},
|
{"matrix": [1, 1], "x": 1.5, "y": 1.375},
|
||||||
{"x":5, "y":7}, {"x":6, "y":7}, {"x":7, "y":7},
|
{"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},
|
||||||
|
|
||||||
{"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},
|
{"matrix": [0, 3], "x": 0, "y": 3.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},
|
{"matrix": [1, 3], "x": 1.5, "y": 3.375},
|
||||||
{"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},
|
{"matrix": [2, 3], "x": 2.5, "y": 3.125},
|
||||||
{"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},
|
{"matrix": [3, 3], "x": 3.5, "y": 3},
|
||||||
{"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},
|
{"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},
|
||||||
|
|
||||||
{"x":9, "y":5}, {"x":10, "y":5},
|
{"matrix": [5, 5], "x": 6, "y": 5},
|
||||||
{"x":9, "y":6}, {"x":10, "y":6}, {"x":11, "y":6},
|
{"matrix": [6, 5], "x": 7, "y": 5},
|
||||||
{"x":9, "y":7}, {"x":10, "y":7}, {"x":11, "y":7}
|
|
||||||
|
{"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_ergodox_pretty_80": {
|
||||||
"layout": [
|
"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},
|
{"matrix": [0, 0], "x": 0, "y": 0.375, "w": 1.5},
|
||||||
{"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},
|
{"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},
|
||||||
|
|
||||||
{"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},
|
{"matrix": [7, 0], "x": 9.5, "y": 0.25},
|
||||||
{"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},
|
{"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},
|
||||||
|
|
||||||
{"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},
|
{"matrix": [0, 1], "x": 0, "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},
|
{"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},
|
||||||
|
|
||||||
{"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},
|
{"matrix": [7, 1], "x": 9.5, "y": 1.25, "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},
|
{"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},
|
||||||
|
|
||||||
{"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},
|
{"matrix": [0, 2], "x": 0, "y": 2.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},
|
{"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},
|
||||||
|
|
||||||
{"x":6, "y":5}, {"x":7, "y":5}, {"x":9, "y":5}, {"x":10, "y":5},
|
{"matrix": [8, 2], "x": 10.5, "y": 2.25},
|
||||||
{"x":5, "y":6}, {"x":6, "y":6}, {"x":7, "y":6}, {"x":9, "y":6}, {"x":10, "y":6}, {"x":11, "y":6},
|
{"matrix": [9, 2], "x": 11.5, "y": 2.125},
|
||||||
{"x":5, "y":7}, {"x":6, "y":7}, {"x":7, "y":7}, {"x":9, "y":7}, {"x":10, "y":7}, {"x":11, "y":7}
|
{"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}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,18 @@
|
|||||||
|
#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
|
// RGBLight effects
|
||||||
// Static color is always enabled.
|
// Static color is always enabled.
|
||||||
//#define RGBLIGHT_EFFECT_ALTERNATING
|
//#define RGBLIGHT_EFFECT_ALTERNATING
|
||||||
@ -11,63 +26,7 @@
|
|||||||
//#define RGBLIGHT_EFFECT_STATIC_GRADIENT
|
//#define RGBLIGHT_EFFECT_STATIC_GRADIENT
|
||||||
//#define RGBLIGHT_EFFECT_TWINKLE
|
//#define RGBLIGHT_EFFECT_TWINKLE
|
||||||
|
|
||||||
|
|
||||||
// Custom effects
|
// Custom effects
|
||||||
#define RGB_MATRIX_DATAPOINTER_ENABLED
|
// #define RGB_MATRIX_FRAMEBUFFER_EFFECTS
|
||||||
|
// #define ENABLE_RGB_MATRIX_FFT_ANIM // Requires framebuffer
|
||||||
|
|
||||||
|
|
||||||
// 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 +1,182 @@
|
|||||||
#include "keymap.h"
|
#include QMK_KEYBOARD_H
|
||||||
|
#include "version.h"
|
||||||
|
#include "keymap_russian.h"
|
||||||
|
#include "keymap_us_international.h"
|
||||||
|
|
||||||
|
|
||||||
// Define custom keys
|
// Values that should not be saved to git.
|
||||||
// (Must be done BEFORE keymaps)
|
// 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 {
|
enum custom_keycodes {
|
||||||
M_SHUTDOWN = BETA_SAFE_RANGE,
|
M_SHUTDOWN = BETA_SAFE_RANGE,
|
||||||
|
|
||||||
|
// Macros
|
||||||
M_RESETWM,
|
M_RESETWM,
|
||||||
RU_LAYER,
|
|
||||||
EN_LAYER,
|
|
||||||
M_RU_CTRL,
|
M_RU_CTRL,
|
||||||
M_RU_ALT
|
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 {
|
enum tap_dance_codes {
|
||||||
TD_WMLAYOUT,
|
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)
|
||||||
|
|
||||||
// Assemble key and LED maps
|
#define LC_RU_B LC_HSV( 0, 0, 165)
|
||||||
enum layer_indices {
|
#define LC_RU_G LC_HSV(153, 255, 153)
|
||||||
LAYER_MAIN_IDX = 0,
|
#define LC_RU_K LC_HSV( 0, 255, 145)
|
||||||
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) {}
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ENABLE_HID_SPELLCHECK
|
||||||
|
#include "features/hid_spellcheck.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
void set_layer_color(int layer) {
|
#ifdef ENABLE_AUTOCORRECT
|
||||||
for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
|
#include "features/autocorrect/autocorrect.h"
|
||||||
HSV hsv = {
|
#endif
|
||||||
.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) {
|
#ifdef ENABLE_BETA_LEADER
|
||||||
if (keyboard_config.disable_layer_led) {
|
#include "features/leader/beta_leader.h"
|
||||||
return;
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
switch (biton32(layer_state)) {
|
#include "features/beta_rawhid.h"
|
||||||
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); }
|
// Send a special character.
|
||||||
void set_lang_long(int lang, bool force) {
|
// Returns false if character was caught, true otherwise.
|
||||||
if (current_lang != lang || force) {
|
bool send_special_character(uint16_t keycode) {
|
||||||
switch (lang) {
|
if ( (keycode > M_SPECIAL_TOP) && (keycode < M_SPECIAL_BOTTOM) ) {
|
||||||
case LANG_EN:
|
hid_send_special_char(keycode - M_SPECIAL_TOP - 1);
|
||||||
SEND_STRING(SS_LGUI(SS_LSFT(SS_LCTL(SS_TAP(X_0)))));
|
return false;
|
||||||
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint32_t layer_state_set_user(uint32_t state) {
|
void matrix_scan_user(void) {
|
||||||
|
#ifdef ENABLE_BETA_LEADER
|
||||||
|
beta_qk_leader_check();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t layer = biton32(state);
|
|
||||||
|
|
||||||
ergodox_board_led_off();
|
const uint16_t PROGMEM test_combo2[] = {KC_D, KC_F, COMBO_END};
|
||||||
ergodox_right_led_1_off();
|
combo_t key_combos[] = {
|
||||||
ergodox_right_led_2_off();
|
COMBO(test_combo2, KC_TAB),
|
||||||
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:
|
// Include all other parts of configuration
|
||||||
set_lang(LANG_EN);
|
#include "layers/layers.c"
|
||||||
ergodox_right_led_2_on();
|
#include "parts/leader.c"
|
||||||
break;
|
#include "parts/tapdance.c"
|
||||||
|
|
||||||
case LAYER_NUMPAD_IDX:
|
// Process macros.
|
||||||
set_lang(LANG_EN);
|
// Return FALSE to halt key processing,
|
||||||
ergodox_right_led_1_on();
|
// Return TRUE to allow QMK to handle keypress.
|
||||||
break;
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
|
||||||
case LAYER_SYMBOLS_IDX:
|
#ifdef ENABLE_BETA_LEADER
|
||||||
set_lang(LANG_EN);
|
if (!beta_process_leader(keycode, record)) { return false; }
|
||||||
break;
|
#endif
|
||||||
|
|
||||||
case LAYER_ARROWS_IDX:
|
#ifdef ENABLE_HID_SPELLCHECK
|
||||||
set_lang(LANG_EN);
|
if (!process_spellcheck(keycode, record)) { return false; }
|
||||||
break;
|
#endif
|
||||||
|
|
||||||
case LAYER_FKEYS_IDX:
|
#ifdef ENABLE_AUTOCORRECT
|
||||||
set_lang(LANG_EN);
|
if (!process_autocorrection(keycode, record)) { return false; }
|
||||||
break;
|
#endif
|
||||||
|
|
||||||
case LAYER_DESKTOP_IDX:
|
// Handle special chars
|
||||||
set_lang(LANG_EN);
|
if (record->event.pressed) {
|
||||||
break;
|
if (!send_special_character(keycode)) { return false; }
|
||||||
|
|
||||||
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;
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
qk_tap_dance_action_t tap_dance_actions[] = {
|
return true;
|
||||||
[TD_WMLAYOUT] = ACTION_TAP_DANCE_FN_ADVANCED(td_wmlayout_dance, td_wmlayout_finished, td_wmlayout_reset),
|
}
|
||||||
};
|
|
@ -1,84 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "betalupi_ergodox.h"
|
|
||||||
#include "version.h"
|
|
||||||
#include "keymap_russian.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 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 \
|
|
||||||
)
|
|
@ -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
|
@ -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\
|
|
||||||
)
|
|
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;
|
||||||
|
};
|
||||||
|
|
@ -1,25 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "keymap.h"
|
|
||||||
|
|
||||||
#define LAYER_MAIN LAYOUT_ergodox(\
|
|
||||||
KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, TG(LAYER_NUMPAD_IDX),\
|
|
||||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LGUI,\
|
|
||||||
KC_DELETE, KC_A, KC_S, KC_D, KC_F, KC_G,\
|
|
||||||
M_RU_CTRL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_TRANSPARENT,\
|
|
||||||
MO(LAYER_DESKTOP_IDX), MO(LAYER_FKEYS_IDX), KC_LALT, KC_LSHIFT, MO(LAYER_ARROWS_IDX),\
|
|
||||||
\
|
|
||||||
KC_PSCREEN, KC_NO,\
|
|
||||||
TD(TD_WMLAYOUT),\
|
|
||||||
KC_SPACE, KC_BSPACE, LCTL(KC_BSPACE),\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
LCTL(KC_LALT), KC_6, KC_7, KC_8, KC_9, KC_0, LGUI(KC_TAB),\
|
|
||||||
KC_TRANSPARENT, KC_Y, KC_U, KC_I, KC_O, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_H, KC_J, KC_K, MO(LAYER_SYMBOLS_IDX), KC_L, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_N, KC_M, KC_P, KC_DOT, KC_COMMA, KC_TRANSPARENT,\
|
|
||||||
KC_RIGHT, KC_TRANSPARENT, KC_TRANSPARENT, TO(LAYER_KEYBOARD_IDX), KC_TRANSPARENT,\
|
|
||||||
\
|
|
||||||
LGUI(KC_SPACE), TO(LAYER_RUSSIAN_IDX),\
|
|
||||||
TG(LAYER_COLEMAK_IDX),\
|
|
||||||
KC_DELETE, KC_RSHIFT, KC_ENTER\
|
|
||||||
)
|
|
@ -1,39 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "keymap.h"
|
|
||||||
|
|
||||||
#define LAYER_NUMPAD LAYOUT_ergodox(\
|
|
||||||
KC_TRANSPARENT, KC_CIRC, KC_NO, KC_HASH, KC_DLR, KC_PERC, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_NO, KC_7, KC_8, KC_9, KC_ASTR, KC_SLASH,\
|
|
||||||
KC_TRANSPARENT, KC_PLUS, KC_4, KC_5, KC_6, KC_0,\
|
|
||||||
KC_TRANSPARENT, KC_MINUS, KC_1, KC_2, KC_3, KC_DOT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, 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_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,\
|
|
||||||
KC_NO, KC_NO, 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_NUMPAD_LEDS LEDS_ergodox(\
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_GREEN, LC_GREEN, LC_GREEN, LC_YELLOW, \
|
|
||||||
LC_YELLOW, LC_GREEN, LC_GREEN, LC_GREEN, LC_GREEN, \
|
|
||||||
LC_YELLOW, LC_GREEN, LC_GREEN, LC_GREEN, LC_YELLOW, \
|
|
||||||
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 \
|
|
||||||
)
|
|
@ -1,39 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "keymap.h"
|
|
||||||
|
|
||||||
#define LAYER_RUSSIAN LAYOUT_ergodox(\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, 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, KC_LALT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, RU_NUM, RU_RUBL, KC_TRANSPARENT,\
|
|
||||||
RU_SOFT, RU_U, RU_YU, RU_I, RU_O, RU_SHCH, KC_TRANSPARENT,\
|
|
||||||
RU_HA, RU_ZHE, RU_KA, KC_TRANSPARENT, RU_EL, KC_TRANSPARENT,\
|
|
||||||
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_NO, TO(LAYER_MAIN_IDX),\
|
|
||||||
KC_NO,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT\
|
|
||||||
)
|
|
||||||
|
|
||||||
#define LAYER_RUSSIAN_LEDS 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 \
|
|
||||||
)
|
|
@ -1,39 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "keymap.h"
|
|
||||||
|
|
||||||
#define LAYER_SYMBOLS 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_LBRACKET, KC_RBRACKET, KC_EXLM, KC_RCBR, KC_NO,\
|
|
||||||
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
|
||||||
\
|
|
||||||
KC_NO, KC_NO,\
|
|
||||||
KC_NO,\
|
|
||||||
KC_TRANSPARENT, KC_TRANSPARENT, 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_BSLASH, KC_NO,\
|
|
||||||
KC_UNDS, KC_MINUS, KC_COLN, KC_TRANSPARENT, KC_PIPE, KC_NO,\
|
|
||||||
KC_NO, KC_EQUAL, KC_PLUS, KC_SCOLON, 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_TRANSPARENT\
|
|
||||||
)
|
|
||||||
|
|
||||||
#define LAYER_SYMBOLS_LEDS 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_ORANGE, LC_CYAN, \
|
|
||||||
LC_GREEN, LC_GREEN, LC_PINK, LC_OFF, LC_OFF, \
|
|
||||||
LC_OFF, LC_OFF, LC_OFF, LC_OFF \
|
|
||||||
)
|
|
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),
|
||||||
|
};
|
@ -1,7 +1,4 @@
|
|||||||
# rules.mk overrides
|
# rules.mk overrides
|
||||||
|
|
||||||
TAP_DANCE_ENABLE = yes
|
TAP_DANCE_ENABLE = yes
|
||||||
|
COMBO_ENABLE = yes
|
||||||
SRC += \
|
|
||||||
tapdance/wmlayout.c \
|
|
||||||
tapdance/tapdance.c
|
|
@ -1,18 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "keymap.h"
|
|
||||||
|
|
||||||
|
|
||||||
enum {
|
|
||||||
SINGLE_TAP = 1,
|
|
||||||
SINGLE_HOLD,
|
|
||||||
DOUBLE_TAP,
|
|
||||||
DOUBLE_HOLD,
|
|
||||||
DOUBLE_SINGLE_TAP,
|
|
||||||
MORE_TAPS
|
|
||||||
};
|
|
||||||
|
|
||||||
uint8_t dance_step(qk_tap_dance_state_t *state);
|
|
||||||
|
|
||||||
void td_wmlayout_dance(qk_tap_dance_state_t *state, void *user_data);
|
|
||||||
void td_wmlayout_finished(qk_tap_dance_state_t *state, void *user_data);
|
|
||||||
void td_wmlayout_reset(qk_tap_dance_state_t *state, void *user_data);
|
|
@ -1,21 +0,0 @@
|
|||||||
#include "keymap.h"
|
|
||||||
#include "tapdance.h"
|
|
||||||
|
|
||||||
uint8_t dance_step(qk_tap_dance_state_t *state) {
|
|
||||||
if (state->count == 1) {
|
|
||||||
if (state->interrupted || !state->pressed) {
|
|
||||||
return SINGLE_TAP;
|
|
||||||
} else {
|
|
||||||
return SINGLE_HOLD;
|
|
||||||
}
|
|
||||||
} else if (state->count == 2) {
|
|
||||||
if (state->interrupted) {
|
|
||||||
return DOUBLE_SINGLE_TAP;
|
|
||||||
} else if (state->pressed) {
|
|
||||||
return DOUBLE_HOLD;
|
|
||||||
} else {
|
|
||||||
return DOUBLE_TAP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return MORE_TAPS;
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
#include "keymap.h"
|
|
||||||
#include "tapdance.h"
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
bool is_press_action;
|
|
||||||
uint8_t step;
|
|
||||||
} tap;
|
|
||||||
|
|
||||||
static tap dance_state[1];
|
|
||||||
|
|
||||||
// Called on every tap
|
|
||||||
void td_wmlayout_dance(qk_tap_dance_state_t *state, void *user_data) {
|
|
||||||
if(state->count == 3) {
|
|
||||||
tap_code16(LGUI(KC_L));
|
|
||||||
tap_code16(LGUI(KC_L));
|
|
||||||
tap_code16(LGUI(KC_L));
|
|
||||||
}
|
|
||||||
if(state->count > 3) {
|
|
||||||
tap_code16(LGUI(KC_L));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called when action finishes
|
|
||||||
void td_wmlayout_finished(qk_tap_dance_state_t *state, void *user_data) {
|
|
||||||
dance_state[0].step = dance_step(state);
|
|
||||||
switch (dance_state[0].step) {
|
|
||||||
case SINGLE_TAP:
|
|
||||||
register_code16(LGUI(KC_L));
|
|
||||||
break;
|
|
||||||
case DOUBLE_TAP:
|
|
||||||
register_code16(LGUI(KC_K));
|
|
||||||
break;
|
|
||||||
case DOUBLE_SINGLE_TAP:
|
|
||||||
tap_code16(LGUI(KC_L));
|
|
||||||
register_code16(LGUI(KC_L));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called when action resets
|
|
||||||
void td_wmlayout_reset(qk_tap_dance_state_t *state, void *user_data) {
|
|
||||||
wait_ms(10);
|
|
||||||
switch (dance_state[0].step) {
|
|
||||||
case SINGLE_TAP:
|
|
||||||
unregister_code16(LGUI(KC_L));
|
|
||||||
break;
|
|
||||||
case DOUBLE_TAP:
|
|
||||||
unregister_code16(LGUI(KC_K));
|
|
||||||
break;
|
|
||||||
case DOUBLE_SINGLE_TAP:
|
|
||||||
unregister_code16(LGUI(KC_L));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
dance_state[0].step = 0;
|
|
||||||
}
|
|
@ -1,23 +1,3 @@
|
|||||||
/*
|
|
||||||
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
|
#pragma once
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
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);
|
||||||
|
}
|
@ -1,85 +0,0 @@
|
|||||||
#include "rawhid.h"
|
|
||||||
|
|
||||||
uint8_t hid_anim_data[32];
|
|
||||||
|
|
||||||
// See 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 RGB_MATRIX_DATAPOINTER_ENABLED
|
|
||||||
case CMD_ANIM_DATA:
|
|
||||||
cmd_animation(data, length);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void hid_send_state() {
|
|
||||||
uint8_t packet[RAW_EPSIZE] = {
|
|
||||||
CMD_SEND_STATE
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
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) {
|
|
||||||
case RGB_MATRIX_CUSTOM_FFT_ANIM:
|
|
||||||
// FFT Animation is active
|
|
||||||
packet[1] = 0x02;
|
|
||||||
break;
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef RGB_MATRIX_DATAPOINTER_ENABLED
|
|
||||||
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) {
|
|
||||||
// rgb_matrix_anim_data is set to NULL at animation init.
|
|
||||||
if (rgb_matrix_anim_data == NULL) { rgb_matrix_anim_data = hid_anim_data; }
|
|
||||||
|
|
||||||
// Copy data into rgb matrix array
|
|
||||||
memcpy(
|
|
||||||
hid_anim_data,
|
|
||||||
data + 2,
|
|
||||||
sizeof(uint8_t) + 10
|
|
||||||
);
|
|
||||||
} 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
|
|
@ -1,68 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "betalupi_ergodox.h"
|
|
||||||
#include "raw_hid.h"
|
|
||||||
|
|
||||||
|
|
||||||
void raw_hid_receive(uint8_t *data, uint8_t length);
|
|
||||||
void hid_send_state(void);
|
|
||||||
|
|
||||||
#ifdef RGB_MATRIX_DATAPOINTER_ENABLED
|
|
||||||
void cmd_animation(uint8_t *data, uint8_t length);
|
|
||||||
|
|
||||||
// Animation data.
|
|
||||||
// Data received from host is saved here,
|
|
||||||
// and rgb_matrix_anim_data points to this array when necessary.
|
|
||||||
extern uint8_t hid_anim_data[32];
|
|
||||||
|
|
||||||
// Datapointer
|
|
||||||
extern void* rgb_matrix_anim_data;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 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 |
|
|
||||||
// # of Bytes: | 1 | 1 |
|
|
||||||
//
|
|
||||||
// anim state:
|
|
||||||
// 0x00: RGBMatrix disabled
|
|
||||||
// 0x01: normal animation, no HID data.
|
|
||||||
// 0x02: FFT Animation
|
|
||||||
#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
|
|
||||||
|
|
@ -1,77 +0,0 @@
|
|||||||
# Betalupi Ergodox
|
|
||||||
|
|
||||||
This is a modified version of the [ZSA ErgoDox firmware](https://git.betalupi.com/mirrors-QMK/zsa_firmware), based on the `ergodox_ex/glow` keyboard.
|
|
||||||
|
|
||||||
|
|
||||||
## TODO
|
|
||||||
|
|
||||||
- Layer switch cleanup
|
|
||||||
- Define indicator in keymap
|
|
||||||
- Define language in keymap
|
|
||||||
- Auto-switch all
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
# Setup
|
|
||||||
|
|
||||||
Clone this repo into `keyboards/betalupi_ergodox` in your qmk directory.
|
|
||||||
|
|
||||||
Make example for this keyboard (after setting up your build environment):
|
|
||||||
|
|
||||||
make betalupi_ergodox:default:flash
|
|
||||||
|
|
||||||
|
|
||||||
If you get array-bounds errors on build, you may have a bad avr-gcc version. Read [this issue](https://github.com/qmk/qmk_firmware/issues/17064), and try
|
|
||||||
|
|
||||||
AVR_CFLAGS="-Wno-array-bounds"
|
|
||||||
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
# Notes
|
|
||||||
|
|
||||||
Custom keycodes (betalupi_keyboard.c)
|
|
||||||
|
|
||||||
```
|
|
||||||
// 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
|
|
||||||
```
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
# Notes from ZSA
|
|
||||||
|
|
||||||
|
|
||||||
### Indicator LEDs
|
|
||||||
|
|
||||||
You can use the `LED_LEVEL` keycode to cycle through the brightness levels for the LEDs on the top right of the keyboard. These settings are saved in eeprom (persistant memory).
|
|
||||||
|
|
||||||
Alternatively, you can set the brightness by calling the following functions:
|
|
||||||
|
|
||||||
```c
|
|
||||||
void ergodox_led_all_set(uint8_t level);
|
|
||||||
void ergodox_right_led_1_set(uint8_t level);
|
|
||||||
void ergodox_right_led_2_set(uint8_t level);
|
|
||||||
void ergodox_right_led_3_set(uint8_t level);
|
|
||||||
```
|
|
||||||
|
|
||||||
These settings are not persistent, so you'd need to reset it every time the board starts.
|
|
||||||
|
|
||||||
These are on a 0-255 scale
|
|
||||||
|
|
||||||
|
|
||||||
### 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.
|
|
@ -1,44 +1,39 @@
|
|||||||
# MCU name
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
BOOTLOADER = halfkay
|
||||||
|
|
||||||
# Enable raw HID for bi-directional communication
|
# Enable raw HID for bi-directional communication
|
||||||
RAW_ENABLE = yes
|
RAW_ENABLE = yes
|
||||||
|
|
||||||
# Bootloader selection
|
BOOTMAGIC_ENABLE = no
|
||||||
# Teensy halfkay
|
MOUSEKEY_ENABLE = no
|
||||||
# Pro Micro caterina
|
EXTRAKEY_ENABLE = yes
|
||||||
# Atmel DFU atmel-dfu
|
CONSOLE_ENABLE = no
|
||||||
# LUFA DFU lufa-dfu
|
COMMAND_ENABLE = no
|
||||||
# QMK DFU qmk-dfu
|
CUSTOM_MATRIX = lite
|
||||||
# ATmega32A bootloadHID
|
NKRO_ENABLE = yes
|
||||||
# ATmega328P USBasp
|
UNICODE_ENABLE = no
|
||||||
BOOTLOADER = halfkay
|
SWAP_HANDS_ENABLE = no
|
||||||
|
|
||||||
# Build Options
|
|
||||||
# comment out to disable the options.
|
|
||||||
#
|
|
||||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
|
|
||||||
MOUSEKEY_ENABLE = no # Mouse keys
|
|
||||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
|
||||||
CONSOLE_ENABLE = no # Console for debug
|
|
||||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
|
||||||
CUSTOM_MATRIX = lite # Custom matrix file for the ErgoDox EZ
|
|
||||||
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
|
||||||
UNICODE_ENABLE = no # Unicode
|
|
||||||
SWAP_HANDS_ENABLE= no # Allow swapping hands of keyboard
|
|
||||||
SLEEP_LED_ENABLE = no
|
SLEEP_LED_ENABLE = no
|
||||||
API_SYSEX_ENABLE = no
|
API_SYSEX_ENABLE = no
|
||||||
|
MOUSE_SHARED_EP = no
|
||||||
# Disable some unused qmk features
|
|
||||||
# to save space
|
|
||||||
MAGIC_ENABLE = no
|
MAGIC_ENABLE = no
|
||||||
|
LEADER_ENABLE = no
|
||||||
|
TAP_DANCE_ENABLE = yes
|
||||||
|
AUDIO_SUPPORTED = no
|
||||||
|
BACKLIGHT_SUPPORTED = no
|
||||||
|
|
||||||
DEBOUNCE_TYPE = sym_eager_pr
|
DEBOUNCE_TYPE = sym_eager_pr
|
||||||
|
|
||||||
SRC += \
|
SRC += \
|
||||||
matrix.c \
|
extra_mappings.c \
|
||||||
led_i2c.c \
|
process_record.c \
|
||||||
rawhid.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
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
|
||||||
@ -51,10 +46,8 @@ LTO_ENABLE = yes
|
|||||||
# Enable keyboard-specific effects
|
# Enable keyboard-specific effects
|
||||||
RGB_MATRIX_CUSTOM_KB = yes
|
RGB_MATRIX_CUSTOM_KB = yes
|
||||||
|
|
||||||
MOUSE_SHARED_EP = no
|
# From glow dir
|
||||||
|
|
||||||
# FROM glow dir
|
|
||||||
RGB_MATRIX_ENABLE = yes
|
RGB_MATRIX_ENABLE = yes
|
||||||
RGB_MATRIX_DRIVER = IS31FL3731
|
RGB_MATRIX_DRIVER = is31fl3731
|
||||||
RGBLIGHT_ENABLE = yes
|
RGBLIGHT_ENABLE = yes
|
||||||
RGBLIGHT_DRIVER = WS2812
|
RGBLIGHT_DRIVER = ws2812
|
@ -1,707 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""Compiler for keymap.c files
|
|
||||||
|
|
||||||
This script will generate a keymap.c file from a simple
|
|
||||||
markdown file with a specific layout.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
python compile_keymap.py INPUT_PATH [OUTPUT_PATH]
|
|
||||||
"""
|
|
||||||
from __future__ import division
|
|
||||||
from __future__ import print_function
|
|
||||||
from __future__ import absolute_import
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
import os
|
|
||||||
import io
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
import json
|
|
||||||
import unicodedata
|
|
||||||
import collections
|
|
||||||
import itertools as it
|
|
||||||
|
|
||||||
PY2 = sys.version_info.major == 2
|
|
||||||
|
|
||||||
if PY2:
|
|
||||||
chr = unichr
|
|
||||||
|
|
||||||
|
|
||||||
KEYBOARD_LAYOUTS = {
|
|
||||||
# These map positions in the parsed layout to
|
|
||||||
# positions in the KEYMAP MATRIX
|
|
||||||
'ergodox_ez': [
|
|
||||||
[ 0, 1, 2, 3, 4, 5, 6], [38, 39, 40, 41, 42, 43, 44],
|
|
||||||
[ 7, 8, 9, 10, 11, 12, 13], [45, 46, 47, 48, 49, 50, 51],
|
|
||||||
[14, 15, 16, 17, 18, 19 ], [ 52, 53, 54, 55, 56, 57],
|
|
||||||
[20, 21, 22, 23, 24, 25, 26], [58, 59, 60, 61, 62, 63, 64],
|
|
||||||
[27, 28, 29, 30, 31 ], [ 65, 66, 67, 68, 69],
|
|
||||||
[ 32, 33], [70, 71 ],
|
|
||||||
[ 34], [72 ],
|
|
||||||
[ 35, 36, 37], [73, 74, 75 ],
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
ROW_INDENTS = {
|
|
||||||
'ergodox_ez': [0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 5, 0, 6, 0, 4, 0]
|
|
||||||
}
|
|
||||||
|
|
||||||
BLANK_LAYOUTS = [
|
|
||||||
# Compact Layout
|
|
||||||
"""
|
|
||||||
.------------------------------------.------------------------------------.
|
|
||||||
| | | | | | | | | | | | | | |
|
|
||||||
!-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
|
|
||||||
| | | | | | | | | | | | | | |
|
|
||||||
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
|
|
||||||
| | | | | | |-----!-----! | | | | | |
|
|
||||||
!-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
|
|
||||||
| | | | | | | | | | | | | | |
|
|
||||||
'-----+----+----+----+----+----------'----------+----+----+----+----+-----'
|
|
||||||
| | | | | | ! | | | | |
|
|
||||||
'------------------------' '------------------------'
|
|
||||||
.-----------. .-----------.
|
|
||||||
| | | ! | |
|
|
||||||
.-----+-----+-----! !-----+-----+-----.
|
|
||||||
! ! | | ! | ! !
|
|
||||||
! ! !-----! !-----! ! !
|
|
||||||
| | | | ! | | |
|
|
||||||
'-----------------' '-----------------'
|
|
||||||
""",
|
|
||||||
|
|
||||||
# Wide Layout
|
|
||||||
"""
|
|
||||||
.---------------------------------------------. .---------------------------------------------.
|
|
||||||
| | | | | | | | ! | | | | | | |
|
|
||||||
!-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
|
|
||||||
| | | | | | | | ! | | | | | | |
|
|
||||||
!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
|
|
||||||
| | | | | | |-------! !-------! | | | | | |
|
|
||||||
!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
|
|
||||||
| | | | | | | | ! | | | | | | |
|
|
||||||
'-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
|
|
||||||
| | | | | | ! | | | | |
|
|
||||||
'------------------------------' '------------------------------'
|
|
||||||
.---------------. .---------------.
|
|
||||||
| | | ! | |
|
|
||||||
.-------+-------+-------! !-------+-------+-------.
|
|
||||||
! ! | | ! | ! !
|
|
||||||
! ! !-------! !-------! ! !
|
|
||||||
| | | | ! | | |
|
|
||||||
'-----------------------' '-----------------------'
|
|
||||||
""",
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
DEFAULT_CONFIG = {
|
|
||||||
"keymaps_includes": [
|
|
||||||
"keymap_common.h",
|
|
||||||
],
|
|
||||||
'filler': "-+.'!:x",
|
|
||||||
'separator': "|",
|
|
||||||
'default_key_prefix': ["KC_"],
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
SECTIONS = [
|
|
||||||
'layout_config',
|
|
||||||
'layers',
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
# Markdown Parsing
|
|
||||||
|
|
||||||
ONELINE_COMMENT_RE = re.compile(r"""
|
|
||||||
^ # comment must be at the start of the line
|
|
||||||
\s* # arbitrary whitespace
|
|
||||||
// # start of the comment
|
|
||||||
(.*) # the comment
|
|
||||||
$ # until the end of line
|
|
||||||
""", re.MULTILINE | re.VERBOSE
|
|
||||||
)
|
|
||||||
|
|
||||||
INLINE_COMMENT_RE = re.compile(r"""
|
|
||||||
([\,\"\[\]\{\}\d]) # anythig that might end a expression
|
|
||||||
\s+ # comment must be preceded by whitespace
|
|
||||||
// # start of the comment
|
|
||||||
\s # and succeded by whitespace
|
|
||||||
(?:[^\"\]\}\{\[]*) # the comment (except things which might be json)
|
|
||||||
$ # until the end of line
|
|
||||||
""", re.MULTILINE | re.VERBOSE)
|
|
||||||
|
|
||||||
TRAILING_COMMA_RE = re.compile(r"""
|
|
||||||
, # the comma
|
|
||||||
(?:\s*) # arbitrary whitespace
|
|
||||||
$ # only works if the trailing comma is followed by newline
|
|
||||||
(\s*) # arbitrary whitespace
|
|
||||||
([\]\}]) # end of an array or object
|
|
||||||
""", re.MULTILINE | re.VERBOSE)
|
|
||||||
|
|
||||||
|
|
||||||
def loads(raw_data):
|
|
||||||
if isinstance(raw_data, bytes):
|
|
||||||
raw_data = raw_data.decode('utf-8')
|
|
||||||
|
|
||||||
raw_data = ONELINE_COMMENT_RE.sub(r"", raw_data)
|
|
||||||
raw_data = INLINE_COMMENT_RE.sub(r"\1", raw_data)
|
|
||||||
raw_data = TRAILING_COMMA_RE.sub(r"\1\2", raw_data)
|
|
||||||
return json.loads(raw_data)
|
|
||||||
|
|
||||||
|
|
||||||
def parse_config(path):
|
|
||||||
def reset_section():
|
|
||||||
section.update({
|
|
||||||
'name': section.get('name', ""),
|
|
||||||
'sub_name': "",
|
|
||||||
'start_line': -1,
|
|
||||||
'end_line': -1,
|
|
||||||
'code_lines': [],
|
|
||||||
})
|
|
||||||
|
|
||||||
def start_section(line_index, line):
|
|
||||||
end_section()
|
|
||||||
if line.startswith("# "):
|
|
||||||
name = line[2:]
|
|
||||||
elif line.startswith("## "):
|
|
||||||
name = line[3:]
|
|
||||||
else:
|
|
||||||
name = ""
|
|
||||||
|
|
||||||
name = name.strip().replace(" ", "_").lower()
|
|
||||||
if name in SECTIONS:
|
|
||||||
section['name'] = name
|
|
||||||
else:
|
|
||||||
section['sub_name'] = name
|
|
||||||
section['start_line'] = line_index
|
|
||||||
|
|
||||||
def end_section():
|
|
||||||
if section['start_line'] >= 0:
|
|
||||||
if section['name'] == 'layout_config':
|
|
||||||
config.update(loads("\n".join(
|
|
||||||
section['code_lines']
|
|
||||||
)))
|
|
||||||
elif section['sub_name'].startswith('layer'):
|
|
||||||
layer_name = section['sub_name']
|
|
||||||
config['layer_lines'][layer_name] = section['code_lines']
|
|
||||||
|
|
||||||
reset_section()
|
|
||||||
|
|
||||||
def amend_section(line_index, line):
|
|
||||||
section['end_line'] = line_index
|
|
||||||
section['code_lines'].append(line)
|
|
||||||
|
|
||||||
config = DEFAULT_CONFIG.copy()
|
|
||||||
config.update({
|
|
||||||
'layer_lines': collections.OrderedDict(),
|
|
||||||
'macro_ids': {'UM'},
|
|
||||||
'unicode_macros': {},
|
|
||||||
})
|
|
||||||
|
|
||||||
section = {}
|
|
||||||
reset_section()
|
|
||||||
|
|
||||||
with io.open(path, encoding="utf-8") as fh:
|
|
||||||
for i, line in enumerate(fh):
|
|
||||||
if line.startswith("#"):
|
|
||||||
start_section(i, line)
|
|
||||||
elif line.startswith(" "):
|
|
||||||
amend_section(i, line[4:])
|
|
||||||
else:
|
|
||||||
# TODO: maybe parse description
|
|
||||||
pass
|
|
||||||
|
|
||||||
end_section()
|
|
||||||
assert 'layout' in config
|
|
||||||
return config
|
|
||||||
|
|
||||||
# header file parsing
|
|
||||||
|
|
||||||
IF0_RE = re.compile(r"""
|
|
||||||
^
|
|
||||||
#if 0
|
|
||||||
$.*?
|
|
||||||
#endif
|
|
||||||
""", re.MULTILINE | re.DOTALL | re.VERBOSE)
|
|
||||||
|
|
||||||
|
|
||||||
COMMENT_RE = re.compile(r"""
|
|
||||||
/\*
|
|
||||||
.*?
|
|
||||||
\*/"
|
|
||||||
""", re.MULTILINE | re.DOTALL | re.VERBOSE)
|
|
||||||
|
|
||||||
|
|
||||||
def read_header_file(path):
|
|
||||||
with io.open(path, encoding="utf-8") as fh:
|
|
||||||
data = fh.read()
|
|
||||||
data, _ = COMMENT_RE.subn("", data)
|
|
||||||
data, _ = IF0_RE.subn("", data)
|
|
||||||
return data
|
|
||||||
|
|
||||||
|
|
||||||
def regex_partial(re_str_fmt, flags):
|
|
||||||
def partial(*args, **kwargs):
|
|
||||||
re_str = re_str_fmt.format(*args, **kwargs)
|
|
||||||
return re.compile(re_str, flags)
|
|
||||||
return partial
|
|
||||||
|
|
||||||
|
|
||||||
KEYDEF_REP = regex_partial(r"""
|
|
||||||
#define
|
|
||||||
\s
|
|
||||||
(
|
|
||||||
(?:{}) # the prefixes
|
|
||||||
(?:\w+) # the key name
|
|
||||||
) # capture group end
|
|
||||||
""", re.MULTILINE | re.DOTALL | re.VERBOSE)
|
|
||||||
|
|
||||||
|
|
||||||
ENUM_RE = re.compile(r"""
|
|
||||||
(
|
|
||||||
enum
|
|
||||||
\s\w+\s
|
|
||||||
\{
|
|
||||||
.*? # the enum content
|
|
||||||
\}
|
|
||||||
;
|
|
||||||
) # capture group end
|
|
||||||
""", re.MULTILINE | re.DOTALL | re.VERBOSE)
|
|
||||||
|
|
||||||
|
|
||||||
ENUM_KEY_REP = regex_partial(r"""
|
|
||||||
(
|
|
||||||
{} # the prefixes
|
|
||||||
\w+ # the key name
|
|
||||||
) # capture group end
|
|
||||||
""", re.MULTILINE | re.DOTALL | re.VERBOSE)
|
|
||||||
|
|
||||||
|
|
||||||
def parse_keydefs(config, data):
|
|
||||||
prefix_options = "|".join(config['key_prefixes'])
|
|
||||||
keydef_re = KEYDEF_REP(prefix_options)
|
|
||||||
enum_key_re = ENUM_KEY_REP(prefix_options)
|
|
||||||
for match in keydef_re.finditer(data):
|
|
||||||
yield match.groups()[0]
|
|
||||||
|
|
||||||
for enum_match in ENUM_RE.finditer(data):
|
|
||||||
enum = enum_match.groups()[0]
|
|
||||||
for key_match in enum_key_re.finditer(enum):
|
|
||||||
yield key_match.groups()[0]
|
|
||||||
|
|
||||||
|
|
||||||
def parse_valid_keys(config, out_path):
|
|
||||||
basepath = os.path.abspath(os.path.join(os.path.dirname(out_path)))
|
|
||||||
dirpaths = []
|
|
||||||
subpaths = []
|
|
||||||
while len(subpaths) < 6:
|
|
||||||
path = os.path.join(basepath, *subpaths)
|
|
||||||
dirpaths.append(path)
|
|
||||||
dirpaths.append(os.path.join(path, "tmk_core", "common"))
|
|
||||||
dirpaths.append(os.path.join(path, "quantum"))
|
|
||||||
subpaths.append('..')
|
|
||||||
|
|
||||||
includes = set(config['keymaps_includes'])
|
|
||||||
includes.add("keycode.h")
|
|
||||||
|
|
||||||
valid_keycodes = set()
|
|
||||||
for dirpath, include in it.product(dirpaths, includes):
|
|
||||||
include_path = os.path.join(dirpath, include)
|
|
||||||
if os.path.exists(include_path):
|
|
||||||
header_data = read_header_file(include_path)
|
|
||||||
valid_keycodes.update(
|
|
||||||
parse_keydefs(config, header_data)
|
|
||||||
)
|
|
||||||
return valid_keycodes
|
|
||||||
|
|
||||||
|
|
||||||
# Keymap Parsing
|
|
||||||
|
|
||||||
def iter_raw_codes(layer_lines, filler, separator):
|
|
||||||
filler_re = re.compile("[" + filler + " ]")
|
|
||||||
for line in layer_lines:
|
|
||||||
line, _ = filler_re.subn("", line.strip())
|
|
||||||
if not line:
|
|
||||||
continue
|
|
||||||
codes = line.split(separator)
|
|
||||||
for code in codes[1:-1]:
|
|
||||||
yield code
|
|
||||||
|
|
||||||
|
|
||||||
def iter_indexed_codes(raw_codes, key_indexes):
|
|
||||||
key_rows = {}
|
|
||||||
key_indexes_flat = []
|
|
||||||
|
|
||||||
for row_index, key_indexes in enumerate(key_indexes):
|
|
||||||
for key_index in key_indexes:
|
|
||||||
key_rows[key_index] = row_index
|
|
||||||
key_indexes_flat.extend(key_indexes)
|
|
||||||
assert len(raw_codes) == len(key_indexes_flat)
|
|
||||||
for raw_code, key_index in zip(raw_codes, key_indexes_flat):
|
|
||||||
# we keep track of the row mostly for layout purposes
|
|
||||||
yield raw_code, key_index, key_rows[key_index]
|
|
||||||
|
|
||||||
|
|
||||||
LAYER_CHANGE_RE = re.compile(r"""
|
|
||||||
(DF|TG|MO)\(\d+\)
|
|
||||||
""", re.VERBOSE)
|
|
||||||
|
|
||||||
|
|
||||||
MACRO_RE = re.compile(r"""
|
|
||||||
M\(\w+\)
|
|
||||||
""", re.VERBOSE)
|
|
||||||
|
|
||||||
|
|
||||||
UNICODE_RE = re.compile(r"""
|
|
||||||
U[0-9A-F]{4}
|
|
||||||
""", re.VERBOSE)
|
|
||||||
|
|
||||||
|
|
||||||
NON_CODE = re.compile(r"""
|
|
||||||
^[^A-Z0-9_]$
|
|
||||||
""", re.VERBOSE)
|
|
||||||
|
|
||||||
|
|
||||||
def parse_uni_code(raw_code):
|
|
||||||
macro_id = "UC_" + (
|
|
||||||
unicodedata.name(raw_code)
|
|
||||||
.replace(" ", "_")
|
|
||||||
.replace("-", "_")
|
|
||||||
)
|
|
||||||
code = "M({})".format(macro_id)
|
|
||||||
uc_hex = "{:04X}".format(ord(raw_code))
|
|
||||||
return code, macro_id, uc_hex
|
|
||||||
|
|
||||||
|
|
||||||
def parse_key_code(raw_code, key_prefixes, valid_keycodes):
|
|
||||||
if raw_code in valid_keycodes:
|
|
||||||
return raw_code
|
|
||||||
|
|
||||||
for prefix in key_prefixes:
|
|
||||||
code = prefix + raw_code
|
|
||||||
if code in valid_keycodes:
|
|
||||||
return code
|
|
||||||
|
|
||||||
|
|
||||||
def parse_code(raw_code, key_prefixes, valid_keycodes):
|
|
||||||
if not raw_code:
|
|
||||||
return 'KC_TRNS', None, None
|
|
||||||
|
|
||||||
if LAYER_CHANGE_RE.match(raw_code):
|
|
||||||
return raw_code, None, None
|
|
||||||
|
|
||||||
if MACRO_RE.match(raw_code):
|
|
||||||
macro_id = raw_code[2:-1]
|
|
||||||
return raw_code, macro_id, None
|
|
||||||
|
|
||||||
if UNICODE_RE.match(raw_code):
|
|
||||||
hex_code = raw_code[1:]
|
|
||||||
return parse_uni_code(chr(int(hex_code, 16)))
|
|
||||||
|
|
||||||
if NON_CODE.match(raw_code):
|
|
||||||
return parse_uni_code(raw_code)
|
|
||||||
|
|
||||||
code = parse_key_code(raw_code, key_prefixes, valid_keycodes)
|
|
||||||
return code, None, None
|
|
||||||
|
|
||||||
|
|
||||||
def parse_keymap(config, key_indexes, layer_lines, valid_keycodes):
|
|
||||||
keymap = {}
|
|
||||||
raw_codes = list(iter_raw_codes(
|
|
||||||
layer_lines, config['filler'], config['separator']
|
|
||||||
))
|
|
||||||
indexed_codes = iter_indexed_codes(raw_codes, key_indexes)
|
|
||||||
key_prefixes = config['key_prefixes']
|
|
||||||
for raw_code, key_index, row_index in indexed_codes:
|
|
||||||
code, macro_id, uc_hex = parse_code(
|
|
||||||
raw_code, key_prefixes, valid_keycodes
|
|
||||||
)
|
|
||||||
# TODO: line numbers for invalid codes
|
|
||||||
err_msg = "Could not parse key '{}' on row {}".format(
|
|
||||||
raw_code, row_index
|
|
||||||
)
|
|
||||||
assert code is not None, err_msg
|
|
||||||
# print(repr(raw_code), repr(code), macro_id, uc_hex)
|
|
||||||
if macro_id:
|
|
||||||
config['macro_ids'].add(macro_id)
|
|
||||||
if uc_hex:
|
|
||||||
config['unicode_macros'][macro_id] = uc_hex
|
|
||||||
keymap[key_index] = (code, row_index)
|
|
||||||
return keymap
|
|
||||||
|
|
||||||
|
|
||||||
def parse_keymaps(config, valid_keycodes):
|
|
||||||
keymaps = collections.OrderedDict()
|
|
||||||
key_indexes = config.get(
|
|
||||||
'key_indexes', KEYBOARD_LAYOUTS[config['layout']]
|
|
||||||
)
|
|
||||||
# TODO: maybe validate key_indexes
|
|
||||||
|
|
||||||
for layer_name, layer_lines, in config['layer_lines'].items():
|
|
||||||
keymaps[layer_name] = parse_keymap(
|
|
||||||
config, key_indexes, layer_lines, valid_keycodes
|
|
||||||
)
|
|
||||||
return keymaps
|
|
||||||
|
|
||||||
# keymap.c output
|
|
||||||
|
|
||||||
USERCODE = """
|
|
||||||
// Runs just one time when the keyboard initializes.
|
|
||||||
void matrix_init_user(void) {
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
// Runs constantly in the background, in a loop.
|
|
||||||
void matrix_scan_user(void) {
|
|
||||||
uint8_t layer = biton32(layer_state);
|
|
||||||
|
|
||||||
ergodox_board_led_off();
|
|
||||||
ergodox_right_led_1_off();
|
|
||||||
ergodox_right_led_2_off();
|
|
||||||
ergodox_right_led_3_off();
|
|
||||||
switch (layer) {
|
|
||||||
case L1:
|
|
||||||
ergodox_right_led_1_on();
|
|
||||||
break;
|
|
||||||
case L2:
|
|
||||||
ergodox_right_led_2_on();
|
|
||||||
break;
|
|
||||||
case L3:
|
|
||||||
ergodox_right_led_3_on();
|
|
||||||
break;
|
|
||||||
case L4:
|
|
||||||
ergodox_right_led_1_on();
|
|
||||||
ergodox_right_led_2_on();
|
|
||||||
break;
|
|
||||||
case L5:
|
|
||||||
ergodox_right_led_1_on();
|
|
||||||
ergodox_right_led_3_on();
|
|
||||||
break;
|
|
||||||
// case L6:
|
|
||||||
// ergodox_right_led_2_on();
|
|
||||||
// ergodox_right_led_3_on();
|
|
||||||
// break;
|
|
||||||
// case L7:
|
|
||||||
// ergodox_right_led_1_on();
|
|
||||||
// ergodox_right_led_2_on();
|
|
||||||
// ergodox_right_led_3_on();
|
|
||||||
// break;
|
|
||||||
default:
|
|
||||||
ergodox_board_led_off();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
"""
|
|
||||||
|
|
||||||
MACROCODE = """
|
|
||||||
#define UC_MODE_WIN 0
|
|
||||||
#define UC_MODE_LINUX 1
|
|
||||||
#define UC_MODE_OSX 2
|
|
||||||
|
|
||||||
// TODO: allow default mode to be configured
|
|
||||||
static uint16_t unicode_mode = UC_MODE_WIN;
|
|
||||||
|
|
||||||
uint16_t hextokeycode(uint8_t hex) {{
|
|
||||||
if (hex == 0x0) {{
|
|
||||||
return KC_P0;
|
|
||||||
}}
|
|
||||||
if (hex < 0xA) {{
|
|
||||||
return KC_P1 + (hex - 0x1);
|
|
||||||
}}
|
|
||||||
return KC_A + (hex - 0xA);
|
|
||||||
}}
|
|
||||||
|
|
||||||
void unicode_action_function(uint16_t hi, uint16_t lo) {{
|
|
||||||
switch (unicode_mode) {{
|
|
||||||
case UC_MODE_WIN:
|
|
||||||
register_code(KC_LALT);
|
|
||||||
|
|
||||||
register_code(KC_PPLS);
|
|
||||||
unregister_code(KC_PPLS);
|
|
||||||
|
|
||||||
register_code(hextokeycode((hi & 0xF0) >> 4));
|
|
||||||
unregister_code(hextokeycode((hi & 0xF0) >> 4));
|
|
||||||
register_code(hextokeycode((hi & 0x0F)));
|
|
||||||
unregister_code(hextokeycode((hi & 0x0F)));
|
|
||||||
register_code(hextokeycode((lo & 0xF0) >> 4));
|
|
||||||
unregister_code(hextokeycode((lo & 0xF0) >> 4));
|
|
||||||
register_code(hextokeycode((lo & 0x0F)));
|
|
||||||
unregister_code(hextokeycode((lo & 0x0F)));
|
|
||||||
|
|
||||||
unregister_code(KC_LALT);
|
|
||||||
break;
|
|
||||||
case UC_MODE_LINUX:
|
|
||||||
register_code(KC_LCTL);
|
|
||||||
register_code(KC_LSFT);
|
|
||||||
|
|
||||||
register_code(KC_U);
|
|
||||||
unregister_code(KC_U);
|
|
||||||
|
|
||||||
register_code(hextokeycode((hi & 0xF0) >> 4));
|
|
||||||
unregister_code(hextokeycode((hi & 0xF0) >> 4));
|
|
||||||
register_code(hextokeycode((hi & 0x0F)));
|
|
||||||
unregister_code(hextokeycode((hi & 0x0F)));
|
|
||||||
register_code(hextokeycode((lo & 0xF0) >> 4));
|
|
||||||
unregister_code(hextokeycode((lo & 0xF0) >> 4));
|
|
||||||
register_code(hextokeycode((lo & 0x0F)));
|
|
||||||
unregister_code(hextokeycode((lo & 0x0F)));
|
|
||||||
|
|
||||||
unregister_code(KC_LCTL);
|
|
||||||
unregister_code(KC_LSFT);
|
|
||||||
break;
|
|
||||||
case UC_MODE_OSX:
|
|
||||||
break;
|
|
||||||
}}
|
|
||||||
}}
|
|
||||||
|
|
||||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {{
|
|
||||||
if (!record->event.pressed) {{
|
|
||||||
return MACRO_NONE;
|
|
||||||
}}
|
|
||||||
// MACRODOWN only works in this function
|
|
||||||
switch(id) {{
|
|
||||||
case UM:
|
|
||||||
unicode_mode = (unicode_mode + 1) % 2;
|
|
||||||
break;
|
|
||||||
{macro_cases}
|
|
||||||
{unicode_macro_cases}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}}
|
|
||||||
return MACRO_NONE;
|
|
||||||
}};
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
UNICODE_MACRO_TEMPLATE = """
|
|
||||||
case {macro_id}:
|
|
||||||
unicode_action_function(0x{hi:02x}, 0x{lo:02x});
|
|
||||||
break;
|
|
||||||
""".strip()
|
|
||||||
|
|
||||||
|
|
||||||
def unicode_macro_cases(config):
|
|
||||||
for macro_id, uc_hex in config['unicode_macros'].items():
|
|
||||||
hi = int(uc_hex, 16) >> 8
|
|
||||||
lo = int(uc_hex, 16) & 0xFF
|
|
||||||
unimacro_keys = ", ".join(
|
|
||||||
"T({})".format(
|
|
||||||
"KP_" + digit if digit.isdigit() else digit
|
|
||||||
) for digit in uc_hex
|
|
||||||
)
|
|
||||||
yield UNICODE_MACRO_TEMPLATE.format(
|
|
||||||
macro_id=macro_id, hi=hi, lo=lo
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def iter_keymap_lines(keymap, row_indents=None):
|
|
||||||
col_widths = {}
|
|
||||||
col = 0
|
|
||||||
# first pass, figure out the column widths
|
|
||||||
prev_row_index = None
|
|
||||||
for code, row_index in keymap.values():
|
|
||||||
if row_index != prev_row_index:
|
|
||||||
col = 0
|
|
||||||
if row_indents:
|
|
||||||
col = row_indents[row_index]
|
|
||||||
col_widths[col] = max(len(code), col_widths.get(col, 0))
|
|
||||||
prev_row_index = row_index
|
|
||||||
col += 1
|
|
||||||
|
|
||||||
# second pass, yield the cell values
|
|
||||||
col = 0
|
|
||||||
prev_row_index = None
|
|
||||||
for key_index in sorted(keymap):
|
|
||||||
code, row_index = keymap[key_index]
|
|
||||||
if row_index != prev_row_index:
|
|
||||||
col = 0
|
|
||||||
yield "\n"
|
|
||||||
if row_indents:
|
|
||||||
for indent_col in range(row_indents[row_index]):
|
|
||||||
pad = " " * (col_widths[indent_col] - 4)
|
|
||||||
yield (" /*-*/" + pad)
|
|
||||||
col = row_indents[row_index]
|
|
||||||
else:
|
|
||||||
yield pad
|
|
||||||
yield " {}".format(code)
|
|
||||||
if key_index < len(keymap) - 1:
|
|
||||||
yield ","
|
|
||||||
# This will be yielded on the next iteration when
|
|
||||||
# we know that we're not at the end of a line.
|
|
||||||
pad = " " * (col_widths[col] - len(code))
|
|
||||||
prev_row_index = row_index
|
|
||||||
col += 1
|
|
||||||
|
|
||||||
|
|
||||||
def iter_keymap_parts(config, keymaps):
|
|
||||||
# includes
|
|
||||||
for include_path in config['keymaps_includes']:
|
|
||||||
yield '#include "{}"\n'.format(include_path)
|
|
||||||
|
|
||||||
yield "\n"
|
|
||||||
|
|
||||||
# definitions
|
|
||||||
for i, macro_id in enumerate(sorted(config['macro_ids'])):
|
|
||||||
yield "#define {} {}\n".format(macro_id, i)
|
|
||||||
|
|
||||||
yield "\n"
|
|
||||||
|
|
||||||
for i, layer_name in enumerate(config['layer_lines']):
|
|
||||||
yield '#define L{0:<3} {0:<5} // {1}\n'.format(i, layer_name)
|
|
||||||
|
|
||||||
yield "\n"
|
|
||||||
|
|
||||||
# keymaps
|
|
||||||
yield "const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {\n"
|
|
||||||
|
|
||||||
for i, layer_name in enumerate(config['layer_lines']):
|
|
||||||
# comment
|
|
||||||
layer_lines = config['layer_lines'][layer_name]
|
|
||||||
prefixed_lines = " * " + " * ".join(layer_lines)
|
|
||||||
yield "/*\n{} */\n".format(prefixed_lines)
|
|
||||||
|
|
||||||
# keymap codes
|
|
||||||
keymap = keymaps[layer_name]
|
|
||||||
row_indents = ROW_INDENTS.get(config['layout'])
|
|
||||||
keymap_lines = "".join(iter_keymap_lines(keymap, row_indents))
|
|
||||||
yield "[L{0}] = KEYMAP({1}\n),\n".format(i, keymap_lines)
|
|
||||||
|
|
||||||
yield "};\n\n"
|
|
||||||
|
|
||||||
# macros
|
|
||||||
yield MACROCODE.format(
|
|
||||||
macro_cases="",
|
|
||||||
unicode_macro_cases="\n".join(unicode_macro_cases(config)),
|
|
||||||
)
|
|
||||||
|
|
||||||
# TODO: dynamically create blinking lights
|
|
||||||
yield USERCODE
|
|
||||||
|
|
||||||
|
|
||||||
def main(argv=sys.argv[1:]):
|
|
||||||
if not argv or '-h' in argv or '--help' in argv:
|
|
||||||
print(__doc__)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
in_path = os.path.abspath(argv[0])
|
|
||||||
if not os.path.exists(in_path):
|
|
||||||
print("No such file '{}'".format(in_path))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if len(argv) > 1:
|
|
||||||
out_path = os.path.abspath(argv[1])
|
|
||||||
else:
|
|
||||||
dirname = os.path.dirname(in_path)
|
|
||||||
out_path = os.path.join(dirname, "keymap.c")
|
|
||||||
|
|
||||||
config = parse_config(in_path)
|
|
||||||
valid_keys = parse_valid_keys(config, out_path)
|
|
||||||
keymaps = parse_keymaps(config, valid_keys)
|
|
||||||
|
|
||||||
with io.open(out_path, mode="w", encoding="utf-8") as fh:
|
|
||||||
for part in iter_keymap_parts(config, keymaps):
|
|
||||||
fh.write(part)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.exit(main())
|
|
@ -1,3 +0,0 @@
|
|||||||
# ErgoDox EZ Utilities
|
|
||||||
|
|
||||||
The Python script in this directory, by [mbarkhau](https://github.com/mbarkhau) allows you to write out a basic ErgoDox EZ keymap using Markdown notation, and then transpile it to C, which you can then compile. It's experimental, but if you're not comfortable using C, it's a nice option.
|
|
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
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user