forked from Github/qmk_firmware
Compare commits
44 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
78205e64a7 | ||
![]() |
f3f1bb166a | ||
![]() |
63d899d1ad | ||
![]() |
2b30776dd0 | ||
![]() |
5414ff709f | ||
![]() |
26ce66e306 | ||
![]() |
c1970e284d | ||
![]() |
2075370633 | ||
![]() |
31eee6b05d | ||
![]() |
680d401faf | ||
![]() |
6fd88c1556 | ||
![]() |
0483327fa6 | ||
![]() |
cec391df70 | ||
![]() |
d96f0584a2 | ||
![]() |
0f249990a9 | ||
![]() |
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 |
8
.github/ISSUE_TEMPLATE/blank.md
vendored
8
.github/ISSUE_TEMPLATE/blank.md
vendored
@@ -1,5 +1,11 @@
|
||||
---
|
||||
name: Blank issue
|
||||
about: If you're 100% sure that you don't need one of the other issue templates, use this one instead.
|
||||
about: If you're 100% sure that you don't need one of the other issue templates, use
|
||||
this one instead.
|
||||
title: ''
|
||||
labels: help wanted, question
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
7
.github/ISSUE_TEMPLATE/bug_report.md
vendored
7
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,7 +1,12 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve the QMK Firmware
|
||||
about: Create a report to help us improve QMK Firmware.
|
||||
title: "[Bug] "
|
||||
labels: bug, help wanted, discussion
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!-- Provide a general summary of the bug in the title above. -->
|
||||
|
||||
<!--- This template is entirely optional and can be removed, but is here to help both you and us. -->
|
||||
|
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: QMK Discord
|
||||
url: https://discord.gg/Uq7gcHh
|
||||
about: Ask questions, discuss issues and features. Chill.
|
||||
- name: OLKB Subreddit
|
||||
url: https://www.reddit.com/r/olkb
|
||||
about: All things OLKB and QMK.
|
7
.github/ISSUE_TEMPLATE/feature_request.md
vendored
7
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,7 +1,12 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest a new feature or changes to existing features
|
||||
about: Suggest a new feature or changes to existing features.
|
||||
title: "[Feature Request] "
|
||||
labels: enhancement, help wanted, discussion
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!--- Provide a general summary of the changes you want in the title above. -->
|
||||
|
||||
<!--- This template is entirely optional and can be removed, but is here to help both you and us. -->
|
||||
|
7
.github/ISSUE_TEMPLATE/other_issues.md
vendored
7
.github/ISSUE_TEMPLATE/other_issues.md
vendored
@@ -1,7 +1,12 @@
|
||||
---
|
||||
name: Other issues
|
||||
about: Anything else that doesn't fall into the above categories.
|
||||
about: Anything else that doesn't fall into the above categories.
|
||||
title: ''
|
||||
labels: help wanted, question, discussion
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!--- Provide a general summary of the changes you want in the title above. -->
|
||||
|
||||
<!--- Anything on lines wrapped in comments like these will not show up in the final text. -->
|
||||
|
@@ -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
|
||||
|
@@ -33,6 +33,7 @@
|
||||
* [Keymap Overview](keymap.md)
|
||||
|
||||
* [Hardware](hardware.md)
|
||||
* [Compatible Microcontrollers](compatible_microcontrollers.md)
|
||||
* [AVR Processors](hardware_avr.md)
|
||||
* [Drivers](hardware_drivers.md)
|
||||
|
||||
|
@@ -1,25 +1,36 @@
|
||||
# Atmel AVR
|
||||
# Compatible Microcontrollers
|
||||
|
||||
QMK should run on any Atmel AVR processor with enough Flash. It has been tested on the following:
|
||||
QMK runs on any USB-capable AVR or ARM microcontroller with enough flash space - generally 32kB or more, though it will *just* squeeze into 16kB with most features disabled.
|
||||
|
||||
* ATmega32U4 ([PJRC Teensy 2.0](http://www.pjrc.com/teensy/))
|
||||
* AT90USB1286 ([PJRC Teensy++ 2.0](http://www.pjrc.com/teensy/))
|
||||
* AT90USB1287 ([Atmel USBKEY](http://www.atmel.com/tools/AT90USBKEY.aspx))
|
||||
* ATmega168P with using [V-USB](http://www.obdev.at/products/vusb/index.html)
|
||||
* ATmega328P with using [V-USB](http://www.obdev.at/products/vusb/index.html)
|
||||
* ATmega32U2
|
||||
* AT90USB1286, 646, 647 should work
|
||||
* AT90USB162 testing...
|
||||
## Atmel AVR
|
||||
|
||||
NOTE: To enable full features of firmware you'll need 32KB flash size.
|
||||
The following use [LUFA](https://www.fourwalledcubicle.com/LUFA.php) as the USB stack:
|
||||
|
||||
Please add any tested microcontrollers to this list.
|
||||
* [ATmega16U2](https://www.microchip.com/wwwproducts/en/ATmega16U2) / [ATmega32U2](https://www.microchip.com/wwwproducts/en/ATmega32U2)
|
||||
* [ATmega16U4](https://www.microchip.com/wwwproducts/en/ATmega16U4) / [ATmega32U4](https://www.microchip.com/wwwproducts/en/ATmega32U4)
|
||||
* [AT90USB64](https://www.microchip.com/wwwproducts/en/AT90USB646) / [AT90USB128](https://www.microchip.com/wwwproducts/en/AT90USB1286)
|
||||
|
||||
# ARM
|
||||
Certain MCUs which do not have native USB will use [V-USB](https://www.obdev.at/products/vusb/index.html) instead:
|
||||
|
||||
You can also use any ARM processor that [ChibiOS](http://www.chibios.org) supports. The following processors have been tested:
|
||||
* [ATmega32A](https://www.microchip.com/wwwproducts/en/ATmega32A)
|
||||
* [ATmega328P](https://www.microchip.com/wwwproducts/en/ATmega328P)
|
||||
|
||||
* [Kinetis MKL26Z64](http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus/l-series-ultra-low-power-m0-plus/kinetis-kl2x-48-mhz-usb-ultra-low-power-microcontrollers-mcus-based-on-arm-cortex-m0-plus-core:KL2x)
|
||||
* [Kinetis MK20DX128](http://www.nxp.com/assets/documents/data/en/data-sheets/K20P64M50SF0.pdf)
|
||||
* [Kinetis MK20DX128](http://www.nxp.com/assets/documents/data/en/data-sheets/K20P64M50SF0.pdf)
|
||||
* [Kinetis MK20DX256](http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus/k-series-performance-m4/k2x-usb/kinetis-k20-72-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-mcus-based-on-arm-cortex-m4-core:K20_72)
|
||||
## ARM
|
||||
|
||||
You can also use any ARM chip with USB that [ChibiOS](http://www.chibios.org) supports. Most have plenty of flash. Known to work are:
|
||||
|
||||
### STMicroelectronics (STM32)
|
||||
|
||||
* [STM32F0x2](https://www.st.com/en/microcontrollers-microprocessors/stm32f0x2.html)
|
||||
* [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)
|
||||
* [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html)
|
||||
|
||||
### NXP (Kinetis)
|
||||
|
||||
* [MKL26Z64](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/kl-series-cortex-m0-plus/kinetis-kl2x-72-96-mhz-usb-ultra-low-power-microcontrollers-mcus-based-on-arm-cortex-m0-plus-core:KL2x)
|
||||
* [MK20DX128](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-50-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-based-on-arm-cortex-m4-core:K20_50)
|
||||
* [MK20DX256](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-72-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-mcus-based-on-arm-cortex-m4-core:K20_72)
|
||||
|
||||
## Atmel ATSAM
|
||||
|
||||
There is limited support for one of Atmel's ATSAM microcontrollers, that being the [ATSAMD51J18A](https://www.microchip.com/wwwproducts/en/ATSAMD51J18A) used by the [Massdrop keyboards](https://github.com/qmk/qmk_firmware/tree/master/keyboards/massdrop).
|
||||
|
@@ -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). Это особенно удобно, когда ваша проблема потребует длительного обсуждения или отладки.
|
58
docs/ru-ru/getting_started_github.md
Normal file
58
docs/ru-ru/getting_started_github.md
Normal file
@@ -0,0 +1,58 @@
|
||||
# Как использовать GitHub с QMK
|
||||
|
||||
GitHub может показаться несколько сложным для тех, кто никогда с ним не работал. В данном руководстве будет разобран каждый шаг создания форка, клонирования и отправки пулреквеста в QMK.
|
||||
|
||||
?> В этом руководстве предполагается, что вы в какой-то степени знакомы с работой в командной строке, и в вашей системе установлен git.
|
||||
|
||||
Откройте [страницу QMK на GitHub] (https://github.com/qmk/qmk_firmware), и в правом верхнем углу вы увидите кнопку с надписью "Fork":
|
||||
|
||||

|
||||
|
||||
Если вы состоите в какой-либо организации, вам нужно выбрать учетную запись, к которой будет привязан форк. В большинстве случаев это будет личной аккаунт. Как только ваш форк будет завершен (иногда это занимает немного времени), нажмите кнопку "Clone or Download":
|
||||

|
||||
|
||||
И обязательно выберите "HTTPS", затем выделите ссылку и скопируйте ее:
|
||||
|
||||

|
||||
|
||||
Теперь введите `git clone` в командную строку, а затем вставьте ссылку:
|
||||
|
||||
```
|
||||
user@computer:~$ git clone https://github.com/whoeveryouare/qmk_firmware.git
|
||||
Cloning into 'qmk_firmware'...
|
||||
remote: Counting objects: 46625, done.
|
||||
remote: Compressing objects: 100% (2/2), done.
|
||||
remote: Total 46625 (delta 0), reused 0 (delta 0), pack-reused 46623
|
||||
Receiving objects: 100% (46625/46625), 84.47 MiB | 3.14 MiB/s, done.
|
||||
Resolving deltas: 100% (29362/29362), done.
|
||||
Checking out files: 100% (2799/2799), done.
|
||||
```
|
||||
|
||||
Теперь у вас есть форк QMK на вашем локальном компьютере, и вы можете добавить свою раскладку, скомпилировать ее и прошить ей свою клавиатуру. Как только вы будете довольны своими изменениями, есть возможность добавить, зафиксировать их и сделать коммит в свой форк следующим образом:
|
||||
|
||||
```
|
||||
user@computer:~$ git add .
|
||||
user@computer:~$ git commit -m "adding my keymap"
|
||||
[master cccb1608] adding my keymap
|
||||
1 file changed, 1 insertion(+)
|
||||
create mode 100644 keyboards/planck/keymaps/mine/keymap.c
|
||||
user@computer:~$ git push
|
||||
Counting objects: 1, done.
|
||||
Delta compression using up to 4 threads.
|
||||
Compressing objects: 100% (1/1), done.
|
||||
Writing objects: 100% (1/1), 1.64 KiB | 0 bytes/s, done.
|
||||
Total 1 (delta 1), reused 0 (delta 0)
|
||||
remote: Resolving deltas: 100% (1/1), completed with 1 local objects.
|
||||
To https://github.com/whoeveryouare/qmk_firmware.git
|
||||
+ 20043e64...7da94ac5 master -> master
|
||||
```
|
||||
|
||||
Ваши изменения теперь существуют в вашем форке на GitHub - если вернуться туда (`https://github.com/<whoeveryouare>/qmk_firmware`), вы сможете создать "New Pull Request" нажатием на кнопку:
|
||||
|
||||

|
||||
|
||||
Здесь вы сможете увидеть, какие именно изменения были внесены, - если все выглядит хорошо, вы можете завершить его, нажав "Create Pull Request":
|
||||
|
||||

|
||||
|
||||
После отправки мы можем расспросить вас о ваших изменениях, попросить внести корректировки и в конечном итоге принять их! Спасибо за ваш вклад в QMK :)
|
@@ -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
|
||||
|
@@ -19,11 +19,11 @@
|
||||
#include "quantum.h"
|
||||
|
||||
#define LAYOUT( \
|
||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
|
||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K48, \
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
|
||||
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
|
||||
K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D \
|
||||
K40, K41, K42, K43, K44, K45, K46, K47, K0D, K49, K4A, K4B, K4C, K4D \
|
||||
) \
|
||||
{ \
|
||||
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
|
||||
|
@@ -15,18 +15,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/>.
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
#pragma once
|
||||
|
||||
#include "config_common.h"
|
||||
|
||||
/* USB Device descriptor parameter */
|
||||
#define VENDOR_ID 0xFEED
|
||||
#define PRODUCT_ID 0x0000
|
||||
#define PRODUCT_ID 0x0C0D
|
||||
#define DEVICE_VER 0x0001
|
||||
#define MANUFACTURER Gray
|
||||
#define PRODUCT cod67
|
||||
#define DESCRIPTION 60% Custom Keyboard
|
||||
#define MANUFACTURER Gray Studio
|
||||
#define PRODUCT COD67
|
||||
#define DESCRIPTION 60% custom keyboard
|
||||
|
||||
/* key matrix size */
|
||||
#define MATRIX_ROWS 5
|
||||
@@ -49,135 +48,27 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/* COL2ROW, ROW2COL*/
|
||||
#define DIODE_DIRECTION COL2ROW
|
||||
|
||||
/* D4 is not a PWM pin, but look at timer assisted software PWM if you want something other than toggle
|
||||
* https://docs.qmk.fm/#/feature_backlight?id=timer-assisted-pwm-implementation
|
||||
*/
|
||||
#define BACKLIGHT_PIN D4
|
||||
#define BACKLIGHT_LEVELS 3
|
||||
|
||||
#define RGB_DI_PIN B2
|
||||
#ifdef RGB_DI_PIN
|
||||
#define RGBLED_NUM 20
|
||||
#define RGBLIGHT_HUE_STEP 8
|
||||
#define RGBLIGHT_SAT_STEP 8
|
||||
#define RGBLIGHT_VAL_STEP 8
|
||||
#define RGBLIGHT_LIMIT_VAL 255
|
||||
#define RGBLIGHT_SLEEP
|
||||
#define RGBLIGHT_ANIMATIONS
|
||||
#endif
|
||||
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||
#define DEBOUNCE 5
|
||||
|
||||
/* define if matrix has ghost (lacks anti-ghosting diodes) */
|
||||
//#define MATRIX_HAS_GHOST
|
||||
|
||||
/* number of backlight levels */
|
||||
|
||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||
#define LOCKING_SUPPORT_ENABLE
|
||||
/* Locking resynchronize hack */
|
||||
#define LOCKING_RESYNC_ENABLE
|
||||
|
||||
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
|
||||
* This is userful for the Windows task manager shortcut (ctrl+shift+esc).
|
||||
*/
|
||||
// #define GRAVE_ESC_CTRL_OVERRIDE
|
||||
|
||||
/*
|
||||
* Force NKRO
|
||||
*
|
||||
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
|
||||
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
|
||||
* makefile for this to work.)
|
||||
*
|
||||
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
|
||||
* until the next keyboard reset.
|
||||
*
|
||||
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
|
||||
* fully operational during normal computer usage.
|
||||
*
|
||||
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
|
||||
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
|
||||
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
|
||||
* power-up.
|
||||
*
|
||||
*/
|
||||
//#define FORCE_NKRO
|
||||
|
||||
/*
|
||||
* Magic Key Options
|
||||
*
|
||||
* Magic keys are hotkey commands that allow control over firmware functions of
|
||||
* the keyboard. They are best used in combination with the HID Listen program,
|
||||
* found here: https://www.pjrc.com/teensy/hid_listen.html
|
||||
*
|
||||
* The options below allow the magic key functionality to be changed. This is
|
||||
* useful if your keyboard/keypad is missing keys and you want magic key support.
|
||||
*
|
||||
*/
|
||||
|
||||
/* control how magic key switches layers */
|
||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
|
||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
|
||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
|
||||
|
||||
/* override magic key keymap */
|
||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
|
||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
|
||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
|
||||
//#define MAGIC_KEY_HELP1 H
|
||||
//#define MAGIC_KEY_HELP2 SLASH
|
||||
//#define MAGIC_KEY_DEBUG D
|
||||
//#define MAGIC_KEY_DEBUG_MATRIX X
|
||||
//#define MAGIC_KEY_DEBUG_KBD K
|
||||
//#define MAGIC_KEY_DEBUG_MOUSE M
|
||||
//#define MAGIC_KEY_VERSION V
|
||||
//#define MAGIC_KEY_STATUS S
|
||||
//#define MAGIC_KEY_CONSOLE C
|
||||
//#define MAGIC_KEY_LAYER0_ALT1 ESC
|
||||
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
|
||||
//#define MAGIC_KEY_LAYER0 0
|
||||
//#define MAGIC_KEY_LAYER1 1
|
||||
//#define MAGIC_KEY_LAYER2 2
|
||||
//#define MAGIC_KEY_LAYER3 3
|
||||
//#define MAGIC_KEY_LAYER4 4
|
||||
//#define MAGIC_KEY_LAYER5 5
|
||||
//#define MAGIC_KEY_LAYER6 6
|
||||
//#define MAGIC_KEY_LAYER7 7
|
||||
//#define MAGIC_KEY_LAYER8 8
|
||||
//#define MAGIC_KEY_LAYER9 9
|
||||
//#define MAGIC_KEY_BOOTLOADER PAUSE
|
||||
//#define MAGIC_KEY_LOCK CAPS
|
||||
//#define MAGIC_KEY_EEPROM E
|
||||
//#define MAGIC_KEY_NKRO N
|
||||
//#define MAGIC_KEY_SLEEP_LED Z
|
||||
|
||||
/*
|
||||
* Feature disable options
|
||||
* These options are also useful to firmware size reduction.
|
||||
*/
|
||||
|
||||
/* disable debug print */
|
||||
//#define NO_DEBUG
|
||||
|
||||
/* disable print */
|
||||
//#define NO_PRINT
|
||||
|
||||
/* disable action features */
|
||||
//#define NO_ACTION_LAYER
|
||||
//#define NO_ACTION_TAPPING
|
||||
//#define NO_ACTION_ONESHOT
|
||||
//#define NO_ACTION_MACRO
|
||||
//#define NO_ACTION_FUNCTION
|
||||
|
||||
/*
|
||||
* MIDI options
|
||||
*/
|
||||
|
||||
/* Prevent use of disabled MIDI features in the keymap */
|
||||
//#define MIDI_ENABLE_STRICT 1
|
||||
|
||||
/* enable basic MIDI features:
|
||||
- MIDI notes can be sent when in Music mode is on
|
||||
*/
|
||||
//#define MIDI_BASIC
|
||||
|
||||
/* enable advanced MIDI features:
|
||||
- MIDI notes can be added to the keymap
|
||||
- Octave shift and transpose
|
||||
- Virtual sustain, portamento, and modulation wheel
|
||||
- etc.
|
||||
*/
|
||||
//#define MIDI_ADVANCED
|
||||
|
||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||
|
||||
#endif
|
||||
|
@@ -19,10 +19,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
LAYOUT(
|
||||
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_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
|
||||
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_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_TRNS, KC_ENT,
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL,
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT)
|
||||
|
||||
};
|
||||
|
||||
|
@@ -1 +1,5 @@
|
||||
# The default keymap for cod67
|
||||
# The default keymap for a COD67
|
||||
|
||||
The default map only implements the default layer from the map on [ydkb.io](http://ydkb.io).
|
||||
|
||||
If you want an example of a multi-layer map, look at [rys's map](../rys).
|
||||
|
23
keyboards/gray_studio/cod67/keymaps/rys/keymap.c
Normal file
23
keyboards/gray_studio/cod67/keymaps/rys/keymap.c
Normal file
@@ -0,0 +1,23 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum layers {
|
||||
_TOP,
|
||||
_FN
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[_TOP] = LAYOUT(
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
|
||||
KC_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_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, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL,
|
||||
KC_LCTL, KC_LALT, KC_LGUI, _______, _______, KC_SPC, _______, _______, _______, KC_RGUI, MO(_FN), KC_LEFT, KC_DOWN, KC_RGHT
|
||||
),
|
||||
[_FN] = LAYOUT(
|
||||
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,
|
||||
_______, RGB_TOG, RGB_MOD,RGB_RMOD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_TOGG,
|
||||
_______, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______
|
||||
)
|
||||
};
|
5
keyboards/gray_studio/cod67/keymaps/rys/readme.md
Normal file
5
keyboards/gray_studio/cod67/keymaps/rys/readme.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# Rys's keymap for a COD67
|
||||
|
||||
The COD67 supports really nice RGB underglow which you can see through the mid diffuser. I've put control for that on layer 1, along with reset on `Space`, backlight toggle on `Enter`, and the function row. The board supports all of the QMK RGB effects.
|
||||
|
||||
Look at the excellent [RGB Lighting](https://docs.qmk.fm/#/feature_rgblight) docs on the QMK site for more controls.
|
@@ -1,30 +1,45 @@
|
||||
# Gray COD67
|
||||
|
||||
The Gray COD67 is a 60% keyboard with a modern and bold design. It features 20 RGB Underglow LED lights and a unique diffuser placement. The COD67 has the most stunning RGB light strip for a custom mechanical keyboard. It also features a center mounted USB C port.
|
||||
The Gray COD67 is a 60% keyboard with a modern and bold design. It features 20 RGB Underglow LED lights and a unique diffuser placement. The COD67 has the most stunning RGB light strip for a custom mechanical keyboard. It also features a center mounted USB C port.
|
||||
|
||||
There were only 75 units made worldwide.
|
||||
There were only 75 units made worldwide.
|
||||
|
||||
Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin)
|
||||
Hardware Supported: Gray COD67
|
||||
Hardware Availability: [Zfrontier](https://en.zfrontier.com/products/cod67)
|
||||
|
||||
At this time, flashing ONLY works on Windows systems.
|
||||
## Bootloader mode
|
||||
|
||||
To put in bootloader mode, hold the `Esc` key while plugging in the USB cable.
|
||||
To put in bootloader mode, hold the `Esc` key while plugging in the USB cable.
|
||||
|
||||
The COD67 will show up as a drive.
|
||||
## Making firmware
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make gray_studio/cod67:default:bin
|
||||
make gray_studio/cod67:default
|
||||
|
||||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
||||
|
||||
Rename the resulting `.bin` file to `cod67.bin`.
|
||||
## Flashing in Windows
|
||||
|
||||
Drag and drop `cod67.bin` to the drive, overwriting the previous `cod67.bin` stored on it.
|
||||
After putting your COD67 in bootloader mode, it will show up as a drive.
|
||||
|
||||
Press the `Esc` key again to reset the board. You are now ready to type!
|
||||
* Rename the resulting `.bin` file to `COD67.BIN`.
|
||||
* Drag and drop your new `COD67.BIN` to the drive, overwriting the previous `COD67.BIN` stored on it.
|
||||
* Wait a few seconds for it to write. The caps lock LED flashes rapidly while writing.
|
||||
* Press the `Esc` key again to reset the board. You are now ready to type!
|
||||
|
||||
## Flashing in macOS
|
||||
|
||||
After putting your COD67 in bootloader mode, it will show up as a drive.
|
||||
|
||||
* Rename the resulting `.bin` file to `COD67.BIN`.
|
||||
* Drag the existing `COD67.BIN` file from the drive to the Trash in Finder.
|
||||
* Empty the Trash in Finder. It's important you do that due to how macOS handles hidden `.Trashes` on removable drives. It needs to be empty to free up flash space.
|
||||
* Drag and drop your new `COD67.BIN` to the drive.
|
||||
* Wait a few seconds for it to write. The caps lock LED flashes rapidly while writing.
|
||||
* Press the `Esc` key or eject the drive in Finder to reset the board. You are now ready to type!
|
||||
|
||||
## Notes
|
||||
The backlight pin is attached to a non PWM pin `D4` so backlight is only on/off.
|
||||
|
||||
The backlight pin is attached to a non PWM pin `D4` so the backlight is only on/off.
|
||||
|
@@ -11,19 +11,23 @@ MCU = atmega32u4
|
||||
# ATmega328P USBasp
|
||||
BOOTLOADER = atmel-dfu # actually lufa-ms
|
||||
|
||||
# Mass storage bootloader on the COD67 uses bin files
|
||||
FIRMWARE_FORMAT = bin
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
|
||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = yes # Enable RGB underglow
|
||||
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
|
||||
|
@@ -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
|
||||
|
@@ -17,7 +17,7 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||
NKRO_ENABLE = yes # USB Nkey Rollover
|
||||
CUSTOM_MATRIX = no # Custom matrix file
|
||||
AUDIO_ENABLE = yes
|
||||
RGBLIGHT_ENABLE = no
|
||||
RGBLIGHT_ENABLE = yes
|
||||
RGB_MATRIX_ENABLE = no #WS2812 once arm_rgb is implemented
|
||||
HAPTIC_ENABLE += DRV2605L
|
||||
QWIIC_ENABLE += MICRO_OLED
|
||||
|
@@ -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,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user