Merge remote-tracking branch 'upstream/develop' into layoutless-keymap-json

pull/23451/head
Nick Brassel 2024-08-19 09:11:38 +10:00
commit ebc411afe8
No known key found for this signature in database
67 changed files with 836 additions and 1962 deletions

View File

@ -1,7 +1,7 @@
blank_issues_enabled: false
contact_links:
- name: QMK Discord
url: https://discord.gg/Uq7gcHh
url: https://discord.gg/qmk
about: Ask questions, discuss issues and features. Chill.
- name: OLKB Subreddit
url: https://www.reddit.com/r/olkb

View File

@ -35,15 +35,12 @@ endif
# Force expansion
override TARGET := $(TARGET)
$(info TARGET=$(TARGET))
ifneq ($(FORCE_LAYOUT),)
override TARGET := $(TARGET)_$(FORCE_LAYOUT)
$(info TARGET=$(TARGET))
endif
ifneq ($(CONVERT_TO),)
override TARGET := $(TARGET)_$(CONVERT_TO)
$(info TARGET=$(TARGET))
endif
# Object files and generated keymap directory

View File

@ -563,6 +563,15 @@
"plain60": {
"target": "evyd13/plain60"
},
"planck/ez": {
"target": "zsa/planck_ez/base"
},
"planck/ez/base": {
"target": "zsa/planck_ez/base"
},
"planck/ez/glow": {
"target": "zsa/planck_ez/glow"
},
"ploopyco/trackball": {
"target": "ploopyco/trackball/rev1_005"
},

View File

@ -31,4 +31,4 @@ Commenting on your pull request and being responsive to questions, comments, and
### Ask for Help
Having your submission flagged may have caught you off guard. If you find yourself intimidated or overwhelmed, let us know. Comment on your pull request, or [reach out to the QMK team on Discord](https://discord.gg/Uq7gcHh).
Having your submission flagged may have caught you off guard. If you find yourself intimidated or overwhelmed, let us know. Comment on your pull request, or [reach out to the QMK team on Discord](https://discord.gg/qmk).

View File

@ -11,7 +11,7 @@ Third-party contributions help us grow and improve QMK. We want to make the pull
## I Don't Want to Read This Whole Thing! I Just Have a Question!
If you'd like to ask questions about QMK you can do so on the [OLKB Subreddit](https://reddit.com/r/olkb) or on [Discord](https://discord.gg/Uq7gcHh).
If you'd like to ask questions about QMK you can do so on the [OLKB Subreddit](https://reddit.com/r/olkb) or on [Discord](https://discord.gg/qmk).
Please keep these things in mind:
@ -29,7 +29,7 @@ QMK is largely written in C, with specific features and parts written in C++. It
# Where Can I Go for Help?
If you need help you can [open an issue](https://github.com/qmk/qmk_firmware/issues) or [chat on Discord](https://discord.gg/Uq7gcHh).
If you need help you can [open an issue](https://github.com/qmk/qmk_firmware/issues) or [chat on Discord](https://discord.gg/qmk).
# How Do I Make a Contribution?
@ -128,7 +128,7 @@ We also ask that you follow these guidelines:
Before you put a lot of work into building your new feature you should make sure you are implementing it in the best way. You can get a basic understanding of QMK by reading [Understanding QMK](understanding_qmk), which will take you on a tour of the QMK program flow. From here you should talk to us to get a sense of the best way to implement your idea. There are two main ways to do this:
* [Chat on Discord](https://discord.gg/Uq7gcHh)
* [Chat on Discord](https://discord.gg/qmk)
* [Open an Issue](https://github.com/qmk/qmk_firmware/issues/new)
Feature and Bug Fix PRs affect all keyboards. We are also in the process of restructuring QMK. For this reason it is especially important for significant changes to be discussed before implementation has happened. If you open a PR without talking to us first please be prepared to do some significant rework if your choices do not mesh well with our planned direction.

View File

@ -184,7 +184,7 @@ Whenever possible you should customize your keyboard by using `process_record_*(
### Example `matrix_scan_*` Implementation
This example has been deliberately omitted. You should understand enough about QMK internals to write this without an example before hooking into such a performance sensitive area. If you need help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) or [chat with us on Discord](https://discord.gg/Uq7gcHh).
This example has been deliberately omitted. You should understand enough about QMK internals to write this without an example before hooking into such a performance sensitive area. If you need help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) or [chat with us on Discord](https://discord.gg/qmk).
### `matrix_scan_*` Function Documentation

View File

@ -40,7 +40,7 @@ That's amazing! We would love to assist you with that!
In fact, we have a [whole page](https://qmk.fm/powered/) dedicated to adding QMK Branding to your page and keyboard. This covers pretty much everything you need (knowledge and images) to officially support QMK.
If you have any questions about this, open an issue or head to [Discord](https://discord.gg/Uq7gcHh).
If you have any questions about this, open an issue or head to [Discord](https://discord.gg/qmk).
## What Differences Are There Between QMK and TMK?

View File

@ -231,7 +231,7 @@ Once you have confirmed that the keyboard is working, if you have used a seperat
If you found this fullfilling you could experiment by adding additional features such as [in switch LEDs](https://geekhack.org/index.php?topic=94258.0), [in switch RGB](https://www.reddit.com/r/MechanicalKeyboards/comments/5s1l5u/photoskeyboard_science_i_made_a_handwired_rgb/), [RGB underglow](https://medium.com/@DavidNZ/hand-wired-custom-keyboard-cdd14429c7b3#.7a1ovebsk) or even an [OLED display!](https://www.reddit.com/r/olkb/comments/5zy7og/adding_ssd1306_oled_display_to_your_build/)
There are a lot of possibilities inside the firmware - explore [docs.qmk.fm](https://docs.qmk.fm) for a full feature list, and dive into the different keyboards to see how people use all of them. You can always stop by [the OLKB subreddit](https://reddit.com/r/olkb) or [QMK Discord](https://discord.gg/Uq7gcHh) for help!
There are a lot of possibilities inside the firmware - explore [docs.qmk.fm](https://docs.qmk.fm) for a full feature list, and dive into the different keyboards to see how people use all of them. You can always stop by [the OLKB subreddit](https://reddit.com/r/olkb) or [QMK Discord](https://discord.gg/qmk) for help!
## Links to Other Guides

View File

@ -32,7 +32,7 @@ There are a lot of ways you can contribute to the QMK Community. The easiest way
* Help people out on our forums and chat rooms:
* [/r/olkb](https://www.reddit.com/r/olkb/)
* [Discord Server](https://discord.gg/Uq7gcHh)
* [Discord Server](https://discord.gg/qmk)
* Contribute to our documentation by clicking "Edit This Page" at the bottom
* [Report a bug](https://github.com/qmk/qmk_firmware/issues/new/choose)
* [Open a Pull Request](contributing)

View File

@ -15,7 +15,7 @@ Different keyboards have different ways to enter this special mode. If your PCB
* Press the physical `RESET` button, usually located on the underside of the PCB
* Locate header pins on the PCB labeled `RESET` and `GND`, and short them together while plugging your PCB in
If you've attempted all of the above to no avail, and the main chip on the board says `STM32` or `RP2-B1` on it, this may be a bit more complicated. Generally your best bet is to ask on [Discord](https://discord.gg/Uq7gcHh) for assistance. It's likely some photos of the board will be asked for -- if you can get them ready beforehand it'll help move things along!
If you've attempted all of the above to no avail, and the main chip on the board says `STM32` or `RP2-B1` on it, this may be a bit more complicated. Generally your best bet is to ask on [Discord](https://discord.gg/qmk) for assistance. It's likely some photos of the board will be asked for -- if you can get them ready beforehand it'll help move things along!
Otherwise, you should see a message in yellow, similar to this in QMK Toolbox:
@ -129,4 +129,4 @@ Congrats! Your custom firmware has been programmed to your keyboard and you're r
With a little bit of luck everything will work perfectly, but if not there are steps that will help you figure out what's wrong.
Testing your keyboard is usually pretty straightforward. Press every single key and make sure it sends the keys you expect. You can use [QMK Configurator](https://config.qmk.fm/#/test/)'s test mode to check your keyboard, even if it doesn't run QMK.
Still not working? Browse the FAQ topics for more information, or [chat with us on Discord](https://discord.gg/Uq7gcHh).
Still not working? Browse the FAQ topics for more information, or [chat with us on Discord](https://discord.gg/qmk).

View File

@ -2,7 +2,7 @@
This is a non-exhaustive checklist of what the QMK Collaborators will be checking when reviewing submitted PRs.
If there are any inconsistencies with these recommendations, you're best off [creating an issue](https://github.com/qmk/qmk_firmware/issues/new) against this document, or getting in touch with a QMK Collaborator on [Discord](https://discord.gg/Uq7gcHh).
If there are any inconsistencies with these recommendations, you're best off [creating an issue](https://github.com/qmk/qmk_firmware/issues/new) against this document, or getting in touch with a QMK Collaborator on [Discord](https://discord.gg/qmk).
## Requirements for all PRs

View File

@ -6,7 +6,7 @@ Please read our [Code of Conduct](https://qmk.fm/coc/) before participating in a
## Realtime Chat
If you need help with something, the best place to get quick support is going to be on our [Discord Server](https://discord.gg/Uq7gcHh). There is usually somebody online, and there are a bunch of very helpful people there.
If you need help with something, the best place to get quick support is going to be on our [Discord Server](https://discord.gg/qmk). There is usually somebody online, and there are a bunch of very helpful people there.
## OLKB Subreddit

View File

@ -382,15 +382,23 @@ static bool is_on = false;
static bool is_dynamic_recording = false;
static uint16_t dynamic_loop_timer;
void dynamic_macro_record_start_user(int8_t direction) {
bool dynamic_macro_record_start_kb(int8_t direction) {
if (!dynamic_macro_record_start_user(direction)) {
return false;
}
is_dynamic_recording = true;
dynamic_loop_timer = timer_read();
ergodox_right_led_1_on();
return true;
}
void dynamic_macro_record_end_user(int8_t direction) {
bool dynamic_macro_record_end_kb(int8_t direction) {
if (!dynamic_macro_record_end_user(direction)) {
return false;
}
is_dynamic_recording = false;
layer_state_set_user(layer_state);
return true;
}
#endif

View File

@ -206,11 +206,19 @@ void update_layer_leds(void) {
#endif
void dynamic_macro_record_start_user(int8_t direction) {
bool dynamic_macro_record_start_kb(int8_t direction) {
if (!dynamic_macro_record_start_user(direction)) {
return false;
}
isRecording++;
blink_cycle_timer = timer_read();
return true;
}
void dynamic_macro_record_end_user(int8_t direction) {
bool dynamic_macro_record_end_kb(int8_t direction) {
if (!dynamic_macro_record_end_user(direction)) {
return false;
}
if (isRecording) isRecording--;
return true;
}

View File

@ -1,170 +0,0 @@
#include QMK_KEYBOARD_H
#include "keymap_japanese.h"
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
// 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.
enum layer_number {
_BASE = 0,
_LOWER,
_RAISE,
_ADJUST,
};
enum custom_keycodes {
RGBRST = SAFE_RANGE,
LOWER,
RAISE,
KANJI,
};
// enum tapdances{
// TD_CODO = 0,
// TD_SLRO,
// };
// Layer Mode aliases
#define KC_MLAD MO(_ADJUST)
// Base layer mod tap
#define KC_A_SF LSFT_T(KC_A)
#define KC_Z_CT LCTL_T(KC_Z)
#define KC_X_AL LALT_T(KC_X)
#define KC_C_GU LGUI_T(KC_C)
#define KC_SSCT RCTL_T(KC_SLSH)
#define KC_ENSF RSFT_T(KC_ENT)
// Lower layer mod tap
#define KC_F6SF LSFT_T(KC_F6)
#define KC_BSSF RSFT_T(KC_BSLS)
#define KC_11CT LCTL_T(KC_F11)
#define KC_12AL LALT_T(KC_F12)
// Layer tap
#define KC_BSLO LT(_LOWER, KC_BSPC)
#define KC_SPRA LT(_RAISE, KC_SPC)
// Tap dance
// #define KC_CODO TD(TD_CODO)
// #define KC_SLRO TD(TD_SLRO)
// tap_dance_action_t tap_dance_actions[] = {
// [TD_CODO] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_DOT),
// [TD_SLRO] = ACTION_TAP_DANCE_DOUBLE(KC_SLSH, JP_BSLS),
// };
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT(
//,---------------------------------------------------------------------------------------------------.
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
KC_A_SF, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENSF,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
KC_Z_CT, KC_X_AL, KC_C_GU, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SSCT,
//`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
KC_BSLO, KC_SPRA
// `---------|---------'
),
[_LOWER] = LAYOUT(
//,---------------------------------------------------------------------------------------------------.
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, JP_YEN, KC_LBRC, KC_RBRC,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
KC_F6SF, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, KC_SCLN, KC_QUOT, KC_BSSF,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
KC_11CT, KC_12AL, KC_ESC, KC_TAB, KANJI, KC_DEL, XXXXXXX, XXXXXXX, KC_GRV, JP_BSLS,
//`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
_______, KC_MLAD
// `---------|---------'
),
[_RAISE] = LAYOUT(
//,---------------------------------------------------------------------------------------------------.
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_LSFT,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
KC_LCTL, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, KC_MINS, JP_BSLS, KC_COMM, KC_DOT, KC_SSCT,
//`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
_______, _______
// `---------|---------'
),
[_ADJUST] = LAYOUT(
//,---------------------------------------------------------------------------------------------------.
QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_INS, KC_PSCR,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_NUM,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX,
//`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
_______, _______
// `---------|---------'
)
};
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_BSLO:
return TAPPING_LAYER_TERM;
case KC_SPRA:
return TAPPING_LAYER_TERM;
default:
return TAPPING_TERM;
}
}
int RGB_current_mode;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
bool result = false;
switch (keycode) {
case KANJI:
if (record->event.pressed) {
if (keymap_config.swap_lalt_lgui == false) {
register_code(KC_LNG2);
} else {
SEND_STRING(SS_LALT("`"));
}
} else {
unregister_code(KC_LNG2);
}
break;
#ifdef RGBLIGHT_ENABLE
//led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
case RGB_MOD:
if (record->event.pressed) {
rgblight_mode(RGB_current_mode);
rgblight_step();
RGB_current_mode = rgblight_config.mode;
}
break;
case RGBRST:
if (record->event.pressed) {
eeconfig_update_rgblight_default();
rgblight_enable();
RGB_current_mode = rgblight_config.mode;
}
break;
#endif
default:
result = true;
break;
}
return result;
}
void keyboard_post_init_user(void) {
#ifdef RGBLIGHT_ENABLE
RGB_current_mode = rgblight_config.mode;
#endif
}

View File

@ -1,55 +0,0 @@
# JISキーボードライクなキーマップ
## 概要
 デフォルトキーマップの記号類をJISライクな配置に揃えなおしたものです。
## キーマップの見かた
qmk_firmware\tmk_core\common\keycode.h
に基本的なキーコードがあります。また、Keymap.cの上部にカスタムしたKC_で始まるものを登録しています。
Leyer Tap、Mod TapというQMKの機能を使っています。
Layer Tapはタップで指定したキー、長押しで指定したレイヤーに移動します。
LT(RAISE, KC_V) → タップでV、長押しでRAISEレイヤー移動
Mod Tapはタップで視程したキー、長押しで視程したレイヤーに移動します。
LSFT_T(KC_Z) → タップでZ、長押しで左シフト
もう少し詳しい内容についてはQMK Documentをお読みいただくかネットを検索すれば情報が載っていますので別途検索してみてください。
## 機能
 QWERTYキーマップをベースにしていて、LowerレイヤーとRaiseレイヤーに他のキーを配置しています。
 Lowerを最初し続けながらRaiseを同時押しするとAdjustレイヤーを使うことが出来ます。
## OS切り替え方法
 Adjustレイヤーにあります。LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来ます。
- KNRM: QMKのーマル状態です。macだと正常に使えるはずです
- KSWP: ーマル状態のままWindowsで使用するとALTキーとGUIwinキーが逆ですので、それを入れ換えます。Windowsユーザーはこちらのモードにしてください
## IME切り替え方法
 Winの場合、LowerレイヤーにKANJIキー半角/全角 漢字がありますので、Lower+KANJIで切り替えてください。
## ソフトウェアリセットについて
 キーボードにはハードウェアのリセットボタンが付いていますが、ソフトウェアリセットをかけられます。
 LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来、AdjustレイヤーのRESETを押下するとリセットがかかります。
## LEDの点灯切り替え方法
 Adjustレイヤーにあります。LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来ます。
- RGBRST: LEDのリセット
- RGB_TOG: LEDのON/OFF切り替え
- RGB_MOD: LEDの光り方の変更
- RGB_HUI: Hue+ 色合いを変更
- RGB_HUD: Hue- 色合いを変更
- RGB_SAI: Saturation+ 色の濃さを変更
- RGB_SAD: Saturation- 色の濃さを変更
- RGB_VAI: Value+ 明るさを変更
- RGB_VAD: Value- 明るさを変更

View File

@ -1,17 +0,0 @@
# 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
#
# If your custom treadstone32 pcb, you can rewrite to yes.
RGBLIGHT_ENABLE = yes # LED underglow (Enable WS2812 RGB underlight.)
# Other selectable option
IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone)
ifeq ($(strip $(LED_ANIMATIONS)), yes)
OPT_DEFS += -DLED_ANIMATIONS
endif
ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes)
OPT_DEFS += -DIOS_DEVICE_ENABLE
endif

