Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cd7bc03134 | ||
|
|
22a8992d1b | ||
|
|
2367e3e1fd | ||
|
|
0bd03150e5 | ||
|
|
feddc496ee | ||
|
|
36d3902504 | ||
|
|
f204ed67f2 | ||
|
|
f3acaff65b | ||
|
|
20c0533c4c | ||
|
|
a747953dfa | ||
|
|
1ab008eabd | ||
|
|
0a7222b703 | ||
|
|
4381dea621 | ||
|
|
827f8ce1bc | ||
|
|
207fde997f | ||
|
|
b1691ba696 | ||
|
|
7ec583e5ef | ||
|
|
c966da89da | ||
|
|
8060e52946 | ||
|
|
2e8cdb126e | ||
|
|
3261c408e4 | ||
|
|
d41961c9ed | ||
|
|
840b9090a0 | ||
|
|
40b0ddd425 | ||
|
|
17ff9cf554 | ||
|
|
d3ebf903c9 | ||
|
|
f1c89280d5 | ||
|
|
4602361095 | ||
|
|
28f53462d0 | ||
|
|
4532caf5f2 | ||
|
|
e08e6c11e3 | ||
|
|
bffbb4b42d | ||
|
|
d686c0ea43 | ||
|
|
b3cdc7ef70 | ||
|
|
cf2ffadbcd | ||
|
|
0da743d80b | ||
|
|
7afae46ea6 | ||
|
|
c644299820 | ||
|
|
a2e91ebec9 | ||
|
|
a40dbf94e8 | ||
|
|
1c0a7ad6c2 | ||
|
|
6b1db7da23 | ||
|
|
001a6c24ae | ||
|
|
b1fc3f35c6 | ||
|
|
e040028f1b | ||
|
|
d417b0cc7d | ||
|
|
b12b26946d | ||
|
|
918fb7f8da | ||
|
|
455f15528c | ||
|
|
00c6892b3f | ||
|
|
171f7c561b | ||
|
|
5b4187ad1b | ||
|
|
d5b01bd34b | ||
|
|
1650ba00f1 | ||
|
|
f9d47ebe2f | ||
|
|
3895b4b868 | ||
|
|
a8647f0d27 | ||
|
|
6c7d173ad7 | ||
|
|
65906f679d | ||
|
|
6af77551c6 | ||
|
|
4747d974aa | ||
|
|
e5d2cb8f98 | ||
|
|
f6c7e11426 | ||
|
|
97a3f806c4 | ||
|
|
c44fc68297 | ||
|
|
5fa0a274ea | ||
|
|
4e375aa1f5 | ||
|
|
f859375284 | ||
|
|
f6651424a0 | ||
|
|
29e9caa82b | ||
|
|
a32f7e1a25 | ||
|
|
e2dfb787da | ||
|
|
72df7b4c19 | ||
|
|
1209fb8643 | ||
|
|
ba42a5ae68 | ||
|
|
09f5767072 | ||
|
|
05990c9bda |
No files matched your search
Vendored
+21
-10
@@ -52,26 +52,37 @@ Vagrant.configure(2) do |config|
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Docker provider pulls from hub.docker.com respecting docker.image if
|
# Docker provider pulls from hub.docker.com respecting docker.image if
|
||||||
# config.vm.box is nil. Note that this bind-mounts from the current dir to
|
# config.vm.box is nil. In this case, we adhoc build util/vagrant/Dockerfile.
|
||||||
|
# Note that this bind-mounts from the current dir to
|
||||||
# /vagrant in the guest, so unless your UID is 1000 to match vagrant in the
|
# /vagrant in the guest, so unless your UID is 1000 to match vagrant in the
|
||||||
# image, you'll need to: chmod -R a+rw .
|
# image, you'll need to: chmod -R a+rw .
|
||||||
config.vm.provider "docker" do |docker, override|
|
config.vm.provider "docker" do |docker, override|
|
||||||
override.vm.box = nil
|
override.vm.box = nil
|
||||||
docker.image = "jesselang/debian-vagrant:stretch"
|
docker.build_dir = "util/vagrant"
|
||||||
docker.has_ssh = true
|
docker.has_ssh = true
|
||||||
end
|
end
|
||||||
|
|
||||||
# This script ensures the required packages for AVR programming are installed
|
# Unless we are running the docker container directly
|
||||||
# It also ensures the system always gets the latest updates when powered on
|
# 1. run container detached on vm
|
||||||
# If this causes issues you can run a 'vagrant destroy' and then
|
# 2. attach on 'vagrant ssh'
|
||||||
# add a # before ,run: (or change "always" to "once") and run 'vagrant up' to get a working
|
["virtualbox", "vmware_workstation", "vmware_fusion"].each do |type|
|
||||||
# non-updated box and then attempt to troubleshoot or open a Github issue
|
config.vm.provider type do |virt, override|
|
||||||
config.vm.provision "shell", inline: "/vagrant/util/qmk_install.sh", run: "always"
|
override.vm.provision "docker" do |d|
|
||||||
|
d.run "qmkfm/base_container",
|
||||||
|
cmd: "tail -f /dev/null",
|
||||||
|
args: "--privileged -v /dev:/dev -v '/vagrant:/vagrant'"
|
||||||
|
end
|
||||||
|
|
||||||
|
override.vm.provision "shell", inline: <<-SHELL
|
||||||
|
echo 'docker restart qmkfm-base_container && exec docker exec -it qmkfm-base_container /bin/bash -l' >> ~vagrant/.bashrc
|
||||||
|
SHELL
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
config.vm.post_up_message = <<-EOT
|
config.vm.post_up_message = <<-EOT
|
||||||
|
|
||||||
Log into the VM using 'vagrant ssh'. QMK directory synchronized with host is
|
Log into the environment using 'vagrant ssh'. QMK directory synchronized with
|
||||||
located at /vagrant
|
host is located at /vagrant
|
||||||
To compile the .hex files use make command inside this directory, e.g.
|
To compile the .hex files use make command inside this directory, e.g.
|
||||||
cd /vagrant
|
cd /vagrant
|
||||||
make <keyboard>:default
|
make <keyboard>:default
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ This is a C header file that is one of the first things included, and will persi
|
|||||||
* mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap
|
* mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap
|
||||||
* `#define LOCKING_RESYNC_ENABLE`
|
* `#define LOCKING_RESYNC_ENABLE`
|
||||||
* tries to keep switch state consistent with keyboard LED state
|
* tries to keep switch state consistent with keyboard LED state
|
||||||
* `#define IS_COMMAND() (get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))`
|
* `#define IS_COMMAND() (get_mods() == MOD_MASK_SHIFT)`
|
||||||
* key combination that allows the use of magic commands (useful for debugging)
|
* key combination that allows the use of magic commands (useful for debugging)
|
||||||
* `#define USB_MAX_POWER_CONSUMPTION`
|
* `#define USB_MAX_POWER_CONSUMPTION`
|
||||||
* sets the maximum power (in mA) over USB for the device (default: 500)
|
* sets the maximum power (in mA) over USB for the device (default: 500)
|
||||||
@@ -171,8 +171,8 @@ If you define these options you will enable the associated feature, which may in
|
|||||||
* how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined.
|
* how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined.
|
||||||
* `#define TAP_CODE_DELAY 100`
|
* `#define TAP_CODE_DELAY 100`
|
||||||
* Sets the delay between `register_code` and `unregister_code`, if you're having issues with it registering properly (common on VUSB boards). The value is in milliseconds.
|
* Sets the delay between `register_code` and `unregister_code`, if you're having issues with it registering properly (common on VUSB boards). The value is in milliseconds.
|
||||||
* `#define TAP_HOLD_CAPS_DELAY 200`
|
* `#define TAP_HOLD_CAPS_DELAY 80`
|
||||||
* Sets the delay for Tap Hold keys (`LT`, `MT`) when using `KC_CAPSLOCK` keycode, as this has some special handling on MacOS. The value is in milliseconds, and defaults to 200ms if not defined.
|
* Sets the delay for Tap Hold keys (`LT`, `MT`) when using `KC_CAPSLOCK` keycode, as this has some special handling on MacOS. The value is in milliseconds, and defaults to 80 ms if not defined. For macOS, you may want to set this to 200 or higher.
|
||||||
|
|
||||||
## RGB Light Configuration
|
## RGB Light Configuration
|
||||||
|
|
||||||
|
|||||||
+4
-6
@@ -49,15 +49,13 @@ Pro Micro (Atmega32u4), make sure to include `CONFIG_USB_ACM=y`. Other devices m
|
|||||||
|
|
||||||
## Unknown Device for DFU Bootloader
|
## Unknown Device for DFU Bootloader
|
||||||
|
|
||||||
If you're using Windows to flash your keyboard, and you are running into issues, check the Device Manager. If you see an "Unknown Device" when the keyboard is in "bootloader mode", then you may have a driver issue.
|
Issues encountered when flashing keyboards on Windows are most often due to having the wrong drivers installed for the bootloader.
|
||||||
|
|
||||||
Re-running the installation script for MSYS2 may help (eg run `./util/qmk_install.sh` from MSYS2/WSL) or reinstalling the QMK Toolbox may fix the issue.
|
Re-running the installation script for MSYS2 may help (eg run `util/qmk_install.sh` from MSYS2/WSL) or reinstalling the QMK Toolbox may fix the issue. Alternatively, you can download and run the [`qmk_driver_installer`](https://github.com/qmk/qmk_driver_installer) package.
|
||||||
|
|
||||||
If that doesn't work, then you may need to grab the [Zadig Utility](https://zadig.akeo.ie/). Download this, find the device in question, and select the `WinUSB` option, and hit "Reinstall driver". Once you've done that, try flashing your board, again. If that doesn't work, try all of the options, until one works.
|
If that doesn't work, then you may need to grab the [Zadig Utility](https://zadig.akeo.ie/). Download this, and run it on the system. Then, you will need to reset your board into bootloader mode. After that, locate the device in question. If the device doesn't show up in the list (or nothing shows up in the list), you may need to enable the `List all devices` option in the `Options` menu.
|
||||||
|
|
||||||
?> There isn't a best option for which driver should be used here. Some options work better on some systems than others. libUSB and WinUSB seem to be the best options here.
|
From here, you will need to know what type of controller the board is using. You may see it listed in the Device Manager as `ATmega32U4` device (which is an AVR board), or an `STM32` device (Which is an ARM board). For AVR boards, use `libusb-win32` for the driver. For ARM boards, use the `WinUSB` driver. Once the correct driver type has been selected, click on the `Replace Driver` button, unplug your board, plug it back in, and reset it again.
|
||||||
|
|
||||||
If the bootloader doesn't show up in the list for devices, you may need to enable the "List all devices" option in the `Options` menu, and then find the bootloader in question.
|
|
||||||
|
|
||||||
|
|
||||||
## WINAVR is Obsolete
|
## WINAVR is Obsolete
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ To change the behaviour of the backlighting, `#define` these in your `config.h`:
|
|||||||
|---------------------|-------------|-------------------------------------------------------------------------------------------------------------|
|
|---------------------|-------------|-------------------------------------------------------------------------------------------------------------|
|
||||||
|`BACKLIGHT_PIN` |`B7` |The pin that controls the LEDs. Unless you are designing your own keyboard, you shouldn't need to change this|
|
|`BACKLIGHT_PIN` |`B7` |The pin that controls the LEDs. Unless you are designing your own keyboard, you shouldn't need to change this|
|
||||||
|`BACKLIGHT_PINS` |*Not defined*|experimental: see below for more information |
|
|`BACKLIGHT_PINS` |*Not defined*|experimental: see below for more information |
|
||||||
|`BACKLIGHT_LEVELS` |`3` |The number of brightness levels (maximum 15 excluding off) |
|
|`BACKLIGHT_LEVELS` |`3` |The number of brightness levels (maximum 31 excluding off) |
|
||||||
|`BACKLIGHT_CAPS_LOCK`|*Not defined*|Enable Caps Lock indicator using backlight (for keyboards without dedicated LED) |
|
|`BACKLIGHT_CAPS_LOCK`|*Not defined*|Enable Caps Lock indicator using backlight (for keyboards without dedicated LED) |
|
||||||
|`BACKLIGHT_BREATHING`|*Not defined*|Enable backlight breathing, if supported |
|
|`BACKLIGHT_BREATHING`|*Not defined*|Enable backlight breathing, if supported |
|
||||||
|`BREATHING_PERIOD` |`6` |The length of one backlight "breath" in seconds |
|
|`BREATHING_PERIOD` |`6` |The length of one backlight "breath" in seconds |
|
||||||
@@ -73,8 +73,10 @@ To change the behaviour of the backlighting, `#define` these in your `config.h`:
|
|||||||
|
|
||||||
## Backlight On State
|
## Backlight On State
|
||||||
|
|
||||||
Most backlight circuits are driven by an N-channel MOSFET or NPN transistor. This means that to turn the transistor *on* and light the LEDs, you must drive the backlight pin, connected to the gate or base, *low*.
|
Most backlight circuits are driven by an N-channel MOSFET or NPN transistor. This means that to turn the transistor *on* and light the LEDs, you must drive the backlight pin, connected to the gate or base, *high*.
|
||||||
Sometimes, however, a P-channel MOSFET, or a PNP transistor is used. In this case you must `#define BACKLIGHT_ON_STATE 1`, so that when the transistor is on, the pin is driven *high* instead.
|
Sometimes, however, a P-channel MOSFET, or a PNP transistor is used. In this case, when the transistor is on, the pin is driven *low* instead.
|
||||||
|
|
||||||
|
This functionality is configured at the keyboard level with the `BACKLIGHT_ON_STATE` define.
|
||||||
|
|
||||||
## Multiple backlight pins
|
## Multiple backlight pins
|
||||||
|
|
||||||
|
|||||||
+23
-9
@@ -59,19 +59,12 @@ void process_combo_event(uint8_t combo_index, bool pressed) {
|
|||||||
switch(combo_index) {
|
switch(combo_index) {
|
||||||
case ZC_COPY:
|
case ZC_COPY:
|
||||||
if (pressed) {
|
if (pressed) {
|
||||||
register_code(KC_LCTL);
|
tap_code16(LCTL(KC_C));
|
||||||
register_code(KC_C);
|
|
||||||
unregister_code(KC_C);
|
|
||||||
unregister_code(KC_LCTL);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case XV_PASTE:
|
case XV_PASTE:
|
||||||
if (pressed) {
|
if (pressed) {
|
||||||
register_code(KC_LCTL);
|
tap_code16(LCTL(KC_V));
|
||||||
register_code(KC_V);
|
|
||||||
unregister_code(KC_V);
|
|
||||||
unregister_code(KC_LCTL);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -87,3 +80,24 @@ If you're using long combos, or even longer combos, you may run into issues with
|
|||||||
In this case, you can add either `#define EXTRA_LONG_COMBOS` or `#define EXTRA_EXTRA_LONG_COMBOS` in your `config.h` file.
|
In this case, you can add either `#define EXTRA_LONG_COMBOS` or `#define EXTRA_EXTRA_LONG_COMBOS` in your `config.h` file.
|
||||||
|
|
||||||
You may also be able to enable action keys by defining `COMBO_ALLOW_ACTION_KEYS`.
|
You may also be able to enable action keys by defining `COMBO_ALLOW_ACTION_KEYS`.
|
||||||
|
|
||||||
|
## Keycodes
|
||||||
|
|
||||||
|
You can enable, disable and toggle the Combo feature on the fly. This is useful if you need to disable them temporarily, such as for a game.
|
||||||
|
|
||||||
|
|Keycode |Description |
|
||||||
|
|----------|---------------------------------|
|
||||||
|
|`CMB_ON` |Turns on Combo feature |
|
||||||
|
|`CMB_OFF` |Turns off Combo feature |
|
||||||
|
|`CMB_TOG` |Toggles Combo feature on and off |
|
||||||
|
|
||||||
|
## User callbacks
|
||||||
|
|
||||||
|
In addition to the keycodes, there are a few functions that you can use to set the status, or check it:
|
||||||
|
|
||||||
|
|Function |Description |
|
||||||
|
|-----------|--------------------------------------------------------------------|
|
||||||
|
| `combo_enable()` | Enables the combo feature |
|
||||||
|
| `combo_disable()` | Disables the combo feature, and clears the combo buffer |
|
||||||
|
| `combo_toggle()` | Toggles the state of the combo feature |
|
||||||
|
| `is_combo_enabled()` | Returns the status of the combo feature state (true or false) |
|
||||||
+33
-33
@@ -16,36 +16,36 @@ To use Command, hold down the key combination defined by the `IS_COMMAND()` macr
|
|||||||
|
|
||||||
If you would like to change the key assignments for Command, `#define` these in your `config.h` at either the keyboard or keymap level. All keycode assignments here must omit the `KC_` prefix.
|
If you would like to change the key assignments for Command, `#define` these in your `config.h` at either the keyboard or keymap level. All keycode assignments here must omit the `KC_` prefix.
|
||||||
|
|
||||||
|Define |Default |Description |
|
|Define |Default |Description |
|
||||||
|------------------------------------|---------------------------------------------------------------------------|------------------------------------------------|
|
|------------------------------------|--------------------------------|------------------------------------------------|
|
||||||
|`IS_COMMAND()` |<code>(get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))</code>|The key combination to activate Command |
|
|`IS_COMMAND()` |`(get_mods() == MOD_MASK_SHIFT)`|The key combination to activate Command |
|
||||||
|`MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS` |`true` |Set default layer with the Function row |
|
|`MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS` |`true` |Set default layer with the Function row |
|
||||||
|`MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS` |`true` |Set default layer with the number keys |
|
|`MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS` |`true` |Set default layer with the number keys |
|
||||||
|`MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM`|`false` |Set default layer with `MAGIC_KEY_LAYER0..9` |
|
|`MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM`|`false` |Set default layer with `MAGIC_KEY_LAYER0..9` |
|
||||||
|`MAGIC_KEY_DEBUG` |`D` |Toggle debugging over serial |
|
|`MAGIC_KEY_DEBUG` |`D` |Toggle debugging over serial |
|
||||||
|`MAGIC_KEY_DEBUG_MATRIX` |`X` |Toggle key matrix debugging |
|
|`MAGIC_KEY_DEBUG_MATRIX` |`X` |Toggle key matrix debugging |
|
||||||
|`MAGIC_KEY_DEBUG_KBD` |`K` |Toggle keyboard debugging |
|
|`MAGIC_KEY_DEBUG_KBD` |`K` |Toggle keyboard debugging |
|
||||||
|`MAGIC_KEY_DEBUG_MOUSE` |`M` |Toggle mouse debugging |
|
|`MAGIC_KEY_DEBUG_MOUSE` |`M` |Toggle mouse debugging |
|
||||||
|`MAGIC_KEY_CONSOLE` |`C` |Enable the Command console |
|
|`MAGIC_KEY_CONSOLE` |`C` |Enable the Command console |
|
||||||
|`MAGIC_KEY_VERSION` |`V` |Print the running QMK version to the console |
|
|`MAGIC_KEY_VERSION` |`V` |Print the running QMK version to the console |
|
||||||
|`MAGIC_KEY_STATUS` |`S` |Print the current keyboard status to the console|
|
|`MAGIC_KEY_STATUS` |`S` |Print the current keyboard status to the console|
|
||||||
|`MAGIC_KEY_HELP` |`H` |Print Command help to the console |
|
|`MAGIC_KEY_HELP` |`H` |Print Command help to the console |
|
||||||
|`MAGIC_KEY_HELP_ALT` |`SLASH` |Print Command help to the console (alternate) |
|
|`MAGIC_KEY_HELP_ALT` |`SLASH` |Print Command help to the console (alternate) |
|
||||||
|`MAGIC_KEY_LAYER0` |`0` |Make layer 0 the default layer |
|
|`MAGIC_KEY_LAYER0` |`0` |Make layer 0 the default layer |
|
||||||
|`MAGIC_KEY_LAYER0_ALT` |`GRAVE` |Make layer 0 the default layer (alternate) |
|
|`MAGIC_KEY_LAYER0_ALT` |`GRAVE` |Make layer 0 the default layer (alternate) |
|
||||||
|`MAGIC_KEY_LAYER1` |`1` |Make layer 1 the default layer |
|
|`MAGIC_KEY_LAYER1` |`1` |Make layer 1 the default layer |
|
||||||
|`MAGIC_KEY_LAYER2` |`2` |Make layer 2 the default layer |
|
|`MAGIC_KEY_LAYER2` |`2` |Make layer 2 the default layer |
|
||||||
|`MAGIC_KEY_LAYER3` |`3` |Make layer 3 the default layer |
|
|`MAGIC_KEY_LAYER3` |`3` |Make layer 3 the default layer |
|
||||||
|`MAGIC_KEY_LAYER4` |`4` |Make layer 4 the default layer |
|
|`MAGIC_KEY_LAYER4` |`4` |Make layer 4 the default layer |
|
||||||
|`MAGIC_KEY_LAYER5` |`5` |Make layer 5 the default layer |
|
|`MAGIC_KEY_LAYER5` |`5` |Make layer 5 the default layer |
|
||||||
|`MAGIC_KEY_LAYER6` |`6` |Make layer 6 the default layer |
|
|`MAGIC_KEY_LAYER6` |`6` |Make layer 6 the default layer |
|
||||||
|`MAGIC_KEY_LAYER7` |`7` |Make layer 7 the default layer |
|
|`MAGIC_KEY_LAYER7` |`7` |Make layer 7 the default layer |
|
||||||
|`MAGIC_KEY_LAYER8` |`8` |Make layer 8 the default layer |
|
|`MAGIC_KEY_LAYER8` |`8` |Make layer 8 the default layer |
|
||||||
|`MAGIC_KEY_LAYER9` |`9` |Make layer 9 the default layer |
|
|`MAGIC_KEY_LAYER9` |`9` |Make layer 9 the default layer |
|
||||||
|`MAGIC_KEY_BOOTLOADER` |`B` |Jump to bootloader |
|
|`MAGIC_KEY_BOOTLOADER` |`B` |Jump to bootloader |
|
||||||
|`MAGIC_KEY_BOOTLOADER_ALT` |`ESC` |Jump to bootloader (alternate) |
|
|`MAGIC_KEY_BOOTLOADER_ALT` |`ESC` |Jump to bootloader (alternate) |
|
||||||
|`MAGIC_KEY_LOCK` |`CAPS` |Lock the keyboard so nothing can be typed |
|
|`MAGIC_KEY_LOCK` |`CAPS` |Lock the keyboard so nothing can be typed |
|
||||||
|`MAGIC_KEY_EEPROM` |`E` |Print stored EEPROM config to the console |
|
|`MAGIC_KEY_EEPROM` |`E` |Print stored EEPROM config to the console |
|
||||||
|`MAGIC_KEY_EEPROM_CLEAR` |`BSPACE` |Clear the EEPROM |
|
|`MAGIC_KEY_EEPROM_CLEAR` |`BSPACE` |Clear the EEPROM |
|
||||||
|`MAGIC_KEY_NKRO` |`N` |Toggle N-Key Rollover (NKRO) |
|
|`MAGIC_KEY_NKRO` |`N` |Toggle N-Key Rollover (NKRO) |
|
||||||
|`MAGIC_KEY_SLEEP_LED` |`Z` |Toggle LED when computer is sleeping |
|
|`MAGIC_KEY_SLEEP_LED` |`Z` |Toggle LED when computer is sleeping |
|
||||||
@@ -6,7 +6,6 @@ Basic encoders are supported by adding this to your `rules.mk`:
|
|||||||
|
|
||||||
and this to your `config.h`:
|
and this to your `config.h`:
|
||||||
|
|
||||||
#define NUMBER_OF_ENCODERS 1
|
|
||||||
#define ENCODERS_PAD_A { B12 }
|
#define ENCODERS_PAD_A { B12 }
|
||||||
#define ENCODERS_PAD_B { B13 }
|
#define ENCODERS_PAD_B { B13 }
|
||||||
|
|
||||||
|
|||||||
+137
-13
@@ -1,22 +1,33 @@
|
|||||||
# Tap Dance: A Single Key Can Do 3, 5, or 100 Different Things
|
# Tap Dance: A Single Key Can Do 3, 5, or 100 Different Things
|
||||||
|
|
||||||
<!-- FIXME: Break this up into multiple sections -->
|
## Introduction
|
||||||
|
|
||||||
Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. It's one of the nicest community-contributed features in the firmware, conceived and created by [algernon](https://github.com/algernon) in [#451](https://github.com/qmk/qmk_firmware/pull/451). Here's how algernon describes the feature:
|
Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. It's one of the nicest community-contributed features in the firmware, conceived and created by [algernon](https://github.com/algernon) in [#451](https://github.com/qmk/qmk_firmware/pull/451). Here's how algernon describes the feature:
|
||||||
|
|
||||||
With this feature one can specify keys that behave differently, based on the amount of times they have been tapped, and when interrupted, they get handled before the interrupter.
|
With this feature one can specify keys that behave differently, based on the amount of times they have been tapped, and when interrupted, they get handled before the interrupter.
|
||||||
|
|
||||||
To make it clear how this is different from `ACTION_FUNCTION_TAP`, let's explore a certain setup! We want one key to send `Space` on single tap, but `Enter` on double-tap.
|
## Explanatory Comparison with `ACTION_FUNCTION_TAP`
|
||||||
|
`ACTION_FUNCTION_TAP` can offer similar functionality to Tap Dance, but it's worth noting some important differences. To do this, let's explore a certain setup! We want one key to send `Space` on single-tap, but `Enter` on double-tap.
|
||||||
|
|
||||||
With `ACTION_FUNCTION_TAP`, it is quite a rain-dance to set this up, and has the problem that when the sequence is interrupted, the interrupting key will be sent first. Thus, `SPC a` will result in `a SPC` being sent, if they are typed within `TAPPING_TERM`. With the tap dance feature, that'll come out as `SPC a`, correctly.
|
With `ACTION_FUNCTION_TAP`, it is quite a rain-dance to set this up, and has the problem that when the sequence is interrupted, the interrupting key will be sent first. Thus, `SPC a` will result in `a SPC` being sent, if `SPC` and `a` are both typed within `TAPPING_TERM`. With the Tap Dance feature, that'll come out correctly as `SPC a` (even if both `SPC` and `a` are typed within the `TAPPING_TERM`.
|
||||||
|
|
||||||
The implementation hooks into two parts of the system, to achieve this: into `process_record_quantum()`, and the matrix scan. We need the latter to be able to time out a tap sequence even when a key is not being pressed, so `SPC` alone will time out and register after `TAPPING_TERM` time.
|
To achieve this correct handling of interrupts, the implementation of Tap Dance hooks into two parts of the system: `process_record_quantum()`, and the matrix scan. These two parts are explained below, but for now the point to note is that we need the latter to be able to time out a tap sequence even when a key is not being pressed. That way, `SPC` alone will time out and register after `TAPPING_TERM` time.
|
||||||
|
|
||||||
But lets start with how to use it, first!
|
## How to Use Tap Dance
|
||||||
|
But enough of the generalities; lets look at how to actually use Tap Dance!
|
||||||
|
|
||||||
First, you will need `TAP_DANCE_ENABLE=yes` in your `rules.mk`, because the feature is disabled by default. This adds a little less than 1k to the firmware size. Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that - similar to `F()`, takes a number, which will later be used as an index into the `tap_dance_actions` array.
|
First, you will need `TAP_DANCE_ENABLE=yes` in your `rules.mk`, because the feature is disabled by default. This adds a little less than 1k to the firmware size.
|
||||||
|
|
||||||
This array specifies what actions shall be taken when a tap-dance key is in action. Currently, there are five possible options:
|
Optionally, you might want to set a custom `TAPPING_TERM` time by adding something like this in you `config.h`:
|
||||||
|
|
||||||
|
```
|
||||||
|
#define TAPPING_TERM 175
|
||||||
|
```
|
||||||
|
|
||||||
|
The `TAPPING_TERM` time is the maximum time allowed between taps of your Tap Dance key, and is measured in milliseconds. For example, if you used the above `#define` statement and set up a Tap Dance key that sends `Space` on single-tap and `Enter` on double-tap, then this key will send `ENT` only if you tap this key twice in less than 175ms. If you tap the key, wait more than 175ms, and tap the key again you'll end up sending `SPC SPC` instead.
|
||||||
|
|
||||||
|
Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that - similar to `F()` - takes a number, which will later be used as an index into the `tap_dance_actions` array.
|
||||||
|
|
||||||
|
After this, you'll want to use the `tap_dance_actions` array to specify what actions shall be taken when a tap-dance key is in action. Currently, there are five possible options:
|
||||||
|
|
||||||
* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
|
* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
|
||||||
* `ACTION_TAP_DANCE_DUAL_ROLE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode).
|
* `ACTION_TAP_DANCE_DUAL_ROLE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode).
|
||||||
@@ -24,17 +35,22 @@ This array specifies what actions shall be taken when a tap-dance key is in acti
|
|||||||
* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
|
* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
|
||||||
* `ACTION_TAP_DANCE_FN_ADVANCED_TIME(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn, tap_specific_tapping_term)`: This functions identically to the `ACTION_TAP_DANCE_FN_ADVANCED` function, but uses a custom tapping term for it, instead of the predefined `TAPPING_TERM`.
|
* `ACTION_TAP_DANCE_FN_ADVANCED_TIME(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn, tap_specific_tapping_term)`: This functions identically to the `ACTION_TAP_DANCE_FN_ADVANCED` function, but uses a custom tapping term for it, instead of the predefined `TAPPING_TERM`.
|
||||||
|
|
||||||
The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise.
|
The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise.
|
||||||
|
|
||||||
!> Keep in mind that only [basic keycodes](keycodes_basic.md) are supported here. Custom keycodes are not supported.
|
!> Keep in mind that only [basic keycodes](keycodes_basic.md) are supported here. Custom keycodes are not supported.
|
||||||
|
|
||||||
And that's the bulk of it!
|
Similar to the first option, the second option is good for simple layer-switching cases.
|
||||||
|
|
||||||
And now, on to the explanation of how it works!
|
For more complicated cases, use the third or fourth options (examples of each are listed below).
|
||||||
|
|
||||||
The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and the timer.
|
Finally, the fifth option is particularly useful if your non-Tap-Dance keys start behaving weirdly after adding the code for your Tap Dance keys. The likely problem is that you changed the `TAPPING_TERM` time to make your Tap Dance keys easier for you to use, and that this has changed the way your other keys handle interrupts.
|
||||||
|
|
||||||
This means that you have `TAPPING_TERM` time to tap the key again, you do not have to input all the taps within that timeframe. This allows for longer tap counts, with minimal impact on responsiveness.
|
## Implementation Details
|
||||||
|
Well, that's the bulk of it! You should now be able to work through the examples below, and to develop your own Tap Dance functionality. But if you want a deeper understanding of what's going on behind the scenes, then read on for the explanation of how it all works!
|
||||||
|
|
||||||
|
The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and reset the timer.
|
||||||
|
|
||||||
|
This means that you have `TAPPING_TERM` time to tap the key again; you do not have to input all the taps within a single `TAPPING_TERM` timeframe. This allows for longer tap counts, with minimal impact on responsiveness.
|
||||||
|
|
||||||
Our next stop is `matrix_scan_tap_dance()`. This handles the timeout of tap-dance keys.
|
Our next stop is `matrix_scan_tap_dance()`. This handles the timeout of tap-dance keys.
|
||||||
|
|
||||||
@@ -397,3 +413,111 @@ qk_tap_dance_action_t tap_dance_actions[] = {
|
|||||||
```
|
```
|
||||||
|
|
||||||
Wrap each tapdance keycode in `TD()` when including it in your keymap, e.g. `TD(ALT_LP)`.
|
Wrap each tapdance keycode in `TD()` when including it in your keymap, e.g. `TD(ALT_LP)`.
|
||||||
|
|
||||||
|
### Example 6: Using tap dance for momentary-layer-switch and layer-toggle keys
|
||||||
|
|
||||||
|
Tap Dance can be used to mimic MO(layer) and TG(layer) functionality. For this example, we will set up a key to function as `KC_QUOT` on single-tap, as `MO(_MY_LAYER)` on single-hold, and `TG(_MY_LAYER)` on double-tap.
|
||||||
|
|
||||||
|
The first step is to include the following code towards the beginning of your `keymap.c`:
|
||||||
|
|
||||||
|
```
|
||||||
|
typedef struct {
|
||||||
|
bool is_press_action;
|
||||||
|
int state;
|
||||||
|
} tap;
|
||||||
|
|
||||||
|
//Define a type for as many tap dance states as you need
|
||||||
|
enum {
|
||||||
|
SINGLE_TAP = 1,
|
||||||
|
SINGLE_HOLD = 2,
|
||||||
|
DOUBLE_TAP = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
QUOT_LAYR = 0 //Our custom tap dance key; add any other tap dance keys to this enum
|
||||||
|
};
|
||||||
|
|
||||||
|
//Declare the functions to be used with your tap dance key(s)
|
||||||
|
|
||||||
|
//Function associated with all tap dances
|
||||||
|
int cur_dance (qk_tap_dance_state_t *state);
|
||||||
|
|
||||||
|
//Functions associated with individual tap dances
|
||||||
|
void ql_finished (qk_tap_dance_state_t *state, void *user_data);
|
||||||
|
void ql_reset (qk_tap_dance_state_t *state, void *user_data);
|
||||||
|
|
||||||
|
//Declare variable to track which layer is active
|
||||||
|
int active_layer;
|
||||||
|
```
|
||||||
|
|
||||||
|
The above code is similar to that used in previous examples. The one point to note is that you need to declare a variable to keep track of what layer is currently the active layer. We'll see why shortly.
|
||||||
|
|
||||||
|
Towards the bottom of your `keymap.c`, include the following code:
|
||||||
|
|
||||||
|
```
|
||||||
|
//Update active_layer
|
||||||
|
uint32_t layer_state_set_user(uint32_t state) {
|
||||||
|
switch (biton32(state)) {
|
||||||
|
case 1:
|
||||||
|
active_layer = 1;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
active_layer = 2;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
active_layer = 3;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
active_layer = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Determine the current tap dance state
|
||||||
|
int cur_dance (qk_tap_dance_state_t *state) {
|
||||||
|
if (state->count == 1) {
|
||||||
|
if (!state->pressed) {return SINGLE_TAP;}
|
||||||
|
else return SINGLE_HOLD;
|
||||||
|
} else if (state->count == 2) {return DOUBLE_TAP;}
|
||||||
|
else return 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Initialize tap structure associated with example tap dance key
|
||||||
|
static tap ql_tap_state = {
|
||||||
|
.is_press_action = true,
|
||||||
|
.state = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
//Functions that control what our tap dance key does
|
||||||
|
void ql_finished (qk_tap_dance_state_t *state, void *user_data) {
|
||||||
|
ql_tap_state.state = cur_dance(state);
|
||||||
|
switch (ql_tap_state.state) {
|
||||||
|
case SINGLE_TAP: tap_code(KC_QUOT); break;
|
||||||
|
case SINGLE_HOLD: layer_on(_MY_LAYER); break;
|
||||||
|
case DOUBLE_TAP:
|
||||||
|
if (active_layer==_MY_LAYER) {layer_off(_MY_LAYER);}
|
||||||
|
else layer_on(_MY_LAYER);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ql_reset (qk_tap_dance_state_t *state, void *user_data) {
|
||||||
|
if (ql_tap_state.state==SINGLE_HOLD) {layer_off(_MY_LAYER);}
|
||||||
|
ql_tap_state.state = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Associate our tap dance key with its functionality
|
||||||
|
qk_tap_dance_action_t tap_dance_actions[] = {
|
||||||
|
[QUOT_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, ql_finished, ql_reset, 275)
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
The is where the real logic of our tap dance key gets worked out. Since `layer_state_set_user()` is called on any layer switch, we use it to update `active_layer`. Our example is assuming that your `keymap.c` includes 4 layers, so adjust the switch statement here to fit your actual number of layers.
|
||||||
|
|
||||||
|
The use of `cur_dance()` and `ql_tap_state` mirrors the above examples.
|
||||||
|
|
||||||
|
The `case:SINGLE_TAP` in `ql_finished` is similar to the above examples. The `case:SINGLE_HOLD` works in conjunction with `ql_reset()` to switch to `_MY_LAYER` while the tap dance key is held, and to switch away from `_MY_LAYER` when the key is released. This mirrors the use of `MO(_MY_LAYER)`. The `case:DOUBLE_TAP` works by checking whether `_MY_LAYER` is the active layer, and toggling it on or off accordingly. This mirrors the use of `TG(_MY_LAYER)`.
|
||||||
|
|
||||||
|
`tap_dance_actions[]` works similar to the above examples. Note that I used `ACTION_TAP_DANCE_FN_ADVANCED_TIME()` instead of `ACTION_TAP_DANCE_FN_ADVANCED()`. This is because I like my `TAPPING_TERM` to be short (~175ms) for my non-tap-dance keys but find that this is too quick for me to reliably complete tap dance actions - thus the increased time of 275ms here.
|
||||||
|
|
||||||
|
Finally, to get this tap dance key working, be sure to include `TD(QUOT_LAYR)` in your `keymaps[]`.
|
||||||
@@ -1,16 +1,20 @@
|
|||||||
# Vagrant Quick Start
|
# Vagrant Quick Start
|
||||||
|
|
||||||
This project includes a Vagrantfile that will allow you to build a new firmware for your keyboard very easily without major changes to your primary operating system. This also ensures that when you clone the project and perform a build, you have the exact same environment as anyone else using the Vagrantfile to build. This makes it much easier for people to help you troubleshoot any issues you encounter.
|
This project includes a `Vagrantfile` that will allow you to build a new firmware for your keyboard very easily without major changes to your primary operating system. This also ensures that when you clone the project and perform a build, you have the exact same environment as anyone else using the Vagrantfile to build. This makes it much easier for people to help you troubleshoot any issues you encounter.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
Using the `/Vagrantfile` in this repository requires you have [Vagrant](http://www.vagrantup.com/) as well as [VirtualBox](https://www.virtualbox.org/) (or [VMware Workstation](https://www.vmware.com/products/workstation) and [Vagrant VMware plugin](http://www.vagrantup.com/vmware) but the (paid) VMware plugin requires a licensed copy of VMware Workstation/Fusion).
|
Using the `Vagrantfile` in this repository requires you have [Vagrant](http://www.vagrantup.com/) as well as a supported provider installed:
|
||||||
|
|
||||||
*COMPATIBILITY NOTICE* Certain versions of Virtualbox 5 appear to have an incompatibility with the Virtualbox extensions installed in the boxes in this Vagrantfile. If you encounter any issues with the /vagrant mount not succeeding, please upgrade your version of Virtualbox to at least 5.0.12. **Alternately, you can try running the following command:** `vagrant plugin install vagrant-vbguest`
|
* [VirtualBox](https://www.virtualbox.org/) (Version at least 5.0.12)
|
||||||
|
* Sold as 'the most accessible platform to use Vagrant'
|
||||||
|
* [VMware Workstation](https://www.vmware.com/products/workstation) and [Vagrant VMware plugin](http://www.vagrantup.com/vmware)
|
||||||
|
* The (paid) VMware plugin requires a licensed copy of VMware Workstation/Fusion
|
||||||
|
* [Docker](https://www.docker.com/)
|
||||||
|
|
||||||
Other than having Vagrant and Virtualbox installed and possibly a restart of your computer afterwards, you can simple run a 'vagrant up' anywhere inside the folder where you checked out this project and it will start a Linux virtual machine that contains all the tools required to build this project. There is a post Vagrant startup hint that will get you off on the right foot, otherwise you can also reference the build documentation below.
|
Other than having Vagrant, a suitable provider installed and possibly a restart of your computer afterwards, you can simple run a 'vagrant up' anywhere inside the folder where you checked out this project and it will start an environment (either a virtual machine or container) that contains all the tools required to build this project. There is a post Vagrant startup hint that will get you off on the right foot, otherwise you can also reference the build documentation below.
|
||||||
|
|
||||||
# Flashing the Firmware
|
## Flashing the Firmware
|
||||||
|
|
||||||
The "easy" way to flash the firmware is using a tool from your host OS:
|
The "easy" way to flash the firmware is using a tool from your host OS:
|
||||||
|
|
||||||
@@ -19,3 +23,35 @@ The "easy" way to flash the firmware is using a tool from your host OS:
|
|||||||
* [Atmel FLIP](http://www.atmel.com/tools/flip.aspx)
|
* [Atmel FLIP](http://www.atmel.com/tools/flip.aspx)
|
||||||
|
|
||||||
If you want to program via the command line you can uncomment the ['modifyvm'] lines in the Vagrantfile to enable the USB passthrough into Linux and then program using the command line tools like dfu-util/dfu-programmer or you can install the Teensy CLI version.
|
If you want to program via the command line you can uncomment the ['modifyvm'] lines in the Vagrantfile to enable the USB passthrough into Linux and then program using the command line tools like dfu-util/dfu-programmer or you can install the Teensy CLI version.
|
||||||
|
|
||||||
|
## Vagrantfile Overview
|
||||||
|
The development environment is configured to run the QMK Docker image, `qmkfm/base_container`. This not only ensures predictability between systems, it also mirrors the CI environment.
|
||||||
|
|
||||||
|
## FAQ
|
||||||
|
|
||||||
|
### Why am I seeing issues under Virtualbox?
|
||||||
|
Certain versions of Virtualbox 5 appear to have an incompatibility with the Virtualbox extensions installed in the boxes in this Vagrantfile. If you encounter any issues with the /vagrant mount not succeeding, please upgrade your version of Virtualbox to at least 5.0.12. **Alternately, you can try running the following command:**
|
||||||
|
|
||||||
|
```console
|
||||||
|
vagrant plugin install vagrant-vbguest
|
||||||
|
```
|
||||||
|
|
||||||
|
### How do I remove an existing environment?
|
||||||
|
Finished with your environment? From anywhere inside the folder where you checked out this project, Execute:
|
||||||
|
|
||||||
|
```console
|
||||||
|
vagrant destory
|
||||||
|
```
|
||||||
|
|
||||||
|
### What if I want to use Docker directly?
|
||||||
|
Want to benefit from the Vagrant workflow without a virtual machine? The Vagrantfile is configured to bypass running a virtual machine, and run the container directly. Execute the following when bringing up the environment to force the use of Docker:
|
||||||
|
```console
|
||||||
|
vagrant up --provider=docker
|
||||||
|
```
|
||||||
|
|
||||||
|
### How do I access the virtual machine instead of the Docker container?
|
||||||
|
Execute the following to bypass the `vagrant` user booting directly to the official qmk builder image:
|
||||||
|
|
||||||
|
```console
|
||||||
|
vagrant ssh -c 'sudo -i'
|
||||||
|
```
|
||||||
+18
-2
@@ -73,7 +73,22 @@ STM32 MCUs allows a variety of pins to be configured as I2C pins depending on th
|
|||||||
| `I2C1_SDA` | The pin number for the SDA pin (0-9) | `7` |
|
| `I2C1_SDA` | The pin number for the SDA pin (0-9) | `7` |
|
||||||
| `I2C1_BANK` (deprecated) | The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`), superceded by `I2C1_SCL_BANK`, `I2C1_SDA_BANK` | `GPIOB` |
|
| `I2C1_BANK` (deprecated) | The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`), superceded by `I2C1_SCL_BANK`, `I2C1_SDA_BANK` | `GPIOB` |
|
||||||
|
|
||||||
STM32 MCUs allow for different timing parameters when configuring I2C. These can be modified using the following parameters, using https://www.st.com/en/embedded-software/stsw-stm32126.html as a reference:
|
The ChibiOS I2C driver configuration depends on STM32 MCU:
|
||||||
|
|
||||||
|
STM32F1xx, STM32F2xx, STM32F4xx, STM32L0xx and STM32L1xx use I2Cv1;
|
||||||
|
STM32F0xx, STM32F3xx, STM32F7xx and STM32L4xx use I2Cv2;
|
||||||
|
|
||||||
|
#### I2Cv1
|
||||||
|
STM32 MCUs allow for different clock and duty parameters when configuring I2Cv1. These can be modified using the following parameters, using <https://www.playembedded.org/blog/stm32-i2c-chibios/#I2Cv1_configuration_structure> as a reference:
|
||||||
|
|
||||||
|
| Variable | Default |
|
||||||
|
|--------------------|------------------|
|
||||||
|
| `I2C1_OPMODE` | `OPMODE_I2C` |
|
||||||
|
| `I2C1_CLOCK_SPEED` | `100000` |
|
||||||
|
| `I2C1_DUTY_CYCLE` | `STD_DUTY_CYCLE` |
|
||||||
|
|
||||||
|
#### I2Cv2
|
||||||
|
STM32 MCUs allow for different timing parameters when configuring I2Cv2. These can be modified using the following parameters, using <https://www.st.com/en/embedded-software/stsw-stm32126.html> as a reference:
|
||||||
|
|
||||||
| Variable | Default |
|
| Variable | Default |
|
||||||
|-----------------------|---------|
|
|-----------------------|---------|
|
||||||
@@ -83,13 +98,14 @@ STM32 MCUs allow for different timing parameters when configuring I2C. These can
|
|||||||
| `I2C1_TIMINGR_SCLH` | `15U` |
|
| `I2C1_TIMINGR_SCLH` | `15U` |
|
||||||
| `I2C1_TIMINGR_SCLL` | `21U` |
|
| `I2C1_TIMINGR_SCLL` | `21U` |
|
||||||
|
|
||||||
STM32 MCUs allow for different "alternate function" modes when configuring GPIO pins. These are required to switch the pins used to I2C mode. See the respective datasheet for the appropriate values for your MCU.
|
STM32 MCUs allow for different "alternate function" modes when configuring GPIO pins. These are required to switch the pins used to I2Cv2 mode. See the respective datasheet for the appropriate values for your MCU.
|
||||||
|
|
||||||
| Variable | Default |
|
| Variable | Default |
|
||||||
|---------------------|---------|
|
|---------------------|---------|
|
||||||
| `I2C1_SCL_PAL_MODE` | `4` |
|
| `I2C1_SCL_PAL_MODE` | `4` |
|
||||||
| `I2C1_SDA_PAL_MODE` | `4` |
|
| `I2C1_SDA_PAL_MODE` | `4` |
|
||||||
|
|
||||||
|
#### Other
|
||||||
You can also overload the `void i2c_init(void)` function, which has a weak attribute. If you do this the configuration variables above will not be used. Please consult the datasheet of your MCU for the available GPIO configurations. The following is an example initialization function:
|
You can also overload the `void i2c_init(void)` function, which has a weak attribute. If you do this the configuration variables above will not be used. Please consult the datasheet of your MCU for the available GPIO configurations. The following is an example initialization function:
|
||||||
|
|
||||||
```C
|
```C
|
||||||
|
|||||||
@@ -33,11 +33,17 @@
|
|||||||
static uint8_t i2c_address;
|
static uint8_t i2c_address;
|
||||||
|
|
||||||
static const I2CConfig i2cconfig = {
|
static const I2CConfig i2cconfig = {
|
||||||
|
#ifdef USE_I2CV1
|
||||||
|
I2C1_OPMODE,
|
||||||
|
I2C1_CLOCK_SPEED,
|
||||||
|
I2C1_DUTY_CYCLE,
|
||||||
|
#else
|
||||||
STM32_TIMINGR_PRESC(I2C1_TIMINGR_PRESC) |
|
STM32_TIMINGR_PRESC(I2C1_TIMINGR_PRESC) |
|
||||||
STM32_TIMINGR_SCLDEL(I2C1_TIMINGR_SCLDEL) | STM32_TIMINGR_SDADEL(I2C1_TIMINGR_SDADEL) |
|
STM32_TIMINGR_SCLDEL(I2C1_TIMINGR_SCLDEL) | STM32_TIMINGR_SDADEL(I2C1_TIMINGR_SDADEL) |
|
||||||
STM32_TIMINGR_SCLH(I2C1_TIMINGR_SCLH) | STM32_TIMINGR_SCLL(I2C1_TIMINGR_SCLL),
|
STM32_TIMINGR_SCLH(I2C1_TIMINGR_SCLH) | STM32_TIMINGR_SCLL(I2C1_TIMINGR_SCLL),
|
||||||
0,
|
0,
|
||||||
0
|
0
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static i2c_status_t chibios_to_qmk(const msg_t* status) {
|
static i2c_status_t chibios_to_qmk(const msg_t* status) {
|
||||||
@@ -61,8 +67,13 @@ void i2c_init(void)
|
|||||||
|
|
||||||
chThdSleepMilliseconds(10);
|
chThdSleepMilliseconds(10);
|
||||||
|
|
||||||
|
#ifdef USE_I2CV1
|
||||||
|
palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_STM32_ALTERNATE_OPENDRAIN);
|
||||||
|
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_STM32_ALTERNATE_OPENDRAIN);
|
||||||
|
#else
|
||||||
palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_ALTERNATE(I2C1_SCL_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
|
palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_ALTERNATE(I2C1_SCL_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
|
||||||
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
|
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
|
||||||
|
#endif
|
||||||
|
|
||||||
//i2cInit(); //This is invoked by halInit() so no need to redo it.
|
//i2cInit(); //This is invoked by halInit() so no need to redo it.
|
||||||
}
|
}
|
||||||
@@ -106,11 +117,11 @@ i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data,
|
|||||||
return chibios_to_qmk(&status);
|
return chibios_to_qmk(&status);
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t* regaddr, uint8_t* data, uint16_t length, uint16_t timeout)
|
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)
|
||||||
{
|
{
|
||||||
i2c_address = devaddr;
|
i2c_address = devaddr;
|
||||||
i2cStart(&I2C_DRIVER, &i2cconfig);
|
i2cStart(&I2C_DRIVER, &i2cconfig);
|
||||||
msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), regaddr, 1, data, length, MS2ST(timeout));
|
msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), ®addr, 1, data, length, MS2ST(timeout));
|
||||||
return chibios_to_qmk(&status);
|
return chibios_to_qmk(&status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+42
-24
@@ -22,10 +22,16 @@
|
|||||||
* Please ensure that HAL_USE_I2C is TRUE in the halconf.h file and that
|
* Please ensure that HAL_USE_I2C is TRUE in the halconf.h file and that
|
||||||
* STM32_I2C_USE_I2C1 is TRUE in the mcuconf.h file.
|
* STM32_I2C_USE_I2C1 is TRUE in the mcuconf.h file.
|
||||||
*/
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include "ch.h"
|
#include "ch.h"
|
||||||
#include <hal.h>
|
#include <hal.h>
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(STM32F1XX) || defined(STM32F1xx) || defined(STM32F2xx) || defined(STM32F4xx) || defined(STM32L0xx) || defined(STM32L1xx)
|
||||||
|
#define USE_I2CV1
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef I2C1_BANK
|
#ifdef I2C1_BANK
|
||||||
#define I2C1_SCL_BANK I2C1_BANK
|
#define I2C1_SCL_BANK I2C1_BANK
|
||||||
#define I2C1_SDA_BANK I2C1_BANK
|
#define I2C1_SDA_BANK I2C1_BANK
|
||||||
@@ -46,30 +52,42 @@
|
|||||||
#define I2C1_SDA 7
|
#define I2C1_SDA 7
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// The default PAL alternate modes are used to signal that the pins are used for I2C
|
#ifdef USE_I2CV1
|
||||||
#ifndef I2C1_SCL_PAL_MODE
|
#ifndef I2C1_OPMODE
|
||||||
#define I2C1_SCL_PAL_MODE 4
|
#define I2C1_OPMODE OPMODE_I2C
|
||||||
#endif
|
#endif
|
||||||
#ifndef I2C1_SDA_PAL_MODE
|
#ifndef I2C1_CLOCK_SPEED
|
||||||
#define I2C1_SDA_PAL_MODE 4
|
#define I2C1_CLOCK_SPEED 100000 /* 400000 */
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef I2C1_DUTY_CYCLE
|
||||||
|
#define I2C1_DUTY_CYCLE STD_DUTY_CYCLE /* FAST_DUTY_CYCLE_2 */
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
// The default PAL alternate modes are used to signal that the pins are used for I2C
|
||||||
|
#ifndef I2C1_SCL_PAL_MODE
|
||||||
|
#define I2C1_SCL_PAL_MODE 4
|
||||||
|
#endif
|
||||||
|
#ifndef I2C1_SDA_PAL_MODE
|
||||||
|
#define I2C1_SDA_PAL_MODE 4
|
||||||
|
#endif
|
||||||
|
|
||||||
// The default timing values below configures the I2C clock to 400khz assuming a 72Mhz clock
|
// The default timing values below configures the I2C clock to 400khz assuming a 72Mhz clock
|
||||||
// For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html
|
// For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html
|
||||||
#ifndef I2C1_TIMINGR_PRESC
|
#ifndef I2C1_TIMINGR_PRESC
|
||||||
#define I2C1_TIMINGR_PRESC 15U
|
#define I2C1_TIMINGR_PRESC 15U
|
||||||
#endif
|
#endif
|
||||||
#ifndef I2C1_TIMINGR_SCLDEL
|
#ifndef I2C1_TIMINGR_SCLDEL
|
||||||
#define I2C1_TIMINGR_SCLDEL 4U
|
#define I2C1_TIMINGR_SCLDEL 4U
|
||||||
#endif
|
#endif
|
||||||
#ifndef I2C1_TIMINGR_SDADEL
|
#ifndef I2C1_TIMINGR_SDADEL
|
||||||
#define I2C1_TIMINGR_SDADEL 2U
|
#define I2C1_TIMINGR_SDADEL 2U
|
||||||
#endif
|
#endif
|
||||||
#ifndef I2C1_TIMINGR_SCLH
|
#ifndef I2C1_TIMINGR_SCLH
|
||||||
#define I2C1_TIMINGR_SCLH 15U
|
#define I2C1_TIMINGR_SCLH 15U
|
||||||
#endif
|
#endif
|
||||||
#ifndef I2C1_TIMINGR_SCLL
|
#ifndef I2C1_TIMINGR_SCLL
|
||||||
#define I2C1_TIMINGR_SCLL 21U
|
#define I2C1_TIMINGR_SCLL 21U
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef I2C_DRIVER
|
#ifndef I2C_DRIVER
|
||||||
@@ -88,5 +106,5 @@ i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length,
|
|||||||
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);
|
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);
|
||||||
i2c_status_t i2c_transmit_receive(uint8_t address, uint8_t * tx_body, uint16_t tx_length, uint8_t * rx_body, uint16_t rx_length);
|
i2c_status_t i2c_transmit_receive(uint8_t address, uint8_t * tx_body, uint16_t tx_length, uint8_t * rx_body, uint16_t rx_length);
|
||||||
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout);
|
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout);
|
||||||
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t* regaddr, uint8_t* data, uint16_t length, uint16_t timeout);
|
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);
|
||||||
void i2c_stop(void);
|
void i2c_stop(void);
|
||||||
+17
-19
@@ -71,10 +71,10 @@ uint8_t g_twi_transfer_buffer[20];
|
|||||||
// buffers and the transfers in IS31FL3731_write_pwm_buffer() but it's
|
// buffers and the transfers in IS31FL3731_write_pwm_buffer() but it's
|
||||||
// probably not worth the extra complexity.
|
// probably not worth the extra complexity.
|
||||||
uint8_t g_pwm_buffer[DRIVER_COUNT][144];
|
uint8_t g_pwm_buffer[DRIVER_COUNT][144];
|
||||||
bool g_pwm_buffer_update_required = false;
|
bool g_pwm_buffer_update_required[DRIVER_COUNT] = { false };
|
||||||
|
|
||||||
uint8_t g_led_control_registers[DRIVER_COUNT][18] = { { 0 }, { 0 } };
|
uint8_t g_led_control_registers[DRIVER_COUNT][18] = { { 0 }, { 0 } };
|
||||||
bool g_led_control_registers_update_required = false;
|
bool g_led_control_registers_update_required[DRIVER_COUNT] = { false };
|
||||||
|
|
||||||
// This is the bit pattern in the LED control registers
|
// This is the bit pattern in the LED control registers
|
||||||
// (for matrix A, add one to register for matrix B)
|
// (for matrix A, add one to register for matrix B)
|
||||||
@@ -204,7 +204,7 @@ void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
|
|||||||
g_pwm_buffer[led.driver][led.r - 0x24] = red;
|
g_pwm_buffer[led.driver][led.r - 0x24] = red;
|
||||||
g_pwm_buffer[led.driver][led.g - 0x24] = green;
|
g_pwm_buffer[led.driver][led.g - 0x24] = green;
|
||||||
g_pwm_buffer[led.driver][led.b - 0x24] = blue;
|
g_pwm_buffer[led.driver][led.b - 0x24] = blue;
|
||||||
g_pwm_buffer_update_required = true;
|
g_pwm_buffer_update_required[led.driver] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,12 +220,12 @@ void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, b
|
|||||||
{
|
{
|
||||||
is31_led led = g_is31_leds[index];
|
is31_led led = g_is31_leds[index];
|
||||||
|
|
||||||
uint8_t control_register_r = (led.r - 0x24) / 8;
|
uint8_t control_register_r = (led.r - 0x24) / 8;
|
||||||
uint8_t control_register_g = (led.g - 0x24) / 8;
|
uint8_t control_register_g = (led.g - 0x24) / 8;
|
||||||
uint8_t control_register_b = (led.b - 0x24) / 8;
|
uint8_t control_register_b = (led.b - 0x24) / 8;
|
||||||
uint8_t bit_r = (led.r - 0x24) % 8;
|
uint8_t bit_r = (led.r - 0x24) % 8;
|
||||||
uint8_t bit_g = (led.g - 0x24) % 8;
|
uint8_t bit_g = (led.g - 0x24) % 8;
|
||||||
uint8_t bit_b = (led.b - 0x24) % 8;
|
uint8_t bit_b = (led.b - 0x24) % 8;
|
||||||
|
|
||||||
if ( red ) {
|
if ( red ) {
|
||||||
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
|
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
|
||||||
@@ -243,28 +243,26 @@ void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, b
|
|||||||
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
|
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_led_control_registers_update_required = true;
|
g_led_control_registers_update_required[led.driver] = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_update_pwm_buffers( uint8_t addr1, uint8_t addr2 )
|
void IS31FL3731_update_pwm_buffers( uint8_t addr, uint8_t index )
|
||||||
{
|
{
|
||||||
if ( g_pwm_buffer_update_required )
|
if ( g_pwm_buffer_update_required[index] )
|
||||||
{
|
{
|
||||||
IS31FL3731_write_pwm_buffer( addr1, g_pwm_buffer[0] );
|
IS31FL3731_write_pwm_buffer( addr, g_pwm_buffer[index] );
|
||||||
IS31FL3731_write_pwm_buffer( addr2, g_pwm_buffer[1] );
|
|
||||||
}
|
}
|
||||||
g_pwm_buffer_update_required = false;
|
g_pwm_buffer_update_required[index] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_update_led_control_registers( uint8_t addr1, uint8_t addr2 )
|
void IS31FL3731_update_led_control_registers( uint8_t addr, uint8_t index )
|
||||||
{
|
{
|
||||||
if ( g_led_control_registers_update_required )
|
if ( g_led_control_registers_update_required[index] )
|
||||||
{
|
{
|
||||||
for ( int i=0; i<18; i++ )
|
for ( int i=0; i<18; i++ )
|
||||||
{
|
{
|
||||||
IS31FL3731_write_register(addr1, i, g_led_control_registers[0][i] );
|
IS31FL3731_write_register( addr, i, g_led_control_registers[index][i] );
|
||||||
IS31FL3731_write_register(addr2, i, g_led_control_registers[1][i] );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -44,8 +44,8 @@ void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, b
|
|||||||
// (eg. from a timer interrupt).
|
// (eg. from a timer interrupt).
|
||||||
// Call this while idle (in between matrix scans).
|
// Call this while idle (in between matrix scans).
|
||||||
// If the buffer is dirty, it will update the driver with the buffer.
|
// If the buffer is dirty, it will update the driver with the buffer.
|
||||||
void IS31FL3731_update_pwm_buffers( uint8_t addr1, uint8_t addr2 );
|
void IS31FL3731_update_pwm_buffers( uint8_t addr, uint8_t index );
|
||||||
void IS31FL3731_update_led_control_registers( uint8_t addr1, uint8_t addr2 );
|
void IS31FL3731_update_led_control_registers( uint8_t addr, uint8_t index );
|
||||||
|
|
||||||
#define C1_1 0x24
|
#define C1_1 0x24
|
||||||
#define C1_2 0x25
|
#define C1_2 0x25
|
||||||
|
|||||||
@@ -17,6 +17,19 @@
|
|||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* Qwerty
|
||||||
|
* ,-----------------------------------------------------------------------------------------.
|
||||||
|
* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | Caps | A | S | D | F | G | H | J | K | L | ; | ' | Enter |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | Shift | Z | X | C | V | B | N | M | , | . | / | Shift |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | Ctrl | GUI | Alt | Space | Alt | GUI | L1 | Ctrl |
|
||||||
|
* `-----------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
[0] = LAYOUT_60_ansi(
|
[0] = LAYOUT_60_ansi(
|
||||||
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_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_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,
|
||||||
@@ -25,6 +38,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL
|
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL
|
||||||
),
|
),
|
||||||
|
|
||||||
|
/* Function
|
||||||
|
* ,-----------------------------------------------------------------------------------------.
|
||||||
|
* | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | | | Up | | | | | | | |PrtSc|ScrLk|Pause| |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | |Left |Down |Right| | | | | | Ins |Home |PgUp | |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | |VolUp|VolDn|VolMu| | | | | | End |PgDn | |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | | | | | | L2 | | |
|
||||||
|
* `-----------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
[1] = LAYOUT_60_ansi(
|
[1] = LAYOUT_60_ansi(
|
||||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
|
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
|
||||||
KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS,
|
KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS,
|
||||||
@@ -33,6 +59,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, KC_TRNS
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, KC_TRNS
|
||||||
),
|
),
|
||||||
|
|
||||||
|
/* RGB
|
||||||
|
* ,-----------------------------------------------------------------------------------------.
|
||||||
|
* | | | | | | | | | | | | | | Reset |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | BL Tog |BLInc|BLDec|BLStp| | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | RGB Tog |Mode |Hue I|Sat I|Val I|Spd I|Plain|Breat|Rnbow|Swirl| | | |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | |RMode|Hue D|Sat D|Val D|Spd D|Snake|Knigh|Xmas |Gradi| | |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | | | | | | | | |
|
||||||
|
* `-----------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
[2] = LAYOUT_60_ansi(
|
[2] = LAYOUT_60_ansi(
|
||||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET,
|
||||||
BL_TOGG, BL_INC, BL_DEC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
BL_TOGG, BL_INC, BL_DEC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
extern keymap_config_t keymap_config;
|
|
||||||
|
|
||||||
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
||||||
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
||||||
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||||
@@ -15,18 +13,18 @@ enum custom_keycodes {
|
|||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
[_BASE] = LAYOUT_60_ansi(
|
[_BASE] = LAYOUT_60_ansi(
|
||||||
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_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_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
|
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_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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
|
||||||
KC_LCTL , KC_LGUI , KC_LALT , KC_SPC , KC_RALT , KC_RGUI , MO(_FN1) , KC_RCTL
|
KC_LCTL, KC_LGUI, KC_LALT , KC_SPC, KC_RALT, KC_RGUI, MO(_FN1), KC_RCTL
|
||||||
),
|
),
|
||||||
|
|
||||||
[_FN1] = LAYOUT_60_ansi(
|
[_FN1] = LAYOUT_60_ansi(
|
||||||
KC_GESC, 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_BSPC, \
|
KC_GESC, 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_BSPC,
|
||||||
RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||||
_______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,\
|
_______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||||
BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||||
KC_GRV, _______, _______, _______, _______, _______, _______, _______
|
KC_GRV, _______, _______, _______, _______, _______, _______, _______
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
#undef RGBLED_NUM
|
||||||
|
#define RGBLED_NUM 16
|
||||||
|
|
||||||
|
#define QMK_ESC_OUTPUT F4
|
||||||
|
#define QMK_ESC_INPUT D3
|
||||||
|
#define QMK_LED B0
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
||||||
|
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
||||||
|
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||||
|
// entirely and just use numbers.
|
||||||
|
#define _BASE 0
|
||||||
|
#define _FN1 1
|
||||||
|
|
||||||
|
enum custom_keycodes {
|
||||||
|
QWERTY = SAFE_RANGE,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[_BASE] = LAYOUT_60_ansi(
|
||||||
|
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_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_LCTL, KC_LGUI, KC_LALT , KC_SPC, KC_RALT, KC_APP, MO(_FN1), KC_RCTL
|
||||||
|
),
|
||||||
|
|
||||||
|
[_FN1] = LAYOUT_60_ansi(
|
||||||
|
KC_GESC, 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, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||||
|
_______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||||
|
BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||||
|
KC_GRV, _______, _______, _______, _______, KC_RGUI, _______, _______
|
||||||
|
)
|
||||||
|
};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
BOOTLOADER = qmk-dfu
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
|
|
||||||
#define LAYOUT_60_ansi( \
|
#define LAYOUT_60_ansi( \
|
||||||
K00, K01, K02, K03, K04, K05, K06, K07, K10, K11, K12, K13, K14, K15, \
|
K00, K01, K02, K03, K04, K05, K06, K07, K10, K11, K12, K13, K14, K15, \
|
||||||
K16, K17, K20, K21, K22, K23, K24, K25, K26, K27, K30, K31, K32, K33, \
|
K16, K17, K20, K21, K22, K23, K24, K25, K26, K27, K30, K31, K32, K33, \
|
||||||
K34, K35, K36, K37, K40, K41, K42, K43, K44, K45, K46, K47, K50, \
|
K34, K35, K36, K37, K40, K41, K42, K43, K44, K45, K46, K47, K50, \
|
||||||
K51, K52, K53, K54, K55, K56, K57, K60, K61, K62, K63, K64, \
|
K51, K52, K53, K54, K55, K56, K57, K60, K61, K62, K63, K64, \
|
||||||
@@ -18,4 +18,3 @@
|
|||||||
{ K60, K61, K62, K63, K64, K65, K66, K67 }, \
|
{ K60, K61, K62, K63, K64, K65, K66, K67 }, \
|
||||||
{ K70, K71, K72, K73, K74 }, \
|
{ K70, K71, K72, K73, K74 }, \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -125,11 +125,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* key combination for magic key command */
|
|
||||||
/*#define IS_COMMAND() ( \
|
|
||||||
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
|
||||||
)*/
|
|
||||||
|
|
||||||
/* control how magic key switches layers */
|
/* control how magic key switches layers */
|
||||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
|
||||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
|
||||||
@@ -239,7 +234,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
// #define BOOTMAGIC_LITE_ROW 0
|
// #define BOOTMAGIC_LITE_ROW 0
|
||||||
// #define BOOTMAGIC_LITE_COLUMN 0
|
// #define BOOTMAGIC_LITE_COLUMN 0
|
||||||
|
|
||||||
#define NUMBER_OF_ENCODERS 3
|
|
||||||
#define ENCODERS_PAD_A { B2, B3, D5 }
|
#define ENCODERS_PAD_A { B2, B3, D5 }
|
||||||
#define ENCODERS_PAD_B { B1, B7, B4 }
|
#define ENCODERS_PAD_B { B1, B7, B4 }
|
||||||
#define ENCODER_RESOLUTION 2
|
#define ENCODER_RESOLUTION 2
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
@@ -83,4 +82,4 @@ HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
|
|||||||
SRC += keyboards/wilba_tech/wt_main.c
|
SRC += keyboards/wilba_tech/wt_main.c
|
||||||
|
|
||||||
RAW_ENABLE = yes
|
RAW_ENABLE = yes
|
||||||
DYNAMIC_KEYMAP_ENABLE = yes
|
DYNAMIC_KEYMAP_ENABLE = yes
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ SRC += split_util.c \
|
|||||||
matrix.c
|
matrix.c
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
@@ -69,4 +68,4 @@ AUDIO_ENABLE = no # Audio output on port C6
|
|||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
|
|
||||||
CUSTOM_MATRIX = yes
|
CUSTOM_MATRIX = yes
|
||||||
SRC += matrix.c
|
SRC += matrix.c
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
+109
-100
@@ -1,103 +1,112 @@
|
|||||||
{
|
{
|
||||||
"keyboard_name": "QMK80",
|
"keyboard_name": "x11",
|
||||||
"url": "",
|
"url": "",
|
||||||
"maintainer": "qmk",
|
"maintainer": "qmk",
|
||||||
"width": 18.25,
|
"width": 18.25,
|
||||||
"height": 6.5,
|
"height": 6.5,
|
||||||
"layouts": {
|
"layouts": {
|
||||||
"LAYOUT": {
|
"LAYOUT": {
|
||||||
"key_count": 88,
|
"key_count": 88,
|
||||||
"layout": [
|
"layout": [
|
||||||
{"label":"K00", "x":0, "y":0},
|
{"label":"K00", "x":0, "y":0},
|
||||||
{"label":"K01", "x":2, "y":0},
|
{"label":"K01", "x":2, "y":0},
|
||||||
{"label":"K02", "x":3, "y":0},
|
{"label":"K02", "x":3, "y":0},
|
||||||
{"label":"K03", "x":4, "y":0},
|
{"label":"K03", "x":4, "y":0},
|
||||||
{"label":"K04", "x":5, "y":0},
|
{"label":"K04", "x":5, "y":0},
|
||||||
{"label":"K05", "x":6.5, "y":0},
|
{"label":"K05", "x":6.5, "y":0},
|
||||||
{"label":"K06", "x":7.5, "y":0},
|
{"label":"K06", "x":7.5, "y":0},
|
||||||
{"label":"K07", "x":8.5, "y":0},
|
{"label":"K07", "x":8.5, "y":0},
|
||||||
{"label":"K08", "x":9.5, "y":0},
|
{"label":"K08", "x":9.5, "y":0},
|
||||||
{"label":"K09", "x":11, "y":0},
|
{"label":"K09", "x":11, "y":0},
|
||||||
{"label":"K0A", "x":12, "y":0},
|
{"label":"K0A", "x":12, "y":0},
|
||||||
{"label":"K0B", "x":13, "y":0},
|
{"label":"K0B", "x":13, "y":0},
|
||||||
{"label":"K0C", "x":14, "y":0},
|
{"label":"K0C", "x":14, "y":0},
|
||||||
{"label":"K60", "x":15.25, "y":0},
|
|
||||||
{"label":"K61", "x":16.25, "y":0},
|
{"label":"K62", "x":15.25, "y":0},
|
||||||
{"label":"K62", "x":17.25, "y":0},
|
{"label":"K61", "x":16.25, "y":0},
|
||||||
{"label":"K10", "x":0, "y":1.5},
|
{"label":"K60", "x":17.25, "y":0},
|
||||||
{"label":"K11", "x":1, "y":1.5},
|
|
||||||
{"label":"K12", "x":2, "y":1.5},
|
{"label":"K10", "x":0, "y":1.5},
|
||||||
{"label":"K13", "x":3, "y":1.5},
|
{"label":"K11", "x":1, "y":1.5},
|
||||||
{"label":"K14", "x":4, "y":1.5},
|
{"label":"K12", "x":2, "y":1.5},
|
||||||
{"label":"K15", "x":5, "y":1.5},
|
{"label":"K13", "x":3, "y":1.5},
|
||||||
{"label":"K16", "x":6, "y":1.5},
|
{"label":"K14", "x":4, "y":1.5},
|
||||||
{"label":"K17", "x":7, "y":1.5},
|
{"label":"K15", "x":5, "y":1.5},
|
||||||
{"label":"K18", "x":8, "y":1.5},
|
{"label":"K16", "x":6, "y":1.5},
|
||||||
{"label":"K19", "x":9, "y":1.5},
|
{"label":"K17", "x":7, "y":1.5},
|
||||||
{"label":"K1A", "x":10, "y":1.5},
|
{"label":"K18", "x":8, "y":1.5},
|
||||||
{"label":"K1B", "x":11, "y":1.5},
|
{"label":"K19", "x":9, "y":1.5},
|
||||||
{"label":"K1C", "x":12, "y":1.5},
|
{"label":"K1A", "x":10, "y":1.5},
|
||||||
{"label":"K5A", "x":13, "y":1.5, "w":2},
|
{"label":"K1B", "x":11, "y":1.5},
|
||||||
{"label":"K63", "x":15.25, "y":1.5},
|
{"label":"K1C", "x":12, "y":1.5},
|
||||||
{"label":"K65", "x":16.25, "y":1.5},
|
{"label":"K5A", "x":13, "y":1.5, "w":2},
|
||||||
{"label":"K67", "x":17.25, "y":1.5},
|
|
||||||
{"label":"K20", "x":0, "y":2.5, "w":1.5},
|
{"label":"K63", "x":15.25, "y":1.5},
|
||||||
{"label":"K21", "x":1.5, "y":2.5},
|
{"label":"K65", "x":16.25, "y":1.5},
|
||||||
{"label":"K22", "x":2.5, "y":2.5},
|
{"label":"K67", "x":17.25, "y":1.5},
|
||||||
{"label":"K23", "x":3.5, "y":2.5},
|
|
||||||
{"label":"K24", "x":4.5, "y":2.5},
|
{"label":"K20", "x":0, "y":2.5, "w":1.5},
|
||||||
{"label":"K25", "x":5.5, "y":2.5},
|
{"label":"K21", "x":1.5, "y":2.5},
|
||||||
{"label":"K26", "x":6.5, "y":2.5},
|
{"label":"K22", "x":2.5, "y":2.5},
|
||||||
{"label":"K27", "x":7.5, "y":2.5},
|
{"label":"K23", "x":3.5, "y":2.5},
|
||||||
{"label":"K28", "x":8.5, "y":2.5},
|
{"label":"K24", "x":4.5, "y":2.5},
|
||||||
{"label":"K29", "x":9.5, "y":2.5},
|
{"label":"K25", "x":5.5, "y":2.5},
|
||||||
{"label":"K2A", "x":10.5, "y":2.5},
|
{"label":"K26", "x":6.5, "y":2.5},
|
||||||
{"label":"K2B", "x":11.5, "y":2.5},
|
{"label":"K27", "x":7.5, "y":2.5},
|
||||||
{"label":"K2C", "x":12.5, "y":2.5},
|
{"label":"K28", "x":8.5, "y":2.5},
|
||||||
{"label":"K4C", "x":13.5, "y":2.5, "w":1.5},
|
{"label":"K29", "x":9.5, "y":2.5},
|
||||||
{"label":"K64", "x":15.25, "y":2.5},
|
{"label":"K2A", "x":10.5, "y":2.5},
|
||||||
{"label":"K66", "x":16.25, "y":2.5},
|
{"label":"K2B", "x":11.5, "y":2.5},
|
||||||
{"label":"K68", "x":17.25, "y":2.5},
|
{"label":"K2C", "x":12.5, "y":2.5},
|
||||||
{"label":"K30", "x":0, "y":3.5, "w":1.75},
|
{"label":"K4C", "x":13.5, "y":2.5, "w":1.5},
|
||||||
{"label":"K31", "x":1.75, "y":3.5},
|
|
||||||
{"label":"K32", "x":2.75, "y":3.5},
|
{"label":"K64", "x":15.25, "y":2.5},
|
||||||
{"label":"K33", "x":3.75, "y":3.5},
|
{"label":"K66", "x":16.25, "y":2.5},
|
||||||
{"label":"K34", "x":4.75, "y":3.5},
|
{"label":"K68", "x":17.25, "y":2.5},
|
||||||
{"label":"K35", "x":5.75, "y":3.5},
|
|
||||||
{"label":"K36", "x":6.75, "y":3.5},
|
{"label":"K30", "x":0, "y":3.5, "w":1.75},
|
||||||
{"label":"K37", "x":7.75, "y":3.5},
|
{"label":"K31", "x":1.75, "y":3.5},
|
||||||
{"label":"K38", "x":8.75, "y":3.5},
|
{"label":"K32", "x":2.75, "y":3.5},
|
||||||
{"label":"K39", "x":9.75, "y":3.5},
|
{"label":"K33", "x":3.75, "y":3.5},
|
||||||
{"label":"K3A", "x":10.75, "y":3.5},
|
{"label":"K34", "x":4.75, "y":3.5},
|
||||||
{"label":"K3B", "x":11.75, "y":3.5},
|
{"label":"K35", "x":5.75, "y":3.5},
|
||||||
{"label":"K3C", "x":12.75, "y":3.5, "w":2.25},
|
{"label":"K36", "x":6.75, "y":3.5},
|
||||||
{"label":"K40", "x":0, "y":4.5, "w":2.25},
|
{"label":"K37", "x":7.75, "y":3.5},
|
||||||
{"label":"K41", "x":2.25, "y":4.5},
|
{"label":"K38", "x":8.75, "y":3.5},
|
||||||
{"label":"K42", "x":3.25, "y":4.5},
|
{"label":"K39", "x":9.75, "y":3.5},
|
||||||
{"label":"K43", "x":4.25, "y":4.5},
|
{"label":"K3A", "x":10.75, "y":3.5},
|
||||||
{"label":"K44", "x":5.25, "y":4.5},
|
{"label":"K3B", "x":11.75, "y":3.5},
|
||||||
{"label":"K45", "x":6.25, "y":4.5},
|
{"label":"K3C", "x":12.75, "y":3.5, "w":2.25},
|
||||||
{"label":"K46", "x":7.25, "y":4.5},
|
|
||||||
{"label":"K47", "x":8.25, "y":4.5},
|
{"label":"K40", "x":0, "y":4.5, "w":2.25},
|
||||||
{"label":"K48", "x":9.25, "y":4.5},
|
{"label":"K41", "x":2.25, "y":4.5},
|
||||||
{"label":"K49", "x":10.25, "y":4.5},
|
{"label":"K42", "x":3.25, "y":4.5},
|
||||||
{"label":"K4A", "x":11.25, "y":4.5},
|
{"label":"K43", "x":4.25, "y":4.5},
|
||||||
{"label":"K4B", "x":12.25, "y":4.5, "w":1.75},
|
{"label":"K44", "x":5.25, "y":4.5},
|
||||||
{"label":"K69", "x":14, "y":4.5},
|
{"label":"K45", "x":6.25, "y":4.5},
|
||||||
{"label":"K58", "x":16.25, "y":4.5},
|
{"label":"K46", "x":7.25, "y":4.5},
|
||||||
{"label":"K50", "x":0, "y":5.5, "w":1.25},
|
{"label":"K47", "x":8.25, "y":4.5},
|
||||||
{"label":"K51", "x":1.25, "y":5.5, "w":1.25},
|
{"label":"K48", "x":9.25, "y":4.5},
|
||||||
{"label":"K52", "x":2.5, "y":5.5, "w":1.25},
|
{"label":"K49", "x":10.25, "y":4.5},
|
||||||
{"label":"K53", "x":3.75, "y":5.5, "w":6.25},
|
{"label":"K4A", "x":11.25, "y":4.5},
|
||||||
{"label":"K54", "x":10, "y":5.5, "w":1.25},
|
{"label":"K4B", "x":12.25, "y":4.5, "w":1.75},
|
||||||
{"label":"K55", "x":11.25, "y":5.5, "w":1.25},
|
{"label":"K69", "x":14, "y":4.5},
|
||||||
{"label":"K56", "x":12.5, "y":5.5, "w":1.25},
|
|
||||||
{"label":"K57", "x":13.75, "y":5.5, "w":1.25},
|
{"label":"K58", "x":16.25, "y":4.5},
|
||||||
{"label":"K6A", "x":15.25, "y":5.5},
|
|
||||||
{"label":"K59", "x":16.25, "y":5.5},
|
{"label":"K50", "x":0, "y":5.5, "w":1.25},
|
||||||
{"label":"K6B", "x":17.25, "y":5.5}
|
{"label":"K51", "x":1.25, "y":5.5, "w":1.25},
|
||||||
]
|
{"label":"K52", "x":2.5, "y":5.5, "w":1.25},
|
||||||
}
|
{"label":"K53", "x":3.75, "y":5.5, "w":6.25},
|
||||||
|
{"label":"K54", "x":10, "y":5.5, "w":1.25},
|
||||||
|
{"label":"K55", "x":11.25, "y":5.5, "w":1.25},
|
||||||
|
{"label":"K56", "x":12.5, "y":5.5, "w":1.25},
|
||||||
|
{"label":"K57", "x":13.75, "y":5.5, "w":1.25},
|
||||||
|
|
||||||
|
{"label":"K6A", "x":15.25, "y":5.5},
|
||||||
|
{"label":"K59", "x":16.25, "y":5.5},
|
||||||
|
{"label":"K6B", "x":17.25, "y":5.5}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
@@ -15,64 +15,23 @@
|
|||||||
*/
|
*/
|
||||||
#include QMK_KEYBOARD_H
|
#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] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
[0] = LAYOUT( \
|
[0] = LAYOUT(
|
||||||
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_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_PSCR, KC_SLCK, KC_PAUS,
|
||||||
KC_PSCR, KC_SLCK, KC_PAUS, 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_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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, MO(1), KC_UP, KC_LCTL, \
|
|
||||||
KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \
|
|
||||||
),
|
|
||||||
[1] = LAYOUT( \
|
|
||||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
|
||||||
KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
|
|
||||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_TOGG, BL_DEC, BL_INC, BL_STEP, KC_TRNS, KC_TRNS, \
|
|
||||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_MPLY, KC_MSTP, RGB_TOG, RGB_MOD, \
|
|
||||||
RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_VAI, KC_TRNS, \
|
|
||||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, RGB_VAD, RGB_SAD \
|
|
||||||
),
|
|
||||||
|
|
||||||
|
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_INS, KC_HOME, KC_PGUP,
|
||||||
|
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_DEL, KC_END, KC_PGDN,
|
||||||
|
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, MO(1), KC_UP,
|
||||||
|
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
|
||||||
|
),
|
||||||
|
[1] = LAYOUT(
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET,
|
||||||
|
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||||
|
BL_TOGG, BL_DEC, BL_INC, BL_STEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_MPLY, KC_MSTP,
|
||||||
|
RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______,
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
|
||||||
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
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) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void led_set_user(uint8_t usb_led) {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
+30
-29
@@ -16,48 +16,49 @@
|
|||||||
#include "x11.h"
|
#include "x11.h"
|
||||||
|
|
||||||
void matrix_init_kb(void) {
|
void matrix_init_kb(void) {
|
||||||
// put your keyboard start-up code here
|
// put your keyboard start-up code here
|
||||||
// runs once when the firmware starts up
|
// runs once when the firmware starts up
|
||||||
setPinOutput(C6);
|
|
||||||
setPinOutput(E6);
|
setPinOutput(C6);
|
||||||
setPinOutput(C7);
|
setPinOutput(E6);
|
||||||
matrix_init_user();
|
setPinOutput(C7);
|
||||||
|
matrix_init_user();
|
||||||
}
|
}
|
||||||
|
|
||||||
void matrix_scan_kb(void) {
|
void matrix_scan_kb(void) {
|
||||||
// put your looping keyboard code here
|
// put your looping keyboard code here
|
||||||
// runs every cycle (a lot)
|
// runs every cycle (a lot)
|
||||||
|
|
||||||
matrix_scan_user();
|
matrix_scan_user();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||||
// put your per-action keyboard code here
|
// put your per-action keyboard code here
|
||||||
// runs for every action, just before processing by the firmware
|
// runs for every action, just before processing by the firmware
|
||||||
|
|
||||||
return process_record_user(keycode, record);
|
return process_record_user(keycode, record);
|
||||||
}
|
}
|
||||||
|
|
||||||
void led_set_kb(uint8_t usb_led) {
|
void led_set_kb(uint8_t usb_led) {
|
||||||
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
|
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
|
||||||
|
|
||||||
if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
|
if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
|
||||||
writePinLow(C6);
|
writePinLow(C6);
|
||||||
} else {
|
} else {
|
||||||
writePinHigh(C6);
|
writePinHigh(C6);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
|
if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
|
||||||
writePinLow(E6);
|
writePinLow(E6);
|
||||||
} else {
|
} else {
|
||||||
writePinHigh(E6);
|
writePinHigh(E6);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
|
if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
|
||||||
writePinLow(C7);
|
writePinLow(C7);
|
||||||
} else {
|
} else {
|
||||||
writePinHigh(C7);
|
writePinHigh(C7);
|
||||||
}
|
}
|
||||||
|
|
||||||
led_set_user(usb_led);
|
led_set_user(usb_led);
|
||||||
}
|
}
|
||||||
+13
-13
@@ -26,18 +26,18 @@
|
|||||||
* represents the switch matrix.
|
* represents the switch matrix.
|
||||||
*/
|
*/
|
||||||
#define LAYOUT( \
|
#define LAYOUT( \
|
||||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K60, K61, K62, \
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K62, K61, K60, \
|
||||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K5A, K63, K65, K67, \
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K5A, K63, K65, K67, \
|
||||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K4C, K64, K66, K68, \
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K4C, K64, K66, K68, \
|
||||||
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \
|
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \
|
||||||
K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K69, K58, \
|
K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K69, K58, \
|
||||||
K50, K51, K52, K53, K54, K55, K56, K57, K6A, K59, K6B \
|
K50, K51, K52, K53, K54, K55, K56, K57, K6A, K59, K6B \
|
||||||
) { \
|
) { \
|
||||||
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C }, \
|
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C }, \
|
||||||
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C }, \
|
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C }, \
|
||||||
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C }, \
|
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C }, \
|
||||||
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C }, \
|
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C }, \
|
||||||
{ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C }, \
|
{ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C }, \
|
||||||
{ K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K5A, KC_NO, KC_NO }, \
|
{ K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K5A, KC_NO, KC_NO }, \
|
||||||
{ K60, K61, K62, K63, K64, K65, K66, K67, K68, K69, K6A, K6B, KC_NO }, \
|
{ K60, K61, K62, K63, K64, K65, K66, K67, K68, K69, K6A, K6B, KC_NO }, \
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
@@ -65,4 +63,4 @@ AUDIO_ENABLE = no
|
|||||||
UNICODE_ENABLE = no # Unicode
|
UNICODE_ENABLE = no # Unicode
|
||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
|
|
||||||
LAYOUTS = 60_ansi
|
LAYOUTS = 60_ansi
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
+11
-11
@@ -48,16 +48,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
// #define BACKLIGHT_BREATHING
|
// #define BACKLIGHT_BREATHING
|
||||||
// #define BACKLIGHT_LEVELS 3
|
// #define BACKLIGHT_LEVELS 3
|
||||||
|
|
||||||
// #define RGB_DI_PIN E2
|
#define RGB_DI_PIN D3
|
||||||
// #ifdef RGB_DI_PIN
|
#ifdef RGB_DI_PIN
|
||||||
// #define RGBLED_NUM 64
|
#define RGBLED_NUM 64
|
||||||
// #define RGBLIGHT_HUE_STEP 8
|
#define RGBLIGHT_HUE_STEP 8
|
||||||
// #define RGBLIGHT_SAT_STEP 8
|
#define RGBLIGHT_SAT_STEP 8
|
||||||
// #define RGBLIGHT_VAL_STEP 8
|
#define RGBLIGHT_VAL_STEP 8
|
||||||
// #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
|
#define RGBLIGHT_LIMIT_VAL 25 /* The maximum brightness level */
|
||||||
// #define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
|
#define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
|
||||||
// /*== all animations enable ==*/
|
/*== all animations enable ==*/
|
||||||
// #define RGBLIGHT_ANIMATIONS
|
#define RGBLIGHT_ANIMATIONS
|
||||||
// /*== or choose animations ==*/
|
// /*== or choose animations ==*/
|
||||||
// #define RGBLIGHT_EFFECT_BREATHING
|
// #define RGBLIGHT_EFFECT_BREATHING
|
||||||
// #define RGBLIGHT_EFFECT_RAINBOW_MOOD
|
// #define RGBLIGHT_EFFECT_RAINBOW_MOOD
|
||||||
@@ -74,7 +74,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
// /*==== use exp() and sin() ====*/
|
// /*==== use exp() and sin() ====*/
|
||||||
// #define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1 to 2.7
|
// #define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1 to 2.7
|
||||||
// #define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0 to 255
|
// #define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0 to 255
|
||||||
// #endif
|
#endif
|
||||||
|
|
||||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||||
#define DEBOUNCE 5
|
#define DEBOUNCE 5
|
||||||
|
|||||||
@@ -61,17 +61,17 @@ BOOTLOADER = atmel-dfu
|
|||||||
# Build Options
|
# Build Options
|
||||||
# change yes to no to disable
|
# 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)
|
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
EXTRAKEY_ENABLE = no # 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
|
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
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
|
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
NKRO_ENABLE = no # USB Nkey Rollover
|
NKRO_ENABLE = no # USB Nkey Rollover
|
||||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
|
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
|
||||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
|
||||||
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
|
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
|
||||||
UNICODE_ENABLE = no # Unicode
|
UNICODE_ENABLE = no # Unicode
|
||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#define DIODE_DIRECTION COL2ROW
|
#define DIODE_DIRECTION COL2ROW
|
||||||
#define DEBOUNCE 5
|
#define DEBOUNCE 5
|
||||||
|
|
||||||
#define NO_BACKLIGHT_CLOCK
|
|
||||||
#define BACKLIGHT_LEVELS 1
|
#define BACKLIGHT_LEVELS 1
|
||||||
#define RGBLIGHT_ANIMATIONS
|
#define RGBLIGHT_ANIMATIONS
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
@@ -68,4 +65,4 @@ RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
|
|||||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||||
|
|
||||||
LAYOUTS = ortho_5x15
|
LAYOUTS = ortho_5x15
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#define DIODE_DIRECTION COL2ROW
|
#define DIODE_DIRECTION COL2ROW
|
||||||
#define DEBOUNCE 5
|
#define DEBOUNCE 5
|
||||||
|
|
||||||
#define NO_BACKLIGHT_CLOCK
|
|
||||||
#define BACKLIGHT_LEVELS 1
|
#define BACKLIGHT_LEVELS 1
|
||||||
#define RGBLIGHT_ANIMATIONS
|
#define RGBLIGHT_ANIMATIONS
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
#define MATRIX_ROW_PINS { A3, B8, B9, B1 }
|
#define MATRIX_ROW_PINS { A3, B8, B9, B1 }
|
||||||
#define MATRIX_COL_PINS { A7, A8, B2, B10 }
|
#define MATRIX_COL_PINS { A7, A8, B2, B10 }
|
||||||
|
|
||||||
#define NUMBER_OF_ENCODERS 1
|
|
||||||
#define ENCODERS_PAD_A { B13 }
|
#define ENCODERS_PAD_A { B13 }
|
||||||
#define ENCODERS_PAD_B { B14 }
|
#define ENCODERS_PAD_B { B14 }
|
||||||
|
|
||||||
@@ -142,7 +141,7 @@
|
|||||||
#define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */
|
#define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */
|
||||||
|
|
||||||
/* default 3V ERM vibration motor voltage and library*/
|
/* default 3V ERM vibration motor voltage and library*/
|
||||||
#if FB_ERM_LRA == 0
|
#if FB_ERM_LRA == 0
|
||||||
#define RATED_VOLTAGE 3
|
#define RATED_VOLTAGE 3
|
||||||
#define V_RMS 2.3
|
#define V_RMS 2.3
|
||||||
#define V_PEAK 3.30
|
#define V_PEAK 3.30
|
||||||
@@ -193,4 +192,3 @@
|
|||||||
#define RGB_MATRIX_KEYPRESSES
|
#define RGB_MATRIX_KEYPRESSES
|
||||||
|
|
||||||
#define SOLENOID_PIN A14
|
#define SOLENOID_PIN A14
|
||||||
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u2
|
MCU = atmega32u2
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u2
|
MCU = atmega32u2
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u2
|
MCU = atmega32u2
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u2
|
MCU = atmega32u2
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#define BACKLIGHT_BREATHING
|
#define BACKLIGHT_BREATHING
|
||||||
#define BREATHING_PERIOD 6
|
#define BREATHING_PERIOD 6
|
||||||
|
|
||||||
#define NUMBER_OF_ENCODERS 1
|
|
||||||
#define ENCODERS_PAD_A { B9 }
|
#define ENCODERS_PAD_A { B9 }
|
||||||
#define ENCODERS_PAD_B { B8 }
|
#define ENCODERS_PAD_B { B8 }
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#define MATRIX_ROW_PINS { B3, B4, A0, A2, A4, A3 }
|
#define MATRIX_ROW_PINS { B3, B4, A0, A2, A4, A3 }
|
||||||
#define DIODE_DIRECTION COL2ROW
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
|
||||||
#define NUMBER_OF_ENCODERS 1
|
|
||||||
#define ENCODERS_PAD_A { B9 }
|
#define ENCODERS_PAD_A { B9 }
|
||||||
#define ENCODERS_PAD_B { B8 }
|
#define ENCODERS_PAD_B { B8 }
|
||||||
|
|
||||||
|
|||||||
@@ -110,11 +110,11 @@ i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data,
|
|||||||
return chibios_to_qmk(status);
|
return chibios_to_qmk(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t* regaddr, uint8_t* data, uint16_t length, uint16_t timeout)
|
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)
|
||||||
{
|
{
|
||||||
i2c_address = devaddr;
|
i2c_address = devaddr;
|
||||||
i2cStart(&I2C_DRIVER, &i2cconfig);
|
i2cStart(&I2C_DRIVER, &i2cconfig);
|
||||||
msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), regaddr, 1, data, length, MS2ST(timeout));
|
msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), ®addr, 1, data, length, MS2ST(timeout));
|
||||||
return chibios_to_qmk(status);
|
return chibios_to_qmk(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
#include "tmk_core/common/eeprom.h"
|
#include "tmk_core/common/eeprom.h"
|
||||||
|
|
||||||
// HACK
|
// HACK
|
||||||
#include "keyboards/zeal60/zeal60_api.h" // Temporary hack
|
#include "keyboards/wilba_tech/via_api.h" // Temporary hack
|
||||||
#include "keyboards/zeal60/zeal60_keycodes.h" // Temporary hack
|
#include "keyboards/wilba_tech/via_keycodes.h" // Temporary hack
|
||||||
|
|
||||||
|
|
||||||
/* Artificial delay added to get media keys to work in the encoder*/
|
/* Artificial delay added to get media keys to work in the encoder*/
|
||||||
@@ -72,7 +72,7 @@ void eeprom_set_valid(bool valid)
|
|||||||
|
|
||||||
void eeprom_reset(void)
|
void eeprom_reset(void)
|
||||||
{
|
{
|
||||||
// Set the Zeal60 specific EEPROM state as invalid.
|
// Set the VIA specific EEPROM state as invalid.
|
||||||
eeprom_set_valid(false);
|
eeprom_set_valid(false);
|
||||||
// Set the TMK/QMK EEPROM state as invalid.
|
// Set the TMK/QMK EEPROM state as invalid.
|
||||||
eeconfig_disable();
|
eeconfig_disable();
|
||||||
|
|||||||
@@ -12,8 +12,8 @@
|
|||||||
#include "tmk_core/common/eeprom.h"
|
#include "tmk_core/common/eeprom.h"
|
||||||
|
|
||||||
// HACK
|
// HACK
|
||||||
#include "keyboards/zeal60/zeal60_api.h" // Temporary hack
|
#include "keyboards/wilba_tech/via_api.h" // Temporary hack
|
||||||
#include "keyboards/zeal60/zeal60_keycodes.h" // Temporary hack
|
#include "keyboards/wilba_tech/via_keycodes.h" // Temporary hack
|
||||||
|
|
||||||
|
|
||||||
backlight_config_t kb_backlight_config = {
|
backlight_config_t kb_backlight_config = {
|
||||||
@@ -162,7 +162,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
|||||||
}
|
}
|
||||||
#endif //DYNAMIC_KEYMAP_ENABLE
|
#endif //DYNAMIC_KEYMAP_ENABLE
|
||||||
|
|
||||||
return true;
|
return process_record_user(keycode, record);;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#define DIODE_DIRECTION COL2ROW
|
#define DIODE_DIRECTION COL2ROW
|
||||||
#define DEBOUNCE 5
|
#define DEBOUNCE 5
|
||||||
|
|
||||||
#define NO_BACKLIGHT_CLOCK
|
|
||||||
#define BACKLIGHT_LEVELS 1
|
#define BACKLIGHT_LEVELS 1
|
||||||
#define RGBLIGHT_ANIMATIONS
|
#define RGBLIGHT_ANIMATIONS
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ SRC = matrix.c
|
|||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ SRC = matrix.c
|
|||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ SRC = matrix.c
|
|||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ SRC += ssd1306.c
|
|||||||
# CFLAGS += -flto
|
# CFLAGS += -flto
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ SRC += matrix.c \
|
|||||||
ssd1306.c
|
ssd1306.c
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
MCU = at90usb1286
|
MCU = at90usb1286
|
||||||
#MCU = atmega32u4
|
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
|||||||
@@ -74,8 +74,6 @@ static bool matrix_is_mod = false;
|
|||||||
* This supports two cascaded hubs and four keyboards
|
* This supports two cascaded hubs and four keyboards
|
||||||
*/
|
*/
|
||||||
USB usb_host;
|
USB usb_host;
|
||||||
USBHub hub1(&usb_host);
|
|
||||||
USBHub hub2(&usb_host);
|
|
||||||
HIDBoot<HID_PROTOCOL_KEYBOARD> kbd1(&usb_host);
|
HIDBoot<HID_PROTOCOL_KEYBOARD> kbd1(&usb_host);
|
||||||
HIDBoot<HID_PROTOCOL_KEYBOARD> kbd2(&usb_host);
|
HIDBoot<HID_PROTOCOL_KEYBOARD> kbd2(&usb_host);
|
||||||
HIDBoot<HID_PROTOCOL_KEYBOARD> kbd3(&usb_host);
|
HIDBoot<HID_PROTOCOL_KEYBOARD> kbd3(&usb_host);
|
||||||
@@ -84,6 +82,8 @@ KBDReportParser kbd_parser1;
|
|||||||
KBDReportParser kbd_parser2;
|
KBDReportParser kbd_parser2;
|
||||||
KBDReportParser kbd_parser3;
|
KBDReportParser kbd_parser3;
|
||||||
KBDReportParser kbd_parser4;
|
KBDReportParser kbd_parser4;
|
||||||
|
USBHub hub1(&usb_host);
|
||||||
|
USBHub hub2(&usb_host);
|
||||||
|
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
@@ -252,10 +252,10 @@ extern "C"
|
|||||||
|
|
||||||
void led_set(uint8_t usb_led)
|
void led_set(uint8_t usb_led)
|
||||||
{
|
{
|
||||||
kbd1.SetReport(0, 0, 2, 0, 1, &usb_led);
|
if (kbd1.isReady()) kbd1.SetReport(0, 0, 2, 0, 1, &usb_led);
|
||||||
kbd2.SetReport(0, 0, 2, 0, 1, &usb_led);
|
if (kbd2.isReady()) kbd2.SetReport(0, 0, 2, 0, 1, &usb_led);
|
||||||
kbd3.SetReport(0, 0, 2, 0, 1, &usb_led);
|
if (kbd3.isReady()) kbd3.SetReport(0, 0, 2, 0, 1, &usb_led);
|
||||||
kbd4.SetReport(0, 0, 2, 0, 1, &usb_led);
|
if (kbd4.isReady()) kbd4.SetReport(0, 0, 2, 0, 1, &usb_led);
|
||||||
led_set_kb(usb_led);
|
led_set_kb(usb_led);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
#include "bootloader.h"
|
|
||||||
#ifdef PROTOCOL_LUFA
|
#ifdef PROTOCOL_LUFA
|
||||||
#include "lufa.h"
|
#include "lufa.h"
|
||||||
#include "split_util.h"
|
#include "split_util.h"
|
||||||
@@ -39,70 +38,52 @@ enum macro_keycodes {
|
|||||||
KC_SAMPLEMACRO,
|
KC_SAMPLEMACRO,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define KC______ KC_TRNS
|
|
||||||
#define KC_XXXXX KC_NO
|
|
||||||
#define KC_LOWER LOWER
|
|
||||||
#define KC_RAISE RAISE
|
|
||||||
#define KC_RST RESET
|
|
||||||
#define KC_LRST RGBRST
|
|
||||||
#define KC_LTOG RGB_TOG
|
|
||||||
#define KC_LHUI RGB_HUI
|
|
||||||
#define KC_LHUD RGB_HUD
|
|
||||||
#define KC_LSAI RGB_SAI
|
|
||||||
#define KC_LSAD RGB_SAD
|
|
||||||
#define KC_LVAI RGB_VAI
|
|
||||||
#define KC_LVAD RGB_VAD
|
|
||||||
#define KC_LMOD RGB_MOD
|
|
||||||
#define KC_CTLTB CTL_T(KC_TAB)
|
|
||||||
#define KC_GUIEI GUI_T(KC_LANG2)
|
|
||||||
#define KC_ALTKN ALT_T(KC_LANG1)
|
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
[_QWERTY] = LAYOUT_kc( \
|
[_QWERTY] = LAYOUT( \
|
||||||
//,-----------------------------------------. ,-----------------------------------------.
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,\
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_BSPC,\
|
||||||
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
CTLTB, A, S, D, F, G, H, J, K, L, SCLN, QUOT,\
|
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT,\
|
||||||
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT,\
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM,KC_DOT,KC_SLSH,KC_RSFT,\
|
||||||
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
GUIEI, LOWER, SPC, ENT, RAISE, ALTKN \
|
KC_LGUI, LOWER,KC_SPC, KC_ENT, RAISE,KC_RALT \
|
||||||
//`--------------------' `--------------------'
|
//`--------------------' `--------------------'
|
||||||
),
|
),
|
||||||
|
|
||||||
[_LOWER] = LAYOUT_kc( \
|
[_LOWER] = LAYOUT( \
|
||||||
//,-----------------------------------------. ,-----------------------------------------.
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC,\
|
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_BSPC,\
|
||||||
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
CTLTB, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, XXXXX,\
|
KC_LCTL, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT,KC_DOWN,KC_UP, KC_RIGHT,KC_NO,KC_NO,\
|
||||||
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
LSFT, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, XXXXX,\
|
KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
GUIEI, LOWER, SPC, ENT, RAISE, ALTKN \
|
KC_LGUI, LOWER,KC_SPC, KC_ENT, RAISE,KC_RALT \
|
||||||
//`--------------------' `--------------------'
|
//`--------------------' `--------------------'
|
||||||
),
|
),
|
||||||
|
|
||||||
[_RAISE] = LAYOUT_kc( \
|
[_RAISE] = LAYOUT( \
|
||||||
//,-----------------------------------------. ,-----------------------------------------.
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
ESC, EXLM, AT, HASH, DLR, PERC, CIRC, AMPR, ASTR, LPRN, RPRN, BSPC,\
|
KC_ESC,KC_EXLM,KC_AT,KC_HASH,KC_DLR,KC_PERC, KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,KC_BSPC,\
|
||||||
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
CTLTB, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, MINS, EQL, LCBR, RCBR, PIPE, GRV,\
|
KC_LCTL, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MINS,KC_EQL,KC_LCBR,KC_RCBR,KC_PIPE,KC_GRV,\
|
||||||
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
LSFT, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, UNDS, PLUS, LBRC, RBRC, BSLS, TILD,\
|
KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_UNDS,KC_PLUS,KC_LBRC,KC_RBRC,KC_BSLS,KC_TILD,\
|
||||||
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
GUIEI, LOWER, SPC, ENT, RAISE, ALTKN \
|
KC_LGUI, LOWER,KC_SPC, KC_ENT, RAISE,KC_RALT \
|
||||||
//`--------------------' `--------------------'
|
//`--------------------' `--------------------'
|
||||||
),
|
),
|
||||||
|
|
||||||
[_ADJUST] = LAYOUT_kc( \
|
[_ADJUST] = LAYOUT( \
|
||||||
//,-----------------------------------------. ,-----------------------------------------.
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
RST, LRST, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
|
RESET,RGBRST, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
LTOG, LHUI, LSAI, LVAI, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
|
RGB_TOG,RGB_HUI,RGB_SAI,RGB_VAI,KC_NO,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
LMOD, LHUD, LSAD, LVAD, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
|
RGB_MOD,RGB_HUD,RGB_SAD,RGB_VAD,KC_NO,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
|
||||||
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
GUIEI, LOWER, SPC, ENT, RAISE, ALTKN \
|
KC_LGUI, LOWER,KC_SPC, KC_ENT, RAISE,KC_RALT \
|
||||||
//`--------------------' `--------------------'
|
//`--------------------' `--------------------'
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
@@ -157,7 +138,7 @@ void matrix_render_user(struct CharacterMatrix *matrix) {
|
|||||||
// If you want to change the display of OLED, you need to change here
|
// If you want to change the display of OLED, you need to change here
|
||||||
matrix_write_ln(matrix, read_layer_state());
|
matrix_write_ln(matrix, read_layer_state());
|
||||||
matrix_write_ln(matrix, read_keylog());
|
matrix_write_ln(matrix, read_keylog());
|
||||||
matrix_write_ln(matrix, read_keylogs());
|
//matrix_write_ln(matrix, read_keylogs());
|
||||||
//matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
|
//matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
|
||||||
//matrix_write_ln(matrix, read_host_led_state());
|
//matrix_write_ln(matrix, read_host_led_state());
|
||||||
//matrix_write_ln(matrix, read_timelog());
|
//matrix_write_ln(matrix, read_timelog());
|
||||||
@@ -195,7 +176,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
persistent_default_layer_set(1UL<<_QWERTY);
|
persistent_default_layer_set(1UL<<_QWERTY);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
break;
|
|
||||||
case LOWER:
|
case LOWER:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
layer_on(_LOWER);
|
layer_on(_LOWER);
|
||||||
@@ -205,7 +185,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
break;
|
|
||||||
case RAISE:
|
case RAISE:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
layer_on(_RAISE);
|
layer_on(_RAISE);
|
||||||
@@ -215,7 +194,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
break;
|
|
||||||
case ADJUST:
|
case ADJUST:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
layer_on(_ADJUST);
|
layer_on(_ADJUST);
|
||||||
@@ -223,7 +201,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
layer_off(_ADJUST);
|
layer_off(_ADJUST);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
break;
|
|
||||||
case RGB_MOD:
|
case RGB_MOD:
|
||||||
#ifdef RGBLIGHT_ENABLE
|
#ifdef RGBLIGHT_ENABLE
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
@@ -233,7 +210,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
break;
|
|
||||||
case RGBRST:
|
case RGBRST:
|
||||||
#ifdef RGBLIGHT_ENABLE
|
#ifdef RGBLIGHT_ENABLE
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
|
|||||||
@@ -1,25 +1,4 @@
|
|||||||
|
|
||||||
# Build Options
|
|
||||||
# change to "no" to disable the options, or define them in the Makefile in
|
|
||||||
# the appropriate keymap folder that will get included automatically
|
|
||||||
#
|
|
||||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
|
||||||
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
|
|
||||||
EXTRAKEY_ENABLE = no # Audio control and System control(+450)
|
|
||||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
|
||||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
|
||||||
NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
|
||||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
|
||||||
MIDI_ENABLE = no # MIDI controls
|
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
|
||||||
UNICODE_ENABLE = no # Unicode
|
|
||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
|
||||||
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
|
|
||||||
SWAP_HANDS_ENABLE = no # Enable one-hand typing
|
|
||||||
|
|
||||||
# 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 you want to change the display of OLED, you need to change here
|
# If you want to change the display of OLED, you need to change here
|
||||||
SRC += ./lib/glcdfont.c \
|
SRC += ./lib/glcdfont.c \
|
||||||
./lib/rgb_state_reader.c \
|
./lib/rgb_state_reader.c \
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
/* Select hand configuration */
|
/* Select hand configuration */
|
||||||
|
|
||||||
// #define MASTER_LEFT
|
// #define MASTER_LEFT
|
||||||
@@ -36,52 +35,31 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
// #define TAPPING_TERM 100
|
// #define TAPPING_TERM 100
|
||||||
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
#ifdef RGBLIGHT_ENABLE
|
||||||
# undef RGBLED_NUM
|
# undef RGBLED_NUM
|
||||||
# define RGBLED_NUM 27
|
# define RGBLED_NUM 27
|
||||||
|
|
||||||
# define RGBLIGHT_HUE_STEP 8
|
# define RGBLIGHT_HUE_STEP 8
|
||||||
# define RGBLIGHT_SAT_STEP 8
|
# define RGBLIGHT_SAT_STEP 8
|
||||||
# define RGBLIGHT_VAL_STEP 8
|
# define RGBLIGHT_VAL_STEP 5
|
||||||
# define RGBLIGHT_LIMIT_VAL 100
|
# define RGBLIGHT_LIMIT_VAL 150
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RGB_MATRIX_ENABLE
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
# define RGB_MATRIX_KEYPRESSES // reacts to keypresses
|
# define RGB_MATRIX_KEYPRESSES // reacts to keypresses
|
||||||
# define RGB_DISABLE_WHEN_USB_SUSPENDED true // turn off effects when suspended
|
// # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
|
||||||
# define RGB_MATRIX_FRAMEBUFFER_EFFECTS
|
// # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
|
||||||
|
# define RGB_DISABLE_WHEN_USB_SUSPENDED true // turn off effects when suspended
|
||||||
// # define DISABLE_RGB_MATRIX_ALPHAS_MODS
|
// # define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
|
||||||
# define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN
|
// # define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
|
||||||
# define DISABLE_RGB_MATRIX_BREATHING
|
# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
|
||||||
# define DISABLE_RGB_MATRIX_CYCLE_ALL
|
# define RGB_MATRIX_HUE_STEP 8
|
||||||
# define DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
|
# define RGB_MATRIX_SAT_STEP 8
|
||||||
# define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN
|
# define RGB_MATRIX_VAL_STEP 5
|
||||||
// # define DISABLE_RGB_MATRIX_CYCLE_OUT_IN
|
# define RGB_MATRIX_SPD_STEP 10
|
||||||
// # define DISABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
|
|
||||||
# define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
|
|
||||||
# define DISABLE_RGB_MATRIX_DUAL_BEACON
|
|
||||||
# define DISABLE_RGB_MATRIX_RAINBOW_BEACON
|
|
||||||
# define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS
|
|
||||||
// # define DISABLE_RGB_MATRIX_RAINDROPS
|
|
||||||
// # define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
|
|
||||||
// # define DISABLE_RGB_MATRIX_TYPING_HEATMAP
|
|
||||||
// # define DISABLE_RGB_MATRIX_DIGITAL_RAIN
|
|
||||||
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE
|
|
||||||
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
|
|
||||||
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
|
|
||||||
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
|
|
||||||
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
|
|
||||||
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
|
|
||||||
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
|
|
||||||
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
|
|
||||||
# define DISABLE_RGB_MATRIX_SPLASH
|
|
||||||
// # define DISABLE_RGB_MATRIX_MULTISPLASH
|
|
||||||
# define DISABLE_RGB_MATRIX_SOLID_SPLASH
|
|
||||||
# define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef AUDIO_ENABLE
|
#ifdef AUDIO_ENABLE
|
||||||
# define B6_AUDIO
|
# define B6_AUDIO
|
||||||
// #define NO_MUSIC_MODE
|
// #define NO_MUSIC_MODE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -92,4 +70,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
// #define OLED_FONT_WIDTH 5
|
// #define OLED_FONT_WIDTH 5
|
||||||
// #define OLED_FONT_HEIGHT 7
|
// #define OLED_FONT_HEIGHT 7
|
||||||
|
|
||||||
|
#define OLED_DISABLE_TIMEOUT
|
||||||
#define TAPPING_TERM_PER_KEY
|
#define TAPPING_TERM_PER_KEY
|
||||||
@@ -2,17 +2,16 @@
|
|||||||
#include "drashna.h"
|
#include "drashna.h"
|
||||||
|
|
||||||
extern keymap_config_t keymap_config;
|
extern keymap_config_t keymap_config;
|
||||||
extern uint8_t is_master;
|
extern uint8_t is_master;
|
||||||
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
#ifdef RGBLIGHT_ENABLE
|
||||||
//Following line allows macro to read current RGB settings
|
// Following line allows macro to read current RGB settings
|
||||||
extern rgblight_config_t rgblight_config;
|
extern rgblight_config_t rgblight_config;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum crkbd_keycodes {
|
enum crkbd_keycodes { RGBRST = NEW_SAFE_RANGE };
|
||||||
RGBRST = NEW_SAFE_RANGE
|
|
||||||
};
|
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
#define LAYOUT_crkbd_base( \
|
#define LAYOUT_crkbd_base( \
|
||||||
K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
|
K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
|
||||||
K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
|
K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
|
||||||
@@ -103,60 +102,30 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
_______, KC_NUKE, _______, _______, TG_MODS, _______
|
_______, KC_NUKE, _______, _______, TG_MODS, _______
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
// clang-format on
|
||||||
void matrix_init_keymap(void) {
|
|
||||||
#ifndef CONVERT_TO_PROTON_C
|
|
||||||
setPinOutput(D5);
|
|
||||||
writePinHigh(D5);
|
|
||||||
|
|
||||||
setPinOutput(B0);
|
|
||||||
writePinHigh(B0);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef OLED_DRIVER_ENABLE
|
#ifdef OLED_DRIVER_ENABLE
|
||||||
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
|
oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_270; }
|
||||||
if (is_master) {
|
uint16_t oled_timer;
|
||||||
return OLED_ROTATION_270;
|
|
||||||
} else {
|
|
||||||
return rotation;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void render_crkbd_logo(void) {
|
char keylog_str[5] = {};
|
||||||
static const char PROGMEM crkbd_logo[] = {
|
uint8_t keylogs_str_idx = 0;
|
||||||
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
|
uint16_t log_timer = 0;
|
||||||
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
|
|
||||||
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4,
|
|
||||||
0};
|
|
||||||
oled_write_P(crkbd_logo, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define KEYLOG_LEN (int)(32 / OLED_FONT_WIDTH)
|
const char code_to_name[60] = {' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\', '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
|
||||||
char keylog_str[KEYLOG_LEN] = {};
|
|
||||||
uint8_t keylogs_str_idx = 0;
|
|
||||||
uint16_t log_timer = 0;
|
|
||||||
|
|
||||||
const char code_to_name[60] = {
|
|
||||||
' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
|
|
||||||
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
|
|
||||||
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
|
||||||
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
|
|
||||||
'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\',
|
|
||||||
'#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
|
|
||||||
|
|
||||||
void add_keylog(uint16_t keycode) {
|
void add_keylog(uint16_t keycode) {
|
||||||
if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) ||
|
if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
|
||||||
(keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { keycode = keycode & 0xFF; }
|
keycode = keycode & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
for (uint8_t i = KEYLOG_LEN - 1; i > 0; i--) {
|
for (uint8_t i = 4; i > 0; i--) {
|
||||||
keylog_str[i] = keylog_str[i - 1];
|
keylog_str[i] = keylog_str[i - 1];
|
||||||
}
|
}
|
||||||
if (keycode < 60) {
|
if (keycode < 60) {
|
||||||
keylog_str[0] = code_to_name[keycode];
|
keylog_str[0] = code_to_name[keycode];
|
||||||
}
|
}
|
||||||
keylog_str[KEYLOG_LEN] = 0;
|
keylog_str[5] = 0;
|
||||||
|
|
||||||
log_timer = timer_read();
|
log_timer = timer_read();
|
||||||
}
|
}
|
||||||
@@ -167,94 +136,153 @@ void update_log(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
|
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
|
||||||
if (record->event.pressed) { add_keylog(keycode); }
|
if (record->event.pressed) {
|
||||||
|
add_keylog(keycode);
|
||||||
|
oled_timer = timer_read();
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void render_status(void) {
|
void render_rgb_status(void) {
|
||||||
|
oled_write_ln("RGB:", false);
|
||||||
|
static char temp[20] = {0};
|
||||||
|
snprintf(temp, sizeof(temp) + 1, "M:%3dH:%3dS:%3dV:%3d", rgb_matrix_config.mode, rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v);
|
||||||
|
oled_write(temp, false);
|
||||||
|
}
|
||||||
|
|
||||||
oled_write_P(PSTR("Layer"), false);
|
void render_status_main(void) {
|
||||||
switch (biton32(layer_state)) {
|
/* Show Keyboard Layout */
|
||||||
case 0:
|
oled_write("Lyout", false);
|
||||||
oled_write_P(PSTR("Base "), false);
|
|
||||||
break;
|
|
||||||
case _RAISE:
|
|
||||||
oled_write_P(PSTR("Raise"), false);
|
|
||||||
break;
|
|
||||||
case _LOWER:
|
|
||||||
oled_write_P(PSTR("Lower"), false);
|
|
||||||
break;
|
|
||||||
case _ADJUST:
|
|
||||||
oled_write_P(PSTR("Adjst"), false);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
oled_write_P(PSTR("Unkn "), false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
oled_write_P(PSTR("Lyout"), false);
|
|
||||||
switch (biton32(default_layer_state)) {
|
switch (biton32(default_layer_state)) {
|
||||||
case _QWERTY:
|
case _QWERTY:
|
||||||
oled_write_P(PSTR("QWRTY"), false);
|
oled_write(" QRTY", false);
|
||||||
break;
|
break;
|
||||||
case _COLEMAK:
|
case _COLEMAK:
|
||||||
oled_write_P(PSTR("COLMK"), false);
|
oled_write(" COLE", false);
|
||||||
break;
|
break;
|
||||||
case _DVORAK:
|
case _DVORAK:
|
||||||
oled_write_P(PSTR("DVRAK"), false);
|
oled_write(" DVRK", false);
|
||||||
break;
|
break;
|
||||||
case _WORKMAN:
|
case _WORKMAN:
|
||||||
oled_write_P(PSTR("WRKMN"), false);
|
oled_write(" WKMN", false);
|
||||||
break;
|
break;
|
||||||
case _NORMAN:
|
case _NORMAN:
|
||||||
oled_write_P(PSTR("NORMN"), false);
|
oled_write(" NORM", false);
|
||||||
break;
|
break;
|
||||||
case _MALTRON:
|
case _MALTRON:
|
||||||
oled_write_P(PSTR("MLTRN"), false);
|
oled_write(" MLTN", false);
|
||||||
break;
|
break;
|
||||||
case _EUCALYN:
|
case _EUCALYN:
|
||||||
oled_write_P(PSTR("ECLYN"), false);
|
oled_write(" ECLN", false);
|
||||||
break;
|
break;
|
||||||
case _CARPLAX:
|
case _CARPLAX:
|
||||||
oled_write_P(PSTR("CRPLX"), false);
|
oled_write(" CRPX", false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t modifiers = get_mods();
|
/* Show Lock Status (only work on master side) */
|
||||||
uint8_t one_shot = get_oneshot_mods();
|
|
||||||
|
|
||||||
oled_write_P(PSTR("Mods:"), false);
|
|
||||||
oled_write_P( (modifiers & MOD_MASK_SHIFT || one_shot & MOD_MASK_SHIFT) ? PSTR(" SFT ") : PSTR(" "), false);
|
|
||||||
oled_write_P( (modifiers & MOD_MASK_CTRL || one_shot & MOD_MASK_CTRL ) ? PSTR(" CTL ") : PSTR(" "), false);
|
|
||||||
oled_write_P( (modifiers & MOD_MASK_ALT || one_shot & MOD_MASK_ALT ) ? PSTR(" ALT ") : PSTR(" "), false);
|
|
||||||
oled_write_P( (modifiers & MOD_MASK_GUI || one_shot & MOD_MASK_GUI ) ? PSTR(" GUI ") : PSTR(" "), false);
|
|
||||||
|
|
||||||
|
|
||||||
oled_write_P(PSTR("BTMGK"), false);
|
|
||||||
|
|
||||||
if (keymap_config.swap_lalt_lgui) {
|
|
||||||
oled_write_P(PSTR(" Mac "), false);
|
|
||||||
} else {
|
|
||||||
oled_write_P(PSTR(" Win "), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t led_usb_state = host_keyboard_leds();
|
uint8_t led_usb_state = host_keyboard_leds();
|
||||||
oled_write_P(PSTR("Lock:"), false);
|
oled_write("Lock:", false);
|
||||||
oled_write_P(led_usb_state & (1<<USB_LED_NUM_LOCK) ? PSTR(" NUM ") : PSTR(" "), false);
|
oled_write(" ", false);
|
||||||
oled_write_P(led_usb_state & (1<<USB_LED_CAPS_LOCK) ? PSTR(" CAPS") : PSTR(" "), false);
|
oled_write_ln("NUM", led_usb_state & (1 << USB_LED_NUM_LOCK));
|
||||||
oled_write_P(led_usb_state & (1<<USB_LED_SCROLL_LOCK) ? PSTR(" SCRL") : PSTR(" "), false);
|
oled_write(" ", false);
|
||||||
|
oled_write("CAPS", led_usb_state & (1 << USB_LED_CAPS_LOCK));
|
||||||
|
oled_write(" ", false);
|
||||||
|
oled_write("SCRL", led_usb_state & (1 << USB_LED_SCROLL_LOCK));
|
||||||
|
|
||||||
|
/* Show Alt-Gui Swap options */
|
||||||
|
oled_write("BTMGK", false);
|
||||||
|
oled_write(" ", false);
|
||||||
|
oled_write_ln("Win", !keymap_config.swap_lalt_lgui);
|
||||||
|
oled_write(" ", false);
|
||||||
|
oled_write_ln("Mac", keymap_config.swap_lalt_lgui);
|
||||||
|
|
||||||
|
# if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
|
||||||
|
/* Show RGB Options */
|
||||||
|
render_rgb_status();
|
||||||
|
# endif
|
||||||
|
|
||||||
oled_write(keylog_str, false);
|
oled_write(keylog_str, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void render_status_secondary(void) {
|
||||||
|
/* Show Keyboard Layout */
|
||||||
|
oled_write("Lyout", false);
|
||||||
|
switch (biton32(default_layer_state)) {
|
||||||
|
case _QWERTY:
|
||||||
|
oled_write(" QRTY", false);
|
||||||
|
break;
|
||||||
|
case _COLEMAK:
|
||||||
|
oled_write(" COLE", false);
|
||||||
|
break;
|
||||||
|
case _DVORAK:
|
||||||
|
oled_write(" DVRK", false);
|
||||||
|
break;
|
||||||
|
case _WORKMAN:
|
||||||
|
oled_write(" WKMN", false);
|
||||||
|
break;
|
||||||
|
case _NORMAN:
|
||||||
|
oled_write(" NORM", false);
|
||||||
|
break;
|
||||||
|
case _MALTRON:
|
||||||
|
oled_write(" MLTN", false);
|
||||||
|
break;
|
||||||
|
case _EUCALYN:
|
||||||
|
oled_write(" ECLN", false);
|
||||||
|
break;
|
||||||
|
case _CARPLAX:
|
||||||
|
oled_write(" CRPX", false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show Activate layer */
|
||||||
|
oled_write("Layer", false);
|
||||||
|
switch (biton32(layer_state)) {
|
||||||
|
case _RAISE:
|
||||||
|
oled_write("Raise", false);
|
||||||
|
break;
|
||||||
|
case _LOWER:
|
||||||
|
oled_write("Lower", false);
|
||||||
|
break;
|
||||||
|
case _ADJUST:
|
||||||
|
oled_write("Adjst", false);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
oled_write("Dflt ", false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show Mod */
|
||||||
|
uint8_t modifiers = get_mods() | get_oneshot_mods();
|
||||||
|
|
||||||
|
oled_write("Mods:", false);
|
||||||
|
oled_write(" ", false);
|
||||||
|
oled_write_ln("SFT", (modifiers & MOD_MASK_SHIFT));
|
||||||
|
oled_write(" ", false);
|
||||||
|
oled_write_ln("CTL", (modifiers & MOD_MASK_CTRL));
|
||||||
|
oled_write(" ", false);
|
||||||
|
oled_write_ln("ALT", (modifiers & MOD_MASK_ALT));
|
||||||
|
oled_write(" ", false);
|
||||||
|
oled_write_ln("GUI", (modifiers & MOD_MASK_GUI));
|
||||||
|
|
||||||
|
# if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
|
||||||
|
render_rgb_status();
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Show logged Keys */
|
||||||
|
oled_write(keylog_str, false);
|
||||||
|
}
|
||||||
|
|
||||||
void oled_task_user(void) {
|
void oled_task_user(void) {
|
||||||
|
if (timer_elapsed(oled_timer) > 60000) {
|
||||||
|
oled_off();
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (is_master) {
|
if (is_master) {
|
||||||
render_status(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
|
render_status_main(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
|
||||||
} else {
|
} else {
|
||||||
render_crkbd_logo();
|
render_status_secondary();
|
||||||
oled_scroll_left(); // Turns on scrolling
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,57 +300,82 @@ uint16_t get_tapping_term(uint16_t keycode) {
|
|||||||
|
|
||||||
#ifdef RGB_MATRIX_ENABLE
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
|
|
||||||
|
static bool is_suspended;
|
||||||
|
static bool rgb_matrix_enabled;
|
||||||
|
|
||||||
void suspend_power_down_keymap(void) {
|
void suspend_power_down_keymap(void) {
|
||||||
rgb_matrix_set_suspend_state(true);
|
rgb_matrix_set_suspend_state(true);
|
||||||
|
if (!is_suspended) {
|
||||||
|
is_suspended = true;
|
||||||
|
rgb_matrix_enabled = (bool)rgb_matrix_config.enable;
|
||||||
|
rgb_matrix_disable_noeeprom();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void suspend_wakeup_init_keymap(void) {
|
void suspend_wakeup_init_keymap(void) {
|
||||||
rgb_matrix_set_suspend_state(false);
|
rgb_matrix_set_suspend_state(false);
|
||||||
|
is_suspended = false;
|
||||||
|
if (rgb_matrix_enabled) {
|
||||||
|
rgb_matrix_enable_noeeprom();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void rgb_matrix_indicators_user(void) {
|
void rgb_matrix_indicators_user(void) {
|
||||||
if ( userspace_config.rgb_layer_change &&
|
if (userspace_config.rgb_layer_change &&
|
||||||
#ifdef RGB_DISABLE_WHEN_USB_SUSPENDED
|
# ifdef RGB_DISABLE_WHEN_USB_SUSPENDED
|
||||||
!g_suspend_state &&
|
!g_suspend_state &&
|
||||||
#endif
|
# endif
|
||||||
#if defined(RGBLIGHT_ENABLE)
|
# if defined(RGBLIGHT_ENABLE)
|
||||||
(!rgblight_config.enable && rgb_matrix_config.enable)
|
(!rgblight_config.enable && rgb_matrix_config.enable)
|
||||||
#else
|
# else
|
||||||
rgb_matrix_config.enable
|
rgb_matrix_config.enable
|
||||||
#endif
|
# endif
|
||||||
) {
|
) {
|
||||||
switch (biton32(layer_state)) {
|
switch (biton32(layer_state)) {
|
||||||
case _MODS:
|
|
||||||
rgb_matrix_layer_helper(0xFF, 0xFF, 0x00, LED_FLAG_UNDERGLOW); break;
|
|
||||||
case _GAMEPAD:
|
case _GAMEPAD:
|
||||||
rgb_matrix_layer_helper(0xFF, 0x80, 0x00, LED_FLAG_UNDERGLOW); break;
|
rgb_matrix_layer_helper(HSV_ORANGE, 1, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
|
||||||
|
break;
|
||||||
case _DIABLO:
|
case _DIABLO:
|
||||||
rgb_matrix_layer_helper(0xFF, 0x00, 0x00, LED_FLAG_UNDERGLOW); break;
|
rgb_matrix_layer_helper(HSV_RED, 1, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
|
||||||
|
break;
|
||||||
case _RAISE:
|
case _RAISE:
|
||||||
rgb_matrix_layer_helper(0xFF, 0xFF, 0x00, LED_FLAG_UNDERGLOW); break;
|
rgb_matrix_layer_helper(HSV_YELLOW, 1, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
|
||||||
|
break;
|
||||||
case _LOWER:
|
case _LOWER:
|
||||||
rgb_matrix_layer_helper(0x00, 0xFF, 0x00, LED_FLAG_UNDERGLOW); break;
|
rgb_matrix_layer_helper(HSV_GREEN, 1, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
|
||||||
|
break;
|
||||||
case _ADJUST:
|
case _ADJUST:
|
||||||
rgb_matrix_layer_helper(0xFF, 0x00, 0x00, LED_FLAG_UNDERGLOW); break;
|
rgb_matrix_layer_helper(HSV_RED, 1, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
|
||||||
default:
|
break;
|
||||||
|
default: {
|
||||||
|
bool mods_enabled = IS_LAYER_ON(_MODS);
|
||||||
switch (biton32(default_layer_state)) {
|
switch (biton32(default_layer_state)) {
|
||||||
case _QWERTY:
|
case _QWERTY:
|
||||||
rgb_matrix_layer_helper(0x00, 0xFF, 0xFF, LED_FLAG_UNDERGLOW); break;
|
rgb_matrix_layer_helper(HSV_CYAN, mods_enabled, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
|
||||||
|
break;
|
||||||
case _COLEMAK:
|
case _COLEMAK:
|
||||||
rgb_matrix_layer_helper(0xFF, 0x00, 0xFF, LED_FLAG_UNDERGLOW); break;
|
rgb_matrix_layer_helper(HSV_MAGENTA, mods_enabled, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
|
||||||
|
break;
|
||||||
case _DVORAK:
|
case _DVORAK:
|
||||||
rgb_matrix_layer_helper(0x00, 0xFF, 0x00, LED_FLAG_UNDERGLOW); break;
|
rgb_matrix_layer_helper(HSV_SPRINGGREEN, mods_enabled, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
|
||||||
|
break;
|
||||||
case _WORKMAN:
|
case _WORKMAN:
|
||||||
rgb_matrix_layer_helper(0xD9, 0xA5, 0x21, LED_FLAG_UNDERGLOW); break;
|
rgb_matrix_layer_helper(HSV_GOLDENROD, mods_enabled, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
|
||||||
|
break;
|
||||||
case _NORMAN:
|
case _NORMAN:
|
||||||
rgb_matrix_layer_helper(0xFF, 0x7C, 0x4D, LED_FLAG_UNDERGLOW); break;
|
rgb_matrix_layer_helper(HSV_CORAL, mods_enabled, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
|
||||||
|
break;
|
||||||
case _MALTRON:
|
case _MALTRON:
|
||||||
rgb_matrix_layer_helper(0xFF, 0xFF, 0x00, LED_FLAG_UNDERGLOW); break;
|
rgb_matrix_layer_helper(HSV_YELLOW, mods_enabled, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
|
||||||
|
break;
|
||||||
case _EUCALYN:
|
case _EUCALYN:
|
||||||
rgb_matrix_layer_helper(0xFF, 0x80, 0xBF, LED_FLAG_UNDERGLOW); break;
|
rgb_matrix_layer_helper(HSV_PINK, mods_enabled, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
|
||||||
|
break;
|
||||||
case _CARPLAX:
|
case _CARPLAX:
|
||||||
rgb_matrix_layer_helper(0x00, 0x00, 0xFF, LED_FLAG_UNDERGLOW); break;
|
rgb_matrix_layer_helper(HSV_BLUE, mods_enabled, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
|
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
|
||||||
SWAP_HANDS_ENABLE = no # Enable one-hand typing
|
SWAP_HANDS_ENABLE = no # Enable one-hand typing
|
||||||
RGBLIGHT_STARTUP_ANIMATION = yes
|
|
||||||
RGB_MATRIX_ENABLE = WS2812
|
RGB_MATRIX_ENABLE = WS2812
|
||||||
|
|
||||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
@@ -25,7 +24,3 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
|||||||
BOOTLOADER = qmk-dfu
|
BOOTLOADER = qmk-dfu
|
||||||
|
|
||||||
OLED_DRIVER_ENABLE = yes
|
OLED_DRIVER_ENABLE = yes
|
||||||
|
|
||||||
ifneq ($(strip $(OLED_DRIVER_ENABLE)), yes)
|
|
||||||
RGB_MATRIX_SPLIT_RIGHT=yes
|
|
||||||
endif
|
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
This is the c configuration file for the keymap
|
||||||
|
|
||||||
|
Copyright 2012 Jun Wako <[email protected]>
|
||||||
|
Copyright 2015 Jack Humbert
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
//#define USE_MATRIX_I2C
|
||||||
|
|
||||||
|
/* Select hand configuration */
|
||||||
|
|
||||||
|
#define MASTER_LEFT
|
||||||
|
// #define MASTER_RIGHT
|
||||||
|
// #define EE_HANDS
|
||||||
|
|
||||||
|
#define SSD1306OLED
|
||||||
|
|
||||||
|
#define USE_SERIAL_PD2
|
||||||
|
|
||||||
|
#define TAPPING_FORCE_HOLD
|
||||||
|
#define TAPPING_TERM 100
|
||||||
|
|
||||||
|
#undef RGBLED_NUM
|
||||||
|
#define RGBLIGHT_ANIMATIONS
|
||||||
|
#define RGBLED_NUM 27
|
||||||
|
#define RGBLIGHT_LIMIT_VAL 120
|
||||||
|
#define RGBLIGHT_HUE_STEP 10
|
||||||
|
#define RGBLIGHT_SAT_STEP 17
|
||||||
|
#define RGBLIGHT_VAL_STEP 17
|
||||||
@@ -0,0 +1,241 @@
|
|||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
#ifdef PROTOCOL_LUFA
|
||||||
|
#include "lufa.h"
|
||||||
|
#include "split_util.h"
|
||||||
|
#endif
|
||||||
|
#ifdef SSD1306OLED
|
||||||
|
#include "ssd1306.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern keymap_config_t keymap_config;
|
||||||
|
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
//Following line allows macro to read current RGB settings
|
||||||
|
extern rgblight_config_t rgblight_config;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern uint8_t is_master;
|
||||||
|
|
||||||
|
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
||||||
|
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
||||||
|
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
||||||
|
// entirely and just use numbers.
|
||||||
|
#define _QWERTY 0
|
||||||
|
#define _LOWER 1
|
||||||
|
#define _RAISE 2
|
||||||
|
#define _ADJUST 3
|
||||||
|
|
||||||
|
enum custom_keycodes {
|
||||||
|
QWERTY = SAFE_RANGE,
|
||||||
|
LOWER,
|
||||||
|
RAISE,
|
||||||
|
ADJUST,
|
||||||
|
BACKLIT,
|
||||||
|
RGBRST
|
||||||
|
};
|
||||||
|
|
||||||
|
enum macro_keycodes {
|
||||||
|
KC_SAMPLEMACRO,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define KC______ KC_TRNS
|
||||||
|
#define KC_XXXXX KC_NO
|
||||||
|
#define KC_LOWER LOWER
|
||||||
|
#define KC_RAISE RAISE
|
||||||
|
#define KC_RST RESET
|
||||||
|
#define KC_LRST RGBRST
|
||||||
|
#define KC_LTOG RGB_TOG
|
||||||
|
#define KC_LHUI RGB_HUI
|
||||||
|
#define KC_LHUD RGB_HUD
|
||||||
|
#define KC_LSAI RGB_SAI
|
||||||
|
#define KC_LSAD RGB_SAD
|
||||||
|
#define KC_LVAI RGB_VAI
|
||||||
|
#define KC_LVAD RGB_VAD
|
||||||
|
#define KC_LMOD RGB_MOD
|
||||||
|
#define KC_GUIEI GUI_T(KC_LANG2)
|
||||||
|
#define KC_ALTKN ALT_T(KC_LANG1)
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[_QWERTY] = LAYOUT_kc( \
|
||||||
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
|
TAB, Q, W, E, R, T, Y, U, I, O, P, BSPC,\
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
LCTL, A, S, D, F, G, H, J, K, L, SCLN, QUOT,\
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ESC,\
|
||||||
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
|
GUIEI, LOWER, SPC, ENT, RAISE, ALTKN \
|
||||||
|
//`--------------------' `--------------------'
|
||||||
|
),
|
||||||
|
|
||||||
|
[_LOWER] = LAYOUT_kc( \
|
||||||
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
|
TAB, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC,\
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
LCTL, F1, F2, F3, F4, F5, LEFT, DOWN, UP, RIGHT, XXXXX, XXXXX,\
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
LSFT, F6, F7, F8, F9, F10, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
|
||||||
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
|
GUIEI, LOWER, SPC, ENT, RAISE, ALTKN \
|
||||||
|
//`--------------------' `--------------------'
|
||||||
|
),
|
||||||
|
|
||||||
|
[_RAISE] = LAYOUT_kc( \
|
||||||
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
|
TAB, EXLM, AT, HASH, DLR, PERC, CIRC, AMPR, ASTR, LPRN, RPRN, BSPC,\
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
LCTL, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, MINS, EQL, LCBR, RCBR, PIPE, GRV,\
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
LSFT, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, UNDS, PLUS, LBRC, RBRC, BSLS, TILD,\
|
||||||
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
|
GUIEI, LOWER, SPC, ENT, RAISE, ALTKN \
|
||||||
|
//`--------------------' `--------------------'
|
||||||
|
),
|
||||||
|
|
||||||
|
[_ADJUST] = LAYOUT_kc( \
|
||||||
|
//,-----------------------------------------. ,-----------------------------------------.
|
||||||
|
RST, LRST, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
LTOG, LHUI, LSAI, LVAI, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
|
||||||
|
//|------+------+------+------+------+------| |------+------+------+------+------+------|
|
||||||
|
LMOD, LHUD, LSAD, LVAD, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
|
||||||
|
//|------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
||||||
|
GUIEI, LOWER, SPC, ENT, RAISE, ALTKN \
|
||||||
|
//`--------------------' `--------------------'
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
int RGB_current_mode;
|
||||||
|
|
||||||
|
void persistent_default_layer_set(uint16_t default_layer) {
|
||||||
|
eeconfig_update_default_layer(default_layer);
|
||||||
|
default_layer_set(default_layer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setting ADJUST layer RGB back to default
|
||||||
|
void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
|
||||||
|
if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
|
||||||
|
layer_on(layer3);
|
||||||
|
} else {
|
||||||
|
layer_off(layer3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
RGB_current_mode = rgblight_config.mode;
|
||||||
|
#endif
|
||||||
|
//SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
|
||||||
|
#ifdef SSD1306OLED
|
||||||
|
iota_gfx_init(!has_usb()); // turns on the display
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
|
||||||
|
#ifdef SSD1306OLED
|
||||||
|
|
||||||
|
// When add source files to SRC in rules.mk, you can use functions.
|
||||||
|
const char *read_layer_state(void);
|
||||||
|
const char *read_logo(void);
|
||||||
|
void set_keylog(uint16_t keycode, keyrecord_t *record);
|
||||||
|
const char *read_keylog(void);
|
||||||
|
const char *read_keylogs(void);
|
||||||
|
|
||||||
|
// const char *read_mode_icon(bool swap);
|
||||||
|
// const char *read_host_led_state(void);
|
||||||
|
// void set_timelog(void);
|
||||||
|
// const char *read_timelog(void);
|
||||||
|
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
iota_gfx_task();
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_render_user(struct CharacterMatrix *matrix) {
|
||||||
|
if (is_master) {
|
||||||
|
// If you want to change the display of OLED, you need to change here
|
||||||
|
matrix_write_ln(matrix, read_layer_state());
|
||||||
|
matrix_write_ln(matrix, read_keylog());
|
||||||
|
matrix_write_ln(matrix, read_keylogs());
|
||||||
|
//matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
|
||||||
|
//matrix_write_ln(matrix, read_host_led_state());
|
||||||
|
//matrix_write_ln(matrix, read_timelog());
|
||||||
|
} else {
|
||||||
|
matrix_write(matrix, read_logo());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
|
||||||
|
if (memcmp(dest->display, source->display, sizeof(dest->display))) {
|
||||||
|
memcpy(dest->display, source->display, sizeof(dest->display));
|
||||||
|
dest->dirty = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void iota_gfx_task_user(void) {
|
||||||
|
struct CharacterMatrix matrix;
|
||||||
|
matrix_clear(&matrix);
|
||||||
|
matrix_render_user(&matrix);
|
||||||
|
matrix_update(&display, &matrix);
|
||||||
|
}
|
||||||
|
#endif//SSD1306OLED
|
||||||
|
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
if (record->event.pressed) {
|
||||||
|
#ifdef SSD1306OLED
|
||||||
|
set_keylog(keycode, record);
|
||||||
|
#endif
|
||||||
|
// set_timelog();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (keycode) {
|
||||||
|
case QWERTY:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
persistent_default_layer_set(1UL<<_QWERTY);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
case LOWER:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_on(_LOWER);
|
||||||
|
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
||||||
|
} else {
|
||||||
|
layer_off(_LOWER);
|
||||||
|
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
case RAISE:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_on(_RAISE);
|
||||||
|
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
||||||
|
} else {
|
||||||
|
layer_off(_RAISE);
|
||||||
|
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
case ADJUST:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
layer_on(_ADJUST);
|
||||||
|
} else {
|
||||||
|
layer_off(_ADJUST);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
case RGB_MOD:
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
if (record->event.pressed) {
|
||||||
|
rgblight_mode(RGB_current_mode);
|
||||||
|
rgblight_step();
|
||||||
|
RGB_current_mode = rgblight_config.mode;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
case RGBRST:
|
||||||
|
#ifdef RGBLIGHT_ENABLE
|
||||||
|
if (record->event.pressed) {
|
||||||
|
eeconfig_update_rgblight_default();
|
||||||
|
rgblight_enable();
|
||||||
|
RGB_current_mode = rgblight_config.mode;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
# If you want to change the display of OLED, you need to change here
|
||||||
|
SRC += ./lib/glcdfont.c \
|
||||||
|
./lib/rgb_state_reader.c \
|
||||||
|
./lib/layer_state_reader.c \
|
||||||
|
./lib/logo_reader.c \
|
||||||
|
./lib/keylogger.c \
|
||||||
|
# ./lib/mode_icon_reader.c \
|
||||||
|
# ./lib/host_led_state_reader.c \
|
||||||
|
# ./lib/timelogger.c \
|
||||||
@@ -6,7 +6,6 @@ SRC += ssd1306.c
|
|||||||
# CFLAGS += -flto
|
# CFLAGS += -flto
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
@@ -55,7 +54,7 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
|||||||
# the appropriate keymap folder that will get included automatically
|
# the appropriate keymap folder that will get included automatically
|
||||||
#
|
#
|
||||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||||
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
|
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
EXTRAKEY_ENABLE = no # Audio control and System control(+450)
|
EXTRAKEY_ENABLE = no # Audio control and System control(+450)
|
||||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||||
@@ -65,9 +64,7 @@ MIDI_ENABLE = no # MIDI controls
|
|||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
UNICODE_ENABLE = no # Unicode
|
UNICODE_ENABLE = no # Unicode
|
||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
|
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
|
||||||
SUBPROJECT_rev1 = no
|
|
||||||
USE_I2C = yes
|
|
||||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
@@ -63,4 +62,4 @@ AUDIO_ENABLE = no # Audio output on port C6
|
|||||||
UNICODE_ENABLE = no # Unicode
|
UNICODE_ENABLE = no # Unicode
|
||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
|
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
|
||||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||||
@@ -2,7 +2,6 @@ SRC += matrix.c \
|
|||||||
i2c_slave.c
|
i2c_slave.c
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
@@ -71,4 +70,4 @@ AUDIO_ENABLE = no # Audio output on port C6
|
|||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
|
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
|
||||||
NO_USB_STARTUP_CHECK = yes # Disable initialization only when usb is plugged in
|
NO_USB_STARTUP_CHECK = yes # Disable initialization only when usb is plugged in
|
||||||
CUSTOM_MATRIX = yes # Use custom matrix
|
CUSTOM_MATRIX = yes # Use custom matrix
|
||||||
@@ -2,7 +2,6 @@ SRC += matrix.c \
|
|||||||
i2c_master.c
|
i2c_master.c
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ SRC += matrix.c \
|
|||||||
i2c_slave.c
|
i2c_slave.c
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ SRC += matrix.c \
|
|||||||
i2c_slave.c
|
i2c_slave.c
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
@@ -71,4 +70,4 @@ AUDIO_ENABLE = no # Audio output on port C6
|
|||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
|
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
|
||||||
NO_USB_STARTUP_CHECK = yes # Disable initialization only when usb is plugged in
|
NO_USB_STARTUP_CHECK = yes # Disable initialization only when usb is plugged in
|
||||||
CUSTOM_MATRIX = yes # Use custom matrix
|
CUSTOM_MATRIX = yes # Use custom matrix
|
||||||
@@ -4,7 +4,6 @@ SRC += matrix.c \
|
|||||||
serial.c
|
serial.c
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ SRC = matrix.c
|
|||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -36,6 +36,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#define DIODE_DIRECTION COL2ROW
|
#define DIODE_DIRECTION COL2ROW
|
||||||
#define DEBOUNCE 5
|
#define DEBOUNCE 5
|
||||||
|
|
||||||
#define NO_BACKLIGHT_CLOCK
|
|
||||||
#define BACKLIGHT_LEVELS 1
|
#define BACKLIGHT_LEVELS 1
|
||||||
#define RGBLIGHT_ANIMATIONS
|
#define RGBLIGHT_ANIMATIONS
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# MCU name
|
# MCU name
|
||||||
#MCU = at90usb1286
|
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|||||||
Loaded 100 of 662 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user