Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
70ce4ba56f | ||
|
|
1b0272e801 | ||
|
|
22ceab9c08 | ||
|
|
930446fe96 | ||
|
|
dd763f2988 | ||
|
|
83c7c66e8c | ||
|
|
ec7abc2ce2 | ||
|
|
0b894ca99c | ||
|
|
cdb69da86e | ||
|
|
c18cbcc5ad | ||
|
|
c23e6dff78 | ||
|
|
4f4c6e04d9 | ||
|
|
057bc5da80 | ||
|
|
e4a0a5f4e1 | ||
|
|
993d4058a1 | ||
|
|
79f080a43f | ||
|
|
d57bd0f65c | ||
|
|
d9fe855923 | ||
|
|
df1467c86d | ||
|
|
7c81ae287c | ||
|
|
3710522549 | ||
|
|
1ff68165b8 | ||
|
|
33579efee3 | ||
|
|
588991af69 | ||
|
|
5aa55a7154 | ||
|
|
03090d6571 | ||
|
|
f99f46773e | ||
|
|
66de3308e5 | ||
|
|
0e542b297d | ||
|
|
c0df341f5c | ||
|
|
186b1b2ba2 | ||
|
|
4237d35e83 | ||
|
|
0d65bbaa44 | ||
|
|
70acf36d16 | ||
|
|
c59a81b792 | ||
|
|
3f5f6030f8 | ||
|
|
b21faf768e | ||
|
|
3b09add349 | ||
|
|
613e5752d7 | ||
|
|
4c82a40a0a | ||
|
|
86ea85e3ab | ||
|
|
3942b6f372 | ||
|
|
c72c01afd4 | ||
|
|
cb87f5fbeb | ||
|
|
d02301e59d | ||
|
|
b4ae7badd4 | ||
|
|
2ddcd81020 | ||
|
|
869b648088 | ||
|
|
00af37a659 | ||
|
|
792a480244 | ||
|
|
febf27361a | ||
|
|
3b3a1b2a63 | ||
|
|
194dc0984e | ||
|
|
e071206c58 | ||
|
|
48bd8263a3 | ||
|
|
249eab34e1 | ||
|
|
7c7feb44b2 | ||
|
|
f64245b10b | ||
|
|
acc4bedddc | ||
|
|
c02666c4cb | ||
|
|
517f6d2c22 | ||
|
|
156ed69b46 | ||
|
|
7c7078faf3 | ||
|
|
c957eed04b | ||
|
|
f1299f3292 | ||
|
|
ce5cdc6f8a | ||
|
|
e2d4cd1a41 | ||
|
|
98e1e18f6b | ||
|
|
215b71716a | ||
|
|
c7b56bee96 | ||
|
|
b506c498a7 | ||
|
|
a536e1bd8f | ||
|
|
78fef0a46a | ||
|
|
245797f6b9 | ||
|
|
a260cbbea6 | ||
|
|
99905dcfa3 | ||
|
|
55102ed980 | ||
|
|
24c898218b | ||
|
|
7d2cfadb55 | ||
|
|
06f698a496 | ||
|
|
395fd7bb56 | ||
|
|
fc8cf8ec82 | ||
|
|
242336d475 | ||
|
|
4e8af9d41b | ||
|
|
871d35aa43 | ||
|
|
2d8703f6cc | ||
|
|
c125d0a7a0 | ||
|
|
997d1b2bb5 | ||
|
|
db54a7b79e | ||
|
|
671d066c84 | ||
|
|
b531bd3b04 | ||
|
|
8dc2502177 | ||
|
|
547410b655 | ||
|
|
1b4f47c8ee | ||
|
|
d9fe755f7e | ||
|
|
c8b721d7c6 | ||
|
|
60d8d8677a | ||
|
|
0d04d95326 | ||
|
|
7222df36e7 | ||
|
|
b8438c74e3 | ||
|
|
cb9b81cc10 | ||
|
|
904c5613f4 | ||
|
|
37cbf7bcec | ||
|
|
4c14b11fc7 | ||
|
|
3df52050c1 | ||
|
|
349646bfe0 | ||
|
|
62c0146419 | ||
|
|
7b85962673 | ||
|
|
19795a4dcc | ||
|
|
13de2f415f | ||
|
|
f047840d0f | ||
|
|
fb297a5644 | ||
|
|
2c9e210c36 | ||
|
|
12fce9b88d | ||
|
|
00b8a12d06 | ||
|
|
f8a2401370 | ||
|
|
3f2521115d | ||
|
|
0d405ad38e | ||
|
|
28c78023c5 | ||
|
|
ea3f74874f | ||
|
|
a88e690351 | ||
|
|
0f3e933db9 | ||
|
|
f3b518ae40 | ||
|
|
b70ac594c6 | ||
|
|
a1c89fec72 | ||
|
|
1a49eb5be1 | ||
|
|
5bd239e1c0 | ||
|
|
53b0ee3f7e | ||
|
|
3d2e5bfe63 | ||
|
|
3c7fc3c82e | ||
|
|
2ec2f80bfc | ||
|
|
6ff08202a5 | ||
|
|
06cf6982bb | ||
|
|
1ca7dcb0b2 | ||
|
|
5d0c38794f | ||
|
|
83c12a516b | ||
|
|
08f31f664a | ||
|
|
9758bcb28b | ||
|
|
4f7cd5699e | ||
|
|
bf05f773bd | ||
|
|
de7da0b48f | ||
|
|
b3e7a4e798 | ||
|
|
0091897cc8 | ||
|
|
758bf20706 | ||
|
|
ea1c7f1856 | ||
|
|
a57b313153 | ||
|
|
7ff85e241b | ||
|
|
7c7a2be4b0 | ||
|
|
51dbca2332 | ||
|
|
bcfb70a4cb | ||
|
|
296f267f2b | ||
|
|
14efd8aa41 | ||
|
|
e999ade100 | ||
|
|
f5fe6fe5cc | ||
|
|
84cd07b0d3 | ||
|
|
6104609afa | ||
|
|
5cbac94d08 | ||
|
|
e937fc4513 | ||
|
|
b0e99c803d | ||
|
|
463c97f4c6 | ||
|
|
98f4cb4f87 | ||
|
|
776b0bd2c9 | ||
|
|
f0926f6c2a | ||
|
|
245d355176 | ||
|
|
c3a9c8c177 | ||
|
|
1ef5c639ce | ||
|
|
d939f1041b | ||
|
|
dfa3017c92 | ||
|
|
b49c5a562d | ||
|
|
688426b502 | ||
|
|
a6a13f9626 | ||
|
|
d2be3a7339 | ||
|
|
aaf58155c7 | ||
|
|
12946d0565 | ||
|
|
95c742ec27 | ||
|
|
d91987ab9a | ||
|
|
db540e2832 | ||
|
|
a0b10593df | ||
|
|
65f4b94cda | ||
|
|
70a37b9cf5 | ||
|
|
208fbce9a7 | ||
|
|
21976f47d8 | ||
|
|
054021e875 | ||
|
|
f5c2cd2eb7 | ||
|
|
0e30266711 | ||
|
|
656a8327f4 | ||
|
|
1fed91f272 | ||
|
|
7fe491bb54 | ||
|
|
7675e80f5c | ||
|
|
2b960b8bd7 | ||
|
|
955047dd7d | ||
|
|
0a5997b0af | ||
|
|
0adf03c754 | ||
|
|
2cebac6f2f | ||
|
|
a50c0049f6 | ||
|
|
e620a7beb2 | ||
|
|
d699fd1fb4 | ||
|
|
e38331d94c | ||
|
|
e85ec9a09a | ||
|
|
562b853a8f | ||
|
|
69abe5b405 | ||
|
|
a9cb3835ca | ||
|
|
e1f1e1582e | ||
|
|
65f803a1de | ||
|
|
706f1b433c | ||
|
|
841a2721bc | ||
|
|
d48e3053b9 | ||
|
|
d7a4b14bc6 | ||
|
|
74d3223fb5 | ||
|
|
3f0292d726 | ||
|
|
3f96b88e73 | ||
|
|
5e812cc4be | ||
|
|
8c8a320e92 | ||
|
|
43b21cffe0 | ||
|
|
58c31f5632 | ||
|
|
1778858e24 | ||
|
|
19006c9753 | ||
|
|
2e08c72e95 | ||
|
|
57f408cff5 | ||
|
|
c4d778a302 | ||
|
|
82dcb17338 | ||
|
|
a8c230743a | ||
|
|
3c84157d83 | ||
|
|
4989af356e | ||
|
|
a2fa12d631 | ||
|
|
412c6bf447 | ||
|
|
9aa953ecb4 | ||
|
|
9fddb1b5fa | ||
|
|
07a817d3e5 | ||
|
|
56beaf7d3f | ||
|
|
3f11f41ec7 | ||
|
|
4e02253aaf | ||
|
|
2773082d9d | ||
|
|
19b70b2737 | ||
|
|
61b64bb82a | ||
|
|
f11437aef3 | ||
|
|
fc13315300 | ||
|
|
72d3270547 | ||
|
|
92d0a71af7 | ||
|
|
08b405e1e9 | ||
|
|
13eda1b1a2 | ||
|
|
e8d577c081 | ||
|
|
ceb3ef955e | ||
|
|
bc2ebef876 | ||
|
|
7bdfbde35d | ||
|
|
584d38b5f5 | ||
|
|
9307762d76 | ||
|
|
1b96038115 | ||
|
|
78f0b5fb02 | ||
|
|
64603ab647 | ||
|
|
ca946f6116 | ||
|
|
63fe92017c | ||
|
|
817de51c12 | ||
|
|
6609197cde | ||
|
|
421621fbf1 | ||
|
|
21610d245a | ||
|
|
bdfb1bc2b5 | ||
|
|
76b21a4b90 | ||
|
|
027570a21b | ||
|
|
bd72a577a2 | ||
|
|
aec4125989 | ||
|
|
c272b2422b | ||
|
|
c50009d5d4 | ||
|
|
823165b9b7 | ||
|
|
9947f1051d | ||
|
|
c5e255a417 | ||
|
|
bae3e03e5f | ||
|
|
facca23315 | ||
|
|
071e0c2029 | ||
|
|
2b55c419ea | ||
|
|
83e1b9ab6e | ||
|
|
ca598c3df6 | ||
|
|
4588c979bd | ||
|
|
60ee8bddfc | ||
|
|
5f9fb01020 | ||
|
|
c4960b7579 | ||
|
|
d4917318cc | ||
|
|
047a7f4e33 | ||
|
|
c8ab8e0bab | ||
|
|
038a86a9b8 | ||
|
|
9ae15e8c79 | ||
|
|
666cb44673 | ||
|
|
03c790a0f2 | ||
|
|
29b4f83a1f | ||
|
|
e6bcc232ed | ||
|
|
5eb4675fda | ||
|
|
0fcefdc013 | ||
|
|
fe744eb1ad | ||
|
|
85e20a5cf4 | ||
|
|
da5aed6bef | ||
|
|
acb9cf12c4 | ||
|
|
ade3bdf7e7 | ||
|
|
83bc0b9e80 | ||
|
|
29ebb99b1f |
No files matched your search
@@ -26,7 +26,8 @@
|
|||||||
|
|
||||||
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
|
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
|
||||||
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
|
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
|
||||||
- [ ] My code follows the code style of this project.
|
- [ ] My code follows the code style of this project: [**C**](https://docs.qmk.fm/#/coding_conventions_c), [**Python**](https://docs.qmk.fm/#/coding_conventions_python)
|
||||||
|
- [ ] I have read the [**PR Checklist** document](https://docs.qmk.fm/#/pr_checklist) and have made the appropriate changes.
|
||||||
- [ ] My change requires a change to the documentation.
|
- [ ] My change requires a change to the documentation.
|
||||||
- [ ] I have updated the documentation accordingly.
|
- [ ] I have updated the documentation accordingly.
|
||||||
- [ ] I have read the [**CONTRIBUTING** document](https://docs.qmk.fm/#/contributing).
|
- [ ] I have read the [**CONTRIBUTING** document](https://docs.qmk.fm/#/contributing).
|
||||||
|
|||||||
@@ -16,16 +16,21 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- uses: trilom/[email protected]
|
||||||
|
id: file_changes
|
||||||
|
with:
|
||||||
|
output: '\n'
|
||||||
|
|
||||||
- name: Print info
|
- name: Print info
|
||||||
run: |
|
run: |
|
||||||
git rev-parse --short HEAD
|
git rev-parse --short HEAD
|
||||||
echo ${{ github.event.pull_request.base.sha }}
|
echo ${{ github.event.pull_request.base.sha }}
|
||||||
git diff --name-only ${{ github.event.pull_request.base.sha }}...
|
echo '${{ steps.file_changes.outputs.files}}'
|
||||||
|
|
||||||
- name: Run qmk info
|
- name: Run qmk info
|
||||||
shell: 'bash {0}'
|
shell: 'bash {0}'
|
||||||
run: |
|
run: |
|
||||||
QMK_CHANGES=$(git diff --name-only ${{ github.event.pull_request.base.sha }}...)
|
QMK_CHANGES=$(echo -e '${{ steps.file_changes.outputs.files}}')
|
||||||
QMK_KEYBOARDS=$(qmk list-keyboards)
|
QMK_KEYBOARDS=$(qmk list-keyboards)
|
||||||
|
|
||||||
exit_code=0
|
exit_code=0
|
||||||
@@ -41,7 +46,7 @@ jobs:
|
|||||||
echo "linting ${KB}"
|
echo "linting ${KB}"
|
||||||
|
|
||||||
# TODO: info info always returns 0 - right now the only way to know failure is to inspect log lines
|
# TODO: info info always returns 0 - right now the only way to know failure is to inspect log lines
|
||||||
qmk info -kb ${KB} 2>&1 | tee /tmp/$$
|
qmk info -l -kb ${KB} 2>&1 | tee /tmp/$$
|
||||||
!(grep -cq ☒ /tmp/$$)
|
!(grep -cq ☒ /tmp/$$)
|
||||||
: $((exit_code = $exit_code + $?))
|
: $((exit_code = $exit_code + $?))
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -73,3 +73,6 @@ __pycache__
|
|||||||
|
|
||||||
# prerequisites for updating ChibiOS
|
# prerequisites for updating ChibiOS
|
||||||
/util/fmpp*
|
/util/fmpp*
|
||||||
|
|
||||||
|
# Allow to exist but don't include it in the repo
|
||||||
|
user_song_list.h
|
||||||
+11
-2
@@ -3,8 +3,14 @@ LAYOUTS_REPOS := $(patsubst %/,%,$(sort $(dir $(wildcard $(LAYOUTS_PATH)/*/))))
|
|||||||
|
|
||||||
define SEARCH_LAYOUTS_REPO
|
define SEARCH_LAYOUTS_REPO
|
||||||
LAYOUT_KEYMAP_PATH := $$(LAYOUTS_REPO)/$$(LAYOUT)/$$(KEYMAP)
|
LAYOUT_KEYMAP_PATH := $$(LAYOUTS_REPO)/$$(LAYOUT)/$$(KEYMAP)
|
||||||
|
LAYOUT_KEYMAP_JSON := $$(LAYOUT_KEYMAP_PATH)/keymap.json
|
||||||
LAYOUT_KEYMAP_C := $$(LAYOUT_KEYMAP_PATH)/keymap.c
|
LAYOUT_KEYMAP_C := $$(LAYOUT_KEYMAP_PATH)/keymap.c
|
||||||
ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_C))","")
|
ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_JSON))","")
|
||||||
|
-include $$(LAYOUT_KEYMAP_PATH)/rules.mk
|
||||||
|
KEYMAP_C := $(KEYBOARD_OUTPUT)/src/keymap.c
|
||||||
|
KEYMAP_JSON := $$(LAYOUT_KEYMAP_JSON)
|
||||||
|
KEYMAP_PATH := $$(LAYOUT_KEYMAP_PATH)
|
||||||
|
else ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_C))","")
|
||||||
-include $$(LAYOUT_KEYMAP_PATH)/rules.mk
|
-include $$(LAYOUT_KEYMAP_PATH)/rules.mk
|
||||||
KEYMAP_C := $$(LAYOUT_KEYMAP_C)
|
KEYMAP_C := $$(LAYOUT_KEYMAP_C)
|
||||||
KEYMAP_PATH := $$(LAYOUT_KEYMAP_PATH)
|
KEYMAP_PATH := $$(LAYOUT_KEYMAP_PATH)
|
||||||
@@ -24,4 +30,7 @@ ifneq ($(FORCE_LAYOUT),)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(foreach LAYOUT,$(LAYOUTS),$(eval $(call SEARCH_LAYOUTS)))
|
$(foreach LAYOUT,$(LAYOUTS),$(eval $(call SEARCH_LAYOUTS)))
|
||||||
|
|
||||||
|
# Use rule from build_json.mk, but update prerequisite in case KEYMAP_JSON was updated
|
||||||
|
$(KEYBOARD_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
|
||||||
+5
-4
@@ -246,12 +246,13 @@ ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes)
|
|||||||
VAPTH += $(SERIAL_PATH)
|
VAPTH += $(SERIAL_PATH)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(strip $(VARIABLE_TRACE)),)
|
VARIABLE_TRACE ?= no
|
||||||
|
ifneq ($(strip $(VARIABLE_TRACE)),no)
|
||||||
SRC += $(QUANTUM_DIR)/variable_trace.c
|
SRC += $(QUANTUM_DIR)/variable_trace.c
|
||||||
OPT_DEFS += -DNUM_TRACED_VARIABLES=$(strip $(VARIABLE_TRACE))
|
OPT_DEFS += -DNUM_TRACED_VARIABLES=$(strip $(VARIABLE_TRACE))
|
||||||
ifneq ($(strip $(MAX_VARIABLE_TRACE_SIZE)),)
|
ifneq ($(strip $(MAX_VARIABLE_TRACE_SIZE)),)
|
||||||
OPT_DEFS += -DMAX_VARIABLE_TRACE_SIZE=$(strip $(MAX_VARIABLE_TRACE_SIZE))
|
OPT_DEFS += -DMAX_VARIABLE_TRACE_SIZE=$(strip $(MAX_VARIABLE_TRACE_SIZE))
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(LCD_ENABLE)), yes)
|
ifeq ($(strip $(LCD_ENABLE)), yes)
|
||||||
|
|||||||
@@ -111,6 +111,7 @@
|
|||||||
* [Velocikey](feature_velocikey.md)
|
* [Velocikey](feature_velocikey.md)
|
||||||
|
|
||||||
* Developing QMK
|
* Developing QMK
|
||||||
|
* [PR Checklist](pr_checklist.md)
|
||||||
* Breaking Changes
|
* Breaking Changes
|
||||||
* [Overview](breaking_changes.md)
|
* [Overview](breaking_changes.md)
|
||||||
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
|
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
|
||||||
|
|||||||
@@ -43,8 +43,6 @@ This is a C header file that is one of the first things included, and will persi
|
|||||||
* generally who/whatever brand produced the board
|
* generally who/whatever brand produced the board
|
||||||
* `#define PRODUCT Board`
|
* `#define PRODUCT Board`
|
||||||
* the name of the keyboard
|
* the name of the keyboard
|
||||||
* `#define DESCRIPTION a keyboard`
|
|
||||||
* a short description of what the keyboard is
|
|
||||||
* `#define MATRIX_ROWS 5`
|
* `#define MATRIX_ROWS 5`
|
||||||
* the number of rows in your keyboard's matrix
|
* the number of rows in your keyboard's matrix
|
||||||
* `#define MATRIX_COLS 15`
|
* `#define MATRIX_COLS 15`
|
||||||
|
|||||||
@@ -319,7 +319,7 @@ This runs code every time that the layers get changed. This can be useful for l
|
|||||||
|
|
||||||
### Example `layer_state_set_*` Implementation
|
### Example `layer_state_set_*` Implementation
|
||||||
|
|
||||||
This example shows how to set the [RGB Underglow](feature_rgblight.md) lights based on the layer, using the Planck as an example
|
This example shows how to set the [RGB Underglow](feature_rgblight.md) lights based on the layer, using the Planck as an example.
|
||||||
|
|
||||||
```c
|
```c
|
||||||
layer_state_t layer_state_set_user(layer_state_t state) {
|
layer_state_t layer_state_set_user(layer_state_t state) {
|
||||||
@@ -343,6 +343,11 @@ layer_state_t layer_state_set_user(layer_state_t state) {
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Use the `IS_LAYER_ON_STATE(state, layer)` and `IS_LAYER_OFF_STATE(state, layer)` macros to check the status of a particular layer.
|
||||||
|
|
||||||
|
Outside of `layer_state_set_*` functions, you can use the `IS_LAYER_ON(layer)` and `IS_LAYER_OFF(layer)` macros to check global layer state.
|
||||||
|
|
||||||
### `layer_state_set_*` Function Documentation
|
### `layer_state_set_*` Function Documentation
|
||||||
|
|
||||||
* Keyboard/Revision: `layer_state_t layer_state_set_kb(layer_state_t state)`
|
* Keyboard/Revision: `layer_state_t layer_state_set_kb(layer_state_t state)`
|
||||||
@@ -449,7 +454,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
layer_state_set(layer_state); // then immediately update the layer color
|
layer_state_set(layer_state); // then immediately update the layer color
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false; break;
|
return false;
|
||||||
case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // For any of the RGB codes (see quantum_keycodes.h, L400 for reference)
|
case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // For any of the RGB codes (see quantum_keycodes.h, L400 for reference)
|
||||||
if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
|
if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
|
||||||
if (user_config.rgb_layer_change) { // only if this is enabled
|
if (user_config.rgb_layer_change) { // only if this is enabled
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ Zadig will automatically detect the bootloader device. You may sometimes need to
|
|||||||
|
|
||||||
!> If Zadig lists one or more devices with the `HidUsb` driver, your keyboard is probably not in bootloader mode. The arrow will be colored orange and you will be asked to confirm modifying a system driver. **Do not** proceed if this is the case!
|
!> If Zadig lists one or more devices with the `HidUsb` driver, your keyboard is probably not in bootloader mode. The arrow will be colored orange and you will be asked to confirm modifying a system driver. **Do not** proceed if this is the case!
|
||||||
|
|
||||||
If the arrow appears green, select the driver, and click **Install Driver**. The `libusb-win32` driver will usually work for AVR, and `WinUSB` for ARM, but if you still cannot flash the board, try installing a different driver from the list. For flashing a USBaspLoader device via command line with msys2, the `libusbk` driver is recommended, otherwise `libusb-win32` will work fine if you are using QMK Toolbox for flashing.
|
If the arrow appears green, select the driver, and click **Install Driver**. The `libusb-win32` driver will usually work for AVR, and `WinUSB` for ARM, but if you still cannot flash the board, try installing a different driver from the list. USBAspLoader devices must use the `libusbK` driver.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ El archivo `config.h` es donde configuras el hardware y el conjunto de caracter
|
|||||||
|
|
||||||
En la parte superior de `config.h` encontrarás ajustes relacionados con USB. Estos controlan la apariencia de tu teclado en el Sistema Operativo. Si no tienes una buena razón para cambiar debes dejar el `VENDOR_ID` como `0xFEED`. Para el `PRODUCT_ID` debes seleccionar un número que todavía no esté en uso.
|
En la parte superior de `config.h` encontrarás ajustes relacionados con USB. Estos controlan la apariencia de tu teclado en el Sistema Operativo. Si no tienes una buena razón para cambiar debes dejar el `VENDOR_ID` como `0xFEED`. Para el `PRODUCT_ID` debes seleccionar un número que todavía no esté en uso.
|
||||||
|
|
||||||
Cambia las líneas de `MANUFACTURER`, `PRODUCT`, y `DESCRIPTION` para reflejar con precisión tu teclado.
|
Cambia las líneas de `MANUFACTURER` y `PRODUCT` para reflejar con precisión tu teclado.
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define VENDOR_ID 0xFEED
|
#define VENDOR_ID 0xFEED
|
||||||
@@ -75,7 +75,6 @@ Cambia las líneas de `MANUFACTURER`, `PRODUCT`, y `DESCRIPTION` para reflejar c
|
|||||||
#define DEVICE_VER 0x0001
|
#define DEVICE_VER 0x0001
|
||||||
#define MANUFACTURER Tú
|
#define MANUFACTURER Tú
|
||||||
#define PRODUCT mi_teclado_fantastico
|
#define PRODUCT mi_teclado_fantastico
|
||||||
#define DESCRIPTION Un teclado personalizado
|
|
||||||
```
|
```
|
||||||
|
|
||||||
?> Windows y macOS mostrarán el `MANUFACTURER` y `PRODUCT` en la lista de dispositivos USB. `lsusb` en Linux toma estos de la lista mantenida por el [Repositorio de ID USB](http://www.linux-usb.org/usb-ids.html) por defecto. `lsusb -v` mostrará los valores reportados por el dispositivo, y también están presentes en los registros del núcleo después de conectarlo.
|
?> Windows y macOS mostrarán el `MANUFACTURER` y `PRODUCT` en la lista de dispositivos USB. `lsusb` en Linux toma estos de la lista mantenida por el [Repositorio de ID USB](http://www.linux-usb.org/usb-ids.html) por defecto. `lsusb -v` mostrará los valores reportados por el dispositivo, y también están presentes en los registros del núcleo después de conectarlo.
|
||||||
|
|||||||
+1
-1
@@ -53,7 +53,7 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b4f", ATTRS{idProduct}=="9203", TAG+="uacc
|
|||||||
|
|
||||||
**Note:** With older (before 1.12) ModemManager, filtering only works when not in strict mode, the following commands can update that settings:
|
**Note:** With older (before 1.12) ModemManager, filtering only works when not in strict mode, the following commands can update that settings:
|
||||||
```console
|
```console
|
||||||
sudo sed -i 's/--filter-policy=strict/--filter-policy=default/' /lib/systemd/system/ModemManager.service
|
printf '[Service]\nExecStart=\nExecStart=/usr/sbin/ModemManager --filter-policy=default' | sudo tee /etc/systemd/system/ModemManager.service.d/policy.conf
|
||||||
sudo systemctl daemon-reload
|
sudo systemctl daemon-reload
|
||||||
sudo systemctl restart ModemManager
|
sudo systemctl restart ModemManager
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -18,11 +18,11 @@ That should be everything necessary.
|
|||||||
|
|
||||||
To start recording the macro, press either `DYN_REC_START1` or `DYN_REC_START2`.
|
To start recording the macro, press either `DYN_REC_START1` or `DYN_REC_START2`.
|
||||||
|
|
||||||
To finish the recording, press the `DYN_REC_STOP` layer button.
|
To finish the recording, press the `DYN_REC_STOP` layer button. You can also press `DYN_REC_START1` or `DYN_REC_START2` again to stop the recording.
|
||||||
|
|
||||||
To replay the macro, press either `DYN_MACRO_PLAY1` or `DYN_MACRO_PLAY2`.
|
To replay the macro, press either `DYN_MACRO_PLAY1` or `DYN_MACRO_PLAY2`.
|
||||||
|
|
||||||
It is possible to replay a macro as part of a macro. It's ok to replay macro 2 while recording macro 1 and vice versa but never create recursive macros i.e. macro 1 that replays macro 1. If you do so and the keyboard will get unresponsive, unplug the keyboard and plug it again. You can disable this completly by defining `DYNAMIC_MACRO_NO_NESTING` in your `config.h` file.
|
It is possible to replay a macro as part of a macro. It's ok to replay macro 2 while recording macro 1 and vice versa but never create recursive macros i.e. macro 1 that replays macro 1. If you do so and the keyboard will get unresponsive, unplug the keyboard and plug it again. You can disable this completely by defining `DYNAMIC_MACRO_NO_NESTING` in your `config.h` file.
|
||||||
|
|
||||||
?> For the details about the internals of the dynamic macros, please read the comments in the `process_dynamic_macro.h` and `process_dynamic_macro.c` files.
|
?> For the details about the internals of the dynamic macros, please read the comments in the `process_dynamic_macro.h` and `process_dynamic_macro.c` files.
|
||||||
|
|
||||||
|
|||||||
@@ -74,10 +74,9 @@ There are a number of functions (and variables) related to how you can use or ma
|
|||||||
| [`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) | Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off). |
|
| [`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) | Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off). |
|
||||||
| [`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) | Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. |
|
| [`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) | Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. |
|
||||||
|
|
||||||
|
In addition to the functions that you can call, there are a number of callback functions that get called every time the layer changes. This passes the layer state to the function, where it can be read or modified.
|
||||||
|
|
||||||
In additional to the functions that you can call, there are a number of callback functions that get called every time the layer changes. This passed the layer state to the function, which can be read or modified.
|
|Callback |Description |
|
||||||
|
|
||||||
|Callbacks |Description |
|
|
||||||
|-----------------------------------------------------|----------------------------------------------------------------------------------------|
|
|-----------------------------------------------------|----------------------------------------------------------------------------------------|
|
||||||
| `layer_state_set_kb(layer_state_t state)` | Callback for layer functions, for keyboard. |
|
| `layer_state_set_kb(layer_state_t state)` | Callback for layer functions, for keyboard. |
|
||||||
| `layer_state_set_user(layer_state_t state)` | Callback for layer functions, for users. |
|
| `layer_state_set_user(layer_state_t state)` | Callback for layer functions, for users. |
|
||||||
@@ -86,9 +85,9 @@ In additional to the functions that you can call, there are a number of callback
|
|||||||
|
|
||||||
?> For additional details on how you can use these callbacks, check out the [Layer Change Code](custom_quantum_functions.md#layer-change-code) document.
|
?> For additional details on how you can use these callbacks, check out the [Layer Change Code](custom_quantum_functions.md#layer-change-code) document.
|
||||||
|
|
||||||
|Check functions |Description |
|
It is also possible to check the state of a particular layer using the following functions and macros.
|
||||||
|-------------------------------------------|------------------------------------------------------------------------------|
|
|
||||||
| `layer_state_cmp(cmp_layer_state, layer)` | This checks the `cmp_layer_state` to see if the specific `layer` is enabled. This is meant for use with the layer callbacks. |
|
|
||||||
| `layer_state_is(layer)` | This checks the layer state to see if the specific `layer` is enabled. (calls `layer_state_cmp` for the global layer state). |
|
|
||||||
|
|
||||||
!> There is `IS_LAYER_ON(layer)` as well, however the `layer_state_cmp` function has some additional handling to ensure that on layer 0 that it returns the correct value. Otherwise, if you check to see if layer 0 is on, you may get an incorrect value returned.
|
|Function |Description |Aliases
|
||||||
|
|---------------------------------|-------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------|
|
||||||
|
| `layer_state_is(layer)` | Checks if the specified `layer` is enabled globally. | `IS_LAYER_ON(layer)`, `IS_LAYER_OFF(layer)` |
|
||||||
|
| `layer_state_cmp(state, layer)` | Checks `state` to see if the specified `layer` is enabled. Intended for use in layer callbacks. | `IS_LAYER_ON_STATE(state, layer)`, `IS_LAYER_OFF_STATE(state, layer)` |
|
||||||
@@ -39,10 +39,11 @@ In your keymap you can use the following keycodes to map key presses to mouse ac
|
|||||||
|
|
||||||
## Configuring mouse keys
|
## Configuring mouse keys
|
||||||
|
|
||||||
Mouse keys supports two different modes to move the cursor:
|
Mouse keys supports three different modes to move the cursor:
|
||||||
|
|
||||||
* **Accelerated (default):** Holding movement keys accelerates the cursor until it reaches its maximum speed.
|
* **Accelerated (default):** Holding movement keys accelerates the cursor until it reaches its maximum speed.
|
||||||
* **Constant:** Holding movement keys moves the cursor at constant speeds.
|
* **Constant:** Holding movement keys moves the cursor at constant speeds.
|
||||||
|
* **Combined:** Holding movement keys accelerates the cursor until it reaches its maximum speed, but holding acceleration and movement keys simultaneously moves the cursor at constant speeds.
|
||||||
|
|
||||||
The same principle applies to scrolling.
|
The same principle applies to scrolling.
|
||||||
|
|
||||||
@@ -120,3 +121,22 @@ Use the following settings if you want to adjust cursor movement or scrolling:
|
|||||||
|`MK_W_INTERVAL_1` |120 |Time between scroll steps (`KC_ACL1`) |
|
|`MK_W_INTERVAL_1` |120 |Time between scroll steps (`KC_ACL1`) |
|
||||||
|`MK_W_OFFSET_2` |1 |Scroll steps per scroll action (`KC_ACL2`) |
|
|`MK_W_OFFSET_2` |1 |Scroll steps per scroll action (`KC_ACL2`) |
|
||||||
|`MK_W_INTERVAL_2` |20 |Time between scroll steps (`KC_ACL2`) |
|
|`MK_W_INTERVAL_2` |20 |Time between scroll steps (`KC_ACL2`) |
|
||||||
|
|
||||||
|
### Combined mode
|
||||||
|
|
||||||
|
This mode functions like **Accelerated** mode, however, you can hold `KC_ACL0`, `KC_ACL1` and `KC_ACL2`
|
||||||
|
to momentarily (while held) set the cursor and scroll speeds to constant speeds. When no acceleration
|
||||||
|
keys are held, this mode is identical to **Accelerated** mode, and can be modified using all of the
|
||||||
|
relevant settings.
|
||||||
|
|
||||||
|
* **KC_ACL0:** This acceleration sets your cursor to the slowest possible speed. This is useful for very
|
||||||
|
small and detailed movements of the cursor.
|
||||||
|
* **KC_ACL1:** This acceleration sets your cursor to half the maximum (user defined) speed.
|
||||||
|
* **KC_ACL2:** This acceleration sets your cursor to the maximum (computer defined) speed. This is
|
||||||
|
useful for moving the cursor large distances without much accuracy.
|
||||||
|
|
||||||
|
To use constant speed mode, you must at least define `MK_COMBINED` in your keymap’s `config.h` file:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define MK_COMBINED
|
||||||
|
```
|
||||||
@@ -247,6 +247,10 @@ void oled_write_raw_byte(const char data, uint16_t index);
|
|||||||
// Writes a PROGMEM string to the buffer at current cursor position
|
// Writes a PROGMEM string to the buffer at current cursor position
|
||||||
void oled_write_raw_P(const char *data, uint16_t size);
|
void oled_write_raw_P(const char *data, uint16_t size);
|
||||||
|
|
||||||
|
// Sets a specific pixel on or off
|
||||||
|
// Coordinates start at top-left and go right and down for positive x and y
|
||||||
|
void oled_write_pixel(uint8_t x, uint8_t y, bool on);
|
||||||
|
|
||||||
// Can be used to manually turn on the screen if it is off
|
// Can be used to manually turn on the screen if it is off
|
||||||
// Returns true if the screen was on or turns on
|
// Returns true if the screen was on or turns on
|
||||||
bool oled_on(void);
|
bool oled_on(void);
|
||||||
|
|||||||
@@ -159,15 +159,16 @@ As mentioned earlier, the center of the keyboard by default is expected to be `{
|
|||||||
|
|
||||||
## Flags :id=flags
|
## Flags :id=flags
|
||||||
|
|
||||||
|Define |Description |
|
|Define |Value |Description |
|
||||||
|------------------------------------|-------------------------------------------|
|
|----------------------------|------|-------------------------------------------------|
|
||||||
|`#define HAS_FLAGS(bits, flags)` |Returns true if `bits` has all `flags` set.|
|
|`HAS_FLAGS(bits, flags)` |*n/a* |Evaluates to `true` if `bits` has all `flags` set|
|
||||||
|`#define HAS_ANY_FLAGS(bits, flags)`|Returns true if `bits` has any `flags` set.|
|
|`HAS_ANY_FLAGS(bits, flags)`|*n/a* |Evaluates to `true` if `bits` has any `flags` set|
|
||||||
|`#define LED_FLAG_NONE 0x00` |If this LED has no flags. |
|
|`LED_FLAG_NONE` |`0x00`|If this LED has no flags |
|
||||||
|`#define LED_FLAG_ALL 0xFF` |If this LED has all flags. |
|
|`LED_FLAG_ALL` |`0xFF`|If this LED has all flags |
|
||||||
|`#define LED_FLAG_MODIFIER 0x01` |If the Key for this LED is a modifier. |
|
|`LED_FLAG_MODIFIER` |`0x01`|If the LED is on a modifier key |
|
||||||
|`#define LED_FLAG_UNDERGLOW 0x02` |If the LED is for underglow. |
|
|`LED_FLAG_UNDERGLOW` |`0x02`|If the LED is for underglow |
|
||||||
|`#define LED_FLAG_KEYLIGHT 0x04` |If the LED is for key backlight. |
|
|`LED_FLAG_KEYLIGHT` |`0x04`|If the LED is for key backlight |
|
||||||
|
|`LED_FLAG_INDICATOR` |`0x08`|If the LED is for keyboard state indication |
|
||||||
|
|
||||||
## Keycodes :id=keycodes
|
## Keycodes :id=keycodes
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ On the display tab click 'Open stroke display'. With Plover disabled you should
|
|||||||
|
|
||||||
## Interfacing with the code :id=interfacing-with-the-code
|
## Interfacing with the code :id=interfacing-with-the-code
|
||||||
|
|
||||||
The steno code has three interceptible hooks. If you define these functions, they will be called at certain points in processing; if they return true, processing continues, otherwise it's assumed you handled things.
|
The steno code has three interceptable hooks. If you define these functions, they will be called at certain points in processing; if they return true, processing continues, otherwise it's assumed you handled things.
|
||||||
|
|
||||||
```c
|
```c
|
||||||
bool send_steno_chord_user(steno_mode_t mode, uint8_t chord[6]);
|
bool send_steno_chord_user(steno_mode_t mode, uint8_t chord[6]);
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ The `config.h` file is where you configure the hardware and feature set for your
|
|||||||
|
|
||||||
At the top of the `config.h` you'll find USB related settings. These control how your keyboard appears to the Operating System. If you don't have a good reason to change you should leave the `VENDOR_ID` as `0xFEED`. For the `PRODUCT_ID` you should pick a number that is not yet in use.
|
At the top of the `config.h` you'll find USB related settings. These control how your keyboard appears to the Operating System. If you don't have a good reason to change you should leave the `VENDOR_ID` as `0xFEED`. For the `PRODUCT_ID` you should pick a number that is not yet in use.
|
||||||
|
|
||||||
Do change the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` lines to accurately reflect your keyboard.
|
Do change the `MANUFACTURER` and `PRODUCT` lines to accurately reflect your keyboard.
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define VENDOR_ID 0xFEED
|
#define VENDOR_ID 0xFEED
|
||||||
@@ -75,7 +75,6 @@ Do change the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` lines to accurately r
|
|||||||
#define DEVICE_VER 0x0001
|
#define DEVICE_VER 0x0001
|
||||||
#define MANUFACTURER You
|
#define MANUFACTURER You
|
||||||
#define PRODUCT my_awesome_keyboard
|
#define PRODUCT my_awesome_keyboard
|
||||||
#define DESCRIPTION A custom keyboard
|
|
||||||
```
|
```
|
||||||
|
|
||||||
?> Windows and macOS will display the `MANUFACTURER` and `PRODUCT` in the list of USB devices. `lsusb` on Linux instead takes these from the list maintained by the [USB ID Repository](http://www.linux-usb.org/usb-ids.html) by default. `lsusb -v` will show the values reported by the device, and they are also present in kernel logs after plugging it in.
|
?> Windows and macOS will display the `MANUFACTURER` and `PRODUCT` in the list of USB devices. `lsusb` on Linux instead takes these from the list maintained by the [USB ID Repository](http://www.linux-usb.org/usb-ids.html) by default. `lsusb -v` will show the values reported by the device, and they are also present in kernel logs after plugging it in.
|
||||||
|
|||||||
@@ -141,7 +141,9 @@ To do this manually:
|
|||||||
|
|
||||||
?> It's possible to use other bootloaders here in the same way, but __you need a bootloader__, otherwise you'll have to use ISP again to write new firmware to your keyboard.
|
?> It's possible to use other bootloaders here in the same way, but __you need a bootloader__, otherwise you'll have to use ISP again to write new firmware to your keyboard.
|
||||||
|
|
||||||
To do this the easy way, you can flash the board using the `:production` target when compiling. This compiles the firmware, then compiles the QMK DFU bootloader, and then creates a combined image. Once this is done, you'll see three files:
|
#### Create QMK DFU Bootloader and Production images
|
||||||
|
|
||||||
|
You can create the firmware, the QMK DFU Bootloader and the production firmware images for the board using the `:production` target when compiling. Once this is done, you'll see three files:
|
||||||
* `<keyboard>_<keymap>.hex`
|
* `<keyboard>_<keymap>.hex`
|
||||||
* `<keyboard>_<keymap>_bootloader.hex`
|
* `<keyboard>_<keymap>_bootloader.hex`
|
||||||
* `<keyboard>_<keymap>_production.hex`
|
* `<keyboard>_<keymap>_production.hex`
|
||||||
@@ -236,12 +238,12 @@ For Caterina on the `atmega32u4`, these are the fuse settings that you want:
|
|||||||
| Fuse | Setting|
|
| Fuse | Setting|
|
||||||
|----------|--------|
|
|----------|--------|
|
||||||
| Low | `0xFF` |
|
| Low | `0xFF` |
|
||||||
| High | `0xD9` |
|
| High | `0xD8` |
|
||||||
| Extended | `0xC3` |
|
| Extended | `0xCB` |
|
||||||
|
|
||||||
To set this add `-U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xC3:m` to your command. So the final command should look something like:
|
To set this add `-U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xCB:m` to your command. So the final command should look something like:
|
||||||
|
|
||||||
avrdude -c avrisp -P COM3 -p atmega32u4 -U flash:w:main.hex:i -U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xC3:m
|
avrdude -c avrisp -P COM3 -p atmega32u4 -U flash:w:main.hex:i -U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xCB:m
|
||||||
|
|
||||||
|
|
||||||
If you are using a different controller or want different configuration, you can use [this AVR Fuse Calculator](http://www.engbedded.com/fusecalc/) to find a better value for you.
|
If you are using a different controller or want different configuration, you can use [this AVR Fuse Calculator](http://www.engbedded.com/fusecalc/) to find a better value for you.
|
||||||
|
|||||||
+21
-8
@@ -6,6 +6,7 @@
|
|||||||
* [テストとデバッグ](ja/newbs_testing_debugging.md)
|
* [テストとデバッグ](ja/newbs_testing_debugging.md)
|
||||||
* [手助けを得る/サポート](ja/support.md)
|
* [手助けを得る/サポート](ja/support.md)
|
||||||
* [他のリソース](ja/newbs_learn_more_resources.md)
|
* [他のリソース](ja/newbs_learn_more_resources.md)
|
||||||
|
* [シラバス](ja/syllabus.md)
|
||||||
|
|
||||||
* FAQ
|
* FAQ
|
||||||
* [一般的な FAQ](ja/faq_general.md)
|
* [一般的な FAQ](ja/faq_general.md)
|
||||||
@@ -33,7 +34,9 @@
|
|||||||
* [機能のカスタマイズ](ja/custom_quantum_functions.md)
|
* [機能のカスタマイズ](ja/custom_quantum_functions.md)
|
||||||
* [Zadig を使ったドライバのインストール](ja/driver_installation_zadig.md)
|
* [Zadig を使ったドライバのインストール](ja/driver_installation_zadig.md)
|
||||||
* [キーマップの概要](ja/keymap.md)
|
* [キーマップの概要](ja/keymap.md)
|
||||||
* [Vagrant のガイド](ja/getting_started_vagrant.md)
|
* 開発環境
|
||||||
|
* [Docker のガイド](ja/getting_started_docker.md)
|
||||||
|
* [Vagrant のガイド](ja/getting_started_vagrant.md)
|
||||||
* 書き込み
|
* 書き込み
|
||||||
* [書き込み](ja/flashing.md)
|
* [書き込み](ja/flashing.md)
|
||||||
* [ATmega32A の書き込み (ps2avrgb)](ja/flashing_bootloadhid.md)
|
* [ATmega32A の書き込み (ps2avrgb)](ja/flashing_bootloadhid.md)
|
||||||
@@ -52,6 +55,7 @@
|
|||||||
* 単純なキーコード
|
* 単純なキーコード
|
||||||
* [完全なリスト](ja/keycodes.md)
|
* [完全なリスト](ja/keycodes.md)
|
||||||
* [基本的なキーコード](ja/keycodes_basic.md)
|
* [基本的なキーコード](ja/keycodes_basic.md)
|
||||||
|
* [言語固有のキーコード](ja/reference_keymap_extras.md)
|
||||||
* [修飾キー](ja/feature_advanced_keycodes.md)
|
* [修飾キー](ja/feature_advanced_keycodes.md)
|
||||||
* [Quantum キーコード](ja/quantum_keycodes.md)
|
* [Quantum キーコード](ja/quantum_keycodes.md)
|
||||||
|
|
||||||
@@ -72,9 +76,10 @@
|
|||||||
* [デバウンス API](ja/feature_debounce_type.md)
|
* [デバウンス API](ja/feature_debounce_type.md)
|
||||||
* [キーロック](ja/feature_key_lock.md)
|
* [キーロック](ja/feature_key_lock.md)
|
||||||
* [レイヤー](ja/feature_layers.md)
|
* [レイヤー](ja/feature_layers.md)
|
||||||
* [One Shot Keys](ja/one_shot_keys.md)
|
* [ワンショットキー](ja/one_shot_keys.md)
|
||||||
* [ポインティング デバイス](ja/feature_pointing_device.md)
|
* [ポインティング デバイス](ja/feature_pointing_device.md)
|
||||||
* [Swap Hands](ja/feature_swap_hands.md)
|
* [ロー HID](ja/feature_rawhid.md)
|
||||||
|
* [スワップハンド](ja/feature_swap_hands.md)
|
||||||
* [タップダンス](ja/feature_tap_dance.md)
|
* [タップダンス](ja/feature_tap_dance.md)
|
||||||
* [タップホールド設定](ja/tap_hold.md)
|
* [タップホールド設定](ja/tap_hold.md)
|
||||||
* [ターミナル](ja/feature_terminal.md)
|
* [ターミナル](ja/feature_terminal.md)
|
||||||
@@ -98,18 +103,20 @@
|
|||||||
* [DIP スイッチ](ja/feature_dip_switch.md)
|
* [DIP スイッチ](ja/feature_dip_switch.md)
|
||||||
* [エンコーダ](ja/feature_encoders.md)
|
* [エンコーダ](ja/feature_encoders.md)
|
||||||
* [触覚フィードバック](ja/feature_haptic_feedback.md)
|
* [触覚フィードバック](ja/feature_haptic_feedback.md)
|
||||||
* [Proton C 規約](ja/proton_c_conversion.md)
|
* [Proton C 変換](ja/proton_c_conversion.md)
|
||||||
* [PS/2 マウス](ja/feature_ps2_mouse.md)
|
* [PS/2 マウス](ja/feature_ps2_mouse.md)
|
||||||
* [分割キーボード](ja/feature_split_keyboard.md)
|
* [分割キーボード](ja/feature_split_keyboard.md)
|
||||||
* [Stenography](ja/feature_stenography.md)
|
* [速記](ja/feature_stenography.md)
|
||||||
* [感熱式プリンタ](ja/feature_thermal_printer.md)
|
* [感熱式プリンタ](ja/feature_thermal_printer.md)
|
||||||
* [Velocikey](ja/feature_velocikey.md)
|
* [Velocikey](ja/feature_velocikey.md)
|
||||||
|
|
||||||
* QMK の開発
|
* QMK の開発
|
||||||
|
* [PR チェックリスト](ja/pr_checklist.md)
|
||||||
* 互換性を破る変更/Breaking changes
|
* 互換性を破る変更/Breaking changes
|
||||||
* [概要](ja/breaking_changes.md)
|
* [概要](ja/breaking_changes.md)
|
||||||
* [プルリクエストにフラグが付けられた](ja/breaking_changes_instructions.md)
|
* [プルリクエストにフラグが付けられた](ja/breaking_changes_instructions.md)
|
||||||
* 履歴
|
* 履歴
|
||||||
|
* [2020年5月30日](ja/ChangeLog/20200530.md)
|
||||||
* [2020年2月29日](ja/ChangeLog/20200229.md)
|
* [2020年2月29日](ja/ChangeLog/20200229.md)
|
||||||
* [2019年8月30日](ja/ChangeLog/20190830.md)
|
* [2019年8月30日](ja/ChangeLog/20190830.md)
|
||||||
|
|
||||||
@@ -124,7 +131,8 @@
|
|||||||
* [SPI ドライバ](ja/spi_driver.md)
|
* [SPI ドライバ](ja/spi_driver.md)
|
||||||
* [WS2812 ドライバ](ja/ws2812_driver.md)
|
* [WS2812 ドライバ](ja/ws2812_driver.md)
|
||||||
* [EEPROM ドライバ](ja/eeprom_driver.md)
|
* [EEPROM ドライバ](ja/eeprom_driver.md)
|
||||||
* [GPIO コントロール](ja/internals_gpio_control.md)
|
* [シリアル ドライバ](ja/serial_driver.md)
|
||||||
|
* [GPIO 制御](ja/internals_gpio_control.md)
|
||||||
* [キーボード ガイドライン](ja/hardware_keyboard_guidelines.md)
|
* [キーボード ガイドライン](ja/hardware_keyboard_guidelines.md)
|
||||||
|
|
||||||
* Python 開発
|
* Python 開発
|
||||||
@@ -136,6 +144,11 @@
|
|||||||
* [開発環境](ja/api_development_environment.md)
|
* [開発環境](ja/api_development_environment.md)
|
||||||
* [アーキテクチャの概要](ja/api_development_overview.md)
|
* [アーキテクチャの概要](ja/api_development_overview.md)
|
||||||
|
|
||||||
|
* ハードウェアプラットフォーム開発
|
||||||
|
* Arm/ChibiOS
|
||||||
|
* [MCU の選択](ja/platformdev_selecting_arm_mcu.md)
|
||||||
|
* [早期初期化](ja/platformdev_chibios_earlyinit.md)
|
||||||
|
|
||||||
* QMK Reference
|
* QMK Reference
|
||||||
* [QMK への貢献](ja/contributing.md)
|
* [QMK への貢献](ja/contributing.md)
|
||||||
* [QMK ドキュメントの翻訳](ja/translating.md)
|
* [QMK ドキュメントの翻訳](ja/translating.md)
|
||||||
@@ -155,9 +168,9 @@
|
|||||||
|
|
||||||
* QMK の内部詳細(作成中)
|
* QMK の内部詳細(作成中)
|
||||||
* [定義](ja/internals_defines.md)
|
* [定義](ja/internals_defines.md)
|
||||||
* [Input Callback Reg](ja/internals_input_callback_reg.md)
|
* [入力コールバック登録](ja/internals_input_callback_reg.md)
|
||||||
* [Midi デバイス](ja/internals_midi_device.md)
|
* [Midi デバイス](ja/internals_midi_device.md)
|
||||||
* [Midi デバイスのセットアップ手順](ja/internals_midi_device_setup_process.md)
|
* [Midi デバイスのセットアップ手順](ja/internals_midi_device_setup_process.md)
|
||||||
* [Midi ユーティリティ](ja/internals_midi_util.md)
|
* [Midi ユーティリティ](ja/internals_midi_util.md)
|
||||||
* [Send Functions](ja/internals_send_functions.md)
|
* [Midi 送信関数](ja/internals_send_functions.md)
|
||||||
* [Sysex Tools](ja/internals_sysex_tools.md)
|
* [Sysex Tools](ja/internals_sysex_tools.md)
|
||||||
@@ -0,0 +1,223 @@
|
|||||||
|
# QMK CLI 開発
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.19:docs/cli_development.md
|
||||||
|
git diff 0.9.19 HEAD -- docs/cli_development.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
このドキュメントは、新しい `qmk` サブコマンドを書きたい開発者に役立つ情報が含まれています。
|
||||||
|
|
||||||
|
# 概要
|
||||||
|
|
||||||
|
QMK CLI は git で有名になったサブコマンドパターンを使って動作します。メインの `qmk` スクリプトは単に環境をセットアップし、実行する正しいエントリポイントを選択するためにあります。各サブコマンドは、何らかのアクションを実行しシェルのリターンコード、または None を返すエントリーポイント (`@cli.subcommand()` で修飾されます)を備えた自己完結型のモジュールです。
|
||||||
|
|
||||||
|
## 開発者モード:
|
||||||
|
|
||||||
|
キーボードを保守、あるいは QMK に貢献したい場合は、CLI の「開発者」モードを有効にすることができます:
|
||||||
|
|
||||||
|
`qmk config user.developer=True`
|
||||||
|
|
||||||
|
これにより利用可能な全てのサブコマンドが表示されます。
|
||||||
|
**注意:** 追加で必要なものをインストールする必要があります:
|
||||||
|
```bash
|
||||||
|
python3 -m pip install -r requirements-dev.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
# サブコマンド
|
||||||
|
|
||||||
|
[MILC](https://github.com/clueboard/milc) は、`qmk` が引数の解析、設定、ログ、およびほかの多くの機能を処理するために使用する CLI フレームワークです。グルーコードを書くために時間を無駄にすることなく、ツールの作成に集中できます。
|
||||||
|
|
||||||
|
ローカル CLI 内のサブコマンドは、常に `qmk_firmware/lib/python/qmk/cli` で見つかります。
|
||||||
|
|
||||||
|
サブコマンドの例を見てみましょう。これは `lib/python/qmk/cli/hello.py` です:
|
||||||
|
|
||||||
|
```python
|
||||||
|
"""QMK Python Hello World
|
||||||
|
|
||||||
|
This is an example QMK CLI script.
|
||||||
|
"""
|
||||||
|
from milc import cli
|
||||||
|
|
||||||
|
|
||||||
|
@cli.argument('-n', '--name', default='World', help='Name to greet.')
|
||||||
|
@cli.subcommand('QMK Hello World.')
|
||||||
|
def hello(cli):
|
||||||
|
"""Log a friendly greeting.
|
||||||
|
"""
|
||||||
|
cli.log.info('Hello, %s!', cli.config.hello.name)
|
||||||
|
```
|
||||||
|
|
||||||
|
最初に `milc` から `cli` をインポートします。これが、ユーザとやり取りをし、スクリプトの挙動を制御する方法です。`@cli.argument()` を使って、コマンドラインフラグ `--name` を定義します。これは、ユーザが設定できる `hello.name` (そして対応する `user.name`) という名前の設定変数も作成し、引数を指定する必要が無くなります。`cli.subcommand()` デコレータは、この関数をサブコマンドとして指定します。サブコマンドの名前は関数の名前から取られます。
|
||||||
|
|
||||||
|
関数の中に入ると、典型的な "Hello, World!" プログラムが見つかります。`cli.log` を使って、基礎となる [ロガーオブジェクト](https://docs.python.org/3.6/library/logging.html#logger-objects) にアクセスし、その挙動はユーザが制御できます。またユーザが指定した名前の値に `cli.config.hello.name` でアクセスします。`cli.config.hello.name` の値は、ユーザが指定した `--name` 引数を調べることで決定されます。指定されていない場合、`qmk.ini` 設定ファイルの中の値が使われ、どちらも指定されていない場合は `cli.argument()` デコレータで指定されたデフォルトが代用されます。
|
||||||
|
|
||||||
|
# ユーザとの対話処理
|
||||||
|
|
||||||
|
MILC と QMK CLI にはユーザとやり取りするための幾つかの便利なツールがあります。これらの標準ツールを使うと、テキストに色を付けて対話し易くし、ユーザはその情報をいつどのように表示および保存するかを制御することができます。
|
||||||
|
|
||||||
|
## テキストの表示
|
||||||
|
|
||||||
|
サブコマンド内でテキストを出力するための2つの主な方法があります- `cli.log` と `cli.echo()`。それらは似た方法で動作しますが、ほとんどの一般的な目的の出力には `cli.log.info()` を使うことをお勧めします。
|
||||||
|
|
||||||
|
特別なトークンを使用してテキストを色付けし、プログラムの出力を理解しやすくすることができます。以下の[テキストの色付け](#colorizing-text)を見てください。
|
||||||
|
|
||||||
|
これらの両方の方法は python の [printf 形式の文字列書式化](https://docs.python.org/3.6/library/stdtypes.html#old-string-formatting) を使った組み込みの文字列書式化をサポートします。テキスト文字列内で`%s` と `%d` のようなトークンを使い、引数で値を渡すことができます。例として、上記の Hello、World プログラムを見てください。
|
||||||
|
|
||||||
|
書式演算子 (`%`) を直接使わないでください、常に引数で値を渡します。
|
||||||
|
|
||||||
|
### ログ (`cli.log`)
|
||||||
|
|
||||||
|
`cli.log` オブジェクトは[ロガーオブジェクト](https://docs.python.org/3.6/library/logging.html#logger-objects)へのアクセスを与えます。ログ出力を設定し、ユーザに各ログレベルの素敵な絵文字(またはターミナルが unicode をサポートしない場合はログレベル名)を表示します。このようにして、ユーザは何か問題が発生した時に最も重要なメッセージを一目で確認することができます。
|
||||||
|
|
||||||
|
デフォルトのログレベルは `INFO` です。ユーザが `qmk -v <subcommand>` を実行すると、デフォルトのログレベルは `DEBUG` に設定されます。
|
||||||
|
|
||||||
|
| 関数 | 絵文字 |
|
||||||
|
|----------|-------|
|
||||||
|
| cli.log.critical | `{bg_red}{fg_white}¬_¬{style_reset_all}` |
|
||||||
|
| cli.log.error | `{fg_red}☒{style_reset_all}` |
|
||||||
|
| cli.log.warning | `{fg_yellow}⚠{style_reset_all}` |
|
||||||
|
| cli.log.info | `{fg_blue}Ψ{style_reset_all}` |
|
||||||
|
| cli.log.debug | `{fg_cyan}☐{style_reset_all}` |
|
||||||
|
| cli.log.notset | `{style_reset_all}¯\\_(o_o)_/¯` |
|
||||||
|
|
||||||
|
### 出力 (`cli.echo`)
|
||||||
|
|
||||||
|
場合によっては単にログシステムの外部でテキストを出力する必要があります。これは、固定データを出力したり、ログに記録してはいけない何かを書きだす場合に適しています。ほとんどの場合、`cli.echo` よりも `cli.log.info()` を選ぶべきです。
|
||||||
|
|
||||||
|
### テキストの色付け
|
||||||
|
|
||||||
|
テキスト内に色トークンを含めることで、テキストの出力を色付けすることができます。情報を伝えるためではなく、強調するために色を使います。ユーザは色を無効にできることを覚えておいてください。色を無効にした場合でもサブコマンドは引き続き使えるようにしてください。
|
||||||
|
|
||||||
|
背景色を設定するのは、あなたがやっていることに不可欠ではない限り、通常は避けるべきです。ユーザは、ターミナルの色に関しては多くの好みを持つため、あなたは黒と白のどちらの背景に対してもうまく機能する色を選択する必要があることを覚えておいてください。
|
||||||
|
|
||||||
|
'fg' という接頭辞の付いた色は、前景(テキスト)色に影響します。'bg' という接頭辞の付いた色は、背景色に影響します。
|
||||||
|
|
||||||
|
| 色 | 背景 | 拡張背景 | 前景 | 拡張前景 |
|
||||||
|
|-------|------------|---------------------|------------|--------------------|
|
||||||
|
| 黒 | {bg_black} | {bg_lightblack_ex} | {fg_black} | {fg_lightblack_ex} |
|
||||||
|
| 青 | {bg_blue} | {bg_lightblue_ex} | {fg_blue} | {fg_lightblue_ex} |
|
||||||
|
| シアン | {bg_cyan} | {bg_lightcyan_ex} | {fg_cyan} | {fg_lightcyan_ex} |
|
||||||
|
| 緑 | {bg_green} | {bg_lightgreen_ex} | {fg_green} | {fg_lightgreen_ex} |
|
||||||
|
| マゼンタ | {bg_magenta} | {bg_lightmagenta_ex} | {fg_magenta} | {fg_lightmagenta_ex} |
|
||||||
|
| 赤 | {bg_red} | {bg_lightred_ex} | {fg_red} | {fg_lightred_ex} |
|
||||||
|
| 白 | {bg_white} | {bg_lightwhite_ex} | {fg_white} | {fg_lightwhite_ex} |
|
||||||
|
| 黄 | {bg_yellow} | {bg_lightyellow_ex} | {fg_yellow} | {fg_lightyellow_ex} |
|
||||||
|
|
||||||
|
ANSI 出力の挙動を変更するために使うことができる制御シーケンスもあります。
|
||||||
|
|
||||||
|
| 制御シーケンス | 説明 |
|
||||||
|
|-------------------|-------------|
|
||||||
|
| {style_bright} | テキストを明るくする |
|
||||||
|
| {style_dim} | テキストを暗くする |
|
||||||
|
| {style_normal} | テキストを通常にする (`{style_bright}` または `{style_dim}` のどちらでもない) |
|
||||||
|
| {style_reset_all} | 全てのテキストの属性をデフォルトに再設定する(これは自動的に全ての文字列の最後に自動的に追加されます。) |
|
||||||
|
| {bg_reset} | 背景色をユーザのデフォルトに再設定します。 |
|
||||||
|
| {fg_reset} | 背景色をユーザのデフォルトに再設定します。 |
|
||||||
|
|
||||||
|
# 引数と設定
|
||||||
|
|
||||||
|
QMK は引数の解析と設定の詳細をあなたの代わりに処理します。新しい引数を追加すると、サブコマンドの名前と引数の長い名前に基づいて設定ツリーに自動的に組み込まれます。属性形式のアクセス (`cli.config.<subcommand>.<argument>`) あるいは辞書形式のアクセス (`cli.config['<subcommand>']['<argument>']`) を使って、`cli.config` 内のこの設定にアクセスすることができます。
|
||||||
|
|
||||||
|
内部では、QMK は [設定ファイルのパーサ](https://docs.python.org/3/library/configparser.html) を使って設定を格納します。これにより、人間が編集可能な方法で設定を表す簡単で分かり易い方法を提供します。この設定へのアクセスをラップして、設定ファイルのパーサーが通常持たない幾つかの機能を提供しています。
|
||||||
|
|
||||||
|
## 設定値の読み込み
|
||||||
|
|
||||||
|
通常期待される全ての方法で `cli.config` とやり取りすることができます。例えば、`qmk compile` コマンドは `cli.config.compile.keyboard` からキーボード名を取得します。値がコマンドライン、環境変数あるいは設定ファイルからきたものであるかどうかを知る必要はありません。
|
||||||
|
|
||||||
|
繰り返しもサポートされます:
|
||||||
|
|
||||||
|
```
|
||||||
|
for section in cli.config:
|
||||||
|
for key in cli.config[section]:
|
||||||
|
cli.log.info('%s.%s: %s', section, key, cli.config[section][key])
|
||||||
|
```
|
||||||
|
|
||||||
|
## 設定値の設定
|
||||||
|
|
||||||
|
通常の方法で設定値を設定することができます。
|
||||||
|
|
||||||
|
辞書形式:
|
||||||
|
|
||||||
|
```
|
||||||
|
cli.config['<section>']['<key>'] = <value>
|
||||||
|
```
|
||||||
|
|
||||||
|
属性形式:
|
||||||
|
|
||||||
|
```
|
||||||
|
cli.config.<section>.<key> = <value>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 設定値の削除
|
||||||
|
|
||||||
|
通常の方法で設定値を削除することができます。
|
||||||
|
|
||||||
|
辞書形式:
|
||||||
|
|
||||||
|
```
|
||||||
|
del(cli.config['<section>']['<key>'])
|
||||||
|
```
|
||||||
|
|
||||||
|
属性形式:
|
||||||
|
|
||||||
|
```
|
||||||
|
del(cli.config.<section>.<key>)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 設定ファイルの書き方
|
||||||
|
|
||||||
|
設定は変更しても書き出されません。ほとんどのコマンドでこれをする必要はありません。ユーザに `qmk config` を使って設定を慎重に変更させることをお勧めします。
|
||||||
|
|
||||||
|
設定を書き出すために `cli.save_config()` を使うことができます。
|
||||||
|
|
||||||
|
## 設定からの引数の除外
|
||||||
|
|
||||||
|
一部の引数は設定ファイルに反映すべきではありません。これらは引数を作成する時に `arg_only=True` を追加することで除外することができます。
|
||||||
|
|
||||||
|
例:
|
||||||
|
|
||||||
|
```
|
||||||
|
@cli.argument('-o', '--output', arg_only=True, help='File to write to')
|
||||||
|
@cli.argument('filename', arg_only=True, help='Configurator JSON file')
|
||||||
|
@cli.subcommand('Create a keymap.c from a QMK Configurator export.')
|
||||||
|
def json_keymap(cli):
|
||||||
|
pass
|
||||||
|
```
|
||||||
|
|
||||||
|
`cli.args` を使ってのみこれらの引数にアクセスすることができます。例えば:
|
||||||
|
|
||||||
|
```
|
||||||
|
cli.log.info('Reading from %s and writing to %s', cli.args.filename, cli.args.output)
|
||||||
|
```
|
||||||
|
|
||||||
|
# テスト、リントおよびフォーマット
|
||||||
|
|
||||||
|
nose2、flake8 および yapf を使ってコードをテスト、リントおよびフォーマットします。これらのテストを実行するために `pytest` と `pyformat` サブコマンドを使うことができます。
|
||||||
|
|
||||||
|
### テストとリント
|
||||||
|
|
||||||
|
qmk pytest
|
||||||
|
|
||||||
|
### フォーマット
|
||||||
|
|
||||||
|
qmk pyformat
|
||||||
|
|
||||||
|
## フォーマットの詳細
|
||||||
|
|
||||||
|
[yapf](https://github.com/google/yapf) を使ってコードを自動的にフォーマットします。フォーマットの設定は `setup.cfg` の `[yapf]` セクションにあります。
|
||||||
|
|
||||||
|
?> ヒント- 多くのエディタは yapf をプラグインとして使って、入力したコードを自動的にフォーマットすることができます。
|
||||||
|
|
||||||
|
## テストの詳細
|
||||||
|
|
||||||
|
テストは `lib/python/qmk/tests/` にあります。このディレクトリに単体テストと統合テストの両方があります。コードの単体テストと統合テストの両方を書いてほしいですが、一方のみ書く場合は統合テストを優先してください。
|
||||||
|
|
||||||
|
PR にテストの包括的なセットが含まれない場合は、次のようなコメントをコードに追加して、他の人が手助けできるようにしてください:
|
||||||
|
|
||||||
|
# TODO(unassigned/<your_github_username>): Write <unit|integration> tests
|
||||||
|
|
||||||
|
[nose2](https://nose2.readthedocs.io/en/latest/getting_started.html) を使ってテストを実行します。テスト関数でできることの詳細については、nose2 のドキュメントを参照してください。
|
||||||
|
|
||||||
|
## リントの詳細
|
||||||
|
|
||||||
|
flake8 を使ってコードをリントします。PR を開く前に、コードは flake8 をパスしなければなりません。これは `qmk pytest` を実行するときにチェックされ、PR を登録したときに CI によってチェックされます。
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
# コーディング規約 (C)
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.19:docs/coding_conventions_c.md
|
||||||
|
git diff 0.9.19 HEAD -- docs/coding_conventions_c.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
私たちのスタイルのほとんどはかなり理解しやすいですが、現時点では完全に一貫しているわけではありません。変更箇所周辺のコードのスタイルと一致させる必要がありますが、そのコードに一貫性が無い場合や不明瞭な場合は以下のガイドラインに従ってください:
|
||||||
|
|
||||||
|
* 4つのスペース (ソフトタブ) を使ってインデントします。
|
||||||
|
* 修正版 One True Brace Style を使います。
|
||||||
|
* 開き括弧: ブロックを開始する文と同じ行の最後
|
||||||
|
* 閉じ括弧: ブロックを開始した文と同じ字下げ
|
||||||
|
* Else If: 行の先頭に閉じ括弧を置き、次の開き括弧を同じ行の最後に置きます。
|
||||||
|
* 省略可能な括弧: 常に括弧を付け加えます。
|
||||||
|
* 良い: if (condition) { return false; }
|
||||||
|
* 悪い: if (condition) return false;
|
||||||
|
* C 形式のコメントの使用を推奨します: `/* */`
|
||||||
|
* コメントを機能を説明するストーリーと考えて下さい。
|
||||||
|
* 特定の決定がなされた理由を充分なコメントで説明してください。
|
||||||
|
* 分かり切ったコメントは書かないでください。
|
||||||
|
* 分かり切ったコメントであるか確信できない場合は、コメントを含めてください。
|
||||||
|
* 一般的に、行を折り返さないで、必要なだけ長くすることができます。行を折り返すことを選択した場合は、76列を超えて折り返さないでください。
|
||||||
|
* 古い形式のインクルードガード (`#ifndef THIS_FILE_H`、`#define THIS_FILE_H`、...、`#endif`) ではなく、ヘッダファイルの先頭で `#pragma once` を使います。
|
||||||
|
* プリプロセッサ if の両方の形式を受け付けます: `#ifdef DEFINED` と `#if defined(DEFINED)`
|
||||||
|
* どちらがいいかわからない場合は、`#if defined(DEFINED)` 形式を使ってください。
|
||||||
|
* 複数の条件 `#if` に移行する場合を除き、既存のコードを別のスタイルに変更しないでください。
|
||||||
|
* プリプロセッサディレクティブをインデントする方法(あるいはするかどうか)を決定する時は、以下の事に留意してください:
|
||||||
|
* 一貫性よりも読みやすさが重要です。
|
||||||
|
* ファイルの既存のスタイルに従ってください。ファイルのスタイルが混在している場合は、修正しようとしているセクションに適したスタイルに従ってください。
|
||||||
|
* インデントする時は、ハッシュを行の先頭に置き、`#` と `if` の間に空白を追加します。`#` の後ろに4つスペースを入れて開始します。
|
||||||
|
* 周りの C コードのインデントレベルに従うか、プリプロセッサのディレクティブに独自のインデントレベルを設定することができます。コードの意図を最もよく伝えるスタイルを選択してください。
|
||||||
|
|
||||||
|
わかりやすいように例を示します:
|
||||||
|
|
||||||
|
```c
|
||||||
|
/* Enums for foo */
|
||||||
|
enum foo_state {
|
||||||
|
FOO_BAR,
|
||||||
|
FOO_BAZ,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Returns a value */
|
||||||
|
int foo(void) {
|
||||||
|
if (some_condition) {
|
||||||
|
return FOO_BAR;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# clang-format を使った自動整形
|
||||||
|
|
||||||
|
[Clang-format](https://clang.llvm.org/docs/ClangFormat.html) は LLVM の一部で、誰もが手動で整形するほど暇ではないため、コードを自動整形することができます。私たちは、上記のコーディング規約のほとんどを適用する設定ファイルを提供しています。空白と改行のみを変更するため、省略可能な括弧は自分で付け加えることを忘れないでください。
|
||||||
|
|
||||||
|
Windows で clang-format を入手するには [full LLVM インストーラ](http://llvm.org/builds/)を使い、Ubuntu では `sudo apt install clang-format` を使ってください。
|
||||||
|
|
||||||
|
コマンドラインから実行する場合、オプションとして `-style=file` を渡すと、QMK ルートディレクトリ内の .clang-format 設定ファイルを自動的に見つけます。
|
||||||
|
|
||||||
|
VSCode を使う場合は、標準の C/C++ プラグインが clang-format をサポートしますが、その他にも [独立した拡張機能](https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.ClangFormat) があります。
|
||||||
|
|
||||||
|
幾つかのコード (LAYOUT マクロのような)が clang-format によって破壊されるため、これらのファイルで clang-format を実行しないか、整形したくないコードを `// clang-format off` と `// clang-format on` で囲みます。
|
||||||
@@ -0,0 +1,331 @@
|
|||||||
|
# コーディング規約 (Python)
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.19:docs/coding_conventions_python.md
|
||||||
|
git diff 0.9.19 HEAD -- docs/coding_conventions_python.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
私たちのスタイルの大部分は PEP8 に従いますが、神経質にならないように幾つかのローカルな変更を加えています。
|
||||||
|
|
||||||
|
* サポートされる全てのプラットフォームとの互換性のために、Python 3.6 を対象にしています。
|
||||||
|
* 4つのスペース (ソフトタブ) を使ってインデントします
|
||||||
|
* 充分なコメントを書くことを推奨します
|
||||||
|
* コメントを機能を説明するストーリーと考えて下さい
|
||||||
|
* 特定の決定がなされた理由を充分なコメントで説明してください。
|
||||||
|
* 分かり切ったコメントは書かないでください
|
||||||
|
* 分かり切ったコメントであるか確信できない場合は、コメントを含めてください。
|
||||||
|
* 全ての関数について、役に立つ docstring を必要とします。
|
||||||
|
* 一般的に、行を折り返さないで、必要なだけ長くすることができます。行を折り返すことを選択した場合は、76列を超えて折り返さないでください。
|
||||||
|
* 私たちの慣習の幾つかは、Python 使いでは無い人にコードベースをより身近にするために、python コミュニティに広まっているものとは競合しています。
|
||||||
|
|
||||||
|
# YAPF
|
||||||
|
|
||||||
|
コードを整形するために [yapf](https://github.com/google/yapf) を使うことができます。[setup.cfg](setup.cfg) で設定を提供しています。
|
||||||
|
|
||||||
|
# インポート
|
||||||
|
|
||||||
|
`import ...` や `from ... import ...` をいつ使うかについての厳密なルールはありません。理解しやすさと保守性が究極の目的です。
|
||||||
|
|
||||||
|
一般的に、コードを短く理解しやすくするためにモジュールから特定の関数とクラス名をインポートする方が望ましいです。これにより、名前が曖昧になることがあります。代わりにモジュールをインポートするようにします。互換性のあるモジュールをインポートする時を除いて、インポートする時は "as" キーワードを避けるべきです。
|
||||||
|
|
||||||
|
インポートは各モジュール1行にする必要があります。標準的な python ルールに従って、インポート文をシステム、サードパーティ、ローカルにグループ化します。
|
||||||
|
|
||||||
|
`from foo import *` を使わないでください。代わりにインポートしたいオブジェクトのリストを指定するか、モジュール全体をインポートします。
|
||||||
|
|
||||||
|
## インポートの例
|
||||||
|
|
||||||
|
良い:
|
||||||
|
|
||||||
|
```
|
||||||
|
from qmk import effects
|
||||||
|
|
||||||
|
effects.echo()
|
||||||
|
```
|
||||||
|
|
||||||
|
悪い:
|
||||||
|
|
||||||
|
```
|
||||||
|
from qmk.effects import echo
|
||||||
|
|
||||||
|
echo() # echoがどこから来たのかが不明瞭です
|
||||||
|
```
|
||||||
|
|
||||||
|
良い:
|
||||||
|
|
||||||
|
```
|
||||||
|
from qmk.keymap import compile_firmware
|
||||||
|
|
||||||
|
compile_firmware()
|
||||||
|
```
|
||||||
|
|
||||||
|
良いですが、上の方がより良いです:
|
||||||
|
|
||||||
|
```
|
||||||
|
import qmk.keymap
|
||||||
|
|
||||||
|
qmk.keymap.compile_firmware()
|
||||||
|
```
|
||||||
|
|
||||||
|
# 命令文
|
||||||
|
|
||||||
|
各行1文としてください。
|
||||||
|
|
||||||
|
可能な場合(例えば `if foo: bar`)でも、2つの文を1行にまとめないでください。
|
||||||
|
|
||||||
|
# 命名
|
||||||
|
|
||||||
|
`module_name`, `package_name`, `ClassName`, `method_name`, `ExceptionName`, `function_name`, `GLOBAL_CONSTANT_NAME`, `global_var_name`, `instance_var_name`, `function_parameter_name`, `local_var_name`.
|
||||||
|
|
||||||
|
関数名、変数名 およびファイル名は説明的でなければなりません; 略語を避けます。特に、プロジェクト外の読み手に曖昧あるいは馴染みのない略語を使わず、単語内の文字を削除して略さないでください。
|
||||||
|
|
||||||
|
常に .py のファイル名の拡張子を使います。ダッシュを使わないでください。
|
||||||
|
|
||||||
|
## 避けるべき名前
|
||||||
|
|
||||||
|
* カウンタあるいはイテレータ以外の1文字の名前。try/except 文では例外の識別子として `e` を使うことができます。
|
||||||
|
* パッケージ/モジュール名内のダッシュ (`-`)
|
||||||
|
* `__double_leading_and_trailing_underscore__` (2つのアンダースコアで始まる名前と終わる名前、Python で予約済み)
|
||||||
|
|
||||||
|
# Docstring
|
||||||
|
|
||||||
|
docstring の一貫性を維持するために、以下のガイドラインを設定しました。
|
||||||
|
|
||||||
|
* マークダウン(Markdown)形式の使用
|
||||||
|
* 常に少なくとも1つの改行を含む3つのダブルクォートの docstring を使ってください: `"""\n"""`
|
||||||
|
* 最初の行は、関数が行うことの短い (70文字未満) 説明です。
|
||||||
|
* docstring が更に必要な場合は、説明と残りの間に空白行を入れます。
|
||||||
|
* 開始の3つのダブルクォートと同じインデントレベルでインデント行を始めます
|
||||||
|
* 以下で説明する形式を使って全ての関数の引数について記述します
|
||||||
|
* Args:、Returns: および Raises: が存在する場合、それらは docstring の最後の3つの要素で、それぞれ空白行で区切られなければなりません。
|
||||||
|
|
||||||
|
## 簡単な docstring の例
|
||||||
|
|
||||||
|
```
|
||||||
|
def my_awesome_function():
|
||||||
|
"""1970 Jan 1 00:00 UTC からの秒数を返します。
|
||||||
|
"""
|
||||||
|
return int(time.time())
|
||||||
|
```
|
||||||
|
|
||||||
|
## 複雑な docstring の例
|
||||||
|
|
||||||
|
```
|
||||||
|
def my_awesome_function():
|
||||||
|
"""1970 Jan 1 00:00 UTC からの秒数を返します。
|
||||||
|
|
||||||
|
この関数は常に整数の秒数を返します。
|
||||||
|
"""
|
||||||
|
return int(time.time())
|
||||||
|
```
|
||||||
|
|
||||||
|
## 関数の引数の docstring の例
|
||||||
|
|
||||||
|
```
|
||||||
|
def my_awesome_function(start=None, offset=0):
|
||||||
|
"""1970 Jan 1 00:00 UTC からの秒数を返します。
|
||||||
|
|
||||||
|
この関数は常に整数の秒数を返します。
|
||||||
|
|
||||||
|
|
||||||
|
Args:
|
||||||
|
start
|
||||||
|
1970 Jan 1 00:00 UTC の代わりの開始時間
|
||||||
|
|
||||||
|
offset
|
||||||
|
最初の引数からこの秒数が引かれた答えを返します
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
秒数を表す整数。
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ValueError
|
||||||
|
`start` あるいは `offset` が正の数ではない場合
|
||||||
|
"""
|
||||||
|
if start < 0 or offset < 0:
|
||||||
|
raise ValueError('start and offset must be positive numbers.')
|
||||||
|
|
||||||
|
if not start:
|
||||||
|
start = time.time()
|
||||||
|
|
||||||
|
return int(start - offset)
|
||||||
|
```
|
||||||
|
|
||||||
|
# 例外
|
||||||
|
|
||||||
|
例外は例外的な状況を処理するために使われます。フローの制御のために使われるべきではありません。これは Python の「許しを請う」という規範からの逸脱です。例外をキャッチする場合、異常な状況を処理する必要があります。
|
||||||
|
|
||||||
|
何らかの理由で全ての例外のキャッチを使う場合は、cli.log を使って例外とスタックトレースを記録する必要があります。
|
||||||
|
|
||||||
|
try/except ブロックをできるだけ短くします。多数の try 文が必要な場合は、コードを再構成する必要があるかもしれません。
|
||||||
|
|
||||||
|
# タプル
|
||||||
|
|
||||||
|
1項目のタプルを定義する場合、タプルを使用していることが明らかになるように、常に末尾のカンマを含めます。暗黙的な1項目のタプルのアンパックに頼らないでください。明確なリストを使う方が良いです。
|
||||||
|
|
||||||
|
これはよく使用される printf 形式の書式文字列を使う場合に、特に重要です。
|
||||||
|
|
||||||
|
# リストと辞書
|
||||||
|
|
||||||
|
シーケンス形式と末尾のカンマとを区別するように YAPF を設定しました。末尾のカンマが省略されると、YAPF はシーケンスを1つの行として整形します。末尾のカンマがある場合、YAPF はシーケンスを1行1項目で整形します。
|
||||||
|
|
||||||
|
一般的に1行が短い定義になるようにすべきです。読みやすさと保守性を向上させるために、後からではなく早めに複数の行を分割してください。
|
||||||
|
|
||||||
|
# 括弧
|
||||||
|
|
||||||
|
過度な括弧は避けますが、括弧を使ってコードを理解しやすくします。タプルを明示的に返すか、あるいは数式の一部である場合を除き、return 文で括弧を使わないでください。
|
||||||
|
|
||||||
|
# 書式文字列
|
||||||
|
|
||||||
|
一般的に printf 形式の書式文字列を用います。例:
|
||||||
|
|
||||||
|
```
|
||||||
|
name = 'World'
|
||||||
|
print('Hello, %s!' % (name,))
|
||||||
|
```
|
||||||
|
|
||||||
|
このスタイルはログモジュールで使われており、私たちはそれを広範囲で利用しており、一貫性を保つために他の場所でも採用しています。これは、私たちの気まぐれな読者の大部分である C プログラマにもおなじみのスタイルです。
|
||||||
|
|
||||||
|
付属の CLI モジュールは、パーセント (%) 演算子を使わずにこれらを使うことをサポートしています。詳細は、`cli.echo()` と様々な `cli.log` 関数 (例えば、`cli.log.info()`) を見てください。
|
||||||
|
|
||||||
|
# 内包表記とジェネレータ表記
|
||||||
|
|
||||||
|
内包表記とジェネレータの自由な使用を推奨しますが、あまりに複雑にしないでください。複雑になる場合は、理解しやすい for ループで代替します。
|
||||||
|
|
||||||
|
# ラムダ
|
||||||
|
|
||||||
|
使っても問題ありませんが、おそらく避けるべきです。内包表記とジェネレータを使えば、ラムダの必要性は以前ほど強くありません。
|
||||||
|
|
||||||
|
# 条件式
|
||||||
|
|
||||||
|
変数の割り当てでは問題ありませんが、そうでなければ避けるべきです。
|
||||||
|
|
||||||
|
条件式はコードに続く if 文です。例えば:
|
||||||
|
|
||||||
|
```
|
||||||
|
x = 1 if cond else 2
|
||||||
|
```
|
||||||
|
|
||||||
|
一般にこれらを関数の引数、シーケンス項目などとして使用することはお勧めできません。見落としやすくなります。
|
||||||
|
|
||||||
|
# デフォルト引数
|
||||||
|
|
||||||
|
推奨されていますが、値は不変オブジェクトでなければなりません。
|
||||||
|
|
||||||
|
デフォルト値に引数リストを指定する場合は、その場で変更できないオブジェクトを指定するように常に注意してください。可変オブジェクトを使うと変更は呼び出しの間で持続しますが、これは通常あなたの望むものではありませんそれがあなたのやろうとしていることであっても、他の人にとっては混乱するもので理解を妨げます。
|
||||||
|
|
||||||
|
悪い:
|
||||||
|
|
||||||
|
```
|
||||||
|
def my_func(foo={}):
|
||||||
|
pass
|
||||||
|
```
|
||||||
|
|
||||||
|
良い:
|
||||||
|
|
||||||
|
```
|
||||||
|
def my_func(foo=None):
|
||||||
|
if not foo:
|
||||||
|
foo = {}
|
||||||
|
```
|
||||||
|
|
||||||
|
# プロパティ
|
||||||
|
|
||||||
|
getter および setter 関数の代わりにプロパティを常に使います。
|
||||||
|
|
||||||
|
```
|
||||||
|
class Foo(object):
|
||||||
|
def __init__(self):
|
||||||
|
self._bar = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def bar(self):
|
||||||
|
return self._bar
|
||||||
|
|
||||||
|
@bar.setter
|
||||||
|
def bar(self, bar):
|
||||||
|
self._bar = bar
|
||||||
|
```
|
||||||
|
|
||||||
|
# True/False の評価
|
||||||
|
|
||||||
|
一般的に、if 文で等価性を調べるのではなく、暗黙的な True/False 評価を行うべきです。
|
||||||
|
|
||||||
|
悪い:
|
||||||
|
|
||||||
|
```
|
||||||
|
if foo == True:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if bar == False:
|
||||||
|
pass
|
||||||
|
```
|
||||||
|
|
||||||
|
良い:
|
||||||
|
|
||||||
|
```
|
||||||
|
if foo:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if not bar:
|
||||||
|
pass
|
||||||
|
```
|
||||||
|
|
||||||
|
# デコレータ
|
||||||
|
|
||||||
|
適切な時に使ってください。理解に役立つ時を除き、魔法の(ように見える技巧の)使いすぎは避けるようにしてください。
|
||||||
|
|
||||||
|
# スレッドとマルチプロセス
|
||||||
|
|
||||||
|
避けるべきです。これが必要な場合は、私たちがコードをマージする前に十分な理由を述べる必要があります。
|
||||||
|
|
||||||
|
# 強力な機能
|
||||||
|
|
||||||
|
Python は非常に柔軟な言語で、独自のメタクラス、バイトコードへのアクセス、実行中コンパイル、動的な継承、オブジェクトの親の変更、インポートハック、リフレクション、システム内部の変更など、多くの素晴らしい機能を提供します。
|
||||||
|
|
||||||
|
これらを使わないでください。
|
||||||
|
|
||||||
|
パフォーマンスは私たちにとって重要な関心ごとではなく、コードのわかりやすさに関心があります。私たちは、コードベースを1日か2日しかいじっていない人が利用できるようにしたいです。これらの機能は一般的に理解のしやすさを犠牲にするため、より高速あるいはよりコンパクトなコードよりも、容易に理解できるコードの方が望ましいです。
|
||||||
|
|
||||||
|
一部の標準ライブラリモジュールはこれらの手法を使っており、これらのモジュールを利用しても問題ありません。ただし、それらを使う時には、読みやすさと理解のしやすさを忘れないでください。
|
||||||
|
|
||||||
|
# 型アノテーション付きコード
|
||||||
|
|
||||||
|
今のところ型アノテーションシステムを使っていないため、コードにアノテーションをつけないようにしてください。将来的にはこれを再検討する可能性があります。
|
||||||
|
|
||||||
|
# 関数の長さ
|
||||||
|
|
||||||
|
小さくて焦点のあった関数にしてください。
|
||||||
|
|
||||||
|
長い関数が時には適切であることを理解しているので、関数の長さには厳密な制限はありません。関数が約40行を超える場合は、プログラムの構造を損なわずに分割できるかどうかを検討してください。
|
||||||
|
|
||||||
|
今のところ長い関数が完全に機能するとしても、数か月でそれを変更する人が新しい挙動を追加するかもしれません。これにより見つけにくいバグが発生するかもしれません。関数を短くかつシンプルにすることで、他の人がコードを読んで修正しやすくします。
|
||||||
|
|
||||||
|
幾つかのコードで作業をすると、長く複雑な関数を見つけるかもしれません。既存コードを変更することを怖がらないでください: もし、難しいことが判明したり、エラーがデバッグしづらいとわかったり、いくつかの異なるコンテキストで一部を使いたいような関数を扱っている場合、関数を小さくてより扱いやすい単位に分割することを検討してください。
|
||||||
|
|
||||||
|
# FIXME
|
||||||
|
|
||||||
|
FIXME をコードに残しても構いません。なぜでしょうか?このコードを文章化しないままにするよりも、少なくとも考え抜く必要がある(あるいは混乱している)コードの一部を文章化するように奨励する方が、このコードを文章化しないままにするよりも良いです。
|
||||||
|
|
||||||
|
全ての FIXME は以下のように書式化されるべきです:
|
||||||
|
|
||||||
|
```
|
||||||
|
FIXME(username): 何々機能が完了したらこのコードを再検討する。
|
||||||
|
```
|
||||||
|
|
||||||
|
...username はあなたの GitHub のユーザ名です。
|
||||||
|
|
||||||
|
# テスト
|
||||||
|
|
||||||
|
統合テストと単体テストの組み合わせを使ってコードが可能な限りバグが無いようにします。全てのテストは `lib/python/qmk/tests/` にあります。`qmk pytest` を使って全てのテストを実行することができます。
|
||||||
|
|
||||||
|
これを書いている時点では、テストは全く完全なものではありません。現在のテストを見て、テストされていない状況のための新しいテストケースを書くことは、コードベースに精通し、QMK に貢献するという両方の点で素晴らしい方法です。
|
||||||
|
|
||||||
|
## 統合テスト
|
||||||
|
|
||||||
|
統合テストは `lib/python/qmk/tests/test_cli_commands.py` にあります。ここで実際に CLI コマンドが実行され、全体的な動作が検証されます。[`subprocess`](https://docs.python.org/3.6/library/subprocess.html#module-subprocess) を使って各 CLI コマンドを起動し、正しく動作するかを判断するために出力とリターンコードの組み合わせを使います。
|
||||||
|
|
||||||
|
## ユニットテスト
|
||||||
|
|
||||||
|
`lib/python/qmk/tests/` 内の他の `test_*.py` ファイルはユニットテストを含みます。`lib/python/qmk/` 内の個々の関数のテストをここに書くことができます。一般的にこれらのファイルはモジュールに基づいて名前を付けられ、ドットはアンダースコアで置き換えられます。
|
||||||
|
|
||||||
|
これを書いている時点では、テストのためのモックを作っていません。これを変更する手伝いをしたい場合は、[issue を開く](https://github.com/qmk/qmk_firmware/issues/new?assignees=&labels=cli%2C+python&template=other_issues.md&title=) か [Discord の #cli に参加](https://discord.gg/heQPAgy)し、そこで会話を開始してください。
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
# QMK の設定
|
# QMK の設定
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.8.62:docs/config_options.md
|
original document: 0.9.43:docs/config_options.md
|
||||||
git diff 0.8.62 HEAD -- docs/config_options.md | cat
|
git diff 0.9.43 HEAD -- docs/config_options.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
QMK はほぼ無制限に設定可能です。可能なところはいかなるところでも、やりすぎな程、ユーザーがコードサイズを犠牲にしてでも彼らのキーボードをカスタマイズをすることを許しています。ただし、このレベルの柔軟性により設定が困難になります。
|
QMK はほぼ無制限に設定可能です。可能なところはいかなるところでも、やりすぎな程、ユーザーがコードサイズを犠牲にしてでも彼らのキーボードをカスタマイズをすることを許しています。ただし、このレベルの柔軟性により設定が困難になります。
|
||||||
@@ -48,8 +48,6 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
|
|||||||
* 一般的に、誰もしくはどのブランドがボードを作成したか
|
* 一般的に、誰もしくはどのブランドがボードを作成したか
|
||||||
* `#define PRODUCT Board`
|
* `#define PRODUCT Board`
|
||||||
* キーボードの名前
|
* キーボードの名前
|
||||||
* `#define DESCRIPTION a keyboard`
|
|
||||||
* キーボードの簡単な説明
|
|
||||||
* `#define MATRIX_ROWS 5`
|
* `#define MATRIX_ROWS 5`
|
||||||
* キーボードのマトリックスの行の数
|
* キーボードのマトリックスの行の数
|
||||||
* `#define MATRIX_COLS 15`
|
* `#define MATRIX_COLS 15`
|
||||||
@@ -120,9 +118,9 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
|
|||||||
* `#define NO_ACTION_ONESHOT`
|
* `#define NO_ACTION_ONESHOT`
|
||||||
* ワンショットモディファイアを無効にします
|
* ワンショットモディファイアを無効にします
|
||||||
* `#define NO_ACTION_MACRO`
|
* `#define NO_ACTION_MACRO`
|
||||||
* 古い形式のマクロ処理を無効にします: MACRO() & action_get_macro
|
* `MACRO()`、`action_get_macro()` _(非推奨)_ を使う古い形式のマクロ処理を無効にします
|
||||||
* `#define NO_ACTION_FUNCTION`
|
* `#define NO_ACTION_FUNCTION`
|
||||||
* fn_actions 配列(非推奨)からの action_function() の呼び出しを無効にします
|
* `fn_actions`、`action_function()` _(非推奨)_ を使う古い形式の関数処理を無効にします
|
||||||
|
|
||||||
## 有効にできる機能
|
## 有効にできる機能
|
||||||
|
|
||||||
@@ -189,7 +187,14 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
|
|||||||
* `#define RGBLIGHT_ANIMATIONS`
|
* `#define RGBLIGHT_ANIMATIONS`
|
||||||
* RGB アニメーションを実行します
|
* RGB アニメーションを実行します
|
||||||
* `#define RGBLIGHT_LAYERS`
|
* `#define RGBLIGHT_LAYERS`
|
||||||
* オンとオフを切り替えることができる [ライトレイヤー](ja/feature_rgblight.md) を定義できます。現在のキーボードレイヤーまたは Caps Lock 状態を表示するのに最適です。
|
* オンとオフを切り替えることができる [ライトレイヤー](ja/feature_rgblight.md?id=lighting-layers) を定義できます。現在のキーボードレイヤーまたは Caps Lock 状態を表示するのに最適です。
|
||||||
|
* `#define RGBLIGHT_MAX_LAYERS`
|
||||||
|
* デフォルトは8です。もしさらに [ライトレイヤー](ja/feature_rgblight.md?id=lighting-layers) が必要であれば、32まで拡張できます。
|
||||||
|
* メモ: 最大値を大きくするとファームウェアサイズが大きくなり、分割キーボードで同期が遅くなります。
|
||||||
|
* `#define RGBLIGHT_LAYER_BLINK`
|
||||||
|
* 指定されたミリ秒の間、ライトレイヤーを [点滅](ja/feature_rgblight.md?id=lighting-layer-blink) する機能を追加します(例えば、アクションを確認するため)。
|
||||||
|
* `#define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF`
|
||||||
|
* 定義されている場合、RGB ライトがオフになっている場合でも [ライトレイヤー](ja/feature_rgblight?id=overriding-rgb-lighting-onoff-status) が表示されます。
|
||||||
* `#define RGBLED_NUM 12`
|
* `#define RGBLED_NUM 12`
|
||||||
* LED の数
|
* LED の数
|
||||||
* `#define RGBLIGHT_SPLIT`
|
* `#define RGBLIGHT_SPLIT`
|
||||||
@@ -241,7 +246,10 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
|
|||||||
* `#define SPLIT_HAND_PIN B7`
|
* `#define SPLIT_HAND_PIN B7`
|
||||||
* high/low ピンを使って左右を決定します。low = 右手、high = 左手。`B7` を使っているピンに置き換えます。これはオプションで、`SPLIT_HAND_PIN` が未定義のままである場合、EE_HANDS メソッドまたは標準の Let's Splitが使っている MASTER_LEFT / MASTER_RIGHT 定義をまだ使うことができます。
|
* high/low ピンを使って左右を決定します。low = 右手、high = 左手。`B7` を使っているピンに置き換えます。これはオプションで、`SPLIT_HAND_PIN` が未定義のままである場合、EE_HANDS メソッドまたは標準の Let's Splitが使っている MASTER_LEFT / MASTER_RIGHT 定義をまだ使うことができます。
|
||||||
|
|
||||||
* `#define EE_HANDS` (`SPLIT_HAND_PIN` が定義されていない場合のみ動作します)
|
* `#define SPLIT_HAND_MATRIX_GRID <out_pin>,<in_pin>`
|
||||||
|
* 左右はキーマトリックスのキースイッチが存在しない交点を使って決定されます。通常、この交点が短絡している(ローレベル)のときに左側と見なされます。もし `#define SPLIT_HAND_MATRIX_GRID_LOW_IS_RIGHT` が定義されている場合は、ローレベルの時に右側と決定されます。
|
||||||
|
|
||||||
|
* `#define EE_HANDS` (`SPLIT_HAND_PIN` と `SPLIT_HAND_MATRIX_GRID` が定義されていない場合のみ動作します)
|
||||||
* `eeprom-lefthand.eep`/`eeprom-righthand.eep` がそれぞれの半分に書き込まれた後で、EEPROM 内に格納されている左右の設定の値を読み込みます。
|
* `eeprom-lefthand.eep`/`eeprom-righthand.eep` がそれぞれの半分に書き込まれた後で、EEPROM 内に格納されている左右の設定の値を読み込みます。
|
||||||
|
|
||||||
* `#define MASTER_RIGHT`
|
* `#define MASTER_RIGHT`
|
||||||
@@ -315,7 +323,8 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
|
|||||||
* `LAYOUTS`
|
* `LAYOUTS`
|
||||||
* このキーボードがサポートする[レイアウト](ja/feature_layouts.md)のリスト
|
* このキーボードがサポートする[レイアウト](ja/feature_layouts.md)のリスト
|
||||||
* `LINK_TIME_OPTIMIZATION_ENABLE`
|
* `LINK_TIME_OPTIMIZATION_ENABLE`
|
||||||
* キーボードをコンパイルする時に、Link Time Optimization (`LTO`) を有効にします。これは処理に時間が掛かりますが、コンパイルされたサイズを大幅に減らします (そして、ファームウェアが小さいため、追加の時間は分からないくらいです)。ただし、`LTO` が有効な場合、古いマクロと関数の機能が壊れるため、自動的にこれらの機能を無効にします。これは `NO_ACTION_MACRO` と `NO_ACTION_FUNCTION` を自動的に定義することで行われます。
|
* キーボードをコンパイルする時に、Link Time Optimization (LTO) を有効にします。これは処理に時間が掛かりますが、コンパイルされたサイズを大幅に減らします (そして、ファームウェアが小さいため、追加の時間は分からないくらいです)。
|
||||||
|
ただし、LTO が有効な場合、古い TMK のマクロと関数の機能が壊れるため、自動的にこれらの機能を無効にします。これは `NO_ACTION_MACRO` と `NO_ACTION_FUNCTION` を自動的に定義することで行われます。(メモ: これは QMK の [マクロ](ja/feature_macros.md) と [レイヤー](ja/feature_layers.md) には影響を与えません。)
|
||||||
* `LTO_ENABLE`
|
* `LTO_ENABLE`
|
||||||
* LINK_TIME_OPTIMIZATION_ENABLE と同じ意味です。`LINK_TIME_OPTIMIZATION_ENABLE` の代わりに `LTO_ENABLE` を使うことができます。
|
* LINK_TIME_OPTIMIZATION_ENABLE と同じ意味です。`LINK_TIME_OPTIMIZATION_ENABLE` の代わりに `LTO_ENABLE` を使うことができます。
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# キーボードの挙動をカスタマイズする方法
|
# キーボードの挙動をカスタマイズする方法
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.8.62:docs/custom_quantum_functions.md
|
original document: 0.9.43:docs/custom_quantum_functions.md
|
||||||
git diff 0.8.62 HEAD -- docs/custom_quantum_functions.md | cat
|
git diff 0.9.43 HEAD -- docs/custom_quantum_functions.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
多くの人にとって、カスタムキーボードはボタンの押下をコンピュータに送信するだけではありません。単純なボタンの押下やマクロよりも複雑なことを実行できるようにしたいでしょう。QMK にはコードを挿入したり、機能を上書きしたり、様々な状況でキーボードの挙動をカスタマイズできるフックがあります。
|
多くの人にとって、カスタムキーボードはボタンの押下をコンピュータに送信するだけではありません。単純なボタンの押下やマクロよりも複雑なことを実行できるようにしたいでしょう。QMK にはコードを挿入したり、機能を上書きしたり、様々な状況でキーボードの挙動をカスタマイズできるフックがあります。
|
||||||
@@ -346,6 +346,11 @@ layer_state_t layer_state_set_user(layer_state_t state) {
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
特定のレイヤーの状態を確認するには、 `IS_LAYER_ON_STATE(state, layer)` と `IS_LAYER_OFF_STATE(state, layer)` マクロを使います。
|
||||||
|
|
||||||
|
`layer_state_set_*` 関数の外では、グローバルなレイヤー状態を確認するために `IS_LAYER_ON(layer)` と `IS_LAYER_OFF(layer)` マクロを使えます。
|
||||||
|
|
||||||
### `layer_state_set_*` 関数のドキュメント
|
### `layer_state_set_*` 関数のドキュメント
|
||||||
|
|
||||||
* キーボード/リビジョン: `layer_state_t layer_state_set_kb(layer_state_t state)`
|
* キーボード/リビジョン: `layer_state_t layer_state_set_kb(layer_state_t state)`
|
||||||
@@ -451,7 +456,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
layer_state_set(layer_state); // すぐにレイヤーの色を更新します
|
layer_state_set(layer_state); // すぐにレイヤーの色を更新します
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false; break;
|
return false;
|
||||||
case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // 任意の RGB コード に対して(quantum_keycodes.h を見てください。400行目参照)
|
case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // 任意の RGB コード に対して(quantum_keycodes.h を見てください。400行目参照)
|
||||||
if (record->event.pressed) { // これはレイヤー表示を無効にします。これを変更する場合は、無効にしたいだろうため。
|
if (record->event.pressed) { // これはレイヤー表示を無効にします。これを変更する場合は、無効にしたいだろうため。
|
||||||
if (user_config.rgb_layer_change) { // 有効な場合のみ
|
if (user_config.rgb_layer_change) { // 有効な場合のみ
|
||||||
@@ -488,56 +493,3 @@ void eeconfig_init_user(void) { // EEPROM がリセットされます!
|
|||||||
* キーマップ: `void eeconfig_init_user(void)`、`uint32_t eeconfig_read_user(void)` および `void eeconfig_update_user(uint32_t val)`
|
* キーマップ: `void eeconfig_init_user(void)`、`uint32_t eeconfig_read_user(void)` および `void eeconfig_update_user(uint32_t val)`
|
||||||
|
|
||||||
`val` は EEPROM に書き込みたいデータの値です。`eeconfig_read_*` 関数は EEPROM から32ビット(DWORD) 値を返します。
|
`val` は EEPROM に書き込みたいデータの値です。`eeconfig_read_*` 関数は EEPROM から32ビット(DWORD) 値を返します。
|
||||||
|
|
||||||
# カスタムタッピング期間
|
|
||||||
|
|
||||||
デフォルトでは、タッピング期間と(`IGNORE_MOD_TAP_INTERRUPT` のような)関連オプションはグローバルに設定されていて、キーでは設定することができません。ほとんどのユーザにとって、これは全然問題ありません。しかし、場合によっては、`LT` キーとは異なるタイムアウトによって、デュアルファンクションキーが大幅に改善されます。なぜなら、一部のキーは他のキーよりも押し続けやすいためです。それぞれにカスタムキーコードを使う代わりに、キーごとに設定可能なタイムアウトの挙動を設定できます。
|
|
||||||
|
|
||||||
キーごとのタイムアウトの挙動を制御するための2つの設定可能なオプションがあります:
|
|
||||||
|
|
||||||
- `TAPPING_TERM_PER_KEY`
|
|
||||||
- `IGNORE_MOD_TAP_INTERRUPT_PER_KEY`
|
|
||||||
|
|
||||||
必要な機能ごとに、`config.h` に `#define` 行を追加する必要があります。
|
|
||||||
|
|
||||||
```
|
|
||||||
#define TAPPING_TERM_PER_KEY
|
|
||||||
#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## `get_tapping_term` の実装例
|
|
||||||
|
|
||||||
キーコードに基づいて `TAPPING_TERM` を変更するには、次のようなものを `keymap.c` ファイルに追加します:
|
|
||||||
|
|
||||||
```c
|
|
||||||
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
|
|
||||||
switch (keycode) {
|
|
||||||
case SFT_T(KC_SPC):
|
|
||||||
return TAPPING_TERM + 1250;
|
|
||||||
case LT(1, KC_GRV):
|
|
||||||
return 130;
|
|
||||||
default:
|
|
||||||
return TAPPING_TERM;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## `get_ignore_mod_tap_interrupt` の実装例
|
|
||||||
|
|
||||||
キーコードに基づいて `IGNORE_MOD_TAP_INTERRUPT` の値を変更するには、次のようなものを `keymap.c` ファイルに追加します:
|
|
||||||
|
|
||||||
```c
|
|
||||||
bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) {
|
|
||||||
switch (keycode) {
|
|
||||||
case SFT_T(KC_SPC):
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## `get_tapping_term` / `get_ignore_mod_tap_interrupt` 関数のドキュメント
|
|
||||||
|
|
||||||
ここにある他の多くの関数とは異なり、quantum あるいはキーボードレベルの関数を持つ必要はありません (または理由さえありません)。ここではユーザレベルの関数だけが有用なため、そのようにマークする必要はありません。
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
# Zadig を使ったブートローダドライバのインストール
|
# Zadig を使ったブートローダドライバのインストール
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.9.0:docs/driver_installation_zadig.md
|
original document: 0.9.43:docs/driver_installation_zadig.md
|
||||||
git diff 0.9.0 HEAD -- docs/driver_installation_zadig.md | cat
|
git diff 0.9.43 HEAD -- docs/driver_installation_zadig.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
QMK はホストにたいして通常の HID キーボードデバイスとして振る舞うため特別なドライバは必要ありません。しかし、Windows でのキーボードへの書き込みは、多くの場合、キーボードをリセットした時に現れるブートローダデバイスで*行います*。
|
QMK はホストにたいして通常の HID キーボードデバイスとして振る舞うため特別なドライバは必要ありません。しかし、Windows でのキーボードへの書き込みは、多くの場合、キーボードをリセットした時に現れるブートローダデバイスで*行います*。
|
||||||
@@ -28,7 +28,7 @@ Zadig は自動的にブートローダデバイスを検知します。**Option
|
|||||||
|
|
||||||
!> Zadig が `HidUsb` ドライバを使用する1つ以上のデバイスを表示する場合、キーボードはおそらくブートローダモードではありません。矢印はオレンジ色になり、システムドライバの変更を確認するように求められます。この場合、続行**しないでください**!
|
!> Zadig が `HidUsb` ドライバを使用する1つ以上のデバイスを表示する場合、キーボードはおそらくブートローダモードではありません。矢印はオレンジ色になり、システムドライバの変更を確認するように求められます。この場合、続行**しないでください**!
|
||||||
|
|
||||||
矢印が緑色で表示されたら、ドライバを選択し、**Install Driver** をクリックします。`libusb-win32` ドライバは通常 AVR で動作し、`WinUSB`は ARM で動作しますが、それでもキーボードに書き込みできない場合は、リストから異なるドライバをインストールしてみてください。msys2 を使ってコマンドライン経由で USBaspLoader デバイスに書き込むには、`libusbk` ドライバがお勧めです。そうではなく書き込みに QMK Toolbox を使っている場合は `libusb-win32` がうまく動作します。
|
矢印が緑色で表示されたら、ドライバを選択し、**Install Driver** をクリックします。`libusb-win32` ドライバは通常 AVR で動作し、`WinUSB`は ARM で動作しますが、それでもキーボードに書き込みできない場合は、リストから異なるドライバをインストールしてみてください。USBAspLoader デバイスは `libusbK` ドライバを使わなければなりません。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# よくあるビルドの質問
|
# よくあるビルドの質問
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.9.10:docs/faq_build.md
|
original document: 0.9.43:docs/faq_build.md
|
||||||
git diff 0.9.10 HEAD -- docs/faq_build.md | cat
|
git diff 0.9.43 HEAD -- docs/faq_build.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
このページは QMK のビルドに関する質問を説明します。まだビルドをしていない場合は、[ビルド環境のセットアップ](ja/getting_started_build_tools.md) および [Make 手順](ja/getting_started_make_guide.md)ガイドを読むべきです。
|
このページは QMK のビルドに関する質問を説明します。まだビルドをしていない場合は、[ビルド環境のセットアップ](ja/getting_started_build_tools.md) および [Make 手順](ja/getting_started_make_guide.md)ガイドを読むべきです。
|
||||||
@@ -57,7 +57,7 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b4f", ATTRS{idProduct}=="9203", TAG+="uacc
|
|||||||
|
|
||||||
**注意:** 古い(1.12以前の) ModemManager では、フィルタリングは厳密なモードではない場合にのみ動作し、以下のコマンドはその設定を更新することができます。
|
**注意:** 古い(1.12以前の) ModemManager では、フィルタリングは厳密なモードではない場合にのみ動作し、以下のコマンドはその設定を更新することができます。
|
||||||
```console
|
```console
|
||||||
sudo sed -i 's/--filter-policy=strict/--filter-policy=default/' /lib/systemd/system/ModemManager.service
|
printf '[Service]\nExecStart=\nExecStart=/usr/sbin/ModemManager --filter-policy=default' | sudo tee /etc/systemd/system/ModemManager.service.d/policy.conf
|
||||||
sudo systemctl daemon-reload
|
sudo systemctl daemon-reload
|
||||||
sudo systemctl restart ModemManager
|
sudo systemctl restart ModemManager
|
||||||
```
|
```
|
||||||
|
|||||||
+118
-147
@@ -1,253 +1,224 @@
|
|||||||
# バックライト
|
# バックライト :id=backlighting
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.9.10:docs/feature_backlight.md
|
original document: 0.9.44:docs/feature_backlight.md
|
||||||
git diff 0.9.10 HEAD -- docs/feature_backlight.md | cat
|
git diff 0.9.44 HEAD -- docs/feature_backlight.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
多くのキーボードは、キースイッチを貫通して配置されたり、キースイッチの下に配置された個々の LED によって、バックライトキーをサポートします。この機能は通常スイッチごとに単一の色しか使用できないため、[RGB アンダーグロー](ja/feature_rgblight.md)および [RGB マトリックス](ja/feature_rgb_matrix.md)機能のどちらとも異なりますが、キーボードに複数の異なる単一色の LED を取り付けることは当然可能です。
|
多くのキーボードは、キースイッチを貫通して配置されたり、キースイッチの下に配置された個々の LED によって、バックライトキーをサポートします。この機能は通常スイッチごとに単一の色しか使用できないため、[RGB アンダーグロー](ja/feature_rgblight.md)および [RGB マトリックス](ja/feature_rgb_matrix.md)機能のどちらとも異なりますが、キーボードに複数の異なる単一色の LED を取り付けることは当然可能です。
|
||||||
|
|
||||||
QMK は *パルス幅変調*(*Pulse Width Modulation*) すなわち PWM として知られている技術で急速にオンおよびオフを切り替えることで、これらの LED の輝度を制御できます。PWM 信号のデューティサイクルを変えることで、調光の錯覚を起こすことができます。
|
QMK は *パルス幅変調* (*Pulse Width Modulation*) すなわち PWM として知られている技術で、一定の比率で素早くオンおよびオフを切り替えることで、これらの LED の輝度を制御できます。PWM 信号のデューティサイクルを変えることで、調光の錯覚を起こすことができます。
|
||||||
|
|
||||||
MCU は、GPIO ピンにはそんなに電流を供給できません。MCU から直接バックライトに給電せずに、バックライトピンは LED への電力を切り替えるトランジスタあるいは MOSFET に接続されます。
|
MCU は、GPIO ピンにはそんなに電流を供給できません。MCU から直接バックライトに給電せずに、バックライトピンは LED への電力を切り替えるトランジスタあるいは MOSFET に接続されます。
|
||||||
|
|
||||||
## 機能の設定
|
|
||||||
|
|
||||||
ほとんどのキーボードではバックライトをサポートしている場合にデフォルトで有効になっていますが、もし機能しない場合は `rules.mk` が以下を含んでいることを確認してください:
|
ほとんどのキーボードではバックライトをサポートしている場合にデフォルトで有効になっていますが、もし機能しない場合は `rules.mk` が以下を含んでいることを確認してください:
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
BACKLIGHT_ENABLE = yes
|
BACKLIGHT_ENABLE = yes
|
||||||
```
|
```
|
||||||
|
|
||||||
## キーコード
|
## キーコード :id=keycodes
|
||||||
|
|
||||||
有効にすると、以下のキーコードを使ってバックライトレベルを変更することができます。
|
有効にすると、以下のキーコードを使ってバックライトレベルを変更することができます。
|
||||||
|
|
||||||
| キー | 説明 |
|
| キー | 説明 |
|
||||||
|---------|------------------------------------------|
|
| --------- | ------------------------------------ |
|
||||||
| `BL_TOGG` | バックライトをオンあるいはオフにする |
|
| `BL_TOGG` | バックライトをオンあるいはオフにする |
|
||||||
| `BL_STEP` | バックライトレベルを循環する |
|
| `BL_STEP` | バックライトレベルを循環する |
|
||||||
| `BL_ON` | バックライトを最大輝度に設定する |
|
| `BL_ON` | バックライトを最大輝度に設定する |
|
||||||
| `BL_OFF` | バックライトをオフにする |
|
| `BL_OFF` | バックライトをオフにする |
|
||||||
| `BL_INC` | バックライトレベルを上げる |
|
| `BL_INC` | バックライトレベルを上げる |
|
||||||
| `BL_DEC` | バックライトレベルを下げる |
|
| `BL_DEC` | バックライトレベルを下げる |
|
||||||
| `BL_BRTG` | バックライトの明滅動作を切り替える |
|
| `BL_BRTG` | バックライトの明滅動作を切り替える |
|
||||||
|
|
||||||
## バックライト関数群
|
## 関数群 :id=functions
|
||||||
|
|
||||||
| 関数 | 説明 |
|
次の関数を使って、カスタムコードでバックライトを変更することができます:
|
||||||
|----------|-----------------------------------------------------------|
|
|
||||||
| `backlight_toggle()` | バックライトをオンあるいはオフにする |
|
|
||||||
| `backlight_enable()` | バックライトをオンにする |
|
|
||||||
| `backlight_disable()` | バックライトをオフにする |
|
|
||||||
| `backlight_step()` | バックライトレベルを循環する |
|
|
||||||
| `backlight_increase()` | バックライトレベルを上げる |
|
|
||||||
| `backlight_decrease()` | バックライトレベルを下げる |
|
|
||||||
| `backlight_level(x)` | バックライトのレベルを特定のレベルに設定する |
|
|
||||||
| `get_backlight_level()` | 現在のバックライトレベルを返す |
|
|
||||||
| `is_backlight_enabled()` | バックライトが現在オンかどうかを返す |
|
|
||||||
|
|
||||||
### バックライトの明滅動作の関数群
|
| 関数 | 説明 |
|
||||||
|
| ------------------------ | -------------------------------------------- |
|
||||||
|
| `backlight_toggle()` | バックライトをオンあるいはオフにする |
|
||||||
|
| `backlight_enable()` | バックライトをオンにする |
|
||||||
|
| `backlight_disable()` | バックライトをオフにする |
|
||||||
|
| `backlight_step()` | バックライトレベルを循環する |
|
||||||
|
| `backlight_increase()` | バックライトレベルを上げる |
|
||||||
|
| `backlight_decrease()` | バックライトレベルを下げる |
|
||||||
|
| `backlight_level(x)` | バックライトのレベルを特定のレベルに設定する |
|
||||||
|
| `get_backlight_level()` | 現在のバックライトレベルを返す |
|
||||||
|
| `is_backlight_enabled()` | バックライトが現在オンかどうかを返す |
|
||||||
|
|
||||||
| 関数 | 説明 |
|
バックライトの明滅が有効の場合(以下を参照)、以下の関数も利用できます:
|
||||||
|----------|---------------------------------------------------|
|
|
||||||
| `breathing_toggle()` | バックライトの明滅動作をオンまたはオフにする |
|
|
||||||
| `breathing_enable()` | バックライトの明滅動作をオンにする |
|
|
||||||
| `breathing_disable()` | バックライトの明滅動作をオフにする |
|
|
||||||
|
|
||||||
## ドライバの設定
|
| 関数 | 説明 |
|
||||||
|
|-----------------------|----------------------------------------------|
|
||||||
|
| `breathing_toggle()` | バックライトの明滅動作をオンまたはオフにする |
|
||||||
|
| `breathing_enable()` | バックライトの明滅動作をオンにする |
|
||||||
|
| `breathing_disable()` | バックライトの明滅動作をオフにする |
|
||||||
|
|
||||||
|
## 設定 :id=configuration
|
||||||
|
|
||||||
どのドライバを使うかを選択するには、以下を使って `rules.mk` を設定します:
|
どのドライバを使うかを選択するには、以下を使って `rules.mk` を設定します:
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
BACKLIGHT_DRIVER = software # 有効なドライバの値は 'pwm,software,no' です
|
BACKLIGHT_DRIVER = software
|
||||||
```
|
```
|
||||||
|
|
||||||
各ドライバについてのヘルプは以下を見てください。
|
有効なドライバの値は `pwm`, `software`, `custom`, `no` です。各ドライバについてのヘルプは以下を見てください。
|
||||||
|
|
||||||
## 共通のドライバ設定
|
バックライトを設定するには、`config.h` の中で以下の `#define` をします:
|
||||||
|
|
||||||
バックライトの挙動を変更するには、`config.h` の中で以下の `#define` をします:
|
| 定義 | デフォルト | 説明 |
|
||||||
|
| --------------------- | ---------- | ------------------------------------------------------------------------------------------- |
|
||||||
| 定義 | デフォルト | 説明 |
|
| `BACKLIGHT_PIN` | *定義なし* | LED を制御するピン |
|
||||||
|---------------------|-------------|--------------------------------------------------------------------------------------|
|
| `BACKLIGHT_LEVELS` | `3` | 輝度のレベルの数 (オフを除いて最大 31) |
|
||||||
| `BACKLIGHT_LEVELS` | `3` | 輝度のレベルの数 (オフを除いて最大 31) |
|
|
||||||
| `BACKLIGHT_CAPS_LOCK` | *定義なし* | バックライトを使って Caps Lock のインジケータを有効にする (専用 LED の無いキーボードのため) |
|
| `BACKLIGHT_CAPS_LOCK` | *定義なし* | バックライトを使って Caps Lock のインジケータを有効にする (専用 LED の無いキーボードのため) |
|
||||||
| `BACKLIGHT_BREATHING` | *定義なし* | サポートされる場合は、バックライトの明滅動作を有効にする |
|
| `BACKLIGHT_BREATHING` | *定義なし* | サポートされる場合は、バックライトの明滅動作を有効にする |
|
||||||
| `BREATHING_PERIOD` | `6` | 各バックライトの "明滅" の長さ(秒) |
|
| `BREATHING_PERIOD` | `6` | 各バックライトの "明滅" の長さ(秒) |
|
||||||
| `BACKLIGHT_ON_STATE` | `0` | バックライトが "オン" の時のバックライトピンの状態 - high の場合は `1`、low の場合は `0` |
|
| `BACKLIGHT_ON_STATE` | `1` | バックライトが "オン" の時のバックライトピンの状態 - high の場合は `1`、low の場合は `0` |
|
||||||
|
|
||||||
### バックライトオン状態
|
独自のキーボードを設計しているわけではない限り、通常は `BACKLIGHT_PIN` または `BACKLIGHT_ON_STATE` を変更する必要はありません。
|
||||||
|
|
||||||
ほとんどのバックライトの回路は N チャンネルの MOSFET あるいは NPN トランジスタによって駆動されます。これは、トランジスタを*オン*にして LED を点灯させるには、ゲートまたはベースに接続されているバックライトピンを *high* に駆動する必要があることを意味します。
|
### バックライトオン状態 :id=backlight-on-state
|
||||||
|
|
||||||
|
ほとんどのバックライトの回路は N チャンネルの MOSFET あるいは NPN トランジスタによって駆動されます。これは、トランジスタを *オン* にして LED を点灯させるには、ゲートまたはベースに接続されているバックライトピンを *high* に駆動する必要があることを意味します。
|
||||||
ただし、P チャンネルの MOSFET あるいは PNP トランジスタが使われる場合があります。この場合、トランジスタがオンの時、ピンは代わりに *low* で駆動されます。
|
ただし、P チャンネルの MOSFET あるいは PNP トランジスタが使われる場合があります。この場合、トランジスタがオンの時、ピンは代わりに *low* で駆動されます。
|
||||||
|
|
||||||
この機能は `BACKLIGHT_ON_STATE` 定義することでキーボードレベルで設定されます。
|
この機能は `BACKLIGHT_ON_STATE` を定義することでキーボードレベルで設定されます。
|
||||||
|
|
||||||
## AVR ドライバ
|
### AVR ドライバ :id=avr-driver
|
||||||
|
|
||||||
|
`pwm` ドライバはデフォルトで設定されますが、`rules.mk` 内での同等の設定は以下の通りです:
|
||||||
|
|
||||||
AVR ボードでは、デフォルトのドライバは現在のところ最善のシナリオを選択するために構成を探っています。ドライバはデフォルトで設定されますが、rules.mk 内の同等の設定は以下の通りです:
|
|
||||||
```makefile
|
```makefile
|
||||||
BACKLIGHT_DRIVER = pwm
|
BACKLIGHT_DRIVER = pwm
|
||||||
```
|
```
|
||||||
|
|
||||||
### 注意事項
|
#### 注意事項 :id=avr-caveats
|
||||||
|
|
||||||
ハードウェア PWM は以下の表に従ってサポートされます:
|
AVR ボードでは、QMK はどのドライバを使うかを以下の表に従って自動的に決定します:
|
||||||
|
|
||||||
| バックライトピン | AT90USB64/128 | ATmega16/32U4 | ATmega16/32U2 | ATmega32A | ATmega328/P |
|
| バックライトピン | AT90USB64/128 | ATmega16/32U4 | ATmega16/32U2 | ATmega32A | ATmega328/P |
|
||||||
|-------------|-------------|-------------|-------------|---------|----------|
|
| ---------------- | ------------- | ------------- | ------------- | --------- | ----------- |
|
||||||
| `B1` | | | | | Timer 1 |
|
| `B1` | | | | | Timer 1 |
|
||||||
| `B2` | | | | | Timer 1 |
|
| `B2` | | | | | Timer 1 |
|
||||||
| `B5` | Timer 1 | Timer 1 | | | |
|
| `B5` | Timer 1 | Timer 1 | | | |
|
||||||
| `B6` | Timer 1 | Timer 1 | | | |
|
| `B6` | Timer 1 | Timer 1 | | | |
|
||||||
| `B7` | Timer 1 | Timer 1 | Timer 1 | | |
|
| `B7` | Timer 1 | Timer 1 | Timer 1 | | |
|
||||||
| `C4` | Timer 3 | | | | |
|
| `C4` | Timer 3 | | | | |
|
||||||
| `C5` | Timer 3 | | Timer 1 | | |
|
| `C5` | Timer 3 | | Timer 1 | | |
|
||||||
| `C6` | Timer 3 | Timer 3 | Timer 1 | | |
|
| `C6` | Timer 3 | Timer 3 | Timer 1 | | |
|
||||||
| `D4` | | | | Timer 1 | |
|
| `D4` | | | | Timer 1 | |
|
||||||
| `D5` | | | | Timer 1 | |
|
| `D5` | | | | Timer 1 | |
|
||||||
|
|
||||||
他の全てのピンはソフトウェア PWM を使います。[オーディオ](ja/feature_audio.md)機能が無効あるいは1つのタイマだけを使っている場合は、ハードウェアタイマによってバックライト PWM を引き起こすことができます:
|
他の全てのピンはタイマー支援ソフトウェア PWM を使います。
|
||||||
|
|
||||||
| オーディオピン | オーディオタイマ | ソフトウェア PWM タイマ |
|
| オーディオピン | オーディオタイマ | ソフトウェア PWM タイマ |
|
||||||
|---------|-----------|------------------|
|
| -------------- | ---------------- | ----------------------- |
|
||||||
| `C4` | Timer 3 | Timer 1 |
|
| `C4` | Timer 3 | Timer 1 |
|
||||||
| `C5` | Timer 3 | Timer 1 |
|
| `C5` | Timer 3 | Timer 1 |
|
||||||
| `C6` | Timer 3 | Timer 1 |
|
| `C6` | Timer 3 | Timer 1 |
|
||||||
| `B5` | Timer 1 | Timer 3 |
|
| `B5` | Timer 1 | Timer 3 |
|
||||||
| `B6` | Timer 1 | Timer 3 |
|
| `B6` | Timer 1 | Timer 3 |
|
||||||
| `B7` | Timer 1 | Timer 3 |
|
| `B7` | Timer 1 | Timer 3 |
|
||||||
|
|
||||||
両方のタイマーがオーディオのために使われている場合、バックライト PWM はハードウェアタイマを使いませんが、代わりにマトリックススキャンの間に引き起こされます。この場合、PWM の計算は十分なタイミングの精度で呼ばれないかもしれないため、バックライトの明滅はサポートされず、バックライトもちらつくかもしれません。
|
両方のタイマーがオーディオのために使われている場合、バックライト PWM はハードウェアタイマを使うことができず、代わりにマトリックススキャンの間に引き起こされます。この場合、PWM の計算は十分なタイミングの精度で呼ばれない可能性があるため、バックライトの明滅はサポートされず、バックライトもちらつくかもしれません。
|
||||||
|
|
||||||
### AVR 設定
|
#### ハードウェア PWM 実装 :id=hardware-pwm-implementation
|
||||||
|
|
||||||
バックライトの挙動を変更するには、`config.h` の中で以下の `#define` をします:
|
|
||||||
|
|
||||||
| 定義 | デフォルト | 説明 |
|
|
||||||
|---------------------|-------------|--------------------------------------------------------------------------------------------------------------|
|
|
||||||
| `BACKLIGHT_PIN` | `B7` | LED を制御するピン。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
|
|
||||||
| `BACKLIGHT_PINS` | *定義なし* | 実験的: 詳細は以下を見てください |
|
|
||||||
| `BACKLIGHT_LEVELS` | `3` | 輝度のレベルの数 (オフを除いて最大 31) |
|
|
||||||
| `BACKLIGHT_CAPS_LOCK` | *定義なし* | バックライトを使って Caps Lock のインジケータを有効にする (専用 LED の無いキーボードのため) |
|
|
||||||
| `BACKLIGHT_BREATHING` | *定義なし* | サポートされる場合は、バックライトの明滅動作を有効にする |
|
|
||||||
| `BREATHING_PERIOD` | `6` | 各バックライトの "明滅" の長さ(秒) |
|
|
||||||
| `BACKLIGHT_ON_STATE` | `1` | バックライトが "オン" の時のバックライトピンの状態 - high の場合は `1`、low の場合は `0` |
|
|
||||||
|
|
||||||
### バックライトオン状態
|
|
||||||
|
|
||||||
ほとんどのバックライトの回路は N チャンネルの MOSFET あるいは NPN トランジスタによって駆動されます。これは、トランジスタを*オン*にして LED を点灯させるには、ゲートまたはベースに接続されているバックライトピンを *high* に駆動する必要があることを意味します。
|
|
||||||
ただし、P チャンネルの MOSFET あるいは PNP トランジスタが使われる場合があります。この場合、トランジスタがオンの時、ピンは代わりに *low* で駆動されます。
|
|
||||||
|
|
||||||
この機能は `BACKLIGHT_ON_STATE` 定義することでキーボードレベルで設定されます。
|
|
||||||
|
|
||||||
### 複数のバックライトピン
|
|
||||||
|
|
||||||
ほとんどのキーボードは、全てのバックライト LED を制御するたった1つのバックライトピンを持ちます (特にバックライトがハードウェア PWM ピンに接続されている場合)。
|
|
||||||
ソフトウェア PWM では、複数のバックライトピンを定義することができます。これらすべてのピンは PWM デューティサイクル時に同時にオンおよびオフになります。
|
|
||||||
この機能により、例えば Caps Lock LED (またはその他の制御可能な LED) の輝度を、バックライトの他の LED と同じレベルに設定することができます。Caps Lock の代わりに LCTRL をマップしていて、Caps Lock がオンの時に Caps Lock LED をアクティブにする代わりにバックライトの一部にする必要がある場合に便利です。
|
|
||||||
|
|
||||||
複数のバックライトピンをアクティブにするには、`config.h` に次のようなものを追加する必要があります:
|
|
||||||
|
|
||||||
```c
|
|
||||||
#define BACKLIGHT_LED_COUNT 2
|
|
||||||
#undef BACKLIGHT_PIN
|
|
||||||
#define BACKLIGHT_PINS { F5, B2 }
|
|
||||||
```
|
|
||||||
|
|
||||||
### ハードウェア PWM 実装
|
|
||||||
|
|
||||||
バックライト用にサポートされているピンを使う場合、QMK は PWM 信号を出力するように設定されたハードウェアタイマを使います。タイマーは 0 にリセットする前に `ICRx` (デフォルトでは `0xFFFF`) までカウントします。
|
バックライト用にサポートされているピンを使う場合、QMK は PWM 信号を出力するように設定されたハードウェアタイマを使います。タイマーは 0 にリセットする前に `ICRx` (デフォルトでは `0xFFFF`) までカウントします。
|
||||||
希望の輝度が計算され、`OCRxx` レジスタ内に格納されます。カウンタがこの値まで達すると、バックライトピンは low になり、カウンタがリセットされると再び high になります。
|
希望の輝度が計算され、`OCRxx` レジスタに格納されます。カウンタがこの値まで達すると、バックライトピンは low になり、カウンタがリセットされると再び high になります。
|
||||||
このように `OCRxx` は基本的に LED のデューティサイクル、従って輝度を制御します。`0x0000` は完全にオフで、 `0xFFFF` は完全にオンです。
|
このように `OCRxx` は基本的に LED のデューティサイクル、従って輝度を制御します。`0x0000` は完全にオフで、 `0xFFFF` は完全にオンです。
|
||||||
|
|
||||||
明滅動作の効果はカウンタがリセットされる(秒間あたりおよそ244回)たびに呼び出される `TIMER1_OVF_vect` の割り込みハンドラを登録することで可能になります。
|
明滅動作の効果はカウンタがリセットされる(秒間あたりおよそ244回)たびに呼び出される `TIMER1_OVF_vect` の割り込みハンドラを登録することで可能になります。
|
||||||
このハンドラ内で、増分カウンタの値が事前に計算された輝度曲線にマップされます。明滅動作をオフにするには、割り込みを単純に禁止し、輝度を EEPROM に格納されているレベルに再設定します。
|
このハンドラで、増分カウンタの値が事前に計算された輝度曲線にマップされます。明滅動作をオフにするには、割り込みを単純に禁止し、輝度を EEPROM に格納されているレベルに再設定します。
|
||||||
|
|
||||||
### タイマーにアシストされた PWM 実装
|
#### タイマー支援 PWM 実装 :id=timer-assisted-implementation
|
||||||
|
|
||||||
`BACKLIGHT_PIN` がハードウェアバックライトピンに設定されていない場合、QMK はソフトウェア割り込みを引き起こすように設定されているハードウェアタイマを使います。タイマーは 0 にリセットする前に `ICRx` (デフォルトでは `0xFFFF`) までカウントします。
|
`BACKLIGHT_PIN` がハードウェアバックライトピンに設定されていない場合、QMK はソフトウェア割り込みを引き起こすように設定されているハードウェアタイマを使います。タイマーは 0 にリセットする前に `ICRx` (デフォルトでは `0xFFFF`) までカウントします。
|
||||||
0 に再設定すると、CPU は LED をオンにする OVF (オーバーフロー)割り込みを発火し、デューティサイクルを開始します。
|
0 に再設定すると、CPU は LED をオンにする OVF (オーバーフロー)割り込みを発火し、デューティサイクルを開始します。
|
||||||
希望の輝度が計算され、`OCRxx` レジスタ内に格納されます。カウンタがこの値に達すると、CPU は比較出力一致割り込みを発火し、LED をオフにします。
|
希望の輝度が計算され、`OCRxx` レジスタに格納されます。カウンタがこの値に達すると、CPU は比較出力一致割り込みを発火し、LED をオフにします。
|
||||||
このように `OCRxx` は基本的に LED のデューティサイクル、従って輝度を制御します。 `0x0000` は完全にオフで、 `0xFFFF` は完全にオンです。
|
このように `OCRxx` は基本的に LED のデューティサイクル、従って輝度を制御します。 `0x0000` は完全にオフで、 `0xFFFF` は完全にオンです。
|
||||||
|
|
||||||
明滅の効果はハードウェア PWM 実装と同じです。
|
明滅の効果はハードウェア PWM 実装と同じです。
|
||||||
|
|
||||||
## ARM ドライバ
|
### ARM ドライバ :id=arm-configuration
|
||||||
|
|
||||||
|
まだ初期段階ですが、ARM バックライトサポートは最終的に AVR と同等の機能を持つことを目指しています。`pwm` ドライバはデフォルトで設定されますが、`rules.mk` 内での同等の設定は以下の通りです:
|
||||||
|
|
||||||
まだ初期段階ですが、ARM バックライトサポートは最終的に AVR と同等の機能を持つことを目指しています。ドライバはデフォルトで設定されますが、rules.mk 内の同等の設定は以下の通りです:
|
|
||||||
```makefile
|
```makefile
|
||||||
BACKLIGHT_DRIVER = pwm
|
BACKLIGHT_DRIVER = pwm
|
||||||
```
|
```
|
||||||
|
|
||||||
### 注意事項
|
#### ChibiOS の設定 :id=arm-configuration
|
||||||
|
|
||||||
現在のところ、ハードウェア PWM のみがサポートされ、タイマーはアシストされず、自動設定は提供されません。
|
以下の `#define` は ARM ベースのキーボードにのみ適用されます:
|
||||||
|
|
||||||
?> STMF072 のバックライトサポートのテストは制限されています。人によって違うかもしれません。不明な場合は、rules.mk で `BACKLIGHT_ENABLE = no` を設定します。
|
| 定義 | デフォルト | 説明 |
|
||||||
|
| ----------------------- | ---------- | ----------------------- |
|
||||||
|
| `BACKLIGHT_PWM_DRIVER` | `PWMD4` | 使用する PWM ドライバ |
|
||||||
|
| `BACKLIGHT_PWM_CHANNEL` | `3` | 使用する PWM チャンネル |
|
||||||
|
| `BACKLIGHT_PAL_MODE` | `2` | 使用するピン代替関数 |
|
||||||
|
|
||||||
### ARM 設定
|
これらの値を決定するには、特定の MCU の ST データシートを参照してください。独自のキーボードを設計しているわけではない場合、通常はこれらを変更する必要はありません。
|
||||||
|
|
||||||
バックライトの挙動を変更するには、`config.h` の中で以下の `#define` をします:
|
#### 注意事項 :id=arm-caveats
|
||||||
|
|
||||||
| 定義 | デフォルト | 説明 |
|
現在のところ、ハードウェア PWM のみがサポートされ、タイマー支援はなく、自動設定は提供されません。
|
||||||
|------------------------|-------------|-------------------------------------------------------------------------------------------------------------|
|
|
||||||
| `BACKLIGHT_PIN` | `B7` | LED を制御するピン。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
|
|
||||||
| `BACKLIGHT_PWM_DRIVER` | `PWMD4` | 使用する PWM ドライバ。ピンから PWM タイマへのマッピングについては、ST データシートを見てください。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
|
|
||||||
| `BACKLIGHT_PWM_CHANNEL` | `3` | 使用する PWM チャンネル。ピンから PWM チャンネルへのマッピングについては、ST データシートを見てください。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
|
|
||||||
| `BACKLIGHT_PAL_MODE` | `2` | 使用するピンの代替機能。ピンの AF マッピングについては ST データシートを見てください。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
|
|
||||||
|
|
||||||
## Software PWM Driver :id=software-pwm-driver
|
?> STM32F072 のバックライトサポートのテストは制限されています。人によって違うかもしれません。不明な場合は、`rules.mk` で `BACKLIGHT_ENABLE = no` を設定します。
|
||||||
|
|
||||||
|
### ソフトウェア PWM ドライバ :id=software-pwm-driver
|
||||||
|
|
||||||
|
このモードでは、他のキーボードのタスクを実行中に PWM は「エミュレート」されます。追加のプラットフォーム設定なしで最大のハードウェア互換性を提供します。トレードオフは、キーボードが忙しい時にバックライトが揺れる可能性があることです。有効にするには、`rules.mk` に以下を追加します:
|
||||||
|
|
||||||
他のキーボードのタスクを実行中に PWM をエミュレートすることにより、追加のプラットフォーム設定なしで最大のハードウェア互換性を提供します。トレードオフは、キーボードが忙しい時にバックライトが揺れる可能性があることです。有効にするには、rules.mk に以下を追加します:
|
|
||||||
```makefile
|
```makefile
|
||||||
BACKLIGHT_DRIVER = software
|
BACKLIGHT_DRIVER = software
|
||||||
```
|
```
|
||||||
|
|
||||||
### ソフトウェア PWM 設定
|
#### 複数のバックライトピン :id=multiple-backlight-pins
|
||||||
|
|
||||||
バックライトの挙動を変更するには、`config.h` の中で以下の `#define` をします:
|
|
||||||
|
|
||||||
| 定義 | デフォルト | 説明 |
|
|
||||||
|-----------------|-------------|-------------------------------------------------------------------------------------------------------------|
|
|
||||||
| `BACKLIGHT_PIN` | `B7` | LED を制御するピン。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
|
|
||||||
| `BACKLIGHT_PINS` | *定義なし* | 実験的: 詳細は以下を見てください |
|
|
||||||
|
|
||||||
### 複数のバックライトピン
|
|
||||||
|
|
||||||
ほとんどのキーボードは、全てのバックライト LED を制御するたった1つのバックライトピンを持ちます (特にバックライトがハードウェア PWM ピンに接続されている場合)。
|
ほとんどのキーボードは、全てのバックライト LED を制御するたった1つのバックライトピンを持ちます (特にバックライトがハードウェア PWM ピンに接続されている場合)。
|
||||||
ソフトウェア PWM では、複数のバックライトピンを定義することができます。これらすべてのピンは PWM デューティサイクル時に同時にオンおよびオフになります。
|
ソフトウェア PWM では、複数のバックライトピンを定義することができます。これらのピンは PWM デューティサイクル時に同時にオンおよびオフになります。
|
||||||
この機能により、例えば Caps Lock LED (またはその他の制御可能な LED) の輝度を、バックライトの他の LED と同じレベルに設定することができます。Caps Lock の代わりに LCTRL をマップしていて、Caps Lock がオンの時に Caps Lock LED をアクティブにする代わりにバックライトの一部にする必要がある場合に便利です。
|
|
||||||
|
|
||||||
複数のバックライトピンをアクティブにするには、`config.h` に次のようなものを追加する必要があります:
|
この機能により、例えば Caps Lock LED (またはその他の制御可能な LED) の輝度を、バックライトの他の LED と同じレベルに設定することができます。Caps Lock LED は通常バックライトとは別のピンに配線されるため、Caps Lock の代わりに Control をマップしていて、Caps Lock がオンの時に Caps Lock LED ではなくバックライトの一部をアクティブにする必要がある場合に便利です。
|
||||||
|
|
||||||
|
複数のバックライトピンをアクティブにするには、`config.h` に `BACKLIGHT_PIN` の代わりに次のようなものを追加します:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#undef BACKLIGHT_PIN
|
|
||||||
#define BACKLIGHT_PINS { F5, B2 }
|
#define BACKLIGHT_PINS { F5, B2 }
|
||||||
```
|
```
|
||||||
|
|
||||||
## カスタムドライバ
|
### カスタムドライバ :id=custom-driver
|
||||||
|
|
||||||
有効にするには、rules.mk に以下を追加します:
|
上記ドライバのいずれもキーボードに適用されていない場合(例えば、バックライトを制御するのに別の IC を使用している場合)、QMK が提供しているこの簡単な API を使ってカスタムバックライトドライバを実装することができます。有効にするには、`rules.mk` に以下を追加します:
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
BACKLIGHT_DRIVER = custom
|
BACKLIGHT_DRIVER = custom
|
||||||
```
|
```
|
||||||
|
|
||||||
カスタムドライバ API を実装する場合、提供されるキーボードフックは以下の通りです:
|
それから次のフックのいずれかを実装します:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
void backlight_init_ports(void) {
|
void backlight_init_ports(void) {
|
||||||
// オプション - 起動時に実行されます
|
// オプション - 起動時に実行されます
|
||||||
// - 通常、ここでピンを設定します
|
// 通常、ここでピンを設定します
|
||||||
}
|
}
|
||||||
void backlight_set(uint8_t level) {
|
void backlight_set(uint8_t level) {
|
||||||
// オプション - レベルの変更時に実行されます
|
// オプション - レベルの変更時に実行されます
|
||||||
// - 通常、ここで新しい値に応答します
|
// 通常、ここで新しい値に応答します
|
||||||
}
|
}
|
||||||
|
|
||||||
void backlight_task(void) {
|
void backlight_task(void) {
|
||||||
// オプション - 定期的に実行されます
|
// オプション - 定期的に実行されます
|
||||||
// - ここで長時間実行されるアクションはパフォーマンスの問題を引き起こします
|
// これはメインキーボードループで呼び出されることに注意してください
|
||||||
|
// そのため、ここで長時間実行されるアクションはパフォーマンスの問題を引き起こします
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 回路図の例
|
||||||
|
|
||||||
|
この一般的な例では、バックライト LED は全て N チャンネル MOSFET に向かって並列に接続されています。そのゲートピンは、リンギングを回避するため 470Ωの抵抗を介してマイクロコントローラの GPIO ピンの1つに接続されています。
|
||||||
|
プルダウン抵抗もゲートピンとグランドの間に配置されており、MCU によって駆動されていない場合にプルダウン抵抗を定義された状態に保ちます。
|
||||||
|
これらの抵抗値は重要ではありません。詳細については、[this Electronics StackExchange question](https://electronics.stackexchange.com/q/68748) を参照してください。
|
||||||
|
|
||||||
|

|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# デバウンスアルゴリズム
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.19:docs/feature_debounce_type.md
|
||||||
|
git diff 0.9.19 HEAD -- docs/feature_debounce_type.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
QMK はデバウンス API を介して複数のデバウンスアルゴリズムをサポートします。
|
||||||
|
|
||||||
|
どのデバウンスメソッドが呼ばれるかのロジックは下記のとおりです。rules.mk で設定された様々な定義をチェックします。
|
||||||
|
|
||||||
|
```
|
||||||
|
DEBOUNCE_DIR:= $(QUANTUM_DIR)/debounce
|
||||||
|
DEBOUNCE_TYPE?= sym_g
|
||||||
|
ifneq ($(strip $(DEBOUNCE_TYPE)), custom)
|
||||||
|
QUANTUM_SRC += $(DEBOUNCE_DIR)/$(strip $(DEBOUNCE_TYPE)).c
|
||||||
|
endif
|
||||||
|
```
|
||||||
|
|
||||||
|
# デバウンスの選択
|
||||||
|
|
||||||
|
| DEBOUNCE_TYPE | 説明 | 他に必要なもの |
|
||||||
|
| ------------- | --------------------------------------------------- | ----------------------------- |
|
||||||
|
| 未定義 | デフォルトのアルゴリズム、現在のところ sym_g を使います | 無し |
|
||||||
|
| custom | 独自のデバウンスコードを使います | ```SRC += debounce.c``` で独自の debounce.c を追加し、必要な関数を実装します |
|
||||||
|
| anything_else | quantum/debounce/* から他のアルゴリズムを使います | 無し |
|
||||||
|
|
||||||
|
**分割キーボードについて**:
|
||||||
|
デバウンスコードは分割キーボードと互換性があります。
|
||||||
|
|
||||||
|
# 独自のデバウンスコードの使用
|
||||||
|
* ```DEBOUNCE_TYPE = custom``` を設定します。
|
||||||
|
* ```SRC += debounce.c``` を追加します。
|
||||||
|
* 独自の ```debounce.c``` を追加します。例については、```quantum/debounce``` にある現在の実装をみてください。
|
||||||
|
* 毎回のマトリクススキャンの結果はその度デバウンスによって処理されます。
|
||||||
|
* MATRIX_ROWS ではなく num_rows を使って、分割キーボードが正しくサポートされるようにします。
|
||||||
|
|
||||||
|
# インクルードされているデバウンスメソッド間での切り替え
|
||||||
|
独自の debounce.c をインクルードすることで独自のコードを使うか、またはインクルードされている他のコードに切り替えることができます。
|
||||||
|
含まれるデバウンスメソッドは以下の通りです:
|
||||||
|
* eager_pr - 行ごとにデバウンスします。状態が変化すると、応答は即座に行われ、その後その行は ```DEBOUNCE``` ミリ秒の間入力されません。
|
||||||
|
```NUM_KEYS``` の 8ビットカウンタの更新に高い計算コストがかかる、もしくは低スキャンレートのキーボード用で、各指は通常一度に1行しか叩かないようになっています。これは ErgoDox モデルに適しています; マトリックスは90度回転しているため、その「行」は実際には「列」であり、通常の使用では各指は一度に1つの「行」にしか当たりません。
|
||||||
|
* eager_pk - キーごとにデバウンスします。状態が変化すると、応答は即座に行われ、その後そのキーは ```DEBOUNCE``` ミリ秒の間入力されません。
|
||||||
|
* sym_g - キーボードごとにデバウンスします。状態が変化すると、グローバルタイマが設定されます。```DEBOUNCE``` ミリ秒の間何も変化がなければ、全ての入力の変更がプッシュされます。
|
||||||
|
* sym_pk - キーごとにデバウンスします。状態が変化すると、キーごとのタイマーが設定されます。```DEBOUNCE``` ミリ秒の間そのキーに変化がなければ、キーの状態の変更がプッシュされます。
|
||||||
|
|
||||||
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
# DIP スイッチ
|
# DIP スイッチ
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.8.94:docs/feature_dip_switch.md
|
original document: 0.9.43:docs/feature_dip_switch.md
|
||||||
git diff 0.8.94 HEAD -- docs/feature_dip_switch.md | cat
|
git diff 0.9.43 HEAD -- docs/feature_dip_switch.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
DIP スイッチは、以下を `rules.mk` に追加することでサポートされます:
|
DIP スイッチは、以下を `rules.mk` に追加することでサポートされます:
|
||||||
@@ -12,9 +12,17 @@ DIP スイッチは、以下を `rules.mk` に追加することでサポート
|
|||||||
さらに、以下を `config.h` に追加します:
|
さらに、以下を `config.h` に追加します:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
|
// Connects each switch in the dip switch to the GPIO pin of the MCU
|
||||||
#define DIP_SWITCH_PINS { B14, A15, A10, B9 }
|
#define DIP_SWITCH_PINS { B14, A15, A10, B9 }
|
||||||
```
|
```
|
||||||
|
|
||||||
|
あるいは
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Connect each switch in the DIP switch to an unused intersections in the key matrix.
|
||||||
|
#define DIP_SWITCH_MATRIX_GRID { {0,6}, {1,6}, {2,6} } // List of row and col pairs
|
||||||
|
```
|
||||||
|
|
||||||
## コールバック
|
## コールバック
|
||||||
|
|
||||||
コールバック関数を `<keyboard>.c` に記述することができます:
|
コールバック関数を `<keyboard>.c` に記述することができます:
|
||||||
@@ -92,4 +100,10 @@ void dip_switch_update_mask_user(uint32_t state) {
|
|||||||
|
|
||||||
## ハードウェア
|
## ハードウェア
|
||||||
|
|
||||||
|
### DIP スイッチの各スイッチを MCU の GPIO ピンに接続する
|
||||||
|
|
||||||
DIP スイッチの片側は MCU のピンへ直接配線し、もう一方の側はグラウンドに配線する必要があります。機能的に同じであるため、どちら側がどちらに接続されているかは問題にはならないはずです。
|
DIP スイッチの片側は MCU のピンへ直接配線し、もう一方の側はグラウンドに配線する必要があります。機能的に同じであるため、どちら側がどちらに接続されているかは問題にはならないはずです。
|
||||||
|
|
||||||
|
### DIP スイッチの各スイッチをキーマトリクスの未使用の交点に接続する
|
||||||
|
|
||||||
|
キースイッチと同じように、ダイオードと DIP スイッチが ROW 線と COL 線に接続します。
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
# 動的マクロ: ランタイムでのマクロの記録および再生
|
# 動的マクロ: ランタイムでのマクロの記録および再生
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.8.123:docs/feature_dynamic_macros.md
|
original document: 0.9.43:docs/feature_dynamic_macros.md
|
||||||
git diff 0.8.123 HEAD -- docs/feature_dynamic_macros.md | cat
|
git diff 0.9.43 HEAD -- docs/feature_dynamic_macros.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
QMK はその場で作られた一時的なマクロをサポートします。これらを動的マクロと呼びます。それらはユーザがキーボードから定義し、キーボードのプラグを抜くか再起動すると失われます。
|
QMK はその場で作られた一時的なマクロをサポートします。これらを動的マクロと呼びます。それらはユーザがキーボードから定義し、キーボードのプラグを抜くか再起動すると失われます。
|
||||||
@@ -23,7 +23,7 @@ QMK はその場で作られた一時的なマクロをサポートします。
|
|||||||
|
|
||||||
マクロの記録を開始するには、`DYN_REC_START1` または `DYN_REC_START2` のどちらかを押します。
|
マクロの記録を開始するには、`DYN_REC_START1` または `DYN_REC_START2` のどちらかを押します。
|
||||||
|
|
||||||
記録を終了するには、`DYN_REC_STOP` レイヤーボタンを押します。
|
記録を終了するには、`DYN_REC_STOP` レイヤーボタンを押します。`DYN_REC_START1` または `DYN_REC_START2` をもう一度押すことでも記録を終了することができます。
|
||||||
|
|
||||||
マクロを再生するには、`DYN_MACRO_PLAY1` あるいは `DYN_MACRO_PLAY2` のどちらかを押します。
|
マクロを再生するには、`DYN_MACRO_PLAY1` あるいは `DYN_MACRO_PLAY2` のどちらかを押します。
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# エンコーダ
|
# エンコーダ
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.8.123:docs/feature_encoders.md
|
original document: 0.9.43:docs/feature_encoders.md
|
||||||
git diff 0.8.123 HEAD -- docs/feature_encoders.md | cat
|
git diff 0.9.43 HEAD -- docs/feature_encoders.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
以下を `rules.mk` に追加することで基本的なエンコーダがサポートされます:
|
以下を `rules.mk` に追加することで基本的なエンコーダがサポートされます:
|
||||||
@@ -31,7 +31,7 @@ ENCODER_ENABLE = yes
|
|||||||
#define ENCODER_DIRECTION_FLIP
|
#define ENCODER_DIRECTION_FLIP
|
||||||
```
|
```
|
||||||
|
|
||||||
さらに、解像度を同じファイルで指定することができます (デフォルトかつお勧めは4):
|
さらに、エンコーダが各戻り止め(デテント)間に登録するパルス数を定義する解像度は、次のように定義できます:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define ENCODER_RESOLUTION 4
|
#define ENCODER_RESOLUTION 4
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
# HD44780 LCD ディスプレイ
|
# HD44780 LCD ディスプレイ
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.8.123:docs/feature_hd44780.md
|
original document: 0.9.43:docs/feature_hd44780.md
|
||||||
git diff 0.8.123 HEAD -- docs/feature_hd44780.md | cat
|
git diff 0.9.43 HEAD -- docs/feature_hd44780.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
これは Peter Fleury の LCD ライブラリの統合です。このページは基本について説明します。[詳細なドキュメントについてはこのページをご覧ください](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html) (訳注)原文のリンク先のページは、サービスの終了に伴って削除されています。移行先は (http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html) と思われます。
|
これは Peter Fleury の LCD ライブラリの統合です。このページは基本について説明します。[詳細なドキュメントについてはこのページをご覧ください](http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
|
||||||
|
|
||||||
HD44780 ディスプレイのサポートを有効にするには、キーボードの `rules.mk` の `HD44780_ENABLE` フラグを yes に設定します。
|
HD44780 ディスプレイのサポートを有効にするには、キーボードの `rules.mk` の `HD44780_ENABLE` フラグを yes に設定します。
|
||||||
|
|
||||||
@@ -59,4 +59,4 @@ LCD_DISP_ON_CURSOR_BLINK : ディスプレイオン、点滅カーソル
|
|||||||
|
|
||||||
ディスプレイに何かを表示するには、最初に `lcd_gotoxy(column, line)` を呼びます。最初の行の先頭に移動するには、`lcd_gotoxy(0, 0)` を呼び出し、その後 `lcd_puts("example string")` を使って文字列を出力します。
|
ディスプレイに何かを表示するには、最初に `lcd_gotoxy(column, line)` を呼びます。最初の行の先頭に移動するには、`lcd_gotoxy(0, 0)` を呼び出し、その後 `lcd_puts("example string")` を使って文字列を出力します。
|
||||||
|
|
||||||
ディスプレイを制御することができる、より多くのメソッドがあります。[詳細なドキュメントについてはリンクされたページをご覧ください](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html) (訳注)原文のリンク先のページは、サービスの終了に伴って削除されています。移行先は (http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html) と思われます。
|
ディスプレイを制御することができる、より多くのメソッドがあります。[詳細なドキュメントについてはリンクされたページをご覧ください](http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
|
||||||
+33
-33
@@ -1,8 +1,8 @@
|
|||||||
# レイヤー :id=layers
|
# レイヤー :id=layers
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.9.20:docs/feature_layers.md
|
original document: 0.9.43:docs/feature_layers.md
|
||||||
git diff 0.9.20 HEAD -- docs/feature_layers.md | cat
|
git diff 0.9.43 HEAD -- docs/feature_layers.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
QMK ファームウェアの最も強力で良く使われている機能の一つは、レイヤーを使う機能です。ほとんどの人にとって、これはラップトップやタブレットキーボードにあるのと同じように、様々なキーを可能にするファンクションキーに相当します。
|
QMK ファームウェアの最も強力で良く使われている機能の一つは、レイヤーを使う機能です。ほとんどの人にとって、これはラップトップやタブレットキーボードにあるのと同じように、様々なキーを可能にするファンクションキーに相当します。
|
||||||
@@ -58,42 +58,42 @@ QMK を使い始めたばかりの場合は、全てを単純にしたいでし
|
|||||||
|
|
||||||
レイヤーの使用あるいは操作に関係する多くの関数(と変数)があります。
|
レイヤーの使用あるいは操作に関係する多くの関数(と変数)があります。
|
||||||
|
|
||||||
| 関数 | 説明 |
|
| 関数 | 説明 |
|
||||||
|----------------------------------------------|---------------------------------------------------------------------------------------------------------|
|
| -------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
||||||
| `layer_state_set(layer_mask)` | 直接レイヤーの状態を設定する (推奨。何をしているのか分かっていない場合は使わないでください)。 |
|
| `layer_state_set(layer_mask)` | 直接レイヤーの状態を設定する (推奨。何をしているのか分かっていない場合は使わないでください)。 |
|
||||||
| `layer_clear()` | 全てのレイヤーを消去する (全てをオフにします)。 |
|
| `layer_clear()` | 全てのレイヤーを消去する (全てをオフにします)。 |
|
||||||
| `layer_move(layer)` | 指定されたレイヤーをオンにし、それ以外をオフにする。 |
|
| `layer_move(layer)` | 指定されたレイヤーをオンにし、それ以外をオフにする。 |
|
||||||
| `layer_on(layer)` | 指定されたレイヤーをオンにし、それ以外を既存の状態のままにする。 |
|
| `layer_on(layer)` | 指定されたレイヤーをオンにし、それ以外を既存の状態のままにする。 |
|
||||||
| `layer_off(layer)` | 指定されたレイヤーをオフにし、それ以外を既存の状態のままにする。 |
|
| `layer_off(layer)` | 指定されたレイヤーをオフにし、それ以外を既存の状態のままにする。 |
|
||||||
| `layer_invert(layer)` | 指定されたレイヤーの状態を反転/トグルする。 |
|
| `layer_invert(layer)` | 指定されたレイヤーの状態を反転/トグルする。 |
|
||||||
| `layer_or(layer_mask)` | 指定されたレイヤーと既存のレイヤー状態の間で一致するビットに基づいてレイヤーをオンにする。 |
|
| `layer_or(layer_mask)` | 指定されたレイヤーと既存のレイヤー状態の間で一致するビットに基づいてレイヤーをオンにする。 |
|
||||||
| `layer_and(layer_mask)` | 指定されたレイヤーと既存のレイヤー状態の間で有効なビットに基づいてレイヤーをオンにする。 |
|
| `layer_and(layer_mask)` | 指定されたレイヤーと既存のレイヤー状態の間で有効なビットに基づいてレイヤーをオンにする。 |
|
||||||
| `layer_xor(layer_mask)` | 指定されたレイヤーと既存のレイヤー状態の間で一致しないビットに基づいてレイヤーをオンにする。 |
|
| `layer_xor(layer_mask)` | 指定されたレイヤーと既存のレイヤー状態の間で一致しないビットに基づいてレイヤーをオンにする。 |
|
||||||
| `layer_debug(layer_mask)` | デバッガのコンソールに現在のビットマスクと最も高いレイヤーを出力する。 |
|
| `layer_debug(layer_mask)` | デバッガのコンソールに現在のビットマスクと最も高いレイヤーを出力する。 |
|
||||||
| `default_layer_set(layer_mask)` | 直接デフォルトレイヤーの状態を設定する (推奨。何をしているのか分かっていない場合は使わないでください)。 |
|
| `default_layer_set(layer_mask)` | 直接デフォルトレイヤーの状態を設定する (推奨。何をしているのか分かっていない場合は使わないでください)。 |
|
||||||
| `default_layer_or(layer_mask)` | 指定されたレイヤーと既存のデフォルトレイヤー状態の間で一致するビットに基づいてレイヤーをオンにする。 |
|
| `default_layer_or(layer_mask)` | 指定されたレイヤーと既存のデフォルトレイヤー状態の間で一致するビットに基づいてレイヤーをオンにする。 |
|
||||||
| `default_layer_and(layer_mask)` | 指定されたレイヤーと既存のデフォルトレイヤー状態の間で一致する有効なビットに基づいてレイヤーをオンにする。 |
|
| `default_layer_and(layer_mask)` | 指定されたレイヤーと既存のデフォルトレイヤー状態の間で一致する有効なビットに基づいてレイヤーをオンにする。 |
|
||||||
| `default_layer_xor(layer_mask)` | 指定されたレイヤーと既存のデフォルトレイヤー状態の間で一致しないビットに基づいてレイヤーをオンにする。 |
|
| `default_layer_xor(layer_mask)` | 指定されたレイヤーと既存のデフォルトレイヤー状態の間で一致しないビットに基づいてレイヤーをオンにする。 |
|
||||||
| `default_layer_debug(layer_mask)` | デバッガのコンソールに現在のビットマスクと最も高いアクティブなレイヤーを出力する。 |
|
| `default_layer_debug(layer_mask)` | デバッガのコンソールに現在のビットマスクと最も高いアクティブなレイヤーを出力する。 |
|
||||||
| [`set_single_persistent_default_layer(layer)`](ja/ref_functions.md#setting-the-persistent-default-layer) | デフォルトレイヤーを設定し、それを永続化メモリ (EEPROM) に書き込む。 |
|
| [`set_single_persistent_default_layer(layer)`](ja/ref_functions.md#setting-the-persistent-default-layer) | デフォルトレイヤーを設定し、それを永続化メモリ (EEPROM) に書き込む。 |
|
||||||
| [`update_tri_layer(x, y, z)`](ja/ref_functions.md#update_tri_layerx-y-z) | レイヤー `x` と `y` の両方がオンであるかを調べ、それに基づいて `z` を設定する(両方がオンの場合オン、そうでなければオフ)。 |
|
| [`update_tri_layer(x, y, z)`](ja/ref_functions.md#update_tri_layerx-y-z) | レイヤー `x` と `y` の両方がオンであるかを調べ、それに基づいて `z` を設定する(両方がオンの場合オン、そうでなければオフ)。 |
|
||||||
| [`update_tri_layer_state(state, x, y, z)`](ja/ref_functions.md#update_tri_layer_statestate-x-y-z) | `update_tri_layer(x, y, z)` と同じことをするが、`layer_state_set_*` 関数から呼ばれる。 |
|
| [`update_tri_layer_state(state, x, y, z)`](ja/ref_functions.md#update_tri_layer_statestate-x-y-z) | `update_tri_layer(x, y, z)` と同じことをするが、`layer_state_set_*` 関数から呼ばれる。 |
|
||||||
|
|
||||||
|
|
||||||
呼び出すことができる関数に加えて、レイヤーが変更されるたびに呼び出されるコールバック関数が幾つかあります。これはレイヤー状態を関数に渡し、読み取りや変更することができます。
|
呼び出すことができる関数に加えて、レイヤーが変更されるたびに呼び出されるコールバック関数が幾つかあります。これはレイヤー状態を関数に渡し、読み取りや変更することができます。
|
||||||
|
|
||||||
| コールバック | 説明 |
|
| コールバック | 説明 |
|
||||||
|-----------------------------------------------------|----------------------------------------------------------------------------------------|
|
| --------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
|
||||||
| `layer_state_set_kb(layer_state_t state)` | キーボードレベルのレイヤー関数のためのコールバック。 |
|
| `layer_state_set_kb(layer_state_t state)` | キーボードレベルのレイヤー関数のためのコールバック。 |
|
||||||
| `layer_state_set_user(layer_state_t state)` | ユーザレベルのレイヤー関数のためのコールバック。 |
|
| `layer_state_set_user(layer_state_t state)` | ユーザレベルのレイヤー関数のためのコールバック。 |
|
||||||
| `default_layer_state_set_kb(layer_state_t state)` | キーボードレベルのデフォルトレイヤー関数のためのコールバック。キーボードの初期化時に呼ばれます。 |
|
| `default_layer_state_set_kb(layer_state_t state)` | キーボードレベルのデフォルトレイヤー関数のためのコールバック。キーボードの初期化時に呼ばれます。 |
|
||||||
| `default_layer_state_set_user(layer_state_t state)` | ユーザレベルのデフォルトレイヤー関数のためのコールバック。キーボードの初期化時に呼ばれます。 |
|
| `default_layer_state_set_user(layer_state_t state)` | ユーザレベルのデフォルトレイヤー関数のためのコールバック。キーボードの初期化時に呼ばれます。 |
|
||||||
|
|
||||||
?> これらのコールバックを使うための追加の情報については、[レイヤー変換コード](ja/custom_quantum_functions.md#layer-change-code)のドキュメントを調べてください。
|
?> これらのコールバックを使うための追加の情報については、[レイヤー変換コード](ja/custom_quantum_functions.md#layer-change-code)のドキュメントを調べてください。
|
||||||
|
|
||||||
| チェック関数 | 説明 |
|
次の関数やマクロを使って、特定のレイヤーの状態を確認することもできます。
|
||||||
|-------------------------------------------|------------------------------------------------------------------------------|
|
|
||||||
| `layer_state_cmp(cmp_layer_state, layer)` | これは `cmp_layer_state` を調べて、指定された `layer` が有効かどうかを確認します。これは、レイヤーコールバックで使うためのものです。 |
|
|
||||||
| `layer_state_is(layer)` | これはレイヤーの状態を調べて、指定された `layer` が有効かどうかを確認します。(グローバルレイヤー状態については、`layer_state_cmp` を呼びます)。 |
|
|
||||||
|
|
||||||
!> `IS_LAYER_ON(layer)` もありますが、`layer_state_cmp` 関数には、レイヤー0で正しい値を返すようにするために追加の処理があります。さもないと、レイヤー0がオンになっているかどうかを確認する時に誤った値が返されることがあります。
|
| 関数 | 説明 | 別名 |
|
||||||
|
| ------------------------------- | ------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
|
||||||
|
| `layer_state_is(layer)` | 指定された `layer` がグローバルに有効かどうかを確認する。 | `IS_LAYER_ON(layer)`, `IS_LAYER_OFF(layer)` |
|
||||||
|
| `layer_state_cmp(state, layer)` | `state` を確認して指定された `layer` が有効かどうかを確認する。レイヤーのコールバックで使うことを目的とする。 | `IS_LAYER_ON_STATE(state, layer)`, `IS_LAYER_OFF_STATE(state, layer)` |
|
||||||
+48
-45
@@ -1,8 +1,8 @@
|
|||||||
# マクロ
|
# マクロ
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.8.169:docs/feature_macros.md
|
original document: 0.9.43:docs/feature_macros.md
|
||||||
git diff 0.8.169 HEAD -- docs/feature_macros.md | cat
|
git diff 0.9.43 HEAD -- docs/feature_macros.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
マクロにより、1つのキーを押すだけで複数のキーストロークを送信することができます。QMK にはマクロを定義し使う方法が幾つかあります。これらはなんでもすることができます: よく使うフレーズの入力、コピーペースト、反復的なゲームの動き、あるいはコードを書くことさえ手助けします。
|
マクロにより、1つのキーを押すだけで複数のキーストロークを送信することができます。QMK にはマクロを定義し使う方法が幾つかあります。これらはなんでもすることができます: よく使うフレーズの入力、コピーペースト、反復的なゲームの動き、あるいはコードを書くことさえ手助けします。
|
||||||
@@ -11,34 +11,34 @@
|
|||||||
|
|
||||||
## 新しい方法: `SEND_STRING()` と `process_record_user`
|
## 新しい方法: `SEND_STRING()` と `process_record_user`
|
||||||
|
|
||||||
単語またはフレーズを入力するキーが欲しい時があります。最も一般的な状況のために `SEND_STRING()` を提供しています。これは文字列(つまり、文字のシーケンス)を入力します。簡単にキーコードに変換することができる全ての ASCII 文字がサポートされています (例えば、`\n\t`)。
|
単語またはフレーズを入力するキーが欲しい時があります。最も一般的な状況のために `SEND_STRING()` を提供しています。これは文字列(つまり、文字のシーケンス)を入力します。簡単にキーコードに変換することができる全ての ASCII 文字がサポートされています (例えば、`qmk 123\n\t`)。
|
||||||
|
|
||||||
以下は2キーのキーボードのための `keymap.c` の例です:
|
以下は2キーのキーボードのための `keymap.c` の例です:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
enum custom_keycodes {
|
enum custom_keycodes {
|
||||||
QMKBEST = SAFE_RANGE,
|
QMKBEST = SAFE_RANGE,
|
||||||
};
|
};
|
||||||
|
|
||||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case QMKBEST:
|
case QMKBEST:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
// キーコード QMKBEST が押された時
|
// キーコード QMKBEST が押された時
|
||||||
SEND_STRING("QMK is the best thing ever!");
|
SEND_STRING("QMK is the best thing ever!");
|
||||||
} else {
|
} else {
|
||||||
// キーコード QMKBEST が放された時
|
// キーコード QMKBEST が放された時
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
return true;
|
||||||
return true;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
{QMKBEST, KC_ESC}
|
{QMKBEST, KC_ESC},
|
||||||
}
|
// ...
|
||||||
|
},
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -54,42 +54,45 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
|
|
||||||
```c
|
```c
|
||||||
enum custom_keycodes {
|
enum custom_keycodes {
|
||||||
QMKBEST = SAFE_RANGE,
|
QMKBEST = SAFE_RANGE,
|
||||||
QMKURL,
|
QMKURL,
|
||||||
MY_OTHER_MACRO
|
MY_OTHER_MACRO,
|
||||||
};
|
};
|
||||||
|
|
||||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case QMKBEST:
|
case QMKBEST:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
// キーコード QMKBEST が押された時
|
// キーコード QMKBEST が押された時
|
||||||
SEND_STRING("QMK is the best thing ever!");
|
SEND_STRING("QMK is the best thing ever!");
|
||||||
} else {
|
} else {
|
||||||
// キーコード QMKBEST が放された時
|
// キーコード QMKBEST が放された時
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QMKURL:
|
case QMKURL:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
// キーコード QMKURL が押された場合
|
// キーコード QMKURL が押された場合
|
||||||
SEND_STRING("https://qmk.fm/\n");
|
SEND_STRING("https://qmk.fm/\n");
|
||||||
} else {
|
} else {
|
||||||
// キーコード QMKURL が放された場合
|
// キーコード QMKURL が放された場合
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MY_OTHER_MACRO:
|
case MY_OTHER_MACRO:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
SEND_STRING(SS_LCTL("ac")); // 全てを選択しコピーします
|
SEND_STRING(SS_LCTL("ac")); // 全てを選択しコピーします
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
{MY_CUSTOM_MACRO, MY_OTHER_MACRO}
|
{MY_CUSTOM_MACRO, MY_OTHER_MACRO},
|
||||||
}
|
// ...
|
||||||
|
},
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# マウスキー
|
# マウスキー
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.8.141:docs/feature_mouse_keys.md
|
original document: 0.9.44:docs/feature_mouse_keys.md
|
||||||
git diff 0.8.141 HEAD -- docs/feature_mouse_keys.md | cat
|
git diff 0.9.44 HEAD -- docs/feature_mouse_keys.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
マウスキーは、キーボードを使ってマウスをエミュレートできる機能です。様々な速度でポインタを移動し、5つのボタンを押し、8方向にスクロールすることができます。
|
マウスキーは、キーボードを使ってマウスをエミュレートできる機能です。様々な速度でポインタを移動し、5つのボタンを押し、8方向にスクロールすることができます。
|
||||||
@@ -44,10 +44,11 @@ MOUSEKEY_ENABLE = yes
|
|||||||
|
|
||||||
## マウスキーの設定
|
## マウスキーの設定
|
||||||
|
|
||||||
マウスキーはカーソルを移動するための2つの異なるモードをサポートします:
|
マウスキーはカーソルを移動するための3つの異なるモードをサポートします:
|
||||||
|
|
||||||
* **加速 (デフォルト):** 移動キーを押したままにすると、カーソルが最大速度に達するまでカーソルを加速します。
|
* **加速 (デフォルト):** 移動キーを押したままにすると、カーソルが最大速度に達するまでカーソルを加速します。
|
||||||
* **定速:** 移動キーを押したままにすると、カーソルを一定の速度で移動します。
|
* **定速:** 移動キーを押したままにすると、カーソルを一定の速度で移動します。
|
||||||
|
* **混合:** 移動キーを押したままにすると、カーソルが最大速度に達するまでカーソルを加速し、加速キーと移動キーを同時に押すとカーソルは一定の速度で移動します。
|
||||||
|
|
||||||
同じ原則がスクロールにも適用されます。
|
同じ原則がスクロールにも適用されます。
|
||||||
|
|
||||||
@@ -125,3 +126,19 @@ MOUSEKEY_ENABLE = yes
|
|||||||
| `MK_W_INTERVAL_1` | 120 | スクロールステップ間の時間 (`KC_ACL1`) |
|
| `MK_W_INTERVAL_1` | 120 | スクロールステップ間の時間 (`KC_ACL1`) |
|
||||||
| `MK_W_OFFSET_2` | 1 | スクロールアクションごとのスクロールステップ (`KC_ACL2`) |
|
| `MK_W_OFFSET_2` | 1 | スクロールアクションごとのスクロールステップ (`KC_ACL2`) |
|
||||||
| `MK_W_INTERVAL_2` | 20 | スクロールステップ間の時間 (`KC_ACL2`) |
|
| `MK_W_INTERVAL_2` | 20 | スクロールステップ間の時間 (`KC_ACL2`) |
|
||||||
|
|
||||||
|
### 混合モード
|
||||||
|
|
||||||
|
このモードは **加速** モードのように機能しますが、`KC_ACL0`、`KC_ACL1`、`KC_ACL2` を押したままにすることで
|
||||||
|
一時的(押している間)にカーソルとスクロール速度を定速に設定できます。
|
||||||
|
加速キーが押されていない場合、このモードは **加速** モードと同じで、関連する全ての設定を使って変更できます。
|
||||||
|
|
||||||
|
* **KC_ACL0:** この加速はカーソルをできるだけ遅い速度に設定します。これはカーソルを非常に小さく詳細に移動する場合に便利です。
|
||||||
|
* **KC_ACL1:** この加速はカーソルを最大(ユーザ定義)速度の半分に設定します。
|
||||||
|
* **KC_ACL2:** この加速はカーソルを最大(コンピュータ定義)速度に設定します。これは、正確性を多少犠牲にしてカーソルを大きく移動する場合に便利です。
|
||||||
|
|
||||||
|
混合モードを使うには、キーマップの `config.h` ファイルに少なくとも `MK_COMBINED` を定義しなければなりません:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define MK_COMBINED
|
||||||
|
```
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
# ポインティングデバイス :id=pointing-device
|
# ポインティングデバイス :id=pointing-device
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.8.182:docs/feature_pointing_device.md
|
original document: 0.9.43:docs/feature_pointing_device.md
|
||||||
git diff 0.8.182 HEAD -- docs/feature_pointing_device.md | cat
|
git diff 0.9.43 HEAD -- docs/feature_pointing_device.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
ポインティングデバイスは汎用的な機能の総称です: システムポインタを移動します。マウスキーのような他のオプションも確かにありますが、これは簡単に変更可能で軽量であることを目指しています。機能を制御するためにカスタムキーを実装したり、他の周辺機器から情報を収集してここに直接挿入したりできます - QMK に処理を任せてください。
|
ポインティングデバイスは汎用的な機能の総称です: システムポインタを移動します。マウスキーのような他のオプションも確かにありますが、これは簡単に変更可能で軽量であることを目指しています。機能を制御するためにカスタムキーを実装したり、他の周辺機器から情報を収集してここに直接挿入したりできます - QMK に処理を任せてください。
|
||||||
@@ -26,7 +26,11 @@ report_mouse_t (ここでは "mouseReport") が以下のプロパティを持つ
|
|||||||
* `mouseReport.h` - これは、水平スクロール(+ 右へ、- 左へ)を表す -127 から 127 (128ではなく、USB HID 仕様で定義されています)の符号付き整数です。
|
* `mouseReport.h` - これは、水平スクロール(+ 右へ、- 左へ)を表す -127 から 127 (128ではなく、USB HID 仕様で定義されています)の符号付き整数です。
|
||||||
* `mouseReport.buttons` - これは uint8_t で、上位の5ビットを使っています。これらのビットはマウスボタンの状態を表します - ビット 3 はマウスボタン 5、ビット 7 はマウスボタン 1 です。
|
* `mouseReport.buttons` - これは uint8_t で、上位の5ビットを使っています。これらのビットはマウスボタンの状態を表します - ビット 3 はマウスボタン 5、ビット 7 はマウスボタン 1 です。
|
||||||
|
|
||||||
マウスレポートが送信されると、x、y、v、h のいずれの値も 0 に設定されます (これは "pointing_device_send()" で行われます。この挙動を回避するためにオーバーライドすることができます)。このように、ボタンの状態は持続しますが、動きは1度だけ起こります。さらにカスタマイズするために、`pointing_device_init` と `pointing_device_task` のどちらもオーバーライドすることができます。
|
マウスレポートに必要な変更を行ったら、それを送信する必要があります:
|
||||||
|
|
||||||
|
* `pointing_device_send()` - マウスレポートをホストに送信し、レポートをゼロにします。
|
||||||
|
|
||||||
|
マウスレポートが送信されると、x、y、v、h のいずれの値も 0 に設定されます (これは `pointing_device_send()` で行われます。この挙動を回避するためにオーバーライドすることができます)。このように、ボタンの状態は持続しますが、動きは1度だけ起こります。さらにカスタマイズするために、`pointing_device_init` と `pointing_device_task` のどちらもオーバーライドすることができます。
|
||||||
|
|
||||||
以下の例では、カスタムキーを使ってマウスをクリックし垂直および水平方向に127単位スクロールし、リリースされた時にそれを全て元に戻します - なぜならこれは完全に便利な機能だからです。いいですか、以下はひとつの例です:
|
以下の例では、カスタムキーを使ってマウスをクリックし垂直および水平方向に127単位スクロールし、リリースされた時にそれを全て元に戻します - なぜならこれは完全に便利な機能だからです。いいですか、以下はひとつの例です:
|
||||||
|
|
||||||
@@ -43,6 +47,7 @@ case MS_SPECIAL:
|
|||||||
currentReport.buttons &= ~MOUSE_BTN1;
|
currentReport.buttons &= ~MOUSE_BTN1;
|
||||||
}
|
}
|
||||||
pointing_device_set_report(currentReport);
|
pointing_device_set_report(currentReport);
|
||||||
|
pointing_device_send();
|
||||||
break;
|
break;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# PS/2 マウスサポート :id=ps2-mouse-support
|
# PS/2 マウスサポート :id=ps2-mouse-support
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.8.147:docs/feature_ps2_mouse.md
|
original document: 0.9.44:docs/feature_ps2_mouse.md
|
||||||
git diff 0.8.147 HEAD -- docs/feature_ps2_mouse.md | cat
|
git diff 0.9.44 HEAD -- docs/feature_ps2_mouse.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
PS/2 マウス (例えばタッチパッドあるいはトラックポイント)を複合デバイスとしてキーボードに接続することができます。
|
PS/2 マウス (例えばタッチパッドあるいはトラックポイント)を複合デバイスとしてキーボードに接続することができます。
|
||||||
@@ -291,3 +291,13 @@ X 軸と Y 軸を反転するには、以下を config.h に配置します:
|
|||||||
#define PS2_MOUSE_DEBUG_HID
|
#define PS2_MOUSE_DEBUG_HID
|
||||||
#define PS2_MOUSE_DEBUG_RAW
|
#define PS2_MOUSE_DEBUG_RAW
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 動作フック :id=movement-hook
|
||||||
|
|
||||||
|
ホストに送信される前にキーマップでマウスの動作を処理します。使用例として、
|
||||||
|
ノイズのフィルタリング、加速の追加、レイヤーの自動アクティブ化が含まれます。
|
||||||
|
使用するには、キーマップで次の関数を定義します:
|
||||||
|
|
||||||
|
```c
|
||||||
|
void ps2_mouse_moved_user(report_mouse_t *mouse_report);
|
||||||
|
```
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
# 分割キーボード
|
# 分割キーボード
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document:0.9.5:docs/feature_split_keyboard.md
|
original document:0.9.43:docs/feature_split_keyboard.md
|
||||||
git diff 0.9.5 HEAD -- docs/feature_split_keyboard.md | cat
|
git diff 0.9.43 HEAD -- docs/feature_split_keyboard.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
QMK ファームウェアリポジトリの多くのキーボードは、"分割"キーボードです。それらは2つのコントローラを使います — 1つは USB に接続し、もう1つは TRRS または同様のケーブルを介してシリアルまたは I<sup>2</sup>C 接続で接続します。
|
QMK ファームウェアリポジトリの多くのキーボードは、"分割"キーボードです。それらは2つのコントローラを使います — 1つは USB に接続し、もう1つは TRRS または同様のケーブルを介してシリアルまたは I<sup>2</sup>C 接続で接続します。
|
||||||
@@ -95,6 +95,24 @@ SPLIT_TRANSPORT = custom
|
|||||||
|
|
||||||
これは指定されたピンを読み込みます。high の場合、コントローラはそれを左側だと仮定し、low の場合、それは右側であると仮定します。
|
これは指定されたピンを読み込みます。high の場合、コントローラはそれを左側だと仮定し、low の場合、それは右側であると仮定します。
|
||||||
|
|
||||||
|
#### マトリックスピンによる左右の設定
|
||||||
|
|
||||||
|
左右を決定するためにコントローラのキーマトリックスピンを読むようにファームウェアを設定することができます。これを行うには、以下を `config.h` ファイルに追加します:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define SPLIT_HAND_MATRIX_GRID D0, F1
|
||||||
|
```
|
||||||
|
|
||||||
|
最初のピンは出力ピンで、2つ目は入力ピンです。
|
||||||
|
|
||||||
|
キーマトリックスに未使用の交点があるキーボードがあります。この設定は、左右の決定にこれらの未使用の交点の1つを使用します。
|
||||||
|
|
||||||
|
通常、ダイオードが交点に接続されている場合、左側と判断されます。次の定義を追加すると、右側と判断されます。
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define SPLIT_HAND_MATRIX_GRID_LOW_IS_RIGHT
|
||||||
|
```
|
||||||
|
|
||||||
#### EEPROM による左右の設定
|
#### EEPROM による左右の設定
|
||||||
|
|
||||||
このメソッドは永続ストレージ(`EEPROM`)のフラグを設定することで、キーボードの左右を設定します。これはコントローラが最初に起動する時にチェックされ、キーボードのどちら側であるかとキーボードのレイアウトの向きを決定します。
|
このメソッドは永続ストレージ(`EEPROM`)のフラグを設定することで、キーボードの左右を設定します。これはコントローラが最初に起動する時にチェックされ、キーボードのどちら側であるかとキーボードのレイアウトの向きを決定します。
|
||||||
|
|||||||
@@ -0,0 +1,136 @@
|
|||||||
|
# QMK での速記 :id=stenography-in-qmk
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.19:docs/feature_stenography.md
|
||||||
|
git diff 0.9.19 HEAD -- docs/feature_stenography.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
[速記](https://en.wikipedia.org/wiki/Stenotype)は裁判所のレポート、字幕および耳が不自由な人のためのリアルタイムの文字起こしで最もよく使われる記述方法です。速記では単語はスペル、音声およびショートカット(短い)ストロークが混在する音節ごとに音節化されます。プロの速記者は、標準的なタイピングで通常見られる負担を掛けずに、はるかに少ないエラー(99.9%より高い精度)で、200-300 WPM に到達できます。
|
||||||
|
|
||||||
|
[Open Steno Project](http://www.openstenoproject.org/)は、速記ストロークを単語とコマンドにリアルタイムに変換する Plover と呼ばれるオープンソースプログラムを構築しました。確立された辞書とサポートがあります。
|
||||||
|
|
||||||
|
## QWERTY キーボードを使った Plover :id=plover-with-qwerty-keyboard
|
||||||
|
|
||||||
|
Plover は全ての標準的な QWERTY キーボードで動作しますが、キーボードが NKRO (n-キーロールオーバー)をサポートする場合は Plover は一度に押された全てのキーが分かるためより効率的です。Plover 用のキーマップの例は `planck/keymaps/default` で見つかります。`PLOVER` レイヤーに切り替えると、数字バーをサポートするためにキーボードの位置が調整されます。
|
||||||
|
|
||||||
|
QMK で Plover を使うには、NKRO を有効にし、標準レイアウト以外のレイアウトの場合はオプションでレイアウトを調整します。複数のキーを押しやすくするために、なんらかの速記フレンドリなキーキャップを購入することもできます。
|
||||||
|
|
||||||
|
## 速記プロトコルを使った Plover :id=plover-with-steno-protocol
|
||||||
|
|
||||||
|
Plover は幾つかの速記マシンの言語も理解します。QMK はこれらの言語の内2つの言語、TX Bolt と GeminiPR を話すことができます。レイアウトの例は `planck/keymaps/steno` で見つけることができます。
|
||||||
|
|
||||||
|
QMKが steno プロトコルを使って Plover と話す場合は、Plover は入力としてキーボードを使いません。標準のキーボードと速記キーボードを行き来したり、あるいは Plover をアクティブ/非アクティブにする必要なく Plover と標準のレイヤーを行き来することができることを意味します。
|
||||||
|
|
||||||
|
このモードでは、Plover はシリアルポートを介して速記マシンと通信すると想定しているため、QMK はオペレーティングシステムに対してキーボードに加えて仮想シリアルポートとして存在しています。デフォルトでは、QMK は TX Bolt プロトコルを話しますが、GeminiPR に切り替えることができます; 最後に使われたプロトコルが不揮発性メモリに格納されるため QMK は再起動時に同じプロトコルを使います。
|
||||||
|
|
||||||
|
> 注意: ハードウェアの制限により、仮想シリアルポートとマウスエミュレーションの両方を同時に実行することができないかもしれません。
|
||||||
|
|
||||||
|
### TX Bolt :id=tx-bolt
|
||||||
|
|
||||||
|
TX Bolt は可変サイズ(1-5バイト)のパケットで非常に単純なプロトコルを介して24個のキーのステータスを通信します。
|
||||||
|
|
||||||
|
### GeminiPR :id=geminipr
|
||||||
|
|
||||||
|
GeminiPR は42個のキーを6バイトのパケットにエンコードします。TX Bolt は標準的な速記に必要な全てを含んでいますが、GeminiPR は英語以外の速記法のサポートを含む、より多くのオプションにも開け放たれています。
|
||||||
|
|
||||||
|
## 速記のための QMK の設定 :id=configuring-qmk-for-steno
|
||||||
|
|
||||||
|
最初にキーマップの Makefile で速記を有効にします。競合を避けるために、マウスキー、追加キーあるいはその他の USB エンドポイントを無効にする必要もあります。幾つかのプロセッサの内蔵の USB スタックは一定数の USB エンドポイントと仮想シリアルポートのみをサポートし、速記はそれらのうちの3つを使います。
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
STENO_ENABLE = yes
|
||||||
|
MOUSEKEY_ENABLE = no
|
||||||
|
```
|
||||||
|
|
||||||
|
キーマップで Plover 用の新しいレイヤーを作成します。`keymap_steno.h` をインクルードする必要があります。例については `planck/keymaps/steno/keymap.c` を見てください。レイヤーに切り替えるためのキーとレイヤーから抜けるためのキーを作成することを忘れないでください。その場でモードを切り替えたい場合は、キーコード `QK_STENO_BOLT` および `QK_STENO_GEMINI` を使うことができます。プロトコルのうちの1つのみを使う場合は、初期化関数の中でそれをセットアップすることができます:
|
||||||
|
|
||||||
|
```c
|
||||||
|
void matrix_init_user() {
|
||||||
|
steno_set_mode(STENO_MODE_GEMINI); // あるいは STENO_MODE_BOLT
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
キーボードを書き込んだら、Plover を起動します。'Configure...' ボタンをクリックします。'Machine' タブの中で目的のプロトコルに対応する速記マシンを選択します。このタブの 'Configure...' ボタンをクリックし、シリアルポートを入力するか 'Scan' をクリックします。ボーレートは 9600 で問題ありません (ただし、115200まで問題無く設定することができるはずです)。それ以外はデフォルトの設定(データビット長: 8、ストップビット長: 1、パリティチェック: なし、フロー制御なし)を使います。
|
||||||
|
|
||||||
|
ディスプレイタブで 'Open stroke display' をクリックします。Plover を無効にすると、キーボードのキーを押すとストローク表示ウィンドウにそれらが表示されるはずです。これを使ってキーマップが正しくセットアップされたことを確認してください。これで速記をする準備ができました!
|
||||||
|
|
||||||
|
## 速記の学習 :id=learning-stenography
|
||||||
|
|
||||||
|
* [Learn Plover!](https://sites.google.com/site/learnplover/)
|
||||||
|
* [QWERTY Steno](http://qwertysteno.com/Home/)
|
||||||
|
* [Steno Jig](https://joshuagrams.github.io/steno-jig/)
|
||||||
|
* Plover [Learning Stenography](https://github.com/openstenoproject/plover/wiki/Learning-Stenography) wiki のより多くのリソース
|
||||||
|
|
||||||
|
## コードとのインターフェイス :id=interfacing-with-the-code
|
||||||
|
|
||||||
|
速記コードには3つの捕捉可能なフックがあります。これらの関数を定義した場合、処理の特定のポイントでそれらが呼び出されます; それらが true を返す場合処理が継続され、そうでなければあなたが物事を処理すると想定します。
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool send_steno_chord_user(steno_mode_t mode, uint8_t chord[6]);
|
||||||
|
```
|
||||||
|
|
||||||
|
この関数はコードが送信されようとしている時に呼ばれます。モードは `STENO_MODE_BOLT` あるいは `STENO_MODE_GEMINI` のいずれかです。これはいずれかのプロトコルを介して送信される実際のコードを表します。提供されるコードを修正して送信されるものを変更することができます。通常の送信プロセスにしたい場合は true を返すのを忘れないでください。
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool process_steno_user(uint16_t keycode, keyrecord_t *record) { return true; }
|
||||||
|
```
|
||||||
|
|
||||||
|
この関数はキーが押されるとキーが処理される前に呼び出されます。キーコードは `QK_STENO_BOLT`、`QK_STENO_GEMINI` あるいは `STN_*` キー値のいずれかでなければなりません。
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool postprocess_steno_user(uint16_t keycode, keyrecord_t *record, steno_mode_t mode, uint8_t chord[6], int8_t pressed);
|
||||||
|
```
|
||||||
|
|
||||||
|
この関数はキーが処理された後、ただしコードを送信するかどうかを決める前に呼び出されます。`IS_PRESSED(record->event)` が false で、`pressed` が 0 または 1 の場合は、コードはまもなく送信されますが、まだ送信されてはいません。ここが速記コードあるいはキーのライブ表示などのフックを配置する場所です。
|
||||||
|
|
||||||
|
|
||||||
|
## キーコードリファレンス :id=keycode-reference
|
||||||
|
|
||||||
|
`keymap_steno.h` で定義されています。
|
||||||
|
|
||||||
|
> 注意: TX Bolt はキーの完全なセットをサポートしません。QMK での TX Bolt の実装は、GeminiPR キーを最も近い TX Bolt キーにマップします。そのため1つのキーマップが両方で動作します。
|
||||||
|
|
||||||
|
| GeminiPR | TX Bolt | Steno Key |
|
||||||
|
|--------|-------|-----------|
|
||||||
|
| `STN_N1` | `STN_NUM` | Number bar #1 |
|
||||||
|
| `STN_N2` | `STN_NUM` | Number bar #2 |
|
||||||
|
| `STN_N3` | `STN_NUM` | Number bar #3 |
|
||||||
|
| `STN_N4` | `STN_NUM` | Number bar #4 |
|
||||||
|
| `STN_N5` | `STN_NUM` | Number bar #5 |
|
||||||
|
| `STN_N6` | `STN_NUM` | Number bar #6 |
|
||||||
|
| `STN_N7` | `STN_NUM` | Number bar #7 |
|
||||||
|
| `STN_N8` | `STN_NUM` | Number bar #8 |
|
||||||
|
| `STN_N9` | `STN_NUM` | Number bar #9 |
|
||||||
|
| `STN_NA` | `STN_NUM` | Number bar #A |
|
||||||
|
| `STN_NB` | `STN_NUM` | Number bar #B |
|
||||||
|
| `STN_NC` | `STN_NUM` | Number bar #C |
|
||||||
|
| `STN_S1` | `STN_SL` | `S-` upper |
|
||||||
|
| `STN_S2` | `STN_SL` | `S-` lower |
|
||||||
|
| `STN_TL` | `STN_TL` | `T-` |
|
||||||
|
| `STN_KL` | `STN_KL` | `K-` |
|
||||||
|
| `STN_PL` | `STN_PL` | `P-` |
|
||||||
|
| `STN_WL` | `STN_WL` | `W-` |
|
||||||
|
| `STN_HL` | `STN_HL` | `H-` |
|
||||||
|
| `STN_RL` | `STN_RL` | `R-` |
|
||||||
|
| `STN_A` | `STN_A` | `A` vowel |
|
||||||
|
| `STN_O` | `STN_O` | `O` vowel |
|
||||||
|
| `STN_ST1` | `STN_STR` | `*` upper-left |
|
||||||
|
| `STN_ST2` | `STN_STR` | `*` lower-left |
|
||||||
|
| `STN_ST3` | `STN_STR` | `*` upper-right |
|
||||||
|
| `STN_ST4` | `STN_STR` | `*` lower-right |
|
||||||
|
| `STN_E` | `STN_E` | `E` vowel |
|
||||||
|
| `STN_U` | `STN_U` | `U` vowel |
|
||||||
|
| `STN_FR` | `STN_FR` | `-F` |
|
||||||
|
| `STN_PR` | `STN_PR` | `-P` |
|
||||||
|
| `STN_RR` | `STN_RR` | `-R` |
|
||||||
|
| `STN_BR` | `STN_BR` | `-B` |
|
||||||
|
| `STN_LR` | `STN_LR` | `-L` |
|
||||||
|
| `STN_GR` | `STN_GR` | `-G` |
|
||||||
|
| `STN_TR` | `STN_TR` | `-T` |
|
||||||
|
| `STN_SR` | `STN_SR` | `-S` |
|
||||||
|
| `STN_DR` | `STN_DR` | `-D` |
|
||||||
|
| `STN_ZR` | `STN_ZR` | `-Z` |
|
||||||
|
| `STN_FN` | (GeminiPR のみ) |
|
||||||
|
| `STN_RES1` | (GeminiPR のみ) |
|
||||||
|
| `STN_RES2` | (GeminiPR のみ) |
|
||||||
|
| `STN_PWR` | (GeminiPR のみ) |
|
||||||
+246
-268
@@ -1,39 +1,28 @@
|
|||||||
# タップダンス: 1つのキーが3つ、5つまたは100の異なる動作をします
|
# タップダンス: 1つのキーが3つ、5つまたは100の異なる動作をします
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.9.0:docs/feature_tap_dance.md
|
original document: 0.9.44:docs/feature_tap_dance.md
|
||||||
git diff 0.9.0 HEAD -- docs/feature_tap_dance.md | cat
|
git diff 0.9.44 HEAD -- docs/feature_tap_dance.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
## イントロダクション
|
## イントロダクション :id=introduction
|
||||||
|
|
||||||
セミコロンキーを1回叩くと、セミコロンが送信されます。2回素早く叩くと、コロンが送信されます。3回叩くと、あなたのキーボードのLEDが激しく踊るように明滅します。これは、タップダンスでできることの一例です。それは、コミュニティが提案したとても素敵なファームウェアの機能の1つで、[algernon](https://github.com/algernon) がプルリクエスト [#451](https://github.com/qmk/qmk_firmware/pull/451) で考えて作ったものです。algernon が述べる機能は次の通りです:
|
セミコロンキーを1回叩くと、セミコロンが送信されます。2回素早く叩くと、コロンが送信されます。3回叩くと、あなたのキーボードのLEDが激しく踊るように明滅します。これは、タップダンスでできることの一例です。それは、コミュニティが提案したとても素敵なファームウェアの機能の1つで、[algernon](https://github.com/algernon) がプルリクエスト [#451](https://github.com/qmk/qmk_firmware/pull/451) で考えて作ったものです。algernon が述べる機能は次の通りです:
|
||||||
|
|
||||||
この機能を使うと、特定のキーが、タップした回数に基づいて異なる振る舞いをします。そして、割り込みがあった時は、割り込み前に上手く処理されます。
|
この機能を使うと、特定のキーが、タップした回数に基づいて異なる振る舞いをします。そして、割り込みがあった時は、割り込み前に上手く処理されます。
|
||||||
|
|
||||||
## `ACTION_FUNCTION_TAP` との比較について
|
## タップダンスの使い方 :id=how-to-use
|
||||||
|
最初に、あなたの `rules.mk` ファイルで `TAP_DANCE_ENABLE = yes` と設定する必要があります。なぜならば、デフォルトでは無効になっているからです。これでファームウェアのサイズが1キロバイトほど増加します。
|
||||||
`ACTION_FUNCTION_TAP` はタップダンスに似た機能を提供しますが、注目すべきいくつかの重要な違いがあります。違いを確認するため、いくつかの設定を調べてみましょう。1つのキーを1回タップすると `Space` キーが送信され、2回タップすると `Enter` キーが送信されるよう設定します。
|
|
||||||
|
|
||||||
`ACTION_FUNCTION_TAP` では、これを設定するのはかなり大変で、キーの順番が割り込まれた時に割り込んだキーが最初に送られるという問題に直面します。例えば、`SPC a` は、もし `SPC` と `a` が `TAPPING_TERM` で設定した時間内に両方とも入力された場合、結果として `a SPC` が送信されます。タップダンス機能を使う場合、正しく `SPC a` が送信されます(`TAPPING_TERM` で設定した時間内に `SPC` と `a` を入力した場合であっても)。
|
|
||||||
|
|
||||||
割り込みを正しくハンドリングして目的を達成するため、タップダンスの実装ではシステムの2つの部分をフックします: `process_record_quantum()` とマトリックススキャンです。この2つの部分については以下で説明しますが、今注意すべき点は、マトリックススキャンでは、キーが押されていない時でもタップのシーケンスをタイムアウトにできる必要があるということです。そうすれば、`TAPPING_TERM` の時間が経過した後、`SPC` だけがタイムアウトになって登録されます。
|
|
||||||
|
|
||||||
## タップダンスの使い方
|
|
||||||
|
|
||||||
一般論は十分です。タップダンスの実際の使い方を見てみましょう!
|
|
||||||
|
|
||||||
最初に、あなたの `rules.mk` ファイルで `TAP_DANCE_ENABLE=yes` と設定する必要があります。なぜならば、デフォルトでは無効になっているからです。これでファームウェアのサイズが1キロバイトほど増加します。
|
|
||||||
|
|
||||||
オプションで、あなたの `config.h` ファイルに次のような設定を追加して、`TAPPING_TERM` の時間をカスタマイズしたほうが良いです。
|
オプションで、あなたの `config.h` ファイルに次のような設定を追加して、`TAPPING_TERM` の時間をカスタマイズしたほうが良いです。
|
||||||
|
|
||||||
```
|
```c
|
||||||
#define TAPPING_TERM 175
|
#define TAPPING_TERM 175
|
||||||
```
|
```
|
||||||
|
|
||||||
`TAPPING_TERM` の時間は、あなたのタップダンスのキーのタップとタップの間の時間として許可された最大の時間で、ミリ秒単位で計測されます。例えば、もし、あなたがこの上にある `#define` ステートメントを使い、1回タップすると `Space` が送信され、2回タップすると `Enter` が送信されるタップダンスキーをセットアップした場合、175ミリ秒以内に2回キーをタップすれば `ENT` だけが送信されるでしょう。もし、1回タップしてから175ミリ秒以上待ってからもう一度タップすると、`SPC SPC` が送信されます。
|
`TAPPING_TERM` の時間は、あなたのタップダンスのキーのタップとタップの間の時間として許可された最大の時間で、ミリ秒単位で計測されます。例えば、もし、あなたがこの上にある `#define` ステートメントを使い、1回タップすると `Space` が送信され、2回タップすると `Enter` が送信されるタップダンスキーをセットアップした場合、175ミリ秒以内に2回キーをタップすれば `ENT` だけが送信されるでしょう。もし、1回タップしてから175ミリ秒以上待ってからもう一度タップすると、`SPC SPC` が送信されます。
|
||||||
|
|
||||||
次に、いくつかのタップダンスのキーを定義するためには、`TD()` マクロ — `F()` マクロに似ています — を使うのが最も簡単です。これは数字を受け取り、この数字は後で `tap_dance-actions` 配列のインデックスとして使われます。
|
次に、いくつかのタップダンスのキーを定義するためには、`TD()` マクロを使うのが最も簡単です。これは数字を受け取り、この数字は後で `tap_dance-actions` 配列のインデックスとして使われます。
|
||||||
|
|
||||||
その後、`tap_dance_actions` 配列を使って、タップダンスキーを押した時のアクションを定義します。現在は、5つの可能なオプションがあります:
|
その後、`tap_dance_actions` 配列を使って、タップダンスキーを押した時のアクションを定義します。現在は、5つの可能なオプションがあります:
|
||||||
|
|
||||||
@@ -56,7 +45,7 @@
|
|||||||
最後に、5番目のオプションは、もし、タップダンスキーをコードに追加した後、非タップダンスキーが奇妙な振る舞いを始めた時に特に役に立ちます。ありうる問題は、あなたがタップダンスキーを使いやすくするために `TAPPING_TERM` の時間を変更した結果、その他のキーが割り込みを処理する方法が変わってしまったというものです。
|
最後に、5番目のオプションは、もし、タップダンスキーをコードに追加した後、非タップダンスキーが奇妙な振る舞いを始めた時に特に役に立ちます。ありうる問題は、あなたがタップダンスキーを使いやすくするために `TAPPING_TERM` の時間を変更した結果、その他のキーが割り込みを処理する方法が変わってしまったというものです。
|
||||||
|
|
||||||
|
|
||||||
## 実装の詳細
|
## 実装の詳細 :id=implementation
|
||||||
|
|
||||||
さて、説明の大部分はここまでです! 以下に挙げているいくつかの例に取り組むことができるようになり、あなた自身のタップダンスの機能を開発できるようになります。しかし、もし、あなたが裏側で起きていることをより深く理解したいのであれば、続けてそれが全てどのように機能するかの説明を読みましょう!
|
さて、説明の大部分はここまでです! 以下に挙げているいくつかの例に取り組むことができるようになり、あなた自身のタップダンスの機能を開発できるようになります。しかし、もし、あなたが裏側で起きていることをより深く理解したいのであれば、続けてそれが全てどのように機能するかの説明を読みましょう!
|
||||||
|
|
||||||
@@ -72,9 +61,9 @@
|
|||||||
|
|
||||||
柔軟性のために、タップダンスは、キーコードの組み合わせにも、ユーザー関数にもなることができます。後者は、より高度なタップ回数の制御や、LED を点滅させたり、バックライトをいじったり、等々の制御を可能にします。これは、1つの共用体と、いくつかの賢いマクロによって成し遂げられています。
|
柔軟性のために、タップダンスは、キーコードの組み合わせにも、ユーザー関数にもなることができます。後者は、より高度なタップ回数の制御や、LED を点滅させたり、バックライトをいじったり、等々の制御を可能にします。これは、1つの共用体と、いくつかの賢いマクロによって成し遂げられています。
|
||||||
|
|
||||||
# 実装例
|
## 実装例 :id=examples
|
||||||
|
|
||||||
## シンプルな実装例
|
### シンプルな実装例 :id=simple-example
|
||||||
|
|
||||||
ここに1つの定義のための簡単な例があります。
|
ここに1つの定義のための簡単な例があります。
|
||||||
|
|
||||||
@@ -85,21 +74,24 @@
|
|||||||
```c
|
```c
|
||||||
// タップダンスの宣言
|
// タップダンスの宣言
|
||||||
enum {
|
enum {
|
||||||
TD_ESC_CAPS = 0
|
TD_ESC_CAPS,
|
||||||
};
|
};
|
||||||
|
|
||||||
// タップダンスの定義
|
// タップダンスの定義
|
||||||
qk_tap_dance_action_t tap_dance_actions[] = {
|
qk_tap_dance_action_t tap_dance_actions[] = {
|
||||||
// 1回タップすると Escape キー、2回タップすると Caps Lock。
|
// 1回タップすると Escape キー、2回タップすると Caps Lock。
|
||||||
[TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS)
|
[TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS),
|
||||||
// ほかの宣言もカンマで区切ってここに記述します
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// レイヤー定義で、キーコードの代わりにタップダンスキーを追加します
|
// キーコードの代わりにタップダンスキーを追加します
|
||||||
TD(TD_ESC_CAPS)
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
// ...
|
||||||
|
TD(TD_ESC_CAPS)
|
||||||
|
// ...
|
||||||
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
## 複雑な実装例
|
### 複雑な実装例 :id=complex-examples
|
||||||
|
|
||||||
このセクションでは、いくつかの複雑なタップダンスの例を詳しく説明します。
|
このセクションでは、いくつかの複雑なタップダンスの例を詳しく説明します。
|
||||||
例で使われている全ての列挙型はこのように宣言します。
|
例で使われている全ての列挙型はこのように宣言します。
|
||||||
@@ -107,107 +99,104 @@ TD(TD_ESC_CAPS)
|
|||||||
```c
|
```c
|
||||||
// 全ての例のための列挙型定義
|
// 全ての例のための列挙型定義
|
||||||
enum {
|
enum {
|
||||||
CT_SE = 0,
|
CT_SE,
|
||||||
CT_CLN,
|
CT_CLN,
|
||||||
CT_EGG,
|
CT_EGG,
|
||||||
CT_FLSH,
|
CT_FLSH,
|
||||||
X_TAP_DANCE
|
X_TAP_DANCE
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
### 例1: 1回タップすると `:` を送信し、2回タップすると `;` を送信する
|
#### 例1: 1回タップすると `:` を送信し、2回タップすると `;` を送信する :id=example-1
|
||||||
|
|
||||||
```c
|
```c
|
||||||
void dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
|
void dance_cln_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||||
if (state->count == 1) {
|
if (state->count == 1) {
|
||||||
register_code (KC_RSFT);
|
register_code16(KC_COLN);
|
||||||
register_code (KC_SCLN);
|
} else {
|
||||||
} else {
|
register_code(KC_SCLN);
|
||||||
register_code (KC_SCLN);
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
|
void dance_cln_reset(qk_tap_dance_state_t *state, void *user_data) {
|
||||||
if (state->count == 1) {
|
if (state->count == 1) {
|
||||||
unregister_code (KC_RSFT);
|
unregister_code16(KC_COLN);
|
||||||
unregister_code (KC_SCLN);
|
} else {
|
||||||
} else {
|
unregister_code(KC_SCLN);
|
||||||
unregister_code (KC_SCLN);
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 全てのタップダンス関数はここに定義します。ここでは1つだけ示します。
|
// 全てのタップダンス関数はここに定義します。ここでは1つだけ示します。
|
||||||
qk_tap_dance_action_t tap_dance_actions[] = {
|
qk_tap_dance_action_t tap_dance_actions[] = {
|
||||||
[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cln_finished, dance_cln_reset)
|
[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_cln_finished, dance_cln_reset),
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
### 例2: 100回タップした後に "Safety Dance!" を送信します
|
#### 例2: 100回タップした後に "Safety Dance!" を送信します :id=example-2
|
||||||
|
|
||||||
```c
|
```c
|
||||||
void dance_egg (qk_tap_dance_state_t *state, void *user_data) {
|
void dance_egg(qk_tap_dance_state_t *state, void *user_data) {
|
||||||
if (state->count >= 100) {
|
if (state->count >= 100) {
|
||||||
SEND_STRING ("Safety dance!");
|
SEND_STRING("Safety dance!");
|
||||||
reset_tap_dance (state);
|
reset_tap_dance(state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qk_tap_dance_action_t tap_dance_actions[] = {
|
qk_tap_dance_action_t tap_dance_actions[] = {
|
||||||
[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg)
|
[CT_EGG] = ACTION_TAP_DANCE_FN(dance_egg),
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
### 例3: 1つずつ LED を点灯させてから消灯する
|
#### 例3: 1つずつ LED を点灯させてから消灯する :id=example-3
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// タップする毎に、LED を右から左に点灯します。
|
// タップする毎に、LED を右から左に点灯します。
|
||||||
// 4回目のタップで、右から左に消灯します。
|
// 4回目のタップで、右から左に消灯します。
|
||||||
void dance_flsh_each(qk_tap_dance_state_t *state, void *user_data) {
|
void dance_flsh_each(qk_tap_dance_state_t *state, void *user_data) {
|
||||||
switch (state->count) {
|
switch (state->count) {
|
||||||
case 1:
|
case 1:
|
||||||
ergodox_right_led_3_on();
|
ergodox_right_led_3_on();
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
ergodox_right_led_2_on();
|
ergodox_right_led_2_on();
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
ergodox_right_led_1_on();
|
ergodox_right_led_1_on();
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
ergodox_right_led_3_off();
|
ergodox_right_led_3_off();
|
||||||
_delay_ms(50);
|
wait_ms(50);
|
||||||
ergodox_right_led_2_off();
|
ergodox_right_led_2_off();
|
||||||
_delay_ms(50);
|
wait_ms(50);
|
||||||
ergodox_right_led_1_off();
|
ergodox_right_led_1_off();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4回目のタップで、キーボードをフラッシュ状態にセットします。
|
// 4回目のタップで、キーボードをフラッシュ状態にセットします。
|
||||||
void dance_flsh_finished(qk_tap_dance_state_t *state, void *user_data) {
|
void dance_flsh_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||||
if (state->count >= 4) {
|
if (state->count >= 4) {
|
||||||
reset_keyboard();
|
reset_keyboard();
|
||||||
reset_tap_dance(state);
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// もしフラッシュ状態にならない場合、LED を左から右に消灯します。
|
// もしフラッシュ状態にならない場合、LED を左から右に消灯します。
|
||||||
void dance_flsh_reset(qk_tap_dance_state_t *state, void *user_data) {
|
void dance_flsh_reset(qk_tap_dance_state_t *state, void *user_data) {
|
||||||
ergodox_right_led_1_off();
|
ergodox_right_led_1_off();
|
||||||
_delay_ms(50);
|
wait_ms(50);
|
||||||
ergodox_right_led_2_off();
|
ergodox_right_led_2_off();
|
||||||
_delay_ms(50);
|
wait_ms(50);
|
||||||
ergodox_right_led_3_off();
|
ergodox_right_led_3_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 全てのタップダンス関数を一緒に表示しています。この例3は "CT_FLASH" です。
|
// 全てのタップダンス関数を一緒に表示しています。この例3は "CT_FLASH" です。
|
||||||
qk_tap_dance_action_t tap_dance_actions[] = {
|
qk_tap_dance_action_t tap_dance_actions[] = {
|
||||||
[CT_SE] = ACTION_TAP_DANCE_DOUBLE (KC_SPC, KC_ENT)
|
[CT_SE] = ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT),
|
||||||
,[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cln_finished, dance_cln_reset)
|
[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_cln_finished, dance_cln_reset),
|
||||||
,[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg)
|
[CT_EGG] = ACTION_TAP_DANCE_FN(dance_egg),
|
||||||
,[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED (dance_flsh_each, dance_flsh_finished, dance_flsh_reset)
|
[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED(dance_flsh_each, dance_flsh_finished, dance_flsh_reset)
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
### 例4: クアッドファンクションのタップダンス
|
#### 例4: クアッドファンクションのタップダンス :id=example-4
|
||||||
|
|
||||||
[DanielGGordon](https://github.com/danielggordon) によるもの
|
[DanielGGordon](https://github.com/danielggordon) によるもの
|
||||||
|
|
||||||
@@ -219,40 +208,37 @@ qk_tap_dance_action_t tap_dance_actions[] = {
|
|||||||
* 2回タップ = `Escape` を送信
|
* 2回タップ = `Escape` を送信
|
||||||
* 2回タップして押し続ける = `Alt` を送信
|
* 2回タップして押し続ける = `Alt` を送信
|
||||||
|
|
||||||
## 準備
|
|
||||||
|
|
||||||
'クアッドファンクションのタップダンス' を利用できるようにするには、いくつかのものが必要になります。
|
'クアッドファンクションのタップダンス' を利用できるようにするには、いくつかのものが必要になります。
|
||||||
|
|
||||||
`keymap.c` ファイルの先頭、つまりキーマップの前に、以下のコードを追加します。
|
`keymap.c` ファイルの先頭、つまりキーマップの前に、以下のコードを追加します。
|
||||||
|
|
||||||
```c
|
```c
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool is_press_action;
|
bool is_press_action;
|
||||||
int state;
|
uint8_t state;
|
||||||
} tap;
|
} tap;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
SINGLE_TAP = 1,
|
SINGLE_TAP = 1,
|
||||||
SINGLE_HOLD = 2,
|
SINGLE_HOLD,
|
||||||
DOUBLE_TAP = 3,
|
DOUBLE_TAP,
|
||||||
DOUBLE_HOLD = 4,
|
DOUBLE_HOLD,
|
||||||
DOUBLE_SINGLE_TAP = 5, //シングルタップを2回送信
|
DOUBLE_SINGLE_TAP, // シングルタップを2回送信
|
||||||
TRIPLE_TAP = 6,
|
TRIPLE_TAP,
|
||||||
TRIPLE_HOLD = 7
|
TRIPLE_HOLD
|
||||||
};
|
};
|
||||||
|
|
||||||
// タップダンスの列挙型
|
// タップダンスの列挙型
|
||||||
enum {
|
enum {
|
||||||
X_CTL = 0,
|
X_CTL,
|
||||||
SOME_OTHER_DANCE
|
SOME_OTHER_DANCE
|
||||||
};
|
};
|
||||||
|
|
||||||
int cur_dance (qk_tap_dance_state_t *state);
|
uint8_t cur_dance(qk_tap_dance_state_t *state);
|
||||||
|
|
||||||
//xタップダンスのための関数。キーマップで利用できるようにするため、ここに置きます。
|
|
||||||
void x_finished (qk_tap_dance_state_t *state, void *user_data);
|
|
||||||
void x_reset (qk_tap_dance_state_t *state, void *user_data);
|
|
||||||
|
|
||||||
|
// xタップダンスのための関数。キーマップで利用できるようにするため、ここに置きます。
|
||||||
|
void x_finished(qk_tap_dance_state_t *state, void *user_data);
|
||||||
|
void x_reset(qk_tap_dance_state_t *state, void *user_data);
|
||||||
```
|
```
|
||||||
|
|
||||||
次に、`keymap.c` ファイルの末尾に、次のコードを追加する必要があります。
|
次に、`keymap.c` ファイルの末尾に、次のコードを追加する必要があります。
|
||||||
@@ -288,68 +274,64 @@ void x_reset (qk_tap_dance_state_t *state, void *user_data);
|
|||||||
* 3つ目の点については、'DOUBLE_SINGLE_TAP' が存在しますが、これは完全にはテストされていません
|
* 3つ目の点については、'DOUBLE_SINGLE_TAP' が存在しますが、これは完全にはテストされていません
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int cur_dance (qk_tap_dance_state_t *state) {
|
uint8_t cur_dance(qk_tap_dance_state_t *state) {
|
||||||
if (state->count == 1) {
|
if (state->count == 1) {
|
||||||
if (state->interrupted || !state->pressed) return SINGLE_TAP;
|
if (state->interrupted || !state->pressed) return SINGLE_TAP;
|
||||||
//キーは割り込まれていませんが、まだ押し続けられています。'HOLD' を送信することを意味します。
|
// キーは割り込まれていませんが、まだ押し続けられています。'HOLD' を送信することを意味します。
|
||||||
else return SINGLE_HOLD;
|
else return SINGLE_HOLD;
|
||||||
}
|
} else if (state->count == 2) {
|
||||||
else if (state->count == 2) {
|
// DOUBLE_SINGLE_TAP は "pepper" と入力することと、'pp' と入力したときに実際に
|
||||||
/*
|
// ダブルタップしたい場合とを区別するためのものです。
|
||||||
* DOUBLE_SINGLE_TAP は "pepper" と入力することと、'pp' と入力したときに実際に
|
// この戻り値の推奨されるユースケースは、'ダブルタップ' 動作やマクロではなく、
|
||||||
* ダブルタップしたい場合とを区別するためのものです。
|
// そのキーの2つのキー入力を送信したい場合です。
|
||||||
* この戻り値の推奨されるユースケースは、'ダブルタップ' 動作やマクロではなく、
|
if (state->interrupted) return DOUBLE_SINGLE_TAP;
|
||||||
* そのキーの2つのキー入力を送信したい場合です。
|
else if (state->pressed) return DOUBLE_HOLD;
|
||||||
*/
|
else return DOUBLE_TAP;
|
||||||
if (state->interrupted) return DOUBLE_SINGLE_TAP;
|
}
|
||||||
else if (state->pressed) return DOUBLE_HOLD;
|
|
||||||
else return DOUBLE_TAP;
|
// 誰も同じ文字を3回入力しようとしていないと仮定します(少なくとも高速には)。
|
||||||
}
|
// タップダンスキーが 'KC_W' で、"www." と高速に入力したい場合、ここに例外を追加して
|
||||||
//誰も同じ文字を3回入力しようとしていないと仮定します(少なくとも高速には)。
|
// 'TRIPLE_SINGLE_TAP' を返し、'DOUBLE_SINGLE_TAP' のようにその列挙型を定義する必要があります。
|
||||||
//タップダンスキーが 'KC_W' で、"www." と高速に入力したい場合、ここに例外を追加して
|
if (state->count == 3) {
|
||||||
//'TRIPLE_SINGLE_TAP' を返し、'DOUBLE_SINGLE_TAP' のようにその列挙型を定義する
|
if (state->interrupted || !state->pressed) return TRIPLE_TAP;
|
||||||
//必要があります。
|
else return TRIPLE_HOLD;
|
||||||
if (state->count == 3) {
|
} else return 8; // マジックナンバー。いつかこのメソッドはより多くの押下に対して機能するよう拡張されるでしょう
|
||||||
if (state->interrupted || !state->pressed) return TRIPLE_TAP;
|
|
||||||
else return TRIPLE_HOLD;
|
|
||||||
}
|
|
||||||
else return 8; //マジックナンバー。いつかこのメソッドはより多くの押下に対して機能するよう拡張されるでしょう
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//'x' タップダンスの 'tap' のインスタンスをインスタンス化します
|
//'x' タップダンスの 'tap' のインスタンスを生成します。
|
||||||
static tap xtap_state = {
|
static tap xtap_state = {
|
||||||
.is_press_action = true,
|
.is_press_action = true,
|
||||||
.state = 0
|
.state = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
void x_finished (qk_tap_dance_state_t *state, void *user_data) {
|
void x_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||||
xtap_state.state = cur_dance(state);
|
xtap_state.state = cur_dance(state);
|
||||||
switch (xtap_state.state) {
|
switch (xtap_state.state) {
|
||||||
case SINGLE_TAP: register_code(KC_X); break;
|
case SINGLE_TAP: register_code(KC_X); break;
|
||||||
case SINGLE_HOLD: register_code(KC_LCTRL); break;
|
case SINGLE_HOLD: register_code(KC_LCTRL); break;
|
||||||
case DOUBLE_TAP: register_code(KC_ESC); break;
|
case DOUBLE_TAP: register_code(KC_ESC); break;
|
||||||
case DOUBLE_HOLD: register_code(KC_LALT); break;
|
case DOUBLE_HOLD: register_code(KC_LALT); break;
|
||||||
case DOUBLE_SINGLE_TAP: register_code(KC_X); unregister_code(KC_X); register_code(KC_X);
|
// 最後の case は高速入力用です。キーが `f` であると仮定します:
|
||||||
//最後の case は高速入力用です。キーが `f` であると仮定します:
|
// 例えば、`buffer` という単語を入力するとき、`Esc` ではなく `ff` を送信するようにします。
|
||||||
//例えば、`buffer` という単語を入力するとき、`Esc` ではなく `ff` を送信するようにします。
|
// 高速入力時に `ff` と入力するには、次の文字は `TAPPING_TERM` 以内に入力する必要があります。
|
||||||
//高速入力時に `ff` と入力するには、次の文字は `TAPPING_TERM` 以内に入力する必要があります。
|
// `TAPPING_TERM` はデフォルトでは 200ms です。
|
||||||
//`TAPPING_TERM` はデフォルトでは 200ms です。
|
case DOUBLE_SINGLE_TAP: tap_code(KC_X); register_code(KC_X);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void x_reset (qk_tap_dance_state_t *state, void *user_data) {
|
void x_reset(qk_tap_dance_state_t *state, void *user_data) {
|
||||||
switch (xtap_state.state) {
|
switch (xtap_state.state) {
|
||||||
case SINGLE_TAP: unregister_code(KC_X); break;
|
case SINGLE_TAP: unregister_code(KC_X); break;
|
||||||
case SINGLE_HOLD: unregister_code(KC_LCTRL); break;
|
case SINGLE_HOLD: unregister_code(KC_LCTRL); break;
|
||||||
case DOUBLE_TAP: unregister_code(KC_ESC); break;
|
case DOUBLE_TAP: unregister_code(KC_ESC); break;
|
||||||
case DOUBLE_HOLD: unregister_code(KC_LALT);
|
case DOUBLE_HOLD: unregister_code(KC_LALT);
|
||||||
case DOUBLE_SINGLE_TAP: unregister_code(KC_X);
|
case DOUBLE_SINGLE_TAP: unregister_code(KC_X);
|
||||||
}
|
}
|
||||||
xtap_state.state = 0;
|
xtap_state.state = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
qk_tap_dance_action_t tap_dance_actions[] = {
|
qk_tap_dance_action_t tap_dance_actions[] = {
|
||||||
[X_CTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,x_finished, x_reset)
|
[X_CTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, x_finished, x_reset)
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -359,90 +341,91 @@ qk_tap_dance_action_t tap_dance_actions[] = {
|
|||||||
|
|
||||||
> この設定の "hold" は、タップダンスのタイムアウト(`ACTION_TAP_DANCE_FN_ADVANCED_TIME` 参照)の **後** に起こります。即座に "hold" を得るためには、条件から `state->interrupted` の確認を除きます。結果として、複数回のタップのための時間をより多く持つことで快適な長いタップの期限を使うことができ、そして、"hold" のために長く待たないようにすることができます(2倍の `TAPPING TERM` で開始してみてください)。
|
> この設定の "hold" は、タップダンスのタイムアウト(`ACTION_TAP_DANCE_FN_ADVANCED_TIME` 参照)の **後** に起こります。即座に "hold" を得るためには、条件から `state->interrupted` の確認を除きます。結果として、複数回のタップのための時間をより多く持つことで快適な長いタップの期限を使うことができ、そして、"hold" のために長く待たないようにすることができます(2倍の `TAPPING TERM` で開始してみてください)。
|
||||||
|
|
||||||
### 例5: タップダンスを高度なモッドタップとレイヤータップキーに使う :id=example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys
|
#### 例5: タップダンスを高度なモッドタップとレイヤータップキーに使う :id=example-5
|
||||||
|
|
||||||
タップダンスは、タップされたコードが基本的なキーコード以外の場合に、 `MT()` と `LT()` マクロをエミュレートするのに利用できます。これは、通常 `Shift` を必要とする '(' や '{' のようなキーや、`Control + X` のように他の修飾されたキーコードをタップされたキーコードとして送信することに役立ちます。
|
タップダンスは、タップされたコードが基本的なキーコード以外の場合に、 `MT()` と `LT()` マクロをエミュレートするのに利用できます。これは、通常 `Shift` を必要とする '(' や '{' のようなキーや、`Control + X` のように他の修飾されたキーコードをタップされたキーコードとして送信することに役立ちます。
|
||||||
|
|
||||||
あなたのレイヤーとカスタムキーコードの下に、以下のコードを追加します。
|
あなたのレイヤーとカスタムキーコードの下に、以下のコードを追加します。
|
||||||
|
|
||||||
```c
|
```c
|
||||||
//タップダンスのキーコード
|
// タップダンスのキーコード
|
||||||
enum td_keycodes {
|
enum td_keycodes {
|
||||||
ALT_LP //例: 押していると `LALT`、タップすると `(`。それぞれのタップダンスの追加のキーコードを追加します
|
ALT_LP // 例: 押していると `LALT`、タップすると `(`。それぞれのタップダンスの追加のキーコードを追加します
|
||||||
};
|
};
|
||||||
|
|
||||||
//必要な数のタップダンス状態を含むタイプを定義します
|
// 必要な数のタップダンス状態を含むタイプを定義します
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SINGLE_TAP,
|
SINGLE_TAP,
|
||||||
SINGLE_HOLD,
|
SINGLE_HOLD,
|
||||||
DOUBLE_SINGLE_TAP
|
DOUBLE_SINGLE_TAP
|
||||||
} td_state_t;
|
} td_state_t;
|
||||||
|
|
||||||
//タップダンスの状態の型のグローバルインスタンスを作ります
|
// タップダンスの状態の型のグローバルインスタンスを作ります
|
||||||
static td_state_t td_state;
|
static td_state_t td_state;
|
||||||
|
|
||||||
//タップダンス関数を宣言します:
|
// タップダンス関数を宣言します:
|
||||||
|
|
||||||
//現在のタップダンスの状態を特定するための関数
|
// 現在のタップダンスの状態を特定するための関数
|
||||||
int cur_dance (qk_tap_dance_state_t *state);
|
uint8_t cur_dance(qk_tap_dance_state_t *state);
|
||||||
|
|
||||||
//それぞれのタップダンスキーコードに適用する `finished` と `reset` 関数
|
// それぞれのタップダンスキーコードに適用する `finished` と `reset` 関数
|
||||||
void altlp_finished (qk_tap_dance_state_t *state, void *user_data);
|
void altlp_finished(qk_tap_dance_state_t *state, void *user_data);
|
||||||
void altlp_reset (qk_tap_dance_state_t *state, void *user_data);
|
void altlp_reset(qk_tap_dance_state_t *state, void *user_data);
|
||||||
```
|
```
|
||||||
|
|
||||||
キーレイアウト(`LAYOUT`)の下に、タップダンスの関数を定義します。
|
キーレイアウト(`LAYOUT`)の下に、タップダンスの関数を定義します。
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// 返却するタップダンス状態を特定します
|
// 返却するタップダンス状態を特定します
|
||||||
int cur_dance (qk_tap_dance_state_t *state) {
|
uint8_t cur_dance(qk_tap_dance_state_t *state) {
|
||||||
if (state->count == 1) {
|
if (state->count == 1) {
|
||||||
if (state->interrupted || !state->pressed) { return SINGLE_TAP; }
|
if (state->interrupted || !state->pressed) return SINGLE_TAP;
|
||||||
else { return SINGLE_HOLD; }
|
else return SINGLE_HOLD;
|
||||||
}
|
}
|
||||||
if (state->count == 2) { return DOUBLE_SINGLE_TAP; }
|
|
||||||
else { return 3; } // 上記で返却する最大の状態の値より大きい任意の数
|
if (state->count == 2) return DOUBLE_SINGLE_TAP;
|
||||||
|
else return 3; // 上記で返却する最大の状態の値より大きい任意の数
|
||||||
}
|
}
|
||||||
|
|
||||||
// 定義する各タップダンスキーコードのとりうる状態を制御します:
|
// 定義する各タップダンスキーコードのとりうる状態を制御します:
|
||||||
|
|
||||||
void altlp_finished (qk_tap_dance_state_t *state, void *user_data) {
|
void altlp_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||||
td_state = cur_dance(state);
|
td_state = cur_dance(state);
|
||||||
switch (td_state) {
|
switch (td_state) {
|
||||||
case SINGLE_TAP:
|
case SINGLE_TAP:
|
||||||
register_code16(KC_LPRN);
|
register_code16(KC_LPRN);
|
||||||
break;
|
break;
|
||||||
case SINGLE_HOLD:
|
case SINGLE_HOLD:
|
||||||
register_mods(MOD_BIT(KC_LALT)); // レイヤータップキーの場合、ここでは `layer_on(_MY_LAYER)` を使います
|
register_mods(MOD_BIT(KC_LALT)); // レイヤータップキーの場合、ここでは `layer_on(_MY_LAYER)` を使います
|
||||||
break;
|
break;
|
||||||
case DOUBLE_SINGLE_TAP: // タップ時間内に2つの括弧 `((` の入れ子を可能にします
|
case DOUBLE_SINGLE_TAP: // タップ時間内に2つの括弧 `((` の入れ子を可能にします
|
||||||
tap_code16(KC_LPRN);
|
tap_code16(KC_LPRN);
|
||||||
register_code16(KC_LPRN);
|
register_code16(KC_LPRN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void altlp_reset (qk_tap_dance_state_t *state, void *user_data) {
|
void altlp_reset(qk_tap_dance_state_t *state, void *user_data) {
|
||||||
switch (td_state) {
|
switch (td_state) {
|
||||||
case SINGLE_TAP:
|
case SINGLE_TAP:
|
||||||
unregister_code16(KC_LPRN);
|
unregister_code16(KC_LPRN);
|
||||||
break;
|
break;
|
||||||
case SINGLE_HOLD:
|
case SINGLE_HOLD:
|
||||||
unregister_mods(MOD_BIT(KC_LALT)); // レイヤータップキーの場合、ここでは `layer_off(_MY_LAYER)` を使います
|
unregister_mods(MOD_BIT(KC_LALT)); // レイヤータップキーの場合、ここでは `layer_off(_MY_LAYER)` を使います
|
||||||
break;
|
break;
|
||||||
case DOUBLE_SINGLE_TAP:
|
case DOUBLE_SINGLE_TAP:
|
||||||
unregister_code16(KC_LPRN);
|
unregister_code16(KC_LPRN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 各タップダンスキーコードの `ACTION_TAP_DANCE_FN_ADVANCED()` を定義し、`finished` と `reset` 関数を渡します
|
// 各タップダンスキーコードの `ACTION_TAP_DANCE_FN_ADVANCED()` を定義し、`finished` と `reset` 関数を渡します
|
||||||
qk_tap_dance_action_t tap_dance_actions[] = {
|
qk_tap_dance_action_t tap_dance_actions[] = {
|
||||||
[ALT_LP] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, altlp_finished, altlp_reset)
|
[ALT_LP] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, altlp_finished, altlp_reset)
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
それぞれのタップダンスキーコードをキーマップに含めるときは、`TD()` マクロでキーコードをラップします。例: `TD(ALT_LP)`
|
それぞれのタップダンスキーコードをキーマップに含めるときは、`TD()` マクロでキーコードをラップします。例: `TD(ALT_LP)`
|
||||||
|
|
||||||
### 例6: タップダンスを一時的なレイヤー切り替えとレイヤートグルキーに使う
|
#### 例6: タップダンスを一時的なレイヤー切り替えとレイヤートグルキーに使う :id=example-6
|
||||||
|
|
||||||
タップダンスは、MO(layer) と TG(layer) 機能を模倣することにも使用できます。この例では、1回タップすると `KC_QUOT` 、1回押してそのまま押し続けたら `MO(_MY_LAYER)` 、2回タップしたときは `TG(_MY_LAYER)` として機能するキーを設定します。
|
タップダンスは、MO(layer) と TG(layer) 機能を模倣することにも使用できます。この例では、1回タップすると `KC_QUOT` 、1回押してそのまま押し続けたら `MO(_MY_LAYER)` 、2回タップしたときは `TG(_MY_LAYER)` として機能するキーを設定します。
|
||||||
|
|
||||||
@@ -450,98 +433,93 @@ qk_tap_dance_action_t tap_dance_actions[] = {
|
|||||||
|
|
||||||
```c
|
```c
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool is_press_action;
|
bool is_press_action;
|
||||||
int state;
|
uint8_t state;
|
||||||
} tap;
|
} tap;
|
||||||
|
|
||||||
//必要な数のタップダンス状態のタイプを定義します
|
// 必要な数のタップダンス状態のタイプを定義します
|
||||||
enum {
|
enum {
|
||||||
SINGLE_TAP = 1,
|
SINGLE_TAP = 1,
|
||||||
SINGLE_HOLD = 2,
|
SINGLE_HOLD,
|
||||||
DOUBLE_TAP = 3
|
DOUBLE_TAP
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
QUOT_LAYR = 0 //カスタムタップダンスキー。他のタップダンスキーはこの列挙型に追加します
|
QUOT_LAYR, // カスタムタップダンスキー。他のタップダンスキーはこの列挙型に追加します
|
||||||
};
|
};
|
||||||
|
|
||||||
//タップダンスキーで使われる関数を宣言します
|
// タップダンスキーで使われる関数を宣言します
|
||||||
|
|
||||||
//全てのタップダンスに関連する関数
|
// 全てのタップダンスに関連する関数
|
||||||
int cur_dance (qk_tap_dance_state_t *state);
|
uint8_t cur_dance(qk_tap_dance_state_t *state);
|
||||||
|
|
||||||
//個別のタップダンスに関連する関数
|
// 個別のタップダンスに関連する関数
|
||||||
void ql_finished (qk_tap_dance_state_t *state, void *user_data);
|
void ql_finished(qk_tap_dance_state_t *state, void *user_data);
|
||||||
void ql_reset (qk_tap_dance_state_t *state, void *user_data);
|
void ql_reset(qk_tap_dance_state_t *state, void *user_data);
|
||||||
```
|
```
|
||||||
|
|
||||||
あなたの `keymap.c` ファイルの最後の方に以下のコードを追加します。
|
あなたの `keymap.c` ファイルの最後の方に以下のコードを追加します。
|
||||||
|
|
||||||
```c
|
```c
|
||||||
//現在のタップダンスの状態を決定します
|
// 現在のタップダンスの状態を決定します
|
||||||
int cur_dance (qk_tap_dance_state_t *state) {
|
uint8_t cur_dance(qk_tap_dance_state_t *state) {
|
||||||
if (state->count == 1) {
|
if (state->count == 1) {
|
||||||
if (!state->pressed) {
|
if (!state->pressed) return SINGLE_TAP;
|
||||||
return SINGLE_TAP;
|
else return SINGLE_HOLD;
|
||||||
} else {
|
} else if (state->count == 2) return DOUBLE_TAP;
|
||||||
return SINGLE_HOLD;
|
else return 8;
|
||||||
}
|
|
||||||
} else if (state->count == 2) {
|
|
||||||
return DOUBLE_TAP;
|
|
||||||
}
|
|
||||||
else return 8;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//この例のタップダンスキーに関連付けられた "tap" 構造体を初期化します
|
// この例のタップダンスキーに関連付けられた "tap" 構造体を初期化します
|
||||||
static tap ql_tap_state = {
|
static tap ql_tap_state = {
|
||||||
.is_press_action = true,
|
.is_press_action = true,
|
||||||
.state = 0
|
.state = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
//タップダンスキーの動作をコントロールする関数
|
// タップダンスキーの動作をコントロールする関数
|
||||||
void ql_finished (qk_tap_dance_state_t *state, void *user_data) {
|
void ql_finished(qk_tap_dance_state_t *state, void *user_data) {
|
||||||
ql_tap_state.state = cur_dance(state);
|
ql_tap_state.state = cur_dance(state);
|
||||||
switch (ql_tap_state.state) {
|
switch (ql_tap_state.state) {
|
||||||
case SINGLE_TAP:
|
case SINGLE_TAP:
|
||||||
tap_code(KC_QUOT);
|
tap_code(KC_QUOT);
|
||||||
break;
|
break;
|
||||||
case SINGLE_HOLD:
|
case SINGLE_HOLD:
|
||||||
layer_on(_MY_LAYER);
|
layer_on(_MY_LAYER);
|
||||||
break;
|
break;
|
||||||
case DOUBLE_TAP:
|
case DOUBLE_TAP:
|
||||||
//レイヤーが既にセットされているか確認します
|
// レイヤーが既にセットされているか確認します
|
||||||
if (layer_state_is(_MY_LAYER)) {
|
if (layer_state_is(_MY_LAYER)) {
|
||||||
//レイヤーが既にセットされていたら、オフにします。
|
// レイヤーが既にセットされていたら、オフにします。
|
||||||
|
layer_off(_MY_LAYER);
|
||||||
|
} else {
|
||||||
|
// レイヤーがセットされていなかったら、オンにします。
|
||||||
|
layer_on(_MY_LAYER);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ql_reset(qk_tap_dance_state_t *state, void *user_data) {
|
||||||
|
// キーを押し続けていて今離したら、レイヤーをオフに切り替えます。
|
||||||
|
if (ql_tap_state.state == SINGLE_HOLD) {
|
||||||
layer_off(_MY_LAYER);
|
layer_off(_MY_LAYER);
|
||||||
} else {
|
}
|
||||||
//レイヤーがセットされていなかったら、オンにします。
|
ql_tap_state.state = 0;
|
||||||
layer_on(_MY_LAYER);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ql_reset (qk_tap_dance_state_t *state, void *user_data) {
|
// タップダンスキーを機能に関連付けます
|
||||||
//キーを押し続けていて今離したら、レイヤーをオフに切り替えます。
|
|
||||||
if (ql_tap_state.state==SINGLE_HOLD) {
|
|
||||||
layer_off(_MY_LAYER);
|
|
||||||
}
|
|
||||||
ql_tap_state.state = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//タップダンスキーを機能に関連付けます
|
|
||||||
qk_tap_dance_action_t tap_dance_actions[] = {
|
qk_tap_dance_action_t tap_dance_actions[] = {
|
||||||
[QUOT_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, ql_finished, ql_reset, 275)
|
[QUOT_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, ql_finished, ql_reset, 275)
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
上記のコードは、前の例で使われたコードに似ています。注意する1つのポイントは、必要に応じてレイヤーを切り替えられるように、どのレイヤーがアクティブになっているかいつでも確認できる必要があることです。これを実現するために、引数で与えられた `layer` がアクティブなら `true` を返す `layer_state_is( layer )` を使います。
|
上記のコードは、前の例で使われたコードに似ています。注意する1つのポイントは、必要に応じてレイヤーを切り替えられるように、どのレイヤーがアクティブになっているかいつでも確認できる必要があることです。これを実現するために、引数で与えられた `layer` がアクティブなら `true` を返す `layer_state_is(layer)` を使います。
|
||||||
|
|
||||||
`cur_dance()` と `ql_tap_state` の使い方は、上の例と似ています。
|
`cur_dance()` と `ql_tap_state` の使い方は、上の例と似ています。
|
||||||
|
|
||||||
`ql_finished` 関数における `case:SINGLE_TAP` は、上の例と似ています。`case:SINGLE_HOLD` は、`ql_reset()` と連動してタップダンスキーを押している間 `_MY_LAYER` に切り替わり、キーを離した時に `_MY_LAYER` から離れます。これは、`MO(_MY_LAYER)` に似ています。`case:DOUBLE_TAP` は、`_MY_LAYER` がアクティブレイヤーかどうかを確認することによって動きます。そして、その結果に基づいてレイヤーのオン・オフをトグルします。これは `TG(_MY_LAYER)` に似ています。
|
`ql_finished` 関数における `case:SINGLE_TAP` は、上の例と似ています。`SINGLE_HOLD` の case では、`ql_reset()` と連動してタップダンスキーを押している間 `_MY_LAYER` に切り替わり、キーを離した時に `_MY_LAYER` から離れます。これは、`MO(_MY_LAYER)` に似ています。`DOUBLE_TAP` の case では、`_MY_LAYER` がアクティブレイヤーかどうかを確認することによって動きます。そして、その結果に基づいてレイヤーのオン・オフをトグルします。これは `TG(_MY_LAYER)` に似ています。
|
||||||
|
|
||||||
`tap_dance_actions[]` は、上の例に似ています。 `ACTION_TAP_DANCE_FN_ADVANCED()` の代わりに `ACTION_TAP_DANCE_FN_ADVANCED_TIME()` を使ったことに注意してください。
|
`tap_dance_actions[]` は、上の例に似ています。 `ACTION_TAP_DANCE_FN_ADVANCED()` の代わりに `ACTION_TAP_DANCE_FN_ADVANCED_TIME()` を使ったことに注意してください。
|
||||||
この理由は、私は、非タップダンスキーを使うにあたり `TAPPING_TERM` が短い(175ミリ秒以内)方が好きなのですが、タップダンスのアクションを確実に完了させるには短すぎるとわかったからです——そのため、ここでは時間を275ミリ秒に増やしています。
|
この理由は、私は、非タップダンスキーを使うにあたり `TAPPING_TERM` が短い(175ミリ秒以内)方が好きなのですが、タップダンスのアクションを確実に完了させるには短すぎるとわかったからです——そのため、ここでは時間を275ミリ秒に増やしています。
|
||||||
|
|
||||||
最後に、このタップダンスキーを動かすため、忘れずに `TD(QUOT_LAYR)` を `keymaps[]` に加えてください。
|
最後に、このタップダンスキーを動かすため、忘れずに `TD(QUOT_LAYR)` を `keymaps[]` に加えてください。
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
# ユーザスペース: キーマップ間でのコードの共有
|
# ユーザスペース: キーマップ間でのコードの共有
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.9.0:docs/feature_userspace.md
|
original document: 0.9.43:docs/feature_userspace.md
|
||||||
git diff 0.9.0 HEAD -- docs/feature_userspace.md | cat
|
git diff 0.9.43 HEAD -- docs/feature_userspace.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
似たキーマップを複数のキーボードで使う場合、それらの間でコードを共有できるという利点が得られることがあります。`users/`に以下の構造でキーマップ(理想的には GitHub のユーザ名、`<name>`)と同じ名前の独自のフォルダを作成します:
|
似たキーマップを複数のキーボードで使う場合、それらの間でコードを共有できるという利点が得られることがあります。`users/`に以下の構造でキーマップ(理想的には GitHub のユーザ名、`<name>`)と同じ名前の独自のフォルダを作成します:
|
||||||
@@ -116,7 +116,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
## 例
|
## 例
|
||||||
|
|
||||||
簡単な例については、[`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna) を調べてください。
|
簡単な例については、[`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/_example) を調べてください。
|
||||||
より複雑な例については、[`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna) のユーザスペースを調べてください。
|
より複雑な例については、[`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna) のユーザスペースを調べてください。
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,75 @@
|
|||||||
|
# BootloadHID の書き込み手順とブートローダの情報
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.32:docs/flashing_bootloadhid.md
|
||||||
|
git diff 0.9.32 HEAD -- docs/flashing_bootloadhid.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
ps2avr(GB) キーボードは ATmega32A マイクロコントローラを使い、異なるブートローダを使います。それは通常の QMK の方法を使って書き込むことができません。
|
||||||
|
|
||||||
|
一般的な書き込みシーケンス:
|
||||||
|
|
||||||
|
1. 以下のいずれかの方法を使ってブートローダに入ります:
|
||||||
|
* `RESET` キーコードをタップします (全てのデバイスでは動作しないかもしれません)
|
||||||
|
* ソルトキーを押し続けながらキーボードを接続します (通常はキーボードの readme に書かれています)
|
||||||
|
2. OS がデバイスを検知するのを待ちます。
|
||||||
|
3. .hex ファイルを書き込みます
|
||||||
|
4. デバイスをアプリケーションモードにリセットします(自動的に実行されるかもしれません)
|
||||||
|
|
||||||
|
## bootloadHID の書き込みターゲット
|
||||||
|
|
||||||
|
?> [こちら](ja/newbs_getting_started.md)で詳しく説明されている QMK インストールスクリプトを使うと、必要な bootloadHID ツールが自動的にインストールされます。
|
||||||
|
|
||||||
|
コマンドライン経由で書き込むには、以下のコマンドを実行してターゲット `:bootloadHID` を使います:
|
||||||
|
|
||||||
|
make <keyboard>:<keymap>:bootloadHID
|
||||||
|
|
||||||
|
## GUI 書き込み
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
1. [HIDBootFlash](http://vusb.wikidot.com/project:hidbootflash) をダウンロードします。
|
||||||
|
2. キーボードをリセットします。
|
||||||
|
3. 設定された VendorID が `16c0` で、ProductID が `05df` であることを確認します
|
||||||
|
4. `Find Device` ボタンを押し、キーボードが見つかることを確認します。
|
||||||
|
5. `Open .hex File` ボタンを押し、作成した `.hex` ファイルを見つけます。
|
||||||
|
6. `Flash Device` ボタンを押し、処理が完了するまで待ちます。
|
||||||
|
|
||||||
|
## コマンドライン書き込み
|
||||||
|
|
||||||
|
1. キーボードをリセットします。
|
||||||
|
2. `bootloadHID -r` に続けて `.hex` ファイルへのパスを入力し、キーボードに書き込みます。
|
||||||
|
|
||||||
|
### Windows 手動インストール
|
||||||
|
MSYS2の場合:
|
||||||
|
1. https://www.obdev.at/downloads/vusb/bootloadHID.2012-12-08.tar.gz から BootloadHID ファームウェアパッケージをダウンロードします。
|
||||||
|
2. 互換性のあるツール、例えば 7-Zip を使って内容を抽出します。
|
||||||
|
3. 解凍された書庫から MSYS2 インストール先、通常 `C:\msys64\usr\bin` に `commandline/bootloadHID.exe` をコピーして、MSYS パスに追加します。
|
||||||
|
|
||||||
|
ネイティブの Windows 書き込みの場合、MSYS2 環境の外部で `bootloadHID.exe` を使うことができます。
|
||||||
|
|
||||||
|
### Linux 手動インストール
|
||||||
|
1. libusb development の依存関係をインストールします:
|
||||||
|
```bash
|
||||||
|
# これは OS に依存します - Debian については以下で動作します
|
||||||
|
sudo apt-get install libusb-dev
|
||||||
|
```
|
||||||
|
2. BootloadHID ファームウェアパッケージをダウンロードします:
|
||||||
|
```
|
||||||
|
wget https://www.obdev.at/downloads/vusb/bootloadHID.2012-12-08.tar.gz -O - | tar -xz -C /tmp
|
||||||
|
```
|
||||||
|
3. bootloadHID 実行可能ファイルをビルドします:
|
||||||
|
```
|
||||||
|
cd /tmp/bootloadHID.2012-12-08/commandline/
|
||||||
|
make
|
||||||
|
sudo cp bootloadHID /usr/local/bin
|
||||||
|
```
|
||||||
|
|
||||||
|
### MacOS 手動インストール
|
||||||
|
1. 以下を入力して Homebrew をインストールします:
|
||||||
|
```
|
||||||
|
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
|
||||||
|
```
|
||||||
|
2. 以下のパッケージをインストールします:
|
||||||
|
```
|
||||||
|
brew install --HEAD https://raw.githubusercontent.com/robertgzr/homebrew-tap/master/bootloadhid.rb
|
||||||
|
```
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
# Docker クイックスタート
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.32:docs/getting_started_docker.md
|
||||||
|
git diff 0.9.32 HEAD -- docs/getting_started_docker.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
このプロジェクトは、プライマリオペレーティングシステムに大きな変更を加えることなくキーボードの新しいファームウェアを非常に簡単に構築することができる Docker ワークフローを含みます。これは、あなたがプロジェクトをクローンしビルドを実行した時に、他の人とまったく同じ環境と QMK ビルド基盤を持つことも保証します。これにより、人々はあなたが遭遇した問題の解決をより簡単に行えるようになります。
|
||||||
|
|
||||||
|
## 必要事項
|
||||||
|
|
||||||
|
主な前提条件は動作する `docker` がインストールされていることです。
|
||||||
|
* [Docker CE](https://docs.docker.com/install/#supported-platforms)
|
||||||
|
|
||||||
|
## 使い方
|
||||||
|
|
||||||
|
(サブモジュールを含む) QMK のレポジトリのローカルコピーを取得する:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
|
||||||
|
cd qmk_firmware
|
||||||
|
```
|
||||||
|
|
||||||
|
キーマップをビルドするために以下のコマンドを実行します:
|
||||||
|
```bash
|
||||||
|
util/docker_build.sh <keyboard>:<keymap>
|
||||||
|
# 例えば: util/docker_build.sh planck/rev6:default
|
||||||
|
```
|
||||||
|
|
||||||
|
これは目的のキーボード/キーマップをコンパイルし、結果として書き込み用に `.hex` あるいは `.bin` ファイルを QMK ディレクトリの中に残します。`:keymap` が省略された場合は全てのキーマップが使われます。パラメータの形式は、`make` を使ってビルドする時と同じであることに注意してください。
|
||||||
|
|
||||||
|
`target` を指定して Docker から直接キーボードをビルドし、_かつ_書き込むためのサポートもあります。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
util/docker_build.sh keyboard:keymap:target
|
||||||
|
# 例えば: util/docker_build.sh planck/rev6:default:flash
|
||||||
|
```
|
||||||
|
|
||||||
|
スクリプトをパラメータ無しで開始することもできます。この場合、1つずつビルドパラメータを入力するように求められます。これが使いやすいと思うかもしれません:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
util/docker_build.sh
|
||||||
|
# パラメータを入力として読み込みます (空白にすると全てのキーボード/キーマップ)
|
||||||
|
```
|
||||||
|
|
||||||
|
## FAQ
|
||||||
|
|
||||||
|
### なぜ Windows/macOS 上で書き込めないのですか?
|
||||||
|
|
||||||
|
Windows と macOS では、実行するために [Docker Machine](http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos/) が必要です。これはセットアップが面倒なので、お勧めではありません: 代わりに [QMK Toolbox](https://github.com/qmk/qmk_toolbox) を使ってください。
|
||||||
|
|
||||||
|
!> Docker for Windows は[Hyper-V](https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v) を有効にする必要があります。これは、Windows 7、Windows 8 および **Windows 10 Home** のような Hyper-V を搭載していない Windows のバージョンでは機能しないことを意味します。
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
# QMK で GitHub を使う方法
|
# QMK で GitHub を使う方法
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.8.82:docs/getting_started_github.md
|
original document: 0.9.43:docs/getting_started_github.md
|
||||||
git diff 0.8.82 HEAD -- docs/getting_started_github.md | cat
|
git diff 0.9.43 HEAD -- docs/getting_started_github.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
GitHub は慣れていない人には少し注意が必要です - このガイドは、QMK におけるフォーク、クローン、プルリクエストのサブミットの各ステップについて説明します。
|
GitHub は慣れていない人には少し注意が必要です - このガイドは、QMK におけるフォーク、クローン、プルリクエストのサブミットの各ステップについて説明します。
|
||||||
@@ -11,11 +11,11 @@ GitHub は慣れていない人には少し注意が必要です - このガイ
|
|||||||
|
|
||||||
[QMK GitHub ページ](https://github.com/qmk/qmk_firmware)を開くと、右上に "Fork" というボタンが見えます:
|
[QMK GitHub ページ](https://github.com/qmk/qmk_firmware)を開くと、右上に "Fork" というボタンが見えます:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
あなたが組織の一員である場合は、どのアカウントにフォークするかを選択する必要があります。ほとんどの場合、あなたの個人のアカウントにフォークしたいでしょう。フォークが完了したら(しばらく時間が掛かる場合があります)、"Clone or Download" ボタンをクリックします:
|
あなたが組織の一員である場合は、どのアカウントにフォークするかを選択する必要があります。ほとんどの場合、あなたの個人のアカウントにフォークしたいでしょう。フォークが完了したら(しばらく時間が掛かる場合があります)、"Clone or Download" ボタンをクリックします:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
必ず "HTTPS" を選択し、リンクを選択してコピーします:
|
必ず "HTTPS" を選択し、リンクを選択してコピーします:
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ or open the directory in your favourite text editor.
|
|||||||
|
|
||||||
`config.h` の先頭には USB に関する設定があります。これらはキーボードが OS からどのように見えるかを制御しています。変更する理由がない場合は、`VENDOR_ID` を `0xFEED` のままにしておく必要があります。`PRODUCT_ID` にはまだ使用されていない番号を選ばなければいけません。
|
`config.h` の先頭には USB に関する設定があります。これらはキーボードが OS からどのように見えるかを制御しています。変更する理由がない場合は、`VENDOR_ID` を `0xFEED` のままにしておく必要があります。`PRODUCT_ID` にはまだ使用されていない番号を選ばなければいけません。
|
||||||
|
|
||||||
`MANUFACTURER`、 `PRODUCT`、 `DESCRIPTION` をキーボードにあった設定に変更します。
|
`MANUFACTURER`、 `PRODUCT` をキーボードにあった設定に変更します。
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define VENDOR_ID 0xFEED
|
#define VENDOR_ID 0xFEED
|
||||||
@@ -81,7 +81,6 @@ or open the directory in your favourite text editor.
|
|||||||
#define DEVICE_VER 0x0001
|
#define DEVICE_VER 0x0001
|
||||||
#define MANUFACTURER You
|
#define MANUFACTURER You
|
||||||
#define PRODUCT my_awesome_keyboard
|
#define PRODUCT my_awesome_keyboard
|
||||||
#define DESCRIPTION A custom keyboard
|
|
||||||
```
|
```
|
||||||
|
|
||||||
?> Windows や macOS では、`MANUFACTURER` と `PRODUCT` が USBデバイスのリストに表示されます。Linux 上の `lsusb` では、代わりにデフォルトで [USB ID Repository](http://www.linux-usb.org/usb-ids.html) によって維持されているリストからこれらを取得します。`lsusb -v` を使用するとデバイスから示された値を表示します。また、接続したときのカーネルログにも表示されます。
|
?> Windows や macOS では、`MANUFACTURER` と `PRODUCT` が USBデバイスのリストに表示されます。Linux 上の `lsusb` では、代わりにデフォルトで [USB ID Repository](http://www.linux-usb.org/usb-ids.html) によって維持されているリストからこれらを取得します。`lsusb -v` を使用するとデバイスから示された値を表示します。また、接続したときのカーネルログにも表示されます。
|
||||||
|
|||||||
@@ -0,0 +1,104 @@
|
|||||||
|
# キーボードマトリックスの仕組み
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.32:docs/how_a_matrix_works.md
|
||||||
|
git diff 0.9.32 HEAD -- docs/how_a_matrix_works.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
キーボードスイッチのマトリックスは行と列に配置されます。マトリックス回路がなければ、各スイッチはコントローラに直接配線する必要があります。
|
||||||
|
|
||||||
|
回路が行と列に配置されている場合、キーが押されると、列ワイヤが行ワイヤと接触し、回路が完成します。キーボードコントローラはこの閉回路を検知し、キー押下として登録します。
|
||||||
|
|
||||||
|
マイクロコントローラはファームウェアを介してセットアップされ、論理1を一度に1つずつ列に送信し、行から一度に全てを読み取ります - このプロセスはマトリックススキャンと呼ばれます。マトリックスはデフォルトでは電流の通過を許可しないたくさんの開いたスイッチです - ファームウェアはキーが押されていないものとしてこれを読み取ります。1つのキーを押すとすぐに、キースイッチが接続されている列から来ていた論理1がスイッチを通過して対応する行に渡されます - 以下の 2x2 の例を確認してください:
|
||||||
|
|
||||||
|
Column 0 being scanned Column 1 being scanned
|
||||||
|
x x
|
||||||
|
col0 col1 col0 col1
|
||||||
|
| | | |
|
||||||
|
row0 ---(key0)---(key1) row0 ---(key0)---(key1)
|
||||||
|
| | | |
|
||||||
|
row1 ---(key2)---(key3) row1 ---(key2)---(key3)
|
||||||
|
|
||||||
|
`x` は関連付けられた列と行の値が1であるか、HIGH であることを表します。ここでは、キーが押されていないことが分かります。そのため `x` を取得する行はありません。1つのキースイッチの二つの接点はそのスイッチのある行と列にそれぞれ接続されていることに注意してください。
|
||||||
|
|
||||||
|
`key0` を押すと、`col0` は `row0` に接続されるため、ファームウェアがその行に対して受け取る値は `0b01` です (ここで `0b` はこれがビット値であることを意味します。つまり次の数字は全てビット(0または1)であり、その列のキーを表します)。この表記を使用して、キースイッチが押されたことを示し、列と行が接続されていることを示します:
|
||||||
|
|
||||||
|
Column 0 being scanned Column 1 being scanned
|
||||||
|
x x
|
||||||
|
col0 col1 col0 col1
|
||||||
|
| | | |
|
||||||
|
x row0 ---(-+-0)---(key1) row0 ---(-+-0)---(key1)
|
||||||
|
| | | |
|
||||||
|
row1 ---(key2)---(key3) row1 ---(key2)---(key3)
|
||||||
|
|
||||||
|
`row0` には `x` があるため、値が1であることがわかります。全体として、`key0` が押された時にファームウェアが受信するデータは、
|
||||||
|
|
||||||
|
col0: 0b01
|
||||||
|
col1: 0b00
|
||||||
|
│└row0
|
||||||
|
└row1
|
||||||
|
|
||||||
|
一度に複数のキーを押し始めると問題が発生します。マトリックスをもう一度見ると、かなり明白になっているはずです:
|
||||||
|
|
||||||
|
Column 0 being scanned Column 1 being scanned
|
||||||
|
x x
|
||||||
|
col0 col1 col0 col1
|
||||||
|
| | | |
|
||||||
|
x row0 ---(-+-0)---(-+-1) x row0 ---(-+-0)---(-+-1)
|
||||||
|
| | | |
|
||||||
|
x row1 ---(key2)---(-+-3) x row1 ---(key2)---(-+-3)
|
||||||
|
|
||||||
|
Remember that this ^ is still connected to row1
|
||||||
|
|
||||||
|
これから取得されるデータは以下の通りです:
|
||||||
|
|
||||||
|
col0: 0b11
|
||||||
|
col1: 0b11
|
||||||
|
│└row0
|
||||||
|
└row1
|
||||||
|
|
||||||
|
4つ全てではなく、3つのキーしか押されていないため、これは正確ではありません。この挙動はゴーストと呼ばれ、このような奇妙なシナリオでのみ発生しますが、より大きなキーボードではより一般的です。これを回避する方法は、キースイッチの後に、行に接続する前にダイオードを配置することです。ダイオードは、電流が一方向にのみ流れるようにします。これにより、前の例で他の列と行がアクティブにならないようにします。ダイオードマトリックスをこのように表します;
|
||||||
|
|
||||||
|
Column 0 being scanned Column 1 being scanned
|
||||||
|
x x
|
||||||
|
col0 col1 col0 col1
|
||||||
|
│ │ | │
|
||||||
|
(key0) (key1) (key0) (key1)
|
||||||
|
! │ ! │ ! | ! │
|
||||||
|
row0 ─────┴────────┘ │ row0 ─────┴────────┘ │
|
||||||
|
│ │ | │
|
||||||
|
(key2) (key3) (key2) (key3)
|
||||||
|
! ! ! !
|
||||||
|
row1 ─────┴────────┘ row1 ─────┴────────┘
|
||||||
|
|
||||||
|
実際の用途では、ダイオードの黒い線が行に面するように、キースイッチから離れるように配置されます - この場合の `!` はダイオードで、隙間は黒い線を表します。これを覚える良い方法は、以下のシンボルを考えることです: `>|`
|
||||||
|
|
||||||
|
次に、3つのキーを押して、ゴーストシナリオとなるものを実施します:
|
||||||
|
|
||||||
|
Column 0 being scanned Column 1 being scanned
|
||||||
|
x x
|
||||||
|
col0 col1 col0 col1
|
||||||
|
│ │ │ │
|
||||||
|
(┌─┤0) (┌─┤1) (┌─┤0) (┌─┤1)
|
||||||
|
! │ ! │ ! │ ! │
|
||||||
|
x row0 ─────┴────────┘ │ x row0 ─────┴────────┘ │
|
||||||
|
│ │ │ │
|
||||||
|
(key2) (┌─┘3) (key2) (┌─┘3)
|
||||||
|
! ! ! !
|
||||||
|
row1 ─────┴────────┘ x row1 ─────┴────────┘
|
||||||
|
|
||||||
|
全てが期待通りに動きます!これにより、以下のデータが取得されます:
|
||||||
|
|
||||||
|
col0: 0b01
|
||||||
|
col1: 0b11
|
||||||
|
│└row0
|
||||||
|
└row1
|
||||||
|
|
||||||
|
ファームウェアはこの正しいデータを使って、何をすべきかを、最終的には OS に送信する必要のある信号を検出できます。
|
||||||
|
|
||||||
|
参考文献:
|
||||||
|
- [Wikipedia の記事](https://en.wikipedia.org/wiki/Keyboard_matrix_circuit)
|
||||||
|
- [Deskthority の記事](https://deskthority.net/wiki/Keyboard_matrix)
|
||||||
|
- [Dave Dribin による Keyboard Matrix Help (2000)](https://www.dribin.org/dave/keyboard/one_html/)
|
||||||
|
- [PCBheaven による How Key Matrices Works](http://pcbheaven.com/wikipages/How_Key_Matrices_Works/) (アニメーションの例)
|
||||||
|
- [キーボードの仕組み - QMK ドキュメント](how_keyboards_work.md)
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
# キーが登録され、コンピュータで解釈される仕組み
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.32:docs/how_keyboards_work.md
|
||||||
|
git diff 0.9.32 HEAD -- docs/how_keyboards_work.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
このファイルでは、USB を介してキーボードがどのように動作するかの概念を学習できます。ファームウェアを直接変更することで何が期待できるかをより良く理解することができます。
|
||||||
|
|
||||||
|
## 概略図
|
||||||
|
|
||||||
|
特定のキーを1つ入力するたびに、このような一連のアクションが発生します:
|
||||||
|
|
||||||
|
```text
|
||||||
|
+------+ +-----+ +----------+ +----------+ +----+
|
||||||
|
| User |-------->| Key |------>| Firmware |----->| USB wire |---->| OS |
|
||||||
|
+------+ +-----+ +----------+ +----------+ +----+
|
||||||
|
```
|
||||||
|
|
||||||
|
この図は何が起こっているかを非常に単純に示したものです。詳細については次のセクションで説明します。
|
||||||
|
|
||||||
|
## 1. キーを押す
|
||||||
|
|
||||||
|
キーを押すたびに、キーボードのファームウェアはこのイベントを登録することができます。
|
||||||
|
キーが押され、保持され、放された時に登録することができます。
|
||||||
|
|
||||||
|
これは通常キー押下の定期的な走査で発生します。多くの場合、キーの機械的な応答時間、キー押下情報を転送するプロトコル(ここでは USB HID)、あるいは使用されるソフトウェアによって、この速度は制限されます。
|
||||||
|
|
||||||
|
## 2. ファームウェアが送信するもの
|
||||||
|
|
||||||
|
[HID 仕様](https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf)では、適切に認識されるためにキーボードが USB 経由で実際に送信できるものを規定しています。これには、`0x00` から `0xE7` までの単純な数字であるスキャンコードの定義済リストが含まれます。ファームウェアはスキャンコードをキーボードのそれぞれのキーに割り当てます。
|
||||||
|
|
||||||
|
ファームウェアは実際の文字を送信せず、スキャンコードだけを送信します。
|
||||||
|
従って、ファームウェアを変更することで、特定のキーにたいして USB を介してどのスキャンコードが送信されるかだけを変更することができます。
|
||||||
|
|
||||||
|
## 3. イベント入力やカーネルが行うこと
|
||||||
|
|
||||||
|
*スキャンコード*は、[マスターブランチの 60-keyboard.hwdb](https://github.com/systemd/systemd/blob/master/hwdb.d/60-keyboard.hwdb) キーボードに依存する*キーコード*にマップされます。このマッピングが無いと、オペレーティングシステムは有効なキーコードを受信せず、キー押下で何も有用なことができません。
|
||||||
|
|
||||||
|
## 4. オペレーティングシステムがすること
|
||||||
|
|
||||||
|
キーコードがオペレーティングシステムに到達すると、ソフトウェアの一部はキーボードのレイアウトによって、実際の文字と照合しなければなりません。例えば、レイアウトが QWERTY に設定されている場合、照合テーブルの例は以下の通りです:
|
||||||
|
|
||||||
|
| キーコード | 文字 |
|
||||||
|
|---------|-----------|
|
||||||
|
| 0x04 | a/A |
|
||||||
|
| 0x05 | b/B |
|
||||||
|
| 0x06 | c/C |
|
||||||
|
| ... | ... |
|
||||||
|
| 0x1C | y/Y |
|
||||||
|
| 0x1D | z/Z |
|
||||||
|
| ... | ... |
|
||||||
|
|
||||||
|
## 説明をファームウェアに戻して
|
||||||
|
|
||||||
|
(独自のものを作成していない限り)レイアウトは一般的に固定されているため、ファームウェアは実際には作業を簡単するためレイアウト名で直接キーコードを記述できます。これが、`KC_A` が実際に QWERTY で `0x04` を表す場合に行われることです。完全なリストは[キーコード](ja/keycodes.md)にあります。
|
||||||
|
|
||||||
|
## 送信できる文字のリスト
|
||||||
|
|
||||||
|
ショートカットを別として、限られたキーコードのセットが限られたレイアウトにマップされていることは、**指定されたキーに割り当てることができる文字のリストは、レイアウト内に存在するものだけである**ことを意味します。
|
||||||
|
|
||||||
|
例えば、QWERTY US レイアウトがあり、1つのキーを `€` (ユーロ通貨記号)を生成するように割り当てたい場合、そうすることができないことを意味します。なぜなら、QWERTY US レイアウトはそのようなマッピングを持たないためです。QWERTY UK レイアウト、あるいは QWERTY US International を使うことでそれを修正することができます。
|
||||||
|
|
||||||
|
全ての Unicode を含むキーボードレイアウトがなぜ考案されていないのか疑問に思うかもしれません。USB を介して利用可能なキーコードの数の制限により、このようなことは許可されません。
|
||||||
|
|
||||||
|
## (おそらく) Unicode 文字を入力する方法
|
||||||
|
|
||||||
|
ファームウェアに *一連のキー* を送信させて、目的のオペレーティングシステムの[ソフトウェア Unicode インプットメソッド](https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_input)を使うことができます。このようにして、OS で定義されたレイアウトとは無関係に文字を効率的に入力することができます。
|
||||||
|
|
||||||
|
ただし、以下のような複数の欠点があります:
|
||||||
|
|
||||||
|
- 一度に、一つの特定の OS に縛られます (OS を変更する時に再コンパイルする必要があります);
|
||||||
|
- 特定の OS では、全てのソフトウェアが動作するわけではありません;
|
||||||
|
- 一部のシステムでは Unicode のサブセットに制限されます。
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# GPIO 制御 :id=gpio-control
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.34:docs/internals_gpio_control.md
|
||||||
|
git diff 0.9.34 HEAD -- docs/internals_gpio_control.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
QMK には、マイクロコントローラに依存しない GPIO 制御抽象レイヤーがあります。これは異なるプラットフォーム間でピン制御に簡単にアクセスできるようにするためのものです。
|
||||||
|
|
||||||
|
## 関数 :id=functions
|
||||||
|
|
||||||
|
以下の関数は GPIO の基本的な制御を提供し、`quantum/quantum.h` にあります。
|
||||||
|
|
||||||
|
| 関数 | 説明 | 古い AVR の例 | 古い ChibiOS/ARM の例 |
|
||||||
|
|------------------------|--------------------------------------------------|-------------------------------------------------|-------------------------------------------------|
|
||||||
|
| `setPinInput(pin)` | ピンを高インピーダンス(High-Z)の入力として設定 | `DDRB &= ~(1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT)` |
|
||||||
|
| `setPinInputHigh(pin)` | ピンを組み込みのプルアップ抵抗付きの入力として設定 | `DDRB &= ~(1<<2); PORTB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT_PULLUP)` |
|
||||||
|
| `setPinInputLow(pin)` | ピンを組み込みのプルダウン抵抗付きの入力として設定 | N/A (AVR ではサポートされません) | `palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN)` |
|
||||||
|
| `setPinOutput(pin)` | ピンを出力として設定 | `DDRB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)` |
|
||||||
|
| `writePinHigh(pin)` | ピンレベルを high に設定 (ピンを出力として設定してあると仮定) | `PORTB \|= (1<<2)` | `palSetLine(pin)` |
|
||||||
|
| `writePinLow(pin)` | ピンレベルを low に設定 (ピンを出力として設定してあると仮定) | `PORTB &= ~(1<<2)` | `palClearLine(pin)` |
|
||||||
|
| `writePin(pin, level)` | ピンレベルを設定 (ピンを出力として設定してあると仮定) | `(level) ? PORTB \|= (1<<2) : PORTB &= ~(1<<2)` | `(level) ? palSetLine(pin) : palClearLine(pin)` |
|
||||||
|
| `readPin(pin)` | ピンのレベルを返す | `_SFR_IO8(pin >> 4) & _BV(pin & 0xF)` | `palReadLine(pin)` |
|
||||||
|
| `togglePin(pin)` | ピンレベルを反転 (ピンを出力として設定してあると仮定) | `PORTB ^= (1<<2)` | `palToggleLine(pin)` |
|
||||||
|
|
||||||
|
## 高度な設定 :id=advanced-settings
|
||||||
|
|
||||||
|
各マイクロコントローラは GPIO に関して複数の高度な設定を持つことができます。この抽象レイヤーは、アーキテクチャー固有の機能の使用法を制限しません。上級ユーザは、目的のデバイスのデータシートを参照し、必要なライブラリを含めてください。AVR については、標準 avr/io.h ライブラリが使われます; STM32 については ChibiOS [PAL ライブラリ](http://chibios.sourceforge.net/docs3/hal/group___p_a_l.html)が使われます。
|
||||||
@@ -0,0 +1,174 @@
|
|||||||
|
# group `input_callback_reg` {#group__input__callback__reg}
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.34:docs/internals_input_callback_reg.md
|
||||||
|
git diff 0.9.34 HEAD -- docs/internals_input_callback_reg.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
これらは受信コールバックを登録するために使用する関数です。
|
||||||
|
|
||||||
|
関数は、適切な midi メッセージが関連するデバイスの入力と一致した場合に呼び出されます。
|
||||||
|
|
||||||
|
## 概要
|
||||||
|
|
||||||
|
| メンバー | 説明 |
|
||||||
|
--------------------------------|---------------------------------------------
|
||||||
|
| `public void `[`midi_register_cc_callback`](#group__input__callback__reg_1ga64ab672abbbe393c9c4a83110c8df718)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | コントロールチェンジメッセージ受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_noteon_callback`](#group__input__callback__reg_1ga3962f276c17618923f1152779552103e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | ノートオン受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_noteoff_callback`](#group__input__callback__reg_1gac847b66051bd6d53b762958be0ec4c6d)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | ノートオフ受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_aftertouch_callback`](#group__input__callback__reg_1gaa95bc901bd9edff956a667c9a69dd01f)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | アフタータッチ受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_pitchbend_callback`](#group__input__callback__reg_1ga071a28f02ba14f53de219be70ebd9a48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | ピッチベンド受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_songposition_callback`](#group__input__callback__reg_1gaf2adfd79637f3553d8f26deb1ca22ed6)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | ソングポジション受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_progchange_callback`](#group__input__callback__reg_1gae6ba1a35a4cde9bd15dd42f87401d127)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | プログラムチェンジ受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_chanpressure_callback`](#group__input__callback__reg_1ga39b31f1f4fb93917ce039b958f21b4f5)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | チャンネルプレッシャー受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_songselect_callback`](#group__input__callback__reg_1gaf9aafc76a2dc4b9fdbb4106cbda6ce72)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | ソングセレクト受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_tc_quarterframe_callback`](#group__input__callback__reg_1ga0a119fada2becc628cb15d753b257e6e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | タイムコードクォータフレーム受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_realtime_callback`](#group__input__callback__reg_1ga764f440e857b89084b1a07f9da2ff93a)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` | リアルタイム受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_tunerequest_callback`](#group__input__callback__reg_1gae40ff3ce20bda79fef87da24b8321cb1)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` | チューンリクエスト受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_sysex_callback`](#group__input__callback__reg_1ga63ce9631b025785c1848d0122d4c4c48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_sysex_func_t func)` | システムエクスクルーシブ受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_fallthrough_callback`](#group__input__callback__reg_1ga7ed189164aa9682862b3181153afbd94)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` | フォールスルー受信コールバックを登録する。 |
|
||||||
|
| `public void `[`midi_register_catchall_callback`](#group__input__callback__reg_1ga9dbfed568d047a6cd05708f11fe39e99)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` | キャッチオール受信コールバックを登録する。 |
|
||||||
|
|
||||||
|
## メンバー
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_cc_callback`](#group__input__callback__reg_1ga64ab672abbbe393c9c4a83110c8df718)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1ga64ab672abbbe393c9c4a83110c8df718}
|
||||||
|
|
||||||
|
コントロールチェンジメッセージ受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_noteon_callback`](#group__input__callback__reg_1ga3962f276c17618923f1152779552103e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1ga3962f276c17618923f1152779552103e}
|
||||||
|
|
||||||
|
ノートオン受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_noteoff_callback`](#group__input__callback__reg_1gac847b66051bd6d53b762958be0ec4c6d)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1gac847b66051bd6d53b762958be0ec4c6d}
|
||||||
|
|
||||||
|
ノートオフ受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_aftertouch_callback`](#group__input__callback__reg_1gaa95bc901bd9edff956a667c9a69dd01f)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1gaa95bc901bd9edff956a667c9a69dd01f}
|
||||||
|
|
||||||
|
アフタータッチ受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_pitchbend_callback`](#group__input__callback__reg_1ga071a28f02ba14f53de219be70ebd9a48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1ga071a28f02ba14f53de219be70ebd9a48}
|
||||||
|
|
||||||
|
ピッチベンド受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_songposition_callback`](#group__input__callback__reg_1gaf2adfd79637f3553d8f26deb1ca22ed6)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1gaf2adfd79637f3553d8f26deb1ca22ed6}
|
||||||
|
|
||||||
|
ソングポジション受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_progchange_callback`](#group__input__callback__reg_1gae6ba1a35a4cde9bd15dd42f87401d127)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1gae6ba1a35a4cde9bd15dd42f87401d127}
|
||||||
|
|
||||||
|
プログラムチェンジ受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_chanpressure_callback`](#group__input__callback__reg_1ga39b31f1f4fb93917ce039b958f21b4f5)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1ga39b31f1f4fb93917ce039b958f21b4f5}
|
||||||
|
|
||||||
|
チャンネルプレッシャー受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_songselect_callback`](#group__input__callback__reg_1gaf9aafc76a2dc4b9fdbb4106cbda6ce72)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1gaf9aafc76a2dc4b9fdbb4106cbda6ce72}
|
||||||
|
|
||||||
|
ソングセレクト受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_tc_quarterframe_callback`](#group__input__callback__reg_1ga0a119fada2becc628cb15d753b257e6e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1ga0a119fada2becc628cb15d753b257e6e}
|
||||||
|
|
||||||
|
タイムコードクォータフレーム受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_realtime_callback`](#group__input__callback__reg_1ga764f440e857b89084b1a07f9da2ff93a)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` {#group__input__callback__reg_1ga764f440e857b89084b1a07f9da2ff93a}
|
||||||
|
|
||||||
|
リアルタイム受信コールバックを登録する。
|
||||||
|
|
||||||
|
全てのリアルタイムメッセージ型に対してコールバックが呼ばれます。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_tunerequest_callback`](#group__input__callback__reg_1gae40ff3ce20bda79fef87da24b8321cb1)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` {#group__input__callback__reg_1gae40ff3ce20bda79fef87da24b8321cb1}
|
||||||
|
|
||||||
|
チューンリクエスト受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_sysex_callback`](#group__input__callback__reg_1ga63ce9631b025785c1848d0122d4c4c48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_sysex_func_t func)` {#group__input__callback__reg_1ga63ce9631b025785c1848d0122d4c4c48}
|
||||||
|
|
||||||
|
システムエクスクルーシブ受信コールバックを登録する。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_fallthrough_callback`](#group__input__callback__reg_1ga7ed189164aa9682862b3181153afbd94)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` {#group__input__callback__reg_1ga7ed189164aa9682862b3181153afbd94}
|
||||||
|
|
||||||
|
フォールスルー受信コールバックを登録する。
|
||||||
|
|
||||||
|
より具体的なコールバックが見つからない場合にのみ呼ばれます。例えば、ノートオン受信コールバックを登録していないがノートオンメッセージを受け取った場合、フォールスルー受信コールバックが登録されている場合はそれが呼ばれます。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
|
#### `public void `[`midi_register_catchall_callback`](#group__input__callback__reg_1ga9dbfed568d047a6cd05708f11fe39e99)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` {#group__input__callback__reg_1ga9dbfed568d047a6cd05708f11fe39e99}
|
||||||
|
|
||||||
|
キャッチオール受信コールバックを登録する。
|
||||||
|
|
||||||
|
登録されている場合は、より具体的なコールバックあるいはフォールスルー受信コールバックが登録されている場合でも、一致する全てのメッセージに対してキャッチオール受信コールバックが呼ばれます。
|
||||||
|
|
||||||
|
#### パラメータ
|
||||||
|
* `device` 関連するデバイス
|
||||||
|
|
||||||
|
* `func` 登録するコールバック関数
|
||||||
|
|
||||||
+17
-5
@@ -1,8 +1,8 @@
|
|||||||
# キーマップの概要
|
# キーマップの概要
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
original document: 0.8.62:docs/keymap.md
|
original document: 0.9.44:docs/keymap.md
|
||||||
git diff 0.8.62 HEAD -- docs/keymap.md | cat
|
git diff 0.9.44 HEAD -- docs/keymap.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
QMK のキーマップは C のソースファイルの中で定義されます。そのデータ構造は配列の配列です。外側はレイヤーを要素とする配列で、レイヤーはキーを要素とする配列。ほとんどのキーボードは `LAYOUT()` マクロを定義して、この配列の配列を作成しやすくしています。
|
QMK のキーマップは C のソースファイルの中で定義されます。そのデータ構造は配列の配列です。外側はレイヤーを要素とする配列で、レイヤーはキーを要素とする配列。ほとんどのキーボードは `LAYOUT()` マクロを定義して、この配列の配列を作成しやすくしています。
|
||||||
@@ -76,10 +76,22 @@ TMK の歴史的経緯から、キーマップに保存されたアクション
|
|||||||
|
|
||||||
|
|
||||||
### レイヤーの優先順位と透過性
|
### レイヤーの優先順位と透過性
|
||||||
***上位のレイヤーはレイヤーのスタックでより高い優先順位を持つ***ことに注意してください。つまり、ファームウェアはキーコードを最上位から最下位まで検索します。レイヤーで **`KC_TRNS`**(透過)以外のキーコードを見つけると、検索を中止し、下位レイヤーは参照されません。
|
***上位のレイヤーはレイヤーのスタックでより高い優先順位を持つ***ことに注意してください。ファームウェアは最上位のアクティブレイヤーから下に向かってキーコードを検索します。ファームウェアがアクティブなレイヤーで `KC_TRNS` (透過)以外のキーコードを見つけると、検索を停止し、下位レイヤーは参照されません。
|
||||||
|
|
||||||
オーバーレイレイヤーに `KC_TRANS` を配置して、レイアウトの一部だけを変更して下位レイヤーまたは基本レイヤーにフォールバックすることができます。
|
____________
|
||||||
`KC_TRANS` (`KC_TRNS` と `_______` はエイリアス) のキーには独自のキーコードがなく、キーコードの有効な下位レイヤーを参照します。
|
/ / <--- Higher layer
|
||||||
|
/ KC_TRNS //
|
||||||
|
/___________// <--- Lower layer (KC_A)
|
||||||
|
/___________/
|
||||||
|
|
||||||
|
上記シナリオでは、上位レイヤーに非透過のキーが定義されているとそのキーが使われますが、`KC_TRNS` (または同等のキーコード)が定義されている場合は常に下位レベルのキーコード(`KC_A`)が使われます。
|
||||||
|
|
||||||
|
**メモ:** 特定のレイヤーの透過性を示す有効な方法:
|
||||||
|
* `KC_TRANSPARENT`
|
||||||
|
* `KC_TRNS` (別名)
|
||||||
|
* `_______` (別名)
|
||||||
|
|
||||||
|
これらのキーコードは、処理する非透過のキーコードを探すときに、下位レイヤーを検索させることができます。
|
||||||
|
|
||||||
## `keymap.c` の分析
|
## `keymap.c` の分析
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
# モッドタップ
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.34:docs/mod_tap.md
|
||||||
|
git diff 0.9.34 HEAD -- docs/mod_tap.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
モッドタップキー `MT(mod, kc)` は、押したままの時にモディファイアのように機能し、タップされた時に通常のキーのように振舞います。別の言い方をすると、タップした時に Escape を送信しますが、押したままの時に Control あるいは Shift キーとして機能するキーを持つことができます。
|
||||||
|
|
||||||
|
このキーコードと `OSM()` が受け付けるモディファイアは、`KC_` ではなく、`MOD_` の接頭辞が付いています:
|
||||||
|
|
||||||
|
| モディファイア | 説明 |
|
||||||
|
|----------------|----------------------------------------------|
|
||||||
|
| `MOD_LCTL` | 左 Control |
|
||||||
|
| `MOD_LSFT` | 左 Shift |
|
||||||
|
| `MOD_LALT` | 左 Alt |
|
||||||
|
| `MOD_LGUI` | 左 GUI (Windows/Command/Meta キー) |
|
||||||
|
| `MOD_RCTL` | 右 Control |
|
||||||
|
| `MOD_RSFT` | 右 Shift |
|
||||||
|
| `MOD_RALT` | 右 Alt (AltGr) |
|
||||||
|
| `MOD_RGUI` | 右 GUI (Windows/Command/Meta キー) |
|
||||||
|
| `MOD_HYPR` | Hyper (左 Control、左 Shift、左 Alt、左 GUI) |
|
||||||
|
| `MOD_MEH` | Meh (左 Control、左 Shift、左 Alt) |
|
||||||
|
|
||||||
|
以下のようにそれらを OR することで、これらを組み合わせることができます:
|
||||||
|
|
||||||
|
```c
|
||||||
|
MT(MOD_LCTL | MOD_LSFT, KC_ESC)
|
||||||
|
```
|
||||||
|
|
||||||
|
押したままの時にこのキーは左 Control および左 Shift をアクティブにし、タップされた時に Escape を送信します。
|
||||||
|
|
||||||
|
便利なように、QMK はキーマップで一般的な組み合わせをよりコンパクトにするためのモッドタップショートカットを含んでいます:
|
||||||
|
|
||||||
|
| キー | エイリアス | 説明 |
|
||||||
|
|--------------|-----------------------------|-------------------------------------------------------------|
|
||||||
|
| `LCTL_T(kc)` | `CTL_T(kc)` | 押したままの場合は左 Control、タップした場合は `kc` |
|
||||||
|
| `LSFT_T(kc)` | `SFT_T(kc)` | 押したままの場合は左 Shift、タップした場合は `kc` |
|
||||||
|
| `LALT_T(kc)` | `LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` | 押したままの場合は左 Alt、タップした場合は `kc` |
|
||||||
|
| `LGUI_T(kc)` | `LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)` | 押したままの場合は左 GUI、タップした場合は `kc` |
|
||||||
|
| `RCTL_T(kc)` | | 押したままの場合は右 Control、タップした場合は `kc` |
|
||||||
|
| `RSFT_T(kc)` | | 押したままの場合は右 Shift、タップした場合は `kc` |
|
||||||
|
| `RALT_T(kc)` | `ROPT_T(kc)`, `ALGR_T(kc)` | 押したままの場合は右 Alt、タップした場合は `kc` |
|
||||||
|
| `RGUI_T(kc)` | `RCMD_T(kc)`, `RWIN_T(kc)` | 押したままの場合は右 GUI、タップした場合は `kc` |
|
||||||
|
| `SGUI_T(kc)` | `SCMD_T(kc)`, `SWIN_T(kc)` | 押したままの場合は左 Shift と左 GUI、タップした場合は `kc` |
|
||||||
|
| `LCA_T(kc)` | | 押したままの場合は左 Control と左 Alt、タップした場合は `kc` |
|
||||||
|
| `LCAG_T(kc)` | | 押したままの場合は左 Control、左 Alt と左 GUI、タップした場合は `kc` |
|
||||||
|
| `RCAG_T(kc)` | | 押したままの場合は右 Control、右 Alt と右 GUI、タップした場合は `kc` |
|
||||||
|
| `C_S_T(kc)` | | 押したままの場合は左 Control と左 Shift、タップした場合は `kc` |
|
||||||
|
| `MEH_T(kc)` | | 押したままの場合は左 Control、左 Shift と左 Alt、タップした場合は `kc` |
|
||||||
|
| `HYPR_T(kc)` | `ALL_T(kc)` | 押したままの場合は左 Control、左 Shift、左 Alt と左 GUI、タップした場合は `kc` - より詳しくは[ここ](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)を見てください |
|
||||||
|
|
||||||
|
## 注意事項
|
||||||
|
|
||||||
|
残念ながら、キーコードで指定されたモディファイアは無視されるため、これらのキーコードはモッドタップまたはレイヤータップで使うことができません。
|
||||||
|
|
||||||
|
さらに、Windows でリモートデスクトップ接続を使う場合に、問題が発生する場合があります。これらのコードはシフトを非常に高速に送信するため、リモートデスクトップはコードを見逃すかもしれません。
|
||||||
|
|
||||||
|
これを修正するには、リモートデスクトップ接続を開き、「オプションの表示」を開き、「ローカル リソース」タブを開きます。キーボードセクションで、ドロップダウンを「このコンピューター」に変更します。これにより問題が修正され、キャラクタが正しく動作するようになります。
|
||||||
@@ -2,60 +2,41 @@
|
|||||||
|
|
||||||
<!---
|
<!---
|
||||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||||
original document: 0f43c2652:docs/newbs_building_firmware.md
|
original document: 0.9.44:docs/newbs_building_firmware.md
|
||||||
git diff 0f43c2652 HEAD -- docs/newbs_building_firmware.md | cat
|
git diff 0.9.44 HEAD -- docs/newbs_building_firmware.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
ビルド環境をセットアップしたので、カスタムファームウェアのビルドを開始する準備ができました。
|
ビルド環境をセットアップしたので、カスタムファームウェアのビルドを開始する準備ができました。
|
||||||
ガイドのこのセクションでは、ファイルマネージャ、テキストエディタ、ターミナルウィンドウの3つのプログラム間を行き来します。
|
ガイドのこのセクションでは、ファイルマネージャ、テキストエディタ、ターミナルウィンドウの3つのプログラム間を行き来します。
|
||||||
キーボードファームウェアが完成して満足するまで、この3つすべてを開いたままにします。
|
キーボードファームウェアが完成して満足するまで、この3つすべてを開いたままにします。
|
||||||
|
|
||||||
ガイドの最初の部分を読んだ後でターミナルウィンドウを閉じて再度開いていた場合は、ターミナルが正しいディレクトリにあるように `cd qmk_firmware` を忘れないでください。
|
## 新しいキーマップを作成する
|
||||||
|
|
||||||
## キーマップフォルダに移動する
|
独自のキーマップを作成するには、`default` キーマップのコピーを作成する必要があります。最後のステップでビルド環境を設定した場合は、QMK CLI を使って簡単に行うことができます:
|
||||||
|
|
||||||
あなたのキーボードの `keymaps`フォルダに移動することから始めます。
|
qmk new-keymap
|
||||||
|
|
||||||
macOS または Windows を使用している場合は、キーマップフォルダを簡単に開くために使用できるコマンドがあります。
|
もし環境が設定されていない場合や、複数のキーボードを所持している場合は、キーボード名を指定することができます:
|
||||||
|
|
||||||
### macOS:
|
qmk new-keymap -kb <keyboard_name>
|
||||||
|
|
||||||
``` open keyboards/<keyboard_folder>/keymaps ```
|
そのコマンドの出力を見ると、次のようになっているはずです:
|
||||||
|
|
||||||
### Windows:
|
Ψ <github_username> keymap directory created in: /home/me/qmk_firmware/keyboards/clueboard/66/rev3/keymaps/<github_username>
|
||||||
|
|
||||||
``` start .\\keyboards\\<keyboard_folder>\\keymaps ```
|
これがあなたの新しい `keymap.c` ファイルの場所です。
|
||||||
|
|
||||||
## `default` キーマップのコピーを作成する
|
|
||||||
|
|
||||||
`keymaps` フォルダを開いたら、`default`フォルダのコピーを作成します。
|
|
||||||
フォルダには、あなたの GitHub でのユーザー名と同じ名前を付けることを強くお勧めしますが、小文字、数字、アンダースコアのみが含まれている限り、任意の名前を使用できます。
|
|
||||||
|
|
||||||
この手順を自動化するために、`new_keymap.sh`スクリプトを実行する方法もあります。
|
|
||||||
|
|
||||||
`qmk_firmware/util` ディレクトリに移動して、次を入力します。
|
|
||||||
|
|
||||||
```
|
|
||||||
./new_keymap.sh <keyboard path> <username>
|
|
||||||
```
|
|
||||||
|
|
||||||
たとえば、John という名前のユーザーが 1up60hse の新しいキーマップを作成しようとするには、次のように入力します。
|
|
||||||
|
|
||||||
```
|
|
||||||
./new_keymap.sh 1upkeyboards/1up60hse john
|
|
||||||
```
|
|
||||||
|
|
||||||
## あなたの好みのテキストエディタで `keymap.c` を開く
|
## あなたの好みのテキストエディタで `keymap.c` を開く
|
||||||
|
|
||||||
`keymap.c`を開きます。
|
テキストエディタで `keymap.c` ファイルを開きます。
|
||||||
このファイル内には、キーボードの動作を制御する構造があります。
|
このファイル内には、キーボードの動作を制御する構造があります。
|
||||||
`keymap.c`の上部には、キーマップを読みやすくする `define` と `enum` があります。
|
`keymap.c`の上部には、キーマップを読みやすくする定義と列挙型があります。
|
||||||
さらに下には、次のような行があります。
|
さらに下には、次のような行があります:
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
この行はレイヤーのリストの開始を表わしています。
|
この行はレイヤーのリストの開始を表わしています。
|
||||||
その下には、`LAYOUT` または `KEYMAP` のいずれかを含む行があり、これらの行はレイヤーの開始を表わしています。
|
その下には、`LAYOUT` を含む行があり、これらの行はレイヤーの開始を表わしています。
|
||||||
その行の下には、そのレイヤーを構成するキーのリストがあります。
|
その行の下には、そのレイヤーを構成するキーのリストがあります。
|
||||||
|
|
||||||
!> キーマップファイルを編集するときは、カンマを追加したり削除したりしないように注意してください。そうするとファームウェアのコンパイルができなくなり、余分であったり欠落していたりするカンマがどこにあるのかを容易に把握できない場合があります。
|
!> キーマップファイルを編集するときは、カンマを追加したり削除したりしないように注意してください。そうするとファームウェアのコンパイルができなくなり、余分であったり欠落していたりするカンマがどこにあるのかを容易に把握できない場合があります。
|
||||||
@@ -65,33 +46,34 @@ macOS または Windows を使用している場合は、キーマップフォ
|
|||||||
納得のいくまでこのステップを繰り返します。
|
納得のいくまでこのステップを繰り返します。
|
||||||
気になる点をひとつづつ変更して試すのもよし、全部作りなおすのもよし。
|
気になる点をひとつづつ変更して試すのもよし、全部作りなおすのもよし。
|
||||||
あるレイヤー全体が必要ない場合はレイヤーを削除することもでき、必要があれば、合計 32 個までレイヤーを追加することもできます。
|
あるレイヤー全体が必要ない場合はレイヤーを削除することもでき、必要があれば、合計 32 個までレイヤーを追加することもできます。
|
||||||
ここで定義できる内容については、次のドキュメントを参照してください。
|
QMK にはたくさんの機能があり、完全なリストは左側のサイドバーの「QMK を使う」の下を調べてください。ここから始めるために、簡単に使える機能をいくつか紹介します:
|
||||||
|
|
||||||
* [キーコード](ja/keycodes.md)
|
* [基本的なキーコード](ja/keycodes_basic.md)
|
||||||
* [機能](ja/features.md)
|
* [Quantum キーコード](ja/quantum_keycodes.md)
|
||||||
* [FAQ](ja/faq.md)
|
* [グレイブ エスケープ](ja/feature_grave_esc.md)
|
||||||
|
* [マウスキー](ja/feature_mouse_keys.md)
|
||||||
|
|
||||||
?> キーマップがどのように機能するかを感じながら、各変更を小さくしてください。大きな変更は、発生する問題のデバッグを困難にします。
|
?> キーマップがどのように機能するかを感じながら、各変更を小さくしてください。大きな変更は、発生する問題のデバッグを困難にします。
|
||||||
|
|
||||||
## ファームウェアをビルドする
|
## ファームウェアをビルドする :id=build-your-firmware
|
||||||
|
|
||||||
キーマップの変更が完了したら、ファームウェアをビルドする必要があります。これを行うには、ターミナルウィンドウに戻り、ビルドコマンドを実行します:
|
キーマップの変更が完了したら、ファームウェアをビルドする必要があります。これを行うには、ターミナルウィンドウに戻り、コンパイルコマンドを実行します:
|
||||||
|
|
||||||
make <my_keyboard>:<my_keymap>
|
qmk compile
|
||||||
|
|
||||||
たとえば、キーマップの名前が "xyverz" で、rev5 planck のキーマップを作成している場合、次のコマンドを使用します:
|
もし環境が設定されていない場合や、複数のキーボードを所持している場合は、キーボードやキーマップを指定することができます:
|
||||||
|
|
||||||
make planck/rev5:xyverz
|
qmk compile -kb <keyboard> -km <keymap>
|
||||||
|
|
||||||
これがコンパイルされる間、どのファイルがコンパイルされているかを知らせる多くの出力が画面に表示されます。
|
これがコンパイルされる間、どのファイルがコンパイルされているかを知らせる多くの出力が画面に表示されます。
|
||||||
次のような出力で終わるはずです。
|
次のような出力で終わるはずです:
|
||||||
|
|
||||||
```
|
```
|
||||||
Linking: .build/planck_rev5_xyverz.elf [OK]
|
Linking: .build/planck_rev5_default.elf [OK]
|
||||||
Creating load file for flashing: .build/planck_rev5_xyverz.hex [OK]
|
Creating load file for flashing: .build/planck_rev5_default.hex [OK]
|
||||||
Copying planck_rev5_xyverz.hex to qmk_firmware folder [OK]
|
Copying planck_rev5_default.hex to qmk_firmware folder [OK]
|
||||||
Checking file size of planck_rev5_xyverz.hex [OK]
|
Checking file size of planck_rev5_default.hex [OK]
|
||||||
* File size is fine - 18392/28672
|
* The firmware size is fine - 27312/28672 (95%, 1360 bytes free)
|
||||||
```
|
```
|
||||||
|
|
||||||
## ファームウェアを書きこむ
|
## ファームウェアを書きこむ
|
||||||
|
|||||||
+51
-324
@@ -2,27 +2,53 @@
|
|||||||
|
|
||||||
<!---
|
<!---
|
||||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||||
original document: ed0575fc8:docs/newbs_flashing.md
|
original document: 0.9.44:docs/newbs_flashing.md
|
||||||
git diff ed0575fc8 HEAD -- docs/newbs_flashing.md | cat
|
git diff 0.9.44 HEAD -- docs/newbs_flashing.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
カスタムファームウェアは出来たので、キーボードに書き込みたくなるでしょう/フラッシュしたくなるでしょう。
|
カスタムファームウェアは出来たので、キーボードに書き込みたくなるでしょう/フラッシュしたくなるでしょう。
|
||||||
|
|
||||||
|
## キーボードを DFU (Bootloader) モードにする
|
||||||
|
|
||||||
|
カスタムファームウェアを書き込むには、最初にキーボードを普段とは違う特別な状態、フラッシュモードにする必要があります。
|
||||||
|
このモードでは、キーボードはキーボードとしての機能を果たしません。
|
||||||
|
ファームウェアの書き込み中にキーボードのケーブルを抜いたり、書き込みプロセスを中断したりしないことが非常に重要です。
|
||||||
|
|
||||||
|
キーボードによって、この特別なモードに入る方法は異なります。
|
||||||
|
PCB が現在 QMK、TMK、PS2AVRGB (Bootmapper Client) を実行しており、キーボードメーカーから具体的な指示が与えられていない場合は、次を順番に試してください。
|
||||||
|
|
||||||
|
* 両方のシフトキーを押しながら、`Pause` キーを押す
|
||||||
|
* 両方のシフトキーを押しながら、`B` キーを押す
|
||||||
|
* キーボードのケーブルを抜いて、スペースバーと `B` を同時に押しながら、キーボードを再び接続し、1秒待ってからキーを放す
|
||||||
|
* キーボードのケーブルを抜いて、左上か左下のキー(通常は Escape か左 Control)を押しながらキーボードを接続する
|
||||||
|
* 通常、PCB の裏側に付けられている物理的な `RESET` ボタンを押す
|
||||||
|
* PCB 上の `RESET` か `GND` のラベルの付いたヘッダピンを探し、PCB 接続中にそれらを互いにショートする
|
||||||
|
|
||||||
|
上記を全て試してもうまくいかず、基板のメインチップに `STM32` と表示されている場合、これは少し複雑になる可能性があります。通常、最善の方法は [Discord](https://discord.gg/Uq7gcHh) で助けを求めることです。おそらく基板の写真をいくつか求められるでしょう。あらかじめそれらを準備することができれば物事を進めるのに役立ちます!
|
||||||
|
|
||||||
|
それ以外の場合は、QMK Toolbox で次のような黄色のメッセージが表示されます:
|
||||||
|
|
||||||
|
```
|
||||||
|
*** DFU device connected: Atmel Corp. ATmega32U4 (03EB:2FF4:0000)
|
||||||
|
```
|
||||||
|
|
||||||
|
そして、このブートローダデバイスはデバイスマネージャーやシステム情報.app、`lsusb` にも表示されます。
|
||||||
|
|
||||||
## QMK Toolbox を使ってキーボードに書き込む
|
## QMK Toolbox を使ってキーボードに書き込む
|
||||||
|
|
||||||
キーボードに書き込む最も簡単な方法は [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) を使うことです。
|
キーボードに書き込む最も簡単な方法は [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) を使うことです。
|
||||||
|
|
||||||
ただし、QMK Toolbox は、現在は Windows と macOS でしか使えません。
|
ただし、QMK Toolbox は、現在は Windows と macOS でしか使えません。
|
||||||
Linux を使用している場合(および、コマンドラインでファームウェアを書き込みたい場合)は、下の方で概説する[方法](ja/newbs_flashing.md#flash-your-keyboard-from-the-command-line)で行なう必要があります。
|
Linux を使用している場合(および、コマンドラインでファームウェアを書き込みたい場合)は、[コマンドラインからキーボードを書き込む](#flash-your-keyboard-from-the-command-line)節まで進んでください。
|
||||||
|
|
||||||
### QMK Toolbox にファイルをロードする
|
### QMK Toolbox にファイルをロードする
|
||||||
|
|
||||||
まず QMK Toolbox アプリケーションを起動します。
|
まず QMK Toolbox アプリケーションを起動します。
|
||||||
Finder またはエクスプローラーでファームウェアのファイルを探します。
|
Finder またはエクスプローラーでファームウェアのファイルを探します。
|
||||||
ファイル名は `.hex` または `.bin` のどちらかの形式です。
|
キーボードのファームウェアは `.hex` または `.bin` のどちらかの形式です。
|
||||||
ビルド時に QMK は、キーボードに適した形式のものを `qmk_firmware` のトップフォルダにコピーしているはずです。
|
ビルド時に QMK は、キーボードに適した形式のものを `qmk_firmware` のトップフォルダにコピーしているはずです。
|
||||||
|
|
||||||
Windows か macOS を使用しているときは現在のファームウェアフォルダをエクスプローラーか Finder で簡単に開くためのコマンドがあります。
|
Windows か macOS を使用している場合、現在のフォルダをエクスプローラーか Finder で簡単に開くためのコマンドがあります。
|
||||||
|
|
||||||
#### Windows
|
#### Windows
|
||||||
|
|
||||||
@@ -36,365 +62,66 @@ start .
|
|||||||
open .
|
open .
|
||||||
```
|
```
|
||||||
|
|
||||||
ファームウェアファイルは常に以下の命名形式に従っています。
|
ファームウェアファイルは常に以下の命名形式に従っています:
|
||||||
|
|
||||||
```
|
```
|
||||||
<keyboard_name>_<keymap_name>.{bin,hex}
|
<keyboard_name>_<keymap_name>.{bin,hex}
|
||||||
```
|
```
|
||||||
|
|
||||||
例えば、`plank/rev5` の `default` キーマップのファイル名は以下のようになります。
|
例えば、`plank/rev5` の `default` キーマップのファイル名は以下のようになります:
|
||||||
|
|
||||||
```
|
```
|
||||||
planck_rev5_default.hex
|
planck_rev5_default.hex
|
||||||
```
|
```
|
||||||
|
|
||||||
ファームウェアファイルを見つけたら、QMK Toolbox の "Local file" ボックスにドラッグするか、"Open" をクリックしてファームウェアファイルを指定します。
|
ファームウェアファイルを見つけたら、QMK Toolbox の "Local file" ボックスにドラッグするか、"Open" をクリックしてファームウェアファイルが格納されている場所を指定します。
|
||||||
|
|
||||||
### キーボードを DFU (Bootloader) モードにする
|
|
||||||
|
|
||||||
ファームウェアを書き込むには、キーボードを普段とは違う特別な状態、フラッシュモードにする必要があります。
|
|
||||||
このモードでは、キーボードはキーボードとしての機能をはたしません。
|
|
||||||
ファームウェアの書き込み中にキーボードのケーブルを抜いたり、書き込みプロセスを中断したりしないことが非常に重要です。
|
|
||||||
|
|
||||||
キーボードによって、この特別なモードに入る方法は異なります。
|
|
||||||
キーボードが現在 QMK または TMK を実行しており、キーボードメーカーから具体的な指示が与えられていない場合は、次を順番に試してください。
|
|
||||||
|
|
||||||
* 両方のシフトキーを押しながら、`Pause` キーを押す
|
|
||||||
* 両方のシフトキーを押しながら、`B` キーを押す
|
|
||||||
* キーボードのケーブルを抜いて、スペースバーとBを同時に押しながら、キーボードを再び接続し、1秒待ってからキーを放す
|
|
||||||
* 基板(PCB)に付けられている物理的な `RESET` ボタンを押す
|
|
||||||
* PCB 上の `BOOT0` か `RESET` のラベルの付いたヘッダピンを探し、PCB 接続中にそれらを互いにショートする
|
|
||||||
|
|
||||||
うまくいけば、QMK Toolbox に次のようなメッセージが表示されます。
|
|
||||||
|
|
||||||
```
|
|
||||||
*** Clueboard - Clueboard 66% HotSwap disconnected -- 0xC1ED:0x2390
|
|
||||||
*** DFU device connected
|
|
||||||
```
|
|
||||||
|
|
||||||
### キーボードへの書き込み
|
### キーボードへの書き込み
|
||||||
|
|
||||||
QMK Toolbox の `Flash` ボタンをクリックします。
|
QMK Toolbox の `Flash` ボタンをクリックします。次のような出力が表示されます。
|
||||||
次のような出力が表示されます。
|
|
||||||
|
|
||||||
```
|
```
|
||||||
*** Clueboard - Clueboard 66% HotSwap disconnected -- 0xC1ED:0x2390
|
*** DFU device connected: Atmel Corp. ATmega32U4 (03EB:2FF4:0000)
|
||||||
*** DFU device connected
|
|
||||||
*** Attempting to flash, please don't remove device
|
*** Attempting to flash, please don't remove device
|
||||||
>>> dfu-programmer atmega32u4 erase --force
|
>>> dfu-programmer.exe atmega32u4 erase --force
|
||||||
Erasing flash... Success
|
Erasing flash... Success
|
||||||
Checking memory from 0x0 to 0x6FFF... Empty.
|
Checking memory from 0x0 to 0x6FFF... Empty.
|
||||||
>>> dfu-programmer atmega32u4 flash /Users/skully/qmk_firmware/clueboard_66_hotswap_gen1_skully.hex
|
>>> dfu-programmer.exe atmega32u4 flash "D:\Git\qmk_firmware\gh60_satan_default.hex"
|
||||||
Checking memory from 0x0 to 0x55FF... Empty.
|
Checking memory from 0x0 to 0x3F7F... Empty.
|
||||||
0% 100% Programming 0x5600 bytes...
|
0% 100% Programming 0x3F80 bytes...
|
||||||
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
||||||
0% 100% Reading 0x7000 bytes...
|
0% 100% Reading 0x7000 bytes...
|
||||||
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
||||||
Validating... Success
|
Validating... Success
|
||||||
0x5600 bytes written into 0x7000 bytes memory (76.79%).
|
0x3F80 bytes written into 0x7000 bytes memory (56.70%).
|
||||||
>>> dfu-programmer atmega32u4 reset
|
>>> dfu-programmer.exe atmega32u4 reset
|
||||||
|
|
||||||
*** DFU device disconnected
|
*** DFU device disconnected: Atmel Corp: ATmega32U4 (03EB:2FF4:0000)
|
||||||
*** Clueboard - Clueboard 66% HotSwap connected -- 0xC1ED:0x2390
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## コマンドラインでファームウェアを書き込む :id=flash-your-keyboard-from-the-command-line
|
## コマンドラインでファームウェアを書き込む :id=flash-your-keyboard-from-the-command-line
|
||||||
|
|
||||||
これは、以前のものと比較して非常に単純になりました。
|
これは、以前のものと比較して非常に単純になりました。
|
||||||
ファームウェアをコンパイルして書き込む準備ができたら、ターミナルウィンドウを開いてビルドコマンドを実行します。
|
ファームウェアをコンパイルして書き込む準備ができたら、ターミナルウィンドウを開いて書き込みコマンドを実行します:
|
||||||
|
|
||||||
make <my_keyboard>:<my_keymap>:flash
|
qmk flash
|
||||||
|
|
||||||
たとえば、キーマップの名前が xyverz で、rev5 planck のキーマップを作成している場合、次のコマンドを使用します。
|
もし CLI でキーボードやキーマップ名を設定していない場合や、複数のキーボードを持っている場合、キーボードとキーマップを指定することができます:
|
||||||
|
|
||||||
make planck/rev5:xyverz:flash
|
qmk flash -kb <my_keyboard> -km <my_keymap>
|
||||||
|
|
||||||
これにより、キーボードの構成が確認され、指定されたブートローダに基づいてキーボードへの書き込みが試行されます。
|
これはキーボードの設定を確認し、指定されたブートローダに基づいて書き込もうとします。これはどのブートローダをキーボードが使っているか知る必要がないことを意味します。単にコマンドを実行し、コマンドに重い仕事をさせましょう。
|
||||||
これはあなたがキーボードが使用するブートローダを知る必要がないことを意味します。
|
|
||||||
コマンドをただ実行して、コマンド自身に難しい処理を任せます。
|
|
||||||
|
|
||||||
ただし、これはキーボードごとに設定されているブートローダに依存します。
|
ただし、これはキーボードごとに設定されているブートローダに依存します。
|
||||||
もしこの情報が設定されていない場合、または使用しているキーボードのファームウェアの書き込みにサポートしていないターゲットが設定されている場合、次のエラーが表示されます。
|
もし、この情報が設定されていない場合、または、使用しているキーボードが、ファームウェア書き込みでサポートされているターゲットを持っていない場合、次のエラーが表示されます:
|
||||||
|
|
||||||
WARNING: This board's bootloader is not specified or is not supported by the ":flash" target at this time.
|
WARNING: This board's bootloader is not specified or is not supported by the ":flash" target at this time.
|
||||||
|
|
||||||
この場合、あなたは明示的にブートローダを指定する方法を使わなければなりません。
|
この場合、あなたは明示的にブートローダを指定する方法を使わなければなりません。詳細は、[ファームウェアのフラッシュ](ja/flashing.md) ガイドを参照してください。
|
||||||
|
|
||||||
ブートローダは主に 5 種類のものが使われています。
|
|
||||||
Pro Micro とそのクローンは Caterina を、Teensy は HalfKay を、OLKB の AVR ボードは QMK-DFU を、その他の ATmega32U4 ボードは DFU を、そして多くの ARM ボードは ARM DFU を使います。
|
|
||||||
|
|
||||||
より詳しいブートローダの情報は、[Flashing Instructions and Bootloader Information](ja/flashing.md) にあります。
|
|
||||||
|
|
||||||
使用しているブートローダがわかっているならば、ファームウェアをコンパイルするときに、実は `make` コマンドにブートローダを指定するテキストを追加して、書き込みプロセスを自動化できます。
|
|
||||||
|
|
||||||
### DFU
|
|
||||||
|
|
||||||
DFU ブートローダの場合、ファームウェアをコンパイルして書き込む準備ができたら、ターミナルウィンドウを開いてビルドコマンドを実行します。
|
|
||||||
|
|
||||||
make <my_keyboard>:<my_keymap>:dfu
|
|
||||||
|
|
||||||
たとえば、キーマップの名前が xyverz で、rev5 planck のキーマップを作成している場合、次のコマンドを使用します。
|
|
||||||
|
|
||||||
make planck/rev5:xyverz:dfu
|
|
||||||
|
|
||||||
コンパイルが終了すると、以下の出力になるはずです。
|
|
||||||
|
|
||||||
```
|
|
||||||
Linking: .build/planck_rev5_xyverz.elf [OK]
|
|
||||||
Creating load file for flashing: .build/planck_rev5_xyverz.hex [OK]
|
|
||||||
Copying planck_rev5_xyverz.hex to qmk_firmware folder [OK]
|
|
||||||
Checking file size of planck_rev5_xyverz.hex
|
|
||||||
* File size is fine - 18574/28672
|
|
||||||
```
|
|
||||||
|
|
||||||
ここまでくると、ビルドスクリプトは5秒ごとに DFU ブートローダを探します。
|
|
||||||
デバイスが見つかるか、あなたがキャンセルするまで、以下を繰り返します。
|
|
||||||
|
|
||||||
dfu-programmer: no device present.
|
|
||||||
Error: Bootloader not found. Trying again in 5s.
|
|
||||||
|
|
||||||
これを実行したら、コントローラーをリセットする必要があります。
|
|
||||||
そして下のような出力が表示されます。
|
|
||||||
|
|
||||||
```
|
|
||||||
*** Attempting to flash, please don't remove device
|
|
||||||
>>> dfu-programmer atmega32u4 erase --force
|
|
||||||
Erasing flash... Success
|
|
||||||
Checking memory from 0x0 to 0x6FFF... Empty.
|
|
||||||
>>> dfu-programmer atmega32u4 flash /Users/skully/qmk_firmware/clueboard_66_hotswap_gen1_skully.hex
|
|
||||||
Checking memory from 0x0 to 0x55FF... Empty.
|
|
||||||
0% 100% Programming 0x5600 bytes...
|
|
||||||
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
|
||||||
0% 100% Reading 0x7000 bytes...
|
|
||||||
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
|
|
||||||
Validating... Success
|
|
||||||
0x5600 bytes written into 0x7000 bytes memory (76.79%).
|
|
||||||
>>> dfu-programmer atmega32u4 reset
|
|
||||||
```
|
|
||||||
|
|
||||||
?> `dfu-programmer:no device present` など、これに関する問題がある場合は、[よくある質問](ja/faq_build.md) を参照してください。
|
|
||||||
|
|
||||||
#### DFU コマンド
|
|
||||||
|
|
||||||
ファームウェアを DFU デバイスに書き込むために使用できる DFU コマンドがいくつかあります。
|
|
||||||
|
|
||||||
* `:dfu` - これが通常のオプションで、DFU デバイスが使用可能になるまで待機したのちファームウェアを書き込みます。5秒ごとに、DFU デバイスが存在するかチェックしています。
|
|
||||||
* `:dfu-ee` - 通常の hex ファイルの代わりに `eep` ファイルを書き込みます。これを使用するのはまれです。
|
|
||||||
* `:dfu-split-left` - デフォルトオプション (`:dfu`) と同様に、通常のファームウェアが書き込まれます。ただし、分割キーボードの「左側の」 EEPROM ファイルも書き込まれます。_これは、Elite C ベースの分割キーボードに最適です。_
|
|
||||||
* `:dfu-split-right` - デフォルトオプション (`:dfu`) と同様に、通常のファームウェアが書き込まれます。ただし、分割キーボードの「右側の」EEPROM ファイルも書き込まれます。_これは、Elite C ベースの分割キーボードに最適です。_
|
|
||||||
|
|
||||||
|
|
||||||
### Caterina
|
|
||||||
|
|
||||||
Arduino ボードとそれらのクローンの場合(たとえば SparkFun ProMicro)、ファームウェアをコンパイルして書き込む準備ができたら、ターミナルウィンドウを開いてビルドコマンドを実行します。
|
|
||||||
|
|
||||||
make <my_keyboard>:<my_keymap>:avrdude
|
|
||||||
|
|
||||||
たとえば、キーマップの名前が xyverz で、rev2 Lets Split のキーマップを作成している場合、次のコマンドを使用します。
|
|
||||||
|
|
||||||
make lets_split/rev2:xyverz:avrdude
|
|
||||||
|
|
||||||
ファームウェアのコンパイルが完了すると、以下のように出力されます。
|
|
||||||
|
|
||||||
```
|
|
||||||
Linking: .build/lets_split_rev2_xyverz.elf [OK]
|
|
||||||
Creating load file for flashing: .build/lets_split_rev2_xyverz.hex [OK]
|
|
||||||
Checking file size of lets_split_rev2_xyverz.hex [OK]
|
|
||||||
* File size is fine - 27938/28672
|
|
||||||
Detecting USB port, reset your controller now..............
|
|
||||||
```
|
|
||||||
|
|
||||||
この時点で、キーボードをリセットすると、スクリプトがブートローダを検出し、キーボードに書き込みます。出力は次のようになります。
|
|
||||||
|
|
||||||
```
|
|
||||||
Detected controller on USB port at /dev/ttyS15
|
|
||||||
|
|
||||||
Connecting to programmer: .
|
|
||||||
Found programmer: Id = "CATERIN"; type = S
|
|
||||||
Software Version = 1.0; No Hardware Version given.
|
|
||||||
Programmer supports auto addr increment.
|
|
||||||
Programmer supports buffered memory access with buffersize=128 bytes.
|
|
||||||
|
|
||||||
Programmer supports the following devices:
|
|
||||||
Device code: 0x44
|
|
||||||
|
|
||||||
avrdude.exe: AVR device initialized and ready to accept instructions
|
|
||||||
|
|
||||||
Reading | ################################################## | 100% 0.00s
|
|
||||||
|
|
||||||
avrdude.exe: Device signature = 0x1e9587 (probably m32u4)
|
|
||||||
avrdude.exe: NOTE: "flash" memory has been specified, an erase cycle will be performed
|
|
||||||
To disable this feature, specify the -D option.
|
|
||||||
avrdude.exe: erasing chip
|
|
||||||
avrdude.exe: reading input file "./.build/lets_split_rev2_xyverz.hex"
|
|
||||||
avrdude.exe: input file ./.build/lets_split_rev2_xyverz.hex auto detected as Intel Hex
|
|
||||||
avrdude.exe: writing flash (27938 bytes):
|
|
||||||
|
|
||||||
Writing | ################################################## | 100% 2.40s
|
|
||||||
|
|
||||||
avrdude.exe: 27938 bytes of flash written
|
|
||||||
avrdude.exe: verifying flash memory against ./.build/lets_split_rev2_xyverz.hex:
|
|
||||||
avrdude.exe: load data flash data from input file ./.build/lets_split_rev2_xyverz.hex:
|
|
||||||
avrdude.exe: input file ./.build/lets_split_rev2_xyverz.hex auto detected as Intel Hex
|
|
||||||
avrdude.exe: input file ./.build/lets_split_rev2_xyverz.hex contains 27938 bytes
|
|
||||||
avrdude.exe: reading on-chip flash data:
|
|
||||||
|
|
||||||
Reading | ################################################## | 100% 0.43s
|
|
||||||
|
|
||||||
avrdude.exe: verifying ...
|
|
||||||
avrdude.exe: 27938 bytes of flash verified
|
|
||||||
|
|
||||||
avrdude.exe: safemode: Fuses OK (E:CB, H:D8, L:FF)
|
|
||||||
|
|
||||||
avrdude.exe done. Thank you.
|
|
||||||
```
|
|
||||||
うまくいかない時は、以下のようにする必要があるかもしれません。
|
|
||||||
|
|
||||||
sudo make <my_keyboard>:<my_keymap>:avrdude
|
|
||||||
|
|
||||||
|
|
||||||
#### Caterina コマンド
|
|
||||||
|
|
||||||
ファームウェアを DFU デバイスに書き込むために使用できる DFU コマンドがいくつかあります。
|
|
||||||
|
|
||||||
* `:avrdude` - これが通常のオプションで、Caterina デバイスが(新しい COM ポートを検出して)使用可能になるまで待機し、ファームウェアを書き込みます。
|
|
||||||
* `:avrdude-loop` - これは `:avrdude` と同じです。ただし書き込みが終了すると再び Caterina デバイスの書き込み待ちに戻ります。これは何台ものデバイスへの書き込みに便利です。_Control+C を押して、手動でこの繰り返しを終了させる必要があります。_
|
|
||||||
* `:avrdude-split-left` - デフォルトオプション(`:avrdude`)と同様に通常のファームウェアが書き込まれます。ただし、分割キーボードの「左側の」EEPROM ファイルもフラッシュされます。 _これは、Pro Micro ベースの分割キーボードに最適です。_
|
|
||||||
* `:avrdude-split-right` - デフォルトオプション(`:avrdude`)と同様に通常のファームウェアが書き込まれます。ただし、分割キーボードの「右側の」EEPROM ファイルもフラッシュされます。 _これは、Pro Micro ベースの分割キーボードに最適です。_
|
|
||||||
|
|
||||||
### HalfKay
|
|
||||||
|
|
||||||
PJRC デバイス(Teensy シリーズ)の場合、ファームウェアをコンパイルして書き込む準備ができたら、ターミナルウィンドウを開いてビルドコマンドを実行します。
|
|
||||||
|
|
||||||
make <my_keyboard>:<my_keymap>:teensy
|
|
||||||
|
|
||||||
たとえば、キーマップの名前が xyverz で、Ergodox または Ergodox EZ のキーマップを作成している場合、次のコマンドを使用します。
|
|
||||||
|
|
||||||
make ergodox_ez:xyverz:teensy
|
|
||||||
|
|
||||||
ファームウェアのコンパイルが完了すると、以下のように出力されます。
|
|
||||||
|
|
||||||
```
|
|
||||||
Linking: .build/ergodox_ez_xyverz.elf [OK]
|
|
||||||
Creating load file for flashing: .build/ergodox_ez_xyverz.hex [OK]
|
|
||||||
Checking file size of ergodox_ez_xyverz.hex [OK]
|
|
||||||
* File size is fine - 25584/32256
|
|
||||||
Teensy Loader, Command Line, Version 2.1
|
|
||||||
Read "./.build/ergodox_ez_xyverz.hex": 25584 bytes, 79.3% usage
|
|
||||||
Waiting for Teensy device...
|
|
||||||
(hint: press the reset button)
|
|
||||||
```
|
|
||||||
|
|
||||||
この時点で、キーボードをリセットします。すると、次のような出力が表示されます。
|
|
||||||
|
|
||||||
```
|
|
||||||
Found HalfKay Bootloader
|
|
||||||
Read "./.build/ergodox_ez_xyverz.hex": 28532 bytes, 88.5% usage
|
|
||||||
Programming............................................................................................................................................................................
|
|
||||||
...................................................
|
|
||||||
Booting
|
|
||||||
```
|
|
||||||
|
|
||||||
### STM32 (ARM)
|
|
||||||
|
|
||||||
主な ARM ボード (Proton C, Planck Rev 6, Preonic Rev 3 を含む)の場合、ファームウェアをコンパイルして書き込む準備ができたら、ターミナルウィンドウを開いてビルドコマンドを実行します。
|
|
||||||
|
|
||||||
make <my_keyboard>:<my_keymap>:dfu-util
|
|
||||||
|
|
||||||
たとえば、キーマップの名前が xyverz で、Planck Revision 6 のキーマップを作成している場合、次のコマンドを使用し、(コンパイルが終わる前に)キーボードを再起動してブートローダを起動します:
|
|
||||||
|
|
||||||
make planck/rev6:xyverz:dfu-util
|
|
||||||
|
|
||||||
ファームウェアのコンパイルが完了すると、以下のように出力されます。
|
|
||||||
|
|
||||||
```
|
|
||||||
Linking: .build/planck_rev6_xyverz.elf [OK]
|
|
||||||
Creating binary load file for flashing: .build/planck_rev6_xyverz.bin [OK]
|
|
||||||
Creating load file for flashing: .build/planck_rev6_xyverz.hex [OK]
|
|
||||||
|
|
||||||
Size after:
|
|
||||||
text data bss dec hex filename
|
|
||||||
0 41820 0 41820 a35c .build/planck_rev6_xyverz.hex
|
|
||||||
|
|
||||||
Copying planck_rev6_xyverz.bin to qmk_firmware folder [OK]
|
|
||||||
dfu-util 0.9
|
|
||||||
|
|
||||||
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
|
|
||||||
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
|
|
||||||
This program is Free Software and has ABSOLUTELY NO WARRANTY
|
|
||||||
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
|
|
||||||
|
|
||||||
Invalid DFU suffix signature
|
|
||||||
A valid DFU suffix will be required in a future dfu-util release!!!
|
|
||||||
Opening DFU capable USB device...
|
|
||||||
ID 0483:df11
|
|
||||||
Run-time device DFU version 011a
|
|
||||||
Claiming USB DFU Interface...
|
|
||||||
Setting Alternate Setting #0 ...
|
|
||||||
Determining device status: state = dfuERROR, status = 10
|
|
||||||
dfuERROR, clearing status
|
|
||||||
Determining device status: state = dfuIDLE, status = 0
|
|
||||||
dfuIDLE, continuing
|
|
||||||
DFU mode device DFU version 011a
|
|
||||||
Device returned transfer size 2048
|
|
||||||
DfuSe interface name: "Internal Flash "
|
|
||||||
Downloading to address = 0x08000000, size = 41824
|
|
||||||
Download [=========================] 100% 41824 bytes
|
|
||||||
Download done.
|
|
||||||
File downloaded successfully
|
|
||||||
Transitioning to dfuMANIFEST state
|
|
||||||
```
|
|
||||||
|
|
||||||
#### STM32 コマンド
|
|
||||||
|
|
||||||
ファームウェアを STM32 デバイスに書き込むために使用できる DFU コマンドがいくつかあります。
|
|
||||||
|
|
||||||
* `:dfu-util` - STM32 デバイスに書き込むためのデフォルトコマンドで、STM32 ブートローダが見つかるまで待機します。
|
|
||||||
* `:dfu-util-split-left` - デフォルトのオプション (`:dfu-util`) と同様に、通常のファームウェアが書き込まれます。 ただし、分割キーボードの「左側の」EEPROM の設定も行われます。
|
|
||||||
* `:dfu-util-split-right` - デフォルトのオプション (`:dfu-util`) と同様に、通常のファームウェアが書き込まれます。 ただし、分割キーボードの「右側の」EEPROM の設定も行われます。
|
|
||||||
* `:st-link-cli` - dfu-util ではなく、ST-LINK の CLI ユーティリティを介してファームウェアを書き込めます。
|
|
||||||
|
|
||||||
### BootloadHID
|
|
||||||
|
|
||||||
Bootmapper Client(BMC)/bootloadHID/ATmega32A ベースのキーボードの場合、ファームウェアをコンパイルして書き込む準備ができたら、ターミナルウィンドウを開いてビルドコマンドを実行します。
|
|
||||||
|
|
||||||
make <my_keyboard>:<my_keymap>:bootloaderHID
|
|
||||||
|
|
||||||
たとえば、キーマップの名前が xyverz で、jj40 のキーマップを作成している場合、次のコマンドを使用します。
|
|
||||||
|
|
||||||
make jj40:xyverz:bootloaderHID
|
|
||||||
|
|
||||||
ファームウェアのコンパイルが完了すると、以下のように出力されます。
|
|
||||||
|
|
||||||
```
|
|
||||||
Linking: .build/jj40_default.elf [OK]
|
|
||||||
Creating load file for flashing: .build/jj40_default.hex [OK]
|
|
||||||
Copying jj40_default.hex to qmk_firmware folder [OK]
|
|
||||||
Checking file size of jj40_default.hex [OK]
|
|
||||||
* The firmware size is fine - 21920/28672 (6752 bytes free)
|
|
||||||
```
|
|
||||||
|
|
||||||
ここまでくると、ビルドスクリプトは5秒ごとに DFU ブートローダを探します。
|
|
||||||
デバイスが見つかるか、あなたがキャンセルするまで、以下を繰り返します。
|
|
||||||
|
|
||||||
```
|
|
||||||
Error opening HIDBoot device: The specified device was not found
|
|
||||||
Trying again in 5s.
|
|
||||||
```
|
|
||||||
|
|
||||||
これを実行したら、コントローラーをリセットする必要があります。
|
|
||||||
そして下のような出力が表示されます。
|
|
||||||
|
|
||||||
```
|
|
||||||
Page size = 128 (0x80)
|
|
||||||
Device size = 32768 (0x8000); 30720 bytes remaining
|
|
||||||
Uploading 22016 (0x5600) bytes starting at 0 (0x0)
|
|
||||||
0x05580 ... 0x05600
|
|
||||||
```
|
|
||||||
|
|
||||||
## テストしましょう!
|
## テストしましょう!
|
||||||
|
|
||||||
おめでとうございます! カスタムファームウェアがキーボードにプログラムされました!
|
おめでとうございます! カスタムファームウェアがキーボードにプログラムされました!
|
||||||
|
|
||||||
使ってみて、すべてがあなたの望むように動作するかどうか確認してください。
|
使ってみて、すべてがあなたの望むように動作するかどうか確認してください。
|
||||||
この初心者ガイドを完全なものにするために [テストとデバッグ](ja/newbs_testing_debugging.md) を書いたので、カスタム機能のトラブルシューティング方法については、こちらをご覧ください。
|
この初心者ガイドを完全なものにするために [テストとデバッグ](ja/newbs_testing_debugging.md) を書いたので、ファームウェアの検証とカスタム機能のトラブルシューティング方法について学ぶには、こちらをご覧ください。
|
||||||
@@ -1,34 +1,22 @@
|
|||||||
# イントロダクション
|
# QMK 環境の構築
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||||
original document: 161d469:docs/newbs_getting_started.md
|
original document: 0.9.44:docs/newbs_getting_started.md
|
||||||
git diff 161d469 HEAD -- docs/newbs_getting_started.md | cat
|
git diff 0.9.44 HEAD -- docs/newbs_getting_started.md | cat
|
||||||
-->
|
-->
|
||||||
|
|
||||||
キーボードにはプロセッサが入っており、それはコンピュータに入っているものと大して違わないものです。
|
|
||||||
このプロセッサでは、キーボードのボタンの押し下げの検出を担当しキーボードのどのボタンが押されている/離されているかのレポートをコンピュータに送信するソフトウェアが動作しています。
|
|
||||||
QMK は、そのソフトウェアの役割を果たし、ボタンの押下を検出しその情報をホストコンピュータに渡します。
|
|
||||||
カスタムキーマップを作るということは、キーボード上で動くプログラムを作るということなのです。
|
|
||||||
|
|
||||||
QMK は、簡単なことは簡単に、そして、難しいことを可能なことにすることで、あなたの手にたくさんのパワーをもたらします。
|
|
||||||
パワフルなキーマップを作るためにプログラムを作成する方法を知る必要はありません。いくつかのシンプルな文法に従うだけで OK です。
|
|
||||||
|
|
||||||
# はじめに
|
|
||||||
|
|
||||||
キーマップをビルドする前に、いくつかのソフトウェアをインストールしてビルド環境を構築する必要があります。
|
キーマップをビルドする前に、いくつかのソフトウェアをインストールしてビルド環境を構築する必要があります。
|
||||||
ファームウェアをコンパイルするキーボードの数に関わらず、この作業を一度だけ実行する必要があります。
|
ファームウェアをコンパイルするキーボードの数に関わらず、この作業を一度だけ実行する必要があります。
|
||||||
|
|
||||||
もし、GUI で作業をしたい場合、オンラインで作業できる [QMK Configurator](https://config.qmk.fm) を使ってください。
|
## 1. ソフトウェアのダウンロード
|
||||||
使い方は [オンライン GUI を使用して初めてのファームウェアを構築する](ja/newbs_building_firmware_configurator.md) を参照してください。
|
|
||||||
|
|
||||||
## ソフトウェアのダウンロード
|
始めるために必要なソフトウェアがいくつかあります。
|
||||||
|
|
||||||
### テキストエディタ
|
### テキストエディタ
|
||||||
|
|
||||||
GUI を使わない場合、プレーンテキストを編集・保存できるエディタが必要です。
|
**プレーンテキスト** ファイルを編集して保存できるプログラムが必要です。
|
||||||
Windows の場合、メモ帳が使えます。Linux の場合、gedit が使えます。
|
Windows の場合、メモ帳が使えます。Linux の場合、gedit が使えます。どちらもシンプルですが機能的なテキストエディタです。
|
||||||
どちらもシンプルですが機能的なテキストエディタです。
|
|
||||||
macOS では、デフォルトのテキストエディットアプリに注意してください。_フォーマット_ メニューから _標準テキストにする_ を選択しない限り、プレーンテキストとして保存されません。
|
macOS では、デフォルトのテキストエディットアプリに注意してください。_フォーマット_ メニューから _標準テキストにする_ を選択しない限り、プレーンテキストとして保存されません。
|
||||||
|
|
||||||
[Sublime Text](https://www.sublimetext.com/) や [VS Code](https://code.visualstudio.com/) のような専用のテキストエディタをダウンロードしてインストールすることもできます。これらのプログラムはコードを編集するために特別に作成されているため、これはプラットフォームに関係なくベストな方法です。
|
[Sublime Text](https://www.sublimetext.com/) や [VS Code](https://code.visualstudio.com/) のような専用のテキストエディタをダウンロードしてインストールすることもできます。これらのプログラムはコードを編集するために特別に作成されているため、これはプラットフォームに関係なくベストな方法です。
|
||||||
@@ -45,78 +33,124 @@ QMK Toolbox は、Windows と macOS で使える GUI を備えたプログラム
|
|||||||
* Windows 版: `qmk_toolbox.exe` (portable) または `qmk_toolbox_install.exe` (installer)
|
* Windows 版: `qmk_toolbox.exe` (portable) または `qmk_toolbox_install.exe` (installer)
|
||||||
* macOS 版: `QMK.Toolbox.app.zip` (portable) または `QMK.Toolbox.pkg` (installer)
|
* macOS 版: `QMK.Toolbox.app.zip` (portable) または `QMK.Toolbox.pkg` (installer)
|
||||||
|
|
||||||
## 環境構築 :id=set-up-your-environment
|
### Unix ライクな環境
|
||||||
|
|
||||||
|
Linux や macOS には既に実行可能な unix シェルが付属しています。ビルド環境を構築するだけで済みます。
|
||||||
|
|
||||||
|
Windows では、MSYS2 や WSL をインストールして、これらの環境を使う必要があります。MSYS2 の構築手順を以下に示します。
|
||||||
|
|
||||||
|
## 2. ビルド環境を準備する :id=set-up-your-environment
|
||||||
|
|
||||||
私たちは、QMK を可能な限り簡単に構築できるように努力しています。
|
私たちは、QMK を可能な限り簡単に構築できるように努力しています。
|
||||||
Linux か Unix 環境を用意するだけで、QMK に残りをインストールさせることができます。
|
Linux か Unix 環境を用意するだけで、QMK に残りをインストールさせることができます。
|
||||||
|
|
||||||
?> もし、Linux か Unix のコマンドを使ったことがない場合、こちらで基本的な概念や各種コマンドを学んでください。これらの教材で QMK を使うのに必要なことを学ぶことができます。
|
?> もし、Linux か Unix のコマンドを使ったことがない場合、こちらで基本的な概念や各種コマンドを学んでください。これらの教材で QMK を使うのに必要なことを学ぶことができます:<br>
|
||||||
|
|
||||||
[Must Know Linux Commands](https://www.guru99.com/must-know-linux-commands.html)<br>
|
[Must Know Linux Commands](https://www.guru99.com/must-know-linux-commands.html)<br>
|
||||||
[Some Basic Unix Commands](https://www.tjhsst.edu/~dhyatt/superap/unixcmd.html)
|
[Some Basic Unix Commands](https://www.tjhsst.edu/~dhyatt/superap/unixcmd.html)
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
|
|
||||||
MSYS2 と Git のインストールが必要です。
|
MSYS2 と Git と QMK CLI のインストールが必要です。
|
||||||
|
|
||||||
* [MSYS2 homepage](http://www.msys2.org) の手順に従って MSYS2 をインストールします。
|
[MSYS2 homepage](http://www.msys2.org) のインストール手順に従ってください。開いている MSYS2 の全ターミナル画面を閉じて、新しい MinGW 64-bit ターミナル画面を開きます。**注意: これはインストールが完了した時に開く MSYS ターミナルと同じ *ではありません*。**
|
||||||
* 開いている MSYS2 の全ターミナル画面を閉じて、新しい MSYS2 MinGW 64-bit のターミナル画面を開きます。
|
|
||||||
* `pacman -S git` を実行して Git をインストールします。
|
それから、次のように実行します:
|
||||||
|
|
||||||
|
pacman --needed --noconfirm --disable-download-timeout -S git mingw-w64-x86_64-toolchain mingw-w64-x86_64-python3-pip
|
||||||
|
python3 -m pip install qmk
|
||||||
|
|
||||||
### macOS
|
### macOS
|
||||||
|
|
||||||
[Homebrew homepage](https://brew.sh) の手順に従って Homebrew をインストールしてください。
|
Homebrew のインストールが必要です。[Homebrew homepage](https://brew.sh) の手順に従ってください。
|
||||||
|
|
||||||
Homebrew をインストールしたら、以下の _QMK の設定_ に進んでください。そのステップでは、他のパッケージをインストールするスクリプトを実行します。
|
Homebrew をインストールした後で、以下のコマンドを実行します:
|
||||||
|
|
||||||
|
brew install qmk/qmk/qmk
|
||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
|
|
||||||
Git のインストールが必要です。既にインストールされている可能性は高いですが、そうでない場合、次のコマンドでインストールできます。
|
Git と Python をインストールする必要があります。両方とも既にインストールされている可能性は高いですが、そうでない場合、次のコマンドのいずれかでそれらをインストールできます:
|
||||||
|
|
||||||
* Debian / Ubuntu / Devuan: `apt-get install git`
|
* Debian / Ubuntu / Devuan: `sudo apt install git python3 python3-pip`
|
||||||
* Fedora / Red Hat / CentOS: `yum install git`
|
* Fedora / Red Hat / CentOS: `sudo yum install git python3 python3-pip`
|
||||||
* Arch: `pacman -S git`
|
* Arch / Manjaro: `sudo pacman -S git python python-pip python-setuptools libffi`
|
||||||
|
|
||||||
?> 全てのプラットフォームにおいて、Docker を使うことも可能です。[詳細はこちらをクリックしてください](ja/getting_started_build_tools.md#docker)。
|
グローバル CLI をインストールして、システムをブートストラップします:
|
||||||
|
|
||||||
## QMK の設定 :id=set-up-qmk
|
`python3 -m pip install --user qmk` (Arch ベースのディストリビューションでは AUR から `qmk` パッケージを試すこともできます(**メモ**: コミュニティメンバーによって保守されています): `yay -S qmk`)
|
||||||
|
|
||||||
Linux/Unix 環境が準備できたら QMK のダウンロードの準備は完了です。Git を使用して QMK のリポジトリを「クローン」することで QMK をダウンロードします。ターミナルか MSYS2 MinGW ウィンドウを開いて、このガイドの残りの部分では開いたままにします。そのウィンドウ内で、次の2つのコマンドを実行します。
|
### FreeBSD
|
||||||
|
|
||||||
```shell
|
Git と Python をインストールする必要があります。両方とも既にインストールされている可能性は高いですが、そうでない場合、次のコマンドを実行してそれらをインストールします:
|
||||||
git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
|
|
||||||
cd qmk_firmware
|
|
||||||
```
|
|
||||||
|
|
||||||
?> 既に [GitHub の使いかた](ja/getting_started_github.md)を知っているなら、clone ではなく fork を勧めます。この一文の意味が分からない場合、このメッセージは無視してかまいません。
|
pkg install git python3
|
||||||
|
|
||||||
QMK には、必要な残りの設定を手助けするスクリプトが含まれています。
|
ローカルにインストールした Python パッケージが利用できるように、`$HOME/.local/bin` が `$PATH` に追加されていることを確認してください。
|
||||||
セットアップ作業を完了させるため、次のコマンドを実行します。
|
|
||||||
|
|
||||||
util/qmk_install.sh
|
インストール完了後、QMK CLI をインストールできます:
|
||||||
|
|
||||||
## ビルド環境の確認
|
python3 -m pip install --user qmk
|
||||||
|
|
||||||
これで QMK のビルド環境が用意できましたので、キーボードのファームウェアをビルドできます。
|
## 3. QMK の設定を行う :id=set-up-qmk
|
||||||
|
|
||||||
|
QMK のインストール後に、このコマンドで設定できます:
|
||||||
|
|
||||||
|
qmk setup
|
||||||
|
|
||||||
|
ほとんどの場合、全てのプロンプトに Yes と答えます。
|
||||||
|
|
||||||
|
?>**Debian、Ubuntu、それらの派生に関する注意**:
|
||||||
|
次のようなエラーが表示される可能性があります: `bash: qmk: command not found`.
|
||||||
|
これは Debian の Bash 4.4 リリースで導入された [バグ](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=839155) で、`$HOME/.local/bin` が PATH から削除されました。このバグは後に Debian や Ubuntu で修正されました。
|
||||||
|
残念なことに、Ubuntu はこのバグを再導入し、[まだ修正していません](https://bugs.launchpad.net/ubuntu/+source/bash/+bug/1588562)。
|
||||||
|
幸い、修正は簡単です。これをあなたのユーザで実行します: `echo 'PATH="$HOME/.local/bin:$PATH"' >> $HOME/.bashrc && source $HOME/.bashrc`
|
||||||
|
|
||||||
|
?>**FreeBSD に関する注意**:
|
||||||
|
まず、`root` 以外のユーザで `qmk setup` を実行することをお勧めしますが、これはおそらく `pkg` を使って基本システムにインストールする必要があるパッケージを識別します。
|
||||||
|
しかし、特権のないユーザで実行すると、インストールはおそらく失敗します。
|
||||||
|
基本的な依存関係を手動でインストールするには、`./util/qmk_install.sh` を `root` として実行するか、`sudo` をつけて実行します。
|
||||||
|
それが完了したら、`qmk setup` を再実行して設定と確認を完了させます。
|
||||||
|
|
||||||
|
?> 既に [GitHub の使いかた](ja/getting_started_github.md)を知っているなら、fork を作成し、`qmk setup <github_username>/qmk_firmware` を使って個人用の fork から clone することをお勧めします。この一文の意味が分からない場合、このメッセージは無視してかまいません。
|
||||||
|
|
||||||
|
## 4. ビルド環境の確認
|
||||||
|
|
||||||
|
これで QMK のビルド環境が用意できたので、キーボードのファームウェアをビルドできます。
|
||||||
キーボードのデフォルトキーマップをビルドすることから始めます。次の形式のコマンドでビルドできるはずです。
|
キーボードのデフォルトキーマップをビルドすることから始めます。次の形式のコマンドでビルドできるはずです。
|
||||||
|
|
||||||
make <keyboard>:default
|
qmk compile -kb <keyboard> -km default
|
||||||
|
|
||||||
例)Clueboard 66% のファームウェアをビルドする
|
例えば、Clueboard 66% のファームウェアをビルドする場合:
|
||||||
|
|
||||||
make clueboard/66/rev3:default
|
qmk compile -kb clueboard/66/rev3 -km default
|
||||||
|
|
||||||
大量の出力の最後に次のように出力されると完了です。
|
大量の出力の最後に次のように出力されると完了です:
|
||||||
|
|
||||||
```
|
```
|
||||||
Linking: .build/clueboard_66_rev3_default.elf [OK]
|
Linking: .build/clueboard_66_rev3_default.elf [OK]
|
||||||
Creating load file for flashing: .build/clueboard_66_rev3_default.hex [OK]
|
Creating load file for flashing: .build/clueboard_66_rev3_default.hex [OK]
|
||||||
Copying clueboard_66_rev3_default.hex to qmk_firmware folder [OK]
|
Copying clueboard_66_rev3_default.hex to qmk_firmware folder [OK]
|
||||||
Checking file size of clueboard_66_rev3_default.hex [OK]
|
Checking file size of clueboard_66_rev3_default.hex [OK]
|
||||||
* The firmware size is fine - 26356/28672 (2316 bytes free)
|
* The firmware size is fine - 26356/28672 (2316 bytes free)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 5. ビルド環境の設定(オプション)
|
||||||
|
|
||||||
|
ビルド環境を設定してデフォルトを設定することで、QMK での作業をあまり面倒くさくないようにすることができます。今からやりましょう!
|
||||||
|
|
||||||
|
QMK を初めて使うほとんどの人は、キーボードを1つしか持っていません。`qmk config` コマンドでこのキーボードをデフォルトとして設定できます。例えば、デフォルトのキーボードを `clueboard/66/rev4` に設定するには:
|
||||||
|
|
||||||
|
qmk config user.keyboard=clueboard/66/rev4
|
||||||
|
|
||||||
|
デフォルトキーマップ名を設定することもできます。ほとんどの人はここで GitHub ユーザ名を使いますが、そうすることをお勧めします。
|
||||||
|
|
||||||
|
qmk config user.keymap=<github_username>
|
||||||
|
|
||||||
|
この後、これらの引数をオフにして、次のようにキーボードをコンパイルできます:
|
||||||
|
|
||||||
|
qmk compile
|
||||||
|
|
||||||
# キーマップの作成
|
# キーマップの作成
|
||||||
|
|
||||||
これであなた専用のキーマップを作成する準備ができました!
|
これであなた専用のキーマップを作成する準備ができました!
|
||||||
次は [Building Your First Firmware](ja/newbs_building_firmware.md) で専用のキーマップを作成します。
|
次は [初めてのファームウェアの構築](ja/newbs_building_firmware.md) で専用のキーマップを作成します。
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
# ワンショットキー
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.34:docs/one_shot_keys.md
|
||||||
|
git diff 0.9.34 HEAD -- docs/one_shot_keys.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
ワンショットキーは次のキーが押されるまでアクティブのままになり、そのあと放されるキーです。これにより一度に1つ以上のキーを押すことなく、キーボードの組み合わせを入力することができます。これらのキーは通常「スティッキーキー」あるいは「デッドキー」と呼ばれます。
|
||||||
|
|
||||||
|
例えば、キーを `OSM(MOD_LSFT)` と定義する場合、最初にシフトを押して放し、続いて A を押して放すことで、大文字の A キャラクタを入力することができます。コンピュータには、シフトが押された瞬間にシフトが押し続けられ、A が放された後ですぐにシフトキーが放されるように見えます。
|
||||||
|
|
||||||
|
ワンショットキーは通常のモディファイアのようにも動作します。ワンショットキーを押しながら他のキーを入力すると、キーを放した直後にワンショットキーが解除されます。
|
||||||
|
|
||||||
|
さらに、短時間でキーを5回押すと、そのキーをロックします。これはワンショットモディファイアとワンショットレイヤーに適用され、`ONESHOT_TAP_TOGGLE` 定義によって制御されます。
|
||||||
|
|
||||||
|
`config.h` でこれらを定義することでワンショットキーの挙動を制御することができます:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define ONESHOT_TAP_TOGGLE 5 /* この回数をタップすると、もう一度タップするまでキーが押されたままになります。*/
|
||||||
|
#define ONESHOT_TIMEOUT 5000 /* ワンショットキーが解除されるまでの時間 (ms) */
|
||||||
|
```
|
||||||
|
|
||||||
|
* `OSM(mod)` - *mod*を一時的に押し続けます。[モッドタップ](ja/mod_tap.md)で示したように、`KC_*` コードでは無く、`MOD_*` キーコードを使わなければなりません。
|
||||||
|
* `OSL(layer)` - 一時的に*レイヤー*に切り替えます。
|
||||||
|
|
||||||
|
ワンショットキーをマクロあるいはタップダンスルーチンの一部として有効にしたい場合があります。
|
||||||
|
|
||||||
|
ワンショットレイヤーについては、キーを押した時に `set_oneshot_layer(LAYER, ONESHOT_START)` を呼び出し、キーを放した時に `clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED)` を呼び出す必要があります。ワンショットをキャンセルする場合は、`reset_oneshot_layer()` を呼び出してください。
|
||||||
|
|
||||||
|
ワンショットモッドについては、設定するためには `set_oneshot_mods(MOD)` を呼び出し、キャンセルするためには `clear_oneshot_mods()` を呼び出す必要があります。
|
||||||
|
|
||||||
|
!> リモートデスクトップ接続で OSM 変換に問題がある場合は、設定を開いて「ローカル リソース」タブに移動し、キーボードセクションでドロップダウンを「このコンピューター」に変更することで修正することができます。これにより問題が修正され、OSM がリモートデスクトップ上で適切に動作するようになります。
|
||||||
|
|
||||||
|
## コールバック
|
||||||
|
|
||||||
|
ワンショットキーを押す時にカスタムロジックを実行したい場合、実装を選択できる幾つかのコールバックがあります。例えば、LED を点滅させたり、音を鳴らしたりして、ワンショットキーの変化を示すことができます。
|
||||||
|
|
||||||
|
`OSM(mod)` のためのコールバックがあります。ワンショット修飾キーの状態が変更されるたびに呼び出されます: オンに切り替わる時だけでなく、オフに切り替わる時にも呼び出されます。以下のように使うことができます:
|
||||||
|
|
||||||
|
```c
|
||||||
|
void oneshot_mods_changed_user(uint8_t mods) {
|
||||||
|
if (mods & MOD_MASK_SHIFT) {
|
||||||
|
println("Oneshot mods SHIFT");
|
||||||
|
}
|
||||||
|
if (mods & MOD_MASK_CTRL) {
|
||||||
|
println("Oneshot mods CTRL");
|
||||||
|
}
|
||||||
|
if (mods & MOD_MASK_ALT) {
|
||||||
|
println("Oneshot mods ALT");
|
||||||
|
}
|
||||||
|
if (mods & MOD_MASK_GUI) {
|
||||||
|
println("Oneshot mods GUI");
|
||||||
|
}
|
||||||
|
if (!mods) {
|
||||||
|
println("Oneshot mods off");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`mods` 引数は変更後のアクティブな mod が含まれるため、現在の状態が反映されます。
|
||||||
|
|
||||||
|
(`config.h` に `#define ONESHOT_TAP_TOGGLE 2` を追加して) ワンショットタップトグルを使う場合、指定された回数だけ修飾キーを押してロックすることができます。そのためのコールバックもあります:
|
||||||
|
|
||||||
|
```c
|
||||||
|
void oneshot_locked_mods_changed_user(uint8_t mods) {
|
||||||
|
if (mods & MOD_MASK_SHIFT) {
|
||||||
|
println("Oneshot locked mods SHIFT");
|
||||||
|
}
|
||||||
|
if (mods & MOD_MASK_CTRL) {
|
||||||
|
println("Oneshot locked mods CTRL");
|
||||||
|
}
|
||||||
|
if (mods & MOD_MASK_ALT) {
|
||||||
|
println("Oneshot locked mods ALT");
|
||||||
|
}
|
||||||
|
if (mods & MOD_MASK_GUI) {
|
||||||
|
println("Oneshot locked mods GUI");
|
||||||
|
}
|
||||||
|
if (!mods) {
|
||||||
|
println("Oneshot locked mods off");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
最後に、`OSL(layer)` ワンショットキーのためのコールバックもあります:
|
||||||
|
|
||||||
|
```c
|
||||||
|
void oneshot_layer_changed_user(uint8_t layer) {
|
||||||
|
if (layer == 1) {
|
||||||
|
println("Oneshot layer 1 on");
|
||||||
|
}
|
||||||
|
if (!layer) {
|
||||||
|
println("Oneshot layer off");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
いずれかのワンショットレイヤーがオフの場合、`layer` は 0 になります。ワンショットレイヤーの変更では無く、レイヤーの変更で何かを実行したい場合は、`layer_state_set_user` は使用するのに良いコールバックです。
|
||||||
|
|
||||||
|
独自のキーボードを作成している場合、`_kb` と同等の機能もあります:
|
||||||
|
|
||||||
|
```c
|
||||||
|
void oneshot_locked_mods_changed_kb(uint8_t mods);
|
||||||
|
void oneshot_mods_changed_kb(uint8_t mods);
|
||||||
|
void oneshot_layer_changed_kb(uint8_t layer);
|
||||||
|
```
|
||||||
|
|
||||||
|
他のコールバックと同様に、更にカスタマイズを可能にするために `_user` バージョンを呼ぶようにしてください。
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
# QMK 開発のための Eclipse セットアップ
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.34:docs/other_eclipse.md
|
||||||
|
git diff 0.9.34 HEAD -- docs/other_eclipse.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
[Eclipse][1]は Java 開発のために広く使われているオープンソースの [統合開発環境](https://en.wikipedia.org/wiki/Integrated_development_environment) (IDE) ですが、他の言語および用途のためにカスタマイズできる拡張可能なプラグインシステムがあります。
|
||||||
|
|
||||||
|
Eclipse のような IDE の使用は、プレーンテキストエディタの使用よりも多くの利点をもたらします。例えば、次のような利点です。
|
||||||
|
* インテリジェントなコード補完
|
||||||
|
* コード内の便利なナビゲーション
|
||||||
|
* リファクタリングツール
|
||||||
|
* 自動ビルド (コマンドラインは不要)
|
||||||
|
* Git 用の GUI
|
||||||
|
* 静的なコード解析
|
||||||
|
* デバッグ、コードフォーマット、呼び出し階層の表示などの多くのツール。
|
||||||
|
|
||||||
|
このページの目的は、AVR ソフトウェアの開発および QMK コードベースで作業するために、Eclipse をセットアップする方法を文章化することです。
|
||||||
|
|
||||||
|
このセットアップは現時点では Ubuntu 16.04 でのみテストされていることに注意してください。
|
||||||
|
|
||||||
|
# 前提条件
|
||||||
|
## ビルド環境
|
||||||
|
始める前に、チュートリアルの[セットアップ](ja/newbs_getting_started.md)のセクションに従う必要があります。特に、[`qmk compile` コマンド](ja/newbs_building_firmware.md#build-your-firmware)でファームウェアをビルドできなければなりません。
|
||||||
|
|
||||||
|
## Java
|
||||||
|
Eclipse は Java アプリケーションであるため、実行するには Java 8 以降をインストールする必要があります。JRE または JDK を選択できますが、Java 開発を行う場合は後者が役に立ちます。
|
||||||
|
|
||||||
|
# Eclipse とプラグインのインストール
|
||||||
|
Eclipse は用途に応じて[いくつかのフレーバー](http://www.eclipse.org/downloads/eclipse-packages/)で提供されます。AVR スタックを構成するパッケージは無いため、Eclipse CDT (C/C++ 開発ツール)から始め、必要なプラグインをインストールする必要があります。
|
||||||
|
|
||||||
|
## Eclipse CDT のダウンロードとインストール
|
||||||
|
システムに既に Eclipse CDT がある場合は、この手順をスキップできます。ただし、より良いサポートのために最新の状態に保つことをお勧めします。
|
||||||
|
|
||||||
|
別の Eclipse パッケージをインストールしている場合は、通常は[その上に CDT プラグインをインストール](https://eclipse.org/cdt/downloads.php)することができます。しかし、軽くして、作業中のプロジェクトに必要のないツールが乱雑にならないように、ゼロから再インストールすることをお勧めします。
|
||||||
|
|
||||||
|
インストールは非常に簡単です: [5 Steps to install Eclipse](https://eclipse.org/downloads/eclipse-packages/?show_instructions=TRUE) に従い、ステップ3で **Eclipse IDE for C/C++ Developers** を選択します。
|
||||||
|
|
||||||
|
あるいは、直接 [Eclipse IDE for C/C++ Developers をダウンロード](http://www.eclipse.org/downloads/eclipse-packages/)([現在のバージョンへの直接リンク](http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/neonr))し、選択した場所にパッケージを解凍することもできます (これにより `eclipse` フォルダが作成されます)。
|
||||||
|
|
||||||
|
## 最初の起動
|
||||||
|
インストールが完了したら、<kbd>Launch</kbd> ボタンをクリックします。(パッケージを手動で解凍した場合は、Eclipse をインストールしたフォルダを開き、`eclipse` 実行可能ファイルをダブルクリックします)
|
||||||
|
|
||||||
|
Workspace 選択で入力を促された場合は、Eclipse メタデータと通常のプロジェクトを保持するディレクトリを選択します。**`qmk_firmware` ディレクトリを選択しないでください**。これはプロジェクトディレクトリになります。代わりに親フォルダを選択するか、(できれば空の)他のフォルダを選択します(まだ使用していない場合は、デフォルトで問題ありません)。
|
||||||
|
|
||||||
|
開始したら、右上の <kbd>Workbench</kbd> ボタンをクリックし、workbench ビューに切り替えます (下部に開始時のようこそ画面をスキップするためのチェックボックスもあります)。
|
||||||
|
|
||||||
|
## 必要なプラグインをインストール
|
||||||
|
注意: プラグインをインストールするごとに、Eclipse を再起動する必要はありません。全てのプラグインがインストールされたら単に1回再起動します。
|
||||||
|
|
||||||
|
### [The AVR Plugin](http://avr-eclipse.sourceforge.net/)
|
||||||
|
これは最も重要なプラグインで、Eclipse が AVR C コードを_理解_できるようになります。[更新サイトを使うための指示](http://avr-eclipse.sourceforge.net/wiki/index.php/Plugin_Download#Update_Site)に従い、未署名コンテンツのセキュリティ警告に同意します。
|
||||||
|
|
||||||
|
### [ANSI Escape in Console](https://marketplace.eclipse.org/content/ansi-escape-console)
|
||||||
|
このプラグインは QMK makefile によって生成された色付きビルド出力を適切に表示するために必要です。
|
||||||
|
|
||||||
|
1. <kbd><kbd>Help</kbd> > <kbd>Eclipse Marketplace…</kbd></kbd> を開きます
|
||||||
|
2. _ANSI Escape in Console_ を検索します
|
||||||
|
3. プラグインの <samp>Install</samp> ボタンをクリックします
|
||||||
|
4. 指示に従い、未署名コンテンツのセキュリティ警告に再度同意します。
|
||||||
|
|
||||||
|
両方のプラグインがインストールされたら、プロンプトに従って Eclipse を再起動します。
|
||||||
|
|
||||||
|
# QMK 用の Eclipse の設定
|
||||||
|
## プロジェクトのインポート
|
||||||
|
1. <kbd><kbd>File</kbd> > <kbd>New</kbd> > <kbd>Makefile Project with Existing Code</kbd></kbd> をクリックします
|
||||||
|
2. 次の画面で:
|
||||||
|
* _Existing Code Location_ としてリポジトリをクローンしたディレクトリを選択します。
|
||||||
|
* (オプション) プロジェクトに別の名前を付けます¹ 例えば _QMK_ あるいは _Quantum_;
|
||||||
|
* _AVR-GCC Toolchain_ を選択します;
|
||||||
|
* 残りをそのままにして、<kbd>Finish</kbd> をクリックします
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
3. これでプロジェクトがロードされインデックスされます。左側の _Project Explorer_ から、簡単にファイルを参照できます。
|
||||||
|
|
||||||
|
¹ カスタム名でプロジェクトをインポートすると問題が発生するかもしれません。正しく動作しない場合は、デフォルトのプロジェクト名 (つまり、ディレクトリの名前、おそらく `qmk_firmware`) のままにしてみてください。
|
||||||
|
|
||||||
|
## キーボードのビルド
|
||||||
|
ここで、プロジェクトをクリーンし、選択したキーマップをビルドする make target を設定します。
|
||||||
|
|
||||||
|
1. 画面の右側で、<kbd>Make Target</kbd> タブを選択します
|
||||||
|
2. フォルダツリーを選択したキーボードまで展開します。例えば、`qmk_firmware/keyboards/ergodox`
|
||||||
|
3. キーボードフォルダを右クリックして、<kbd>New…</kbd> を選択します (あるいはフォルダを選択し、ツリーの上にある <kbd>New Make Target</kbd> アイコンをクリックします)
|
||||||
|
4. ビルド target の名前を選択します。例えば、_clean \<your keymap\>_
|
||||||
|
5. Make Target: これはコマンドラインからビルドする時に `make` に渡す引数です。target 名がこれらの引数と一致しない場合は、<kbd>Same as target name</kbd> のチェックを外し、正しい引数を入力します。例えば、`clean <your keymap>`
|
||||||
|
6. 他のオプションはチェックしたままにして、<kbd>OK</kbd> をクリックします。これで、選択されたキーボードの下に、make target が表示されます。
|
||||||
|
7. (オプション) target ツリーの上にある <kbd>Hide Empty Folders</kbd> アイコンボタンを、ビルド target だけが表示されるように切り替えます。
|
||||||
|
8. 作成したビルド target をダブルクリックし、ビルドを起動します。
|
||||||
|
9. 下部の <kbd>Console</kbd> ビューを選択し、実行中のビルドを眺めます。
|
||||||
|
|
||||||
|
[1]: https://en.wikipedia.org/wiki/Eclipse_(software)
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
# QMK 開発用の Visual Studio Code のセットアップ
|
||||||
|
|
||||||
|
<!---
|
||||||
|
original document: 0.9.34:docs/other_vscode.md
|
||||||
|
git diff 0.9.34 HEAD -- docs/other_vscode.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
[Visual Studio Code](https://code.visualstudio.com/) (VS Code) は多くの異なるプログラミング言語をサポートするオープンソースのコードエディタです。
|
||||||
|
|
||||||
|
VS Code のようなフル機能のエディタの使用は、プレーンテキストエディタの使用よりも多くの利点をもたらします。例えば、次のような利点です。:
|
||||||
|
* インテリジェントなコード補完
|
||||||
|
* コード内の便利なナビゲーション
|
||||||
|
* リファクタリングツール
|
||||||
|
* 自動ビルド (コマンドラインは不要)
|
||||||
|
* Git 用のグラフィカルなフロントエンド
|
||||||
|
* デバッグ、コードフォーマット、呼び出し階層の表示などの多くのツール
|
||||||
|
|
||||||
|
このページの目的は、QMK ファームウェアを開発するために VS Code をセットアップする方法を文章化することです。
|
||||||
|
|
||||||
|
このガイドは Windows および Ubuntu 18.04 で必要な全てを構成する方法を説明します。
|
||||||
|
|
||||||
|
# VS Code のセットアップ
|
||||||
|
はじめに、全てのビルドツールをセットアップし、QMK ファームウェアをクローンする必要があります。まだ設定していない場合は、[セットアップ](ja/newbs_getting_started.md)に進んでください。
|
||||||
|
|
||||||
|
## Windows
|
||||||
|
|
||||||
|
### 前提条件
|
||||||
|
|
||||||
|
* [Git for Windows](https://git-scm.com/download/win) (このリンクはインストーラを保存あるいは実行するように促します)
|
||||||
|
|
||||||
|
1. `Git LFS (Large File Support)` および `Check daily for Git for Windows updates` 以外の全てのオプションを無効にします。
|
||||||
|
2. デフォルトのエディタを `Use Visual Studio Code as Git's default editor` に設定します。
|
||||||
|
3. ここで使用すべきオプションなので、`Use Git from Git Bash only` オプションを選択します。
|
||||||
|
4. `Choosing HTTPS transport backend` については、どちらのオプションでも問題ありません。
|
||||||
|
5. `Checkout as-is, commit Unix-style line endings` オプションを選択します。QMK ファームウェアは Unix スタイルのコミットを使います。
|
||||||
|
6. 追加のオプションについては、デフォルトのオプションをそのままにします。
|
||||||
|
|
||||||
|
このソフトウェアは、VS Code での Git サポートに必要です。これを含めないことも可能ですが、これを使う方が簡単です。
|
||||||
|
|
||||||
|
* [Git Credential Manager for Windows](https://github.com/Microsoft/Git-Credential-Manager-for-Windows/releases) (オプション)
|
||||||
|
|
||||||
|
このソフトウェアは、git 証明書、MFA、パーソナルアクセストークン生成のためのセキュアストレージを提供することで、Git のより良いサポートを提供します。
|
||||||
|
|
||||||
|
これは厳密には必要ありませんが、お勧めします。
|
||||||
|
|
||||||
|
|
||||||
|
### VS Code のインストール
|
||||||
|
|
||||||
|
1. [VS Code](https://code.visualstudio.com/) に進み、インストーラをダウンロードします
|
||||||
|
2. インストーラを実行します
|
||||||
|
|
||||||
|
この項は非常に簡単です。ただし、正しく構成されていることを確認するために、しなければならない幾つかの設定があります。
|
||||||
|
|
||||||
|
### VS Code の設定
|
||||||
|
|
||||||
|
最初に、IntelliSense をセットアップする必要があります。これは厳密には必要ではありませんが、あなたの人生をずっと楽にします。これを行うには、QMK ファームウェアフォルダに `.vscode/c_cpp_properies.json` ファイルを作成する必要があります。これは全て手動で行うことができますが、ほとんどの作業は既に完了しています。
|
||||||
|
|
||||||
|
[このファイル](https://gist.github.com/drashna/48e2c49ce877be592a1650f91f8473e8) を取得して保存します。MSYS2 をデフォルトの場所にインストールしなかった、または WSL か LxSS を使っている場合、このファイルを編集する必要があります。
|
||||||
|
|
||||||
|
このファイルを保存したら、VS Code が既に実行中の場合はリロードする必要があります。
|
||||||
|
|
||||||
|
?> また、`.vscode` フォルダ に `extensions.json` および `settings.json` ファイルがあるはずです。
|
||||||
|
|
||||||
|
|
||||||
|
次に、VSCode に統合ターミナルとして表示されるように、MSYS2 ウィンドウを設定します。これには多くの利点があります。ほとんどの場合で、エラー上で Ctrl + クリックするとこれらのファイルにジャンプできます。これによりデバッグがはるかに簡単になります。また、他のウィンドウへジャンプする必要が無いという点でも優れています。
|
||||||
|
|
||||||
|
1. <kbd><kbd>File</kbd> > <kbd>Preferences ></kbd> > <kbd>Settings</kbd> </kbd> をクリックします。
|
||||||
|
2. 右上の <kbd>{}</kbd> ボタンをクリックし、`settings.json` ファイルを開きます。
|
||||||
|
3. ファイルの内容を以下のように設定します:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
|
||||||
|
"terminal.integrated.env.windows": {
|
||||||
|
"MSYSTEM": "MINGW64",
|
||||||
|
"CHERE_INVOKING": "1"
|
||||||
|
},
|
||||||
|
"terminal.integrated.shellArgs.windows": [
|
||||||
|
"--login"
|
||||||
|
],
|
||||||
|
"terminal.integrated.cursorStyle": "line"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
ここに既に設定がある場合は、最初と最後の波括弧の間に全てを追加します。
|
||||||
|
|
||||||
|
?> MSYS2 を別のフォルダにインストールした場合は、`terminal.integrated.shell.windows` のパスをシステムの正しいパスに変更する必要があります。
|
||||||
|
|
||||||
|
4. Ctrl-` (grave) を押して、ターミナルを起動します。
|
||||||
|
|
||||||
|
これにより、ワークスペースフォルダ(つまり `qmk_firmware` フォルダ)でターミナルが起動し、キーボードをコンパイルすることができます。
|
||||||
|
|
||||||
|
|
||||||
|
## 他の全てのオペレーティングシステム
|
||||||
|
|
||||||
|
1. [VS Code](https://code.visualstudio.com/) に進み、インストーラをダウンロードします
|
||||||
|
2. インストーラを実行します
|
||||||
|
3. 以上です
|
||||||
|
|
||||||
|
いいえ、本当に以上です。必要なパスはパッケージのインストール時に既に含まれています。現在のワークスペースのファイルを検出し、IntelliSense 用に解析する方がより良いです。
|
||||||
|
|
||||||
|
## プラグイン
|
||||||
|
|
||||||
|
インストールした方が良い拡張が幾つかあります。
|
||||||
|
|
||||||
|
* [Git Extension Pack](https://marketplace.visualstudio.com/items?itemName=donjayamanne.git-extension-pack) -
|
||||||
|
これは QMK ファームウェアで Git を簡単に使用できる Git 関連ツールを多数インスールします。
|
||||||
|
* [EditorConfig for VS Code](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) - _[オプション]_ - QMK コーディング規約にコードを準拠させるのに役立ちます。
|
||||||
|
* [Bracket Pair Colorizer 2](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer-2) - _[オプション]_ - これはネストされたコードを参照しやすくするために、コード内の括弧を色分けします。
|
||||||
|
* [GitHub Markdown Preview](https://marketplace.visualstudio.com/items?itemName=bierner.github-markdown-preview) - _[オプション]_ - VS Code の markdown プレビューを GithHub のようにします。
|
||||||
|
* [VS Live Share Extension Pack](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare-pack) - _[オプション]_ - この拡張により、他の誰かがあなたのワークスペースにアクセスし(あるいは、あなたが他の誰かのワークスペースにアクセスし)、手伝うことができます。あなたが問題を抱えており、他の誰かの助けが必要な場合に便利です。
|
||||||
|
* [VIM Keymap](https://marketplace.visualstudio.com/items?itemName=GiuseppeCesarano.vim-keymap) - _[オプション]_ - VIM スタイルのキーバインドを好む人向け。これには他のオプションもあります。
|
||||||
|
* [Travis CI Status](https://marketplace.visualstudio.com/items?itemName=felixrieseberg.vsc-travis-ci-status) - _[オプション]_ - セットアップした場合、現在の Travis CI の状態を表示します。
|
||||||
|
|
||||||
|
いずれかの拡張機能をインストールしたら、再起動します。
|
||||||
|
|
||||||
|
# QMK 用の VS Code の設定
|
||||||
|
1. <kbd><kbd>File</kbd> > <kbd>Open Folder</kbd></kbd> をクリックします
|
||||||
|
2. GitHub からクローンした QMK ファームウェアフォルダを開きます。
|
||||||
|
3. <kbd><kbd>File</kbd> > <kbd>Save Workspace As...</kbd></kbd> をクリックします
|
||||||
|
|
||||||
|
これで、VS Code で QMK ファームウェアをコーディングする準備ができました。
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
# キーボードを Proton C を使うように変更
|
||||||
|
|
||||||
|
<!---
|
||||||
|
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||||
|
original document: 0.9.46:docs/proton_c_conversion.md
|
||||||
|
git diff 0.9.46 HEAD -- docs/proton_c_conversion.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
Proton C は Pro Micro の差し替え可能品であるため、簡単に使用することができます。
|
||||||
|
このページでは、キーボードを変換するための便利な自動化されたプロセスと、Pro Micro では利用できない Proton C の機能を利用したい場合の手動プロセスについて説明しています。
|
||||||
|
|
||||||
|
## 自動で変換
|
||||||
|
|
||||||
|
QMK で現在サポートされているキーボードが Pro Micro(または互換ボード)を使用しており、Proton C を使用したい場合は、以下のように make 引数に `CONVERT_TO_PROTON_C=yes` (または `CTPC=yes`) を追加することでファームウェアを生成することができます。
|
||||||
|
|
||||||
|
make 40percentclub/mf68:default CTPC=yes
|
||||||
|
|
||||||
|
同じ引数をキーマップの `rules.mk` に追加しても同じことができます。
|
||||||
|
|
||||||
|
これは、次のように、`#ifdef` を使用してコード内で使用できる `CONVERT_TO_PROTON_C` フラグを公開します。
|
||||||
|
|
||||||
|
```c
|
||||||
|
#ifdef CONVERT_TO_PROTON_C
|
||||||
|
// Proton C code
|
||||||
|
#else
|
||||||
|
// Pro Micro code
|
||||||
|
#endif
|
||||||
|
```
|
||||||
|
|
||||||
|
`PORTB/DDRB` などが定義されていないというエラーが発生した場合は、ARM と AVR の両方で機能する [GPIO 制御](ja/internals_gpio_control.md) を使用するようにキーボードのコードを変換する必要があります。これは AVR ビルドにまったく影響を与えません。
|
||||||
|
|
||||||
|
Proton C には1つのオンボード LED(C13)しかなく、デフォルトでは TXLED(D5) がそれにマップされています。代わりに RXLED(B0) をそれにマッピングしたい場合は、`config.h` に次のように追加してください。
|
||||||
|
|
||||||
|
#define CONVERT_TO_PROTON_C_RXLED
|
||||||
|
|
||||||
|
## 機能の変換
|
||||||
|
|
||||||
|
下記は ARM ボードに実装されているものに基づいたデフォルトです。
|
||||||
|
|
||||||
|
| 機能 | 説明 |
|
||||||
|
|--------------------------------------|------------------------------------------------------------------------------------|
|
||||||
|
| [オーディオ](ja/feature_audio.md) | 有効 |
|
||||||
|
| [RGB ライト](ja/feature_rgblight.md) | 無効 |
|
||||||
|
| [バックライト](feature_backlight.md) | ARM が自動コンフィギュレーションを提供できるようになるまで、[タスク駆動 PWM](ja/(feature_backlight.md#software-pwm-driver))が強制されます |
|
||||||
|
| USB ホスト (例えば USB-USB コンバータ) | 未サポート (USB ホストコードは AVR 固有のもので、現在 ARM ではサポートされていません。 |
|
||||||
|
| [分割キーボード](ja/feature_split_keyboard.md) | 部分的 - 有効にする機能に大きく依存します |
|
||||||
|
|
||||||
|
## 手動で変換
|
||||||
|
|
||||||
|
`CTPC = yes` を指定せずに Proton C をネイティブで使用するには、`rules.mk` の `MCU`行を変更する必要があります:
|
||||||
|
|
||||||
|
```
|
||||||
|
MCU = STM32F303
|
||||||
|
```
|
||||||
|
|
||||||
|
次の変数が存在する場合は削除します。
|
||||||
|
|
||||||
|
* `BOOTLOADER`
|
||||||
|
* `EXTRA_FLAGS`
|
||||||
|
|
||||||
|
最後に、`config.h`のすべてのピン割り当てを STM32 上の同等のものに変換します。
|
||||||
|
|
||||||
|
| Pro Micro 左側| Proton C 左側 | | Proton C 右側 | Pro Micro 右側 |
|
||||||
|
|--------------|--------------|-|--------------|---------------|
|
||||||
|
| `D3` | `A9` | | 5v | RAW (5v) |
|
||||||
|
| `D2` | `A10` | | GND | GND |
|
||||||
|
| GND | GND | | FLASH | RESET |
|
||||||
|
| GND | GND | | 3.3v | Vcc <sup>1</sup> |
|
||||||
|
| `D1` | `B7` | | `A2` | `F4` |
|
||||||
|
| `D0` | `B6` | | `A1` | `F5` |
|
||||||
|
| `D4` | `B5` | | `A0` | `F6` |
|
||||||
|
| `C6` | `B4` | | `B8` | `F7` |
|
||||||
|
| `D7` | `B3` | | `B13` | `B1` |
|
||||||
|
| `E6` | `B2` | | `B14` | `B3` |
|
||||||
|
| `B4` | `B1` | | `B15` | `B2` |
|
||||||
|
| `B5` | `B0` | | `B9` | `B6` |
|
||||||
|
| `B0` (RX LED) | `C13` <sup>2</sup> | | `C13` <sup>2</sup> | `D5` (TX LED) |
|
||||||
|
|
||||||
|
また、Proton C の拡張部分にあるいくつかの新しいピンを利用することもできます。
|
||||||
|
|
||||||
|
| 左側 | | 右側 |
|
||||||
|
|------|-|-------|
|
||||||
|
| `A4`<sup>3</sup> | | `B10` |
|
||||||
|
| `A5`<sup>4</sup> | | `B11` |
|
||||||
|
| `A6` | | `B12` |
|
||||||
|
| `A7` | | `A14`<sup>5</sup> (SWCLK) |
|
||||||
|
| `A8` | | `A13`<sup>5</sup> (SWDIO) |
|
||||||
|
| `A15` | | RESET<sup>6</sup> |
|
||||||
|
|
||||||
|
注釈:
|
||||||
|
|
||||||
|
1. Pro Micro の Vcc は 3.3V または 5V にすることができます。
|
||||||
|
2. Proton C のオンボード LED は、Pro Micro のように2つはありません、1つだけです。Pro Micro には、RX LED(`D5`) と TX LED(`B0`)があります。
|
||||||
|
3. `A4` ピンは、スピーカーと共有されています。
|
||||||
|
4. `A5` ピンは、スピーカーと共有されています。
|
||||||
|
5. `A13` と `A14` ピンはハードウェアデバッグ (SWD) に使用されます。GPIO にも使えますが、最後に使ってください。
|
||||||
|
6. RESET を 3.3V とショート(プルアップ)して MCU をリブートします。これは Pro Micro のようにブートローダモードにはならず、MCU をリセットするだけです。
|
||||||
+40
-34
@@ -381,45 +381,51 @@ See also: [Mouse Keys](feature_mouse_keys.md)
|
|||||||
|
|
||||||
See also: [Modifier Keys](feature_advanced_keycodes.md#modifier-keys)
|
See also: [Modifier Keys](feature_advanced_keycodes.md#modifier-keys)
|
||||||
|
|
||||||
|Key |Aliases |Description |
|
|Key |Aliases |Description |
|
||||||
|----------|-------------------------------|----------------------------------------------------|
|
|----------|-------------------------------|------------------------------------------------------|
|
||||||
|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
|
|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
|
||||||
|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
|
|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
|
||||||
|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` |
|
|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` |
|
||||||
|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` |
|
|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` |
|
||||||
|`RCTL(kc)`| |Hold Right Control and press `kc` |
|
|`RCTL(kc)`| |Hold Right Control and press `kc` |
|
||||||
|`RSFT(kc)`| |Hold Right Shift and press `kc` |
|
|`RSFT(kc)`| |Hold Right Shift and press `kc` |
|
||||||
|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` |
|
|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt (AltGr) and press `kc` |
|
||||||
|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)` |Hold Right GUI and press `kc` |
|
|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)` |Hold Right GUI and press `kc` |
|
||||||
|`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)` |Hold Left Shift and GUI and press `kc` |
|
|`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)` |Hold Left Shift and GUI and press `kc` |
|
||||||
|`LCA(kc)` | |Hold Left Control and Alt and press `kc` |
|
|`LCA(kc)` | |Hold Left Control and Alt and press `kc` |
|
||||||
|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` |
|
|`LSA(kc)` | |Hold Left Shift and Left Alt and press `kc` |
|
||||||
|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` |
|
|`RSA(kc)` |`SAGR(kc)` |Hold Right Shift and Right Alt (AltGr) and press `kc` |
|
||||||
|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`|
|
|`RCS(kc)` | |Hold Right Control and Right Shift and press `kc` |
|
||||||
|`KC_MEH` | |Left Control, Shift and Alt |
|
|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` |
|
||||||
|`KC_HYPR` | |Left Control, Shift, Alt and GUI |
|
|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` |
|
||||||
|
|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc` |
|
||||||
|
|`KC_MEH` | |Left Control, Shift and Alt |
|
||||||
|
|`KC_HYPR` | |Left Control, Shift, Alt and GUI |
|
||||||
|
|
||||||
## Mod-Tap Keys :id=mod-tap-keys
|
## Mod-Tap Keys :id=mod-tap-keys
|
||||||
|
|
||||||
See also: [Mod-Tap](mod_tap.md)
|
See also: [Mod-Tap](mod_tap.md)
|
||||||
|
|
||||||
|Key |Aliases |Description |
|
|Key |Aliases |Description |
|
||||||
|-------------|-----------------------------------------------------------------|-------------------------------------------------------|
|
|-------------|-----------------------------------------------------------------|--------------------------------------------------------------|
|
||||||
|`MT(mod, kc)`| |`mod` when held, `kc` when tapped |
|
|`MT(mod, kc)`| |`mod` when held, `kc` when tapped |
|
||||||
|`LCTL_T(kc)` |`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|
|`LCTL_T(kc)` |`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|
||||||
|`LSFT_T(kc)` |`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|
|`LSFT_T(kc)` |`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|
||||||
|`LALT_T(kc)` |`LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped |
|
|`LALT_T(kc)` |`LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped |
|
||||||
|`LGUI_T(kc)` |`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
|
|`LGUI_T(kc)` |`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
|
||||||
|`RCTL_T(kc)` | |Right Control when held, `kc` when tapped |
|
|`RCTL_T(kc)` | |Right Control when held, `kc` when tapped |
|
||||||
|`RSFT_T(kc)` | |Right Shift when held, `kc` when tapped |
|
|`RSFT_T(kc)` | |Right Shift when held, `kc` when tapped |
|
||||||
|`RALT_T(kc)` |`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|
|`RALT_T(kc)` |`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt (AltGr) when held, `kc` when tapped |
|
||||||
|`RGUI_T(kc)` |`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|
|`RGUI_T(kc)` |`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|
||||||
|`SGUI_T(kc)` |`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
|
|`SGUI_T(kc)` |`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
|
||||||
|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
|
|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
|
||||||
|`LCAG_T(kc)` | |Left Control, Alt and GUI when held, `kc` when tapped |
|
|`LSA_T(kc)` | |Left Shift and Left Alt when held, `kc` when tapped |
|
||||||
|`RCAG_T(kc)` | |Right Control, Alt and GUI when held, `kc` when tapped |
|
|`RSA_T(kc)` |`SAGR_T(kc)` |Right Shift and Right Alt (AltGr) when held, `kc` when tapped |
|
||||||
|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
|
|`RCS_T(kc)` | |Right Control and Right Shift when held, `kc` when tapped |
|
||||||
|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
|
|`LCAG_T(kc)` | |Left Control, Alt and GUI when held, `kc` when tapped |
|
||||||
|
|`RCAG_T(kc)` | |Right Control, Alt and GUI when held, `kc` when tapped |
|
||||||
|
|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
|
||||||
|
|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped |
|
||||||
|`HYPR_T(kc)` |`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
|
|`HYPR_T(kc)` |`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
|
||||||
|
|
||||||
## RGB Lighting :id=rgb-lighting
|
## RGB Lighting :id=rgb-lighting
|
||||||
|
|||||||
@@ -77,11 +77,11 @@ Now, we will set up the MSYS2 window to show up in VSCode as the integrated term
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
If there are settings here already, then just add everything between the first and last curly brackets.
|
If there are settings here already, then just add everything between the first and last curly brackets and separate the existing settings with a comma from the newly added ones.
|
||||||
|
|
||||||
?> If you installed MSYS2 to a different folder, then you'll need to change the path for `terminal.integrated.shell.windows` to the correct path for your system.
|
?> If you installed MSYS2 to a different folder, then you'll need to change the path for `terminal.integrated.shell.windows` to the correct path for your system.
|
||||||
|
|
||||||
4. Hit Ctrl-` (grave) to bring up the terminal.
|
4. Hit Ctrl-`\`` (Grave) to bring up the terminal or go to <kbd><kbd>View</kbd> > <kbd>Terminal</kbd></kbd> (command `workbench.action.terminal.toggleTerminal`). A new terminal will be opened if there isn‘t one already.
|
||||||
|
|
||||||
This should start the terminal in the workspace's folder (so the `qmk_firmware` folder), and then you can compile your keyboard.
|
This should start the terminal in the workspace's folder (so the `qmk_firmware` folder), and then you can compile your keyboard.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,125 @@
|
|||||||
|
# PR checklists
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
## General PRs
|
||||||
|
|
||||||
|
- PR should be submitted using a non-`master` branch on the source repository
|
||||||
|
- This does not mean you target a different branch for your PR, rather that you're not working out of your own master branch
|
||||||
|
- If submitter _does_ use their own `master` branch, they'll be given a link to the ["how to git"](https://docs.qmk.fm/#/newbs_git_using_your_master_branch) page after merging -- (end of this document will contain the contents of the message)
|
||||||
|
- Newly-added directories and filenames must be lowercase
|
||||||
|
- This rule may be relaxed if upstream sources originally had uppercase characters (e.g. ChibiOS, or imported files from other repositories etc.)
|
||||||
|
- If there is enough justification (i.e. consistency with existing core files etc.) this can be relaxed
|
||||||
|
- a board designer naming their keyboard with uppercase letters is not enough justification
|
||||||
|
- Valid license headers on all `*.c` and `*.h` source files
|
||||||
|
- GPL2/GPL3 recommended for consistency
|
||||||
|
- Other licenses are permitted, however they must be GPL-compatible and must allow for redistribution. Using a different license will almost certainly delay a PR getting merged.
|
||||||
|
- QMK codebase "best practices" followed
|
||||||
|
- This is not an exhaustive list, and will likely get amended as time goes by
|
||||||
|
- `#pragma once` instead of `#ifndef` include guards in header files
|
||||||
|
- No "old-school" GPIO/I2C/SPI functions used -- must use QMK abstractions unless justifiable (and laziness is not valid justification)
|
||||||
|
- Timing abstractions should be followed too:
|
||||||
|
- `wait_ms()` instead of `_delay_ms()` (remove `#include <util/delay.h>` too)
|
||||||
|
- `timer_read()` and `timer_read32()` etc. -- see [timer.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/timer.h) for the timing APIs
|
||||||
|
- If you think a new abstraction is useful, you're encouraged to:
|
||||||
|
- prototype it in your own keyboard until it's feature-complete
|
||||||
|
- discuss it with QMK Collaborators on Discord
|
||||||
|
- refactor it as a separate core change
|
||||||
|
- remove your specific copy in your board
|
||||||
|
|
||||||
|
## Core PRs
|
||||||
|
|
||||||
|
- Must now target `develop` branch, which will subsequently be merged back to `master` on the breaking changes timeline
|
||||||
|
- Other notes TBD
|
||||||
|
- Core is a lot more subjective given the breadth of posted changes
|
||||||
|
|
||||||
|
## Keyboard PRs
|
||||||
|
|
||||||
|
Closed PRs (for inspiration, previous sets of review comments will help you eliminate ping-pong of your own reviews):
|
||||||
|
https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
|
||||||
|
|
||||||
|
- `info.json`
|
||||||
|
- valid URL
|
||||||
|
- valid maintainer
|
||||||
|
- displays correctly in Configurator (press Ctrl+Shift+I to preview local file, turn on fast input to verify ordering)
|
||||||
|
- `readme.md`
|
||||||
|
- standard template should be present
|
||||||
|
- flash command has `:flash` at end
|
||||||
|
- valid hardware availability link (unless handwired) -- private groupbuys are okay, but one-off prototypes will be questioned. If open-source, a link to files should be provided.
|
||||||
|
- `rules.mk`
|
||||||
|
- removed `MIDI_ENABLE`, `FAUXCLICKY_ENABLE` and `HD44780_ENABLE`
|
||||||
|
- modified `# Enable Bluetooth with the Adafruit EZ-Key HID` -> `# Enable Bluetooth`
|
||||||
|
- No `(-/+size)` comments related to enabling features
|
||||||
|
- Remove the list of alternate bootloaders if one has been specified
|
||||||
|
- No re-definitions of the default MCU parameters if same value, when compared to the equivalent MCU in [mcu_selection.mk](https://github.com/qmk/qmk_firmware/blob/master/quantum/mcu_selection.mk)
|
||||||
|
- keyboard `config.h`
|
||||||
|
- don't repeat `MANUFACTURER` in the `PRODUCT` value
|
||||||
|
- no `#define DESCRIPTION`
|
||||||
|
- no Magic Key Options, MIDI Options or HD44780 configuration
|
||||||
|
- user preference configurable `#define`s need to be moved to keymap `config.h`
|
||||||
|
- "`DEBOUNCE`" instead of "`DEBOUNCING_DELAY`"
|
||||||
|
- bare minimum required code for a board to boot into QMK should be present
|
||||||
|
- initialisation code for the matrix and critical devices
|
||||||
|
- mirroring existing functionality of a commercial board (like custom keycodes and special animations etc.) should be handled through non-`default` keymaps
|
||||||
|
- `keyboard.c`
|
||||||
|
- empty `xxxx_xxxx_kb()` or other weak-defined default implemented functions removed
|
||||||
|
- commented-out functions removed too
|
||||||
|
- `matrix_init_board()` etc. migrated to `keyboard_pre_init_kb()`, see: [keyboard_pre_init*](https://docs.qmk.fm/#/custom_quantum_functions?id=keyboard_pre_init_-function-documentation)
|
||||||
|
- prefer `CUSTOM_MATRIX = lite` if custom matrix used, allows for standard debounce, see [custom matrix 'lite'](https://docs.qmk.fm/#/custom_matrix?id=lite)
|
||||||
|
- `keyboard.h`
|
||||||
|
- `#include "quantum.h"` appears at the top
|
||||||
|
- `LAYOUT` macros should use standard definitions if applicable
|
||||||
|
- Use the Community Layout macro names where they apply (preferred above `LAYOUT`/`LAYOUT_all`)
|
||||||
|
- keymap `config.h`
|
||||||
|
- no duplication of `rules.mk` or `config.h` from keyboard
|
||||||
|
- `keymaps/default/keymap.c`
|
||||||
|
- `QMKBEST`/`QMKURL` removed (sheesh)
|
||||||
|
- If using `MO(_LOWER)` and `MO(_RAISE)` keycodes or equivalent, and the keymap has an adjust layer when holding both keys -- if the keymap has no "direct-to-adjust" keycode (such as `MO(_ADJUST)`) then you should prefer to write...
|
||||||
|
```
|
||||||
|
layer_state_t layer_state_set_user(layer_state_t state) {
|
||||||
|
return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
...instead of manually handling `layer_on()`, `update_tri_layer()` inside the keymap's `process_record_user()`.
|
||||||
|
- default (and via) keymaps should be "pristine"
|
||||||
|
- bare minimum to be used as a "clean slate" for another user to develop their own user-specific keymap
|
||||||
|
- standard layouts preferred in these keymaps, if possible
|
||||||
|
- submitters can have a personal (or bells-and-whistles) keymap showcasing capabilities in the same PR but it shouldn't be embedded in the 'default' keymap
|
||||||
|
- submitters can also have a "manufacturer-matching" keymap that mirrors existing functionality of the commercial product, if porting an existing board
|
||||||
|
|
||||||
|
Also, specific to ChibiOS:
|
||||||
|
- **Strong** preference to using existing ChibiOS board definitions.
|
||||||
|
- A lot of the time, an equivalent Nucleo board can be used with a different flash size or slightly different model in the same family
|
||||||
|
- Example: For an STM32L082KZ, given the similarity to an STM32L073RZ, you can use `BOARD = ST_NUCLEO64_L073RZ` in rules.mk
|
||||||
|
- QMK is migrating to not having custom board definitions if at all possible, due to the ongoing maintenance burden when upgrading ChibiOS
|
||||||
|
- If a board definition is unavoidable, `board.c` must have a standard `__early_init()` (as per normal ChibiOS board defs) and an empty `boardInit()`:
|
||||||
|
- see Arm/ChibiOS [early initialization](https://docs.qmk.fm/#/platformdev_chibios_earlyinit?id=board-init)
|
||||||
|
- `__early_init()` should be replaced by either `early_hardware_init_pre()` or `early_hardware_init_post()` as appropriate
|
||||||
|
- `boardInit()` should be migrated to `board_init()`
|
||||||
|
|
||||||
|
## Keymap PRs
|
||||||
|
|
||||||
|
- `#include QMK_KEYBOARD_H` preferred to including specific board files
|
||||||
|
- Prefer layer `enum`s to `#define`s
|
||||||
|
- Require custom keycode `enum`s to `#define`s, first entry must have ` = SAFE_RANGE`
|
||||||
|
- Terminating backslash (`\`) in lines of LAYOUT macro parameters is superfluous
|
||||||
|
- Some care with spacing (e.g., alignment on commas or first char of keycodes) makes for a much nicer-looking keymap
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
For when people use their own `master` branch, post this after merge:
|
||||||
|
```
|
||||||
|
For future reference, we recommend against committing to your `master` branch as you've done here, because pull requests from modified `master` branches can make it more difficult to keep your QMK fork updated. It is highly recommended for QMK development – regardless of what is being done or where – to keep your master updated, but **NEVER** commit to it. Instead, do all your changes in a branch (branches are basically free in Git) and issue PRs from your branches when you're developing.
|
||||||
|
|
||||||
|
There are instructions on how to keep your fork updated here:
|
||||||
|
|
||||||
|
[**Best Practices: Your Fork's Master: Update Often, Commit Never**](https://docs.qmk.fm/#/newbs_git_using_your_master_branch)
|
||||||
|
|
||||||
|
[Fixing Your Branch](https://docs.qmk.fm/#/newbs_git_resynchronize_a_branch) will walk you through fixing up your `master` branch moving forward. If you need any help with this just ask.
|
||||||
|
|
||||||
|
Thanks for contributing!
|
||||||
|
```
|
||||||
@@ -26,7 +26,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
update_tri_layer(_LOWER, _RAISE, _ADJUST);
|
update_tri_layer(_LOWER, _RAISE, _ADJUST);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
break;
|
|
||||||
case RAISE:
|
case RAISE:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
layer_on(_RAISE);
|
layer_on(_RAISE);
|
||||||
@@ -36,7 +35,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
update_tri_layer(_LOWER, _RAISE, _ADJUST);
|
update_tri_layer(_LOWER, _RAISE, _ADJUST);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ A macro which has been recorded on the keyboard and which will be lost when the
|
|||||||
## Eclipse
|
## Eclipse
|
||||||
An IDE that is popular with many C developers.
|
An IDE that is popular with many C developers.
|
||||||
|
|
||||||
* [Eclipse Setup Instructions](eclipse.md)
|
* [Eclipse Setup Instructions](other_eclipse.md)
|
||||||
|
|
||||||
## Firmware
|
## Firmware
|
||||||
The software that controls your MCU.
|
The software that controls your MCU.
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ To use these, simply `#include` the corresponding [header file](https://github.c
|
|||||||
|Estonian |`keymap_estonian.h` |
|
|Estonian |`keymap_estonian.h` |
|
||||||
|Finnish |`keymap_finnish.h` |
|
|Finnish |`keymap_finnish.h` |
|
||||||
|French |`keymap_french.h` |
|
|French |`keymap_french.h` |
|
||||||
|
|French (AFNOR) |`keymap_french_afnor.h` |
|
||||||
|French (BÉPO) |`keymap_bepo.h` |
|
|French (BÉPO) |`keymap_bepo.h` |
|
||||||
|French (Belgium) |`keymap_belgian.h` |
|
|French (Belgium) |`keymap_belgian.h` |
|
||||||
|French (Switzerland) |`keymap_fr_ch.h` |
|
|French (Switzerland) |`keymap_fr_ch.h` |
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
|
|||||||
return 130;
|
return 130;
|
||||||
default:
|
default:
|
||||||
return TAPPING_TERM;
|
return TAPPING_TERM;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -424,7 +424,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
layer_state_set(layer_state); // 那么立刻更新层颜色
|
layer_state_set(layer_state); // 那么立刻更新层颜色
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false; break;
|
return false;
|
||||||
case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // 对于所有的RGB代码 (see quantum_keycodes.h, L400 可以参考)
|
case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // 对于所有的RGB代码 (see quantum_keycodes.h, L400 可以参考)
|
||||||
if (record->event.pressed) { //本句失能层指示,假设你改变了这个…你要把它禁用
|
if (record->event.pressed) { //本句失能层指示,假设你改变了这个…你要把它禁用
|
||||||
if (user_config.rgb_layer_change) { // 仅当使能时
|
if (user_config.rgb_layer_change) { // 仅当使能时
|
||||||
|
|||||||
@@ -32,7 +32,9 @@
|
|||||||
static uint8_t i2c_address;
|
static uint8_t i2c_address;
|
||||||
|
|
||||||
static const I2CConfig i2cconfig = {
|
static const I2CConfig i2cconfig = {
|
||||||
#ifdef USE_I2CV1
|
#if defined(USE_I2CV1_CONTRIB)
|
||||||
|
I2C1_CLOCK_SPEED,
|
||||||
|
#elif defined(USE_I2CV1)
|
||||||
I2C1_OPMODE,
|
I2C1_OPMODE,
|
||||||
I2C1_CLOCK_SPEED,
|
I2C1_CLOCK_SPEED,
|
||||||
I2C1_DUTY_CYCLE,
|
I2C1_DUTY_CYCLE,
|
||||||
@@ -62,8 +64,8 @@ __attribute__((weak)) void i2c_init(void) {
|
|||||||
|
|
||||||
chThdSleepMilliseconds(10);
|
chThdSleepMilliseconds(10);
|
||||||
#if defined(USE_GPIOV1)
|
#if defined(USE_GPIOV1)
|
||||||
palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_STM32_ALTERNATE_OPENDRAIN);
|
palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, I2C1_SCL_PAL_MODE);
|
||||||
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_STM32_ALTERNATE_OPENDRAIN);
|
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, I2C1_SDA_PAL_MODE);
|
||||||
#else
|
#else
|
||||||
palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_ALTERNATE(I2C1_SCL_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
|
palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_ALTERNATE(I2C1_SCL_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
|
||||||
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
|
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
|
||||||
|
|||||||
@@ -81,7 +81,14 @@
|
|||||||
# define I2C_DRIVER I2CD1
|
# define I2C_DRIVER I2CD1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef USE_GPIOV1
|
#ifdef USE_GPIOV1
|
||||||
|
# ifndef I2C1_SCL_PAL_MODE
|
||||||
|
# define I2C1_SCL_PAL_MODE PAL_MODE_STM32_ALTERNATE_OPENDRAIN
|
||||||
|
# endif
|
||||||
|
# ifndef I2C1_SDA_PAL_MODE
|
||||||
|
# define I2C1_SDA_PAL_MODE PAL_MODE_STM32_ALTERNATE_OPENDRAIN
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
// The default PAL alternate modes are used to signal that the pins are used for I2C
|
// The default PAL alternate modes are used to signal that the pins are used for I2C
|
||||||
# ifndef I2C1_SCL_PAL_MODE
|
# ifndef I2C1_SCL_PAL_MODE
|
||||||
# define I2C1_SCL_PAL_MODE 4
|
# define I2C1_SCL_PAL_MODE 4
|
||||||
|
|||||||
@@ -272,6 +272,8 @@ void IS31FL3741_update_led_control_registers(uint8_t addr, uint8_t index) {
|
|||||||
for (int i = 0; i < 171; ++i) {
|
for (int i = 0; i < 171; ++i) {
|
||||||
IS31FL3741_write_register(addr, i, g_scaling_registers[0][180 + i]);
|
IS31FL3741_write_register(addr, i, g_scaling_registers[0][180 + i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_scaling_registers_update_required[index] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -82,14 +82,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#define I2C_CMD 0x00
|
#define I2C_CMD 0x00
|
||||||
#define I2C_DATA 0x40
|
#define I2C_DATA 0x40
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
// already defined on ARM
|
# define I2C_TRANSMIT_P(data) i2c_transmit_P((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT)
|
||||||
# define I2C_TIMEOUT 100
|
|
||||||
# define I2C_TRANSMIT_P(data) i2c_transmit_P((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT)
|
|
||||||
#else // defined(__AVR__)
|
#else // defined(__AVR__)
|
||||||
# define I2C_TRANSMIT_P(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT)
|
# define I2C_TRANSMIT_P(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT)
|
||||||
#endif // defined(__AVR__)
|
#endif // defined(__AVR__)
|
||||||
#define I2C_TRANSMIT(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT)
|
#define I2C_TRANSMIT(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT)
|
||||||
#define I2C_WRITE_REG(mode, data, size) i2c_writeReg((OLED_DISPLAY_ADDRESS << 1), mode, data, size, I2C_TIMEOUT)
|
#define I2C_WRITE_REG(mode, data, size) i2c_writeReg((OLED_DISPLAY_ADDRESS << 1), mode, data, size, OLED_I2C_TIMEOUT)
|
||||||
|
|
||||||
#define HAS_FLAGS(bits, flags) ((bits & flags) == flags)
|
#define HAS_FLAGS(bits, flags) ((bits & flags) == flags)
|
||||||
|
|
||||||
@@ -462,6 +460,19 @@ void oled_write_raw(const char *data, uint16_t size) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void oled_write_pixel(uint8_t x, uint8_t y, bool on) {
|
||||||
|
if (x >= OLED_DISPLAY_WIDTH || y >= OLED_DISPLAY_HEIGHT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uint16_t index = x + (y / 8) * OLED_DISPLAY_WIDTH;
|
||||||
|
if (on) {
|
||||||
|
oled_buffer[index] |= (1 << (y % 8));
|
||||||
|
} else {
|
||||||
|
oled_buffer[index] &= ~(1 << (y % 8));
|
||||||
|
}
|
||||||
|
oled_dirty |= (1 << (index / OLED_BLOCK_SIZE));
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
void oled_write_P(const char *data, bool invert) {
|
void oled_write_P(const char *data, bool invert) {
|
||||||
uint8_t c = pgm_read_byte(data);
|
uint8_t c = pgm_read_byte(data);
|
||||||
|
|||||||
@@ -150,6 +150,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(OLED_I2C_TIMEOUT)
|
||||||
|
# define OLED_I2C_TIMEOUT 100
|
||||||
|
#endif
|
||||||
|
|
||||||
// OLED Rotation enum values are flags
|
// OLED Rotation enum values are flags
|
||||||
typedef enum {
|
typedef enum {
|
||||||
OLED_ROTATION_0 = 0,
|
OLED_ROTATION_0 = 0,
|
||||||
@@ -206,6 +210,10 @@ void oled_pan(bool left);
|
|||||||
void oled_write_raw(const char *data, uint16_t size);
|
void oled_write_raw(const char *data, uint16_t size);
|
||||||
void oled_write_raw_byte(const char data, uint16_t index);
|
void oled_write_raw_byte(const char data, uint16_t index);
|
||||||
|
|
||||||
|
// Sets a specific pixel on or off
|
||||||
|
// Coordinates start at top-left and go right and down for positive x and y
|
||||||
|
void oled_write_pixel(uint8_t x, uint8_t y, bool on);
|
||||||
|
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
// Writes a PROGMEM string to the buffer at current cursor position
|
// Writes a PROGMEM string to the buffer at current cursor position
|
||||||
// Advances the cursor while writing, inverts the pixels if true
|
// Advances the cursor while writing, inverts the pixels if true
|
||||||
|
|||||||
@@ -189,31 +189,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
/*
|
|
||||||
* HD44780 LCD Display Configuration
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#define LCD_LINES 2 //< number of visible lines of the display
|
|
||||||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
|
||||||
|
|
||||||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define LCD_PORT PORTB //< port for the LCD lines
|
|
||||||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
|
||||||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
|
||||||
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
|
||||||
#define LCD_RS_PIN 3 //< pin for RS line
|
|
||||||
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
|
||||||
#define LCD_RW_PIN 2 //< pin for RW line
|
|
||||||
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
|
||||||
#define LCD_E_PIN 1 //< pin for Enable line
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
@@ -30,7 +30,6 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
|
|
||||||
EXTRAFLAGS += -flto
|
EXTRAFLAGS += -flto
|
||||||
|
|
||||||
LAYOUTS = 60_ansi
|
LAYOUTS = 60_ansi
|
||||||
@@ -2,77 +2,78 @@
|
|||||||
|
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
|
|
||||||
#define LAYOUT_all( \
|
#define XXX KC_NO
|
||||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \
|
|
||||||
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
|
|
||||||
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \
|
|
||||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \
|
|
||||||
K400, K401, K403, K406, K410, K411, K413, K414 \
|
|
||||||
) { \
|
|
||||||
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \
|
|
||||||
{ K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
|
|
||||||
{ K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214 }, \
|
|
||||||
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \
|
|
||||||
{ K400, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, KC_NO, K413, K414 } \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
#define LAYOUT_all( \
|
||||||
|
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, \
|
||||||
|
k10, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, \
|
||||||
|
k20, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, \
|
||||||
|
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3D, k3E, \
|
||||||
|
k40, k41, k43, k46, k4A, k4B, k4D, k4E \
|
||||||
|
) { \
|
||||||
|
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E }, \
|
||||||
|
{ k10, XXX, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E }, \
|
||||||
|
{ k20, XXX, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E }, \
|
||||||
|
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, XXX, k3D, k3E }, \
|
||||||
|
{ k40, k41, XXX, k43, XXX, XXX, k46, XXX, XXX, XXX, k4A, k4B, XXX, k4D, k4E } \
|
||||||
|
}
|
||||||
|
|
||||||
/* ANSI variant. No extra keys for ISO */
|
/* ANSI variant. No extra keys for ISO */
|
||||||
#define LAYOUT_60_ansi( \
|
#define LAYOUT_60_ansi( \
|
||||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, \
|
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, \
|
||||||
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
|
k10, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, \
|
||||||
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, \
|
k20, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2E, \
|
||||||
K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \
|
k30, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3D, \
|
||||||
K400, K401, K403, K406, K410, K411, K413, K414 \
|
k40, k41, k43, k46, k4A, k4B, k4D, k4E \
|
||||||
) LAYOUT_all( \
|
) { \
|
||||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K013,\
|
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, XXX }, \
|
||||||
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
|
{ k10, XXX, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E }, \
|
||||||
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K214, \
|
{ k20, XXX, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, XXX, k2E }, \
|
||||||
K300, KC_NO,K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, KC_NO,\
|
{ k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, XXX, k3D, XXX }, \
|
||||||
K400, K401, K403, K406, K410, K411, K413, K414 \
|
{ k40, k41, XXX, k43, XXX, XXX, k46, XXX, XXX, XXX, k4A, k4B, XXX, k4D, k4E } \
|
||||||
)
|
}
|
||||||
|
|
||||||
/* ISO variant. Remove useless ANSI keys */
|
/* ISO variant. Remove useless ANSI keys */
|
||||||
#define LAYOUT_60_iso( \
|
#define LAYOUT_60_iso( \
|
||||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, \
|
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, \
|
||||||
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \
|
k10, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, \
|
||||||
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \
|
k20, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, \
|
||||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \
|
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3D, \
|
||||||
K400, K401, K403, K406, K410, K411, K413, K414 \
|
k40, k41, k43, k46, k4A, k4B, k4D, k4E \
|
||||||
) LAYOUT_all( \
|
) { \
|
||||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K013,\
|
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, XXX }, \
|
||||||
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K214, \
|
{ k10, XXX, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, XXX }, \
|
||||||
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \
|
{ k20, XXX, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E }, \
|
||||||
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, KC_NO,\
|
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, XXX, k3D, XXX }, \
|
||||||
K400, K401, K403, K406, K410, K411, K413, K414 \
|
{ k40, k41, XXX, k43, XXX, XXX, k46, XXX, XXX, XXX, k4A, k4B, XXX, k4D, k4E } \
|
||||||
)
|
}
|
||||||
|
|
||||||
/* HHKB Variant */
|
/* HHKB Variant */
|
||||||
#define LAYOUT_60_ansi_split_bs_rshift( \
|
#define LAYOUT_60_ansi_split_bs_rshift( \
|
||||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \
|
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, \
|
||||||
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
|
k10, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, \
|
||||||
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, \
|
k20, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2E, \
|
||||||
K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \
|
k30, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3D, k3E, \
|
||||||
K400, K401, K403, K406, K410, K411, K413, K414 \
|
k40, k41, k43, k46, k4A, k4B, k4D, k4E \
|
||||||
) LAYOUT_all( \
|
) { \
|
||||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014,\
|
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E }, \
|
||||||
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
|
{ k10, XXX, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E }, \
|
||||||
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K214, \
|
{ k20, XXX, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, XXX, k2E }, \
|
||||||
K300, KC_NO,K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314,\
|
{ k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, XXX, k3D, k3E }, \
|
||||||
K400, K401, K403, K406, K410, K411, K413, K414 \
|
{ k40, k41, XXX, k43, XXX, XXX, k46, XXX, XXX, XXX, k4A, k4B, XXX, k4D, k4E } \
|
||||||
)
|
}
|
||||||
|
|
||||||
/* HHKB Variant */
|
/* HHKB Variant */
|
||||||
#define LAYOUT_60_hhkb( \
|
#define LAYOUT_60_hhkb( \
|
||||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \
|
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, \
|
||||||
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
|
k10, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, \
|
||||||
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, \
|
k20, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2E, \
|
||||||
K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \
|
k30, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3D, k3E, \
|
||||||
K401, K403, K406, K411, K413 \
|
k41, k43, k46, k4B, k4D \
|
||||||
) LAYOUT_all( \
|
) { \
|
||||||
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \
|
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E }, \
|
||||||
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
|
{ k10, XXX, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E }, \
|
||||||
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K214, \
|
{ k20, XXX, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, XXX, k2E }, \
|
||||||
K300, KC_NO,K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \
|
{ k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, XXX, k3D, k3E }, \
|
||||||
KC_NO,K401, K403, K406, KC_NO,K411, K413, KC_NO \
|
{ XXX, k41, XXX, k43, XXX, XXX, k46, XXX, XXX, XXX, XXX, k4B, XXX, k4D, XXX } \
|
||||||
)
|
}
|
||||||
@@ -20,8 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#include "config_common.h"
|
#include "config_common.h"
|
||||||
|
|
||||||
/* USB Device descriptor parameter */
|
/* USB Device descriptor parameter */
|
||||||
#define VENDOR_ID 0xFEED
|
#define VENDOR_ID 0x6F75 // "ou"
|
||||||
#define PRODUCT_ID 0x2010
|
#define PRODUCT_ID 0x5516 // "U" 16
|
||||||
#define DEVICE_VER 0x0001
|
#define DEVICE_VER 0x0001
|
||||||
#define MANUFACTURER 1upkeyboards
|
#define MANUFACTURER 1upkeyboards
|
||||||
#define PRODUCT super16
|
#define PRODUCT super16
|
||||||
@@ -219,34 +219,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
/*
|
|
||||||
* HD44780 LCD Display Configuration
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#define LCD_LINES 2 //< number of visible lines of the display
|
|
||||||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
|
||||||
|
|
||||||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define LCD_PORT PORTB //< port for the LCD lines
|
|
||||||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
|
||||||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
|
||||||
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
|
||||||
#define LCD_RS_PIN 3 //< pin for RS line
|
|
||||||
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
|
||||||
#define LCD_RW_PIN 2 //< pin for RW line
|
|
||||||
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
|
||||||
#define LCD_E_PIN 1 //< pin for Enable line
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Bootmagic Lite key configuration */
|
/* Bootmagic Lite key configuration */
|
||||||
// #define BOOTMAGIC_LITE_ROW 0
|
// #define BOOTMAGIC_LITE_ROW 0
|
||||||
// #define BOOTMAGIC_LITE_COLUMN 0
|
// #define BOOTMAGIC_LITE_COLUMN 0
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[0] = LAYOUT_ortho_4x4(
|
||||||
|
KC_7, KC_8, KC_9, KC_ASTR,
|
||||||
|
KC_4, KC_5, KC_6, KC_SLSH,
|
||||||
|
KC_1, KC_2, KC_3, KC_MINS,
|
||||||
|
KC_0, KC_ENT, KC_DOT, MO(1)
|
||||||
|
),
|
||||||
|
|
||||||
|
[1] = LAYOUT_ortho_4x4(
|
||||||
|
RESET, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
|
||||||
|
),
|
||||||
|
|
||||||
|
[2] = LAYOUT_ortho_4x4(
|
||||||
|
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
|
||||||
|
),
|
||||||
|
|
||||||
|
[3] = LAYOUT_ortho_4x4(
|
||||||
|
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
|
||||||
|
),
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
VIA_ENABLE = yes
|
||||||
|
LTO_ENABLE = yes
|
||||||
@@ -31,6 +31,5 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
|
|
||||||
|
|
||||||
LAYOUTS = ortho_4x4 numpad_4x4
|
LAYOUTS = ortho_4x4 numpad_4x4
|
||||||
@@ -197,31 +197,3 @@
|
|||||||
|
|
||||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
/*
|
|
||||||
* HD44780 LCD Display Configuration
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#define LCD_LINES 2 //< number of visible lines of the display
|
|
||||||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
|
||||||
|
|
||||||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define LCD_PORT PORTB //< port for the LCD lines
|
|
||||||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
|
||||||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
|
||||||
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
|
||||||
#define LCD_RS_PIN 3 //< pin for RS line
|
|
||||||
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
|
||||||
#define LCD_RW_PIN 2 //< pin for RW line
|
|
||||||
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
|
||||||
#define LCD_E_PIN 1 //< pin for Enable line
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
@@ -30,7 +30,6 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
|
|
||||||
|
|
||||||
# Enable generic behavior for split boards
|
# Enable generic behavior for split boards
|
||||||
SPLIT_KEYBOARD = yes
|
SPLIT_KEYBOARD = yes
|
||||||
|
|||||||
@@ -224,34 +224,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
/*
|
|
||||||
* HD44780 LCD Display Configuration
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#define LCD_LINES 2 //< number of visible lines of the display
|
|
||||||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
|
||||||
|
|
||||||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define LCD_PORT PORTB //< port for the LCD lines
|
|
||||||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
|
||||||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
|
||||||
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
|
||||||
#define LCD_RS_PIN 3 //< pin for RS line
|
|
||||||
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
|
||||||
#define LCD_RW_PIN 2 //< pin for RW line
|
|
||||||
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
|
||||||
#define LCD_E_PIN 1 //< pin for Enable line
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Bootmagic Lite key configuration */
|
/* Bootmagic Lite key configuration */
|
||||||
// #define BOOTMAGIC_LITE_ROW 0
|
// #define BOOTMAGIC_LITE_ROW 0
|
||||||
// #define BOOTMAGIC_LITE_COLUMN 0
|
// #define BOOTMAGIC_LITE_COLUMN 0
|
||||||
@@ -30,4 +30,3 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
|
|
||||||
@@ -164,31 +164,3 @@
|
|||||||
|
|
||||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
/*
|
|
||||||
* HD44780 LCD Display Configuration
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#define LCD_LINES 2 //< number of visible lines of the display
|
|
||||||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
|
||||||
|
|
||||||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define LCD_PORT PORTB //< port for the LCD lines
|
|
||||||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
|
||||||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
|
||||||
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
|
||||||
#define LCD_RS_PIN 3 //< pin for RS line
|
|
||||||
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
|
||||||
#define LCD_RW_PIN 2 //< pin for RW line
|
|
||||||
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
|
||||||
#define LCD_E_PIN 1 //< pin for Enable line
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
@@ -29,6 +29,5 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
|
|
||||||
|
|
||||||
LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16
|
LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16
|
||||||
@@ -173,31 +173,3 @@
|
|||||||
|
|
||||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
/*
|
|
||||||
* HD44780 LCD Display Configuration
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#define LCD_LINES 2 //< number of visible lines of the display
|
|
||||||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
|
||||||
|
|
||||||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define LCD_PORT PORTB //< port for the LCD lines
|
|
||||||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
|
||||||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
|
||||||
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
|
||||||
#define LCD_RS_PIN 3 //< pin for RS line
|
|
||||||
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
|
||||||
#define LCD_RW_PIN 2 //< pin for RW line
|
|
||||||
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
|
||||||
#define LCD_E_PIN 1 //< pin for Enable line
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
@@ -29,6 +29,5 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
|
|
||||||
|
|
||||||
LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15
|
LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15
|
||||||
@@ -198,31 +198,3 @@
|
|||||||
|
|
||||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
/*
|
|
||||||
* HD44780 LCD Display Configuration
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#define LCD_LINES 2 //< number of visible lines of the display
|
|
||||||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
|
||||||
|
|
||||||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define LCD_PORT PORTB //< port for the LCD lines
|
|
||||||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
|
||||||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
|
||||||
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
|
||||||
#define LCD_RS_PIN 3 //< pin for RS line
|
|
||||||
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
|
||||||
#define LCD_RW_PIN 2 //< pin for RW line
|
|
||||||
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
|
||||||
#define LCD_E_PIN 1 //< pin for Enable line
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
@@ -30,7 +30,6 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
|
|
||||||
|
|
||||||
# Enable generic behavior for split boards
|
# Enable generic behavior for split boards
|
||||||
SPLIT_KEYBOARD = yes
|
SPLIT_KEYBOARD = yes
|
||||||
@@ -198,31 +198,3 @@
|
|||||||
|
|
||||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
/*
|
|
||||||
* HD44780 LCD Display Configuration
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#define LCD_LINES 2 //< number of visible lines of the display
|
|
||||||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
|
||||||
|
|
||||||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define LCD_PORT PORTB //< port for the LCD lines
|
|
||||||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
|
||||||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
|
||||||
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
|
||||||
#define LCD_RS_PIN 3 //< pin for RS line
|
|
||||||
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
|
||||||
#define LCD_RW_PIN 2 //< pin for RW line
|
|
||||||
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
|
||||||
#define LCD_E_PIN 1 //< pin for Enable line
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
@@ -30,7 +30,6 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
|
|
||||||
|
|
||||||
# Enable generic behavior for split boards
|
# Enable generic behavior for split boards
|
||||||
SPLIT_KEYBOARD = yes
|
SPLIT_KEYBOARD = yes
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
|
|
||||||
TAP_DANCE_ENABLE = no
|
TAP_DANCE_ENABLE = no
|
||||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend (it uses the same timer as BACKLIGHT_ENABLE)
|
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend (it uses the same timer as BACKLIGHT_ENABLE)
|
||||||
|
|
||||||
|
|||||||
@@ -212,34 +212,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
/*
|
|
||||||
* HD44780 LCD Display Configuration
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#define LCD_LINES 2 //< number of visible lines of the display
|
|
||||||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
|
||||||
|
|
||||||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define LCD_PORT PORTB //< port for the LCD lines
|
|
||||||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
|
||||||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
|
||||||
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
|
||||||
#define LCD_RS_PIN 3 //< pin for RS line
|
|
||||||
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
|
||||||
#define LCD_RW_PIN 2 //< pin for RW line
|
|
||||||
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
|
||||||
#define LCD_E_PIN 1 //< pin for Enable line
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Bootmagic Lite key configuration */
|
/* Bootmagic Lite key configuration */
|
||||||
// #define BOOTMAGIC_LITE_ROW 0
|
// #define BOOTMAGIC_LITE_ROW 0
|
||||||
// #define BOOTMAGIC_LITE_COLUMN 0
|
// #define BOOTMAGIC_LITE_COLUMN 0
|
||||||
@@ -30,7 +30,6 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
|
|
||||||
|
|
||||||
# Enable generic behavior for split boards
|
# Enable generic behavior for split boards
|
||||||
SPLIT_KEYBOARD = yes
|
SPLIT_KEYBOARD = yes
|
||||||
@@ -154,34 +154,6 @@
|
|||||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
/*
|
|
||||||
* HD44780 LCD Display Configuration
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#define LCD_LINES 2 //< number of visible lines of the display
|
|
||||||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
|
||||||
|
|
||||||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define LCD_PORT PORTB //< port for the LCD lines
|
|
||||||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
|
||||||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
|
||||||
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
|
||||||
#define LCD_RS_PIN 3 //< pin for RS line
|
|
||||||
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
|
||||||
#define LCD_RW_PIN 2 //< pin for RW line
|
|
||||||
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
|
||||||
#define LCD_E_PIN 1 //< pin for Enable line
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Bootmagic Lite key configuration */
|
/* Bootmagic Lite key configuration */
|
||||||
// #define BOOTMAGIC_LITE_ROW 0
|
// #define BOOTMAGIC_LITE_ROW 0
|
||||||
// #define BOOTMAGIC_LITE_COLUMN 0
|
// #define BOOTMAGIC_LITE_COLUMN 0
|
||||||
@@ -17,7 +17,6 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
|
|
||||||
|
|
||||||
LAYOUTS = ortho_5x15
|
LAYOUTS = ortho_5x15
|
||||||
DEFAULT_FOLDER = 40percentclub/i75/promicro
|
DEFAULT_FOLDER = 40percentclub/i75/promicro
|
||||||
@@ -208,32 +208,6 @@
|
|||||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
/*
|
|
||||||
* HD44780 LCD Display Configuration
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#define LCD_LINES 2 //< number of visible lines of the display
|
|
||||||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
|
||||||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define LCD_PORT PORTB //< port for the LCD lines
|
|
||||||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
|
||||||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
|
||||||
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
|
||||||
#define LCD_RS_PIN 3 //< pin for RS line
|
|
||||||
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
|
||||||
#define LCD_RW_PIN 2 //< pin for RW line
|
|
||||||
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
|
||||||
#define LCD_E_PIN 1 //< pin for Enable line
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Bootmagic Lite key configuration */
|
/* Bootmagic Lite key configuration */
|
||||||
// #define BOOTMAGIC_LITE_ROW 0
|
// #define BOOTMAGIC_LITE_ROW 0
|
||||||
// #define BOOTMAGIC_LITE_COLUMN 0
|
// #define BOOTMAGIC_LITE_COLUMN 0
|
||||||
@@ -30,4 +30,3 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
|
|
||||||
@@ -186,31 +186,3 @@
|
|||||||
|
|
||||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
/*
|
|
||||||
* HD44780 LCD Display Configuration
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#define LCD_LINES 2 //< number of visible lines of the display
|
|
||||||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
|
||||||
|
|
||||||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define LCD_PORT PORTB //< port for the LCD lines
|
|
||||||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
|
||||||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
|
||||||
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
|
||||||
#define LCD_RS_PIN 3 //< pin for RS line
|
|
||||||
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
|
||||||
#define LCD_RW_PIN 2 //< pin for RW line
|
|
||||||
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
|
||||||
#define LCD_E_PIN 1 //< pin for Enable line
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
@@ -30,6 +30,5 @@ UNICODE_ENABLE = no # Unicode
|
|||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
|
|
||||||
|
|
||||||
LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12
|
LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12
|
||||||
Loaded 100 of 1683 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user