View File

@ -1,49 +0,0 @@
/* Copyright 2020 marksard
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
// place overrides here
#ifdef TAPPING_TERM
#undef TAPPING_TERM
#endif
#define TAPPING_TERM 225
#ifdef MOUSEKEY_ENABLE
#undef MOUSEKEY_INTERVAL
#define MOUSEKEY_INTERVAL 1
#undef MOUSEKEY_TIME_TO_MAX
#define MOUSEKEY_TIME_TO_MAX 150
#undef MOUSEKEY_MAX_SPEED
#define MOUSEKEY_MAX_SPEED 3
#undef MOUSEKEY_MOVE_DELTA
#define MOUSEKEY_MOVE_DELTA 4
#undef MOUSEKEY_DELAY
#define MOUSEKEY_DELAY 0
#endif
// If you use the HashTwenty(alpha), please enable USE_HASHTWENTY
// #define ANGELINA_KEYMAP
// If you plug in the USB on the right side, please enable MASTER_RIGHT
// #define RHYMESTONE_RIGHTHAND
#define OLED_FONT_H "keyboards/marksard/treadstone48/common/glcdfont.c"

View File

@ -1,231 +0,0 @@
/* Copyright 2020 marksard
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "../common/oled_helper.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.
enum layer_number {
_BASE = 0,
_LOWER,
_RAISE,
_ADJUST,
};
enum custom_keycodes {
LOWER = SAFE_RANGE,
RAISE,
ADJUST,
KANJI,
RGBRST
};
#define KC_TBSF LSFT_T(KC_TAB)
#define KC_ALAP LALT_T(KC_APP)
#define KC_ROSF RSFT_T(KC_INT1)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_base(
//,--------------------------------------------------------------------------------------------------------------------.
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------|
KC_TBSF, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, 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_UP,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_ALAP, KC_LEFT, KC_DOWN, KC_RGHT,
//`-------------------------------------------------------------------------------------------------------------------'
KC_ROSF
// ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
),
[_LOWER] = LAYOUT_base(
//,--------------------------------------------------------------------------------------------------------------------.
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, KC_INT3, KC_LBRC, KC_RBRC, KC_DEL,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------|
_______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, KC_SCLN, KC_QUOT, KC_BSLS, _______,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
_______, KC_F11, KC_F12, XXXXXXX, XXXXXXX, KANJI, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, KC_INT1, KC_PGUP,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
_______, _______, _______, _______, KC_DEL, _______, _______, XXXXXXX, KC_HOME, KC_PGDN, KC_END,
//`-------------------------------------------------------------------------------------------------------------------'
_______
// ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
),
[_RAISE] = LAYOUT_base(
//,--------------------------------------------------------------------------------------------------------------------.
_______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, XXXXXXX,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------|
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_4, KC_5, KC_6, KC_QUOT, _______,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_1, KC_2, KC_3, KC_INT1, XXXXXXX,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
_______, _______, _______, _______, _______, _______, _______, KC_0, KC_DOT, KC_COMM, KC_SLSH,
//`-------------------------------------------------------------------------------------------------------------------'
_______
// ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
),
[_ADJUST] = LAYOUT_base(
//,--------------------------------------------------------------------------------------------------------------------.
XXXXXXX, QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_U, KC_HOME, KC_PGUP, XXXXXXX,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------|
XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, KC_WH_R, KC_WH_D, KC_END, KC_PGDN, XXXXXXX,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
_______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, KC_MS_U,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
_______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R,
//`-------------------------------------------------------------------------------------------------------------------'
_______
// ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
)
};
#define L_BASE _BASE
#define L_LOWER (1<<_LOWER)
#define L_RAISE (1<<_RAISE)
#define L_ADJUST (1<<_ADJUST)
#define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER)
#ifdef OLED_ENABLE
#include <stdio.h>
#include <string.h>
typedef struct {
uint8_t state;
char name[8];
}LAYER_DISPLAY_NAME;
#define LAYER_DISPLAY_MAX 5
const LAYER_DISPLAY_NAME layer_display_name[LAYER_DISPLAY_MAX] = {
{L_BASE, "Base"},
{L_BASE + 1, "Base"},
{L_LOWER, "Lower"},
{L_RAISE, "Raise"},
{L_ADJUST_TRI, "Adjust"}
};
static inline const char* get_leyer_status(void) {
for (uint8_t i = 0; i < LAYER_DISPLAY_MAX; ++i) {
if (layer_state == 0 && layer_display_name[i].state == default_layer_state) {
return layer_display_name[i].name;
} else if (layer_state != 0 && layer_display_name[i].state == layer_state) {
return layer_display_name[i].name;
}
}
return "?";
}
static char layer_status_buf[24] = "Layer state ready.\n";
static inline void update_keymap_status(void) {
snprintf(layer_status_buf, sizeof(layer_status_buf) - 1, "OS:%s Layer:%s\n",
keymap_config.swap_lalt_lgui? "win" : "mac", get_leyer_status());
}
static inline void render_keymap_status(void) {
oled_write(layer_status_buf, false);
}
#define UPDATE_KEYMAP_STATUS() update_keymap_status()
static inline void render_status(void) {
UPDATE_LED_STATUS();
RENDER_LED_STATUS();
render_keymap_status();
UPDATE_LOCK_STATUS();
RENDER_LOCK_STATUS();
RENDER_KEY_STATUS();
}
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
// if (is_keyboard_master())
// return OLED_ROTATION_180; // flips the display 180 degrees if offhand
return rotation;
}
bool oled_task_user(void) {
if (is_keyboard_master()) {
render_status();
} else {
render_logo();
}
return false;
}
#else
#define UPDATE_KEYMAP_STATUS()
#endif
static inline void update_change_layer(bool pressed, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
pressed ? layer_on(layer1) : layer_off(layer1);
IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2) ? layer_on(layer3) : layer_off(layer3);
}
int RGB_current_mode;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
UPDATE_KEY_STATUS(keycode, record);
bool result = false;
switch (keycode) {
case LOWER:
update_change_layer(record->event.pressed, _LOWER, _RAISE, _ADJUST);
break;
case RAISE:
update_change_layer(record->event.pressed, _RAISE, _LOWER, _ADJUST);
break;
case KANJI:
if (record->event.pressed) {
if (keymap_config.swap_lalt_lgui == false) {
register_code(KC_LNG2);
} else {
SEND_STRING(SS_LALT("`"));
}
} else {
unregister_code(KC_LNG2);
}
break;
#ifdef RGBLIGHT_ENABLE
case RGBRST:
if (record->event.pressed) {
eeconfig_update_rgblight_default();
rgblight_enable();
}
break;
#endif
default:
result = true;
break;
}
UPDATE_KEYMAP_STATUS();
return result;
}

View File

@ -1,75 +0,0 @@
# JISキーボードライクなキーマップ
## 概要
 デフォルトキーマップの記号類をJISライクな配置に揃えなおしたものです。
## キーマップの見かた
qmk_firmware\tmk_core\common\keycode.h
に基本的なキーコードがあります。また、Keymap.cの上部にカスタムしたKC_で始まるものを登録しています。
キーマップに書くときは「KC_」を省略して書いています。
KC_A → A
Leyer Tap、Mod Tap、Tap DanceというQMKの機能を使っています。
Layer Tapはタップで指定したキー、長押しで指定したレイヤーに移動します。
LT(RAISE, KC_V) → タップでV、長押しでRAISEレイヤー移動
Mod Tapはタップで視程したキー、長押しで視程したレイヤーに移動します。
LSFT_T(KC_Z) → タップでZ、長押しで左シフト
もう少し詳しい内容についてはQMK Documentをお読みいただくかネットを検索すれば情報が載っていますので別途検索してみてください。
## 機能
 QWERTYキーマップをベースにしていて、LowerレイヤーとRaiseレイヤーに他のキーを配置しています。
 LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来ます。
 マウスキーの割り当てがありますので、もし使用したい場合はrules.mkでMOUSEKEY_ENABLE = yesにしてmakeすると使用することができます。
## 48キー目について
 このキーボードはEnterキーの上の2Uキーを1Ux2個にして使用する事が出来るようになっています。 使用する場合はキーマップの書き換えが必要です。
 各レイヤーの最下段の
```c
XXXXXXX \
// ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
```
 のXXXXXに任意のキーを入れることでPの右隣のキーとして動作するようになっています。その右隣りに従来のキーが配置されています。
## OS切り替え方法
 Adjustレイヤーにあります。LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来ます。
- KNRM: QMKのーマル状態です。macだと正常に使えるはずです
- KSWP: ーマル状態のままWindowsで使用するとALTキーとGUIwinキーが逆ですので、それを入れ換えます。Windowsユーザーはこちらのモードにしてください
## NUMPADモードについて
 Lower + DLNPキーを一度押下するとNumpadモードになります。通常モードに戻す場合はDLBSキーを押下してください。
## IME切り替え方法
 Winの場合、LowerレイヤーにKANJIキー半角/全角 漢字がありますので、Lower+KANJIで切り替えてください。
## ソフトウェアリセットについて
 キーボードにはハードウェアのリセットボタンが付いていますが、ソフトウェアリセットをかけられます。
 LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来、AdjustレイヤーのRSTを押下するとリセットがかかります。
## LEDの点灯切り替え方法
 Adjustレイヤーにあります。LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来ます。
- RGBRST: LEDのリセット
- RGB_TOG: LEDのON/OFF切り替え
- RGB_MOD: LEDの光り方の変更
- RGB_HUI: Hue+ 色合いを変更
- RGB_HUD: Hue- 色合いを変更
- RGB_SAI: Saturation+ 色の濃さを変更
- RGB_SAD: Saturation- 色の濃さを変更
- RGB_VAI: Value+ 明るさを変更
- RGB_VAD: Value- 明るさを変更

View File

@ -1,8 +0,0 @@
MOUSEKEY_ENABLE = yes # Mouse keys
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
OLED_ENABLE = yes
LTO_ENABLE = yes
# If you want to change the display of OLED, you need to change here
SRC += ./common/oled_helper.c \

View File

@ -0,0 +1,17 @@
// Copyright 2024 QMK Collaborators (@qmk)
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
#define IS31FL3731_I2C_ADDRESS_1 IS31FL3731_I2C_ADDRESS_GND
#define I2C_DRIVER I2CD0
#define I2C1_SDA_PIN GP4
#define I2C1_SCL_PIN GP5
#define I2C1_CLOCK_SPEED 100000
#ifdef RGB_MATRIX_ENABLE
#define RGB_MATRIX_SLEEP
#endif

View File

@ -0,0 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#define HAL_USE_I2C TRUE
#include_next <halconf.h>

View File

@ -0,0 +1,119 @@
{
"manufacturer": "Pimoroni",
"keyboard_name": "Keybow 2040",
"url": "https://shop.pimoroni.com/products/keybow-2040",
"maintainer": "fanf2",
"processor": "RP2040",
"bootloader": "rp2040",
"board": "GENERIC_RP_RP2040",
"features": {
"extrakey": true,
"mousekey": true,
"nkro": true,
"rgb_matrix": true
},
"usb": {
"device_version": "1.0.0",
"vid": "0x5069",
"pid": "0x4784"
},
"rgb_matrix": {
"driver": "is31fl3731",
"animations": {
"alphas_mods": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_sat": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"band_val": true,
"breathing": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"cycle_up_down": true,
"digital_rain": true,
"dual_beacon": true,
"gradient_left_right": true,
"gradient_up_down": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"jellybean_raindrops": true,
"multisplash": true,
"pixel_flow": true,
"pixel_fractal": true,
"pixel_rain": true,
"rainbow_beacon": true,
"rainbow_moving_chevron": true,
"rainbow_pinwheels": true,
"raindrops": true,
"solid_multisplash": true,
"solid_reactive": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_multinexus": true,
"solid_reactive_multiwide": true,
"solid_reactive_nexus": true,
"solid_reactive_simple": true,
"solid_reactive_wide": true,
"solid_splash": true,
"splash": true,
"typing_heatmap": true
},
"center_point": [112, 112],
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0, "flags": 4},
{"matrix": [0, 1], "x": 75, "y": 0, "flags": 4},
{"matrix": [0, 2], "x": 150, "y": 0, "flags": 4},
{"matrix": [0, 3], "x": 224, "y": 0, "flags": 4},
{"matrix": [1, 0], "x": 0, "y": 75, "flags": 4},
{"matrix": [1, 1], "x": 75, "y": 75, "flags": 4},
{"matrix": [1, 2], "x": 150, "y": 75, "flags": 4},
{"matrix": [1, 3], "x": 224, "y": 75, "flags": 4},
{"matrix": [2, 0], "x": 0, "y": 150, "flags": 4},
{"matrix": [2, 1], "x": 75, "y": 150, "flags": 4},
{"matrix": [2, 2], "x": 150, "y": 150, "flags": 4},
{"matrix": [2, 3], "x": 224, "y": 150, "flags": 4},
{"matrix": [3, 0], "x": 0, "y": 224, "flags": 4},
{"matrix": [3, 1], "x": 75, "y": 224, "flags": 4},
{"matrix": [3, 2], "x": 150, "y": 224, "flags": 4},
{"matrix": [3, 3], "x": 224, "y": 224, "flags": 4}
]
},
"matrix_pins": {
"direct": [
["GP18", "GP14", "GP10", "GP6"],
["GP19", "GP15", "GP11", "GP7"],
["GP20", "GP16", "GP12", "GP8"],
["GP21", "GP17", "GP13", "GP9"],
["GP23", null, null, null]
]
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1, "y": 1},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [1, 3], "x": 3, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1, "y": 2},
{"matrix": [2, 2], "x": 2, "y": 2},
{"matrix": [2, 3], "x": 3, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3},
{"matrix": [3, 1], "x": 1, "y": 3},
{"matrix": [3, 2], "x": 2, "y": 3},
{"matrix": [3, 3], "x": 3, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4}
]
}
}
}

View File

@ -0,0 +1,25 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include "quantum.h"
#ifdef RGB_MATRIX_ENABLE
const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = {
/* driver, r, g, b */
{ 0, C8_9, C6_9, C7_9 }, // LEDB12 0,0
{ 0, C9_9, C3_9, C5_9 }, // LEDB11 1,0
{ 0, C8_1, C6_1, C7_1 }, // LEDA12 2,0
{ 0, C9_1, C3_1, C5_1 }, // LEDA11 3,0
{ 0, C8_10, C6_10, C7_10 }, // LEDB22 0,1
{ 0, C9_10, C3_10, C5_10 }, // LEDB21 1,1
{ 0, C8_2, C6_2, C7_2 }, // LEDA22 2,1
{ 0, C9_2, C3_2, C5_2 }, // LEDA21 3,1
{ 0, C8_11, C6_11, C7_11 }, // LEDB32 0,2
{ 0, C9_11, C2_10, C5_11 }, // LEDB31 1,2
{ 0, C8_3, C6_3, C7_3 }, // LEDA32 2,2
{ 0, C9_3, C2_2, C5_3 }, // LEDA31 3,2
{ 0, C8_12, C6_12, C7_12 }, // LEDB42 0,3
{ 0, C9_12, C2_11, C5_12 }, // LEDB41 1,3
{ 0, C8_4, C6_4, C7_4 }, // LEDA42 2,3
{ 0, C9_4, C2_3, C5_4 }, // LEDA41 3,3
};
#endif

