summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrashna Jael're <drashna@live.com>2023-03-16 00:50:29 -0700
committerDrashna Jael're <drashna@live.com>2023-03-16 00:50:29 -0700
commit72da3ee63e110392bebaa64dd7d862fb99097505 (patch)
tree7c29d38a3fd30772007bd526f8a9f284c61d9768
parent62943fa93ea7c5f19d8296155ca30f49ca8a3b26 (diff)
parent2f7a06cf739fc97b9f590ef137e15a76eaaa3df2 (diff)
Merge remote-tracking branch 'origin/master' into develop
-rw-r--r--data/constants/keycodes/keycodes_0.0.1_basic.hjson6
-rw-r--r--docs/custom_quantum_functions.md58
-rw-r--r--docs/feature_advanced_keycodes.md5
-rw-r--r--docs/feature_key_overrides.md34
-rw-r--r--keyboards/atlantis/ps17/config.h53
-rw-r--r--keyboards/atlantis/ps17/info.json99
-rw-r--r--keyboards/atlantis/ps17/keymaps/default/keymap.c49
-rw-r--r--keyboards/atlantis/ps17/keymaps/multimedia/keymap.c49
-rw-r--r--keyboards/atlantis/ps17/keymaps/multimedia/rules.mk1
-rw-r--r--keyboards/atlantis/ps17/keymaps/via/keymap.c49
-rw-r--r--keyboards/atlantis/ps17/keymaps/via/rules.mk2
-rw-r--r--keyboards/atlantis/ps17/ps17.c53
-rw-r--r--keyboards/atlantis/ps17/readme.md34
-rw-r--r--keyboards/atlantis/ps17/rules.mk1
-rw-r--r--keyboards/gray_studio/space65r3/readme.md2
-rw-r--r--keyboards/kbdfans/tiger80/config.h13
-rw-r--r--keyboards/kbdfans/tiger80/info.json316
-rw-r--r--keyboards/kbdfans/tiger80/keymaps/iso/keymap.c30
-rw-r--r--keyboards/kbdfans/tiger80/rules.mk12
-rw-r--r--keyboards/kbdfans/tiger80/tiger80.c17
-rw-r--r--keyboards/kbdfans/tiger80/tiger80.h35
-rw-r--r--keyboards/keychron/common/keychron_common.c14
22 files changed, 732 insertions, 200 deletions
diff --git a/data/constants/keycodes/keycodes_0.0.1_basic.hjson b/data/constants/keycodes/keycodes_0.0.1_basic.hjson
index 7141d553b0..430211ecca 100644
--- a/data/constants/keycodes/keycodes_0.0.1_basic.hjson
+++ b/data/constants/keycodes/keycodes_0.0.1_basic.hjson
@@ -253,7 +253,7 @@
253 "0x002F": { 253 "0x002F": {
254 "group": "basic", 254 "group": "basic",
255 "key": "KC_LEFT_BRACKET", 255 "key": "KC_LEFT_BRACKET",
256 "label": "]", 256 "label": "[",
257 "aliases": [ 257 "aliases": [
258 "KC_LBRC" 258 "KC_LBRC"
259 ] 259 ]
@@ -261,7 +261,7 @@
261 "0x0030": { 261 "0x0030": {
262 "group": "basic", 262 "group": "basic",
263 "key": "KC_RIGHT_BRACKET", 263 "key": "KC_RIGHT_BRACKET",
264 "label": "[", 264 "label": "]",
265 "aliases": [ 265 "aliases": [
266 "KC_RBRC" 266 "KC_RBRC"
267 ] 267 ]
@@ -1512,4 +1512,4 @@
1512 ] 1512 ]
1513 } 1513 }
1514 } 1514 }
1515} \ No newline at end of file 1515}
diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md
index 2917fbad26..5d63f3cfb7 100644
--- a/docs/custom_quantum_functions.md
+++ b/docs/custom_quantum_functions.md
@@ -202,6 +202,62 @@ This function gets called at the end of all QMK processing, before starting the
202 202
203Similar to `matrix_scan_*`, these are called as often as the MCU can handle. To keep your board responsive, it's suggested to do as little as possible during these function calls, potentially throtting their behaviour if you do indeed require implementing something special. 203Similar to `matrix_scan_*`, these are called as often as the MCU can handle. To keep your board responsive, it's suggested to do as little as possible during these function calls, potentially throtting their behaviour if you do indeed require implementing something special.
204 204
205### Example `void housekeeping_task_user(void)` implementation
206
207This example will show you how to use `void housekeeping_task_user(void)` to turn off [RGB Light](feature_rgblight.md). For RGB Matrix, the [builtin](https://docs.qmk.fm/#/feature_rgb_matrix?id=additional-configh-options) `RGB_MATRIX_TIMEOUT` should be used.
208
209First, add the following lines to your keymap's `config.h`:
210
211```c
212#define RGBLIGHT_SLEEP // enable rgblight_suspend() and rgblight_wakeup() in keymap.c
213#define RGBLIGHT_TIMEOUT 900000 // ms to wait until rgblight time out, 900K ms is 15min.
214```
215
216Next, add the following code to your `keymap.c`:
217
218```c
219static uint32_t key_timer; // timer for last keyboard activity, use 32bit value and function to make longer idle time possible
220static void refresh_rgb(void); // refreshes the activity timer and RGB, invoke whenever any activity happens
221static void check_rgb_timeout(void); // checks if enough time has passed for RGB to timeout
222bool is_rgb_timeout = false; // store if RGB has timed out or not in a boolean
223
224void refresh_rgb(void) {
225 key_timer = timer_read32(); // store time of last refresh
226 if (is_rgb_timeout)
227 {
228 is_rgb_timeout = false;
229 rgblight_wakeup();
230 }
231}
232void check_rgb_timeout(void) {
233 if (!is_rgb_timeout && timer_elapsed32(key_timer) > RGBLIGHT_TIMEOUT) // check if RGB has already timeout and if enough time has passed
234 {
235 rgblight_suspend();
236 is_rgb_timeout = true;
237 }
238}
239/* Then, call the above functions from QMK's built in post processing functions like so */
240/* Runs at the end of each scan loop, check if RGB timeout has occured or not */
241void housekeeping_task_user(void) {
242#ifdef RGBLIGHT_TIMEOUT
243 check_rgb_timeout();
244#endif
245}
246/* Runs after each key press, check if activity occurred */
247void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
248#ifdef RGBLIGHT_TIMEOUT
249 if (record->event.pressed)
250 refresh_rgb();
251#endif
252}
253/* Runs after each encoder tick, check if activity occurred */
254void post_encoder_update_user(uint8_t index, bool clockwise) {
255#ifdef RGBLIGHT_TIMEOUT
256 refresh_rgb();
257#endif
258}
259```
260
205# Keyboard Idling/Wake Code 261# Keyboard Idling/Wake Code
206 262
207If the board supports it, it can be "idled", by stopping a number of functions. A good example of this is RGB lights or backlights. This can save on power consumption, or may be better behavior for your keyboard. 263If the board supports it, it can be "idled", by stopping a number of functions. A good example of this is RGB lights or backlights. This can save on power consumption, or may be better behavior for your keyboard.
@@ -209,7 +265,7 @@ If the board supports it, it can be "idled", by stopping a number of functions.
209This is controlled by two functions: `suspend_power_down_*` and `suspend_wakeup_init_*`, which are called when the system board is idled and when it wakes up, respectively. 265This is controlled by two functions: `suspend_power_down_*` and `suspend_wakeup_init_*`, which are called when the system board is idled and when it wakes up, respectively.
210 266
211 267
212### Example suspend_power_down_user() and suspend_wakeup_init_user() Implementation 268### Example `suspend_power_down_user()` and `suspend_wakeup_init_user()` Implementation
213 269
214 270
215```c 271```c
diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md
index b04721b23a..90f06e405a 100644
--- a/docs/feature_advanced_keycodes.md
+++ b/docs/feature_advanced_keycodes.md
@@ -160,6 +160,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
160 return true; 160 return true;
161}; 161};
162``` 162```
163Alternatively, this can be done with [Key Overrides](feature_key_overrides?id=simple-example).
163 164
164# Advanced topics :id=advanced-topics 165# Advanced topics :id=advanced-topics
165 166
@@ -180,3 +181,7 @@ This page used to encompass a large set of features. We have moved many sections
180## Tap-Hold Configuration Options :id=tap-hold-configuration-options 181## Tap-Hold Configuration Options :id=tap-hold-configuration-options
181 182
182* [Tap-Hold Configuration Options](tap_hold.md) 183* [Tap-Hold Configuration Options](tap_hold.md)
184
185## Key Overrides :id=key-overrides
186
187* [Key Overrides](feature_key_overrides.md) \ No newline at end of file
diff --git a/docs/feature_key_overrides.md b/docs/feature_key_overrides.md
index 36fd383cd4..608eb001e4 100644
--- a/docs/feature_key_overrides.md
+++ b/docs/feature_key_overrides.md
@@ -1,4 +1,4 @@
1# Key Overrides 1# Key Overrides :id=key-overrides
2 2
3Key overrides allow you to override modifier-key combinations to send a different modifier-key combination or perform completely custom actions. Don't want `shift` + `1` to type `!` on your computer? Use a key override to make your keyboard type something different when you press `shift` + `1`. The general behavior is like this: If `modifiers w` + `key x` are pressed, replace these keys with `modifiers y` + `key z` in the keyboard report. 3Key overrides allow you to override modifier-key combinations to send a different modifier-key combination or perform completely custom actions. Don't want `shift` + `1` to type `!` on your computer? Use a key override to make your keyboard type something different when you press `shift` + `1`. The general behavior is like this: If `modifiers w` + `key x` are pressed, replace these keys with `modifiers y` + `key z` in the keyboard report.
4 4
@@ -10,13 +10,13 @@ You can use key overrides in a similar way to momentary layer/fn keys to activat
10- Create custom shortcuts or change existing ones: E.g. Send `ctrl`+`shift`+`z` when `ctrl`+`y` is pressed. 10- Create custom shortcuts or change existing ones: E.g. Send `ctrl`+`shift`+`z` when `ctrl`+`y` is pressed.
11- Run custom code when `ctrl` + `alt` + `esc` is pressed. 11- Run custom code when `ctrl` + `alt` + `esc` is pressed.
12 12
13## Setup 13## Setup :id=setup
14 14
15To enable this feature, you need to add `KEY_OVERRIDE_ENABLE = yes` to your `rules.mk`. 15To enable this feature, you need to add `KEY_OVERRIDE_ENABLE = yes` to your `rules.mk`.
16 16
17Then, in your `keymap.c` file, you'll need to define the array `key_overrides`, which defines all key overrides to be used. Each override is a value of type `key_override_t`. The array `key_overrides` is `NULL`-terminated and contains pointers to `key_override_t` values (`const key_override_t **`). 17Then, in your `keymap.c` file, you'll need to define the array `key_overrides`, which defines all key overrides to be used. Each override is a value of type `key_override_t`. The array `key_overrides` is `NULL`-terminated and contains pointers to `key_override_t` values (`const key_override_t **`).
18 18
19## Creating Key Overrides 19## Creating Key Overrides :id=creating-key-overrides
20 20
21The `key_override_t` struct has many options that allow you to precisely tune your overrides. The full reference is shown below. Instead of manually creating a `key_override_t` value, it is recommended to use these dedicated initializers: 21The `key_override_t` struct has many options that allow you to precisely tune your overrides. The full reference is shown below. Instead of manually creating a `key_override_t` value, it is recommended to use these dedicated initializers:
22 22
@@ -34,7 +34,7 @@ Additionally takes a bitmask `options` that specifies additional options. See `k
34 34
35For more customization possibilities, you may directly create a `key_override_t`, which allows you to customize even more behavior. Read further below for details and examples. 35For more customization possibilities, you may directly create a `key_override_t`, which allows you to customize even more behavior. Read further below for details and examples.
36 36
37## Simple Example 37## Simple Example :id=simple-example
38 38
39This shows how the mentioned example of sending `delete` when `shift` + `backspace` are pressed is realized: 39This shows how the mentioned example of sending `delete` when `shift` + `backspace` are pressed is realized:
40 40
@@ -48,9 +48,9 @@ const key_override_t **key_overrides = (const key_override_t *[]){
48}; 48};
49``` 49```
50 50
51## Intermediate Difficulty Examples 51## Intermediate Difficulty Examples :id=intermediate-difficulty-examples
52 52
53### Media Controls & Screen Brightness 53### Media Controls & Screen Brightness :id=media-controls-amp-screen-brightness
54 54
55In this example a single key is configured to control media, volume and screen brightness by using key overrides. 55In this example a single key is configured to control media, volume and screen brightness by using key overrides.
56 56
@@ -102,7 +102,7 @@ const key_override_t **key_overrides = (const key_override_t *[]){
102}; 102};
103``` 103```
104 104
105### Flexible macOS-friendly Grave Escape 105### Flexible macOS-friendly Grave Escape :id=flexible-macos-friendly-grave-escape
106The [Grave Escape feature](feature_grave_esc.md) is limited in its configurability and has [bugs when used on macOS](feature_grave_esc.md#caveats). Key overrides can be used to achieve a similar functionality as Grave Escape, but with more customization and without bugs on macOS. 106The [Grave Escape feature](feature_grave_esc.md) is limited in its configurability and has [bugs when used on macOS](feature_grave_esc.md#caveats). Key overrides can be used to achieve a similar functionality as Grave Escape, but with more customization and without bugs on macOS.
107 107
108```c 108```c
@@ -121,8 +121,8 @@ const key_override_t **key_overrides = (const key_override_t *[]){
121 121
122In addition to not encountering unexpected bugs on macOS, you can also change the behavior as you wish. Instead setting `GUI` + `ESC` = `` ` `` you may change it to an arbitrary other modifier, for example `Ctrl` + `ESC` = `` ` ``. 122In addition to not encountering unexpected bugs on macOS, you can also change the behavior as you wish. Instead setting `GUI` + `ESC` = `` ` `` you may change it to an arbitrary other modifier, for example `Ctrl` + `ESC` = `` ` ``.
123 123
124## Advanced Examples 124## Advanced Examples :id=advanced-examples
125### Modifiers as Layer Keys 125### Modifiers as Layer Keys :id=modifiers-as-layer-keys
126 126
127Do you really need a dedicated key to toggle your fn layer? With key overrides, perhaps not. This example shows how you can configure to use `rGUI` + `rAlt` (right GUI and right alt) to access a momentary layer like an fn layer. With this you completely eliminate the need to use a dedicated layer key. Of course the choice of modifier keys can be changed as needed, `rGUI` + `rAlt` is just an example here. 127Do you really need a dedicated key to toggle your fn layer? With key overrides, perhaps not. This example shows how you can configure to use `rGUI` + `rAlt` (right GUI and right alt) to access a momentary layer like an fn layer. With this you completely eliminate the need to use a dedicated layer key. Of course the choice of modifier keys can be changed as needed, `rGUI` + `rAlt` is just an example here.
128 128
@@ -150,7 +150,7 @@ const key_override_t fn_override = {.trigger_mods = MOD_BIT(KC_RGUI) |
150 .enabled = NULL}; 150 .enabled = NULL};
151``` 151```
152 152
153## Keycodes 153## Keycodes :id=keycodes
154 154
155|Keycode |Aliases |Description | 155|Keycode |Aliases |Description |
156|------------------------|---------|----------------------| 156|------------------------|---------|----------------------|
@@ -158,7 +158,7 @@ const key_override_t fn_override = {.trigger_mods = MOD_BIT(KC_RGUI) |
158|`QK_KEY_OVERRIDE_ON` |`KO_ON` |Turn on key overrides | 158|`QK_KEY_OVERRIDE_ON` |`KO_ON` |Turn on key overrides |
159|`QK_KEY_OVERRIDE_OFF` |`KO_OFF` |Turn off key overrides| 159|`QK_KEY_OVERRIDE_OFF` |`KO_OFF` |Turn off key overrides|
160 160
161## Reference for `key_override_t` 161## Reference for `key_override_t` :id=reference-for-key_override_t
162 162
163Advanced users may need more customization than what is offered by the simple `ko_make` initializers. For this, directly create a `key_override_t` value and set all members. Below is a reference for all members of `key_override_t`. 163Advanced users may need more customization than what is offered by the simple `ko_make` initializers. For this, directly create a `key_override_t` value and set all members. Below is a reference for all members of `key_override_t`.
164 164
@@ -175,7 +175,7 @@ Advanced users may need more customization than what is offered by the simple `k
175| `void *context` | A context that will be passed to the custom action function. | 175| `void *context` | A context that will be passed to the custom action function. |
176| `bool *enabled` | If this points to false this override will not be used. Set to NULL to always have this override enabled. | 176| `bool *enabled` | If this points to false this override will not be used. Set to NULL to always have this override enabled. |
177 177
178### Reference for `ko_option_t` 178## Reference for `ko_option_t` :id=reference-for-ko_option_t
179 179
180Bitfield with various options controlling the behavior of a key override. 180Bitfield with various options controlling the behavior of a key override.
181 181
@@ -189,11 +189,11 @@ Bitfield with various options controlling the behavior of a key override.
189| `ko_option_no_reregister_trigger` | If set, the trigger key will never be registered again after the override is deactivated. | 189| `ko_option_no_reregister_trigger` | If set, the trigger key will never be registered again after the override is deactivated. |
190| `ko_options_default` | The default options used by the `ko_make_xxx` functions | 190| `ko_options_default` | The default options used by the `ko_make_xxx` functions |
191 191
192## For Advanced Users: Inner Workings 192## For Advanced Users: Inner Workings :id=for-advanced-users-inner-workings
193 193
194This section explains how a key override works in detail, explaining where each member of `key_override_t` comes into play. Understanding this is essential to be able to take full advantage of all the options offered by key overrides. 194This section explains how a key override works in detail, explaining where each member of `key_override_t` comes into play. Understanding this is essential to be able to take full advantage of all the options offered by key overrides.
195 195
196#### Activation 196#### Activation :id=activation
197 197
198When the necessary keys are pressed (`trigger_mods` + `trigger`), the override is 'activated' and the replacement key is registered in the keyboard report (`replacement`), while the `trigger` key is removed from the keyboard report. The trigger modifiers may also be removed from the keyboard report upon activation of an override (`suppressed_mods`). The override will not activate if any of the `negative_modifiers` are pressed. 198When the necessary keys are pressed (`trigger_mods` + `trigger`), the override is 'activated' and the replacement key is registered in the keyboard report (`replacement`), while the `trigger` key is removed from the keyboard report. The trigger modifiers may also be removed from the keyboard report upon activation of an override (`suppressed_mods`). The override will not activate if any of the `negative_modifiers` are pressed.
199 199
@@ -207,11 +207,11 @@ Use the `option` member to customize which of these events are allowed to activa
207 207
208In any case, a key override can only activate if the `trigger` key is the _last_ non-modifier key that was pressed down. This emulates the behavior of how standard OSes (macOS, Windows, Linux) handle normal key input (to understand: Hold down `a`, then also hold down `b`, then hold down `shift`; `B` will be typed but not `A`). 208In any case, a key override can only activate if the `trigger` key is the _last_ non-modifier key that was pressed down. This emulates the behavior of how standard OSes (macOS, Windows, Linux) handle normal key input (to understand: Hold down `a`, then also hold down `b`, then hold down `shift`; `B` will be typed but not `A`).
209 209
210#### Deactivation 210#### Deactivation :id=deactivation
211 211
212An override is 'deactivated' when one of the trigger keys (`trigger_mods`, `trigger`) is lifted, another non-modifier key is pressed down, or one of the `negative_modifiers` is pressed down. When an override deactivates, the `replacement` key is removed from the keyboard report, while the `suppressed_mods` that are still held down are re-added to the keyboard report. By default, the `trigger` key is re-added to the keyboard report if it is still held down and no other non-modifier key has been pressed since. This again emulates the behavior of how standard OSes handle normal key input (To understand: hold down `a`, then also hold down `b`, then also `shift`, then release `b`; `A` will not be typed even though you are holding the `a` and `shift` keys). Use the `option` field `ko_option_no_reregister_trigger` to prevent re-registering the trigger key in all cases. 212An override is 'deactivated' when one of the trigger keys (`trigger_mods`, `trigger`) is lifted, another non-modifier key is pressed down, or one of the `negative_modifiers` is pressed down. When an override deactivates, the `replacement` key is removed from the keyboard report, while the `suppressed_mods` that are still held down are re-added to the keyboard report. By default, the `trigger` key is re-added to the keyboard report if it is still held down and no other non-modifier key has been pressed since. This again emulates the behavior of how standard OSes handle normal key input (To understand: hold down `a`, then also hold down `b`, then also `shift`, then release `b`; `A` will not be typed even though you are holding the `a` and `shift` keys). Use the `option` field `ko_option_no_reregister_trigger` to prevent re-registering the trigger key in all cases.
213 213
214#### Key Repeat Delay 214#### Key Repeat Delay :id=key-repeat-delay
215 215
216A third way in which standard OS-handling of modifier-key input is emulated in key overrides is with a ['key repeat delay'](https://www.dummies.com/computers/pcs/set-your-keyboards-repeat-delay-and-repeat-rate/). To explain what this is, let's look at how normal keyboard input is handled by mainstream OSes again: If you hold down `a`, followed by `shift`, you will see the letter `a` is first typed, then for a short moment nothing is typed and then repeating `A`s are typed. Take note that, although shift is pressed down just after `a` is pressed, it takes a moment until `A` is typed. This is caused by the aforementioned key repeat delay, and it is a feature that prevents unwanted repeated characters from being typed. 216A third way in which standard OS-handling of modifier-key input is emulated in key overrides is with a ['key repeat delay'](https://www.dummies.com/computers/pcs/set-your-keyboards-repeat-delay-and-repeat-rate/). To explain what this is, let's look at how normal keyboard input is handled by mainstream OSes again: If you hold down `a`, followed by `shift`, you will see the letter `a` is first typed, then for a short moment nothing is typed and then repeating `A`s are typed. Take note that, although shift is pressed down just after `a` is pressed, it takes a moment until `A` is typed. This is caused by the aforementioned key repeat delay, and it is a feature that prevents unwanted repeated characters from being typed.
217 217
@@ -222,6 +222,6 @@ This applies equally to releasing a modifier: When you hold `shift`, then press
222The duration of the key repeat delay is controlled with the `KEY_OVERRIDE_REPEAT_DELAY` macro. Define this value in your `config.h` file to change it. It is 500ms by default. 222The duration of the key repeat delay is controlled with the `KEY_OVERRIDE_REPEAT_DELAY` macro. Define this value in your `config.h` file to change it. It is 500ms by default.
223 223
224 224
225## Difference to Combos 225## Difference to Combos :id=difference-to-combos
226 226
227Note that key overrides are very different from [combos](https://docs.qmk.fm/#/feature_combo). Combos require that you press down several keys almost _at the same time_ and can work with any combination of non-modifier keys. Key overrides work like keyboard shortcuts (e.g. `ctrl` + `z`): They take combinations of _multiple_ modifiers and _one_ non-modifier key to then perform some custom action. Key overrides are implemented with much care to behave just like normal keyboard shortcuts would in regards to the order of pressed keys, timing, and interacton with other pressed keys. There are a number of optional settings that can be used to really fine-tune the behavior of each key override as well. Using key overrides also does not delay key input for regular key presses, which inherently happens in combos and may be undesirable. 227Note that key overrides are very different from [combos](https://docs.qmk.fm/#/feature_combo). Combos require that you press down several keys almost _at the same time_ and can work with any combination of non-modifier keys. Key overrides work like keyboard shortcuts (e.g. `ctrl` + `z`): They take combinations of _multiple_ modifiers and _one_ non-modifier key to then perform some custom action. Key overrides are implemented with much care to behave just like normal keyboard shortcuts would in regards to the order of pressed keys, timing, and interacton with other pressed keys. There are a number of optional settings that can be used to really fine-tune the behavior of each key override as well. Using key overrides also does not delay key input for regular key presses, which inherently happens in combos and may be undesirable.
diff --git a/keyboards/atlantis/ps17/config.h b/keyboards/atlantis/ps17/config.h
new file mode 100644
index 0000000000..5638e334bd
--- /dev/null
+++ b/keyboards/atlantis/ps17/config.h
@@ -0,0 +1,53 @@
1// Copyright 2023 mjbogusz (@mjbogusz)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6/* Indicator LEDs */
7#define LED_INDICATOR_0_PIN D0
8#define LED_INDICATOR_1_PIN D5
9#define LED_INDICATOR_2_PIN D4
10
11/* RGB matrix */
12#define RGB_DI_PIN B7
13#define RGB_MATRIX_LED_COUNT 28
14#define RGB_MATRIX_KEYPRESSES
15#define RGB_DISABLE_WHEN_USB_SUSPENDED
16
17#ifdef RGB_MATRIX_ENABLE
18 // RGB Matrix Animation modes. Explicitly enabled
19 // For full list of effects, see:
20 // https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
21 #define ENABLE_RGB_MATRIX_SOLID_COLOR
22 // #define ENABLE_RGB_MATRIX_ALPHAS_MODS
23 // #define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
24 // #define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
25 // #define ENABLE_RGB_MATRIX_BREATHING
26 // #define ENABLE_RGB_MATRIX_BAND_SAT
27 // #define ENABLE_RGB_MATRIX_BAND_VAL
28 // #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
29 // #define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
30 // #define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
31 // #define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
32 #define ENABLE_RGB_MATRIX_CYCLE_ALL
33 // #define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
34 // #define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
35 // #define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
36 // #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
37 // #define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
38 #define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
39 // #define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
40 // #define ENABLE_RGB_MATRIX_DUAL_BEACON
41 #define ENABLE_RGB_MATRIX_RAINBOW_BEACON
42 // #define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
43 // #define ENABLE_RGB_MATRIX_RAINDROPS
44 // #define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
45 // #define ENABLE_RGB_MATRIX_HUE_BREATHING
46 // #define ENABLE_RGB_MATRIX_HUE_PENDULUM
47 // #define ENABLE_RGB_MATRIX_HUE_WAVE
48 // #define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
49 // #define ENABLE_RGB_MATRIX_PIXEL_FLOW
50 #define ENABLE_RGB_MATRIX_PIXEL_RAIN
51 // #define ENABLE_RGB_MATRIX_TYPING_HEATMAP
52 // #define ENABLE_RGB_MATRIX_DIGITAL_RAIN
53#endif
diff --git a/keyboards/atlantis/ps17/info.json b/keyboards/atlantis/ps17/info.json
new file mode 100644
index 0000000000..5b025c83f7
--- /dev/null
+++ b/keyboards/atlantis/ps17/info.json
@@ -0,0 +1,99 @@
1{
2 "manufacturer": "Atlantis",
3 "keyboard_name": "PS17",
4 "maintainer": "mjbogusz",
5 "url": "https://qmk.fm/keyboards/",
6 "processor": "atmega32u4",
7 "bootloader": "atmel-dfu",
8 "bootloader_instructions": "To reset the board into bootloader mode, tap the Reset switch mounted on the bottom of the PCB.",
9 "usb": {
10 "device_version": "1.0.0",
11 "pid": "0x414B",
12 "vid": "0x0015"
13 },
14 "features": {
15 "bootmagic": false,
16 "command": false,
17 "console": false,
18 "extrakey": true,
19 "mousekey": true,
20 "nkro": true,
21 "encoder": true,
22 "rgb_matrix": true
23 },
24 "diode_direction": "COL2ROW",
25 "matrix_pins": {
26 "cols": ["F6", "F7", "D3", "D6"],
27 "rows": ["F0", "B4", "B5", "B6", "C6", "C7", "NO_PIN", "NO_PIN", "NO_PIN", "NO_PIN", "NO_PIN"]
28 },
29 "encoder": {
30 "rotary": [{
31 "pin_a": "D2",
32 "pin_b": "D1"
33 }]
34 },
35 "layouts": {
36 "LAYOUT": {
37 "layout": [
38 { "matrix": [0, 1], "x": 0, "y": 0},
39
40 { "matrix": [1, 0], "x": 0, "y": 1.5},
41 { "matrix": [1, 1], "x": 1, "y": 1.5},
42 { "matrix": [1, 2], "x": 2, "y": 1.5},
43 { "matrix": [1, 3], "x": 3, "y": 1.5},
44
45 { "matrix": [2, 0], "x": 0, "y": 2.5},
46 { "matrix": [2, 1], "x": 1, "y": 2.5},
47 { "matrix": [2, 2], "x": 2, "y": 2.5},
48 { "matrix": [2, 3], "x": 3, "y": 2.5, "h": 2},
49
50 { "matrix": [3, 0], "x": 0, "y": 3.5},
51 { "matrix": [3, 1], "x": 1, "y": 3.5},
52 { "matrix": [3, 2], "x": 2, "y": 3.5},
53
54 { "matrix": [4, 0], "x": 0, "y": 4.5},
55 { "matrix": [4, 1], "x": 1, "y": 4.5},
56 { "matrix": [4, 2], "x": 2, "y": 4.5},
57 { "matrix": [4, 3], "x": 3, "y": 4.5, "h": 2},
58
59 { "matrix": [5, 0], "x": 0, "y": 5.5, "w": 2},
60 { "matrix": [5, 2], "x": 2, "y": 5.5}
61 ]
62 }
63 },
64 "rgb_matrix": {
65 "driver": "WS2812",
66 "center_point": [126, 126],
67 "layout": [
68 { "flags": 4, "matrix": [1, 0], "x": 74, "y": 165 },
69 { "flags": 4, "matrix": [1, 1], "x": 108, "y": 165 },
70 { "flags": 4, "matrix": [1, 2], "x": 144, "y": 165 },
71 { "flags": 4, "matrix": [1, 3], "x": 179, "y": 165 },
72 { "flags": 4, "matrix": [2, 0], "x": 74, "y": 129 },
73 { "flags": 4, "matrix": [2, 1], "x": 109, "y": 129 },
74 { "flags": 4, "matrix": [2, 2], "x": 143, "y": 129 },
75 { "flags": 4, "matrix": [2, 3], "x": 188, "y": 121 },
76 { "flags": 4, "matrix": [3, 0], "x": 74, "y": 95 },
77 { "flags": 4, "matrix": [3, 1], "x": 109, "y": 95 },
78 { "flags": 4, "matrix": [3, 2], "x": 143, "y": 95 },
79 { "flags": 4, "matrix": [4, 0], "x": 73, "y": 60 },
80 { "flags": 4, "matrix": [4, 1], "x": 109, "y": 60 },
81 { "flags": 4, "matrix": [4, 2], "x": 144, "y": 60 },
82 { "flags": 4, "matrix": [4, 3], "x": 188, "y": 51 },
83 { "flags": 4, "matrix": [5, 0], "x": 91, "y": 25 },
84 { "flags": 4, "matrix": [5, 2], "x": 144, "y": 25 },
85
86 { "flags": 2, "x": 61, "y": 26},
87 { "flags": 2, "x": 61, "y": 88},
88 { "flags": 2, "x": 61, "y": 158},
89 { "flags": 2, "x": 61, "y": 197},
90 { "flags": 2, "x": 61, "y": 232},
91 { "flags": 2, "x": 192, "y": 232},
92 { "flags": 2, "x": 192, "y": 196},
93 { "flags": 2, "x": 192, "y": 158},
94 { "flags": 2, "x": 192, "y": 87},
95 { "flags": 2, "x": 183, "y": 26},
96 { "flags": 2, "x": 127, "y": 24}
97 ]
98 }
99}
diff --git a/keyboards/atlantis/ps17/keymaps/default/keymap.c b/keyboards/atlantis/ps17/keymaps/default/keymap.c
new file mode 100644
index 0000000000..b5d36f02a7
--- /dev/null
+++ b/keyboards/atlantis/ps17/keymaps/default/keymap.c
@@ -0,0 +1,49 @@
1// Copyright 2023 mjbogusz (@mjbogusz)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include QMK_KEYBOARD_H
5
6const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
7 // Default layer: numpad + volume control
8 [0] = LAYOUT(
9 KC_MUTE,
10 TO(1), KC_PSLS, KC_PAST, KC_PMNS,
11 KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS,
12 KC_KP_4, KC_KP_5, KC_KP_6,
13 KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT,
14 KC_KP_0, KC_PDOT
15 ),
16 [1] = LAYOUT(
17 RGB_MOD,
18 TO(2), KC_TRNS, KC_TRNS, KC_TRNS,
19 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
20 KC_TRNS, KC_TRNS, KC_TRNS,
21 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
22 KC_TRNS, KC_TRNS
23 ),
24 [2] = LAYOUT(
25 RGB_MOD,
26 TO(3), KC_TRNS, KC_TRNS, KC_TRNS,
27 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
28 KC_TRNS, KC_TRNS, KC_TRNS,
29 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
30 KC_TRNS, KC_TRNS
31 ),
32 [3] = LAYOUT(
33 RGB_MOD,
34 TO(0), KC_TRNS, KC_TRNS, KC_TRNS,
35 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
36 KC_TRNS, KC_TRNS, KC_TRNS,
37 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
38 KC_TRNS, KC_TRNS
39 ),
40};
41
42#if defined(ENCODER_MAP_ENABLE)
43const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
44 [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
45 [1] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD) },
46 [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
47 [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
48};
49#endif
diff --git a/keyboards/atlantis/ps17/keymaps/multimedia/keymap.c b/keyboards/atlantis/ps17/keymaps/multimedia/keymap.c
new file mode 100644
index 0000000000..32d20ef86c
--- /dev/null
+++ b/keyboards/atlantis/ps17/keymaps/multimedia/keymap.c
@@ -0,0 +1,49 @@
1// Copyright 2023 mjbogusz (@mjbogusz)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include QMK_KEYBOARD_H
5
6const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
7 // Default layer: numpad + volume control
8 [0] = LAYOUT(
9 KC_MUTE,
10 TO(1), KC_PSLS, KC_PAST, KC_PMNS,
11 KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS,
12 KC_KP_4, KC_KP_5, KC_KP_6,
13 KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT,
14 KC_KP_0, KC_PDOT
15 ),
16 [1] = LAYOUT(
17 KC_MUTE,
18 TO(2), XXXXXXX, XXXXXXX, KC_VOLD,
19 XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU,
20 KC_MRWD, KC_MPLY, KC_MFFD,
21 KC_MPRV, KC_MSTP, KC_MNXT, KC_MSEL,
22 XXXXXXX, XXXXXXX
23 ),
24 [2] = LAYOUT(
25 RGB_MOD,
26 TO(3), KC_TRNS, KC_TRNS, KC_TRNS,
27 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
28 KC_TRNS, KC_TRNS, KC_TRNS,
29 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
30 KC_TRNS, KC_TRNS
31 ),
32 [3] = LAYOUT(
33 KC_TRNS,
34 TO(0), KC_TRNS, KC_TRNS, KC_TRNS,
35 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
36 KC_TRNS, KC_TRNS, KC_TRNS,
37 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
38 KC_TRNS, KC_TRNS
39 ),
40};
41
42#if defined(ENCODER_MAP_ENABLE)
43const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
44 [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
45 [1] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
46 [2] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD) },
47 [3] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD) },
48};
49#endif
diff --git a/keyboards/atlantis/ps17/keymaps/multimedia/rules.mk b/keyboards/atlantis/ps17/keymaps/multimedia/rules.mk
new file mode 100644
index 0000000000..ee32568148
--- /dev/null
+++ b/keyboards/atlantis/ps17/keymaps/multimedia/rules.mk
@@ -0,0 +1 @@
ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/atlantis/ps17/keymaps/via/keymap.c b/keyboards/atlantis/ps17/keymaps/via/keymap.c
new file mode 100644
index 0000000000..93a158172d
--- /dev/null
+++ b/keyboards/atlantis/ps17/keymaps/via/keymap.c
@@ -0,0 +1,49 @@
1// Copyright 2023 mjbogusz (@mjbogusz)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include QMK_KEYBOARD_H
5
6const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
7 // Default layer: numpad + volume control
8 [0] = LAYOUT(
9 KC_MUTE,
10 TO(1), KC_PSLS, KC_PAST, KC_PMNS,
11 KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS,
12 KC_KP_4, KC_KP_5, KC_KP_6,
13 KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT,
14 KC_KP_0, KC_PDOT
15 ),
16 [1] = LAYOUT(
17 RGB_MOD,
18 TO(2), KC_TRNS, KC_TRNS, KC_TRNS,
19 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
20 KC_TRNS, KC_TRNS, KC_TRNS,
21 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
22 KC_TRNS, KC_TRNS
23 ),
24 [2] = LAYOUT(
25 KC_TRNS,
26 TO(3), KC_TRNS, KC_TRNS, KC_TRNS,
27 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
28 KC_TRNS, KC_TRNS, KC_TRNS,
29 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
30 KC_TRNS, KC_TRNS
31 ),
32 [3] = LAYOUT(
33 KC_TRNS,
34 TO(0), KC_TRNS, KC_TRNS, KC_TRNS,
35 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
36 KC_TRNS, KC_TRNS, KC_TRNS,
37 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
38 KC_TRNS, KC_TRNS
39 ),
40};
41
42#if defined(ENCODER_MAP_ENABLE)
43const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
44 [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
45 [1] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD) },
46 [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
47 [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) },
48};
49#endif
diff --git a/keyboards/atlantis/ps17/keymaps/via/rules.mk b/keyboards/atlantis/ps17/keymaps/via/rules.mk
new file mode 100644
index 0000000000..715838ecc5
--- /dev/null
+++ b/keyboards/atlantis/ps17/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
1ENCODER_MAP_ENABLE = yes
2VIA_ENABLE = yes
diff --git a/keyboards/atlantis/ps17/ps17.c b/keyboards/atlantis/ps17/ps17.c
new file mode 100644
index 0000000000..ccac1ce923
--- /dev/null
+++ b/keyboards/atlantis/ps17/ps17.c
@@ -0,0 +1,53 @@
1// Copyright 2023 mjbogusz (@mjbogusz)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "quantum.h"
5
6layer_state_t layer_state_set_kb(layer_state_t state) {
7 /* Display current layer using indicator LEDs */
8 writePin(LED_INDICATOR_0_PIN, !IS_LAYER_ON_STATE(state, 1));
9 writePin(LED_INDICATOR_1_PIN, !IS_LAYER_ON_STATE(state, 2));
10 writePin(LED_INDICATOR_2_PIN, !IS_LAYER_ON_STATE(state, 3));
11 return layer_state_set_user(state);
12}
13
14void keyboard_pre_init_kb(void) {
15 /* Set indicator LEDs as outputs */
16 setPinOutput(LED_INDICATOR_0_PIN);
17 setPinOutput(LED_INDICATOR_1_PIN);
18 setPinOutput(LED_INDICATOR_2_PIN);
19 keyboard_pre_init_user();
20}
21
22#if defined(ENCODER_ENABLE)
23bool encoder_update_kb(uint8_t index, bool clockwise) {
24 if (!encoder_update_user(index, clockwise)) {
25 /* Don't process further events if user function exists and returns false */
26 return false;
27 }
28
29 /* Ignore index - only one encoder on this board */
30 if (clockwise) {
31 tap_code_delay(KC_VOLU, 10);
32 } else {
33 tap_code_delay(KC_VOLD, 10);
34 }
35 return false;
36}
37#endif
38
39#ifdef RGB_MATRIX_ENABLE
40void suspend_power_down_kb(void) {
41 /* Disable indicator LEDs when going to sleep */
42 writePin(LED_INDICATOR_0_PIN, 1);
43 writePin(LED_INDICATOR_1_PIN, 1);
44 writePin(LED_INDICATOR_2_PIN, 1);
45 suspend_power_down_user();
46}
47
48void suspend_wakeup_init_kb(void) {
49 /* Restore indicator LEDs state */
50 layer_state_set_kb(layer_state);
51 suspend_wakeup_init_user();
52}
53#endif
diff --git a/keyboards/atlantis/ps17/readme.md b/keyboards/atlantis/ps17/readme.md
new file mode 100644
index 0000000000..69d735739b
--- /dev/null
+++ b/keyboards/atlantis/ps17/readme.md
@@ -0,0 +1,34 @@
1# atlantis/ps17
2
3![atlantis/ps17](https://i.imgur.com/5qGIv2Kh.jpg)
4
5A 17-key hot-swap numpad/macropad with an EC11 clickable rotary encoder (knob) and RGB backlight and underglow
6
7* Keyboard Maintainer: [mjbogusz](https://github.com/mjbogusz)
8* Hardware Supported: Atlantis PS17
9* Hardware Availability: [AliExpress, SpiderIsland Tech Co., Ltd Store](https://www.aliexpress.com/item/1005003058226085.html)
10* Additional photos:
11 * [Full size](https://i.imgur.com/5qGIv2K.jpg)
12 * [PCB front](https://i.imgur.com/OmGBqvC.jpg)
13 * [PCB back](https://i.imgur.com/rvoZZ5f.jpg)
14
15Make example for this keyboard (after setting up your build environment):
16
17 make atlantis/ps17:default
18
19Flashing example for this keyboard:
20
21 make atlantis/ps17:default:flash
22
23See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
24
25## Bootloader
26
27Enter the bootloader in 3 ways:
28
29* **Physical reset button**: Briefly press the button on the back of the PCB
30* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
31
32## Attributions
33
34Pin mapping and LED physical layout based on [Solartempest work](https://github.com/solartempest/qmk_firmware/tree/master/keyboards/solartempest/ps17)
diff --git a/keyboards/atlantis/ps17/rules.mk b/keyboards/atlantis/ps17/rules.mk
new file mode 100644
index 0000000000..4da205a168
--- /dev/null
+++ b/keyboards/atlantis/ps17/rules.mk
@@ -0,0 +1 @@
LTO_ENABLE = yes
diff --git a/keyboards/gray_studio/space65r3/readme.md b/keyboards/gray_studio/space65r3/readme.md
index 4f89d3851a..2de127bd7a 100644
--- a/keyboards/gray_studio/space65r3/readme.md
+++ b/keyboards/gray_studio/space65r3/readme.md
@@ -1,4 +1,4 @@
1# Gray Studio 65 R3 1# Gray Studio Space65 R3
2 2
3A 65% keyboard by Graystudio. PCB designed and manufactured by DEMO Studio. 3A 65% keyboard by Graystudio. PCB designed and manufactured by DEMO Studio.
4 4
diff --git a/keyboards/kbdfans/tiger80/config.h b/keyboards/kbdfans/tiger80/config.h
index e4a815d584..58b4d3f933 100644
--- a/keyboards/kbdfans/tiger80/config.h
+++ b/keyboards/kbdfans/tiger80/config.h
@@ -13,13 +13,9 @@
13 * You should have received a copy of the GNU General Public License 13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */ 15 */
16
17#pragma once
18 16
19#define LOCKING_SUPPORT_ENABLE 17#pragma once
20#define LOCKING_RESYNC_ENABLE
21 18
22#define RGB_DI_PIN B3
23#ifdef RGB_DI_PIN 19#ifdef RGB_DI_PIN
24#define RGBLIGHT_EFFECT_BREATHING 20#define RGBLIGHT_EFFECT_BREATHING
25#define RGBLIGHT_EFFECT_RAINBOW_MOOD 21#define RGBLIGHT_EFFECT_RAINBOW_MOOD
@@ -31,13 +27,8 @@
31#define RGBLIGHT_EFFECT_RGB_TEST 27#define RGBLIGHT_EFFECT_RGB_TEST
32#define RGBLIGHT_EFFECT_ALTERNATING 28#define RGBLIGHT_EFFECT_ALTERNATING
33#define RGBLIGHT_EFFECT_TWINKLE 29#define RGBLIGHT_EFFECT_TWINKLE
34#define RGBLIGHT_DEFAULT_MODE (RGBLIGHT_EFFECT_RAINBOW_MOOD + 6) 30#define RGBLIGHT_DEFAULT_MODE (RGBLIGHT_EFFECT_RAINBOW_MOOD + 6)
35#define RGBLIGHT_DEFAULT_SPD 15 31#define RGBLIGHT_DEFAULT_SPD 15
36#define RGBLED_NUM 20
37#define RGBLIGHT_HUE_STEP 10
38#define RGBLIGHT_SAT_STEP 10
39#define RGBLIGHT_VAL_STEP 10
40#define RGBLIGHT_SLEEP
41#endif 32#endif
42 33
43#define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 2 34#define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 2
diff --git a/keyboards/kbdfans/tiger80/info.json b/keyboards/kbdfans/tiger80/info.json
index b8e4258ed7..c5d677d26e 100644
--- a/keyboards/kbdfans/tiger80/info.json
+++ b/keyboards/kbdfans/tiger80/info.json
@@ -1,12 +1,19 @@
1{ 1{
2 "keyboard_name": "Tiger80",
3 "manufacturer": "KBDFans", 2 "manufacturer": "KBDFans",
4 "url": "", 3 "keyboard_name": "Tiger80",
5 "maintainer": "kbdfans", 4 "maintainer": "kbdfans",
6 "usb": { 5 "bootloader": "atmel-dfu",
7 "vid": "0x4B42", 6 "diode_direction": "COL2ROW",
8 "pid": "0x0011", 7 "features": {
9 "device_version": "0.0.1" 8 "audio": false,
9 "backlight": false,
10 "bootmagic": true,
11 "command": false,
12 "console": false,
13 "extrakey": true,
14 "mousekey": true,
15 "nkro": true,
16 "rgblight": true
10 }, 17 },
11 "matrix_pins": { 18 "matrix_pins": {
12 "cols": ["F7", "F6", "F5", "F4", "F1", "F0", "D3", "D5", "D4", "D6", "D7", "B5", "B6", "C6", "E2", "D0"], 19 "cols": ["F7", "F6", "F5", "F4", "F1", "F0", "D3", "D5", "D4", "D6", "D7", "B5", "B6", "C6", "E2", "D0"],
@@ -15,110 +22,213 @@
15 "diode_direction": "COL2ROW", 22 "diode_direction": "COL2ROW",
16 "indicators": { 23 "indicators": {
17 "caps_lock": "C7", 24 "caps_lock": "C7",
25 "on_state": 1,
18 "scroll_lock": "B2" 26 "scroll_lock": "B2"
19 }, 27 },
28 "matrix_pins": {
29 "cols": ["F7", "F6", "F5", "F4", "F1", "F0", "D3", "D5", "D4", "D6", "D7", "B5", "B6", "C6", "E2", "D0"],
30 "rows": ["B0", "E6", "B1", "B4", "D1", "D2"]
31 },
20 "processor": "atmega32u4", 32 "processor": "atmega32u4",
21 "bootloader": "atmel-dfu", 33 "rgblight": {
22 "layout_aliases": { 34 "brightness_steps": 10,
23 "LAYOUT_all": "LAYOUT_tkl_f13_ansi_tsangan" 35 "hue_steps": 10,
36 "led_count": 20,
37 "pin": "B3",
38 "saturation_steps": 10,
39 "sleep": true
40 },
41 "url": "",
42 "usb": {
43 "device_version": "0.0.1",
44 "pid": "0x0011",
45 "vid": "0x4B42"
24 }, 46 },
25 "community_layouts": ["tkl_f13_ansi_tsangan"], 47 "community_layouts": ["tkl_f13_ansi_tsangan", "tkl_f13_iso_tsangan"],
26 "layouts": { 48 "layouts": {
27 "LAYOUT_tkl_f13_ansi_tsangan": { 49 "LAYOUT_tkl_f13_ansi_tsangan": {
28 "layout": [ 50 "layout": [
29 {"label":"Esc", "x":0, "y":0}, 51 { "label": "Esc", "matrix": [0, 0], "x": 0, "y": 0 },
30 {"label":"F1", "x":1.25, "y":0}, 52 { "label": "F1", "matrix": [0, 1], "x": 1.25, "y": 0 },
31 {"label":"F2", "x":2.25, "y":0}, 53 { "label": "F2", "matrix": [0, 2], "x": 2.25, "y": 0 },
32 {"label":"F3", "x":3.25, "y":0}, 54 { "label": "F3", "matrix": [0, 3], "x": 3.25, "y": 0 },
33 {"label":"F4", "x":4.25, "y":0}, 55 { "label": "F4", "matrix": [0, 4], "x": 4.25, "y": 0 },
34 {"label":"F5", "x":5.5, "y":0}, 56 { "label": "F5", "matrix": [0, 5], "x": 5.5, "y": 0 },
35 {"label":"F6", "x":6.5, "y":0}, 57 { "label": "F6", "matrix": [0, 6], "x": 6.5, "y": 0 },
36 {"label":"F7", "x":7.5, "y":0}, 58 { "label": "F7", "matrix": [0, 7], "x": 7.5, "y": 0 },
37 {"label":"F8", "x":8.5, "y":0}, 59 { "label": "F8", "matrix": [0, 8], "x": 8.5, "y": 0 },
38 {"label":"F9", "x":9.75, "y":0}, 60 { "label": "F9", "matrix": [0, 9], "x": 9.75, "y": 0 },
39 {"label":"F10", "x":10.75, "y":0}, 61 { "label": "F10", "matrix": [0, 10], "x": 10.75, "y": 0 },
40 {"label":"F11", "x":11.75, "y":0}, 62 { "label": "F11", "matrix": [0, 11], "x": 11.75, "y": 0 },
41 {"label":"F12", "x":12.75, "y":0}, 63 { "label": "F12", "matrix": [0, 12], "x": 12.75, "y": 0 },
42 {"label":"F13", "x":14, "y":0}, 64 { "label": "F13", "matrix": [0, 13], "x": 14, "y": 0 },
43 {"label":"PrtSc", "x":15.25, "y":0}, 65 { "label": "PrtSc", "matrix": [0, 14], "x": 15.25, "y": 0 },
44 {"label":"Scroll Lock", "x":16.25, "y":0}, 66 { "label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0 },
45 {"label":"Pause", "x":17.25, "y":0}, 67 { "label": "Pause", "matrix": [3, 15], "x": 17.25, "y": 0 },
46 68 { "label": "`~", "matrix": [1, 0], "x": 0, "y": 1.5 },
47 {"label":"`~", "x":0, "y":1.5}, 69 { "label": "1!", "matrix": [1, 1], "x": 1, "y": 1.5 },
48 {"label":"1!", "x":1, "y":1.5}, 70 { "label": "2@", "matrix": [1, 2], "x": 2, "y": 1.5 },
49 {"label":"2@", "x":2, "y":1.5}, 71 { "label": "3#", "matrix": [1, 3], "x": 3, "y": 1.5 },
50 {"label":"3#", "x":3, "y":1.5}, 72 { "label": "4$", "matrix": [1, 4], "x": 4, "y": 1.5 },
51 {"label":"4$", "x":4, "y":1.5}, 73 { "label": "5%", "matrix": [1, 5], "x": 5, "y": 1.5 },
52 {"label":"5%", "x":5, "y":1.5}, 74 { "label": "6^", "matrix": [1, 6], "x": 6, "y": 1.5 },
53 {"label":"6^", "x":6, "y":1.5}, 75 { "label": "7", "matrix": [1, 7], "x": 7, "y": 1.5 },
54 {"label":"7", "x":7, "y":1.5}, 76 { "label": "8*", "matrix": [1, 8], "x": 8, "y": 1.5 },
55 {"label":"8*", "x":8, "y":1.5}, 77 { "label": "9(", "matrix": [1, 9], "x": 9, "y": 1.5 },
56 {"label":"9(", "x":9, "y":1.5}, 78 { "label": "0)", "matrix": [1, 10], "x": 10, "y": 1.5 },
57 {"label":"0)", "x":10, "y":1.5}, 79 { "label": "-_", "matrix": [1, 11], "x": 11, "y": 1.5 },
58 {"label":"-_", "x":11, "y":1.5}, 80 { "label": "=+", "matrix": [1, 12], "x": 12, "y": 1.5 },
59 {"label":"=+", "x":12, "y":1.5}, 81 { "label": "Backspace", "matrix": [1, 13], "w": 2, "x": 13, "y": 1.5 },
60 {"label":"Backspace", "x":13, "y":1.5, "w":2}, 82 { "label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.5 },
61 {"label":"Insert", "x":15.25, "y":1.5}, 83 { "label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.5 },
62 {"label":"Home", "x":16.25, "y":1.5}, 84 { "label": "PgUp", "matrix": [3, 14], "x": 17.25, "y": 1.5 },
63 {"label":"PgUp", "x":17.25, "y":1.5}, 85 { "label": "Tab", "matrix": [2, 0], "w": 1.5, "x": 0, "y": 2.5 },
64 86 { "label": "Q", "matrix": [2, 1], "x": 1.5, "y": 2.5 },
65 {"label":"Tab", "x":0, "y":2.5, "w":1.5}, 87 { "label": "W", "matrix": [2, 2], "x": 2.5, "y": 2.5 },
66 {"label":"Q", "x":1.5, "y":2.5}, 88 { "label": "E", "matrix": [2, 3], "x": 3.5, "y": 2.5 },
67 {"label":"W", "x":2.5, "y":2.5}, 89 { "label": "R", "matrix": [2, 4], "x": 4.5, "y": 2.5 },
68 {"label":"E", "x":3.5, "y":2.5}, 90 { "label": "T", "matrix": [2, 5], "x": 5.5, "y": 2.5 },
69 {"label":"R", "x":4.5, "y":2.5}, 91 { "label": "Y", "matrix": [2, 6], "x": 6.5, "y": 2.5 },
70 {"label":"T", "x":5.5, "y":2.5}, 92 { "label": "U", "matrix": [2, 7], "x": 7.5, "y": 2.5 },
71 {"label":"Y", "x":6.5, "y":2.5}, 93 { "label": "I", "matrix": [2, 8], "x": 8.5, "y": 2.5 },
72 {"label":"U", "x":7.5, "y":2.5}, 94 { "label": "O", "matrix": [2, 9], "x": 9.5, "y": 2.5 },
73 {"label":"I", "x":8.5, "y":2.5}, 95 { "label": "P", "matrix": [2, 10], "x": 10.5, "y": 2.5 },
74 {"label":"O", "x":9.5, "y":2.5}, 96 { "label": "[{", "matrix": [2, 11], "x": 11.5, "y": 2.5 },
75 {"label":"P", "x":10.5, "y":2.5}, 97 { "label": "]}", "matrix": [2, 12], "x": 12.5, "y": 2.5 },
76 {"label":"[{", "x":11.5, "y":2.5}, 98 { "label": "\\|", "matrix": [2, 13], "w": 1.5, "x": 13.5, "y": 2.5 },
77 {"label":"]}", "x":12.5, "y":2.5}, 99 { "label": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.5 },
78 {"label":"\\|", "x":13.5, "y":2.5, "w":1.5}, 100 { "label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.5 },
79 {"label":"Delete", "x":15.25, "y":2.5}, 101 { "label": "PgDn", "matrix": [4, 14], "x": 17.25, "y": 2.5 },
80 {"label":"End", "x":16.25, "y":2.5}, 102 { "label": "Caps Lock", "matrix": [3, 0], "w": 1.75, "x": 0, "y": 3.5 },
81 {"label":"PgDn", "x":17.25, "y":2.5}, 103 { "label": "A", "matrix": [3, 1], "x": 1.75, "y": 3.5 },
82 104 { "label": "S", "matrix": [3, 2], "x": 2.75, "y": 3.5 },
83 {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, 105 { "label": "D", "matrix": [3, 3], "x": 3.75, "y": 3.5 },
84 {"label":"A", "x":1.75, "y":3.5}, 106 { "label": "F", "matrix": [3, 4], "x": 4.75, "y": 3.5 },
85 {"label":"S", "x":2.75, "y":3.5}, 107 { "label": "G", "matrix": [3, 5], "x": 5.75, "y": 3.5 },
86 {"label":"D", "x":3.75, "y":3.5}, 108 { "label": "H", "matrix": [3, 6], "x": 6.75, "y": 3.5 },
87 {"label":"F", "x":4.75, "y":3.5}, 109 { "label": "J", "matrix": [3, 7], "x": 7.75, "y": 3.5 },
88 {"label":"G", "x":5.75, "y":3.5}, 110 { "label": "K", "matrix": [3, 8], "x": 8.75, "y": 3.5 },
89 {"label":"H", "x":6.75, "y":3.5}, 111 { "label": "L", "matrix": [3, 9], "x": 9.75, "y": 3.5 },
90 {"label":"J", "x":7.75, "y":3.5}, 112 { "label": ";:", "matrix": [3, 10], "x": 10.75, "y": 3.5 },
91 {"label":"K", "x":8.75, "y":3.5}, 113 { "label": "'\"", "matrix": [3, 11], "x": 11.75, "y": 3.5 },
92 {"label":"L", "x":9.75, "y":3.5}, 114 { "label": "Enter", "matrix": [3, 13], "w": 2.25, "x": 12.75, "y": 3.5 },
93 {"label":";:", "x":10.75, "y":3.5}, 115 { "label": "Shift", "matrix": [4, 0], "w": 2.25, "x": 0, "y": 4.5 },
94 {"label":"'\"", "x":11.75, "y":3.5}, 116 { "label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.5 },
95 {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, 117 { "label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.5 },
96 118 { "label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.5 },
97 {"label":"Shift", "x":0, "y":4.5, "w":2.25}, 119 { "label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.5 },
98 {"label":"Z", "x":2.25, "y":4.5}, 120 { "label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.5 },
99 {"label":"X", "x":3.25, "y":4.5}, 121 { "label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.5 },
100 {"label":"C", "x":4.25, "y":4.5}, 122 { "label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.5 },
101 {"label":"V", "x":5.25, "y":4.5}, 123 { "label": ",<", "matrix": [4, 9], "x": 9.25, "y": 4.5 },
102 {"label":"B", "x":6.25, "y":4.5}, 124 { "label": ".>", "matrix": [4, 10], "x": 10.25, "y": 4.5 },
103 {"label":"N", "x":7.25, "y":4.5}, 125 { "label": "/?", "matrix": [4, 11], "x": 11.25, "y": 4.5 },
104 {"label":"M", "x":8.25, "y":4.5}, 126 { "label": "Shift", "matrix": [4, 13], "w": 2.75, "x": 12.25, "y": 4.5 },
105 {"label":",<", "x":9.25, "y":4.5}, 127 { "label": "\u2191", "matrix": [4, 15], "x": 16.25, "y": 4.5 },
106 {"label":".>", "x":10.25, "y":4.5}, 128 { "label": "Ctrl", "matrix": [5, 0], "w": 1.5, "x": 0, "y": 5.5 },
107 {"label":"/?", "x":11.25, "y":4.5}, 129 { "label": "Win", "matrix": [5, 1], "x": 1.5, "y": 5.5 },
108 {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, 130 { "label": "Alt", "matrix": [5, 2], "w": 1.5, "x": 2.5, "y": 5.5 },
109 {"label":"\u2191", "x":16.25, "y":4.5}, 131 { "label": "Space", "matrix": [5, 6], "w": 7, "x": 4, "y": 5.5 },
110 132 { "label": "Alt", "matrix": [5, 10], "w": 1.5, "x": 11, "y": 5.5 },
111 {"label":"Ctrl", "x":0, "y":5.5, "w":1.5}, 133 { "label": "Win", "matrix": [5, 11], "x": 12.5, "y": 5.5 },
112 {"label":"Win", "x":1.5, "y":5.5}, 134 { "label": "Ctrl", "matrix": [5, 12], "w": 1.5, "x": 13.5, "y": 5.5 },
113 {"label":"Alt", "x":2.5, "y":5.5, "w":1.5}, 135 { "label": "\u2190", "matrix": [5, 13], "x": 15.25, "y": 5.5 },
114 {"label":"Space", "x":4, "y":5.5, "w":7}, 136 { "label": "\u2193", "matrix": [5, 14], "x": 16.25, "y": 5.5 },
115 {"label":"Alt", "x":11, "y":5.5, "w":1.5}, 137 { "label": "\u2192", "matrix": [5, 15], "x": 17.25, "y": 5.5 }
116 {"label":"Win", "x":12.5, "y":5.5}, 138 ]
117 {"label":"Ctrl", "x":13.5, "y":5.5, "w":1.5}, 139 },
118 {"label":"\u2190", "x":15.25, "y":5.5}, 140 "LAYOUT_tkl_f13_iso_tsangan": {
119 {"label":"\u2193", "x":16.25, "y":5.5}, 141 "layout": [
120 {"label":"\u2192", "x":17.25, "y":5.5} 142 { "label": "K00", "matrix": [0, 0], "x": 0, "y": 0 },
143 { "label": "K01", "matrix": [0, 1], "x": 1, "y": 0 },
144 { "label": "K02", "matrix": [0, 2], "x": 2, "y": 0 },
145 { "label": "K03", "matrix": [0, 3], "x": 3, "y": 0 },
146 { "label": "K04", "matrix": [0, 4], "x": 4, "y": 0 },
147 { "label": "K05", "matrix": [0, 5], "x": 5, "y": 0 },
148 { "label": "K06", "matrix": [0, 6], "x": 6, "y": 0 },
149 { "label": "K07", "matrix": [0, 7], "x": 7, "y": 0 },
150 { "label": "K08", "matrix": [0, 8], "x": 8, "y": 0 },
151 { "label": "K09", "matrix": [0, 9], "x": 9, "y": 0 },
152 { "label": "K0A", "matrix": [0, 10], "x": 10, "y": 0 },
153 { "label": "K0B", "matrix": [0, 11], "x": 11, "y": 0 },
154 { "label": "K0C", "matrix": [0, 12], "x": 12, "y": 0 },
155 { "label": "K0D", "matrix": [0, 13], "x": 13, "y": 0 },
156 { "label": "K0E", "matrix": [0, 14], "x": 14, "y": 0 },
157 { "label": "K0F", "matrix": [0, 15], "x": 15, "y": 0 },
158 { "label": "K3F", "matrix": [3, 15], "x": 16, "y": 0 },
159 { "label": "K10", "matrix": [1, 0], "x": 17, "y": 0 },
160 { "label": "K11", "matrix": [1, 1], "x": 18, "y": 0 },
161 { "label": "K12", "matrix": [1, 2], "x": 19, "y": 0 },
162 { "label": "K13", "matrix": [1, 3], "x": 20, "y": 0 },
163 { "label": "K14", "matrix": [1, 4], "x": 21, "y": 0 },
164 { "label": "K15", "matrix": [1, 5], "x": 22, "y": 0 },
165 { "label": "K16", "matrix": [1, 6], "x": 23, "y": 0 },
166 { "label": "K17", "matrix": [1, 7], "x": 24, "y": 0 },
167 { "label": "K18", "matrix": [1, 8], "x": 25, "y": 0 },
168 { "label": "K19", "matrix": [1, 9], "x": 26, "y": 0 },
169 { "label": "K1A", "matrix": [1, 10], "x": 27, "y": 0 },
170 { "label": "K1B", "matrix": [1, 11], "x": 28, "y": 0 },
171 { "label": "K1C", "matrix": [1, 12], "x": 29, "y": 0 },
172 { "label": "K1D", "matrix": [1, 13], "x": 30, "y": 0 },
173 { "label": "K1E", "matrix": [1, 14], "x": 31, "y": 0 },
174 { "label": "K1F", "matrix": [1, 15], "x": 32, "y": 0 },
175 { "label": "K3E", "matrix": [3, 14], "x": 33, "y": 0 },
176 { "label": "K20", "matrix": [2, 0], "x": 34, "y": 0 },
177 { "label": "K21", "matrix": [2, 1], "x": 35, "y": 0 },
178 { "label": "K22", "matrix": [2, 2], "x": 36, "y": 0 },
179 { "label": "K23", "matrix": [2, 3], "x": 37, "y": 0 },
180 { "label": "K24", "matrix": [2, 4], "x": 38, "y": 0 },
181 { "label": "K25", "matrix": [2, 5], "x": 39, "y": 0 },
182 { "label": "K26", "matrix": [2, 6], "x": 40, "y": 0 },
183 { "label": "K27", "matrix": [2, 7], "x": 41, "y": 0 },
184 { "label": "K28", "matrix": [2, 8], "x": 42, "y": 0 },
185 { "label": "K29", "matrix": [2, 9], "x": 43, "y": 0 },
186 { "label": "K2A", "matrix": [2, 10], "x": 44, "y": 0 },
187 { "label": "K2B", "matrix": [2, 11], "x": 45, "y": 0 },
188 { "label": "K2C", "matrix": [2, 12], "x": 46, "y": 0 },
189 { "label": "K2D", "matrix": [2, 13], "x": 47, "y": 0 },
190 { "label": "K2E", "matrix": [2, 14], "x": 48, "y": 0 },
191 { "label": "K2F", "matrix": [2, 15], "x": 49, "y": 0 },
192 { "label": "K4E", "matrix": [4, 14], "x": 50, "y": 0 },
193 { "label": "K30", "matrix": [3, 0], "x": 51, "y": 0 },
194 { "label": "K31", "matrix": [3, 1], "x": 52, "y": 0 },
195 { "label": "K32", "matrix": [3, 2], "x": 53, "y": 0 },
196 { "label": "K33", "matrix": [3, 3], "x": 54, "y": 0 },
197 { "label": "K34", "matrix": [3, 4], "x": 55, "y": 0 },
198 { "label": "K35", "matrix": [3, 5], "x": 56, "y": 0 },
199 { "label": "K36", "matrix": [3, 6], "x": 57, "y": 0 },
200 { "label": "K37", "matrix": [3, 7], "x": 58, "y": 0 },
201 { "label": "K38", "matrix": [3, 8], "x": 59, "y": 0 },
202 { "label": "K39", "matrix": [3, 9], "x": 60, "y": 0 },
203 { "label": "K3A", "matrix": [3, 10], "x": 61, "y": 0 },
204 { "label": "K3B", "matrix": [3, 11], "x": 62, "y": 0 },
205 { "label": "K3D", "matrix": [3, 13], "x": 63, "y": 0 },
206 { "label": "K40", "matrix": [4, 0], "x": 64, "y": 0 },
207 { "label": "K41", "matrix": [4, 1], "x": 65, "y": 0 },
208 { "label": "K42", "matrix": [4, 2], "x": 66, "y": 0 },
209 { "label": "K43", "matrix": [4, 3], "x": 67, "y": 0 },
210 { "label": "K44", "matrix": [4, 4], "x": 68, "y": 0 },
211 { "label": "K45", "matrix": [4, 5], "x": 69, "y": 0 },
212 { "label": "K46", "matrix": [4, 6], "x": 70, "y": 0 },
213 { "label": "K47", "matrix": [4, 7], "x": 71, "y": 0 },
214 { "label": "K48", "matrix": [4, 8], "x": 72, "y": 0 },
215 { "label": "K49", "matrix": [4, 9], "x": 73, "y": 0 },
216 { "label": "K4A", "matrix": [4, 10], "x": 74, "y": 0 },
217 { "label": "K4B", "matrix": [4, 11], "x": 75, "y": 0 },
218 { "label": "K4D", "matrix": [4, 13], "x": 76, "y": 0 },
219 { "label": "K4F", "matrix": [4, 15], "x": 77, "y": 0 },
220 { "label": "K50", "matrix": [5, 0], "x": 78, "y": 0 },
221 { "label": "K51", "matrix": [5, 1], "x": 79, "y": 0 },
222 { "label": "K52", "matrix": [5, 2], "x": 80, "y": 0 },
223 { "label": "K56", "matrix": [5, 6], "x": 81, "y": 0 },
224 { "label": "K5A", "matrix": [5, 10], "x": 82, "y": 0 },
225 { "label": "K5B", "matrix": [5, 11], "x": 83, "y": 0 },
226 { "label": "K5C", "matrix": [5, 12], "x": 84, "y": 0 },
227 { "label": "K5D", "matrix": [5, 13], "x": 85, "y": 0 },
228 { "label": "K5E", "matrix": [5, 14], "x": 86, "y": 0 },
229 { "label": "K5F", "matrix": [5, 15], "x": 87, "y": 0 }
121 ] 230 ]
122 } 231 }
123 } 232 }
124} 233}
234
diff --git a/keyboards/kbdfans/tiger80/keymaps/iso/keymap.c b/keyboards/kbdfans/tiger80/keymaps/iso/keymap.c
new file mode 100644
index 0000000000..6e6dd4c48b
--- /dev/null
+++ b/keyboards/kbdfans/tiger80/keymaps/iso/keymap.c
@@ -0,0 +1,30 @@
1/* Copyright 2023 DZTECH <moyi4681@Live.cn>
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include QMK_KEYBOARD_H
18
19const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
20
21 [0] = LAYOUT_tkl_f13_iso_tsangan(
22 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_MUTE, KC_PSCR, KC_SCRL, KC_PAUS,
23 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,
24 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_ENT, KC_DEL, KC_END, KC_PGDN,
25 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_BSLS,
26 KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
27 KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
28 ),
29
30};
diff --git a/keyboards/kbdfans/tiger80/rules.mk b/keyboards/kbdfans/tiger80/rules.mk
index b851d0ab39..e69de29bb2 100644
--- a/keyboards/kbdfans/tiger80/rules.mk
+++ b/keyboards/kbdfans/tiger80/rules.mk
@@ -1,12 +0,0 @@
1# Build Options
2# change yes to no to disable
3#
4BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
5MOUSEKEY_ENABLE = yes # Mouse keys
6EXTRAKEY_ENABLE = yes # Audio control and System control
7CONSOLE_ENABLE = no # Console for debug
8COMMAND_ENABLE = no # Commands for debug and configuration
9NKRO_ENABLE = yes # Enable N-Key Rollover
10BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
11RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
12AUDIO_ENABLE = no # Audio output
diff --git a/keyboards/kbdfans/tiger80/tiger80.c b/keyboards/kbdfans/tiger80/tiger80.c
deleted file mode 100644
index 8348a142a2..0000000000
--- a/keyboards/kbdfans/tiger80/tiger80.c
+++ /dev/null
@@ -1,17 +0,0 @@
1/* Copyright 2022 DZTECH <moyi4681@Live.cn>
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include "tiger80.h"
diff --git a/keyboards/kbdfans/tiger80/tiger80.h b/keyboards/kbdfans/tiger80/tiger80.h
deleted file mode 100644
index 376759a55d..0000000000
--- a/keyboards/kbdfans/tiger80/tiger80.h
+++ /dev/null
@@ -1,35 +0,0 @@
1/* Copyright 2022 DZTECH <moyi4681@Live.cn>
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#pragma once
18
19#include "quantum.h"
20
21#define LAYOUT_tkl_f13_ansi_tsangan( \
22 K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K3F, \
23 K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, K3E, \
24 K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K4E, \
25 K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \
26 K40, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4D, K4F, \
27 K50, K51, K52, K56, K5A, K5B, K5C, K5D, K5E, K5F \
28) { \
29 { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \
30 { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \
31 { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \
32 { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E, K3F }, \
33 { K40, KC_NO, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, KC_NO, K4D, K4E, K4F }, \
34 { K50, K51, K52, KC_NO, KC_NO, KC_NO, K56, KC_NO, KC_NO, KC_NO, K5A, K5B, K5C, K5D, K5E, K5F } \
35}
diff --git a/keyboards/keychron/common/keychron_common.c b/keyboards/keychron/common/keychron_common.c
index a04f3b7264..a6250966f3 100644
--- a/keyboards/keychron/common/keychron_common.c
+++ b/keyboards/keychron/common/keychron_common.c
@@ -41,6 +41,20 @@ void housekeeping_task_keychron(void) {
41 41
42bool process_record_keychron(uint16_t keycode, keyrecord_t *record) { 42bool process_record_keychron(uint16_t keycode, keyrecord_t *record) {
43 switch (keycode) { 43 switch (keycode) {
44 case QK_KB_0:
45 if (record->event.pressed) {
46 register_code(KC_MISSION_CONTROL);
47 } else {
48 unregister_code(KC_MISSION_CONTROL);
49 }
50 return false; // Skip all further processing of this key
51 case QK_KB_1:
52 if (record->event.pressed) {
53 register_code(KC_LAUNCHPAD);
54 } else {
55 unregister_code(KC_LAUNCHPAD);
56 }
57 return false; // Skip all further processing of this key
44 case KC_LOPTN: 58 case KC_LOPTN:
45 case KC_ROPTN: 59 case KC_ROPTN:
46 case KC_LCMMD: 60 case KC_LCMMD: