mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-08-13 03:52:27 +00:00
Compare commits
29 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1ea0cac998 | ||
![]() |
b9610091f5 | ||
![]() |
002adadf58 | ||
![]() |
95309e9af5 | ||
![]() |
dfb78d2a08 | ||
![]() |
ed0575fc8a | ||
![]() |
7c0edbe800 | ||
![]() |
fc51a4a107 | ||
![]() |
8b832c494c | ||
![]() |
dcb2d63302 | ||
![]() |
dc1137129d | ||
![]() |
1244d0e266 | ||
![]() |
542cb0a8ce | ||
![]() |
0e664f92c4 | ||
![]() |
d382eeeb9d | ||
![]() |
efa28d0f5c | ||
![]() |
0a9a69394e | ||
![]() |
31fe2e0859 | ||
![]() |
29630e6e49 | ||
![]() |
a836c85e54 | ||
![]() |
511fa5f815 | ||
![]() |
a510e5212b | ||
![]() |
2b83b908dd | ||
![]() |
25d4c0c810 | ||
![]() |
3a215195ed | ||
![]() |
a4d138645f | ||
![]() |
363cdb5fc0 | ||
![]() |
be6562a223 | ||
![]() |
732d1dd4f6 |
@@ -16,6 +16,7 @@ install:
|
||||
- npm install -g moxygen
|
||||
script:
|
||||
- git rev-parse --short HEAD
|
||||
- git diff --name-only HEAD $TRAVIS_BRANCH
|
||||
- bash util/travis_test.sh
|
||||
- bash util/travis_build.sh
|
||||
- bash util/travis_docs.sh
|
||||
|
8
Makefile
8
Makefile
@@ -558,10 +558,10 @@ endef
|
||||
if ! python3 --version 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; fi
|
||||
# Check if the submodules are dirty, and display a warning if they are
|
||||
ifndef SKIP_GIT
|
||||
if [ ! -e lib/chibios ]; then git submodule sync lib/chibios && git submodule update --depth 1 --init lib/chibios; fi
|
||||
if [ ! -e lib/chibios-contrib ]; then git submodule sync lib/chibios-contrib && git submodule update --depth 1 --init lib/chibios-contrib; fi
|
||||
if [ ! -e lib/ugfx ]; then git submodule sync lib/ugfx && git submodule update --depth 1 --init lib/ugfx; fi
|
||||
if [ ! -e lib/lufa ]; then git submodule sync lib/lufa && git submodule update --depth 1 --init lib/lufa; fi
|
||||
if [ ! -e lib/chibios ]; then git submodule sync lib/chibios && git submodule update --depth 50 --init lib/chibios; fi
|
||||
if [ ! -e lib/chibios-contrib ]; then git submodule sync lib/chibios-contrib && git submodule update --depth 50 --init lib/chibios-contrib; fi
|
||||
if [ ! -e lib/ugfx ]; then git submodule sync lib/ugfx && git submodule update --depth 50 --init lib/ugfx; fi
|
||||
if [ ! -e lib/lufa ]; then git submodule sync lib/lufa && git submodule update --depth 50 --init lib/lufa; fi
|
||||
git submodule status --recursive 2>/dev/null | \
|
||||
while IFS= read -r x; do \
|
||||
case "$$x" in \
|
||||
|
@@ -407,8 +407,12 @@ ifeq ($(strip $(SPACE_CADET_ENABLE)), yes)
|
||||
OPT_DEFS += -DSPACE_CADET_ENABLE
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
|
||||
SRC += $(QUANTUM_DIR)/dip_switch.c
|
||||
OPT_DEFS += -DDIP_SWITCH_ENABLE
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(DYNAMIC_MACRO_ENABLE)), yes)
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_dynamic_macro.c
|
||||
OPT_DEFS += -DDYNAMIC_MACRO_ENABLE
|
||||
endif
|
||||
|
@@ -348,7 +348,8 @@ Use these to enable or disable building certain features. The more you have enab
|
||||
* `NO_USB_STARTUP_CHECK`
|
||||
* Disables usb suspend check after keyboard startup. Usually the keyboard waits for the host to wake it up before any tasks are performed. This is useful for split keyboards as one half will not get a wakeup call but must send commands to the master.
|
||||
* `LINK_TIME_OPTIMIZATION_ENABLE`
|
||||
= Enables Link Time Optimization (`LTO`) when compiling the keyboard. This makes the process take longer, but can significantly reduce the compiled size (and since the firmware is small, the added time is not noticable). However, this will automatically disable the old Macros and Functions features automatically, as these break when `LTO` is enabled. It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`
|
||||
* Enables Link Time Optimization (`LTO`) when compiling the keyboard. This makes the process take longer, but can significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable). However, this will automatically disable the old Macros and Functions features automatically, as these break when `LTO` is enabled. It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`
|
||||
* Alternatively, you can use `LTO_ENABLE` instead of `LINK_TIME_OPTIMIZATION_ENABLE`.
|
||||
|
||||
## USB Endpoint Limitations
|
||||
|
||||
|
@@ -90,68 +90,110 @@ keyrecord_t record {
|
||||
|
||||
# LED Control
|
||||
|
||||
QMK provides methods to read the 5 LEDs defined as part of the HID spec:
|
||||
QMK provides methods to read 5 of the LEDs defined in the HID spec:
|
||||
|
||||
* `USB_LED_NUM_LOCK`
|
||||
* `USB_LED_CAPS_LOCK`
|
||||
* `USB_LED_SCROLL_LOCK`
|
||||
* `USB_LED_COMPOSE`
|
||||
* `USB_LED_KANA`
|
||||
* Num Lock
|
||||
* Caps Lock
|
||||
* Scroll Lock
|
||||
* Compose
|
||||
* Kana
|
||||
|
||||
These five constants correspond to the positional bits of the host LED state.
|
||||
There are two ways to get the host LED state:
|
||||
There are two ways to get the lock LED state:
|
||||
|
||||
* by implementing `led_set_user()`
|
||||
* by calling `host_keyboard_leds()`
|
||||
* by implementing `bool led_update_kb(led_t led_state)` or `_user(led_t led_state)`; or
|
||||
* by calling `led_t host_keyboard_led_state()`
|
||||
|
||||
## `led_set_user()`
|
||||
!> `host_keyboard_led_state()` may already reflect a new value before `led_update_user()` is called.
|
||||
|
||||
This function will be called when the state of one of those 5 LEDs changes. It receives the LED state as a parameter.
|
||||
Use the `IS_LED_ON(usb_led, led_name)` and `IS_LED_OFF(usb_led, led_name)` macros to check the LED status.
|
||||
Two more deprecated functions exist that provide the LED state as a `uint8_t`:
|
||||
|
||||
!> `host_keyboard_leds()` may already reflect a new value before `led_set_user()` is called.
|
||||
* `uint8_t led_set_kb(uint8_t usb_led)` and `_user(uint8_t usb_led)`
|
||||
* `uint8_t host_keyboard_leds()`
|
||||
|
||||
### Example `led_set_user()` Implementation
|
||||
## `led_update_user()`
|
||||
|
||||
This function will be called when the state of one of those 5 LEDs changes. It receives the LED state as a struct parameter.
|
||||
|
||||
You must return either `true` or `false` from this function, depending on whether you want to override the keyboard-level implementation.
|
||||
|
||||
?> Because the `led_set_*` functions return `void` instead of `bool`, they do not allow for overriding the keyboard LED control, and thus it's recommended to use `led_update_*` instead.
|
||||
|
||||
### Example `led_update_kb()` Implementation
|
||||
|
||||
```c
|
||||
void led_set_user(uint8_t usb_led) {
|
||||
if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
|
||||
writePinLow(B0);
|
||||
} else {
|
||||
writePinHigh(B0);
|
||||
}
|
||||
if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
|
||||
writePinLow(B1);
|
||||
} else {
|
||||
writePinHigh(B1);
|
||||
}
|
||||
if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
|
||||
writePinLow(B2);
|
||||
} else {
|
||||
writePinHigh(B2);
|
||||
}
|
||||
if (IS_LED_ON(usb_led, USB_LED_COMPOSE)) {
|
||||
writePinLow(B3);
|
||||
} else {
|
||||
writePinHigh(B3);
|
||||
}
|
||||
if (IS_LED_ON(usb_led, USB_LED_KANA)) {
|
||||
writePinLow(B4);
|
||||
} else {
|
||||
writePinHigh(B4);
|
||||
bool led_update_kb(led_t led_state) {
|
||||
if(led_update_user(led_state)) {
|
||||
if (led_state.num_lock) {
|
||||
writePinLow(B0);
|
||||
} else {
|
||||
writePinHigh(B0);
|
||||
}
|
||||
if (led_state.caps_lock) {
|
||||
writePinLow(B1);
|
||||
} else {
|
||||
writePinHigh(B1);
|
||||
}
|
||||
if (led_state.scroll_lock) {
|
||||
writePinLow(B2);
|
||||
} else {
|
||||
writePinHigh(B2);
|
||||
}
|
||||
if (led_state.compose) {
|
||||
writePinLow(B3);
|
||||
} else {
|
||||
writePinHigh(B3);
|
||||
}
|
||||
if (led_state.kana) {
|
||||
writePinLow(B4);
|
||||
} else {
|
||||
writePinHigh(B4);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### `led_set_*` Function Documentation
|
||||
### Example `led_update_user()` Implementation
|
||||
|
||||
* Keyboard/Revision: `void led_set_kb(uint8_t usb_led)`
|
||||
* Keymap: `void led_set_user(uint8_t usb_led)`
|
||||
```c
|
||||
bool led_update_user(led_t led_state) {
|
||||
if (led_state.num_lock) {
|
||||
writePinLow(B0);
|
||||
} else {
|
||||
writePinHigh(B0);
|
||||
}
|
||||
if (led_state.caps_lock) {
|
||||
writePinLow(B1);
|
||||
} else {
|
||||
writePinHigh(B1);
|
||||
}
|
||||
if (led_state.scroll_lock) {
|
||||
writePinLow(B2);
|
||||
} else {
|
||||
writePinHigh(B2);
|
||||
}
|
||||
if (led_state.compose) {
|
||||
writePinLow(B3);
|
||||
} else {
|
||||
writePinHigh(B3);
|
||||
}
|
||||
if (led_state.kana) {
|
||||
writePinLow(B4);
|
||||
} else {
|
||||
writePinHigh(B4);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
## `host_keyboard_leds()`
|
||||
### `led_update_*` Function Documentation
|
||||
|
||||
Call this function to get the last received LED state. This is useful for reading the LED state outside `led_set_*`, e.g. in [`matrix_scan_user()`](#matrix-scanning-code).
|
||||
For convenience, you can use the `IS_HOST_LED_ON(led_name)` and `IS_HOST_LED_OFF(led_name)` macros instead of calling and checking `host_keyboard_leds()` directly.
|
||||
* Keyboard/Revision: `bool led_update_kb(led_t led_state)`
|
||||
* Keymap: `bool led_update_user(led_t led_state)`
|
||||
|
||||
## `host_keyboard_led_state()`
|
||||
|
||||
Call this function to get the last received LED state as a `led_t`. This is useful for reading the LED state outside `led_update_*`, e.g. in [`matrix_scan_user()`](#matrix-scanning-code).
|
||||
|
||||
## Setting Physical LED State
|
||||
|
||||
|
@@ -4,51 +4,45 @@ QMK supports temporary macros created on the fly. We call these Dynamic Macros.
|
||||
|
||||
You can store one or two macros and they may have a combined total of 128 keypresses. You can increase this size at the cost of RAM.
|
||||
|
||||
To enable them, first add a new element to the end of your `keycodes` enum — `DYNAMIC_MACRO_RANGE`:
|
||||
To enable them, first include `DYNAMIC_MACRO_ENABLE = yes` in your `rules.mk`. Then, add the following keys to your keymap:
|
||||
|
||||
```c
|
||||
enum keycodes {
|
||||
QWERTY = SAFE_RANGE,
|
||||
COLEMAK,
|
||||
DVORAK,
|
||||
PLOVER,
|
||||
LOWER,
|
||||
RAISE,
|
||||
BACKLIT,
|
||||
EXT_PLV,
|
||||
DYNAMIC_MACRO_RANGE,
|
||||
};
|
||||
```
|
||||
|Key |Alias |Description |
|
||||
|------------------|----------|---------------------------------------------------|
|
||||
|`DYN_REC_START1` |`DM_REC1` |Start recording Macro 1 |
|
||||
|`DYN_REC_START2` |`DM_REC2` |Start recording Macro 2 |
|
||||
|`DYN_MACRO_PLAY1` |`DM_PLY1` |Replay Macro 1 |
|
||||
|`DYN_MACRO_PLAY2` |`DM_PLY2` |Replay Macro 2 |
|
||||
|`DYN_REC_STOP` |`DM_RSTP` |Finish the macro that is currently being recorded. |
|
||||
|
||||
Your `keycodes` enum may have a slightly different name. You must add `DYNAMIC_MACRO_RANGE` as the last element because `dynamic_macros.h` will add some more keycodes after it.
|
||||
That should be everything necessary.
|
||||
|
||||
Below it, include the `dynamic_macro.h` header:
|
||||
To start recording the macro, press either `DYN_REC_START1` or `DYN_REC_START2`.
|
||||
|
||||
```c
|
||||
#include "dynamic_macro.h"`
|
||||
```
|
||||
To finish the recording, press the `DYN_REC_STOP` layer button.
|
||||
|
||||
Add the following keys to your keymap:
|
||||
To replay the macro, press either `DYN_MACRO_PLAY1` or `DYN_MACRO_PLAY2`.
|
||||
|
||||
* `DYN_REC_START1` — start recording the macro 1,
|
||||
* `DYN_REC_START2` — start recording the macro 2,
|
||||
* `DYN_MACRO_PLAY1` — replay the macro 1,
|
||||
* `DYN_MACRO_PLAY2` — replay the macro 2,
|
||||
* `DYN_REC_STOP` — finish the macro that is currently being recorded.
|
||||
It is possible to replay a macro as part of a macro. It's ok to replay macro 2 while recording macro 1 and vice versa but never create recursive macros i.e. macro 1 that replays macro 1. If you do so and the keyboard will get unresponsive, unplug the keyboard and plug it again. You can disable this completly by defining `DYNAMIC_MACRO_NO_NESTING` in your `config.h` file.
|
||||
|
||||
Add the following code to the very beginning of your `process_record_user()` function:
|
||||
?> For the details about the internals of the dynamic macros, please read the comments in the `process_dynamic_macro.h` and `process_dynamic_macro.c` files.
|
||||
|
||||
```c
|
||||
if (!process_record_dynamic_macro(keycode, record)) {
|
||||
return false;
|
||||
}
|
||||
```
|
||||
## Customization
|
||||
|
||||
That should be everything necessary. To start recording the macro, press either `DYN_REC_START1` or `DYN_REC_START2`. To finish the recording, press the `DYN_REC_STOP` layer button. To replay the macro, press either `DYN_MACRO_PLAY1` or `DYN_MACRO_PLAY2`.
|
||||
There are a number of options added that should allow some additional degree of customization
|
||||
|
||||
Note that it's possible to replay a macro as part of a macro. It's ok to replay macro 2 while recording macro 1 and vice versa but never create recursive macros i.e. macro 1 that replays macro 1. If you do so and the keyboard will get unresponsive, unplug the keyboard and plug it again.
|
||||
|Define |Default |Description |
|
||||
|----------------------------|----------------|-----------------------------------------------------------------------------------------------------------------|
|
||||
|`DYNAMIC_MACRO_SIZE` |128 |Sets the amount of memory that Dynamic Macros can use. This is a limited resource, dependent on the controller. |
|
||||
|`DYNAMIC_MACRO_USER_CALL` |*Not defined* |Defining this falls back to using the user `keymap.c` file to trigger the macro behavior. |
|
||||
|`DYNAMIC_MACRO_NO_NESTING` |*Not Defined* |Defining this disables the ability to call a macro from another macro (nested macros). |
|
||||
|
||||
For users of the earlier versions of dynamic macros: It is still possible to finish the macro recording using just the layer modifier used to access the dynamic macro keys, without a dedicated `DYN_REC_STOP` key. If you want this behavior back, use the following snippet instead of the one above:
|
||||
|
||||
If the LEDs start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by adding the `DYNAMIC_MACRO_SIZE` define in your `config.h` (default value: 128; please read the comments for it in the header).
|
||||
|
||||
|
||||
### DYNAMIC_MACRO_USER_CALL
|
||||
|
||||
For users of the earlier versions of dynamic macros: It is still possible to finish the macro recording using just the layer modifier used to access the dynamic macro keys, without a dedicated `DYN_REC_STOP` key. If you want this behavior back, add `#define DYNAMIC_MACRO_USER_CALL` to your `config.h` and insert the following snippet at the beginning of your `process_record_user()` function:
|
||||
|
||||
```c
|
||||
uint16_t macro_kc = (keycode == MO(_DYN) ? DYN_REC_STOP : keycode);
|
||||
@@ -58,6 +52,15 @@ For users of the earlier versions of dynamic macros: It is still possible to fin
|
||||
}
|
||||
```
|
||||
|
||||
If the LEDs start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by setting the `DYNAMIC_MACRO_SIZE` preprocessor macro (default value: 128; please read the comments for it in the header).
|
||||
### User Hooks
|
||||
|
||||
For the details about the internals of the dynamic macros, please read the comments in the `dynamic_macro.h` header.
|
||||
There are a number of hooks that you can use to add custom functionality and feedback options to Dynamic Macro feature. This allows for some additional degree of customization.
|
||||
|
||||
Note, that direction indicates which macro it is, with `1` being Macro 1, `-1` being Macro 2, and 0 being no macro.
|
||||
|
||||
* `dynamic_macro_record_start_user(void)` - Triggered when you start recording a macro.
|
||||
* `dynamic_macro_play_user(int8_t direction)` - Triggered when you play back a macro.
|
||||
* `dynamic_macro_record_key_user(int8_t direction, keyrecord_t *record)` - Triggered on each keypress while recording a macro.
|
||||
* `dynamic_macro_record_end_user(int8_t direction)` - Triggered when the macro recording is stopped.
|
||||
|
||||
Additionally, you can call `dynamic_macro_led_blink()` to flash the backlights if that feature is enabled.
|
||||
|
@@ -229,6 +229,12 @@ void oled_write_P(const char *data, bool invert);
|
||||
// Remapped to call 'void oled_write_ln(const char *data, bool invert);' on ARM
|
||||
void oled_write_ln_P(const char *data, bool invert);
|
||||
|
||||
// Writes a string to the buffer at current cursor position
|
||||
void oled_write_raw(const char *data, uint16_t size);
|
||||
|
||||
// Writes a PROGMEM string to the buffer at current cursor position
|
||||
void oled_write_raw_P(const char *data, uint16_t size);
|
||||
|
||||
// Can be used to manually turn on the screen if it is off
|
||||
// Returns true if the screen was on or turns on
|
||||
bool oled_on(void);
|
||||
|
@@ -107,7 +107,7 @@ Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](
|
||||
|
||||
---
|
||||
|
||||
### WS2812 (AVR only)
|
||||
### WS2812
|
||||
|
||||
There is basic support for addressable RGB matrix lighting with a WS2811/WS2812{a,b,c} addressable LED strand. To enable it, add this to your `rules.mk`:
|
||||
|
||||
|
@@ -6,7 +6,7 @@ QMK has the ability to control RGB LEDs attached to your keyboard. This is commo
|
||||
|
||||
Some keyboards come with RGB LEDs preinstalled. Others must have them installed after the fact. See the [Hardware Modification](#hardware-modification) section for information on adding RGB lighting to your keyboard.
|
||||
|
||||
Currently QMK supports the following addressable LEDs on AVR microcontrollers (however, the white LED in RGBW variants is not supported):
|
||||
Currently QMK supports the following addressable LEDs (however, the white LED in RGBW variants is not supported):
|
||||
|
||||
* WS2811, WS2812, WS2812B, WS2812C, etc.
|
||||
* SK6812, SK6812MINI, SK6805
|
||||
|
@@ -22,7 +22,7 @@ Support for SSD1306 based OLED displays. For more information see the [OLED Driv
|
||||
|
||||
You can make use of uGFX within QMK to drive character and graphic LCDs, LED arrays, OLED, TFT, and other display technologies. This needs to be better documented, if you are trying to do this and reading the code doesn't help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) and we can help you through the process.
|
||||
|
||||
## WS2812 (AVR Only)
|
||||
## WS2812
|
||||
|
||||
Support for WS2811/WS2812{a,b,c} LED's. For more information see the [RGB Light](feature_rgblight.md) page.
|
||||
|
||||
|
@@ -297,6 +297,16 @@ This is a reference only. Each group of keys links to the page documenting their
|
||||
|`OUT_USB` |USB only |
|
||||
|`OUT_BT` |Bluetooth only |
|
||||
|
||||
## [Dynamic Macros](feature_dynamic_macros.md)
|
||||
|
||||
|Key |Alias |Description |
|
||||
|-----------------|---------|--------------------------------------------------|
|
||||
|`DYN_REC_START1` |`DM_REC1`|Start recording Macro 1 |
|
||||
|`DYN_REC_START2` |`DM_REC2`|Start recording Macro 2 |
|
||||
|`DYN_MACRO_PLAY1`|`DM_PLY1`|Replay Macro 1 |
|
||||
|`DYN_MACRO_PLAY2`|`DM_PLY2`|Replay Macro 2 |
|
||||
|`DYN_REC_STOP` |`DM_RSTP`|Finish the macro that is currently being recorded.|
|
||||
|
||||
## [Layer Switching](feature_advanced_keycodes.md#switching-and-toggling-layers)
|
||||
|
||||
|Key |Description |
|
||||
|
15
docs/ru-ru/getting_started_getting_help.md
Normal file
15
docs/ru-ru/getting_started_getting_help.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Получение помощи
|
||||
|
||||
Существует много ресурсов для получения помощи по работе с QMK.
|
||||
|
||||
## Чат в реальном времени
|
||||
|
||||
Вы можете найти разработчиков и пользователей QMK на нашем главном [сервере Discord](https://discord.gg/Uq7gcHh). На сервере есть специальные каналы для разговоров о прошивке, Toolbox, оборудовании и конфигураторе.
|
||||
|
||||
## OLKB Сабреддит
|
||||
|
||||
Официальный форум QMK [/r/olkb](https://reddit.com/r/olkb) на [reddit.com](https://reddit.com).
|
||||
|
||||
## GitHub ишью
|
||||
|
||||
Вы можете открыть [ишью на GitHub](https://github.com/qmk/qmk_firmware/issues). Это особенно удобно, когда ваша проблема потребует длительного обсуждения или отладки.
|
@@ -1,13 +1,22 @@
|
||||
# WS2812 Driver
|
||||
This driver powers the [RGB Lighting](feature_rgblight.md) and [RGB Matrix](feature_rgb_matrix.md) features.
|
||||
|
||||
Currently QMK supports the following addressable LEDs on AVR microcontrollers (however, the white LED in RGBW variants is not supported):
|
||||
Currently QMK supports the following addressable LEDs (however, the white LED in RGBW variants is not supported):
|
||||
|
||||
WS2811, WS2812, WS2812B, WS2812C, etc.
|
||||
SK6812, SK6812MINI, SK6805
|
||||
|
||||
These LEDs are called "addressable" because instead of using a wire per color, each LED contains a small microchip that understands a special protocol sent over a single wire. The chip passes on the remaining data to the next LED, allowing them to be chained together. In this way, you can easily control the color of the individual LEDs.
|
||||
|
||||
## Supported Driver Types
|
||||
|
||||
| | AVR | ARM |
|
||||
|----------|--------------------|--------------------|
|
||||
| bit bang | :heavy_check_mark: | :heavy_check_mark: |
|
||||
| I2C | :heavy_check_mark: | |
|
||||
| SPI | | Soon™ |
|
||||
| PWM | | Soon™ |
|
||||
|
||||
## Driver configuration
|
||||
|
||||
### Bitbang
|
||||
@@ -17,7 +26,7 @@ Default driver, the absence of configuration assumes this driver. To configure i
|
||||
WS2812_DRIVER = bitbang
|
||||
```
|
||||
|
||||
!> ARM does not yet support WS2182. Progress is being made, but we are not quite there, yet.
|
||||
!> This driver is not hardware accelerated and may not be performant on heavily loaded systems.
|
||||
|
||||
### I2C
|
||||
Targeting boards where WS2812 support is offloaded to a 2nd MCU. Currently the driver is limited to AVR given the known consumers are ps2avrGB/BMC. To configure it, add this to your rules.mk:
|
||||
|
@@ -1,9 +1,9 @@
|
||||
/* Copyright 2018 Jack Humbert
|
||||
* Copyright 2018 Yiancar
|
||||
*
|
||||
* This program is free sofare: you can redistribute it and/or modify
|
||||
* 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 Sofare Foundation, either version 2 of the License, or
|
||||
* 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,
|
||||
|
@@ -1 +1,100 @@
|
||||
#error("NOT SUPPORTED")
|
||||
#include "quantum.h"
|
||||
#include "ws2812.h"
|
||||
#include "ch.h"
|
||||
#include "hal.h"
|
||||
|
||||
/* Adapted from https://github.com/bigjosh/SimpleNeoPixelDemo/ */
|
||||
|
||||
#ifndef NOP_FUDGE
|
||||
# if defined(STM32F1XX) || defined(STM32F1xx) || defined(STM32F0XX) || defined(STM32F0xx) || defined(STM32F3XX) || defined(STM32F3xx) || defined(STM32L0XX) || defined(STM32L0xx)
|
||||
# define NOP_FUDGE 0.4
|
||||
# else
|
||||
# error("NOP_FUDGE configuration required")
|
||||
# define NOP_FUDGE 1 // this just pleases the compile so the above error is easier to spot
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#define NUMBER_NOPS 6
|
||||
#define CYCLES_PER_SEC (STM32_SYSCLK / NUMBER_NOPS * NOP_FUDGE)
|
||||
#define NS_PER_SEC (1000000000L) // Note that this has to be SIGNED since we want to be able to check for negative values of derivatives
|
||||
#define NS_PER_CYCLE (NS_PER_SEC / CYCLES_PER_SEC)
|
||||
#define NS_TO_CYCLES(n) ((n) / NS_PER_CYCLE)
|
||||
|
||||
#define wait_ns(x) \
|
||||
do { \
|
||||
for (int i = 0; i < NS_TO_CYCLES(x); i++) { \
|
||||
__asm__ volatile("nop\n\t" \
|
||||
"nop\n\t" \
|
||||
"nop\n\t" \
|
||||
"nop\n\t" \
|
||||
"nop\n\t" \
|
||||
"nop\n\t"); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
// These are the timing constraints taken mostly from the WS2812 datasheets
|
||||
// These are chosen to be conservative and avoid problems rather than for maximum throughput
|
||||
|
||||
#define T1H 900 // Width of a 1 bit in ns
|
||||
#define T1L (1250 - T1H) // Width of a 1 bit in ns
|
||||
|
||||
#define T0H 350 // Width of a 0 bit in ns
|
||||
#define T0L (1250 - T0H) // Width of a 0 bit in ns
|
||||
|
||||
// The reset gap can be 6000 ns, but depending on the LED strip it may have to be increased
|
||||
// to values like 600000 ns. If it is too small, the pixels will show nothing most of the time.
|
||||
#define RES 10000 // Width of the low gap between bits to cause a frame to latch
|
||||
|
||||
void sendByte(uint8_t byte) {
|
||||
// WS2812 protocol wants most significant bits first
|
||||
for (unsigned char bit = 0; bit < 8; bit++) {
|
||||
bool is_one = byte & (1 << (7 - bit));
|
||||
// using something like wait_ns(is_one ? T1L : T0L) here throws off timings
|
||||
if (is_one) {
|
||||
// 1
|
||||
writePinHigh(RGB_DI_PIN);
|
||||
wait_ns(T1H);
|
||||
writePinLow(RGB_DI_PIN);
|
||||
wait_ns(T1L);
|
||||
} else {
|
||||
// 0
|
||||
writePinHigh(RGB_DI_PIN);
|
||||
wait_ns(T0H);
|
||||
writePinLow(RGB_DI_PIN);
|
||||
wait_ns(T0L);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ws2812_init(void) { setPinOutput(RGB_DI_PIN); }
|
||||
|
||||
// Setleds for standard RGB
|
||||
void ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) {
|
||||
static bool s_init = false;
|
||||
if (!s_init) {
|
||||
ws2812_init();
|
||||
s_init = true;
|
||||
}
|
||||
|
||||
// this code is very time dependent, so we need to disable interrupts
|
||||
chSysLock();
|
||||
|
||||
for (uint8_t i = 0; i < leds; i++) {
|
||||
// WS2812 protocol dictates grb order
|
||||
sendByte(ledarray[i].g);
|
||||
sendByte(ledarray[i].r);
|
||||
sendByte(ledarray[i].b);
|
||||
}
|
||||
|
||||
wait_ns(RES);
|
||||
|
||||
chSysUnlock();
|
||||
}
|
||||
|
||||
// Setleds for SK6812RGBW
|
||||
void ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t leds) {
|
||||
// not supported - for now error out if its enabled
|
||||
#ifdef RGBW
|
||||
# error "RGBW not supported"
|
||||
#endif
|
||||
}
|
||||
|
17
drivers/arm/ws2812.h
Normal file
17
drivers/arm/ws2812.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
#include "quantum/color.h"
|
||||
|
||||
/* User Interface
|
||||
*
|
||||
* Input:
|
||||
* ledarray: An array of GRB data describing the LED colors
|
||||
* number_of_leds: The number of LEDs to write
|
||||
*
|
||||
* The functions will perform the following actions:
|
||||
* - Set the data-out pin as output
|
||||
* - Send out the LED data
|
||||
* - Wait 50<35>s to reset the LEDs
|
||||
*/
|
||||
void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds);
|
||||
void ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds);
|
@@ -431,6 +431,15 @@ void oled_write_ln(const char *data, bool invert) {
|
||||
oled_advance_page(true);
|
||||
}
|
||||
|
||||
void oled_write_raw(const char *data, uint16_t size) {
|
||||
if (size > OLED_MATRIX_SIZE) size = OLED_MATRIX_SIZE;
|
||||
for (uint16_t i = 0; i < size; i++) {
|
||||
if (oled_buffer[i] == data[i]) continue;
|
||||
oled_buffer[i] = data[i];
|
||||
oled_dirty |= (1 << (i / OLED_BLOCK_SIZE));
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(__AVR__)
|
||||
void oled_write_P(const char *data, bool invert) {
|
||||
uint8_t c = pgm_read_byte(data);
|
||||
@@ -444,6 +453,16 @@ void oled_write_ln_P(const char *data, bool invert) {
|
||||
oled_write_P(data, invert);
|
||||
oled_advance_page(true);
|
||||
}
|
||||
|
||||
void oled_write_raw_P(const char *data, uint16_t size) {
|
||||
if (size > OLED_MATRIX_SIZE) size = OLED_MATRIX_SIZE;
|
||||
for (uint16_t i = 0; i < size; i++) {
|
||||
uint8_t c = pgm_read_byte(++data);
|
||||
if (oled_buffer[i] == c) continue;
|
||||
oled_buffer[i] = c;
|
||||
oled_dirty |= (1 << (i / OLED_BLOCK_SIZE));
|
||||
}
|
||||
}
|
||||
#endif // defined(__AVR__)
|
||||
|
||||
bool oled_on(void) {
|
||||
@@ -566,4 +585,4 @@ void oled_task(void) {
|
||||
#endif
|
||||
}
|
||||
|
||||
__attribute__((weak)) void oled_task_user(void) {}
|
||||
__attribute__((weak)) void oled_task_user(void) {}
|
@@ -200,6 +200,8 @@ void oled_write(const char *data, bool invert);
|
||||
// Advances the cursor to the next page, wiring ' ' to the remainder of the current page
|
||||
void oled_write_ln(const char *data, bool invert);
|
||||
|
||||
void oled_write_raw(const char *data, uint16_t size);
|
||||
|
||||
#if defined(__AVR__)
|
||||
// Writes a PROGMEM string to the buffer at current cursor position
|
||||
// Advances the cursor while writing, inverts the pixels if true
|
||||
@@ -211,6 +213,8 @@ void oled_write_P(const char *data, bool invert);
|
||||
// Advances the cursor to the next page, wiring ' ' to the remainder of the current page
|
||||
// Remapped to call 'void oled_write_ln(const char *data, bool invert);' on ARM
|
||||
void oled_write_ln_P(const char *data, bool invert);
|
||||
|
||||
void oled_write_raw_P(const char *data, uint16_t size);
|
||||
#else
|
||||
// Writes a string to the buffer at current cursor position
|
||||
// Advances the cursor while writing, inverts the pixels if true
|
||||
@@ -254,4 +258,4 @@ bool oled_scroll_off(void);
|
||||
uint8_t oled_max_chars(void);
|
||||
|
||||
// Returns the maximum number of lines that will fit on the oled
|
||||
uint8_t oled_max_lines(void);
|
||||
uint8_t oled_max_lines(void);
|
@@ -17,7 +17,6 @@
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include "serial.h"
|
||||
//#include <pro_micro.h>
|
||||
|
||||
#ifdef SOFT_SERIAL_PIN
|
||||
|
||||
|
@@ -17,50 +17,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "ares.h"
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
|
||||
#include <string.h>
|
||||
#include "i2c_master.h"
|
||||
#include "rgblight.h"
|
||||
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
void matrix_init_kb(void) {
|
||||
i2c_init();
|
||||
// call user level keymaps, if any
|
||||
matrix_init_user();
|
||||
}
|
||||
|
||||
// custom RGB driver
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
memset(led, 0, 3 * RGBLED_NUM);
|
||||
}
|
||||
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
|
||||
bool rgb_init = false;
|
||||
|
||||
void matrix_scan_kb(void) {
|
||||
// if LEDs were previously on before poweroff, turn them back on
|
||||
if (rgb_init == false && rgblight_config.enable) {
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
rgb_init = true;
|
||||
}
|
||||
|
||||
rgblight_task();
|
||||
matrix_scan_user();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
void backlight_init_ports(void) {
|
||||
setPinOutput(D0);
|
||||
setPinOutput(D1);
|
||||
setPinOutput(D4);
|
||||
setPinOutput(D6);
|
||||
setPinOutput(D0);
|
||||
setPinOutput(D1);
|
||||
setPinOutput(D4);
|
||||
setPinOutput(D6);
|
||||
}
|
||||
|
||||
void backlight_set(uint8_t level) {
|
||||
@@ -79,29 +41,3 @@ void backlight_set(uint8_t level) {
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Optional override functions below.
|
||||
// You can leave any or all of these undefined.
|
||||
// These are only required if you want to perform custom actions.
|
||||
|
||||
/*
|
||||
void matrix_init_kb(void) {
|
||||
// put your keyboard start-up code here
|
||||
// runs once when the firmware starts up
|
||||
matrix_init_user();
|
||||
}
|
||||
void matrix_scan_kb(void) {
|
||||
// put your looping keyboard code here
|
||||
// runs every cycle (a lot)
|
||||
matrix_scan_user();
|
||||
}
|
||||
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||
// put your per-action keyboard code here
|
||||
// runs for every action, just before processing by the firmware
|
||||
return process_record_user(keycode, record);
|
||||
}
|
||||
void led_set_kb(uint8_t usb_led) {
|
||||
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
|
||||
led_set_user(usb_led);
|
||||
}
|
||||
*/
|
@@ -1,18 +1,3 @@
|
||||
# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32a
|
||||
|
||||
@@ -34,8 +19,6 @@ CONSOLE_ENABLE = yes
|
||||
COMMAND_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = no
|
||||
RGBLIGHT_ENABLE = no
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
WS2812_DRIVER = i2c
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
SRC += i2c_master.c
|
||||
|
@@ -16,51 +16,34 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "bfake.h"
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
#include "backlight.h"
|
||||
#endif
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
#include "rgblight.h"
|
||||
#endif
|
||||
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
#include "action_layer.h"
|
||||
#include "i2c.h"
|
||||
#include "quantum.h"
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_init();
|
||||
i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM);
|
||||
}
|
||||
#endif
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {
|
||||
}
|
||||
void matrix_scan_user(void) {}
|
||||
|
||||
void backlight_init_ports(void) {
|
||||
DDRD |= (1<<0 | 1<<1 | 1<<4 | 1<<6);
|
||||
PORTD &= ~(1<<0 | 1<<1 | 1<<4 | 1<<6);
|
||||
setPinOutput(D0);
|
||||
setPinOutput(D1);
|
||||
setPinOutput(D4);
|
||||
setPinOutput(D6);
|
||||
|
||||
writePinLow(D0);
|
||||
writePinLow(D1);
|
||||
writePinLow(D4);
|
||||
writePinLow(D6);
|
||||
}
|
||||
|
||||
void backlight_set(uint8_t level) {
|
||||
if (level == 0) {
|
||||
// Turn out the lights
|
||||
PORTD &= ~(1<<0 | 1<<1 | 1<<4 | 1<<6);
|
||||
writePinLow(D0);
|
||||
writePinLow(D1);
|
||||
writePinLow(D4);
|
||||
writePinLow(D6);
|
||||
} else {
|
||||
// Turn on the lights
|
||||
PORTD |= (1<<0 | 1<<1 | 1<<4 | 1<<6);
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
writePinHigh(D6);
|
||||
}
|
||||
}
|
||||
|
@@ -1,106 +0,0 @@
|
||||
/*
|
||||
Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// Please do not modify this file
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <util/twi.h>
|
||||
|
||||
#include "i2c.h"
|
||||
|
||||
void i2c_set_bitrate(uint16_t bitrate_khz) {
|
||||
uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz);
|
||||
if (bitrate_div >= 16) {
|
||||
bitrate_div = (bitrate_div - 16) / 2;
|
||||
}
|
||||
TWBR = bitrate_div;
|
||||
}
|
||||
|
||||
void i2c_init(void) {
|
||||
// set pull-up resistors on I2C bus pins
|
||||
PORTC |= 0b11;
|
||||
|
||||
i2c_set_bitrate(400);
|
||||
|
||||
// enable TWI (two-wire interface)
|
||||
TWCR |= (1 << TWEN);
|
||||
|
||||
// enable TWI interrupt and slave address ACK
|
||||
TWCR |= (1 << TWIE);
|
||||
TWCR |= (1 << TWEA);
|
||||
}
|
||||
|
||||
uint8_t i2c_start(uint8_t address) {
|
||||
// reset TWI control register
|
||||
TWCR = 0;
|
||||
|
||||
// begin transmission and wait for it to end
|
||||
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
|
||||
while (!(TWCR & (1<<TWINT)));
|
||||
|
||||
// check if the start condition was successfully transmitted
|
||||
if ((TWSR & 0xF8) != TW_START) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// transmit address and wait
|
||||
TWDR = address;
|
||||
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||
while (!(TWCR & (1<<TWINT)));
|
||||
|
||||
// check if the device has acknowledged the READ / WRITE mode
|
||||
uint8_t twst = TW_STATUS & 0xF8;
|
||||
if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void i2c_stop(void) {
|
||||
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
|
||||
}
|
||||
|
||||
uint8_t i2c_write(uint8_t data) {
|
||||
TWDR = data;
|
||||
|
||||
// transmit data and wait
|
||||
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||
while (!(TWCR & (1<<TWINT)));
|
||||
|
||||
if ((TWSR & 0xF8) != TW_MT_DATA_ACK) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length) {
|
||||
if (i2c_start(address)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (uint16_t i = 0; i < length; i++) {
|
||||
if (i2c_write(data[i])) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_stop();
|
||||
|
||||
return 0;
|
||||
}
|
@@ -1,27 +0,0 @@
|
||||
/*
|
||||
Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// Please do not modify this file
|
||||
|
||||
#ifndef __I2C_H__
|
||||
#define __I2C_H__
|
||||
|
||||
void i2c_init(void);
|
||||
void i2c_set_bitrate(uint16_t bitrate_khz);
|
||||
uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length);
|
||||
|
||||
#endif
|
@@ -1,18 +1,3 @@
|
||||
# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32a
|
||||
|
||||
@@ -34,10 +19,10 @@ CONSOLE_ENABLE = yes
|
||||
COMMAND_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = no
|
||||
RGBLIGHT_ENABLE = no
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
WS2812_DRIVER = i2c
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
# custom matrix setup
|
||||
CUSTOM_MATRIX = yes
|
||||
SRC = matrix.c i2c.c
|
||||
SRC = matrix.c
|
||||
|
@@ -17,7 +17,6 @@
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include "serial.h"
|
||||
//#include <pro_micro.h>
|
||||
|
||||
#ifdef SOFT_SERIAL_PIN
|
||||
|
||||
|
@@ -1,9 +1,3 @@
|
||||
RGB_MATRIX_SPLIT_RIGHT = no # if no, order LEDs for left hand, if yes, order LEDs for right hand
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_SPLIT_RIGHT)), yes)
|
||||
OPT_DEFS += -DRGB_MATRIX_SPLIT_RIGHT
|
||||
endif
|
||||
|
||||
SRC += matrix.c \
|
||||
split_util.c \
|
||||
split_scomm.c
|
||||
|
@@ -17,7 +17,6 @@
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include "serial.h"
|
||||
//#include <pro_micro.h>
|
||||
|
||||
#ifdef SOFT_SERIAL_PIN
|
||||
|
||||
|
@@ -13,62 +13,9 @@
|
||||
* 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 "budget96.h"
|
||||
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
#include "backlight.h"
|
||||
#endif
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
#include "rgblight.h"
|
||||
#endif
|
||||
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
#include "action_layer.h"
|
||||
#include "i2c_master.h"
|
||||
#include "quantum.h"
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {
|
||||
}
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_init();
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
#endif
|
||||
|
||||
void matrix_init_kb(void) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
if (rgblight_config.enable) {
|
||||
i2c_init();
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
#endif
|
||||
// call user level keymaps, if any
|
||||
matrix_init_user();
|
||||
}
|
||||
|
||||
void matrix_scan_kb(void) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
rgblight_task();
|
||||
#endif
|
||||
matrix_scan_user();
|
||||
/* Nothing else for now. */
|
||||
}
|
||||
|
||||
|
||||
void backlight_init_ports(void) {
|
||||
// initialize pins D0, D1, D4 and D6 as output
|
||||
setPinOutput(D0);
|
||||
@@ -76,25 +23,25 @@ void backlight_init_ports(void) {
|
||||
setPinOutput(D4);
|
||||
setPinOutput(D6);
|
||||
|
||||
// turn RGB LEDs on
|
||||
// turn backlight LEDs on
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
writePinHigh(D6);
|
||||
}
|
||||
|
||||
void backlight_set(uint8_t level) {
|
||||
if (level == 0) {
|
||||
// turn RGB LEDs off
|
||||
void backlight_set(uint8_t level) {
|
||||
if (level == 0) {
|
||||
// turn backlight LEDs off
|
||||
writePinLow(D0);
|
||||
writePinLow(D1);
|
||||
writePinLow(D4);
|
||||
writePinLow(D6);
|
||||
} else {
|
||||
// turn RGB LEDs on
|
||||
} else {
|
||||
// turn backlight LEDs on
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
writePinHigh(D6);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,18 +1,3 @@
|
||||
# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32a
|
||||
|
||||
@@ -34,9 +19,6 @@ CONSOLE_ENABLE = yes
|
||||
COMMAND_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = yes
|
||||
RGBLIGHT_ENABLE = yes
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
WS2812_DRIVER = i2c
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
# custom matrix setup
|
||||
SRC = i2c_master.c
|
||||
|
0
keyboards/ergodox_ez/util/compile_keymap.py
Normal file → Executable file
0
keyboards/ergodox_ez/util/compile_keymap.py
Normal file → Executable file
8
keyboards/ergodox_ez/util/keymap_beautifier/Dockerfile
Normal file
8
keyboards/ergodox_ez/util/keymap_beautifier/Dockerfile
Normal file
@@ -0,0 +1,8 @@
|
||||
FROM python:3.7.4-alpine3.10
|
||||
|
||||
WORKDIR /usr/src/app
|
||||
COPY requirements.txt ./
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
COPY ./KeymapBeautifier.py ./KeymapBeautifier.py
|
||||
|
||||
CMD [ "python", "./KeymapBeautifier.py", "-h" ]
|
399
keyboards/ergodox_ez/util/keymap_beautifier/KeymapBeautifier.py
Executable file
399
keyboards/ergodox_ez/util/keymap_beautifier/KeymapBeautifier.py
Executable file
@@ -0,0 +1,399 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import argparse
|
||||
import pycparser
|
||||
import re
|
||||
|
||||
class KeymapBeautifier:
|
||||
justify_toward_center = False
|
||||
filename_in = None
|
||||
filename_out = None
|
||||
output_layout = None
|
||||
output = None
|
||||
|
||||
column_max_widths = {}
|
||||
|
||||
KEY_ALIASES = {
|
||||
"KC_TRANSPARENT": "_______",
|
||||
"KC_TRNS": "_______",
|
||||
"KC_NO": "XXXXXXX",
|
||||
}
|
||||
KEYMAP_START = 'const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {\n'
|
||||
KEYMAP_END = '};\n'
|
||||
KEYMAP_START_REPLACEMENT = "const int keymaps[]={\n"
|
||||
KEY_CHART = """
|
||||
/*
|
||||
* ,--------------------------------------------------. ,--------------------------------------------------.
|
||||
* | 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 |
|
||||
* |--------+------+------+------+------+------| 26 | | 58 |------+------+------+------+------+--------|
|
||||
* | 20 | 21 | 22 | 23 | 24 | 25 | | | | 59 | 60 | 61 | 62 | 63 | 64 |
|
||||
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|
||||
* | 27 | 28 | 29 | 30 | 31 | | 65 | 66 | 67 | 68 | 69 |
|
||||
* `----------------------------------' `----------------------------------'
|
||||
* ,-------------. ,-------------.
|
||||
* | 32 | 33 | | 70 | 71 |
|
||||
* ,------+------+------| |------+------+------.
|
||||
* | | | 34 | | 72 | | |
|
||||
* | 35 | 36 |------| |------| 74 | 75 |
|
||||
* | | | 37 | | 73 | | |
|
||||
* `--------------------' `--------------------'
|
||||
*/
|
||||
"""
|
||||
KEY_COORDINATES = {
|
||||
'LAYOUT_ergodox': [
|
||||
# left hand
|
||||
(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6),
|
||||
(1,0), (1,1), (1,2), (1,3), (1,4), (1,5), (1,6),
|
||||
(2,0), (2,1), (2,2), (2,3), (2,4), (2,5),
|
||||
(3,0), (3,1), (3,2), (3,3), (3,4), (3,5), (3,6),
|
||||
(4,0), (4,1), (4,2), (4,3), (4,4),
|
||||
# left thumb
|
||||
(5,5), (5,6),
|
||||
(6,6),
|
||||
(7,4), (7,5), (7,6),
|
||||
# right hand
|
||||
(8,0), (8,1), (8,2), (8,3), (8,4), (8,5), (8,6),
|
||||
(9,0), (9,1), (9,2), (9,3), (9,4), (9,5), (9,6),
|
||||
(10,1), (10,2), (10,3), (10,4), (10,5), (10,6),
|
||||
(11,0), (11,1), (11,2), (11,3), (11,4), (11,5), (11,6),
|
||||
(12,2), (12,3), (12,4), (12,5), (12,6),
|
||||
# right thumb
|
||||
(13,0), (13,1),
|
||||
(14,0),
|
||||
(15,0), (15,1), (15,2)
|
||||
],
|
||||
'LAYOUT_ergodox_pretty': [
|
||||
# left hand and right hand
|
||||
(0,0), (0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8), (0,9), (0,10), (0,11), (0,12), (0,13),
|
||||
(1,0), (1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (1,11), (1,12), (1,13),
|
||||
(2,0), (2,1), (2,2), (2,3), (2,4), (2,5), (2,8), (2,9), (2,10), (2,11), (2,12), (2,13),
|
||||
(3,0), (3,1), (3,2), (3,3), (3,4), (3,5), (3,6), (3,7), (3,8), (3,9), (3,10), (3,11), (3,12), (3,13),
|
||||
(4,0), (4,1), (4,2), (4,3), (4,4), (4,9), (4,10), (4,11), (4,12), (4,13),
|
||||
|
||||
# left thumb and right thumb
|
||||
(5,5), (5,6), (5,7), (5,8),
|
||||
(6,6), (6,7),
|
||||
(7,4), (7,5), (7,6), (7,7), (7,8), (7,9)
|
||||
],
|
||||
}
|
||||
current_converted_KEY_COORDINATES = []
|
||||
|
||||
# each column is aligned within each group (tuples of row indexes are inclusive)
|
||||
KEY_ROW_GROUPS = {
|
||||
'LAYOUT_ergodox': [(0,4),(5,7),(8,12),(13,15)],
|
||||
'LAYOUT_ergodox_pretty': [(0,7)],
|
||||
#'LAYOUT_ergodox_pretty': [(0,5),(6,7)],
|
||||
#'LAYOUT_ergodox_pretty': [(0,3),(4,4),(5,7)],
|
||||
#'LAYOUT_ergodox_pretty': [(0,4),(5,7)],
|
||||
}
|
||||
|
||||
|
||||
INDEX_CONVERSTION_LAYOUT_ergodox_pretty_to_LAYOUT_ergodox = [
|
||||
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,
|
||||
]
|
||||
|
||||
|
||||
def index_conversion_map_reversed(self, conversion_map):
|
||||
return [conversion_map.index(i) for i in range(len(conversion_map))]
|
||||
|
||||
|
||||
def __init__(self, source_code = "", output_layout="LAYOUT_ergodox", justify_toward_center = False):
|
||||
self.output_layout = output_layout
|
||||
self.justify_toward_center = justify_toward_center
|
||||
# determine the conversion map
|
||||
#if input_layout == self.output_layout:
|
||||
# conversion_map = [i for i in range(len(self.INDEX_CONVERSTION_LAYOUT_ergodox_pretty_to_LAYOUT_ergodox))]
|
||||
#conversion_map = self.INDEX_CONVERSTION_LAYOUT_ergodox_pretty_to_LAYOUT_ergodox
|
||||
if self.output_layout == "LAYOUT_ergodox_pretty":
|
||||
index_conversion_map = self.index_conversion_map_reversed(self.INDEX_CONVERSTION_LAYOUT_ergodox_pretty_to_LAYOUT_ergodox)
|
||||
else:
|
||||
index_conversion_map = list(range(len(self.INDEX_CONVERSTION_LAYOUT_ergodox_pretty_to_LAYOUT_ergodox)))
|
||||
self.current_converted_KEY_COORDINATES = [
|
||||
self.KEY_COORDINATES[self.output_layout][index_conversion_map[i]]
|
||||
for i in range(len(self.KEY_COORDINATES[self.output_layout]))
|
||||
]
|
||||
|
||||
self.output = self.beautify_source_code(source_code)
|
||||
|
||||
def beautify_source_code(self, source_code):
|
||||
# to keep it simple for the parser, we only use the parser to parse the key definition part
|
||||
src = {
|
||||
"before": [],
|
||||
"keys": [],
|
||||
"after": [],
|
||||
}
|
||||
|
||||
current_section = "before"
|
||||
for line in source_code.splitlines(True):
|
||||
if current_section == 'before' and line == self.KEYMAP_START:
|
||||
src[current_section].append("\n")
|
||||
current_section = 'keys'
|
||||
src[current_section].append(self.KEYMAP_START_REPLACEMENT)
|
||||
continue
|
||||
elif current_section == 'keys' and line == self.KEYMAP_END:
|
||||
src[current_section].append(self.KEYMAP_END)
|
||||
current_section = 'after'
|
||||
continue
|
||||
src[current_section].append(line)
|
||||
output_lines = src['before'] + self.beautify_keys_section("".join(src['keys'])) + src['after']
|
||||
return "".join(output_lines)
|
||||
|
||||
def beautify_keys_section(self, src):
|
||||
parsed = self.parser(src)
|
||||
layer_output = []
|
||||
|
||||
keymap = parsed.children()[0]
|
||||
layers = keymap[1]
|
||||
for layer in layers.init.exprs:
|
||||
input_layout = layer.expr.name.name
|
||||
|
||||
key_symbols = self.layer_expr(layer)
|
||||
# re-order keys from input_layout to regular layout
|
||||
if input_layout == "LAYOUT_ergodox_pretty":
|
||||
key_symbols = [key_symbols[i] for i in self.index_conversion_map_reversed(self.INDEX_CONVERSTION_LAYOUT_ergodox_pretty_to_LAYOUT_ergodox)]
|
||||
|
||||
padded_key_symbols = self.pad_key_symbols(key_symbols, input_layout)
|
||||
current_pretty_output_layer = self.pretty_output_layer(layer.name[0].value, padded_key_symbols)
|
||||
# strip trailing spaces from padding
|
||||
layer_output.append(re.sub(r" +\n", "\n", current_pretty_output_layer))
|
||||
|
||||
return [self.KEYMAP_START + "\n",
|
||||
self.KEY_CHART + "\n",
|
||||
",\n\n".join(layer_output) + "\n",
|
||||
self.KEYMAP_END + "\n"]
|
||||
|
||||
def get_row_group(self, row):
|
||||
for low, high in self.KEY_ROW_GROUPS[self.output_layout]:
|
||||
if low <= row <= high:
|
||||
return (low, high)
|
||||
raise Exception("Cannot find row groups in KEY_ROW_GROUPS")
|
||||
|
||||
|
||||
def calculate_column_max_widths(self, key_symbols):
|
||||
# calculate the max width for each column
|
||||
self.column_max_widths = {}
|
||||
for i in range(len(key_symbols)):
|
||||
row_index, column_index = self.current_converted_KEY_COORDINATES[i]
|
||||
row_group = self.get_row_group(row_index)
|
||||
if (row_group, column_index) in self.column_max_widths:
|
||||
self.column_max_widths[(row_group, column_index)] = max(self.column_max_widths[(row_group, column_index)], len(key_symbols[i]))
|
||||
else:
|
||||
self.column_max_widths[(row_group, column_index)] = len(key_symbols[i])
|
||||
|
||||
|
||||
def pad_key_symbols(self, key_symbols, input_layout, just='left'):
|
||||
self.calculate_column_max_widths(key_symbols)
|
||||
|
||||
padded_key_symbols = []
|
||||
# pad each key symbol
|
||||
for i in range(len(key_symbols)):
|
||||
key = key_symbols[i]
|
||||
# look up column coordinate to determine number of spaces to pad
|
||||
row_index, column_index = self.current_converted_KEY_COORDINATES[i]
|
||||
row_group = self.get_row_group(row_index)
|
||||
if just == 'left':
|
||||
padded_key_symbols.append(key.ljust(self.column_max_widths[(row_group, column_index)]))
|
||||
else:
|
||||
padded_key_symbols.append(key.rjust(self.column_max_widths[(row_group, column_index)]))
|
||||
return padded_key_symbols
|
||||
|
||||
|
||||
layer_keys_pointer = 0
|
||||
layer_keys = None
|
||||
def grab_next_n_columns(self, n_columns, input_layout, layer_keys = None, from_beginning = False):
|
||||
if layer_keys:
|
||||
self.layer_keys = layer_keys
|
||||
if from_beginning:
|
||||
self.layer_keys_pointer = 0
|
||||
|
||||
begin = self.layer_keys_pointer
|
||||
end = begin + n_columns
|
||||
return self.layer_keys[self.layer_keys_pointer-n_keys:self.layer_keys_pointer]
|
||||
|
||||
key_coordinates_counter = 0
|
||||
def get_padded_line(self, source_keys, key_from, key_to, just="left"):
|
||||
if just == "right":
|
||||
keys = [k.strip().rjust(len(k)) for k in source_keys[key_from:key_to]]
|
||||
else:
|
||||
keys = [k for k in source_keys[key_from:key_to]]
|
||||
|
||||
from_row, from_column = self.KEY_COORDINATES[self.output_layout][self.key_coordinates_counter]
|
||||
row_group = self.get_row_group(from_row)
|
||||
self.key_coordinates_counter += key_to - key_from
|
||||
columns_before_key_from = sorted([col for row, col in self.KEY_COORDINATES[self.output_layout] if row == from_row and col < from_column])
|
||||
# figure out which columns in this row needs padding; only pad empty columns to the right of an existing column
|
||||
columns_to_pad = { c: True for c in range(from_column) }
|
||||
if columns_before_key_from:
|
||||
for c in range(max(columns_before_key_from)+1):
|
||||
columns_to_pad[c] = False
|
||||
|
||||
# for rows with fewer columns that don't start with column 0, we need to insert leading spaces
|
||||
spaces = 0
|
||||
for c, v in columns_to_pad.items():
|
||||
if not v:
|
||||
continue
|
||||
if (row_group,c) in self.column_max_widths:
|
||||
spaces += self.column_max_widths[(row_group,c)] + len(", ")
|
||||
else:
|
||||
spaces += 0
|
||||
return " " * spaces + ", ".join(keys) + ","
|
||||
|
||||
def pretty_output_layer(self, layer, keys):
|
||||
self.key_coordinates_counter = 0
|
||||
if self.output_layout == "LAYOUT_ergodox":
|
||||
formatted_key_symbols = """
|
||||
// left hand
|
||||
|
||||
{}
|
||||
{}
|
||||
{}
|
||||
{}
|
||||
{}
|
||||
|
||||
// left thumb
|
||||
|
||||
{}
|
||||
{}
|
||||
{}
|
||||
|
||||
// right hand
|
||||
|
||||
{}
|
||||
{}
|
||||
{}
|
||||
{}
|
||||
{}
|
||||
|
||||
// right thumb
|
||||
|
||||
{}
|
||||
{}
|
||||
{}
|
||||
""".format(
|
||||
# left hand
|
||||
self.get_padded_line(keys, 0, 7, just="left"),
|
||||
self.get_padded_line(keys, 7, 14, just="left"),
|
||||
self.get_padded_line(keys, 14, 20, just="left"),
|
||||
self.get_padded_line(keys, 20, 27, just="left"),
|
||||
self.get_padded_line(keys, 27, 32, just="left"),
|
||||
# left thumb
|
||||
self.get_padded_line(keys, 32, 34, just="left"),
|
||||
self.get_padded_line(keys, 34, 35, just="left"),
|
||||
self.get_padded_line(keys, 35, 38, just="left"),
|
||||
# right hand
|
||||
self.get_padded_line(keys, 38, 45, just="left"),
|
||||
self.get_padded_line(keys, 45, 52, just="left"),
|
||||
self.get_padded_line(keys, 52, 58, just="left"),
|
||||
self.get_padded_line(keys, 58, 65, just="left"),
|
||||
self.get_padded_line(keys, 65, 70, just="left"),
|
||||
# right thumb
|
||||
self.get_padded_line(keys, 70, 72, just="left"),
|
||||
self.get_padded_line(keys, 72, 73, just="left"),
|
||||
self.get_padded_line(keys, 73, 76, just="left"),
|
||||
)
|
||||
elif self.output_layout == "LAYOUT_ergodox_pretty":
|
||||
left_half_justification = "right" if self.justify_toward_center else "left"
|
||||
formatted_key_symbols = """
|
||||
{} {}
|
||||
{} {}
|
||||
{} {}
|
||||
{} {}
|
||||
{} {}
|
||||
|
||||
{} {}
|
||||
{} {}
|
||||
{} {}
|
||||
""".format(
|
||||
self.get_padded_line(keys, 0, 7, just=left_half_justification), self.get_padded_line(keys, 38, 45, just="left"),
|
||||
self.get_padded_line(keys, 7, 14, just=left_half_justification), self.get_padded_line(keys, 45, 52, just="left"),
|
||||
self.get_padded_line(keys, 14, 20, just=left_half_justification), self.get_padded_line(keys, 52, 58, just="left"),
|
||||
self.get_padded_line(keys, 20, 27, just=left_half_justification), self.get_padded_line(keys, 58, 65, just="left"),
|
||||
self.get_padded_line(keys, 27, 32, just=left_half_justification), self.get_padded_line(keys, 65, 70, just="left"),
|
||||
|
||||
self.get_padded_line(keys, 32, 34, just=left_half_justification), self.get_padded_line(keys, 70, 72, just="left"),
|
||||
self.get_padded_line(keys, 34, 35, just=left_half_justification), self.get_padded_line(keys, 72, 73, just="left"),
|
||||
self.get_padded_line(keys, 35, 38, just=left_half_justification), self.get_padded_line(keys, 73, 76, just="left"),
|
||||
|
||||
)
|
||||
else:
|
||||
formatted_key_symbols = ""
|
||||
|
||||
# rid of the trailing comma
|
||||
formatted_key_symbols = formatted_key_symbols[0:len(formatted_key_symbols)-2] + "\n"
|
||||
s = "[{}] = {}({})".format(layer, self.output_layout, formatted_key_symbols)
|
||||
return s
|
||||
|
||||
# helper functions for pycparser
|
||||
def parser(self, src):
|
||||
src = self.comment_remover(src)
|
||||
return pycparser.CParser().parse(src)
|
||||
def comment_remover(self, text):
|
||||
# remove comments since pycparser cannot deal with them
|
||||
# credit: https://stackoverflow.com/a/241506
|
||||
def replacer(match):
|
||||
s = match.group(0)
|
||||
if s.startswith('/'):
|
||||
return " " # note: a space and not an empty string
|
||||
else:
|
||||
return s
|
||||
pattern = re.compile(
|
||||
r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
|
||||
re.DOTALL | re.MULTILINE
|
||||
)
|
||||
return re.sub(pattern, replacer, text)
|
||||
|
||||
def function_expr(self, f):
|
||||
name = f.name.name
|
||||
args = []
|
||||
for arg in f.args.exprs:
|
||||
if type(arg) is pycparser.c_ast.Constant:
|
||||
args.append(arg.value)
|
||||
elif type(arg) is pycparser.c_ast.ID:
|
||||
args.append(arg.name)
|
||||
return "{}({})".format(name, ",".join(args))
|
||||
|
||||
def key_expr(self, raw):
|
||||
if type(raw) is pycparser.c_ast.ID:
|
||||
if raw.name in self.KEY_ALIASES:
|
||||
return self.KEY_ALIASES[raw.name]
|
||||
return raw.name
|
||||
elif type(raw) is pycparser.c_ast.FuncCall:
|
||||
return self.function_expr(raw)
|
||||
|
||||
def layer_expr(self, layer):
|
||||
transformed = [self.key_expr(k) for k in layer.expr.args.exprs]
|
||||
return transformed
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
parser = argparse.ArgumentParser(description="Beautify keymap.c downloaded from ErgoDox-Ez Configurator for easier customization.")
|
||||
parser.add_argument("input_filename", help="input file: c source code file that has the layer keymaps")
|
||||
parser.add_argument("-o", "--output-filename", help="output file: beautified c filename. If not given, output to STDOUT.")
|
||||
parser.add_argument("-p", "--pretty-output-layout", action="store_true", help="use LAYOUT_ergodox_pretty for output instead of LAYOUT_ergodox")
|
||||
parser.add_argument("-c", "--justify-toward-center", action="store_true", help="for LAYOUT_ergodox_pretty, align right for the left half, and align left for the right half. Default is align left for both halves.")
|
||||
args = parser.parse_args()
|
||||
if args.pretty_output_layout:
|
||||
output_layout="LAYOUT_ergodox_pretty"
|
||||
else:
|
||||
output_layout="LAYOUT_ergodox"
|
||||
with open(args.input_filename) as f:
|
||||
source_code = f.read()
|
||||
result = KeymapBeautifier(source_code, output_layout=output_layout, justify_toward_center=args.justify_toward_center).output
|
||||
if args.output_filename:
|
||||
with open(args.output_filename, "w") as f:
|
||||
f.write(result)
|
||||
else:
|
||||
print(result)
|
||||
|
139
keyboards/ergodox_ez/util/keymap_beautifier/README.md
Normal file
139
keyboards/ergodox_ez/util/keymap_beautifier/README.md
Normal file
@@ -0,0 +1,139 @@
|
||||
# keymap_beautifier.py
|
||||
|
||||
## About
|
||||
This Python 3 script, by [Tsan-Kuang Lee](https://github.com/tsankuanglee) takes the keymap.c downloaded from [ErgoDox EZ Configurator](https://configure.ergodox-ez.com/) and beautifies it for easier customization, allowing one to quickly draft a layout to build upon.
|
||||
|
||||
## Features
|
||||
For example, the original `keymap.c` looks like
|
||||
|
||||
```
|
||||
[0] = LAYOUT_ergodox(KC_EQUAL,KC_1,KC_2,KC_3,KC_4,KC_5,LCTL(KC_MINUS),KC_DELETE,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_LBRACKET,KC_BSPACE,KC_A,KC_S,KC_D,KC_F,KC_G,KC_LSPO,CTL_T(KC_Z),KC_X,KC_C,KC_V,KC_B,ALL_T(KC_NO),LT(1,KC_GRAVE),KC_QUOTE,LALT(KC_LSHIFT),KC_LEFT,KC_RIGHT,ALT_T(KC_APPLICATION),KC_LGUI,KC_HOME,KC_SPACE,KC_UNDS,KC_END,LCTL(KC_EQUAL),KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINUS,KC_RBRACKET,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_BSLASH,KC_H,ALT_T(KC_J),KC_K,KC_L,LT(2,KC_SCOLON),GUI_T(KC_QUOTE),MEH_T(KC_NO),KC_N,KC_M,KC_COMMA,KC_DOT,CTL_T(KC_SLASH),KC_RSPC,KC_UP,KC_DOWN,KC_LBRACKET,KC_RBRACKET,TT(1),KC_LALT,CTL_T(KC_ESCAPE),KC_PGUP,KC_PGDOWN,LT(1,KC_TAB),KC_ENTER),
|
||||
```
|
||||
|
||||
The beautifier parses it and outputs:
|
||||
|
||||
```
|
||||
[0] = LAYOUT_ergodox(
|
||||
// left hand
|
||||
|
||||
KC_EQUAL , KC_1 , KC_2 , KC_3 , KC_4 , KC_5, LCTL(KC_MINUS),
|
||||
KC_DELETE , KC_Q , KC_W , KC_E , KC_R , KC_T, KC_LBRACKET ,
|
||||
KC_BSPACE , KC_A , KC_S , KC_D , KC_F , KC_G,
|
||||
KC_LSPO , CTL_T(KC_Z), KC_X , KC_C , KC_V , KC_B, ALL_T(KC_NO) ,
|
||||
LT(1,KC_GRAVE), KC_QUOTE , LALT(KC_LSHIFT), KC_LEFT, KC_RIGHT,
|
||||
|
||||
// left thumb
|
||||
|
||||
ALT_T(KC_APPLICATION), KC_LGUI,
|
||||
KC_HOME,
|
||||
KC_SPACE, KC_UNDS , KC_END ,
|
||||
|
||||
// right hand
|
||||
|
||||
LCTL(KC_EQUAL), KC_6, KC_7 , KC_8 , KC_9 , KC_0 , KC_MINUS ,
|
||||
KC_RBRACKET , KC_Y, KC_U , KC_I , KC_O , KC_P , KC_BSLASH ,
|
||||
KC_H, ALT_T(KC_J), KC_K , KC_L , LT(2,KC_SCOLON), GUI_T(KC_QUOTE),
|
||||
MEH_T(KC_NO) , KC_N, KC_M , KC_COMMA, KC_DOT , CTL_T(KC_SLASH), KC_RSPC ,
|
||||
KC_UP , KC_DOWN , KC_LBRACKET, KC_RBRACKET , TT(1) ,
|
||||
|
||||
// right thumb
|
||||
|
||||
KC_LALT , CTL_T(KC_ESCAPE),
|
||||
KC_PGUP ,
|
||||
KC_PGDOWN, LT(1,KC_TAB) , KC_ENTER
|
||||
)
|
||||
```
|
||||
|
||||
Optionally, it can also render [LAYOUT_ergodox_pretty](https://github.com/qmk/qmk_firmware/blob/ee700b2e831067bdb7584425569b61bc6329247b/keyboards/ergodox_ez/keymaps/bpruitt-goddard/keymap.c#L49-L57):
|
||||
```
|
||||
[0] = LAYOUT_ergodox_pretty(
|
||||
KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEAD, KC_LEAD, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_BSPACE ,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HYPR, KC_HYPR, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSLASH ,
|
||||
KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H , KC_J , KC_K , KC_L , KC_SCOLON , KC_QUOTE ,
|
||||
KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, SH_MON, SH_MON , KC_N , KC_M , KC_COMMA , KC_DOT , KC_SLASH , KC_RSHIFT ,
|
||||
LT(6,KC_NO), LT(7,KC_NO), KC_LCTRL, KC_LGUI, KC_LALT, ALGR_T(KC_MINUS), RGUI_T(KC_EQUAL), RCTL_T(KC_LBRACKET), LT(10,KC_RBRACKET), LT(6,KC_APPLICATION),
|
||||
|
||||
LT(6,KC_GRAVE), MEH_T(KC_NO), KC_LEFT, KC_RIGHT ,
|
||||
LT(10,KC_DELETE), KC_UP ,
|
||||
KC_SPACE, LT(8,KC_ENTER), LT(7,KC_BSPACE), KC_DOWN, LT(7,KC_SPACE), LT(8,KC_ENTER)
|
||||
)
|
||||
```
|
||||
|
||||
We can also align everythng t othe left (easier editing in my opinon):
|
||||
```
|
||||
[0] = LAYOUT_ergodox_pretty(
|
||||
KC_ESCAPE , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_LEAD , KC_LEAD, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_BSPACE ,
|
||||
KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_HYPR , KC_HYPR, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSLASH ,
|
||||
KC_LCTRL , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCOLON , KC_QUOTE ,
|
||||
KC_LSHIFT , KC_Z , KC_X , KC_C , KC_V , KC_B , SH_MON , SH_MON , KC_N , KC_M , KC_COMMA , KC_DOT , KC_SLASH , KC_RSHIFT ,
|
||||
LT(6,KC_NO), LT(7,KC_NO), KC_LCTRL, KC_LGUI, KC_LALT , ALGR_T(KC_MINUS), RGUI_T(KC_EQUAL), RCTL_T(KC_LBRACKET), LT(10,KC_RBRACKET), LT(6,KC_APPLICATION),
|
||||
|
||||
LT(6,KC_GRAVE), MEH_T(KC_NO) , KC_LEFT, KC_RIGHT ,
|
||||
LT(10,KC_DELETE), KC_UP ,
|
||||
KC_SPACE, LT(8,KC_ENTER), LT(7,KC_BSPACE) , KC_DOWN, LT(7,KC_SPACE), LT(8,KC_ENTER)
|
||||
)
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### With docker
|
||||
This is the cleaner way. `Docker` is the only requirement. The program executes within a container that has all dependencies installed.
|
||||
|
||||
First build the images. (Run once)
|
||||
```
|
||||
cd QMK_GIT_REPO_dir/keyboards/ergodox_ez/util/keymap_beautifier
|
||||
docker build -t keymapbeautifier:1.0 .
|
||||
```
|
||||
Run it
|
||||
```
|
||||
cd QMK_GIT_REPO_dir/keyboards/ergodox_ez/util/keymap_beautifier
|
||||
cp PATH_TO_YOUR_C_SOURCE_FILE.c input.c
|
||||
./docker_run.sh input.c -p -c -o output.c
|
||||
```
|
||||
The prettified file is written to `output.c`. See the section Tweaks for non-default settings.
|
||||
|
||||
### Without docker
|
||||
Requirements:
|
||||
* python3 (tested on 3.7.4)
|
||||
* python module `pycparser` installed (with `pip install pycparser`)
|
||||
|
||||
To run:
|
||||
```
|
||||
cd QMK_GIT_REPO_dir/keyboards/ergodox_ez/util/keymap_beautifier
|
||||
cp PATH_TO_YOUR_C_SOURCE_FILE.c input.c
|
||||
./KeymapBeautifier.py input.c -p -c -o output.c
|
||||
```
|
||||
The prettified file is written to `output.c`. See the section Tweaks for non-default settings.
|
||||
|
||||
## Tweaks
|
||||
```
|
||||
usage: KeymapBeautifier.py [-h] [-o OUTPUT_FILENAME] [-p] [-c] input_filename
|
||||
|
||||
Beautify keymap.c downloaded from ErgoDox-Ez Configurator for easier
|
||||
customization.
|
||||
|
||||
positional arguments:
|
||||
input_filename input file: c source code file that has the layer
|
||||
keymaps
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
-o OUTPUT_FILENAME, --output-filename OUTPUT_FILENAME
|
||||
output file: beautified c filename. If not given,
|
||||
output to STDOUT.
|
||||
-p, --pretty-output-layout
|
||||
use LAYOUT_ergodox_pretty for output instead of
|
||||
LAYOUT_ergodox
|
||||
-c, --justify-toward-center
|
||||
for LAYOUT_ergodox_pretty, align right for the left
|
||||
half, and align left for the right half. Default is
|
||||
align left for both halves.
|
||||
```
|
||||
For example,
|
||||
```
|
||||
./docker_run.sh input.c -p -c -o output.c
|
||||
# or if you don't want to use docker:
|
||||
#./KeymapBeautifier.py input.c -p -c -o output.c
|
||||
```
|
||||
will read `input.c`, and produce `output.c` with LAYOUT_ergodox_pretty, and have the key symbols gravitating toward the center.
|
||||
|
3
keyboards/ergodox_ez/util/keymap_beautifier/docker_run.sh
Executable file
3
keyboards/ergodox_ez/util/keymap_beautifier/docker_run.sh
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
docker run --mount type=bind,source="${PWD}",target=/usr/src/app --name keymapbeautifier --rm keymapbeautifier:1.0 ./KeymapBeautifier.py $*
|
@@ -0,0 +1 @@
|
||||
pycparser
|
@@ -1,3 +1,11 @@
|
||||
# ErgoDox EZ Utilities
|
||||
|
||||
## compile_keymap.py
|
||||
|
||||
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.
|
||||
|
||||
## keymap_beautifier.py
|
||||
|
||||
This Python 3 script, by [Tsan-Kuang Lee](https://github.com/tsankuanglee) takes the keymap.c downloaded from [ErgoDox EZ Configurator](https://configure.ergodox-ez.com/) and beautifies it for easier customization, allowing one to quickly draft a layout to build upon.
|
||||
|
||||
See [README.md](./keymap_beautifier/README.md) for this utility for more details.
|
||||
|
@@ -174,18 +174,12 @@ uint8_t matrix_scan(void) {
|
||||
}else{
|
||||
matrix_slave_scan();
|
||||
|
||||
// if(serial_slave_DATA_CORRUPT()){
|
||||
// TXLED0;
|
||||
int offset = (isLeftHand) ? ROWS_PER_HAND : 0;
|
||||
|
||||
for (int i = 0; i < ROWS_PER_HAND; ++i) {
|
||||
matrix[offset+i] = serial_master_buffer[i];
|
||||
}
|
||||
|
||||
// }else{
|
||||
// TXLED1;
|
||||
// }
|
||||
|
||||
matrix_scan_quantum();
|
||||
}
|
||||
return 1;
|
||||
|
@@ -14,49 +14,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "i2c_master.h"
|
||||
#include "quantum.h"
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
#include "rgblight.h"
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_init();
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
#endif
|
||||
|
||||
void matrix_init_kb(void) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
if (rgblight_config.enable) {
|
||||
i2c_init();
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
#endif
|
||||
// call user level keymaps, if any
|
||||
matrix_init_user();
|
||||
}
|
||||
|
||||
void matrix_scan_kb(void) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
rgblight_task();
|
||||
#endif
|
||||
matrix_scan_user();
|
||||
/* Nothing else for now. */
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {
|
||||
}
|
||||
#include "meteor.h"
|
||||
|
||||
void backlight_init_ports(void) {
|
||||
// initialize pins D0, D1, D4 and D6 as output
|
||||
@@ -73,17 +31,17 @@ void backlight_init_ports(void) {
|
||||
}
|
||||
|
||||
void backlight_set(uint8_t level) {
|
||||
if (level == 0) {
|
||||
if (level == 0) {
|
||||
// turn backlight LEDs off
|
||||
writePinLow(D0);
|
||||
writePinLow(D1);
|
||||
writePinLow(D4);
|
||||
writePinLow(D6);
|
||||
} else {
|
||||
} else {
|
||||
// turn backlight LEDs on
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
writePinHigh(D6);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,18 +1,3 @@
|
||||
# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32a
|
||||
|
||||
@@ -34,8 +19,6 @@ CONSOLE_ENABLE = yes
|
||||
COMMAND_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = yes
|
||||
RGBLIGHT_ENABLE = no
|
||||
RGBLIGHT_CUSTOM_DRIVER = no
|
||||
WS2812_DRIVER = i2c
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
QUANTUM_LIB_SRC = i2c_master.c
|
||||
|
@@ -13,49 +13,8 @@
|
||||
* 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 "rgblight.h"
|
||||
#include "i2c_master.h"
|
||||
#include "quantum.h"
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_init();
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
#endif
|
||||
|
||||
void matrix_init_kb(void) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
if (rgblight_config.enable) {
|
||||
i2c_init();
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
#endif
|
||||
// call user level keymaps, if any
|
||||
matrix_init_user();
|
||||
}
|
||||
|
||||
void matrix_scan_kb(void) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
rgblight_task();
|
||||
#endif
|
||||
matrix_scan_user();
|
||||
/* Nothing else for now. */
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {
|
||||
}
|
||||
#include "le_bmc.h"
|
||||
|
||||
void backlight_init_ports(void) {
|
||||
// initialize pins D0, D1, D4 and D6 as output
|
||||
@@ -72,17 +31,17 @@ void backlight_init_ports(void) {
|
||||
}
|
||||
|
||||
void backlight_set(uint8_t level) {
|
||||
if (level == 0) {
|
||||
if (level == 0) {
|
||||
// turn backlight LEDs off
|
||||
writePinLow(D0);
|
||||
writePinLow(D1);
|
||||
writePinLow(D4);
|
||||
writePinLow(D6);
|
||||
} else {
|
||||
} else {
|
||||
// turn backlight LEDs on
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
writePinHigh(D6);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -24,7 +24,7 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
WS2812_DRIVER = i2c
|
||||
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
|
||||
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
@@ -34,4 +34,3 @@ FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
SRC += i2c_master.c
|
||||
|
@@ -13,57 +13,8 @@
|
||||
* 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 "oe_bmc.h"
|
||||
#include "rgblight.h"
|
||||
#include "i2c_master.h"
|
||||
|
||||
void matrix_init_kb(void) {
|
||||
// put your keyboard start-up code here
|
||||
// runs once when the firmware starts up
|
||||
|
||||
matrix_init_user();
|
||||
}
|
||||
|
||||
void matrix_scan_kb(void) {
|
||||
// put your looping keyboard code here
|
||||
// runs every cycle (a lot)
|
||||
|
||||
matrix_scan_user();
|
||||
}
|
||||
|
||||
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||
// put your per-action keyboard code here
|
||||
// runs for every action, just before processing by the firmware
|
||||
|
||||
return process_record_user(keycode, record);
|
||||
}
|
||||
|
||||
void led_set_kb(uint8_t usb_led) {
|
||||
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
|
||||
|
||||
led_set_user(usb_led);
|
||||
}
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_init();
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
#endif
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {
|
||||
}
|
||||
|
||||
void backlight_init_ports(void) {
|
||||
// initialize pins D0, D1, D4 and D6 as output
|
||||
@@ -72,7 +23,7 @@ void backlight_init_ports(void) {
|
||||
setPinOutput(D4);
|
||||
setPinOutput(D6);
|
||||
|
||||
// turn RGB LEDs on
|
||||
// turn backlight LEDs on
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
@@ -80,17 +31,17 @@ void backlight_init_ports(void) {
|
||||
}
|
||||
|
||||
void backlight_set(uint8_t level) {
|
||||
if (level == 0) {
|
||||
// turn RGB LEDs off
|
||||
if (level == 0) {
|
||||
// turn backlight LEDs off
|
||||
writePinLow(D0);
|
||||
writePinLow(D1);
|
||||
writePinLow(D4);
|
||||
writePinLow(D6);
|
||||
} else {
|
||||
// turn RGB LEDs on
|
||||
} else {
|
||||
// turn backlight LEDs on
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
writePinHigh(D6);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -24,7 +24,7 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
WS2812_DRIVER = i2c
|
||||
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
|
||||
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
@@ -34,4 +34,3 @@ FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
SRC += i2c_master.c
|
||||
|
@@ -15,76 +15,3 @@
|
||||
*/
|
||||
|
||||
#include "exent.h"
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
|
||||
# include <string.h>
|
||||
# include "i2c_master.h"
|
||||
# include "rgblight.h"
|
||||
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
void matrix_init_kb(void) {
|
||||
i2c_init();
|
||||
// call user level keymaps, if any
|
||||
matrix_init_user();
|
||||
}
|
||||
|
||||
// custom RGB driver
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
memset(led, 0, 3 * RGBLED_NUM);
|
||||
}
|
||||
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
|
||||
bool rgb_init = false;
|
||||
|
||||
void matrix_scan_kb(void) {
|
||||
// if LEDs were previously on before poweroff, turn them back on
|
||||
if (rgb_init == false && rgblight_config.enable) {
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
rgb_init = true;
|
||||
}
|
||||
|
||||
rgblight_task();
|
||||
matrix_scan_user();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// Optional override functions below.
|
||||
// You can leave any or all of these undefined.
|
||||
// These are only required if you want to perform custom actions.
|
||||
|
||||
/*
|
||||
|
||||
void matrix_init_kb(void) {
|
||||
// put your keyboard start-up code here
|
||||
// runs once when the firmware starts up
|
||||
|
||||
matrix_init_user();
|
||||
}
|
||||
|
||||
void matrix_scan_kb(void) {
|
||||
// put your looping keyboard code here
|
||||
// runs every cycle (a lot)
|
||||
|
||||
matrix_scan_user();
|
||||
}
|
||||
|
||||
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||
// put your per-action keyboard code here
|
||||
// runs for every action, just before processing by the firmware
|
||||
|
||||
return process_record_user(keycode, record);
|
||||
}
|
||||
|
||||
void led_set_kb(uint8_t usb_led) {
|
||||
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
|
||||
|
||||
led_set_user(usb_led);
|
||||
}
|
||||
|
||||
*/
|
||||
|
@@ -19,10 +19,8 @@ CONSOLE_ENABLE = yes
|
||||
COMMAND_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = no
|
||||
RGBLIGHT_ENABLE = yes
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
WS2812_DRIVER = i2c
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
SRC += i2c_master.c
|
||||
|
||||
LAYOUTS = 65_ansi 65_iso
|
||||
|
@@ -16,51 +16,31 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "facew.h"
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
#include "backlight.h"
|
||||
#endif
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
#include "rgblight.h"
|
||||
#endif
|
||||
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
#include "action_layer.h"
|
||||
#include "i2c_master.h"
|
||||
#include "quantum.h"
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_init();
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
#endif
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {
|
||||
}
|
||||
|
||||
void backlight_init_ports(void) {
|
||||
DDRD |= (1<<0 | 1<<1 | 1<<4 | 1<<6);
|
||||
PORTD &= ~(1<<0 | 1<<1 | 1<<4 | 1<<6);
|
||||
setPinOutput(D0);
|
||||
setPinOutput(D1);
|
||||
setPinOutput(D4);
|
||||
setPinOutput(D6);
|
||||
|
||||
writePinLow(D0);
|
||||
writePinLow(D1);
|
||||
writePinLow(D4);
|
||||
writePinLow(D6);
|
||||
}
|
||||
|
||||
void backlight_set(uint8_t level) {
|
||||
if (level == 0) {
|
||||
// Turn out the lights
|
||||
PORTD &= ~(1<<0 | 1<<1 | 1<<4 | 1<<6);
|
||||
writePinLow(D0);
|
||||
writePinLow(D1);
|
||||
writePinLow(D4);
|
||||
writePinLow(D6);
|
||||
} else {
|
||||
// Turn on the lights
|
||||
PORTD |= (1<<0 | 1<<1 | 1<<4 | 1<<6);
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
writePinHigh(D6);
|
||||
}
|
||||
}
|
||||
|
@@ -1,18 +1,3 @@
|
||||
# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32a
|
||||
|
||||
@@ -34,11 +19,8 @@ CONSOLE_ENABLE = yes
|
||||
COMMAND_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = yes
|
||||
RGBLIGHT_ENABLE = yes
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
WS2812_DRIVER = i2c
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
# custom matrix setup
|
||||
SRC = i2c_master.c
|
||||
|
||||
LAYOUTS = 60_ansi
|
||||
|
@@ -17,7 +17,6 @@
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include "serial.h"
|
||||
//#include <pro_micro.h>
|
||||
|
||||
#ifdef SOFT_SERIAL_PIN
|
||||
|
||||
|
@@ -16,50 +16,6 @@
|
||||
|
||||
#include "mars80.h"
|
||||
|
||||
#include "rgblight.h"
|
||||
#include "i2c_master.h"
|
||||
#include "quantum.h"
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_init();
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
#endif
|
||||
|
||||
void matrix_init_kb(void) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
if (rgblight_config.enable) {
|
||||
i2c_init();
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
#endif
|
||||
// call user level keymaps, if any
|
||||
matrix_init_user();
|
||||
}
|
||||
|
||||
void matrix_scan_kb(void) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
rgblight_task();
|
||||
#endif
|
||||
matrix_scan_user();
|
||||
/* Nothing else for now. */
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {
|
||||
}
|
||||
|
||||
void backlight_init_ports(void) {
|
||||
// initialize pins D0, D1, D4 and D6 as output
|
||||
setPinOutput(D0);
|
||||
@@ -75,17 +31,17 @@ void backlight_init_ports(void) {
|
||||
}
|
||||
|
||||
void backlight_set(uint8_t level) {
|
||||
if (level == 0) {
|
||||
if (level == 0) {
|
||||
// turn backlight LEDs off
|
||||
writePinLow(D0);
|
||||
writePinLow(D1);
|
||||
writePinLow(D4);
|
||||
writePinLow(D6);
|
||||
} else {
|
||||
} else {
|
||||
// turn backlight LEDs on
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
writePinHigh(D6);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,18 +1,3 @@
|
||||
# Copyright 2019 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32a
|
||||
|
||||
@@ -34,10 +19,8 @@ CONSOLE_ENABLE = yes
|
||||
COMMAND_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = yes
|
||||
RGBLIGHT_ENABLE = yes
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
WS2812_DRIVER = i2c
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
SRC += i2c_master.c
|
||||
|
||||
LAYOUTS = tkl_ansi tkl_iso
|
||||
|
@@ -16,33 +16,7 @@ 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 <string.h>
|
||||
|
||||
#include "rgblight.h"
|
||||
|
||||
#include "i2c_master.h"
|
||||
#include "quantum.h"
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_init();
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
#endif
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {
|
||||
}
|
||||
#include "hb85.h"
|
||||
|
||||
void backlight_init_ports(void) {
|
||||
// initialize pins D0, D1, D4 and D6 as output
|
||||
@@ -51,7 +25,7 @@ void backlight_init_ports(void) {
|
||||
setPinOutput(D4);
|
||||
setPinOutput(D6);
|
||||
|
||||
// turn RGB LEDs on
|
||||
// turn backlight LEDs on
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
@@ -59,17 +33,17 @@ void backlight_init_ports(void) {
|
||||
}
|
||||
|
||||
void backlight_set(uint8_t level) {
|
||||
if (level == 0) {
|
||||
// turn RGB LEDs off
|
||||
if (level == 0) {
|
||||
// turn backlight LEDs off
|
||||
writePinLow(D0);
|
||||
writePinLow(D1);
|
||||
writePinLow(D4);
|
||||
writePinLow(D6);
|
||||
} else {
|
||||
// turn RGB LEDs on
|
||||
} else {
|
||||
// turn backlight LEDs on
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
writePinHigh(D6);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,18 +1,3 @@
|
||||
# Copyright 2019 fcoury <felipe.coury@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32a
|
||||
|
||||
@@ -34,8 +19,6 @@ CONSOLE_ENABLE = yes
|
||||
COMMAND_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = no
|
||||
RGBLIGHT_ENABLE = yes
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
WS2812_DRIVER = i2c
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
SRC += i2c_master.c
|
||||
|
@@ -25,3 +25,5 @@
|
||||
#define BACKLIGHT_PIN A0
|
||||
#define BACKLIGHT_PWM_DRIVER PWMD2
|
||||
#define BACKLIGHT_PWM_CHANNEL 1
|
||||
|
||||
#define RGB_DI_PIN A1
|
||||
|
4
keyboards/handwired/onekey/keymaps/rgb/config.h
Normal file
4
keyboards/handwired/onekey/keymaps/rgb/config.h
Normal file
@@ -0,0 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
#define RGBLED_NUM 9
|
||||
#define RGBLIGHT_ANIMATIONS
|
11
keyboards/handwired/onekey/keymaps/rgb/keymap.c
Normal file
11
keyboards/handwired/onekey/keymaps/rgb/keymap.c
Normal file
@@ -0,0 +1,11 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
LAYOUT( RGB_MOD )
|
||||
};
|
||||
|
||||
void keyboard_post_init_user(void) {
|
||||
rgblight_enable_noeeprom();
|
||||
rgblight_sethsv_noeeprom_cyan();
|
||||
rgblight_mode_noeeprom(RGBLIGHT_MODE_RAINBOW_SWIRL);
|
||||
}
|
1
keyboards/handwired/onekey/keymaps/rgb/rules.mk
Normal file
1
keyboards/handwired/onekey/keymaps/rgb/rules.mk
Normal file
@@ -0,0 +1 @@
|
||||
RGBLIGHT_ENABLE = yes
|
@@ -26,3 +26,5 @@
|
||||
#define BACKLIGHT_PWM_DRIVER PWMD4
|
||||
#define BACKLIGHT_PWM_CHANNEL 3
|
||||
#define BACKLIGHT_PAL_MODE 2
|
||||
|
||||
#define RGB_DI_PIN A1
|
||||
|
@@ -26,3 +26,5 @@
|
||||
#define BACKLIGHT_PWM_DRIVER PWMD3
|
||||
#define BACKLIGHT_PWM_CHANNEL 3
|
||||
#define BACKLIGHT_PAL_MODE 0
|
||||
|
||||
#define RGB_DI_PIN B15
|
||||
|
@@ -27,7 +27,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include "util.h"
|
||||
#include "matrix.h"
|
||||
#include "split_util.h"
|
||||
#include "pro_micro.h"
|
||||
#include "config.h"
|
||||
#include "timer.h"
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include "serial.h"
|
||||
//#include <pro_micro.h>
|
||||
|
||||
#ifdef SOFT_SERIAL_PIN
|
||||
|
||||
|
@@ -202,18 +202,12 @@ uint8_t matrix_scan(void)
|
||||
}else{
|
||||
matrix_slave_scan();
|
||||
|
||||
// if(serial_slave_DATA_CORRUPT()){
|
||||
// TXLED0;
|
||||
int offset = (isLeftHand) ? ROWS_PER_HAND : 0;
|
||||
|
||||
for (int i = 0; i < ROWS_PER_HAND; ++i) {
|
||||
matrix[offset+i] = serial_master_buffer[i];
|
||||
}
|
||||
|
||||
// }else{
|
||||
// TXLED1;
|
||||
// }
|
||||
|
||||
matrix_scan_quantum();
|
||||
}
|
||||
return 1;
|
||||
|
@@ -26,19 +26,19 @@
|
||||
* represents the switch matrix.
|
||||
*/
|
||||
#define LAYOUT_all( \
|
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, \
|
||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, \
|
||||
K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417, \
|
||||
K500, K501, K502, K505, K509, K510, K511, K512, K513, K514, K515, K516, K517 \
|
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, K017, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K013, K114, K115, K116, K117, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, \
|
||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, \
|
||||
K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417, \
|
||||
K500, K501, K502, K505, K509, K510, K511, K512, K513, K514, K515, K516, K517 \
|
||||
) { \
|
||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017}, \
|
||||
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117}, \
|
||||
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217},\
|
||||
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317},\
|
||||
{ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417},\
|
||||
{ K500, K501, K502, KC_NO, KC_NO, KC_NO, K505, KC_NO, KC_NO, KC_NO, KC_NO,K509, K510, K511, K512, K513, K514, K515, K516, K517 }\
|
||||
{ K500, K501, K502, KC_NO, KC_NO, K505, KC_NO, KC_NO, KC_NO, K509, K510, K511, K512, K513, K514, K515, K516, K517 }\
|
||||
}
|
||||
|
||||
#define LAYOUT_wkl( \
|
||||
|
@@ -2,14 +2,218 @@
|
||||
"keyboard_name": "hbcp",
|
||||
"url": "",
|
||||
"maintainer": "hineybush",
|
||||
"width": 22,
|
||||
"height": 6.75,
|
||||
"width": 19.5,
|
||||
"height": 6.25,
|
||||
"layouts": {
|
||||
"LAYOUT_all": {
|
||||
"layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":1.25, "y":0}, {"label":"F2", "x":2.25, "y":0}, {"label":"F3", "x":3.25, "y":0}, {"label":"F4", "x":4.25, "y":0}, {"label":"F5", "x":5.5, "y":0}, {"label":"F6", "x":6.5, "y":0}, {"label":"F7", "x":7.5, "y":0}, {"label":"F8", "x":8.5, "y":0}, {"label":"F9", "x":9.75, "y":0}, {"label":"F10", "x":10.75, "y":0}, {"label":"F11", "x":11.75, "y":0}, {"label":"F12", "x":12.75, "y":0}, {"label":"PrtSc", "x":15.5, "y":0}, {"label":"Scroll Lock", "x":16.5, "y":0}, {"label":"Pause", "x":17.5, "y":0}, {"label":"PgUp", "x":18.5, "y":0}, {"label":"~", "x":0, "y":1.25}, {"label":"!", "x":1, "y":1.25}, {"label":"@", "x":2, "y":1.25}, {"label":"#", "x":3, "y":1.25}, {"label":"$", "x":4, "y":1.25}, {"label":"%", "x":5, "y":1.25}, {"label":"^", "x":6, "y":1.25}, {"label":"&", "x":7, "y":1.25}, {"label":"*", "x":8, "y":1.25}, {"label":"(", "x":9, "y":1.25}, {"label":")", "x":10, "y":1.25}, {"label":"_", "x":11, "y":1.25}, {"label":"+", "x":12, "y":1.25}, {"x":13, "y":1.25}, {"x":14, "y":1.25}, {"label":"Num Lock", "x":15.5, "y":1.25}, {"label":"/", "x":16.5, "y":1.25}, {"label":"*", "x":17.5, "y":1.25}, {"label":"-", "x":18.5, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"{", "x":11.5, "y":2.25}, {"label":"}", "x":12.5, "y":2.25}, {"label":"|", "x":13.5, "y":2.25, "w":1.5}, {"label":"7", "x":15.5, "y":2.25}, {"label":"8", "x":16.5, "y":2.25}, {"label":"9", "x":17.5, "y":2.25}, {"x":18.5, "y":2.25}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":":", "x":10.75, "y":3.25}, {"label":"\"", "x":11.75, "y":3.25}, {"x":12.75, "y":3.25}, {"label":"Enter", "x":13.75, "y":3.25, "w":1.25}, {"label":"4", "x":15.5, "y":3.25}, {"label":"5", "x":16.5, "y":3.25}, {"label":"6", "x":17.5, "y":3.25}, {"x":18.5, "y":3.25}, {"x":0, "y":4.25, "w":1.25}, {"x":1.25, "y":4.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":"<", "x":9.25, "y":4.25}, {"label":">", "x":10.25, "y":4.25}, {"label":"?", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, {"label":"\u2191", "x":14.25, "y":4.5}, {"label":"1", "x":15.5, "y":4.25}, {"label":"2", "x":16.5, "y":4.25}, {"label":"3", "x":17.5, "y":4.25}, {"x":18.5, "y":4.25}, {"x":0, "y":5.25, "w":1.25}, {"x":1.25, "y":5.25, "w":1.25}, {"x":2.5, "y":5.25, "w":1.25}, {"x":3.75, "y":5.25, "w":6.25}, {"x":10, "y":5.25}, {"x":11, "y":5.25}, {"x":12, "y":5.25}, {"label":"\u2190", "x":13.25, "y":5.5}, {"label":"\u2193", "x":14.25, "y":5.5}, {"label":"\u2192", "x":15.25, "y":5.5}, {"label":"0", "x":16.5, "y":5.25}, {"label":".", "x":17.5, "y":5.25}, {"x":18.5, "y":5.25}]
|
||||
"key_count": 103,
|
||||
"layout": [
|
||||
{"label":"Esc (K000)", "x":0, "y":0},
|
||||
{"label":"F1 (K001)", "x":1.25, "y":0},
|
||||
{"label":"F2 (K002)", "x":2.25, "y":0},
|
||||
{"label":"F3 (K003)", "x":3.25, "y":0},
|
||||
{"label":"F4 (K004)", "x":4.25, "y":0},
|
||||
{"label":"F5 (K005)", "x":5.5, "y":0},
|
||||
{"label":"F6 (K006)", "x":6.5, "y":0},
|
||||
{"label":"F7 (K007)", "x":7.5, "y":0},
|
||||
{"label":"F8 (K008)", "x":8.5, "y":0},
|
||||
{"label":"F9 (K009)", "x":9.75, "y":0},
|
||||
{"label":"F10 (K010)", "x":10.75, "y":0},
|
||||
{"label":"F11 (K011)", "x":11.75, "y":0},
|
||||
{"label":"F12 (K012)", "x":12.75, "y":0},
|
||||
{"label":"Delete (K014)", "x":15.5, "y":0},
|
||||
{"label":"Insert (K015)", "x":16.5, "y":0},
|
||||
{"label":"PgUp (K016)", "x":17.5, "y":0},
|
||||
{"label":"PgDn (K017)", "x":18.5, "y":0},
|
||||
{"label":"~ (K100)", "x":0, "y":1.25},
|
||||
{"label":"! (K101)", "x":1, "y":1.25},
|
||||
{"label":"@ (K102)", "x":2, "y":1.25},
|
||||
{"label":"# (K103)", "x":3, "y":1.25},
|
||||
{"label":"$ (K104)", "x":4, "y":1.25},
|
||||
{"label":"% (K105)", "x":5, "y":1.25},
|
||||
{"label":"^ (K106)", "x":6, "y":1.25},
|
||||
{"label":"& (K107)", "x":7, "y":1.25},
|
||||
{"label":"* (K108)", "x":8, "y":1.25},
|
||||
{"label":"( (K109)", "x":9, "y":1.25},
|
||||
{"label":") (K110)", "x":10, "y":1.25},
|
||||
{"label":"_ (K111)", "x":11, "y":1.25},
|
||||
{"label":"+ (K112)", "x":12, "y":1.25},
|
||||
{"label":"~ (K113)", "x":13, "y":1.25},
|
||||
{"label":"Backspace (K013)", "x":14, "y":1.25},
|
||||
{"label":"Num Lock (K114)", "x":15.5, "y":1.25},
|
||||
{"label":"/ (K115)", "x":16.5, "y":1.25},
|
||||
{"label":"* (K116)", "x":17.5, "y":1.25},
|
||||
{"label":"Pause (K117)", "x":18.5, "y":1.25},
|
||||
{"label":"Tab (K200)", "x":0, "y":2.25, "w":1.5},
|
||||
{"label":"Q (K201)", "x":1.5, "y":2.25},
|
||||
{"label":"W (K202)", "x":2.5, "y":2.25},
|
||||
{"label":"E (K203)", "x":3.5, "y":2.25},
|
||||
{"label":"R (K204)", "x":4.5, "y":2.25},
|
||||
{"label":"T (K205)", "x":5.5, "y":2.25},
|
||||
{"label":"Y (K206)", "x":6.5, "y":2.25},
|
||||
{"label":"U (K207)", "x":7.5, "y":2.25},
|
||||
{"label":"I (K208)", "x":8.5, "y":2.25},
|
||||
{"label":"O (K209)", "x":9.5, "y":2.25},
|
||||
{"label":"P (K210)", "x":10.5, "y":2.25},
|
||||
{"label":"{ (K211)", "x":11.5, "y":2.25},
|
||||
{"label":"} (K212)", "x":12.5, "y":2.25},
|
||||
{"label":"| (K213)", "x":13.5, "y":2.25, "w":1.5},
|
||||
{"label":"7 (K214)", "x":15.5, "y":2.25},
|
||||
{"label":"8 (K215)", "x":16.5, "y":2.25},
|
||||
{"label":"9 (K216)", "x":17.5, "y":2.25},
|
||||
{"label":"- (K217)", "x":18.5, "y":2.25},
|
||||
{"label":"Caps Lock (K300)", "x":0, "y":3.25, "w":1.75},
|
||||
{"label":"A (K301)", "x":1.75, "y":3.25},
|
||||
{"label":"S (K302)", "x":2.75, "y":3.25},
|
||||
{"label":"D (K303)", "x":3.75, "y":3.25},
|
||||
{"label":"F (K304)", "x":4.75, "y":3.25},
|
||||
{"label":"G (K305)", "x":5.75, "y":3.25},
|
||||
{"label":"H (K306)", "x":6.75, "y":3.25},
|
||||
{"label":"J (K307)", "x":7.75, "y":3.25},
|
||||
{"label":"K (K308)", "x":8.75, "y":3.25},
|
||||
{"label":"L (K309)", "x":9.75, "y":3.25},
|
||||
{"label":": (K310)", "x":10.75, "y":3.25},
|
||||
{"label":"\" (K311)", "x":11.75, "y":3.25},
|
||||
{"label":"~ (K312)", "x":12.75, "y":3.25},
|
||||
{"label":"Enter (K313)", "x":13.75, "y":3.25, "w":1.25},
|
||||
{"label":"4 (K314)", "x":15.5, "y":3.25},
|
||||
{"label":"5 (K315)", "x":16.5, "y":3.25},
|
||||
{"label":"6 (K316)", "x":17.5, "y":3.25},
|
||||
{"label":"+ (K317)", "x":18.5, "y":3.25},
|
||||
{"label":"Shift (K400)", "x":0, "y":4.25, "w":1.25},
|
||||
{"label":"| (K401)", "x":1.25, "y":4.25},
|
||||
{"label":"Z (K402)", "x":2.25, "y":4.25},
|
||||
{"label":"X (K403)", "x":3.25, "y":4.25},
|
||||
{"label":"C (K404)", "x":4.25, "y":4.25},
|
||||
{"label":"V (K405)", "x":5.25, "y":4.25},
|
||||
{"label":"B (K406)", "x":6.25, "y":4.25},
|
||||
{"label":"N (K407)", "x":7.25, "y":4.25},
|
||||
{"label":"M (K408)", "x":8.25, "y":4.25},
|
||||
{"label":"< (K409)", "x":9.25, "y":4.25},
|
||||
{"label":"> (K410)", "x":10.25, "y":4.25},
|
||||
{"label":"? (K411)", "x":11.25, "y":4.25},
|
||||
{"label":"Shift (K412)", "x":12.25, "y":4.25, "w":1.75},
|
||||
{"label":"Up (K413)", "x":14.25, "y":4.5},
|
||||
{"label":"1 (K414)", "x":15.5, "y":4.25},
|
||||
{"label":"2 (K415)", "x":16.5, "y":4.25},
|
||||
{"label":"3 (K416)", "x":17.5, "y":4.25},
|
||||
{"label":"TRNS (K417)", "x":18.5, "y":4.25},
|
||||
{"label":"Ctrl (K500)", "x":0, "y":5.25, "w":1.25},
|
||||
{"label":"GUI (K501)", "x":1.25, "y":5.25, "w":1.25},
|
||||
{"label":"Alt (K502)", "x":2.5, "y":5.25, "w":1.25},
|
||||
{"label":"Space (K505)", "x":3.75, "y":5.25, "w":6.25},
|
||||
{"label":"Alt (K509)", "x":10, "y":5.25},
|
||||
{"label":"MO(1) (K510)", "x":11, "y":5.25},
|
||||
{"label":"GUI (K511)", "x":12, "y":5.25},
|
||||
{"label":"Left (K512)", "x":13.25, "y":5.5},
|
||||
{"label":"Down (K513)", "x":14.25, "y":5.5},
|
||||
{"label":"Right (K514)", "x":15.25, "y":5.5},
|
||||
{"label":"0 (K515)", "x":16.5, "y":5.25},
|
||||
{"label":". (K516)", "x":17.5, "y":5.25},
|
||||
{"label":"Enter (K517)", "x":18.5, "y":5.25}
|
||||
]
|
||||
},
|
||||
"LAYOUT_wkl": {
|
||||
"layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":1.25, "y":0}, {"label":"F2", "x":2.25, "y":0}, {"label":"F3", "x":3.25, "y":0}, {"label":"F4", "x":4.25, "y":0}, {"label":"F5", "x":5.5, "y":0}, {"label":"F6", "x":6.5, "y":0}, {"label":"F7", "x":7.5, "y":0}, {"label":"F8", "x":8.5, "y":0}, {"label":"F9", "x":9.75, "y":0}, {"label":"F10", "x":10.75, "y":0}, {"label":"F11", "x":11.75, "y":0}, {"label":"F12", "x":12.75, "y":0}, {"label":"PrtSc", "x":15.5, "y":0}, {"label":"Scroll Lock", "x":16.5, "y":0}, {"label":"Pause", "x":17.5, "y":0}, {"label":"PgUp", "x":18.5, "y":0}, {"label":"~", "x":0, "y":1.25}, {"label":"!", "x":1, "y":1.25}, {"label":"@", "x":2, "y":1.25}, {"label":"#", "x":3, "y":1.25}, {"label":"$", "x":4, "y":1.25}, {"label":"%", "x":5, "y":1.25}, {"label":"^", "x":6, "y":1.25}, {"label":"&", "x":7, "y":1.25}, {"label":"*", "x":8, "y":1.25}, {"label":"(", "x":9, "y":1.25}, {"label":")", "x":10, "y":1.25}, {"label":"_", "x":11, "y":1.25}, {"label":"+", "x":12, "y":1.25}, {"label":"Backspace", "x":13, "y":1.25, "w":2}, {"label":"Num Lock", "x":15.5, "y":1.25}, {"label":"/", "x":16.5, "y":1.25}, {"label":"*", "x":17.5, "y":1.25}, {"label":"-", "x":18.5, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"{", "x":11.5, "y":2.25}, {"label":"}", "x":12.5, "y":2.25}, {"label":"|", "x":13.5, "y":2.25, "w":1.5}, {"label":"7", "x":15.5, "y":2.25}, {"label":"8", "x":16.5, "y":2.25}, {"label":"9", "x":17.5, "y":2.25}, {"x":18.5, "y":2.25}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":":", "x":10.75, "y":3.25}, {"label":"\"", "x":11.75, "y":3.25}, {"label":"Enter", "x":12.75, "y":3.25, "w":2.25}, {"label":"4", "x":15.5, "y":3.25}, {"label":"5", "x":16.5, "y":3.25}, {"label":"6", "x":17.5, "y":3.25}, {"x":18.5, "y":3.25}, {"label":"Shift", "x":0, "y":4.25, "w":2.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":"<", "x":9.25, "y":4.25}, {"label":">", "x":10.25, "y":4.25}, {"label":"?", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, {"label":"\u2191", "x":14.25, "y":4.5}, {"label":"1", "x":15.5, "y":4.25}, {"label":"2", "x":16.5, "y":4.25}, {"label":"3", "x":17.5, "y":4.25}, {"label":"Enter", "x":18.5, "y":4.25, "h":2}, {"label":"Ctrl", "x":0, "y":5.25, "w":1.5}, {"label":"Alt", "x":1.5, "y":5.25, "w":1.5}, {"x":3, "y":5.25, "w":7}, {"label":"Alt", "x":10, "y":5.25, "w":1.5}, {"label":"Win", "x":11.5, "y":5.25, "w":1.5}, {"label":"\u2190", "x":13.25, "y":5.5}, {"label":"\u2193", "x":14.25, "y":5.5}, {"label":"\u2192", "x":15.25, "y":5.5}, {"label":"0", "x":16.5, "y":5.25}, {"label":".", "x":17.5, "y":5.25}]
|
||||
"key_count": 97,
|
||||
"layout": [
|
||||
{"label":"Esc (K000)", "x":0, "y":0},
|
||||
{"label":"F1 (K001)", "x":1.25, "y":0},
|
||||
{"label":"F2 (K002)", "x":2.25, "y":0},
|
||||
{"label":"F3 (K003)", "x":3.25, "y":0},
|
||||
{"label":"F4 (K004)", "x":4.25, "y":0},
|
||||
{"label":"F5 (K005)", "x":5.5, "y":0},
|
||||
{"label":"F6 (K006)", "x":6.5, "y":0},
|
||||
{"label":"F7 (K007)", "x":7.5, "y":0},
|
||||
{"label":"F8 (K008)", "x":8.5, "y":0},
|
||||
{"label":"F9 (K009)", "x":9.75, "y":0},
|
||||
{"label":"F10 (K010)", "x":10.75, "y":0},
|
||||
{"label":"F11 (K011)", "x":11.75, "y":0},
|
||||
{"label":"F12 (K012)", "x":12.75, "y":0},
|
||||
{"label":"Delete (K014)", "x":15.5, "y":0},
|
||||
{"label":"Insert (K015)", "x":16.5, "y":0},
|
||||
{"label":"PgUp (K016)", "x":17.5, "y":0},
|
||||
{"label":"PgDn (K017)", "x":18.5, "y":0},
|
||||
{"label":"~ (K100)", "x":0, "y":1.25},
|
||||
{"label":"! (K101)", "x":1, "y":1.25},
|
||||
{"label":"@ (K102)", "x":2, "y":1.25},
|
||||
{"label":"# (K103)", "x":3, "y":1.25},
|
||||
{"label":"$ (K104)", "x":4, "y":1.25},
|
||||
{"label":"% (K105)", "x":5, "y":1.25},
|
||||
{"label":"^ (K106)", "x":6, "y":1.25},
|
||||
{"label":"& (K107)", "x":7, "y":1.25},
|
||||
{"label":"* (K108)", "x":8, "y":1.25},
|
||||
{"label":"( (K109)", "x":9, "y":1.25},
|
||||
{"label":") (K110)", "x":10, "y":1.25},
|
||||
{"label":"_ (K111)", "x":11, "y":1.25},
|
||||
{"label":"+ (K112)", "x":12, "y":1.25},
|
||||
{"label":"Backspace (K013)", "x":13, "y":1.25, "w":2},
|
||||
{"label":"Num Lock (K114)", "x":15.5, "y":1.25},
|
||||
{"label":"/ (K115)", "x":16.5, "y":1.25},
|
||||
{"label":"* (K116)", "x":17.5, "y":1.25},
|
||||
{"label":"Pause (K117)", "x":18.5, "y":1.25},
|
||||
{"label":"Tab (K200)", "x":0, "y":2.25, "w":1.5},
|
||||
{"label":"Q (K201)", "x":1.5, "y":2.25},
|
||||
{"label":"W (K202)", "x":2.5, "y":2.25},
|
||||
{"label":"E (K203)", "x":3.5, "y":2.25},
|
||||
{"label":"R (K204)", "x":4.5, "y":2.25},
|
||||
{"label":"T (K205)", "x":5.5, "y":2.25},
|
||||
{"label":"Y (K206)", "x":6.5, "y":2.25},
|
||||
{"label":"U (K207)", "x":7.5, "y":2.25},
|
||||
{"label":"I (K208)", "x":8.5, "y":2.25},
|
||||
{"label":"O (K209)", "x":9.5, "y":2.25},
|
||||
{"label":"P (K210)", "x":10.5, "y":2.25},
|
||||
{"label":"{ (K211)", "x":11.5, "y":2.25},
|
||||
{"label":"} (K212)", "x":12.5, "y":2.25},
|
||||
{"label":"| (K213)", "x":13.5, "y":2.25, "w":1.5},
|
||||
{"label":"7 (K214)", "x":15.5, "y":2.25},
|
||||
{"label":"8 (K215)", "x":16.5, "y":2.25},
|
||||
{"label":"9 (K216)", "x":17.5, "y":2.25},
|
||||
{"label":"- (K217)", "x":18.5, "y":2.25},
|
||||
{"label":"Caps Lock (K300)", "x":0, "y":3.25, "w":1.75},
|
||||
{"label":"A (K301)", "x":1.75, "y":3.25},
|
||||
{"label":"S (K302)", "x":2.75, "y":3.25},
|
||||
{"label":"D (K303)", "x":3.75, "y":3.25},
|
||||
{"label":"F (K304)", "x":4.75, "y":3.25},
|
||||
{"label":"G (K305)", "x":5.75, "y":3.25},
|
||||
{"label":"H (K306)", "x":6.75, "y":3.25},
|
||||
{"label":"J (K307)", "x":7.75, "y":3.25},
|
||||
{"label":"K (K308)", "x":8.75, "y":3.25},
|
||||
{"label":"L (K309)", "x":9.75, "y":3.25},
|
||||
{"label":": (K310)", "x":10.75, "y":3.25},
|
||||
{"label":"\" (K311)", "x":11.75, "y":3.25},
|
||||
{"label":"Enter (K313)", "x":12.75, "y":3.25, "w":2.25},
|
||||
{"label":"4 (K314)", "x":15.5, "y":3.25},
|
||||
{"label":"5 (K315)", "x":16.5, "y":3.25},
|
||||
{"label":"6 (K316)", "x":17.5, "y":3.25},
|
||||
{"label":"+ (K317)", "x":18.5, "y":3.25},
|
||||
{"label":"Shift (K400)", "x":0, "y":4.25, "w":2.25},
|
||||
{"label":"Z (K402)", "x":2.25, "y":4.25},
|
||||
{"label":"X (K403)", "x":3.25, "y":4.25},
|
||||
{"label":"C (K404)", "x":4.25, "y":4.25},
|
||||
{"label":"V (K405)", "x":5.25, "y":4.25},
|
||||
{"label":"B (K406)", "x":6.25, "y":4.25},
|
||||
{"label":"N (K407)", "x":7.25, "y":4.25},
|
||||
{"label":"M (K408)", "x":8.25, "y":4.25},
|
||||
{"label":"< (K409)", "x":9.25, "y":4.25},
|
||||
{"label":"> (K410)", "x":10.25, "y":4.25},
|
||||
{"label":"? (K411)", "x":11.25, "y":4.25},
|
||||
{"label":"Shift (K412)", "x":12.25, "y":4.25, "w":1.75},
|
||||
{"label":"Up (K413)", "x":14.25, "y":4.5},
|
||||
{"label":"1 (K414)", "x":15.5, "y":4.25},
|
||||
{"label":"2 (K415)", "x":16.5, "y":4.25},
|
||||
{"label":"3 (K416)", "x":17.5, "y":4.25},
|
||||
{"label":"Ctrl (K500)", "x":0, "y":5.25, "w":1.5},
|
||||
{"label":"Alt (K501)", "x":1.5, "y":5.25, "w":1.5},
|
||||
{"label":"Space (K505)", "x":3, "y":5.25, "w":7},
|
||||
{"label":"MO(1) (K510)", "x":10, "y":5.25, "w":1.5},
|
||||
{"label":"GUI (K511)", "x":11.5, "y":5.25, "w":1.5},
|
||||
{"label":"Left (K512)", "x":13.25, "y":5.5},
|
||||
{"label":"Down (K513)", "x":14.25, "y":5.5},
|
||||
{"label":"Right (K514)", "x":15.25, "y":5.5},
|
||||
{"label":"0 (K515)", "x":16.5, "y":5.25},
|
||||
{"label":". (K516)", "x":17.5, "y":5.25},
|
||||
{"label":"Enter (K517)", "x":18.5, "y":4.25, "h":2}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -23,30 +23,32 @@ enum custom_keycodes {
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
[0] = LAYOUT_wkl( /* Base */
|
||||
[0] = LAYOUT_all( /* Base */
|
||||
|
||||
/*K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, K017, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, K114, K115, K116, K117, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, \
|
||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, K315, K316, K317, \
|
||||
K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, \
|
||||
K500, K501, K505, K510, K511, K512, K513, K514, K515, K516, K517 \*/
|
||||
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, KC_PGUP, KC_PGDN,
|
||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PAUS,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PMNS,
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3,
|
||||
KC_LCTL, KC_LALT, KC_SPC, MO(1), KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
|
||||
/*#define LAYOUT_all( \
|
||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, K017, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K013, K114, K115, K116, K117, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, \
|
||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, \
|
||||
K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417, \
|
||||
K500, K501, K502, K505, K509, K510, K511, K512, K513, K514, K515, K516, K517 \
|
||||
)*/
|
||||
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, KC_PGUP, KC_PGDN,
|
||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PAUS,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PMNS,
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
|
||||
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_TRNS,
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, MO(1), KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
|
||||
|
||||
),
|
||||
|
||||
[1] = LAYOUT_wkl(
|
||||
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK,KC_HOME, KC_END,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUD, RGB_HUI,KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, RESET ,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAD, RGB_SAI,KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, RGB_VAI,KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, RGB_TOG, RGB_MOD,KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT, KC_TRNS,KC_TRNS, KC_TRNS
|
||||
[1] = LAYOUT_all(
|
||||
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK,KC_HOME, KC_END,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUD, RGB_HUI,KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, RESET ,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAD, RGB_SAI,KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, RGB_VAI,KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, RGB_TOG, RGB_MOD,KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT, KC_TRNS,KC_TRNS, KC_TRNS
|
||||
|
||||
),
|
||||
};
|
||||
|
@@ -1 +1,2 @@
|
||||
# The default keymap for hbcp
|
||||
# The default "all key" keymap for hbcp
|
||||
# Somewhat dirty with ISO and split backspace, but has all keys
|
||||
|
@@ -22,6 +22,22 @@
|
||||
#define HSV_SOFT_PINK 255, 110, 100 // Define custom "soft pink" color
|
||||
#endif
|
||||
|
||||
#ifndef HSV_SOFT_WHITE
|
||||
#define HSV_SOFT_WHITE 0, 0, 90 // Define custom "soft white" color
|
||||
#endif
|
||||
|
||||
#ifndef HSV_WARM_WHITE
|
||||
#define HSV_WARM_WHITE 41, 105, 90 // Define custom "warm white" color
|
||||
#endif
|
||||
|
||||
#ifndef HSV_SOFT_RED
|
||||
#define HSV_SOFT_RED 0, 240, 160 // Define custom "soft red" color
|
||||
#endif
|
||||
|
||||
#ifndef HSV_SOFT_BLUE
|
||||
#define HSV_SOFT_BLUE 159, 180, 160 // Define custom "soft blue" color
|
||||
#endif
|
||||
|
||||
#ifndef HSV_BLACK
|
||||
#define HSV_BLACK 0, 0, 0 // Define 'black' color, more like 'LED off' (H, S, V)
|
||||
#endif
|
||||
|
@@ -86,17 +86,17 @@ void matrix_scan_user(void) {
|
||||
// The first three LEDs are used as indicators for CAPS_LOCK, NUM_LOCK and SCROLL_LOCK.
|
||||
void led_set_user(uint8_t usb_led) {
|
||||
if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
|
||||
sethsv_raw(HSV_SOFT_PINK, (LED_TYPE *)&led[0]);
|
||||
sethsv_raw(HSV_SOFT_RED, (LED_TYPE *)&led[0]);
|
||||
} else {
|
||||
sethsv(HSV_BLACK, (LED_TYPE *)&led[0]);
|
||||
}
|
||||
if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
|
||||
sethsv_raw(HSV_SOFT_PINK, (LED_TYPE *)&led[1]);
|
||||
sethsv_raw(HSV_WARM_WHITE, (LED_TYPE *)&led[1]);
|
||||
} else {
|
||||
sethsv(HSV_BLACK, (LED_TYPE *)&led[1]);
|
||||
}
|
||||
if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
|
||||
sethsv_raw(HSV_SOFT_PINK, (LED_TYPE *)&led[2]);
|
||||
sethsv_raw(HSV_SOFT_BLUE, (LED_TYPE *)&led[2]);
|
||||
} else {
|
||||
sethsv(HSV_BLACK, (LED_TYPE *)&led[2]);
|
||||
}
|
||||
|
19
keyboards/hineybush/hbcp/keymaps/wkl/config.h
Normal file
19
keyboards/hineybush/hbcp/keymaps/wkl/config.h
Normal file
@@ -0,0 +1,19 @@
|
||||
/* Copyright 2019 hineybush
|
||||
*
|
||||
* 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
|
||||
|
||||
// place overrides here
|
82
keyboards/hineybush/hbcp/keymaps/wkl/keymap.c
Normal file
82
keyboards/hineybush/hbcp/keymaps/wkl/keymap.c
Normal file
@@ -0,0 +1,82 @@
|
||||
/* Copyright 2019 hineybush
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
// Defines the keycodes used by our macros in process_record_user
|
||||
enum custom_keycodes {
|
||||
QMKBEST = SAFE_RANGE,
|
||||
QMKURL
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
[0] = LAYOUT_wkl( /* Base */
|
||||
|
||||
/*K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, K017, \
|
||||
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, K114, K115, K116, K117, \
|
||||
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, \
|
||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, K315, K316, K317, \
|
||||
K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, \
|
||||
K500, K501, K505, K510, K511, K512, K513, K514, K515, K516, K517 \*/
|
||||
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, KC_PGUP, KC_PGDN,
|
||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PAUS,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PMNS,
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3,
|
||||
KC_LCTL, KC_LALT, KC_SPC, MO(1), KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
|
||||
|
||||
),
|
||||
|
||||
[1] = LAYOUT_wkl(
|
||||
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK,KC_HOME, KC_END,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUD, RGB_HUI,KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, RESET ,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAD, RGB_SAI,KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, RGB_VAI,KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, RGB_TOG, RGB_MOD,KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT, KC_TRNS,KC_TRNS, KC_TRNS
|
||||
|
||||
),
|
||||
};
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
case QMKBEST:
|
||||
if (record->event.pressed) {
|
||||
// when keycode QMKBEST is pressed
|
||||
SEND_STRING("QMK is the best thing ever!");
|
||||
} else {
|
||||
// when keycode QMKBEST is released
|
||||
}
|
||||
break;
|
||||
case QMKURL:
|
||||
if (record->event.pressed) {
|
||||
// when keycode QMKURL is pressed
|
||||
SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER));
|
||||
} else {
|
||||
// when keycode QMKURL is released
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void matrix_init_user(void) {
|
||||
|
||||
}
|
||||
|
||||
void matrix_scan_user(void) {
|
||||
|
||||
}
|
1
keyboards/hineybush/hbcp/keymaps/wkl/readme.md
Normal file
1
keyboards/hineybush/hbcp/keymaps/wkl/readme.md
Normal file
@@ -0,0 +1 @@
|
||||
# The default WKL keymap for hbcp
|
@@ -1,106 +0,0 @@
|
||||
/*
|
||||
Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// Please do not modify this file
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <util/twi.h>
|
||||
|
||||
#include "i2c.h"
|
||||
|
||||
void i2c_set_bitrate(uint16_t bitrate_khz) {
|
||||
uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz);
|
||||
if (bitrate_div >= 16) {
|
||||
bitrate_div = (bitrate_div - 16) / 2;
|
||||
}
|
||||
TWBR = bitrate_div;
|
||||
}
|
||||
|
||||
void i2c_init(void) {
|
||||
// set pull-up resistors on I2C bus pins
|
||||
PORTC |= 0b11;
|
||||
|
||||
i2c_set_bitrate(400);
|
||||
|
||||
// enable TWI (two-wire interface)
|
||||
TWCR |= (1 << TWEN);
|
||||
|
||||
// enable TWI interrupt and slave address ACK
|
||||
TWCR |= (1 << TWIE);
|
||||
TWCR |= (1 << TWEA);
|
||||
}
|
||||
|
||||
uint8_t i2c_start(uint8_t address) {
|
||||
// reset TWI control register
|
||||
TWCR = 0;
|
||||
|
||||
// begin transmission and wait for it to end
|
||||
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
|
||||
while (!(TWCR & (1<<TWINT)));
|
||||
|
||||
// check if the start condition was successfully transmitted
|
||||
if ((TWSR & 0xF8) != TW_START) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// transmit address and wait
|
||||
TWDR = address;
|
||||
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||
while (!(TWCR & (1<<TWINT)));
|
||||
|
||||
// check if the device has acknowledged the READ / WRITE mode
|
||||
uint8_t twst = TW_STATUS & 0xF8;
|
||||
if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void i2c_stop(void) {
|
||||
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
|
||||
}
|
||||
|
||||
uint8_t i2c_write(uint8_t data) {
|
||||
TWDR = data;
|
||||
|
||||
// transmit data and wait
|
||||
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||
while (!(TWCR & (1<<TWINT)));
|
||||
|
||||
if ((TWSR & 0xF8) != TW_MT_DATA_ACK) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length) {
|
||||
if (i2c_start(address)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (uint16_t i = 0; i < length; i++) {
|
||||
if (i2c_write(data[i])) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_stop();
|
||||
|
||||
return 0;
|
||||
}
|
@@ -1,27 +0,0 @@
|
||||
/*
|
||||
Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// Please do not modify this file
|
||||
|
||||
#ifndef __I2C_H__
|
||||
#define __I2C_H__
|
||||
|
||||
void i2c_init(void);
|
||||
void i2c_set_bitrate(uint16_t bitrate_khz);
|
||||
uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length);
|
||||
|
||||
#endif
|
@@ -1,18 +1,3 @@
|
||||
# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32a
|
||||
|
||||
@@ -34,10 +19,10 @@ CONSOLE_ENABLE = yes
|
||||
COMMAND_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = yes
|
||||
RGBLIGHT_ENABLE = yes
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
WS2812_DRIVER = i2c
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
# custom matrix setup
|
||||
CUSTOM_MATRIX = yes
|
||||
SRC = matrix.c i2c.c
|
||||
SRC = matrix.c
|
||||
|
@@ -16,56 +16,36 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "v32a.h"
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
#include "backlight.h"
|
||||
#endif
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
#include "rgblight.h"
|
||||
#endif
|
||||
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
#include "action_layer.h"
|
||||
#include "i2c.h"
|
||||
#include "quantum.h"
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_init();
|
||||
i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM);
|
||||
}
|
||||
#endif
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
rgblight_task();
|
||||
#endif
|
||||
}
|
||||
void matrix_scan_user(void) {}
|
||||
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
void backlight_init_ports(void) {
|
||||
DDRD |= (1<<0 | 1<<1 | 1<<4 | 1<<6);
|
||||
PORTD &= ~(1<<0 | 1<<1 | 1<<4 | 1<<6);
|
||||
setPinOutput(D0);
|
||||
setPinOutput(D1);
|
||||
setPinOutput(D4);
|
||||
setPinOutput(D6);
|
||||
|
||||
writePinLow(D0);
|
||||
writePinLow(D1);
|
||||
writePinLow(D4);
|
||||
writePinLow(D6);
|
||||
}
|
||||
|
||||
void backlight_set(uint8_t level) {
|
||||
if (level == 0) {
|
||||
// Turn out the lights
|
||||
PORTD &= ~(1<<0 | 1<<1 | 1<<4 | 1<<6);
|
||||
writePinLow(D0);
|
||||
writePinLow(D1);
|
||||
writePinLow(D4);
|
||||
writePinLow(D6);
|
||||
} else {
|
||||
// Turn on the lights
|
||||
PORTD |= (1<<0 | 1<<1 | 1<<4 | 1<<6);
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
writePinHigh(D6);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@@ -17,40 +17,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "jj4x4.h"
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
|
||||
#include <string.h>
|
||||
#include "i2c_master.h"
|
||||
#include "rgblight.h"
|
||||
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
void matrix_init_kb(void) {
|
||||
i2c_init();
|
||||
// call user level keymaps, if any
|
||||
matrix_init_user();
|
||||
}
|
||||
// custom RGB driver
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
memset(led, 0, 3 * RGBLED_NUM);
|
||||
}
|
||||
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
|
||||
bool rgb_init = false;
|
||||
|
||||
void matrix_scan_kb(void) {
|
||||
// if LEDs were previously on before poweroff, turn them back on
|
||||
if (rgb_init == false && rgblight_config.enable) {
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
rgb_init = true;
|
||||
}
|
||||
|
||||
rgblight_task();
|
||||
matrix_scan_user();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@@ -1,18 +1,3 @@
|
||||
# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32a
|
||||
|
||||
@@ -40,7 +25,7 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default
|
||||
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
WS2812_DRIVER = i2c
|
||||
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
@@ -48,6 +33,4 @@ AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
|
||||
|
||||
SRC += i2c_master.c
|
||||
|
||||
LAYOUTS = ortho_4x4
|
||||
|
@@ -1,104 +0,0 @@
|
||||
/*
|
||||
Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <util/twi.h>
|
||||
|
||||
#include "i2c.h"
|
||||
|
||||
void i2c_set_bitrate(uint16_t bitrate_khz) {
|
||||
uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz);
|
||||
if (bitrate_div >= 16) {
|
||||
bitrate_div = (bitrate_div - 16) / 2;
|
||||
}
|
||||
TWBR = bitrate_div;
|
||||
}
|
||||
|
||||
void i2c_init(void) {
|
||||
// set pull-up resistors on I2C bus pins
|
||||
PORTC |= 0b11;
|
||||
|
||||
i2c_set_bitrate(400);
|
||||
|
||||
// enable TWI (two-wire interface)
|
||||
TWCR |= (1 << TWEN);
|
||||
|
||||
// enable TWI interrupt and slave address ACK
|
||||
TWCR |= (1 << TWIE);
|
||||
TWCR |= (1 << TWEA);
|
||||
}
|
||||
|
||||
uint8_t i2c_start(uint8_t address) {
|
||||
// reset TWI control register
|
||||
TWCR = 0;
|
||||
|
||||
// begin transmission and wait for it to end
|
||||
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
|
||||
while (!(TWCR & (1<<TWINT)));
|
||||
|
||||
// check if the start condition was successfully transmitted
|
||||
if ((TWSR & 0xF8) != TW_START) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// transmit address and wait
|
||||
TWDR = address;
|
||||
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||
while (!(TWCR & (1<<TWINT)));
|
||||
|
||||
// check if the device has acknowledged the READ / WRITE mode
|
||||
uint8_t twst = TW_STATUS & 0xF8;
|
||||
if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void i2c_stop(void) {
|
||||
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
|
||||
}
|
||||
|
||||
uint8_t i2c_write(uint8_t data) {
|
||||
TWDR = data;
|
||||
|
||||
// transmit data and wait
|
||||
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||
while (!(TWCR & (1<<TWINT)));
|
||||
|
||||
if ((TWSR & 0xF8) != TW_MT_DATA_ACK) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length) {
|
||||
if (i2c_start(address)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (uint16_t i = 0; i < length; i++) {
|
||||
if (i2c_write(data[i])) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_stop();
|
||||
|
||||
return 0;
|
||||
}
|
@@ -1,25 +0,0 @@
|
||||
/*
|
||||
Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __I2C_H__
|
||||
#define __I2C_H__
|
||||
|
||||
void i2c_init(void);
|
||||
void i2c_set_bitrate(uint16_t bitrate_khz);
|
||||
uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length);
|
||||
|
||||
#endif
|
@@ -17,24 +17,20 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "jj50.h"
|
||||
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
#include "action_layer.h"
|
||||
#include "i2c.h"
|
||||
#include "quantum.h"
|
||||
|
||||
#include "backlight.h"
|
||||
#include "backlight_custom.h"
|
||||
|
||||
// for keyboard subdirectory level init functions
|
||||
// @Override
|
||||
void matrix_init_kb(void) {
|
||||
// call user level keymaps, if any
|
||||
matrix_init_user();
|
||||
}
|
||||
void matrix_init_kb(void) { matrix_init_user(); }
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_init_user(void) {}
|
||||
|
||||
void matrix_scan_kb(void) { matrix_scan_user(); }
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {}
|
||||
|
||||
#ifdef BACKLIGHT_ENABLE
|
||||
/// Overrides functions in `quantum.c`
|
||||
void backlight_init_ports(void) {
|
||||
b_led_init_ports();
|
||||
}
|
||||
@@ -47,48 +43,3 @@ void backlight_set(uint8_t level) {
|
||||
b_led_set(level);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
extern rgblight_config_t rgblight_config;
|
||||
|
||||
// custom RGB driver
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
for (uint8_t i=0; i<RGBLED_NUM; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_init();
|
||||
i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM);
|
||||
}
|
||||
|
||||
bool rgb_init = false;
|
||||
|
||||
void matrix_scan_kb(void) {
|
||||
// if LEDs were previously on before poweroff, turn them back on
|
||||
if (rgb_init == false && rgblight_config.enable) {
|
||||
i2c_init();
|
||||
i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM);
|
||||
rgb_init = true;
|
||||
}
|
||||
|
||||
rgblight_task();
|
||||
#else
|
||||
void matrix_scan_kb(void) {
|
||||
#endif
|
||||
matrix_scan_user();
|
||||
/* Nothing else for now. */
|
||||
}
|
||||
|
||||
__attribute__((weak)) // overridable
|
||||
void matrix_init_user(void) {
|
||||
|
||||
}
|
||||
|
||||
__attribute__((weak)) // overridable
|
||||
void matrix_scan_user(void) {
|
||||
|
||||
}
|
||||
|
@@ -1,19 +1,3 @@
|
||||
# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
# Modified 2018 Wayne Jones (WarmCatUK) <waynekjones@gmail.com>
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32a
|
||||
|
||||
@@ -35,22 +19,18 @@ CONSOLE_ENABLE = no
|
||||
COMMAND_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = yes
|
||||
RGBLIGHT_ENABLE = yes
|
||||
RGBLIGHT_CUSTOM_DRIVER = yes
|
||||
WS2812_DRIVER = i2c
|
||||
NKRO_ENABLE = no
|
||||
# Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
|
||||
|
||||
DISABLE_WS2812 = no
|
||||
|
||||
KEY_LOCK_ENABLE = yes
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
|
||||
|
||||
#OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
# custom matrix setup
|
||||
CUSTOM_MATRIX = yes
|
||||
SRC = matrix.c i2c.c backlight.c
|
||||
SRC = matrix.c backlight.c
|
||||
|
||||
LAYOUTS = ortho_5x12
|
||||
|
@@ -27,12 +27,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define MATRIX_ROWS 6
|
||||
#define MATRIX_COLS 4
|
||||
|
||||
// 0 1 2 3 4 5
|
||||
#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4, B5 }
|
||||
#define MATRIX_COL_PINS { A0, A1, A2, A3 }
|
||||
#define UNUSED_PINS
|
||||
|
||||
#define DIODE_DIRECTION COL2ROW
|
||||
#define DEBOUNCE 5
|
||||
|
||||
#define BACKLIGHT_LEVELS 1
|
||||
#define BACKLIGHT_PIN D4
|
||||
#define BACKLIGHT_BREATHING
|
||||
|
||||
#define RGBLIGHT_ANIMATIONS
|
||||
#define RGBLED_NUM 6
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"keyboard_name": "KBDFans KBDPad MKI",
|
||||
"url": "",
|
||||
"keyboard_name": "KBDfans KBDPad MKI",
|
||||
"url": "https://kbdfans.com/products/kbdfans-pad-custom-mechanical-keyboard-diy-kit",
|
||||
"maintainer": "qmk",
|
||||
"width": 4,
|
||||
"height": 6.25,
|
||||
|
@@ -13,76 +13,17 @@
|
||||
* 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 "i2c_master.h"
|
||||
#include "quantum.h"
|
||||
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
#include "rgblight.h"
|
||||
extern rgblight_config_t rgblight_config;
|
||||
#include "mk1.h"
|
||||
|
||||
void rgblight_set(void) {
|
||||
if (!rgblight_config.enable) {
|
||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
||||
led[i].r = 0;
|
||||
led[i].g = 0;
|
||||
led[i].b = 0;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_init();
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
#endif
|
||||
#define NUMLOCK_PIN D0
|
||||
|
||||
void matrix_init_kb(void) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
if (rgblight_config.enable) {
|
||||
i2c_init();
|
||||
i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
|
||||
}
|
||||
#endif
|
||||
// call user level keymaps, if any
|
||||
setPinOutput(NUMLOCK_PIN);
|
||||
matrix_init_user();
|
||||
}
|
||||
|
||||
void matrix_scan_kb(void) {
|
||||
#ifdef RGBLIGHT_ENABLE
|
||||
rgblight_task();
|
||||
#endif
|
||||
matrix_scan_user();
|
||||
/* Nothing else for now. */
|
||||
void led_set_kb(uint8_t usb_led) {
|
||||
writePin(NUMLOCK_PIN, IS_LED_ON(usb_led, USB_LED_NUM_LOCK));
|
||||
led_set_user(usb_led);
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {
|
||||
}
|
||||
|
||||
void backlight_init_ports(void) {
|
||||
// initialize pins D0, D1, D4 and D6 as output
|
||||
setPinOutput(D0);
|
||||
setPinOutput(D1);
|
||||
setPinOutput(D4);
|
||||
setPinOutput(D6);
|
||||
|
||||
// turn backlight LEDs on
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
writePinHigh(D6);
|
||||
}
|
||||
|
||||
void backlight_set(uint8_t level) {
|
||||
if (level == 0) {
|
||||
// turn backlight LEDs off
|
||||
writePinLow(D0);
|
||||
writePinLow(D1);
|
||||
writePinLow(D4);
|
||||
writePinLow(D6);
|
||||
} else {
|
||||
// turn backlight LEDs on
|
||||
writePinHigh(D0);
|
||||
writePinHigh(D1);
|
||||
writePinHigh(D4);
|
||||
writePinHigh(D6);
|
||||
}
|
||||
}
|
@@ -4,7 +4,7 @@ Custom numpad.
|
||||
|
||||
Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin)
|
||||
Hardware Supported: KBDPad MKI
|
||||
Hardware Availability: No longer available.
|
||||
Hardware Availability: [KBDfans](https://kbdfans.com/products/kbdfans-pad-custom-mechanical-keyboard-diy-kit)
|
||||
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
@@ -1,18 +1,3 @@
|
||||
# Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# MCU name
|
||||
MCU = atmega32a
|
||||
|
||||
@@ -31,11 +16,9 @@ BOOTMAGIC_ENABLE = no
|
||||
MOUSEKEY_ENABLE = yes
|
||||
EXTRAKEY_ENABLE = yes
|
||||
CONSOLE_ENABLE = yes
|
||||
COMMAND_ENABLE = yes
|
||||
COMMAND_ENABLE = no
|
||||
BACKLIGHT_ENABLE = yes
|
||||
RGBLIGHT_ENABLE = no
|
||||
RGBLIGHT_CUSTOM_DRIVER = no
|
||||
RGBLIGHT_ENABLE = no # PCB has underglow LEDs, but case doesn't let them show.
|
||||
WS2812_DRIVER = i2c
|
||||
|
||||
OPT_DEFS = -DDEBUG_LEVEL=0
|
||||
|
||||
QUANTUM_LIB_SRC = i2c_master.c
|
||||
|
@@ -6,3 +6,12 @@
|
||||
#define BACKLIGHT_BREATHING
|
||||
#define BACKLIGHT_LEVELS 5
|
||||
#define BREATHING_PERIOD 4
|
||||
|
||||
#ifdef LOCKING_SUPPORT_ENABLE
|
||||
# undef LOCKING_SUPPORT_ENABLE
|
||||
#endif
|
||||
#ifdef LOCKING_RESYNC_ENABLE
|
||||
# undef LOCKING_RESYNC_ENABLE
|
||||
#endif
|
||||
|
||||
#define NO_ACTION_ONESHOT
|
||||
|
@@ -8,42 +8,39 @@
|
||||
/**********************
|
||||
** LAYER DEFINITIONS **
|
||||
**********************/
|
||||
enum layers_keymap {
|
||||
enum layer_names {
|
||||
// BASE LAYERS
|
||||
// SHORT CODES
|
||||
_QWERTY = 0,
|
||||
_QW = _QWERTY,
|
||||
_DVORAK,
|
||||
_DV = _DVORAK,
|
||||
_COLEMAK,
|
||||
_CM = _COLEMAK,
|
||||
_MAC,
|
||||
_MC = _MAC,
|
||||
_QUAKE2,
|
||||
_Q2 = _QUAKE2,
|
||||
_QUAKE2_DVORAK,
|
||||
_QD = _QUAKE2_DVORAK,
|
||||
_QUAKE2_CONSOLE,
|
||||
|
||||
_QC = _QUAKE2_CONSOLE,
|
||||
// FUNCTION LAYERS
|
||||
_FUNCWIN,
|
||||
_FW = _FUNCWIN,
|
||||
_FUNCMAC,
|
||||
_FM = _FUNCMAC,
|
||||
_FUNCQ2,
|
||||
|
||||
_FQ = _FUNCQ2,
|
||||
// OTHER LAYERS
|
||||
_NUMPAD,
|
||||
_NP = _NUMPAD,
|
||||
_MACROS,
|
||||
_SYSTEM
|
||||
_MA = _MACROS,
|
||||
_SYSTEM,
|
||||
_SY = _SYSTEM,
|
||||
};
|
||||
|
||||
// LAYER SHORT CODES
|
||||
#define _QW _QWERTY
|
||||
#define _DV _DVORAK
|
||||
#define _CM _COLEMAK
|
||||
#define _MC _MAC
|
||||
#define _Q2 _QUAKE2
|
||||
#define _QD _QUAKE2_DVORAK
|
||||
#define _QC _QUAKE2_CONSOLE
|
||||
#define _FW _FUNCWIN
|
||||
#define _FM _FUNCMAC
|
||||
#define _FQ _FUNCQ2
|
||||
#define _NP _NUMPAD
|
||||
#define _MA _MACROS
|
||||
#define _SY _SYSTEM
|
||||
|
||||
|
||||
// KEYCODE DEFINITIONS
|
||||
#define NO_CHNG KC_TRNS // Note for me for keys I need to leave as Pass-through
|
||||
@@ -58,6 +55,8 @@ enum layers_keymap {
|
||||
#define WN_COPY LCTL(DV_C) // Windows/Linux Copy
|
||||
#define WN_PSTE LCTL(DV_V) // Windows/Linux Paste
|
||||
|
||||
#define CTL_GRV MT(MOD_LCTL, KC_GRV) // Left Control when held, Grave accent when tapped
|
||||
|
||||
#define MC_PSCR LGUI(LSFT(KC_3)) // MacOS Print Screen (Command + Shift + 3)
|
||||
#define MC_HOME LGUI(KC_LEFT) // MacOS Home (Command + Left Arrow)
|
||||
#define MC_END LGUI(KC_RGHT) // MacOS End (Command + Right Arrow)
|
||||
@@ -252,6 +251,21 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case KC_F1 ... KC_F12:
|
||||
if (record->event.pressed) {
|
||||
if ( get_mods() & MOD_MASK_RALT ) {
|
||||
register_code( keycode + 0x2E );
|
||||
} else {
|
||||
register_code( keycode );
|
||||
}
|
||||
} else {
|
||||
if ( get_mods() & MOD_MASK_RALT ) {
|
||||
unregister_code( keycode + 0x2E );
|
||||
} else {
|
||||
unregister_code( keycode );
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} // switch()
|
||||
return true;
|
||||
};
|
||||
@@ -267,31 +281,31 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* QWERTY */
|
||||
[_QWERTY] = LAYOUT_60_ansi(
|
||||
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
||||
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
|
||||
FW_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
|
||||
KC_LSFT, NUBS_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FW), KC_RCTL \
|
||||
CTL_GRV, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_MA), MO(_FW), KC_RCTL \
|
||||
),
|
||||
|
||||
/* Dvorak */
|
||||
[_DVORAK] = LAYOUT_60_ansi(
|
||||
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
||||
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, \
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, \
|
||||
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, \
|
||||
FW_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, \
|
||||
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, \
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FW), KC_RCTL \
|
||||
CTL_GRV, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_MA), MO(_FW), KC_RCTL \
|
||||
),
|
||||
|
||||
/* Colemak */
|
||||
[_COLEMAK] = LAYOUT_60_ansi(
|
||||
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
||||
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
|
||||
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, \
|
||||
FW_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, \
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FW), KC_RCTL \
|
||||
CTL_GRV, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_MA), MO(_FW), KC_RCTL \
|
||||
),
|
||||
|
||||
/****************
|
||||
@@ -391,9 +405,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* Macro layer */
|
||||
[_MACROS] = LAYOUT_60_ansi(
|
||||
// 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
||||
TG(_MA), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, G_PUSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, G_FTCH, G_COMM, _______, _______, _______, _______, T_L3DED, _______, _______, _______, \
|
||||
TG(_MA), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DM_REC1, DM_REC2, _______, \
|
||||
_______, _______, _______, G_PUSH, _______, _______, _______, _______, _______, _______, _______, DM_PLY1, DM_PLY2, DM_RSTP, \
|
||||
_______, _______, _______, G_FTCH, G_COMM, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, G_BRCH, SIGNA, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, NO_CHNG, _______ \
|
||||
),
|
||||
|
@@ -1,12 +1,24 @@
|
||||
# @noroadsleft's KC60 keymap
|
||||
|
||||
### Last updated: April 7, 2019, 2:26 AM UTC-0700
|
||||
### Last updated: November 5, 2019, 12:07 AM UTC-0800
|
||||
|
||||

|
||||
|
||||
I am a full-time Dvorak typist, and occasional semi-serious FPS gamer. The layers are oriented towards a mix of typing and gaming.
|
||||
|
||||
|
||||
----
|
||||
|
||||
# Preface
|
||||
|
||||
Images in this readme follow the following format:
|
||||
|
||||

|
||||
*Legend*
|
||||
|
||||
Descriptions of the physical locations of keys will use the key's function in a US QWERTY layout, even if the layout itself is not QWERTY.
|
||||
|
||||
|
||||
----
|
||||
|
||||
# Outline
|
||||
|
@@ -12,21 +12,14 @@
|
||||
|
||||
## Layer 0: QWERTY - `_QW`
|
||||
|
||||
Standard QWERTY layout, with three QMK features:
|
||||
Standard QWERTY layout, with four QMK features:
|
||||
|
||||
- The `Menu` key has been replaced by `MO(_FW)`, which moves to my Windows Fn layer when held.
|
||||
- The Right `GUI` key has been replaced with a `MO(_MA)` key, which moves to the Macro layer when held.
|
||||
- The `Caps Lock` key has been replaced with a dual function `LT()` key, which opens the Windows Fn layer when held, and is `Caps Lock` when tapped
|
||||
- The `Escape` key has been replaced with a `KC_GESC` `` ` ~ `` key when used with a `Fn` key or a `Shift` key
|
||||
- The Left `Control` key has been replaced with a `MT(MOD_CTRL, KC_GRV)` key, which is <code>` ~</code> when tapped and `Ctrl` when held.
|
||||
|
||||
###### For the rest of this readme, the physical location of keys will be referred to by their function in a US QWERTY layout.
|
||||
|
||||

|
||||
|
||||
Keycode(s) Sent | Notes
|
||||
:---------------------------------------------------- | :----
|
||||
[`KC_GESC`](https://docs.qmk.fm/#/feature_grave_esc) | `Esc` when tapped alone, `` ` ~ `` when used with a `Shift` or `GUI` key.
|
||||
`LT(_FW, KC_CAPS)` | Opens the Windows Fn layer when held; toggles Caps Lock when tapped.
|
||||
`MO(_FW)` | Opens the Windows Fn layer when held.
|
||||

|
||||
|
||||
|
||||
----
|
||||
@@ -37,13 +30,7 @@ Keycode(s) Sent | Notes
|
||||
|
||||
A hardware-based Dvorak Simplified layout. At my weekend job, I use a shared computer that runs MacOS Sierra, in US QWERTY layout. In this layer, I can leave the system in QWERTY, plug my keyboard in, and still type in Dvorak.
|
||||
|
||||

|
||||
|
||||
Keycode(s) Sent | Notes
|
||||
:---------------------------------------------------- | :----
|
||||
[`KC_GESC`](https://docs.qmk.fm/#/feature_grave_esc) | `Esc` when tapped alone, `` ` ~ `` when used with a `Shift` or `GUI` key.
|
||||
`LT(_FW, KC_CAPS)` | Opens the Windows Fn layer when held; toggles Caps Lock when tapped.
|
||||
`MO(_FW)` | Opens the Windows Fn layer when held.
|
||||

|
||||
|
||||
|
||||
----
|
||||
@@ -54,13 +41,7 @@ Keycode(s) Sent | Notes
|
||||
|
||||
A hardware-based Colemak layout. Been thinking of trying it, so it's here.
|
||||
|
||||

|
||||
|
||||
Keycode(s) Sent | Notes
|
||||
:---------------------------------------------------- | :----
|
||||
[`KC_GESC`](https://docs.qmk.fm/#/feature_grave_esc) | `Esc` when tapped alone, `` ` ~ `` when used with a `Shift` or `GUI` key.
|
||||
`LT(_FW, KC_CAPS)` | Opens the Windows Fn layer when held; toggles Caps Lock when tapped.
|
||||
`MO(_FW)` | Opens the Windows Fn layer when held.
|
||||

|
||||
|
||||
|
||||
----
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
This layer overrides the `Fn` keys on whichever base layer is currently enabled, sending the keyboard to the MacOS-oriented Fn layer `_FM`, instead of the Windows Fn layer `_FW`.
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
----
|
||||
|
@@ -16,20 +16,20 @@
|
||||
|
||||
These layers were born out of the confusion I have had trying to use the in-game chat and the console in [Quake 2](https://en.wikipedia.org/wiki/Quake_II). When Quake 2 came out, alternate keyboard layouts weren't really a thing. As a result, all in-game text input is hard-locked to US QWERTY, regardless of what the operating system is using for its input method.
|
||||
|
||||
I'm attempting to solve this by some creative use of QMK's macro feature. The keycode in the System layer that enables these layers, [`GO_Q2`](./keymap.c#L404), is a [macro](./keymap.c#L165-L172) that sets the default layer to the QWERTY layer, then turns the Quake 2 layer `_Q2` on. The result is a partially-overwritten QWERTY layer, that has some keycodes with some creative layer switching.
|
||||
I'm attempting to solve this by some creative use of QMK's macro feature. The keycode in the System layer that enables these layers, [`GO_Q2`](./keymap.c#L418), is a [macro](./keymap.c#L164-L171) that sets the default layer to the QWERTY layer, then turns the Quake 2 layer `_Q2` on. The result is a partially-overwritten QWERTY layer, that has some keycodes with some creative layer switching.
|
||||
|
||||
When I hit the `Enter` key (bound in-game to text chat), the [macro keycode](./keymap.c#L173-L179) I've created sends the keycode for `Enter`, then follows with enabling the Hardware Dvorak layer and its corresponding overlay. Now the game is in text chat mode, and my keyboard is in Dvorak. When I hit `Enter` again, another `Enter` [keycode macro](./keymap.c#L180-L186) is sent, which sends the message, then the macro brings me back to the standard QWERTY+Quake 2 setup. Hitting `Escape` instead runs a [macro](./keymap.c#L187-L193) that cancels the sending of the message, and undoes the layers.
|
||||
When I hit the `Enter` key (bound in-game to text chat), the [macro keycode](./keymap.c#L172-L178) I've created sends the keycode for `Enter`, then follows with enabling the Hardware Dvorak layer and its corresponding overlay. Now the game is in text chat mode, and my keyboard is in Dvorak. When I hit `Enter` again, another `Enter` [keycode macro](./keymap.c#L179-L185) is sent, which sends the message, then the macro brings me back to the standard QWERTY+Quake 2 setup. Hitting `Escape` instead runs a [macro](./keymap.c#L186-L192) that cancels the sending of the message, and undoes the layers.
|
||||
|
||||
I have been testing this configuration for a few months. Sometimes I end up still in Dvorak mode without any text input systems (in-game chat or the console) running, but it pretty much always happens when I'm focused on the game, so I don't know the cause yet.
|
||||
|
||||
### Layer 4: Quake 2
|
||||

|
||||

|
||||
|
||||
### Layer 5: Quake 2 Dvorak
|
||||

|
||||

|
||||
|
||||
### Layer 6: Quake 2 Console
|
||||

|
||||

|
||||
|
||||
|
||||
----
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
Arrows, Navigation keys (Insert, Home, Page Up, etc.), and Function keys are here. Also has keys for Calculator, Menu, Volume Control, and shortcuts for Select All, Undo, Cut, Copy, and Paste. Numpad Enter for when I'm working in Adobe Photoshop, because it treats Numpad Enter differently from the regular Enter key.
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
----
|
||||
@@ -27,7 +27,7 @@ Arrows, Navigation keys (Insert, Home, Page Up, etc.), and Function keys are her
|
||||
|
||||
Based on my Windows Fn layer, but swaps a few functions for a MacOS environment. Arrow, Navigation, and Function keys are basically unchanged from Layer 2. This layer enables using either `Fn` key as a sort of simulated `Command` key, which I find easier to reach and use.
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
----
|
||||
@@ -38,11 +38,11 @@ Based on my Windows Fn layer, but swaps a few functions for a MacOS environment.
|
||||
|
||||
Based on the Windows function layer, but removes some functions that are pointless to have while in the game.
|
||||
|
||||

|
||||

|
||||
|
||||
Keycode(s) Sent | Notes
|
||||
:-------------------------------- | :----
|
||||
[`Q2_GRV`](./keymap.c#L194-L201) | Sends `KC_GRV`, then enables the Dvorak, Quake 2 Dvorak, and Quake 2 Console layers.
|
||||
[`Q2_GRV`](./keymap.c#L193-L200) | Sends `KC_GRV`, then enables the Dvorak, Quake 2 Dvorak, and Quake 2 Console layers.
|
||||
|
||||
|
||||
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
Puts a Numpad on the right-hand side of the keyboard. A through F included for hexadecimal input. Tapping `Space` returns to the previous Base Layer.
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
----
|
||||
@@ -25,42 +25,35 @@ Puts a Numpad on the right-hand side of the keyboard. A through F included for h
|
||||
|
||||
### Accessed by holding the `Fn` key and tapping the right-side `Win` key
|
||||
|
||||
Has some macros that I use in Git, and some frequently-typed strings.
|
||||
Has some macros that I use in Git, some frequently-typed strings, and keys for use with the [Dynamic Macros feature](https://docs.qmk.fm/#/feature_dynamic_macros).
|
||||
|
||||
Tapping `Esc` exits the Macro layer, if the macro used doesn't do it automatically.
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### Macros
|
||||
|
||||
#### [T_L3DED](./keymap.c#L122-L126)
|
||||
|
||||
Output: `lavak3DED `
|
||||
|
||||
Twitch emote for [a streamer I watch a lot](https://www.twitch.tv/lavak3_).
|
||||

|
||||
|
||||
#### [G_PUSH](./keymap.c#L127-L131)
|
||||
#### [G_PUSH](./keymap.c#L126-L130)
|
||||
|
||||
Output: `git push origin `
|
||||
|
||||
Everything from here down is related to Git or GitHub.
|
||||
|
||||
#### [G_FTCH](./keymap.c#L132-L141)
|
||||
#### [G_FTCH](./keymap.c#L131-L140)
|
||||
|
||||
| Condition | Output |
|
||||
| :-------- | :----- |
|
||||
| If <kbd>Shift</kbd> is active | `git pull upstream ` |
|
||||
| Otherwise | `git fetch upstream ` |
|
||||
|
||||
#### [G_COMM](./keymap.c#L142-L147)
|
||||
#### [G_COMM](./keymap.c#L141-L146)
|
||||
|
||||
Output: `git commit -m ""` <kbd>Left</kbd>
|
||||
|
||||
Readies a `git commit` command, moves the cursor between the quotation marks, then disables the Macro layer.
|
||||
|
||||
#### [G_BRCH](./keymap.c#L148-L158)
|
||||
#### [G_BRCH](./keymap.c#L147-L157)
|
||||
|
||||
| Condition | Output |
|
||||
| :-------- | :----- |
|
||||
@@ -69,13 +62,13 @@ Readies a `git commit` command, moves the cursor between the quotation marks, th
|
||||
|
||||
`$(git branch-name)` is a [git alias](./readme_git.md) that returns the name of the current branch. This macro disables the Macro layer when finished.
|
||||
|
||||
#### [SIGNA](./keymap.c#L159-L164)
|
||||
#### [SIGNA](./keymap.c#L158-L163)
|
||||
|
||||
Output: `\- @noroadsleft` <kbd>Enter</kbd>
|
||||
|
||||
Sometimes on GitHub, I sign my comments. Types my GitHub name in Markdown syntax, and then taps the `Enter` key. Disables the Macro layer when finished.
|
||||
|
||||
#### [MC_UNDO](./keymap.c#L202-L210)
|
||||
#### [MC_UNDO](./keymap.c#L201-L209)
|
||||
|
||||
| Condition | Output |
|
||||
| :-------- | :----- |
|
||||
@@ -84,7 +77,7 @@ Sometimes on GitHub, I sign my comments. Types my GitHub name in Markdown syntax
|
||||
|
||||
An Undo shortcut that turns to Redo if <kbd>Shift</kbd> is being held. I'm not sure that part is required to get that behavior, but it works as desired, so I'm not messing with it.
|
||||
|
||||
#### [MC_PSTE](./keymap.c#L211-L219)
|
||||
#### [MC_PSTE](./keymap.c#L210-L218)
|
||||
|
||||
| Condition | Output |
|
||||
| :-------- | :----- |
|
||||
@@ -93,7 +86,7 @@ An Undo shortcut that turns to Redo if <kbd>Shift</kbd> is being held. I'm not s
|
||||
|
||||
The program I use this in uses <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>Option</kbd> + <kbd>V</kbd> to paste while maintaining formatting (typeface, text size, etc.). Sometimes I want this and sometimes I don't. Using <kbd>Shift</kbd> changes the behavior.
|
||||
|
||||
#### [NUBS_Z](./keymap.c#L220-L234)
|
||||
#### [NUBS_Z](./keymap.c#L219-L233)
|
||||
|
||||
| Condition | Output |
|
||||
| :-------- | :----- |
|
||||
@@ -102,16 +95,20 @@ The program I use this in uses <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>Opti
|
||||
|
||||
Sometimes I type in languages from countries that use ISO layout, but my keyboard is ANSI, so I have one key fewer. This macro simulates the Non-US Backslash key if I use Right Alt + Z.
|
||||
|
||||
#### [VRSN](./keymap.c#L235-L239)
|
||||
#### [VRSN](./keymap.c#L234-L238)
|
||||
|
||||
Outputs a string that tells me the Git commit from which my flashed firmware was built. Looks something like:
|
||||
|
||||
kc60/noroadsleft @ 0.6.326-6-gae6d7b-dirty
|
||||
|
||||
#### [Emulated Numeric Keypad](./keymap.c#L240-L254)
|
||||
#### [Emulated Numeric Keypad](./keymap.c#L239-L253)
|
||||
|
||||
If I hold the Right Alt key, the number row (`KC_1` through `KC_0`) will output numpad keycodes instead of number row keycodes, enabling quicker access to characters like ™ and °.
|
||||
|
||||
#### [Emulated Extended Function Keys](./keymap.c#L254-L268)
|
||||
|
||||
Similar to the emulated numpad, if I hold the Right Alt key with the Fn key, the function row (`KC_F1` through `KC_F12`) will output keycodes `KC_F13` throught `KC_F24`.
|
||||
|
||||
----
|
||||
|
||||
### Layer 12: System layer - `_SY`
|
||||
@@ -120,7 +117,7 @@ If I hold the Right Alt key, the number row (`KC_1` through `KC_0`) will output
|
||||
|
||||
This is where I change my keyboard function. Base layer select on `1` through `3`, Backlight controls on `C` through `N`, Reset on `8*`, Debug on `0)`.
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
----
|
||||
|
@@ -11,7 +11,8 @@
|
||||
# Cherry Pick
|
||||
cp = cherry-pick
|
||||
|
||||
# Check out a Pull Request
|
||||
# Check out a Pull Request locally
|
||||
# e.g. `git cop 351` fetches the commits from Pull Request #351 and saves it to local branch 'pr/351'.
|
||||
cop = "!f() { git fetch upstream pull/$1/head:pr/$1; git checkout pr/$1; }; f"
|
||||
|
||||
# Sync master branch
|
||||
@@ -39,13 +40,17 @@
|
||||
|
||||
# Short-form status
|
||||
st = "!git status --short --untracked-files=no"
|
||||
stu = "!git ls-files --others -x '*/*'"
|
||||
|
||||
# Returns the name of the current branch
|
||||
branch-name = "!git rev-parse --abbrev-ref HEAD"
|
||||
bn = "!git branch-name" # short-form of the above
|
||||
# List branches by the date of their last commit, newest to oldest
|
||||
bbd = "for-each-ref --count=30 --sort=-committerdate refs/heads/ --format='[33m%(objectname)[0m %(objecttype) [32m%(refname:short)[0m (%(authordate))'"
|
||||
|
||||
# Compare commit counts between current branch and QMK master
|
||||
cc = "!f() { git fetch upstream; echo \"[0;32m$(git branch-name)[0m vs. [0;31mupstream/master[0m\"; git rev-list --left-right --count $(git branch-name)...upstream/master; }; f"
|
||||
# e.g. `git cc dev_branch upstream/master` returns how many commits are on `dev_branch` and not on `upstream/master`, and vice versa.
|
||||
cc = "!f() { git fetch upstream; echo \"[0;32m$(git branch-name)[0m vs. [0;31m$2[0m\"; git rev-list --left-right --count $1...$2; }; f"
|
||||
|
||||
# Push to origin repo
|
||||
po = "push origin $(git branch-name)"
|
||||
@@ -71,6 +76,4 @@
|
||||
|
||||
# Force push without overwriting established history
|
||||
pushf = push --force-with-lease
|
||||
|
||||
|
||||
```
|
||||
|
@@ -1,2 +1,8 @@
|
||||
# https://github.com/qmk/qmk_firmware/issues/3448#issuecomment-406636125
|
||||
EXTRAFLAGS += -flto
|
||||
# EXTRAFLAGS += -flto
|
||||
LINK_TIME_OPTIMIZATION_ENABLE = yes
|
||||
|
||||
MOUSEKEY_ENABLE = no # Mouse keys
|
||||
# COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
SPACE_CADET_ENABLE = no # Space Cadet
|
||||
DYNAMIC_MACRO_ENABLE = yes
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com>
|
||||
Copyright 2017 Danny Nguyen <danny@keeb.io>
|
||||
|
||||
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
|
||||
@@ -15,11 +15,21 @@ You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// Please do not modify this file
|
||||
|
||||
#pragma once
|
||||
|
||||
void i2c_init(void);
|
||||
void i2c_set_bitrate(uint16_t bitrate_khz);
|
||||
uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length);
|
||||
// #define USE_I2C
|
||||
#define EE_HANDS
|
||||
|
||||
#undef RGBLED_NUM
|
||||
#define RGBLIGHT_ANIMATIONS
|
||||
#define RGBLED_NUM 12
|
||||
#define RGBLIGHT_HUE_STEP 2
|
||||
#define RGBLIGHT_SAT_STEP 8
|
||||
#define RGBLIGHT_VAL_STEP 8
|
||||
|
||||
#ifndef NO_DEBUG
|
||||
# define NO_DEBUG
|
||||
#endif // !NO_DEBUG
|
||||
#if !defined(NO_PRINT) && !defined(CONSOLE_ENABLE)
|
||||
# define NO_PRINT
|
||||
#endif // !NO_PRINT
|
39
keyboards/keebio/iris/keymaps/jerryhcooke/keymap.c
Normal file
39
keyboards/keebio/iris/keymaps/jerryhcooke/keymap.c
Normal file
@@ -0,0 +1,39 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
#define _QWERTY 0
|
||||
#define _LOWER 1
|
||||
#define _RAISE 2
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {[0] = LAYOUT(KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_ENT, LCTL_T(KC_LGUI), KC_Z, KC_X, KC_C, KC_D, KC_V, LGUI(KC_L), MEH_T(KC_MINS), KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_LGUI, LT(1, KC_QUOT), KC_SFTENT, KC_SPC, LT(2, KC_BSLS), LALT_T(KC_APP)),
|
||||
[1] = LAYOUT(KC_MPLY, KC_NO, KC_DQUO, KC_NO, LALT(KC_F4), KC_NO, KC_P7, KC_P8, KC_P9, KC_PMNS, KC_NO, RESET, KC_MPRV, KC_END, KC_UP, KC_HOME, KC_PGUP, KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS, RGB_SAI, RGB_SAD, KC_MNXT, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_NO, KC_P1, KC_P2, KC_P3, KC_PAST, RGB_HUI, RGB_HUD, KC_NO, KC_WBAK, KC_WFWD, KC_WSTP, KC_WREF, KC_NO, LCA(KC_DEL), KC_NLCK, KC_P0, KC_P0, KC_PDOT, KC_PENT, RGB_SPI, RGB_SPD, KC_PSCR, KC_NO, KC_LGUI, RGB_TOG, RGB_VAI, RGB_VAD),
|
||||
[2] = LAYOUT(KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_NO, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_K, KC_NO, KC_WH_D, KC_MS_U, KC_WH_U, KC_NO, KC_F12, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO)};
|
||||
|
||||
#ifdef ENCODER_ENABLE
|
||||
void encoder_update_user(uint8_t index, bool clockwise) {
|
||||
if (index == 0) {
|
||||
switch (biton32(layer_state)) {
|
||||
case _LOWER:
|
||||
clockwise ? tap_code(KC_MS_WH_UP) : tap_code(KC_MS_WH_DOWN);
|
||||
break;
|
||||
case _RAISE:
|
||||
clockwise ? rgblight_increase_hue() : rgblight_decrease_hue();
|
||||
break;
|
||||
default:
|
||||
clockwise ? tap_code(KC_AUDIO_VOL_UP) : tap_code(KC_AUDIO_VOL_DOWN);
|
||||
break;
|
||||
}
|
||||
} else if (index == 1) {
|
||||
switch (biton32(layer_state)) {
|
||||
case _LOWER:
|
||||
clockwise ? tap_code(KC_UP) : tap_code(KC_DOWN);
|
||||
break;
|
||||
case _RAISE:
|
||||
clockwise ? tap_code(KC_MEDIA_NEXT_TRACK) : tap_code(KC_MEDIA_PREV_TRACK);
|
||||
break;
|
||||
default:
|
||||
clockwise ? tap_code(KC_RIGHT) : tap_code(KC_LEFT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif // ENCODER_ENABLE
|
3
keyboards/keebio/iris/keymaps/jerryhcooke/readme.md
Normal file
3
keyboards/keebio/iris/keymaps/jerryhcooke/readme.md
Normal file
@@ -0,0 +1,3 @@
|
||||
[Jerry's Iris R4 Layout](https://imgur.com/a/JLytcqS)
|
||||
|
||||
This is a fairly modified version of the default keymap that I tinkered with to allow the rotary encoder to carry out a different function on each layer.
|
3
keyboards/keebio/iris/keymaps/jerryhcooke/rules.mk
Normal file
3
keyboards/keebio/iris/keymaps/jerryhcooke/rules.mk
Normal file
@@ -0,0 +1,3 @@
|
||||
RGBLIGHT_ENABLE = yes
|
||||
BACKLIGHT_ENABLE = yes
|
||||
MOUSEKEY_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