View File

@ -0,0 +1,28 @@
{
"keyboard": "pimoroni/keybow2040",
"author": "willoucom",
"version": 1,
"keymap": "acc",
"config": {
"features": {
"via": true
}
},
"layout": "LAYOUT",
"layers": [
[
"KC_F13", "KC_F14", "KC_F15", "KC_F16",
"KC_AUDIO_MUTE", "KC_AUDIO_VOL_DOWN", "KC_AUDIO_VOL_UP", "KC_AUDIO_MUTE",
"LSFT(KC_A)", "LSFT(KC_T)", "LSFT(KC_Y)", "LSFT(KC_B)",
"LCTL(KC_A)", "LCTL(KC_T)", "LCTL(KC_Y)", "LCTL(KC_B)",
"TO(1)"
],
[
"KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT",
"KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT",
"RGB_SAD", "RGB_SAI", "RGB_HUD", "RGB_HUI",
"KC_TRANSPARENT", "RGB_TOG", "RGB_RMOD", "RGB_MOD",
"TO(0)"
]
]
}

View File

@ -0,0 +1,23 @@
{
"keyboard": "pimoroni/keybow2040",
"author": "fanf2",
"version": 1,
"keymap": "default",
"layout": "LAYOUT",
"layers": [
[
"KC_F13", "KC_F14", "KC_F15", "KC_F16",
"KC_F17", "KC_F18", "KC_F19", "KC_F20",
"KC_HOME", "KC_UP", "KC_END", "KC_PGUP",
"KC_LEFT", "KC_DOWN", "KC_RIGHT","KC_PGDN",
"TO(1)"
],
[
"KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT",
"KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT",
"RGB_SAD", "RGB_SAI", "RGB_HUD", "RGB_HUI",
"KC_TRANSPARENT", "RGB_TOG", "RGB_RMOD", "RGB_MOD",
"TO(0)"
]
]
}

View File

@ -0,0 +1,28 @@
{
"keyboard": "pimoroni/keybow2040",
"author": "fanf2",
"version": 1,
"keymap": "via",
"config": {
"features": {
"via": true
}
},
"layout": "LAYOUT",
"layers": [
[
"KC_F13", "KC_F14", "KC_F15", "KC_F16",
"KC_F17", "KC_F18", "KC_F19", "KC_F20",
"KC_HOME", "KC_UP", "KC_END", "KC_PGUP",
"KC_LEFT", "KC_DOWN", "KC_RIGHT", "KC_PGDN",
"TO(1)"
],
[
"KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT",
"KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT",
"RGB_SAD", "RGB_SAI", "RGB_HUD", "RGB_HUI",
"KC_TRANSPARENT", "RGB_TOG", "RGB_RMOD", "RGB_MOD",
"TO(0)"
]
]
}

View File

@ -0,0 +1,10 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include_next <mcuconf.h>
#undef RP_I2C_USE_I2C0
#define RP_I2C_USE_I2C0 TRUE
#undef RP_I2C_USE_I2C1
#define RP_I2C_USE_I2C1 FALSE

View File

@ -0,0 +1,43 @@
# Keybow 2040
![Keybow 2040 board](https://i.imgur.com/WDGDOkb.jpeg)
The [Pimoroni Keybow 2040](https://shop.pimoroni.com/products/keybow-2040) is a 16 key mechanical macropad
controlled by a Raspberry Pi RP2040, with Kailh hot swap sockets and
per key RGB lighting, in a decorative FR4 sandwich. The Keybow 2040 is
also known by its codename Venus Dust, or its product codes of the
form PIM56x.
* Original Keyboard Maintainer: [Tony Finch](https://github.com/fanf2)
* Keyboard Maintainer: [Wilfried Jeanniard](https://github.com/willoucom) and [Sandy Macdonald](https://github.com/sandyjmacdonald)
* Hardware Supported: Keybow 2040
* Hardware Availability: [Pimoroni](https://shop.pimoroni.com/products/keybow-2040)
## Usage
The bootloader button is used to switch from one layer to another, the first layer is used for macros and shortcuts, while the second layer controls RGB lights. You can modify this behavior using the QMK configurator.
## Build
Make example for this keyboard (after setting up your build environment):
make pimoroni/keybow2040:default
Flashing example for this keyboard:
make pimoroni/keybow2040:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools)
and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide)
for more information. Brand new to QMK? Start with our
[Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
## Bootloader
Enter the bootloader in 3 ways:
* **Bootmagic reset**: Hold down the top left key and plug in the keyboard
* **Physical reset button**: Hold down BOOTSEL while pressing RESET
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@ -1,62 +0,0 @@
/* Copyright 2018 Jack Humbert <jack.humb@gmail.com>
* Copyright 2015 ZSA Technology Labs Inc (@zsa)
* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#define MUSIC_MAP
#undef AUDIO_VOICES
#undef AUDIO_PIN
#define AUDIO_PIN A5
#define AUDIO_PIN_ALT A4
#define AUDIO_PIN_ALT_AS_NEGATIVE
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
// #define WS2812_LED_N 2
// #define WS2812_TIM_N 2
// #define WS2812_TIM_CH 2
// #define PORT_WS2812 GPIOA
// #define PIN_WS2812 1
// #define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2 // DMA stream for TIMx_UP (look up in reference manual under DMA Channel selection)
//#define WS2812_PWM_DMA_CHANNEL 7 // DMA channel for TIMx_UP
//#define WS2812_EXTERNAL_PULLUP
#define IS31FL3737_I2C_ADDRESS_1 IS31FL3737_I2C_ADDRESS_GND
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_DELAY 0
#define MOUSEKEY_TIME_TO_MAX 60
#define MOUSEKEY_MAX_SPEED 7
#define MOUSEKEY_WHEEL_DELAY 400
#define MOUSEKEY_WHEEL_INTERVAL MOUSEKEY_INTERVAL
#define MOUSEKEY_WHEEL_MAX_SPEED MOUSEKEY_MAX_SPEED
#define MOUSEKEY_WHEEL_TIME_TO_MAX MOUSEKEY_TIME_TO_MAX

View File

@ -1,9 +0,0 @@
{
"keyboard_name": "Planck EZ Glow",
"usb": {
"pid": "0xC6CF"
},
"features": {
"rgb_matrix": true
}
}

View File

@ -1,207 +0,0 @@
{
"manufacturer": "ZSA Technology Labs",
"url": "https://ergodox-ez.com/pages/planck",
"maintainer": "jackhumbert",
"usb": {
"vid": "0x3297",
"device_version": "0.0.1",
"shared_endpoint": {
"mouse": false
}
},
"features": {
"audio": true,
"bootmagic": true,
"command": true,
"console": true,
"encoder": true,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"rgb_matrix": {
"animations": {
"alphas_mods": true,
"gradient_up_down": true,
"gradient_left_right": true,
"breathing": true,
"band_sat": true,
"band_val": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_up_down": true,
"rainbow_moving_chevron": true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"dual_beacon": true,
"rainbow_beacon": true,
"rainbow_pinwheels": true,
"raindrops": true,
"jellybean_raindrops": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"pixel_rain": true,
"pixel_flow": true,
"pixel_fractal": true,
"typing_heatmap": true,
"digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
"solid_reactive_multiwide": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_nexus": true,
"solid_reactive_multinexus": true,
"splash": true,
"multisplash": true,
"solid_splash": true,
"solid_multisplash": true
},
"driver": "is31fl3737",
"led_process_limit": 5,
"led_flush_limit": 26,
"sleep": true
},
"matrix_pins": {
"cols": ["B11", "B10", "B2", "B1", "A7", "B0"],
"rows": ["A10", "A9", "A8", "B15", "C13", "C14", "C15", "A2"]
},
"diode_direction": "COL2ROW",
"audio": {
"driver": "dac_additive"
},
"encoder": {
"rotary": [
{"pin_a": "B12", "pin_b": "B13"}
]
},
"processor": "STM32F303",
"bootloader": "stm32-dfu",
"tapping": {
"toggle": 1
},
"community_layouts": ["ortho_4x12", "planck_mit"],
"layout_aliases": {
"LAYOUT_planck_grid": "LAYOUT_ortho_4x12",
"LAYOUT_planck_mit": "LAYOUT_planck_1x2uC"
},
"layouts": {
"LAYOUT_planck_1x2uC": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [4, 0], "x": 6, "y": 0},
{"matrix": [4, 1], "x": 7, "y": 0},
{"matrix": [4, 2], "x": 8, "y": 0},
{"matrix": [4, 3], "x": 9, "y": 0},
{"matrix": [4, 4], "x": 10, "y": 0},
{"matrix": [4, 5], "x": 11, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1, "y": 1},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [1, 3], "x": 3, "y": 1},
{"matrix": [1, 4], "x": 4, "y": 1},
{"matrix": [1, 5], "x": 5, "y": 1},
{"matrix": [5, 0], "x": 6, "y": 1},
{"matrix": [5, 1], "x": 7, "y": 1},
{"matrix": [5, 2], "x": 8, "y": 1},
{"matrix": [5, 3], "x": 9, "y": 1},
{"matrix": [5, 4], "x": 10, "y": 1},
{"matrix": [5, 5], "x": 11, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1, "y": 2},
{"matrix": [2, 2], "x": 2, "y": 2},
{"matrix": [2, 3], "x": 3, "y": 2},
{"matrix": [2, 4], "x": 4, "y": 2},
{"matrix": [2, 5], "x": 5, "y": 2},
{"matrix": [6, 0], "x": 6, "y": 2},
{"matrix": [6, 1], "x": 7, "y": 2},
{"matrix": [6, 2], "x": 8, "y": 2},
{"matrix": [6, 3], "x": 9, "y": 2},
{"matrix": [6, 4], "x": 10, "y": 2},
{"matrix": [6, 5], "x": 11, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3},
{"matrix": [3, 1], "x": 1, "y": 3},
{"matrix": [3, 2], "x": 2, "y": 3},
{"matrix": [7, 3], "x": 3, "y": 3},
{"matrix": [7, 4], "x": 4, "y": 3},
{"matrix": [7, 5], "x": 5, "y": 3, "w": 2},
{"matrix": [7, 0], "x": 7, "y": 3},
{"matrix": [7, 1], "x": 8, "y": 3},
{"matrix": [7, 2], "x": 9, "y": 3},
{"matrix": [3, 3], "x": 10, "y": 3},
{"matrix": [3, 4], "x": 11, "y": 3}
]
},
"LAYOUT_ortho_4x12": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [4, 0], "x": 6, "y": 0},
{"matrix": [4, 1], "x": 7, "y": 0},
{"matrix": [4, 2], "x": 8, "y": 0},
{"matrix": [4, 3], "x": 9, "y": 0},
{"matrix": [4, 4], "x": 10, "y": 0},
{"matrix": [4, 5], "x": 11, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1, "y": 1},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [1, 3], "x": 3, "y": 1},
{"matrix": [1, 4], "x": 4, "y": 1},
{"matrix": [1, 5], "x": 5, "y": 1},
{"matrix": [5, 0], "x": 6, "y": 1},
{"matrix": [5, 1], "x": 7, "y": 1},
{"matrix": [5, 2], "x": 8, "y": 1},
{"matrix": [5, 3], "x": 9, "y": 1},
{"matrix": [5, 4], "x": 10, "y": 1},
{"matrix": [5, 5], "x": 11, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1, "y": 2},
{"matrix": [2, 2], "x": 2, "y": 2},
{"matrix": [2, 3], "x": 3, "y": 2},
{"matrix": [2, 4], "x": 4, "y": 2},
{"matrix": [2, 5], "x": 5, "y": 2},
{"matrix": [6, 0], "x": 6, "y": 2},
{"matrix": [6, 1], "x": 7, "y": 2},
{"matrix": [6, 2], "x": 8, "y": 2},
{"matrix": [6, 3], "x": 9, "y": 2},
{"matrix": [6, 4], "x": 10, "y": 2},
{"matrix": [6, 5], "x": 11, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3},
{"matrix": [3, 1], "x": 1, "y": 3},
{"matrix": [3, 2], "x": 2, "y": 3},
{"matrix": [7, 3], "x": 3, "y": 3},
{"matrix": [7, 4], "x": 4, "y": 3},
{"matrix": [7, 5], "x": 5, "y": 3},
{"matrix": [3, 5], "x": 6, "y": 3},
{"matrix": [7, 0], "x": 7, "y": 3},
{"matrix": [7, 1], "x": 8, "y": 3},
{"matrix": [7, 2], "x": 9, "y": 3},
{"matrix": [3, 3], "x": 10, "y": 3},
{"matrix": [3, 4], "x": 11, "y": 3}
]
}
}
}

View File

@ -1,65 +0,0 @@
/*
This is the c configuration file for the keymap
Copyright 2012 Jun Wako <wakojun@gmail.com>
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
// place overrides here
#define TAPPING_TERM 200
#define TAPPING_LAYER_TERM 150 // Custom LT Tapping term
#define TAPPING_TERM_PER_KEY
#ifdef MOUSEKEY_ENABLE
#undef MOUSEKEY_INTERVAL
#define MOUSEKEY_INTERVAL 1
#undef MOUSEKEY_TIME_TO_MAX
#define MOUSEKEY_TIME_TO_MAX 150
#undef MOUSEKEY_MAX_SPEED
#define MOUSEKEY_MAX_SPEED 3
#undef MOUSEKEY_MOVE_DELTA
#define MOUSEKEY_MOVE_DELTA 4
#undef MOUSEKEY_DELAY
#define MOUSEKEY_DELAY 0
#endif
// Selection of RGBLIGHT MODE to use.
#if defined(LED_ANIMATIONS)
//#define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_RAINBOW_MOOD
#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
//#define RGBLIGHT_EFFECT_SNAKE
#define RGBLIGHT_EFFECT_KNIGHT
//#define RGBLIGHT_EFFECT_CHRISTMAS
#define RGBLIGHT_EFFECT_STATIC_GRADIENT
//#define RGBLIGHT_EFFECT_RGB_TEST
//#define RGBLIGHT_EFFECT_ALTERNATING
#endif
// LED Setting: if you have KUMO you can use RGBLIGHT_ENABLE = yes
#ifdef RGBLIGHT_ENABLE
#define WS2812_DI_PIN B5
#define RGBLIGHT_TIMER
#define RGBLIGHT_LED_COUNT 6
#endif

View File

@ -1,159 +0,0 @@
#include QMK_KEYBOARD_H
#include "keymap_japanese.h"
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
// 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.
enum layer_number {
_BASE = 0,
_LOWER,
_RAISE,
_ADJUST,
};
enum custom_keycodes {
RGBRST = SAFE_RANGE,
LOWER,
RAISE,
KANJI,
};
// enum tapdances{
// TD_CODO = 0,
// TD_SLRO,
// };
// Layer Mode aliases
#define KC_MLAD MO(_ADJUST)
// Base layer mod tap
#define KC_CMSF LSFT_T(KC_COMM)
#define KC_DTCT LCTL_T(KC_DOT)
#define KC_Z_AL LALT_T(KC_Z)
#define KC_X_GU LGUI_T(KC_X)
#define KC_ENSF LSFT_T(KC_ENT)
// Lower layer mod tap
#define KC_BSSF LSFT_T(KC_BSLS)
#define KC_11AL LALT_T(KC_F11)
// Layer tap
#define KC_BSLO LT(_LOWER, KC_BSPC)
#define KC_SPRA LT(_RAISE, KC_SPC)
// Tap dance
// #define KC_CODO TD(TD_CODO)
// #define KC_SLRO TD(TD_SLRO)
// tap_dance_action_t tap_dance_actions[] = {
// [TD_CODO] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_DOT),
// [TD_SLRO] = ACTION_TAP_DANCE_DOUBLE(KC_SLSH, JP_BSLS),
// };
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------------------.
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLO,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
KC_CMSF, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENSF,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
KC_DTCT, KC_Z_AL, KC_X_GU, KC_C, KC_V, KC_B, KC_N, KC_M, KC_SPRA
//`---------+---------+---------+---------+---------+---------+---------+---------+---------'
),
[_LOWER] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------------------.
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, JP_YEN, KC_LBRC, KC_RBRC, _______,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
_______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, KC_SCLN, KC_QUOT, KC_BSSF,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
_______, KC_11AL, KC_F12, KC_ESC, KC_TAB, KANJI, KC_COMM, KC_DOT, KC_MLAD
//`---------+---------+---------+---------+---------+---------+---------+---------+---------'
),
[_RAISE] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------------------.
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_LSFT,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
_______, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, XXXXXXX, KC_SLSH, JP_BSLS, _______
//`---------+---------+---------+---------+---------+---------+---------+---------+---------'
),
[_ADJUST] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------------------.
QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
_______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
_______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX
//`---------+---------+---------+---------+---------+---------+---------+---------+---------'
)
};
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_BSLO:
return TAPPING_LAYER_TERM;
case KC_SPRA:
return TAPPING_LAYER_TERM;
default:
return TAPPING_TERM;
}
}
int RGB_current_mode;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
bool result = false;
switch (keycode) {
case KANJI:
if (record->event.pressed) {
if (keymap_config.swap_lalt_lgui == false) {
register_code(KC_LNG2);
} else {
SEND_STRING(SS_LALT("`"));
}
} else {
unregister_code(KC_LNG2);
}
break;
#ifdef RGBLIGHT_ENABLE
//led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
case RGB_MOD:
if (record->event.pressed) {
rgblight_mode(RGB_current_mode);
rgblight_step();
RGB_current_mode = rgblight_config.mode;
}
break;
case RGBRST:
if (record->event.pressed) {
eeconfig_update_rgblight_default();
rgblight_enable();
RGB_current_mode = rgblight_config.mode;
}
break;
#endif
default:
result = true;
break;
}
return result;
}
void keyboard_post_init_user(void) {
#ifdef RGBLIGHT_ENABLE
RGB_current_mode = rgblight_config.mode;
#endif
}

View File

@ -1,64 +0,0 @@
# The LikeJIS is Japanese Keyboard like keymap
A Nomu30 can use full color LED strip used by B5 pin. This keymap can use LED animation option.
## Keymap Description
- KC_CMSF ...... , key is one tap, Shift key is long push.
- KC_DTCT ...... . key is one tap, Ctrl key is long tap.
- KC_ENSF ...... Enter key is one tap, Ctrl key is long tap.
- KC_Z_AL ...... Z key is one tap, Alt key is long tap.
- KC_X_GU ...... X key is one tap, GUI key is long tap.
- KC_BSLO ...... Backspace key is one tap, Move to Lower layer with long push.
- KC_SPRA ...... Space key is one tap, Move to Raise layer with.
- AG_NORM ...... If you use Mac set to mode.
- AG_SWAP ...... If you use Win set to mode.
- KANJI ...... Japanese IME toggle key.
## How to move to Ajdust Layer
At first, Move to Lower layer with long push. After that Adjust key with long push. Now you have into Adjust layer state.
```c
[_BASE] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------------------.
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLO,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
KC_CMSF, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENSF,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
KC_DTCT, KC_Z_AL, KC_X_GU, KC_C, KC_V, KC_B, KC_N, KC_M, KC_SPRA
//`---------+---------+---------+---------+---------+---------+---------+---------+---------'
),
[_LOWER] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------------------.
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, KC_INT3, KC_LBRC, KC_RBRC, _______,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
_______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, KC_SCLN, KC_QUOT, KC_BSSF,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
_______, KC_11AL, KC_F12, KC_ESC, KC_TAB, KANJI, KC_COMM, KC_DOT, KC_MLAD
//`---------+---------+---------+---------+---------+---------+---------+---------+---------'
),
[_RAISE] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------------------.
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_LSFT,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
_______, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, XXXXXXX, KC_SLSH, KC_INT1, _______
//`---------+---------+---------+---------+---------+---------+---------+---------+---------'
),
[_ADJUST] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------------------.
QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
_______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
_______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX
//`---------+---------+---------+---------+---------+---------+---------+---------+---------'
)
```

View File

@ -1,25 +0,0 @@
# 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
#
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
TAP_DANCE_ENABLE = no
# If your custom treadstone32 pcb, you can rewrite to yes.
RGBLIGHT_ENABLE = yes # LED underglow (Enable WS2812 RGB underlight.)
LED_ANIMATIONS = yes # LED animations
# Other selectable option
IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone)
ifeq ($(strip $(LED_ANIMATIONS)), yes)
OPT_DEFS += -DLED_ANIMATIONS
endif
ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes)
OPT_DEFS += -DIOS_DEVICE_ENABLE
endif
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend

View File

@ -1,42 +0,0 @@
#pragma once
// place overrides here
#define TAPPING_TERM 200
#define TAPPING_TERM_PER_KEY
#ifdef MOUSEKEY_ENABLE
#undef MOUSEKEY_INTERVAL
#define MOUSEKEY_INTERVAL 1
#undef MOUSEKEY_TIME_TO_MAX
#define MOUSEKEY_TIME_TO_MAX 150
#undef MOUSEKEY_MAX_SPEED
#define MOUSEKEY_MAX_SPEED 3
#undef MOUSEKEY_MOVE_DELTA
#define MOUSEKEY_MOVE_DELTA 4
#undef MOUSEKEY_DELAY
#define MOUSEKEY_DELAY 0
#endif
// Selection of RGBLIGHT MODE to use.
#if defined(LED_ANIMATIONS)
//#define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_RAINBOW_MOOD
#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
//#define RGBLIGHT_EFFECT_SNAKE
#define RGBLIGHT_EFFECT_KNIGHT
//#define RGBLIGHT_EFFECT_CHRISTMAS
#define RGBLIGHT_EFFECT_STATIC_GRADIENT
//#define RGBLIGHT_EFFECT_RGB_TEST
//#define RGBLIGHT_EFFECT_ALTERNATING
#endif
// LED Setting: if you have KUMO you can use RGBLIGHT_ENABLE = yes
#ifdef RGBLIGHT_ENABLE
#define WS2812_DI_PIN D0
#define RGBLIGHT_TIMER
#define RGBLIGHT_LED_COUNT 3
#endif

View File

@ -1,173 +0,0 @@
#include QMK_KEYBOARD_H
#include "keymap_japanese.h"
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.
enum layer_number {
_BASE = 0,
_LOWER,
_RAISE,
_ADJUST,
};
enum custom_keycodes {
LOWER = SAFE_RANGE,
RAISE,
ADJUST,
KANJI,
RGBRST
};
enum tapdances{
TD_SCCL = 0,
};
// Layer Mode aliases
#define KC_TBSF LSFT_T(KC_TAB)
#define KC_ROSF RSFT_T(JP_BSLS)
#define KC_ALAP LALT_T(KC_APP)
// Layer tap
#define KC_BSLO LT(_LOWER, KC_BSPC)
#define KC_SPRA LT(_RAISE, KC_SPC)
#define KC_MLAD MO(_ADJUST)
#define KC_SCCL TD(TD_SCCL)
tap_dance_action_t tap_dance_actions[] = {
[TD_SCCL] = ACTION_TAP_DANCE_DOUBLE(KC_SCLN, KC_QUOT),
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------.
// Esc Q W E R T Y U I O P -
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
//Tab/Shift A S D F G H J K L ;/: Enter
KC_TBSF, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCCL, KC_ENT,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// Shift Z X C V B N M , . / yen
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ROSF,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// Ctrl Alt GUI/Comm BackSpace/Lower Space/Raise Alt Menu Ctrl
KC_LCTL, KC_LALT, KC_LGUI, KC_BSLO, KC_SPRA, KC_RALT, KC_ALAP, KC_RCTL
//`-----------------------------------------------------------------------------------------------------------'
),
[_LOWER] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------.
// F1 F2 F3 F4 F5 - ^ \ @ [ Delete
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, JP_YEN, KC_LBRC, KC_RBRC, KC_DEL,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// F6 F7 F8 F9 F10 ; : ]
_______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, KC_SCLN, KC_QUOT, KC_BSLS, _______,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// F11 F12 Kana/Kanji Enter Delete
_______, KC_F11, KC_F12, XXXXXXX, KANJI, KC_ENT, KC_DEL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// Adjust
_______, _______, _______, _______, KC_MLAD, _______, _______, _______
//`-----------------------------------------------------------------------------------------------------------'
),
[_RAISE] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------.
// 1 2 3 4 5 6 7 8 9 0 -
_______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// Left Down Up Right
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, _______,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// , . / yen
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, KC_ROSF,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
_______, _______, _______, _______, _______, _______, _______, _______
//`-----------------------------------------------------------------------------------------------------------'
),
[_ADJUST] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------.
// Reset LEDReset MacMode WinMode Home PageDown PageUp End
_______, QK_BOOT,RGBRST, AG_NORM, AG_SWAP, XXXXXXX, KC_HOME, KC_PGDN, KC_PGUP, KC_END, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// LED On/Off Hue/Saturation/Value Increment Mouse Left Down Up Right
_______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX, _______,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// LED Mode Hue/Saturation/Value Decrement Mouse Button Left Right
_______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
_______, _______, _______, _______, _______, _______, _______, _______
//`-----------------------------------------------------------------------------------------------------------'
)
};
#define TAPPING_LAYER_TERM 150 // Custom LT Tapping term
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_BSLO:
return TAPPING_LAYER_TERM;
case KC_SPRA:
return TAPPING_LAYER_TERM;
default:
return TAPPING_TERM;
}
}
int RGB_current_mode;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
bool result = false;
switch (keycode) {
case KANJI:
if (record->event.pressed) {
if (keymap_config.swap_lalt_lgui == false) {
register_code(KC_LNG2);
} else {
SEND_STRING(SS_LALT("`"));
}
} else {
unregister_code(KC_LNG2);
}
break;
#ifdef RGBLIGHT_ENABLE
//led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
case RGB_MOD:
if (record->event.pressed) {
rgblight_mode(RGB_current_mode);
rgblight_step();
RGB_current_mode = rgblight_config.mode;
}
break;
case RGBRST:
if (record->event.pressed) {
eeconfig_update_rgblight_default();
rgblight_enable();
RGB_current_mode = rgblight_config.mode;
}
break;
#endif
default:
result = true;
break;
}
return result;
}
void matrix_init_user(void) {
#ifdef RGBLIGHT_ENABLE
RGB_current_mode = rgblight_config.mode;
#endif
}

View File

@ -1,63 +0,0 @@
# The LikeJIS is Japanese Keyboard like keymap
This keymap use for KUMO. Therefore it can use full color LED indicators used by D0 pin. But this keymap as use as Illumination :)
## Keymap Description
- Tab/Shift ...... Tab key is one tap, Shift key is long push.
- ;/: ...... ; key is one tap, : key is double tap.
- BackSpace/Lower ...... Backspace key is one tap, Move to Lower layer with long push.
- Space/Raise ...... Space key is one tap, Move to Raise layer with .
- Kanji ...... Japanese IME toggle key.
## How to move to Ajdust Layer
At first, Move to Lower layer with long push. After that Adjust key with long push. Now you have into Adjust layer state.
```c
Base Layer
//,-----------------------------------------------------------------------------------------------------------.
// Esc Q W E R T Y U I O P -
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
//Tab/Shift A S D F G H J K L ;/: Enter
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// Shift Z X C V B N M , . / \
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// Ctrl Alt GUI BackSpace/Lower Space/Raise Alt Menu Ctrl
//`-----------------------------------------------------------------------------------------------------------'
Lower Layer
//,-----------------------------------------------------------------------------------------------------------.
// F1 F2 F3 F4 F5 - ^ \ @ [ Delete
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// F6 F7 F8 F9 F10 ; : ]
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// F11 F12 Kanji Enter Delete
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// Adjust
//`-----------------------------------------------------------------------------------------------------------'
Raise Layer
//,-----------------------------------------------------------------------------------------------------------.
// 1 2 3 4 5 6 7 8 9 0 -
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// Left Down Up Right
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// , . / \
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
//
//`-----------------------------------------------------------------------------------------------------------'
Adjust Layer
//,-----------------------------------------------------------------------------------------------------------.
// Reset LEDReset MacMode WinMode Home PageDown PageUp End
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// LED On/Off Hue Saturation Value Increment MouseLeft Down Up Right
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
// LED Mode Hue Saturation Value Decrement Button L R
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
//
//`-----------------------------------------------------------------------------------------------------------'
};
```

View File

@ -1,24 +0,0 @@
# 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 # Enable Bootmagic Lite
MOUSEKEY_ENABLE = yes # 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 = yes # 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.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
TAP_DANCE_ENABLE = yes
LED_ANIMATIONS = yes # LED animations
ifeq ($(strip $(LED_ANIMATIONS)), yes)
OPT_DEFS += -DLED_ANIMATIONS
endif

View File

@ -26,11 +26,21 @@ bool is_launching = false;
#ifdef DYNAMIC_MACRO_ENABLE
static bool is_dynamic_recording = false;
void dynamic_macro_record_start_user(int8_t direction) { is_dynamic_recording = true; }
bool dynamic_macro_record_start_kb(int8_t direction) {
if (!dynamic_macro_record_start_user(direction)) {
return false;
}
is_dynamic_recording = true;
return true;
}
void dynamic_macro_record_end_user(int8_t direction) {
bool dynamic_macro_record_end_kb(int8_t direction) {
if (!dynamic_macro_record_end_user(direction)) {
return false;
}
is_dynamic_recording = false;
ML_LED_3(false);
return false;
}
#endif

View File

@ -1,4 +1,6 @@
/* Copyright 2019 marksard
/* Copyright 2018 Jack Humbert <jack.humb@gmail.com>
* Copyright 2015 ZSA Technology Labs Inc (@zsa)
* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -16,24 +18,9 @@
#pragma once
// place overrides here
#define TAPPING_TERM 200
#define MUSIC_MAP
#define AUDIO_PIN A5
#define AUDIO_PIN_ALT A4
#define AUDIO_PIN_ALT_AS_NEGATIVE
#define TAPPING_LAYER_TERM 150 // Custom LT Tapping term
#define TAPPING_TERM_PER_KEY
#ifdef MOUSEKEY_ENABLE
#undef MOUSEKEY_INTERVAL
#define MOUSEKEY_INTERVAL 1
#undef MOUSEKEY_TIME_TO_MAX
#define MOUSEKEY_TIME_TO_MAX 150
#undef MOUSEKEY_MAX_SPEED
#define MOUSEKEY_MAX_SPEED 3
#undef MOUSEKEY_MOVE_DELTA
#define MOUSEKEY_MOVE_DELTA 4
#undef MOUSEKEY_DELAY
#define MOUSEKEY_DELAY 0
#endif
#define IS31FL3737_I2C_ADDRESS_1 IS31FL3737_I2C_ADDRESS_GND

View File

@ -0,0 +1,75 @@
/* Copyright 2018 Jack Humbert <jack.humb@gmail.com>
* Copyright 2015 ZSA Technology Labs Inc (@zsa)
* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "planck_ez.h"
const is31fl3737_led_t PROGMEM g_is31fl3737_leds[IS31FL3737_LED_COUNT] = {
{0, SW2_CS12, SW1_CS12, SW3_CS12},
{0, SW2_CS11, SW1_CS11, SW3_CS11},
{0, SW2_CS10, SW1_CS10, SW3_CS10},
{0, SW2_CS9, SW1_CS9, SW3_CS9},
{0, SW2_CS8, SW1_CS8, SW3_CS8},
{0, SW2_CS7, SW1_CS7, SW3_CS7},
{0, SW8_CS12, SW7_CS12, SW9_CS12},
{0, SW8_CS11, SW7_CS11, SW9_CS11},
{0, SW8_CS10, SW7_CS10, SW9_CS10},
{0, SW8_CS9, SW7_CS9, SW9_CS9},
{0, SW8_CS8, SW7_CS8, SW9_CS8},
{0, SW8_CS7, SW7_CS7, SW9_CS7},
{0, SW2_CS6, SW1_CS6, SW3_CS6},
{0, SW2_CS5, SW1_CS5, SW3_CS5},
{0, SW2_CS4, SW1_CS4, SW3_CS4},
{0, SW2_CS3, SW1_CS3, SW3_CS3},
{0, SW2_CS2, SW1_CS2, SW3_CS2},
{0, SW2_CS1, SW1_CS1, SW3_CS1},
{0, SW8_CS6, SW7_CS6, SW9_CS6},
{0, SW8_CS5, SW7_CS5, SW9_CS5},
{0, SW8_CS4, SW7_CS4, SW9_CS4},
{0, SW8_CS3, SW7_CS3, SW9_CS3},
{0, SW8_CS2, SW7_CS2, SW9_CS2},
{0, SW8_CS1, SW7_CS1, SW9_CS1},
{0, SW5_CS12, SW4_CS12, SW6_CS12},
{0, SW5_CS11, SW4_CS11, SW6_CS11},
{0, SW5_CS10, SW4_CS10, SW6_CS10},
{0, SW5_CS9, SW4_CS9, SW6_CS9},
{0, SW5_CS8, SW4_CS8, SW6_CS8},
{0, SW5_CS7, SW4_CS7, SW6_CS7},
{0, SW11_CS12, SW10_CS12, SW12_CS12},
{0, SW11_CS11, SW10_CS11, SW12_CS11},
{0, SW11_CS10, SW10_CS10, SW12_CS10},
{0, SW11_CS9, SW10_CS9, SW12_CS9},
{0, SW11_CS8, SW10_CS8, SW12_CS8},
{0, SW11_CS7, SW10_CS7, SW12_CS7},
{0, SW5_CS6, SW4_CS6, SW6_CS6},
{0, SW5_CS5, SW4_CS5, SW6_CS5},
{0, SW5_CS4, SW4_CS4, SW6_CS4},
{0, SW5_CS3, SW4_CS3, SW6_CS3},
{0, SW5_CS2, SW4_CS2, SW6_CS2},
{0, SW5_CS1, SW4_CS1, SW6_CS1},
{0, SW11_CS6, SW10_CS6, SW12_CS6},
{0, SW11_CS5, SW10_CS5, SW12_CS5},
{0, SW11_CS4, SW10_CS4, SW12_CS4},
{0, SW11_CS3, SW10_CS3, SW12_CS3},
{0, SW11_CS2, SW10_CS2, SW12_CS2},
};

View File

@ -0,0 +1,109 @@
{
"keyboard_name": "Planck EZ Glow",
"usb": {
"pid": "0xC6CF"
},
"features": {
"rgb_matrix": true
},
"rgb_matrix": {
"animations": {
"alphas_mods": true,
"gradient_up_down": true,
"gradient_left_right": true,
"breathing": true,
"band_sat": true,
"band_val": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_up_down": true,
"rainbow_moving_chevron": true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"dual_beacon": true,
"rainbow_beacon": true,
"rainbow_pinwheels": true,
"raindrops": true,
"jellybean_raindrops": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"pixel_rain": true,
"pixel_flow": true,
"pixel_fractal": true,
"typing_heatmap": true,
"digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
"solid_reactive_multiwide": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_nexus": true,
"solid_reactive_multinexus": true,
"splash": true,
"multisplash": true,
"solid_splash": true,
"solid_multisplash": true
},
"driver": "is31fl3737",
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0, "flags": 1},
{"matrix": [0, 1], "x": 20, "y": 0, "flags": 4},
{"matrix": [0, 2], "x": 40, "y": 0, "flags": 4},
{"matrix": [0, 3], "x": 61, "y": 0, "flags": 4},
{"matrix": [0, 4], "x": 81, "y": 0, "flags": 4},
{"matrix": [0, 5], "x": 101, "y": 0, "flags": 4},
{"matrix": [4, 0], "x": 122, "y": 0, "flags": 4},
{"matrix": [4, 1], "x": 142, "y": 0, "flags": 4},
{"matrix": [4, 2], "x": 162, "y": 0, "flags": 4},
{"matrix": [4, 3], "x": 183, "y": 0, "flags": 4},
{"matrix": [4, 4], "x": 203, "y": 0, "flags": 4},
{"matrix": [4, 5], "x": 223, "y": 0, "flags": 1},
{"matrix": [1, 0], "x": 0, "y": 21, "flags": 1},
{"matrix": [1, 1], "x": 20, "y": 21, "flags": 4},
{"matrix": [1, 2], "x": 40, "y": 21, "flags": 4},
{"matrix": [1, 3], "x": 61, "y": 21, "flags": 4},
{"matrix": [1, 4], "x": 81, "y": 21, "flags": 4},
{"matrix": [1, 5], "x": 101, "y": 21, "flags": 4},
{"matrix": [5, 0], "x": 122, "y": 21, "flags": 4},
{"matrix": [5, 1], "x": 142, "y": 21, "flags": 4},
{"matrix": [5, 2], "x": 162, "y": 21, "flags": 4},
{"matrix": [5, 3], "x": 183, "y": 21, "flags": 4},
{"matrix": [5, 4], "x": 203, "y": 21, "flags": 4},
{"matrix": [5, 5], "x": 223, "y": 21, "flags": 1},
{"matrix": [2, 0], "x": 0, "y": 42, "flags": 1},
{"matrix": [2, 1], "x": 20, "y": 42, "flags": 4},
{"matrix": [2, 2], "x": 40, "y": 42, "flags": 4},
{"matrix": [2, 3], "x": 61, "y": 42, "flags": 4},
{"matrix": [2, 4], "x": 81, "y": 42, "flags": 4},
{"matrix": [2, 5], "x": 101, "y": 42, "flags": 4},
{"matrix": [6, 0], "x": 122, "y": 42, "flags": 4},
{"matrix": [6, 1], "x": 142, "y": 42, "flags": 4},
{"matrix": [6, 2], "x": 162, "y": 42, "flags": 4},
{"matrix": [6, 3], "x": 183, "y": 42, "flags": 4},
{"matrix": [6, 4], "x": 203, "y": 42, "flags": 4},
{"matrix": [6, 5], "x": 223, "y": 42, "flags": 1},
{"matrix": [3, 0], "x": 0, "y": 63, "flags": 1},
{"matrix": [3, 1], "x": 20, "y": 63, "flags": 1},
{"matrix": [3, 2], "x": 40, "y": 63, "flags": 1},
{"matrix": [7, 3], "x": 61, "y": 63, "flags": 1},
{"matrix": [7, 4], "x": 81, "y": 63, "flags": 1},
{"matrix": [7, 5], "x": 111, "y": 63, "flags": 4},
{"matrix": [7, 0], "x": 142, "y": 63, "flags": 1},
{"matrix": [7, 1], "x": 162, "y": 63, "flags": 1},
{"matrix": [7, 2], "x": 183, "y": 63, "flags": 1},
{"matrix": [3, 3], "x": 203, "y": 63, "flags": 1},
{"matrix": [3, 4], "x": 223, "y": 63, "flags": 1}
],
"led_flush_limit": 26,
"led_process_limit": 5,
"sleep": true
}
}

View File

@ -0,0 +1,157 @@
{
"manufacturer": "ZSA Technology Labs",
"maintainer": "drashna",
"audio": {
"driver": "dac_additive"
},
"bootloader": "stm32-dfu",
"diode_direction": "COL2ROW",
"encoder": {
"rotary": [
{"pin_a": "B12", "pin_b": "B13"}
]
},
"features": {
"audio": true,
"bootmagic": true,
"command": true,
"console": true,
"encoder": true,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"matrix_pins": {
"cols": ["B11", "B10", "B2", "B1", "A7", "B0"],
"rows": ["A10", "A9", "A8", "B15", "C13", "C14", "C15", "A2"]
},
"mousekey": {
"delay": 0,
"interval": 20,
"max_speed": 7,
"time_to_max": 60,
"wheel_delay": 400
},
"processor": "STM32F303",
"tapping": {
"toggle": 1
},
"url": "https://blog.zsa.io/2307-goodbye-planck-ez/",
"usb": {
"device_version": "0.0.1",
"shared_endpoint": {
"mouse": false
},
"vid": "0x3297"
},
"community_layouts": ["ortho_4x12", "planck_mit"],
"layout_aliases": {
"LAYOUT_planck_grid": "LAYOUT_ortho_4x12",
"LAYOUT_planck_mit": "LAYOUT_planck_1x2uC"
},
"layouts": {
"LAYOUT_ortho_4x12": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [4, 0], "x": 6, "y": 0},
{"matrix": [4, 1], "x": 7, "y": 0},
{"matrix": [4, 2], "x": 8, "y": 0},
{"matrix": [4, 3], "x": 9, "y": 0},
{"matrix": [4, 4], "x": 10, "y": 0},
{"matrix": [4, 5], "x": 11, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1, "y": 1},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [1, 3], "x": 3, "y": 1},
{"matrix": [1, 4], "x": 4, "y": 1},
{"matrix": [1, 5], "x": 5, "y": 1},
{"matrix": [5, 0], "x": 6, "y": 1},
{"matrix": [5, 1], "x": 7, "y": 1},
{"matrix": [5, 2], "x": 8, "y": 1},
{"matrix": [5, 3], "x": 9, "y": 1},
{"matrix": [5, 4], "x": 10, "y": 1},
{"matrix": [5, 5], "x": 11, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1, "y": 2},
{"matrix": [2, 2], "x": 2, "y": 2},
{"matrix": [2, 3], "x": 3, "y": 2},
{"matrix": [2, 4], "x": 4, "y": 2},
{"matrix": [2, 5], "x": 5, "y": 2},
{"matrix": [6, 0], "x": 6, "y": 2},
{"matrix": [6, 1], "x": 7, "y": 2},
{"matrix": [6, 2], "x": 8, "y": 2},
{"matrix": [6, 3], "x": 9, "y": 2},
{"matrix": [6, 4], "x": 10, "y": 2},
{"matrix": [6, 5], "x": 11, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3},
{"matrix": [3, 1], "x": 1, "y": 3},
{"matrix": [3, 2], "x": 2, "y": 3},
{"matrix": [7, 3], "x": 3, "y": 3},
{"matrix": [7, 4], "x": 4, "y": 3},
{"matrix": [7, 5], "x": 5, "y": 3},
{"matrix": [3, 5], "x": 6, "y": 3},
{"matrix": [7, 0], "x": 7, "y": 3},
{"matrix": [7, 1], "x": 8, "y": 3},
{"matrix": [7, 2], "x": 9, "y": 3},
{"matrix": [3, 3], "x": 10, "y": 3},
{"matrix": [3, 4], "x": 11, "y": 3}
]
},
"LAYOUT_planck_1x2uC": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [4, 0], "x": 6, "y": 0},
{"matrix": [4, 1], "x": 7, "y": 0},
{"matrix": [4, 2], "x": 8, "y": 0},
{"matrix": [4, 3], "x": 9, "y": 0},
{"matrix": [4, 4], "x": 10, "y": 0},
{"matrix": [4, 5], "x": 11, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1, "y": 1},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [1, 3], "x": 3, "y": 1},
{"matrix": [1, 4], "x": 4, "y": 1},
{"matrix": [1, 5], "x": 5, "y": 1},
{"matrix": [5, 0], "x": 6, "y": 1},
{"matrix": [5, 1], "x": 7, "y": 1},
{"matrix": [5, 2], "x": 8, "y": 1},
{"matrix": [5, 3], "x": 9, "y": 1},
{"matrix": [5, 4], "x": 10, "y": 1},
{"matrix": [5, 5], "x": 11, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1, "y": 2},
{"matrix": [2, 2], "x": 2, "y": 2},
{"matrix": [2, 3], "x": 3, "y": 2},
{"matrix": [2, 4], "x": 4, "y": 2},
{"matrix": [2, 5], "x": 5, "y": 2},
{"matrix": [6, 0], "x": 6, "y": 2},
{"matrix": [6, 1], "x": 7, "y": 2},
{"matrix": [6, 2], "x": 8, "y": 2},
{"matrix": [6, 3], "x": 9, "y": 2},
{"matrix": [6, 4], "x": 10, "y": 2},
{"matrix": [6, 5], "x": 11, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3},
{"matrix": [3, 1], "x": 1, "y": 3},
{"matrix": [3, 2], "x": 2, "y": 3},
{"matrix": [7, 3], "x": 3, "y": 3},
{"matrix": [7, 4], "x": 4, "y": 3},
{"matrix": [7, 5], "x": 5, "y": 3, "w": 2},
{"matrix": [7, 0], "x": 7, "y": 3},
{"matrix": [7, 1], "x": 8, "y": 3},
{"matrix": [7, 2], "x": 9, "y": 3},
{"matrix": [3, 3], "x": 10, "y": 3},
{"matrix": [3, 4], "x": 11, "y": 3}
]
}
}
}

View File

@ -0,0 +1,17 @@
{
"keyboard": "zsa/planck_ez/base",
"keymap": "default",
"layers": [
["KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC", "KC_ESC", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", "KC_QUOT", "KC_LSFT", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_ENT", "CW_TOGG", "KC_LCTL", "KC_LALT", "KC_LGUI", "TL_LOWR", "KC_SPC", "TL_UPPR", "KC_LEFT", "KC_DOWN", "KC_UP", "KC_RGHT"],
["KC_TILD", "KC_EXLM", "KC_AT", "KC_HASH", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "KC_BSPC", "KC_DEL", "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_UNDS", "KC_PLUS", "KC_LCBR", "KC_RCBR", "KC_PIPE", "KC_TRNS", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", "S(KC_NUHS)", "S(KC_NUBS)", "KC_HOME", "KC_END", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MNXT", "KC_VOLD", "KC_VOLU", "KC_MPLY"],
["KC_GRV", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_BSPC", "KC_DEL", "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_MINS", "KC_EQL", "KC_LBRC", "KC_RBRC", "KC_BSLS", "KC_TRNS", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", "KC_NUHS", "KC_NUBS", "KC_PGUP", "KC_PGDN", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MNXT", "KC_VOLD", "KC_VOLU", "KC_MPLY"],
["KC_TRNS", "QK_BOOT", "DB_TOGG", "RGB_TOG", "RGB_MOD", "RGB_HUI", "RGB_HUD", "RGB_SAI", "RGB_SAD", "RGB_VAI", "RGB_VAD", "KC_DEL", "KC_TRNS", "KC_TRNS", "MU_NEXT", "AU_ON", "AU_OFF", "AG_NORM", "AG_SWAP", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "AU_PREV", "AU_NEXT", "MU_ON", "MU_OFF", "MI_ON", "MI_OFF", "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"]
],
"layout": "LAYOUT_planck_1x2uC",
"config": {
"features": {
"tri_layer": true,
"caps_word": true
}
}
}

View File

@ -35,7 +35,3 @@
#define STM32_DAC_USE_DAC1_CH2 TRUE
#undef STM32_GPT_USE_TIM6
#define STM32_GPT_USE_TIM6 TRUE
#undef STM32_GPT_USE_TIM7
#define STM32_GPT_USE_TIM7 TRUE
#undef STM32_GPT_USE_TIM8
#define STM32_GPT_USE_TIM8 TRUE

View File

@ -15,98 +15,13 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ez.h"
#include "planck_ez.h"
#include <ch.h>
#include <hal.h>
#include "keycodes.h"
keyboard_config_t keyboard_config;
#ifdef RGB_MATRIX_ENABLE
const is31fl3737_led_t PROGMEM g_is31fl3737_leds[IS31FL3737_LED_COUNT] = {
/* Refer to IS31 manual for these locations
* driver
* | R location
* | | G location
* | | | B location
* | | | | */
{0, SW2_CS12, SW1_CS12, SW3_CS12},
{0, SW2_CS11, SW1_CS11, SW3_CS11},
{0, SW2_CS10, SW1_CS10, SW3_CS10},
{0, SW2_CS9, SW1_CS9, SW3_CS9},
{0, SW2_CS8, SW1_CS8, SW3_CS8},
{0, SW2_CS7, SW1_CS7, SW3_CS7},
{0, SW8_CS12, SW7_CS12, SW9_CS12},
{0, SW8_CS11, SW7_CS11, SW9_CS11},
{0, SW8_CS10, SW7_CS10, SW9_CS10},
{0, SW8_CS9, SW7_CS9, SW9_CS9},
{0, SW8_CS8, SW7_CS8, SW9_CS8},
{0, SW8_CS7, SW7_CS7, SW9_CS7},
{0, SW2_CS6, SW1_CS6, SW3_CS6},
{0, SW2_CS5, SW1_CS5, SW3_CS5},
{0, SW2_CS4, SW1_CS4, SW3_CS4},
{0, SW2_CS3, SW1_CS3, SW3_CS3},
{0, SW2_CS2, SW1_CS2, SW3_CS2},
{0, SW2_CS1, SW1_CS1, SW3_CS1},
{0, SW8_CS6, SW7_CS6, SW9_CS6},
{0, SW8_CS5, SW7_CS5, SW9_CS5},
{0, SW8_CS4, SW7_CS4, SW9_CS4},
{0, SW8_CS3, SW7_CS3, SW9_CS3},
{0, SW8_CS2, SW7_CS2, SW9_CS2},
{0, SW8_CS1, SW7_CS1, SW9_CS1},
{0, SW5_CS12, SW4_CS12, SW6_CS12},
{0, SW5_CS11, SW4_CS11, SW6_CS11},
{0, SW5_CS10, SW4_CS10, SW6_CS10},
{0, SW5_CS9, SW4_CS9, SW6_CS9},
{0, SW5_CS8, SW4_CS8, SW6_CS8},
{0, SW5_CS7, SW4_CS7, SW6_CS7},
{0, SW11_CS12, SW10_CS12, SW12_CS12},
{0, SW11_CS11, SW10_CS11, SW12_CS11},
{0, SW11_CS10, SW10_CS10, SW12_CS10},
{0, SW11_CS9, SW10_CS9, SW12_CS9},
{0, SW11_CS8, SW10_CS8, SW12_CS8},
{0, SW11_CS7, SW10_CS7, SW12_CS7},
{0, SW5_CS6, SW4_CS6, SW6_CS6},
{0, SW5_CS5, SW4_CS5, SW6_CS5},
{0, SW5_CS4, SW4_CS4, SW6_CS4},
{0, SW5_CS3, SW4_CS3, SW6_CS3},
{0, SW5_CS2, SW4_CS2, SW6_CS2},
{0, SW5_CS1, SW4_CS1, SW6_CS1},
{0, SW11_CS6, SW10_CS6, SW12_CS6},
{0, SW11_CS5, SW10_CS5, SW12_CS5},
{0, SW11_CS4, SW10_CS4, SW12_CS4},
{0, SW11_CS3, SW10_CS3, SW12_CS3},
{0, SW11_CS2, SW10_CS2, SW12_CS2},
};
led_config_t g_led_config = { {
{ 0, 1, 2, 3, 4, 5 },
{ 12, 13, 14, 15, 16, 17 },
{ 24, 25, 26, 27, 28, 29 },
{ 36, 37, 38, 45, 46, NO_LED },
{ 6, 7, 8, 9, 10, 11 },
{ 18, 19, 20, 21, 22, 23 },
{ 30, 31, 32, 33, 34, 35 },
{ 42, 43, 44, 39, 40, 41 }
}, {
{ 0, 0 }, { 20, 0 }, { 40, 0 }, { 61, 0 }, { 81, 0 }, { 101, 0 }, { 122, 0 }, { 142, 0 }, { 162, 0 }, { 183, 0 }, { 203, 0 }, { 223, 0 },
{ 0, 21 }, { 20, 21 }, { 40, 21 }, { 61, 21 }, { 81, 21 }, { 101, 21 }, { 122, 21 }, { 142, 21 }, { 162, 21 }, { 183, 21 }, { 203, 21 }, { 223, 21 },
{ 0, 42 }, { 20, 42 }, { 40, 42 }, { 61, 42 }, { 81, 42 }, { 101, 42 }, { 122, 42 }, { 142, 42 }, { 162, 42 }, { 183, 42 }, { 203, 42 }, { 223, 42 },
{ 0, 63 }, { 20, 63 }, { 40, 63 }, { 61, 63 }, { 81, 63 }, { 111, 63 }, { 142, 63 }, { 162, 63 }, { 183, 63 }, { 203, 63 }, { 223, 63 }
}, {
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1
} };
#endif
/* Left B9 Right B8 */
@ -236,13 +151,13 @@ void eeconfig_init_kb(void) { // EEPROM is getting reset!
#ifndef PLANCK_EZ_USER_LEDS
#ifndef PLANCK_EZ_LED_LOWER
# define PLANCK_EZ_LED_LOWER 3
# define PLANCK_EZ_LED_LOWER 1
#endif
#ifndef PLANCK_EZ_LED_RAISE
# define PLANCK_EZ_LED_RAISE 4
# define PLANCK_EZ_LED_RAISE 2
#endif
#ifndef PLANCK_EZ_LED_ADJUST
# define PLANCK_EZ_LED_ADJUST 6
# define PLANCK_EZ_LED_ADJUST 3
#endif
layer_state_t layer_state_set_kb(layer_state_t state) {
@ -331,6 +246,8 @@ bool music_mask_kb(uint16_t keycode) {
case AU_ON ... AU_PREV:
case QK_BOOT:
case QK_CLEAR_EEPROM:
case QK_TRI_LAYER_LOWER:
case QK_TRI_LAYER_UPPER:
return false;
default:
return music_mask_user(keycode);
@ -345,7 +262,7 @@ const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
{{5, 5}, {4, 5}, {3, 5}, {2, 5}, {1, 5}, {0, 5}},
{{5, 6}, {4, 6}, {3, 6}, {2, 6}, {1, 6}, {0, 6}},
{{5, 3}, {4, 3}, {3, 3}, {2, 3}, {1, 3}, {0, 3}},
{{5, 0}, {4, 0}, {3, 0}, {2, 0}, {1, 0}, {0, 0}},
{{5, 1}, {4, 1}, {3, 1}, {2, 1}, {1, 1}, {0, 1}},
{{5, 2}, {4, 2}, {3, 2}, {2, 2}, {1, 2}, {0, 2}},

View File

@ -6,15 +6,15 @@ A variant of the Planck featuring a 2u spacebar and per-key RGB backlighting.
Keyboard Maintainer: [Jack Humbert](https://github.com/jackhumbert), [Drashna Jael're](https://github.com/drashna)
Hardware Supported: Planck EZ
Hardware Availability: [ZSA](https://www.zsa.io/planck/)
Hardware Availability: [ZSA](https://www.zsa.io/planck/) (discontinued)
Make example for this keyboard (after setting up your build environment):
make planck/ez:oryx
make zsa/planck_ez/base:default
For the per key RGB version of this keyboard, you want to use the "glow" subdirectory. For example:
make planck/ez/glow:oryx
make zsa/planck_ez/glow:default
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
@ -22,30 +22,30 @@ See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_to
To enable the features from Oryx (ZSA's Configurator), either compile the the `oryx` keymap, or add `#define ORYX_CONFIGURATOR` to your `config.h` file.
This enables the front Indicator LEDs, and the `TOGGLE_LAYER_COLOR`, and `LED_LEVEL` keycodes. The `TOGGLE_LAYER_COLOR` keycode toggles the customized LED map configured on Oryx. The `LED_LEVEL` cycles through the brightness levels for the front "teeth" LEDs.
This enables the front Indicator LEDs, and the `TOGGLE_LAYER_COLOR`, and `LED_LEVEL` keycodes. The `TOGGLE_LAYER_COLOR` keycode toggles the customized LED map configured on Oryx. The `LED_LEVEL` cycles through the brightness levels for the front "teeth" LEDs.
### Indicator LEDs
The two front "teeth" LED indicators are PWM controlled. If you have `ORYX_CONFIGURATOR` defined in your keymap's `config.h`, you can use the `LED_LEVEL` to cycle through preset vales (0, 25%, 50%, 75%, 100%), and will be saved to EEPROM (persistent storage)
Alternatively, you can set the brightness by calling the following functions:
Alternatively, you can set the brightness by calling the following functions:
```c
void planck_ez_right_led_level(uint8_t level);
void planck_ez_left_led_level(uint8_t level);
```
These settings are not persistent, so you'd need to reset it every time the board starts.
These settings are not persistent, so you'd need to reset it every time the board starts.
These are on a 0-255 scale
These are on a 0-255 scale
#### Layer indication
#### Layer indication
By default, the indicator lights are used for layer indication, expecting the specific layers used in the default keymap. However, this may not work for you. And if that is the case, you can add `#define PLANCK_EZ_USER_LEDS` to your `config.h` file.
By default, the indicator lights are used for layer indication, expecting the specific layers used in the default keymap. However, this may not work for you. And if that is the case, you can add `#define PLANCK_EZ_USER_LEDS` to your `config.h` file.
This will remove the default behavior for changing the LEDs based on layer, and allow you to control them manually.
This will remove the default behavior for changing the LEDs based on layer, and allow you to control them manually.
Alternatively, you can use the following defines in your keymap's `config.h` to control which layers are used, as long as you have `ORYX_CONFIGURATOR` defined in your keymap's `config.h` file, as well.
Alternatively, you can use the following defines in your keymap's `config.h` to control which layers are used, as long as you have `ORYX_CONFIGURATOR` defined in your keymap's `config.h` file, as well.
```c
#define PLANCK_EZ_LED_LOWER 3
@ -57,8 +57,8 @@ This will allow you to change the layers that are used, without having to add an
### RGB Matrix Features
If you're using the Smart LED (layer indication) feature from the Oryx Configurator, you want to make sure that you enable these options by adding `#define ORYX_CONFIGURATOR` to your keymap's `config.h`.
If you're using the Smart LED (layer indication) feature from the Oryx Configurator, you want to make sure that you enable these options by adding `#define ORYX_CONFIGURATOR` to your keymap's `config.h`.
This changes the `RGB_TOG` keycode so that it will toggle the lights on and off, in a way that will allow the Smart LEDs to continue to work, even with the rest of the LEDs turned off.
This changes the `RGB_TOG` keycode so that it will toggle the lights on and off, in a way that will allow the Smart LEDs to continue to work, even with the rest of the LEDs turned off.
Additionally, a new keycode has been added to toggle the Smart LEDs. Use `TOGGLE_LAYER_COLOR`, if you aren't already.

View File

@ -1,4 +1,4 @@
RGBLIGHT_SUPPORTED = no
BAKCLIGHT_SUPPORTED = no
DEFAULT_FOLDER = planck/ez/base
DEFAULT_FOLDER = zsa/planck_ez/base

View File

@ -21,18 +21,26 @@ static uint32_t dynamic_macro_led(uint32_t trigger_time, void *cb_arg) {
return 100;
}
void dynamic_macro_record_start_user(int8_t direction) {
bool dynamic_macro_record_start_kb(int8_t direction) {
if (!dynamic_macro_record_start_user(direction)) {
return false;
}
if (dynamic_macro_token == INVALID_DEFERRED_TOKEN) {
STATUS_LED_3(true);
dynamic_macro_token = defer_exec(100, dynamic_macro_led, NULL);
}
return true;
}
void dynamic_macro_record_end_user(int8_t direction) {
bool dynamic_macro_record_end_kb(int8_t direction) {
if (!dynamic_macro_record_end_user(direction)) {
return false;
}
if (cancel_deferred_exec(dynamic_macro_token)) {
dynamic_macro_token = INVALID_DEFERRED_TOKEN;
STATUS_LED_3(false);
}
return true;
}
# endif

View File

@ -187,5 +187,5 @@ def doctor(cli):
return 1
else:
cli.log.info('{fg_red}Major problems detected, please fix these problems before proceeding.')
cli.log.info('{fg_blue}Check out the FAQ (https://docs.qmk.fm/#/faq_build) or join the QMK Discord (https://discord.gg/Uq7gcHh) for help.')
cli.log.info('{fg_blue}Check out the FAQ (https://docs.qmk.fm/#/faq_build) or join the QMK Discord (https://discord.gg/qmk) for help.')
return 2

View File

@ -546,9 +546,6 @@ ifneq ($(findstring STM32G431, $(MCU)),)
# Bootloader address for STM32 DFU
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
# Default to transient driver as ChibiOS EFL is currently broken for single-bank G4xx devices
EEPROM_DRIVER ?= transient
endif
ifneq ($(findstring STM32G474, $(MCU)),)

View File

@ -1,264 +0,0 @@
/* Copyright 2016 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/>.
*/
/* Author: Wojciech Siewierski < wojciech dot siewierski at onet dot pl > */
#pragma once
/* Warn users that this is now deprecated and they should use the core feature instead. */
#pragma message "Dynamic Macros is now a core feature. See updated documentation to see how to configure it: https://docs.qmk.fm/#/feature_dynamic_macros"
#include "action_layer.h"
#ifndef DYNAMIC_MACRO_SIZE
/* May be overridden with a custom value. Be aware that the effective
* macro length is half of this value: each keypress is recorded twice
* because of the down-event and up-event. This is not a bug, it's the
* intended behavior.
*
* Usually it should be fine to set the macro size to at least 256 but
* there have been reports of it being too much in some users' cases,
* so 128 is considered a safe default.
*/
# define DYNAMIC_MACRO_SIZE 128
#endif
/* Blink the LEDs to notify the user about some event. */
void dynamic_macro_led_blink(void) {
#ifdef BACKLIGHT_ENABLE
backlight_toggle();
wait_ms(100);
backlight_toggle();
#endif
}
/* Convenience macros used for retrieving the debug info. All of them
* need a `direction` variable accessible at the call site.
*/
#define DYNAMIC_MACRO_CURRENT_SLOT() (direction > 0 ? 1 : 2)
#define DYNAMIC_MACRO_CURRENT_LENGTH(BEGIN, POINTER) ((int)(direction * ((POINTER) - (BEGIN))))
#define DYNAMIC_MACRO_CURRENT_CAPACITY(BEGIN, END2) ((int)(direction * ((END2) - (BEGIN)) + 1))
/**
* Start recording of the dynamic macro.
*
* @param[out] macro_pointer The new macro buffer iterator.
* @param[in] macro_buffer The macro buffer used to initialize macro_pointer.
*/
void dynamic_macro_record_start(keyrecord_t **macro_pointer, keyrecord_t *macro_buffer) {
dprintln("dynamic macro recording: started");
dynamic_macro_led_blink();
clear_keyboard();
layer_clear();
*macro_pointer = macro_buffer;
}
/**
* Play the dynamic macro.
*
* @param macro_buffer[in] The beginning of the macro buffer being played.
* @param macro_end[in] The element after the last macro buffer element.
* @param direction[in] Either +1 or -1, which way to iterate the buffer.
*/
void dynamic_macro_play(keyrecord_t *macro_buffer, keyrecord_t *macro_end, int8_t direction) {
dprintf("dynamic macro: slot %d playback\n", DYNAMIC_MACRO_CURRENT_SLOT());
uint32_t saved_layer_state = layer_state;
clear_keyboard();
layer_clear();
while (macro_buffer != macro_end) {
process_record(macro_buffer);
macro_buffer += direction;
}
clear_keyboard();
layer_state = saved_layer_state;
}
/**
* Record a single key in a dynamic macro.
*
* @param macro_buffer[in] The start of the used macro buffer.
* @param macro_pointer[in,out] The current buffer position.
* @param macro2_end[in] The end of the other macro.
* @param direction[in] Either +1 or -1, which way to iterate the buffer.
* @param record[in] The current keypress.
*/
void dynamic_macro_record_key(keyrecord_t *macro_buffer, keyrecord_t **macro_pointer, keyrecord_t *macro2_end, int8_t direction, keyrecord_t *record) {
/* If we've just started recording, ignore all the key releases. */
if (!record->event.pressed && *macro_pointer == macro_buffer) {
dprintln("dynamic macro: ignoring a leading key-up event");
return;
}
/* The other end of the other macro is the last buffer element it
* is safe to use before overwriting the other macro.
*/
if (*macro_pointer - direction != macro2_end) {
**macro_pointer = *record;
*macro_pointer += direction;
} else {
dynamic_macro_led_blink();
}
dprintf("dynamic macro: slot %d length: %d/%d\n", DYNAMIC_MACRO_CURRENT_SLOT(), DYNAMIC_MACRO_CURRENT_LENGTH(macro_buffer, *macro_pointer), DYNAMIC_MACRO_CURRENT_CAPACITY(macro_buffer, macro2_end));
}
/**
* End recording of the dynamic macro. Essentially just update the
* pointer to the end of the macro.
*/
void dynamic_macro_record_end(keyrecord_t *macro_buffer, keyrecord_t *macro_pointer, int8_t direction, keyrecord_t **macro_end) {
dynamic_macro_led_blink();
/* Do not save the keys being held when stopping the recording,
* i.e. the keys used to access the layer DM_RSTP is on.
*/
while (macro_pointer != macro_buffer && (macro_pointer - direction)->event.pressed) {
dprintln("dynamic macro: trimming a trailing key-down event");
macro_pointer -= direction;
}
dprintf("dynamic macro: slot %d saved, length: %d\n", DYNAMIC_MACRO_CURRENT_SLOT(), DYNAMIC_MACRO_CURRENT_LENGTH(macro_buffer, macro_pointer));
*macro_end = macro_pointer;
}
/* Handle the key events related to the dynamic macros. Should be
* called from process_record_user() like this:
*
* bool process_record_user(uint16_t keycode, keyrecord_t *record) {
* if (!process_record_dynamic_macro(keycode, record)) {
* return false;
* }
* <...THE REST OF THE FUNCTION...>
* }
*/
bool process_record_dynamic_macro(uint16_t keycode, keyrecord_t *record) {
/* Both macros use the same buffer but read/write on different
* ends of it.
*
* Macro1 is written left-to-right starting from the beginning of
* the buffer.
*
* Macro2 is written right-to-left starting from the end of the
* buffer.
*
* &macro_buffer macro_end
* v v
* +------------------------------------------------------------+
* |>>>>>> MACRO1 >>>>>> <<<<<<<<<<<<< MACRO2 <<<<<<<<<<<<<|
* +------------------------------------------------------------+
* ^ ^
* r_macro_end r_macro_buffer
*
* During the recording when one macro encounters the end of the
* other macro, the recording is stopped. Apart from this, there
* are no arbitrary limits for the macros' length in relation to
* each other: for example one can either have two medium sized
* macros or one long macro and one short macro. Or even one empty
* and one using the whole buffer.
*/
static keyrecord_t macro_buffer[DYNAMIC_MACRO_SIZE];
/* Pointer to the first buffer element after the first macro.
* Initially points to the very beginning of the buffer since the
* macro is empty. */
static keyrecord_t *macro_end = macro_buffer;
/* The other end of the macro buffer. Serves as the beginning of
* the second macro. */
static keyrecord_t *const r_macro_buffer = macro_buffer + DYNAMIC_MACRO_SIZE - 1;
/* Like macro_end but for the second macro. */
static keyrecord_t *r_macro_end = r_macro_buffer;
/* A persistent pointer to the current macro position (iterator)
* used during the recording. */
static keyrecord_t *macro_pointer = NULL;
/* 0 - no macro is being recorded right now
* 1,2 - either macro 1 or 2 is being recorded */
static uint8_t macro_id = 0;
if (macro_id == 0) {
/* No macro recording in progress. */
if (!record->event.pressed) {
switch (keycode) {
case QK_DYNAMIC_MACRO_RECORD_START_1:
dynamic_macro_record_start(&macro_pointer, macro_buffer);
macro_id = 1;
return false;
case QK_DYNAMIC_MACRO_RECORD_START_2:
dynamic_macro_record_start(&macro_pointer, r_macro_buffer);
macro_id = 2;
return false;
case QK_DYNAMIC_MACRO_PLAY_1:
dynamic_macro_play(macro_buffer, macro_end, +1);
return false;
case QK_DYNAMIC_MACRO_PLAY_2:
dynamic_macro_play(r_macro_buffer, r_macro_end, -1);
return false;
}
}
} else {
/* A macro is being recorded right now. */
switch (keycode) {
case QK_DYNAMIC_MACRO_RECORD_STOP:
/* Stop the macro recording. */
if (record->event.pressed) { /* Ignore the initial release
* just after the recoding
* starts. */
switch (macro_id) {
case 1:
dynamic_macro_record_end(macro_buffer, macro_pointer, +1, &macro_end);
break;
case 2:
dynamic_macro_record_end(r_macro_buffer, macro_pointer, -1, &r_macro_end);
break;
}
macro_id = 0;
}
return false;
case QK_DYNAMIC_MACRO_PLAY_1:
case QK_DYNAMIC_MACRO_PLAY_2:
dprintln("dynamic macro: ignoring macro play key while recording");
return false;
default:
/* Store the key in the macro buffer and process it normally. */
switch (macro_id) {
case 1:
dynamic_macro_record_key(macro_buffer, &macro_pointer, r_macro_end, +1, record);
break;
case 2:
dynamic_macro_record_key(r_macro_buffer, &macro_pointer, macro_end, -1, record);
break;
}
return true;
break;
}
}
return true;
}
#undef DYNAMIC_MACRO_CURRENT_SLOT
#undef DYNAMIC_MACRO_CURRENT_LENGTH
#undef DYNAMIC_MACRO_CURRENT_CAPACITY

View File

@ -38,20 +38,44 @@ void dynamic_macro_led_blink(void) {
/* User hooks for Dynamic Macros */
__attribute__((weak)) void dynamic_macro_record_start_user(int8_t direction) {
dynamic_macro_led_blink();
__attribute__((weak)) bool dynamic_macro_record_start_kb(int8_t direction) {
return dynamic_macro_record_start_user(direction);
}
__attribute__((weak)) void dynamic_macro_play_user(int8_t direction) {
__attribute__((weak)) bool dynamic_macro_record_start_user(int8_t direction) {
dynamic_macro_led_blink();
return true;
}
__attribute__((weak)) void dynamic_macro_record_key_user(int8_t direction, keyrecord_t *record) {
dynamic_macro_led_blink();
__attribute__((weak)) bool dynamic_macro_play_kb(int8_t direction) {
return dynamic_macro_play_user(direction);
}
__attribute__((weak)) void dynamic_macro_record_end_user(int8_t direction) {
__attribute__((weak)) bool dynamic_macro_play_user(int8_t direction) {
dynamic_macro_led_blink();
return true;
}
__attribute__((weak)) bool dynamic_macro_record_key_kb(int8_t direction, keyrecord_t *record) {
return dynamic_macro_record_key_user(direction, record);
}
__attribute__((weak)) bool dynamic_macro_record_key_user(int8_t direction, keyrecord_t *record) {
dynamic_macro_led_blink();
return true;
}
__attribute__((weak)) bool dynamic_macro_record_end_kb(int8_t direction) {
return dynamic_macro_record_end_user(direction);
}
__attribute__((weak)) bool dynamic_macro_record_end_user(int8_t direction) {
dynamic_macro_led_blink();
return true;
}
__attribute__((weak)) bool dynamic_macro_valid_key_kb(uint16_t keycode, keyrecord_t *record) {
return dynamic_macro_valid_key_user(keycode, record);
}
__attribute__((weak)) bool dynamic_macro_valid_key_user(uint16_t keycode, keyrecord_t *record) {
@ -74,7 +98,7 @@ __attribute__((weak)) bool dynamic_macro_valid_key_user(uint16_t keycode, keyrec
void dynamic_macro_record_start(keyrecord_t **macro_pointer, keyrecord_t *macro_buffer, int8_t direction) {
dprintln("dynamic macro recording: started");
dynamic_macro_record_start_user(direction);
dynamic_macro_record_start_kb(direction);
clear_keyboard();
layer_clear();
@ -108,7 +132,7 @@ void dynamic_macro_play(keyrecord_t *macro_buffer, keyrecord_t *macro_end, int8_
layer_state_set(saved_layer_state);
dynamic_macro_play_user(direction);
dynamic_macro_play_kb(direction);
}
/**
@ -134,7 +158,7 @@ void dynamic_macro_record_key(keyrecord_t *macro_buffer, keyrecord_t **macro_poi
**macro_pointer = *record;
*macro_pointer += direction;
}
dynamic_macro_record_key_user(direction, record);
dynamic_macro_record_key_kb(direction, record);
dprintf("dynamic macro: slot %d length: %d/%d\n", DYNAMIC_MACRO_CURRENT_SLOT(), DYNAMIC_MACRO_CURRENT_LENGTH(macro_buffer, *macro_pointer), DYNAMIC_MACRO_CURRENT_CAPACITY(macro_buffer, macro2_end));
}
@ -144,7 +168,7 @@ void dynamic_macro_record_key(keyrecord_t *macro_buffer, keyrecord_t **macro_poi
* pointer to the end of the macro.
*/
void dynamic_macro_record_end(keyrecord_t *macro_buffer, keyrecord_t *macro_pointer, int8_t direction, keyrecord_t **macro_end) {
dynamic_macro_record_end_user(direction);
dynamic_macro_record_end_kb(direction);
/* Do not save the keys being held when stopping the recording,
* i.e. the keys used to access the layer DM_RSTP is on.
@ -220,15 +244,7 @@ void dynamic_macro_stop_recording(void) {
macro_id = 0;
}
/* Handle the key events related to the dynamic macros. Should be
* called from process_record_user() like this:
*
* bool process_record_user(uint16_t keycode, keyrecord_t *record) {
* if (!process_record_dynamic_macro(keycode, record)) {
* return false;
* }
* <...THE REST OF THE FUNCTION...>
* }
/* Handle the key events related to the dynamic macros.
*/
bool process_dynamic_macro(uint16_t keycode, keyrecord_t *record) {
if (macro_id == 0) {
@ -271,7 +287,7 @@ bool process_dynamic_macro(uint16_t keycode, keyrecord_t *record) {
return false;
#endif
default:
if (dynamic_macro_valid_key_user(keycode, record)) {
if (dynamic_macro_valid_key_kb(keycode, record)) {
/* Store the key in the macro buffer and process it normally. */
switch (macro_id) {
case 1:

View File

@ -37,8 +37,14 @@
void dynamic_macro_led_blink(void);
bool process_dynamic_macro(uint16_t keycode, keyrecord_t *record);
void dynamic_macro_record_start_user(int8_t direction);
void dynamic_macro_play_user(int8_t direction);
void dynamic_macro_record_key_user(int8_t direction, keyrecord_t *record);
void dynamic_macro_record_end_user(int8_t direction);
bool dynamic_macro_record_start_kb(int8_t direction);
bool dynamic_macro_record_start_user(int8_t direction);
bool dynamic_macro_play_kb(int8_t direction);
bool dynamic_macro_play_user(int8_t direction);
bool dynamic_macro_record_key_kb(int8_t direction, keyrecord_t *record);
bool dynamic_macro_record_key_user(int8_t direction, keyrecord_t *record);
bool dynamic_macro_record_end_kb(int8_t direction);
bool dynamic_macro_record_end_user(int8_t direction);
bool dynamic_macro_valid_key_kb(uint16_t keycode, keyrecord_t *record);
bool dynamic_macro_valid_key_user(uint16_t keycode, keyrecord_t *record);
void dynamic_macro_stop_recording(void);

View File

@ -7,11 +7,11 @@ RGB_MATRIX_EFFECT(RIVERFLOW)
bool RIVERFLOW(effect_params_t* params) {
RGB_MATRIX_USE_LIMITS(led_min, led_max);
for (uint8_t i = led_min; i < led_max; i++) {
RGB_MATRIX_TEST_LED_FLAGS();
HSV hsv = rgb_matrix_config.hsv;
uint16_t time = scale16by8(g_rgb_timer + (i * 315), rgb_matrix_config.speed / 8);
hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v);
RGB rgb = rgb_matrix_hsv_to_rgb(hsv);
RGB_MATRIX_TEST_LED_FLAGS();
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
}

View File

@ -2,25 +2,26 @@
RGB_MATRIX_EFFECT(STARLIGHT)
# ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
void set_starlight_color(int i, effect_params_t* params) {
void set_starlight_color(uint8_t i, effect_params_t* params) {
uint16_t time = scale16by8(g_rgb_timer, rgb_matrix_config.speed / 8);
HSV hsv = rgb_matrix_config.hsv;
hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v);
RGB rgb = hsv_to_rgb(hsv);
RGB rgb = rgb_matrix_hsv_to_rgb(hsv);
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
}
bool STARLIGHT(effect_params_t* params) {
if (!params->init) {
if (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 5)) % 5 == 0) {
int rand_led = rand() % RGB_MATRIX_LED_COUNT;
uint8_t rand_led = random8_max(RGB_MATRIX_LED_COUNT);
set_starlight_color(rand_led, params);
}
return false;
}
RGB_MATRIX_USE_LIMITS(led_min, led_max);
for (int i = led_min; i < led_max; i++) {
for (uint8_t i = led_min; i < led_max; i++) {
RGB_MATRIX_TEST_LED_FLAGS();
set_starlight_color(i, params);
}
return rgb_matrix_check_finished_leds(led_max);

View File

@ -2,26 +2,27 @@
RGB_MATRIX_EFFECT(STARLIGHT_DUAL_HUE)
# ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
void set_starlight_dual_hue_color(int i, effect_params_t* params) {
void set_starlight_dual_hue_color(uint8_t i, effect_params_t* params) {
uint16_t time = scale16by8(g_rgb_timer, rgb_matrix_config.speed / 8);
HSV hsv = rgb_matrix_config.hsv;
hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v);
hsv.h = hsv.h + (rand() % (30 + 1 - -30) + -30);
RGB rgb = hsv_to_rgb(hsv);
hsv.h = hsv.h + random8_max((30 + 1 - -30) + -30);
RGB rgb = rgb_matrix_hsv_to_rgb(hsv);
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
}
bool STARLIGHT_DUAL_HUE(effect_params_t* params) {
if (!params->init) {
if (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 5)) % 5 == 0) {
int rand_led = rand() % RGB_MATRIX_LED_COUNT;
uint8_t rand_led = random8_max(RGB_MATRIX_LED_COUNT);
set_starlight_dual_hue_color(rand_led, params);
}
return false;
}
RGB_MATRIX_USE_LIMITS(led_min, led_max);
for (int i = led_min; i < led_max; i++) {
for (uint8_t i = led_min; i < led_max; i++) {
RGB_MATRIX_TEST_LED_FLAGS();
set_starlight_dual_hue_color(i, params);
}
return rgb_matrix_check_finished_leds(led_max);

View File

@ -2,26 +2,27 @@
RGB_MATRIX_EFFECT(STARLIGHT_DUAL_SAT)
# ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
void set_starlight_dual_sat_color(int i, effect_params_t* params) {
void set_starlight_dual_sat_color(uint8_t i, effect_params_t* params) {
uint16_t time = scale16by8(g_rgb_timer, rgb_matrix_config.speed / 8);
HSV hsv = rgb_matrix_config.hsv;
hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v);
hsv.s = hsv.s + (rand() % (30 + 1 - -30) + -30);
RGB rgb = hsv_to_rgb(hsv);
hsv.s = hsv.s + random8_max((30 + 1 - -30) + -30);
RGB rgb = rgb_matrix_hsv_to_rgb(hsv);
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
}
bool STARLIGHT_DUAL_SAT(effect_params_t* params) {
if (!params->init) {
if (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 5)) % 5 == 0) {
int rand_led = rand() % RGB_MATRIX_LED_COUNT;
uint8_t rand_led = random8_max(RGB_MATRIX_LED_COUNT);
set_starlight_dual_sat_color(rand_led, params);
}
return false;
}
RGB_MATRIX_USE_LIMITS(led_min, led_max);
for (int i = led_min; i < led_max; i++) {
for (uint8_t i = led_min; i < led_max; i++) {
RGB_MATRIX_TEST_LED_FLAGS();
set_starlight_dual_sat_color(i, params);
}
return rgb_matrix_check_finished_leds(led_max);

View File

@ -5,7 +5,7 @@ Warning- This is the `develop` branch of QMK Firmware. You may encounter broken
# Quantum Mechanical Keyboard Firmware
[![Current Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags)
[![Discord](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/Uq7gcHh)
[![Discord](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/qmk)
[![Docs Status](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm)
[![GitHub contributors](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly)
[![GitHub forks](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/)

View File

@ -88,7 +88,13 @@ void send_nkro(report_nkro_t *report) {
__disable_irq();
__DMB();
memcpy(udi_hid_nkro_report, report, UDI_HID_NKRO_REPORT_SIZE);
/*
Skipping ahead `sizeof(report->report_id)` bytes
since `report_id` is not used by this driver
*/
void *report_no_report_id = (void *)((char *)report + sizeof(report->report_id));
memcpy(udi_hid_nkro_report, report_no_report_id, UDI_HID_NKRO_REPORT_SIZE);
udi_hid_nkro_b_report_valid = 1;
udi_hid_nkro_send_report();
@ -105,7 +111,17 @@ void send_mouse(report_mouse_t *report) {
__disable_irq();
__DMB();
# ifdef MOUSE_SHARED_EP
/*
Skipping ahead `sizeof(report->report_id)` bytes
since `report_id` is not used by this driver
*/
void *report_no_report_id = (void *)((char *)report + sizeof(report->report_id));
memcpy(udi_hid_mou_report, report_no_report_id, UDI_HID_MOU_REPORT_SIZE);
# else
memcpy(udi_hid_mou_report, report, UDI_HID_MOU_REPORT_SIZE);
# endif
udi_hid_mou_b_report_valid = 1;
udi_hid_mou_send_report();

View File

@ -4,7 +4,7 @@ _qmk_install() {
echo "Installing dependencies"
. /etc/os-release
if [ "$VERSION_ID" == "39" ]; then
if [ "$VERSION_ID" -ge "39" ]; then
sudo dnf $SKIP_PROMPT copr enable erovia/dfu-programmer
fi