diff options
author | fauxpark <fauxpark@gmail.com> | 2019-12-27 14:31:48 +1100 |
---|---|---|
committer | Joel Challis <git@zvecr.com> | 2019-12-27 03:31:48 +0000 |
commit | b359830ea2f92010a8c5459cbb610857fe5d6675 (patch) | |
tree | 709e10bae661077c184fab53033d779dea610137 | |
parent | c32d0857104eb07ee99258387f118fc63385343c (diff) | |
download | qmk_firmware-b359830ea2f92010a8c5459cbb610857fe5d6675.tar.gz qmk_firmware-b359830ea2f92010a8c5459cbb610857fe5d6675.zip |
Fix file encoding for zh-cn/custom_quantum_functions.md (#7665)
-rw-r--r-- | docs/zh-cn/custom_quantum_functions.md | 324 |
1 files changed, 162 insertions, 162 deletions
diff --git a/docs/zh-cn/custom_quantum_functions.md b/docs/zh-cn/custom_quantum_functions.md index 42ceba9ca..f2c6098dc 100644 --- a/docs/zh-cn/custom_quantum_functions.md +++ b/docs/zh-cn/custom_quantum_functions.md | |||
@@ -1,31 +1,31 @@ | |||
1 | # 如何定制你键盘的能 | 1 | # 備綍瀹氬埗浣犻敭鐩樼殑鍔熻兘 |
2 | 2 | ||
3 | 对于很多人来说客制化键盘可不只是向你的电脑发送你按了那个件这么简单。你肯定想实现比简单按键和宏更复杂的功能。QMK有能让你注入代码的钩子, 覆盖功能, 另外,还可以自定义键盘在不同情况下的行为。 | 3 | 瀵逛簬寰堝浜烘潵璇村鍒跺寲閿洏鍙笉鍙槸鍚戜綘鐨勭數鑴戝彂閫佷綘鎸変簡閭d釜浠惰繖涔堢畝鍗曘備綘鑲畾鎯冲疄鐜版瘮绠鍗曟寜閿拰瀹忔洿澶嶆潅鐨勫姛鑳姐俀MK鏈夎兘璁╀綘娉ㄥ叆浠g爜鐨勯挬瀛, 瑕嗙洊鍔熻兘, 鍙﹀锛岃繕鍙互鑷畾涔夐敭鐩樺湪涓嶅悓鎯呭喌涓嬬殑琛屼负銆 |
4 | 4 | ||
5 | 本页不假定任何特殊的QMK知识,但阅读[理解QMK](understanding_qmk.md)将会在更基础的层面帮你理解发生了什么。 | 5 | 鏈〉涓嶅亣瀹氫换浣曠壒娈婄殑QMK鐭ヨ瘑锛屼絾闃呰[鐞嗚ВQMK](understanding_qmk.md)灏嗕細鍦ㄦ洿鍩虹鐨勫眰闈㈠府浣犵悊瑙e彂鐢熶簡浠涔堛 |
6 | 6 | ||
7 | ## A Word on Core vs 键盘 vs 布局 | 7 | ## A Word on Core vs 閿洏 vs 甯冨眬 |
8 | 8 | ||
9 | 我们把qmk组织成桓霾愦谓峁梗 | 9 | 鎴戜滑鎶qmk勭粐鎴愪涓眰娆$粨鏋勶細 |
10 | 10 | ||
11 | * Core (`_quantum`) | 11 | * Core (`_quantum`) |
12 | * Keyboard/Revision (`_kb`) | 12 | * Keyboard/Revision (`_kb`) |
13 | * Keymap (`_user`) | 13 | * Keymap (`_user`) |
14 | 14 | ||
15 | 下面描述的每一个函数都可以在定义上加一个`_kb()`或 `_user()` 后缀。 建议在键盘/修订层使用`_kb()`后缀,在布局层使用`_user()`后缀。 | 15 | 涓嬮潰鎻忚堪鐨勬瘡涓涓嚱鏁伴兘鍙互鍦ㄥ畾涔変笂鍔犱竴涓猔_kb()`鎴 `_user()` 鍚庣紑銆 寤鸿鍦ㄩ敭鐩/淇灞備娇鐢╜_kb()`鍚庣紑锛屽湪甯冨眬灞備娇鐢╜_user()`鍚庣紑銆 |
16 | 16 | ||
17 | 在键盘/修订层定义函数时,`_kb()`在执行任何代码前先调用`_user()`是必要的,不然布局层函数就不要被调用。 | 17 | 鍦ㄩ敭鐩/淇灞傚畾涔夊嚱鏁版椂锛宍_kb()`鍦ㄦ墽琛屼换浣曚唬鐮佸墠鍏堣皟鐢╜_user()`鏄繀瑕佺殑锛屼笉鐒跺竷灞灞傚嚱鏁板氨涓嶈琚皟鐢ㄣ |
18 | <!-- 翻译问题:上面那翻译的太好--> | 18 | <!-- 缈昏瘧闂锛笂闈㈤偅鍙ョ璇戠殑涓嶅お濂--> |
19 | # 自定键码 | 19 | # 鑷畾涔夐敭鐮 |
20 | 20 | ||
21 | 到目前为止,最常见的任务是更改现有键码的行为或创建新的键码。从代码角度来看这些操作都很相似。 | 21 | 鍒扮洰鍓嶄负姝紝鏈甯歌鐨勪换鍔℃槸鏇存敼鐜版湁閿爜鐨勮涓烘垨鍒涘缓鏂扮殑閿爜銆備粠浠g爜瑙掑害鏉ョ湅杩欎簺鎿嶄綔閮藉緢鐩镐技銆 |
22 | 22 | ||
23 | ## 定一鲂录 | 23 | ## 畾涔変涓柊閿爜 |
24 | 24 | ||
25 | 创建键码第一步,先枚举出它全部,也就是给键码起个名字并分配唯一数值。QMK没有直接限制最大键码值大小,而是提供了一个`SAFE_RANGE`宏。你可以在枚举时用`SAFE_RANGE`来保证你取得了唯一的键码值。 | 25 | 鍒涘缓閿爜绗竴姝ワ紝鍏堟灇涓惧嚭瀹冨叏閮紝涔熷氨鏄粰閿爜璧蜂釜鍚嶅瓧骞跺垎閰嶅敮涓鏁板笺俀MK娌℃湁鐩存帴闄愬埗鏈澶ч敭鐮佸煎ぇ灏忥紝鑰屾槸鎻愪緵浜嗕竴涓猔SAFE_RANGE`瀹忋備綘鍙互鍦ㄦ灇涓炬椂鐢╜SAFE_RANGE`鏉ヤ繚璇佷綘鍙栧緱浜嗗敮涓鐨勯敭鐮佸笺 |
26 | 26 | ||
27 | 27 | ||
28 | 这有枚倭黾氲睦印0颜饪加到`keymap.c`的你就在布局中能用`FOO`和`BAR`了。 | 28 | 杩欐湁鏋氫や釜敭鐮佺殑渚嬪瓙銆傛妸杩欏潡鍔犲埌`keymap.c`鐨勮瘽浣犲卞湪甯冨眬涓兘鐢`FOO`鍜`BAR`浜嗐 |
29 | 29 | ||
30 | ```c | 30 | ```c |
31 | enum my_keycodes { | 31 | enum my_keycodes { |
@@ -34,46 +34,46 @@ enum my_keycodes { | |||
34 | }; | 34 | }; |
35 | ``` | 35 | ``` |
36 | 36 | ||
37 | ## 为氲男形喑 | 37 | ## 涓洪敭鐮佺殑琛屼负栫▼ |
38 | 38 | ||
39 | 当你覆盖一个已存在按键的行为时,或将这个行为赋给新键时,你要用`process_record_kb()`和`process_record_user()`函数。这俩函数在键处理中真实键事件被处理前被QMK调用。如果这俩函数返回`true`,QMK将会用正常的方式处理键码。这样可以很方便的扩展键码的功能而不是替换它。如果函数返回`false` QMK会跳过正常键处理,然后发送键子抬起还是按下事件就由你决定了。 | 39 | 褰撲綘瑕嗙洊涓涓凡瀛樺湪鎸夐敭鐨勮涓烘椂锛屾垨灏嗚繖涓涓鸿祴缁欐柊閿椂锛屼綘瑕佺敤`process_record_kb()`鍜宍process_record_user()`鍑芥暟銆傝繖淇╁嚱鏁板湪閿鐞嗕腑鐪熷疄閿簨浠惰澶勭悊鍓嶈QMK璋冪敤銆傚鏋滆繖淇╁嚱鏁拌繑鍥瀈true`锛孮MK灏嗕細鐢ㄦ甯哥殑鏂瑰紡澶勭悊閿爜銆傝繖鏍峰彲浠ュ緢鏂逛究鐨勬墿灞曢敭鐮佺殑鍔熻兘鑰屼笉鏄浛鎹㈠畠銆傚鏋滃嚱鏁拌繑鍥瀈false` QMK浼氳烦杩囨甯搁敭澶勭悊锛岀劧鍚庡彂閫侀敭瀛愭姮璧疯繕鏄寜涓嬩簨浠跺氨鐢变綘鍐冲畾浜嗐 |
40 | 40 | ||
41 | 当某聪禄蚴头攀闭饬┖岜坏饔谩 | 41 | 褰撴煇敭鎸変笅鎴栭噴鏀炬椂杩欎咯鍑芥暟氳冪敤銆 |
42 | 42 | ||
43 | ### process_record_user()`例实现 | 43 | ### process_record_user()`鍑芥暟绀嬪疄鐜 |
44 | 44 | ||
45 | 这隼幼隽肆鍪隆W远ㄒ了一鼋凶`FOO`的氲男形⒉了在按下回凳辈シ乓舴 | 45 | 杩欎緥瀛愬仛浜嗕や釜浜嬨傝嚜畾涔変簡涓彨鍋`FOO`鐨勯敭鐮佺殑琛屼负屽惰ˉ鍏簡鍦ㄦ寜涓嬪洖杞︽椂鎾斁闊绗︺ |
46 | 46 | ||
47 | ```c | 47 | ```c |
48 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | 48 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
49 | switch (keycode) { | 49 | switch (keycode) { |
50 | case FOO: | 50 | case FOO: |
51 | if (record->event.pressed) { | 51 | if (record->event.pressed) { |
52 | // 按下时做些什么 | 52 | // 鎸変笅鏃跺仛浜涗粈涔 |
53 | } else { | 53 | } else { |
54 | // 释放时做些什么 | 54 | // 閲婃斁鏃跺仛浜涗粈涔 |
55 | } | 55 | } |
56 | return false; // 跳过此键的所有进一步处理 | 56 | return false; // 璺宠繃姝ら敭鐨勬墍鏈夎繘涓姝ュ鐞 |
57 | case KC_ENTER: | 57 | case KC_ENTER: |
58 | // 当按下回凳辈シ乓舴 | 58 | // 褰撴寜涓嬪洖杞︽椂鎾斁闊绗 |
59 | if (record->event.pressed) { | 59 | if (record->event.pressed) { |
60 | PLAY_NOTE_ARRAY(tone_qwerty); | 60 | PLAY_NOTE_ARRAY(tone_qwerty); |
61 | } | 61 | } |
62 | return true; // 让QMK触发回车按下/释放事件 | 62 | return true; // 璁QMK瑙﹀彂鍥炶溅鎸変笅/閲婃斁浜嬩欢 |
63 | default: | 63 | default: |
64 | return true; // 正处理他键码 | 64 | return true; // 姝甯稿鐞嗗叾粬閿爜 |
65 | } | 65 | } |
66 | } | 66 | } |
67 | ``` | 67 | ``` |
68 | 68 | ||
69 | ### `process_record_*` 函数文档 | 69 | ### `process_record_*` 鍑芥暟鏂囨。 |
70 | 70 | ||
71 | * 键盘/修订: `bool process_record_kb(uint16_t keycode, keyrecord_t *record)` | 71 | * 閿洏/淇: `bool process_record_kb(uint16_t keycode, keyrecord_t *record)` |
72 | * 布局: `bool process_record_user(uint16_t keycode, keyrecord_t *record)` | 72 | * 甯冨眬: `bool process_record_user(uint16_t keycode, keyrecord_t *record)` |
73 | 73 | ||
74 | `keycode(键码)`参数是在布局上定义的,比如`MO(1)`, `KC_L`, 等等。 你要用 `switch...case` 块来处理这些事件。 | 74 | `keycode(閿爜)`鍙傛暟鏄湪甯冨眬涓婂畾涔夌殑锛屾瘮濡俙MO(1)`, `KC_L`, 绛夌瓑銆 浣犺鐢 `switch...case` 鍧楁潵澶勭悊杩欎簺浜嬩欢銆 |
75 | 75 | ||
76 | `record`参数含有实际男畔ⅲ | 76 | `record`鍙傛鍚湁瀹為檯鎸夐敭鐨勪俊鎭 |
77 | 77 | ||
78 | ```c | 78 | ```c |
79 | keyrecord_t record { | 79 | keyrecord_t record { |
@@ -88,9 +88,9 @@ keyrecord_t record { | |||
88 | } | 88 | } |
89 | ``` | 89 | ``` |
90 | 90 | ||
91 | # LED控制 | 91 | # LED鎺у埗 |
92 | 92 | ||
93 | qmk提供了读取HID规范包含的5LED的方法。: | 93 | qmk鎻愪緵浜嗚鍙HID瑙勮寖鍖呭惈鐨5LED鐨勬柟娉曘: |
94 | 94 | ||
95 | * `USB_LED_NUM_LOCK` | 95 | * `USB_LED_NUM_LOCK` |
96 | * `USB_LED_CAPS_LOCK` | 96 | * `USB_LED_CAPS_LOCK` |
@@ -98,20 +98,20 @@ qmk提供了读取HID规范包含的5个LED的方法。: | |||
98 | * `USB_LED_COMPOSE` | 98 | * `USB_LED_COMPOSE` |
99 | * `USB_LED_KANA` | 99 | * `USB_LED_KANA` |
100 | 100 | ||
101 | 这甯龀A慷杂τ谥LED状态的位置位。 | 101 | 杩欎簲涓甯搁噺瀵瑰簲浜庝鏈LED鐘舵佺殑浣嶇疆浣嶃 |
102 | 有两种方法可以竦弥LED状态: | 102 | 鏈変袱绉嶆柟娉曞彲ヨ幏寰椾鏈LED鐘舵侊細 |
103 | 103 | ||
104 | * 通过执行 `led_set_user()` | 104 | * 閫氳繃鎵ц `led_set_user()` |
105 | * 过调用 `host_keyboard_leds()` | 105 | * 閫氳繃璋冪 `host_keyboard_leds()` |
106 | 106 | ||
107 | ## `led_set_user()` | 107 | ## `led_set_user()` |
108 | 108 | ||
109 | 当5LED中任何一龅淖刺枰谋时,此函数将被调用。此函数过参数输入LED参数。 | 109 | 褰5LED换浣曚釜鐨勭姸鎬侀渶瑕佹敼鍙樻椂锛屾鍑鏁板皢琚璋冪銆傛鍑芥暟閫氳繃鍙傛暟杈撳叆LED鍙傛暟銆 |
110 | 使用`IS_LED_ON(usb_led, led_name)`和`IS_LED_OFF(usb_led, led_name)`这两龊昀醇觳LED状态。 | 110 | 浣跨敤`IS_LED_ON(usb_led, led_name)`鍜`IS_LED_OFF(usb_led, led_name)`杩欎や釜瀹忔潵妫鏌LED鐘舵併 |
111 | 111 | ||
112 | !> `host_keyboard_leds()`可能会在`led_set_user()`被调用返回新值。 | 112 | !> `host_keyboard_leds()`鍙兘浼氬湪`led_set_user()`琚冪敤鍓嶈繑鍥炴柊鍊笺 |
113 | 113 | ||
114 | ### `led_set_user()`例实现 | 114 | ### `led_set_user()`鍑芥暟绀嬪疄鐜 |
115 | 115 | ||
116 | ```c | 116 | ```c |
117 | void led_set_user(uint8_t usb_led) { | 117 | void led_set_user(uint8_t usb_led) { |
@@ -143,59 +143,59 @@ void led_set_user(uint8_t usb_led) { | |||
143 | } | 143 | } |
144 | ``` | 144 | ``` |
145 | 145 | ||
146 | ### `led_set_*`函数文档 | 146 | ### `led_set_*`鍑芥暟鏂囨。 |
147 | 147 | ||
148 | * 键盘/修订: `void led_set_kb(uint8_t usb_led)` | 148 | * 閿洏/淇: `void led_set_kb(uint8_t usb_led)` |
149 | * 布局: `void led_set_user(uint8_t usb_led)` | 149 | * 甯冨眬: `void led_set_user(uint8_t usb_led)` |
150 | 150 | ||
151 | ## `host_keyboard_leds()` | 151 | ## `host_keyboard_leds()` |
152 | 152 | ||
153 | 调用这个函数会返回最后收到的LED状态。这个函数在`led_set_*`之外读取LED状态时很有用,比如在[`matrix_scan_user()`](#矩阵扫描代码). | 153 | 璋冪敤杩欎釜鍑芥暟浼氳繑鍥炴渶鍚庢敹鍒扮殑LED鐘舵併傝繖涓嚱鏁板湪`led_set_*`涔嬪璇诲彇LED鐘舵佹椂寰堟湁鐢紝姣斿鍦╗`matrix_scan_user()`](#鐭╅樀鎵弿浠g爜). |
154 | 为了便捷,你可以用`IS_HOST_LED_ON(led_name)`和`IS_HOST_LED_OFF(led_name)` 宏,而不直接调用和检查`host_keyboard_leds()`。 | 154 | 涓轰簡渚挎嵎锛屼綘鍙互鐢╜IS_HOST_LED_ON(led_name)`鍜宍IS_HOST_LED_OFF(led_name)` 瀹忥紝鑰屼笉鐩存帴璋冪敤鍜屾鏌host_keyboard_leds()`銆 |
155 | 155 | ||
156 | ## 置物理LED状态 | 156 | ## 缃墿鐞LED鐘舵 |
157 | 157 | ||
158 | 一些键盘实现了为置物理LED的状态提┝朔奖的方法。 | 158 | 涓浜涢敭鐩樺疄鐜颁簡涓缃墿鐞LED鐨勭姸鎬佹彁渚涗簡鏂渚跨殑鏂规硶 |
159 | 159 | ||
160 | ### Ergodox Boards | 160 | ### Ergodox Boards |
161 | 161 | ||
162 | Ergodox实现了提供`ergodox_right_led_1`/`2`/`3_on`/`off()`来让每个LED开或关, 也可以用 `ergodox_right_led_on`/`off(uint8_t led)` 按索引打开或关闭他们。 | 162 | Ergodox瀹炵幇浜嗘彁渚沗ergodox_right_led_1`/`2`/`3_on`/`off()`鏉ヨ姣忎釜LED寮鎴栧叧, 涔熷彲浠ョ敤 `ergodox_right_led_on`/`off(uint8_t led)` 鎸夌储寮曟墦寮鎴栧叧闂粬浠 |
163 | 163 | ||
164 | 此外,还可以使用`ergodox_led_all_set(uint8_t n)`指定所有LED的亮度级别;针对每个LED用`ergodox_right_led_1`/`2`/`3_set(uint8_t n)`;使用索引的话用`ergodox_right_led_set(uint8_t led, uint8_t n)`。 | 164 | 姝ゅ锛岃繕鍙互浣跨敤`ergodox_led_all_set(uint8_t n)`鎸囧畾鎵鏈塋ED鐨勪寒搴︾骇鍒紱閽堝姣忎釜LED鐢╜ergodox_right_led_1`/`2`/`3_set(uint8_t n)`锛涗娇鐢ㄧ储寮曠殑璇濈敤`ergodox_right_led_set(uint8_t led, uint8_t n)`銆 |
165 | 165 | ||
166 | Ergodox boards 同时定了最低亮燃侗`LED_BRIGHTNESS_LO`妥罡吡炼燃侗`LED_BRIGHTNESS_HI`(默认最高). | 166 | Ergodox boards 悓鏃瀹氫箟浜嗘渶浣庝寒搴︾骇鍒`LED_BRIGHTNESS_LO`鍜屾渶楂樹害绾у埆`LED_BRIGHTNESS_HI`(榛樿鏈楂). |
167 | 167 | ||
168 | # 键盘初始 | 168 | # 閿洏鍒濆鍖栦g爜 |
169 | 169 | ||
170 | 键盘初始化过程有个骤你是用那【鲇谀想要做什么。 | 170 | 閿洏鍒濆鍖栬繃绋嬫湁鍑犱楠ゃ備犳槸鐢ㄩ嚱鏁板彇鍐充庝綘鎯宠鍋氫粈涔 |
171 | 171 | ||
172 | 有三鲋饕初始吹饔盟承蛄谐 | 172 | 鏈変変涓瑕佸垵濮嬪寲鍑芥锛屾寜璋冪敤哄簭鍒楀嚭銆 |
173 | 173 | ||
174 | * `keyboard_pre_init_*` - 会在大多数他东西运行运行J视糜谀男┬提前运行的硬件初始化 | 174 | * `keyboard_pre_init_*` - 細鍦ㄥぇ澶氭鍏朵粬涓滆タ杩愯屽墠繍琛屻傞傜敤浜庡浜涢渶瑕佹彁鍓嶈繍岀殑纭欢鍒濆鍖栥 |
175 | * `matrix_init_*` - 在固件启动过程中被调用。耸庇布殉跏蓟功能尚未初始 | 175 | * `matrix_init_*` - 鍦ㄥ浐浠鍚鍔ㄨ繃绋腑闂琚皟鐢ㄣ傛鏃剁跺凡鍒濆鍖栵紝鍔熻兘灏氭湭鍒濆鍖栥 |
176 | * `keyboard_post_init_*` - 在固件启动过程最后被调用。大多数情况下,你的“客制化”代码都可以放在这里。 | 176 | * `keyboard_post_init_*` - 鍦ㄥ浐浠跺惎鍔ㄨ繃绋嬫渶鍚庤璋冪敤銆傚ぇ澶氭暟鎯呭喌涓嬶紝浣犵殑鈥滃鍒跺寲鈥濅唬鐮侀兘鍙互鏀惧湪杩欓噷銆 |
177 | 177 | ||
178 | !> 对于蠖嗍死此`keyboard_post_init_user`是你想要调用的数。例, 此时你可以置RGB灯发光。 | 178 | !> 瀵逛簬澶у鏁颁汉鏉ヨ碻keyboard_post_init_user`鏄浣犳兂瑕佽皟敤鐨勫嚱鏁般備緥濡, 姝ゆ椂浣犲彲浠缃RGB鐏彂鍏夈 |
179 | 179 | ||
180 | ## 键盘预初始 | 180 | ## 閿洏棰勫垵濮嬪寲g爜 |
181 | 181 | ||
182 | 这代码极早运行踔炼在USB初始化前运行 | 182 | 杩欎鐮佹瀬鏃╄繍琛岋岀敋鑷抽兘鍦USB鍒濆鍖栧墠杩愯屻 |
183 | 183 | ||
184 | 在这之后不久矩阵就怀跏蓟恕 | 184 | 鍦ㄨ繖涔嬪悗涓嶄箙鐭╅樀灏琚垵濮嬪寲浜嗐 |
185 | 185 | ||
186 | 对于大多数用说,这用不到,因为它主要是用于面向硬某跏化 | 186 | 瀵逛簬澶澶氭暟鐢ㄦ埛鏉ヨ,杩欑敤涓嶅埌屽洜涓哄畠涓瑕佹鐢ㄤ簬闈㈠悜欢鐨勫垵濮嬪寲銆 |
187 | 187 | ||
188 | 但果你有硬件初始化的话放在这里再貌还(比如初始疞ED引脚类的). | 188 | 浣嗗鏋滀綘鏈‖跺垵濮嬪寲鐨勮濇斁鍦ㄨ繖閲屽啀濂戒笉杩囦(斿鍒濆鍖LED寮曡剼涓绫鐨). |
189 | 189 | ||
190 | ### `keyboard_pre_init_user()`例实现 | 190 | ### `keyboard_pre_init_user()`鍑芥暟绀嬪疄鐜 |
191 | 191 | ||
192 | 例中在碳侗穑定 B0, B1, B2, B3, 和 B4 是LED引脚。 | 192 | 鏈嬩腑鍦ㄩ敭鐩樼骇鍒瀹 B0, B1, B2, B3, 鍜 B4 鏄LED寮曡剼銆 |
193 | 193 | ||
194 | ```c | 194 | ```c |
195 | void keyboard_pre_init_user(void) { | 195 | void keyboard_pre_init_user(void) { |
196 | // 调用键盘预初始 | 196 | // 璋冪敤閿洏棰勫垵濮嬪寲g爜 |
197 | 197 | ||
198 | // 置LED引脚为出模式 | 198 | // 缃LED寮曡剼负杈撳嚭妯″紡 |
199 | setPinOutput(B0); | 199 | setPinOutput(B0); |
200 | setPinOutput(B1); | 200 | setPinOutput(B1); |
201 | setPinOutput(B2); | 201 | setPinOutput(B2); |
@@ -204,73 +204,73 @@ void keyboard_pre_init_user(void) { | |||
204 | } | 204 | } |
205 | ``` | 205 | ``` |
206 | 206 | ||
207 | ### `keyboard_pre_init_*` 函数文档 | 207 | ### `keyboard_pre_init_*` 鍑芥暟鏂囨。 |
208 | 208 | ||
209 | * 键盘/修订: `void keyboard_pre_init_kb(void)` | 209 | * 閿洏/淇: `void keyboard_pre_init_kb(void)` |
210 | * 布局: `void keyboard_pre_init_user(void)` | 210 | * 甯冨眬: `void keyboard_pre_init_user(void)` |
211 | 211 | ||
212 | ## 矩阵初始 | 212 | ## 鐭╅樀鍒濆鍖栦g爜 |
213 | 213 | ||
214 | 这将会在矩阵初化时被调用,在某硬件置煤螅但在些功能被初化前。 | 214 | 杩欏皢氬湪鐭闃靛垵濮嬪寲鏃璋冪敤锛屽湪鏌愪涚惰缃ソ鍚庯屼絾鍦ㄤ竴浜涘姛鑳借鍒濆鍖栧墠銆 |
215 | 215 | ||
216 | 这在你置他地会用的鞯氖焙岷苡杏茫胗布兀也依赖于它的启动位置。 | 216 | 繖鍦浣犺栧湴鏂浼氱敤鍒扮殑涓滆タ鐨勬椂鍊欎細寰堟湁鐢紝浣嗕笌纭欢鏃犲叧锛屼篃涓嶄緷璧栦簬瀹冪殑鍚鍔ㄤ綅缃 |
217 | 217 | ||
218 | 218 | ||
219 | ### `matrix_init_*`函数文档 | 219 | ### `matrix_init_*`鍑芥暟鏂囨。 |
220 | 220 | ||
221 | * 键盘/修订: `void matrix_init_kb(void)` | 221 | * 閿洏/淇: `void matrix_init_kb(void)` |
222 | * 布局: `void matrix_init_user(void)` | 222 | * 甯冨眬: `void matrix_init_user(void)` |
223 | 223 | ||
224 | 224 | ||
225 | ## 键盘后初始 | 225 | ## 閿洏鍚庡垵濮嬪寲g爜 |
226 | 226 | ||
227 | 这是键盘初始化过程中的最后一个任务。如果您想更改某些特性,这会很有用,因为此时应该对它们进行初始化。 | 227 | 杩欐槸閿洏鍒濆鍖栬繃绋嬩腑鐨勬渶鍚庝竴涓换鍔°傚鏋滄偍鎯虫洿鏀规煇浜涚壒鎬э紝杩欎細寰堟湁鐢紝鍥犱负姝ゆ椂搴旇瀵瑰畠浠繘琛屽垵濮嬪寲銆 |
228 | 228 | ||
229 | 229 | ||
230 | ### `keyboard_post_init_user()`例实现 | 230 | ### `keyboard_post_init_user()`绀轰嬪疄鐜 |
231 | 231 | ||
232 | 本示例在所有初始化完成后运行置RGB灯。 | 232 | 鏈绀緥鍦ㄦ墍鏈夊垵濮嬪寲瀹屾垚鍚庤繍琛岋紝閰嶇疆RGB鐏 |
233 | 233 | ||
234 | ```c | 234 | ```c |
235 | void keyboard_post_init_user(void) { | 235 | void keyboard_post_init_user(void) { |
236 | // 调用后初始 | 236 | // 璋冪敤鍚庡垵濮嬪寲g爜 |
237 | rgblight_enable_noeeprom(); // 使能Rgb,不保存置 | 237 | rgblight_enable_noeeprom(); // 浣胯兘Rgb锛屼笉淇濆瓨缃 |
238 | rgblight_sethsv_noeeprom(180, 255, 255); // 将颜色置蓝绿色(青色)槐4 | 238 | rgblight_sethsv_noeeprom(180, 255, 255); // 灏嗛壊璁剧埌钃濈豢鑹(闈掕)涓嶄繚瀛 |
239 | rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); // 置快速呼吸模不保 | 239 | rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); // 揩閫熷懠鍚ā寮忎笉淇濆瓨 |
240 | } | 240 | } |
241 | ``` | 241 | ``` |
242 | 242 | ||
243 | ### `keyboard_post_init_*` 函数文档 | 243 | ### `keyboard_post_init_*` 鍑芥暟鏂囨。 |
244 | 244 | ||
245 | * 键盘/修订: `void keyboard_post_init_kb(void)` | 245 | * 閿洏/淇: `void keyboard_post_init_kb(void)` |
246 | * 布局: `void keyboard_post_init_user(void)` | 246 | * 甯冨眬: `void keyboard_post_init_user(void)` |
247 | 247 | ||
248 | # 矩阵扫描代码 | 248 | # 鐭╅樀鎵弿浠g爜 |
249 | 249 | ||
250 | 可能的话你要用`process_record_*()`自定义键盘,以这种方式连接到事件中,以确保代码不会对键盘产生负面的性能影响。然而,在极少数情况下,有必要进行矩阵扫描。在这些函数中要特别注意代码的性能,因为它每秒至少被调用10次。 | 250 | 鍙兘鐨勮瘽浣犺鐢╜process_record_*()`鑷畾涔夐敭鐩橈紝浠ヨ繖绉嶆柟寮忚繛鎺ュ埌浜嬩欢涓紝浠ョ‘淇濅唬鐮佷笉浼氬閿洏浜х敓璐熼潰鐨勬ц兘褰卞搷銆傜劧鑰岋紝鍦ㄦ瀬灏戞暟鎯呭喌涓嬶紝鏈夊繀瑕佽繘琛岀煩闃垫壂鎻忋傚湪杩欎簺鍑芥暟涓鐗瑰埆娉ㄦ剰浠g爜鐨勬ц兘锛屽洜涓哄畠姣忕鑷冲皯琚皟鐢10娆° |
251 | 251 | ||
252 | ### `matrix_scan_*`例实现 | 252 | ### `matrix_scan_*`绀轰嬪疄鐜 |
253 | 253 | ||
254 | 这个例子被故意省略了。在hook这样一个对性能及其敏感的区域之前,您应该足够了解qmk的内部结构,以便在没有示例的情况下编写。如果你需要帮助,请[建立一个issue](https://github.com/qmk/qmk_firmware/issues/new)或[在Discord上与我们交流](https://discord.gg/Uq7gcHh). | 254 | 杩欎釜渚嬪瓙琚晠鎰忕渷鐣ヤ簡銆傚湪hook杩欐牱涓涓鎬ц兘鍙婂叾鏁忔劅鐨勫尯鍩熶箣鍓嶏紝鎮ㄥ簲璇ヨ冻澶熶簡瑙mk鐨勫唴閮ㄧ粨鏋勶紝浠ヤ究鍦ㄦ病鏈夌ず渚嬬殑鎯呭喌涓嬬紪鍐欍傚鏋滀綘闇瑕佸府鍔╋紝璇穂寤虹珛涓涓猧ssue](https://github.com/qmk/qmk_firmware/issues/new)鎴朳鍦―iscord涓婁笌鎴戜滑浜ゆ祦](https://discord.gg/Uq7gcHh). |
255 | 255 | ||
256 | ### `matrix_scan_*` 函数文档 | 256 | ### `matrix_scan_*` 鍑芥暟鏂囨。 |
257 | 257 | ||
258 | * 键盘/修订: `void matrix_scan_kb(void)` | 258 | * 閿洏/淇: `void matrix_scan_kb(void)` |
259 | * 布局: `void matrix_scan_user(void)` | 259 | * 甯冨眬: `void matrix_scan_user(void)` |
260 | 260 | ||
261 | 该函数在每次矩阵扫描时被调用,这基本与MCU处理能力上限相同。在这里写代码要谨慎,因为它会运行很多次。 | 261 | 璇ュ嚱鏁板湪姣忔鐭╅樀鎵弿鏃惰璋冪敤锛岃繖鍩烘湰涓嶮CU澶勭悊鑳藉姏涓婇檺鐩稿悓銆傚湪杩欓噷鍐欎唬鐮佽璋ㄦ厧锛屽洜涓哄畠浼氳繍琛屽緢澶氭銆 |
262 | 262 | ||
263 | 你会在自定义矩阵扫描代码时用到这个函数。这也可以用作自定义状态输出(比如LED灯或者屏幕)或者其他即便用户不输入你也想定期运行的功能。 | 263 | 浣犱細鍦ㄨ嚜瀹氫箟鐭╅樀鎵弿浠g爜鏃剁敤鍒拌繖涓嚱鏁般傝繖涔熷彲浠ョ敤浣滆嚜瀹氫箟鐘舵佽緭鍑(姣斿LED鐏垨鑰呭睆骞)鎴栬呭叾浠栧嵆渚跨敤鎴蜂笉杈撳叆浣犱篃鎯冲畾鏈熻繍琛岀殑鍔熻兘銆 |
264 | 264 | ||
265 | 265 | ||
266 | # 键盘 空闲/唤醒 代码 | 266 | # 閿洏 绌洪棽/鍞ら啋 浠g爜 |
267 | 267 | ||
268 | 如果键盘支持就可以通过停止一大票功能来达到"空闲"。RGB灯和背光就是很好的例子。这可以节约能耗,也可能让你键盘风味更佳。 | 268 | 濡傛灉閿洏鏀寔灏卞彲浠ラ氳繃鍋滄涓澶хエ鍔熻兘鏉ヨ揪鍒"绌洪棽"銆俁GB鐏拰鑳屽厜灏辨槸寰堝ソ鐨勪緥瀛愩傝繖鍙互鑺傜害鑳借楋紝涔熷彲鑳借浣犻敭鐩橀鍛虫洿浣炽 |
269 | 269 | ||
270 | 用两龊刂: `suspend_power_down_*`和`suspend_wakeup_init_*`, 分别在系统蹇障突叫咽钡饔谩 | 270 | 鐢ㄤや釜鍑芥暟鎺у埗: `suspend_power_down_*`鍜`suspend_wakeup_init_*`, 垎鍒湪绯荤粺鏉绌闂插拰鍞ら啋鏃惰皟鐢ㄣ |
271 | 271 | ||
272 | 272 | ||
273 | ### suspend_power_down_user()和suspend_wakeup_init_user()例实现 | 273 | ### suspend_power_down_user()鍜suspend_wakeup_init_user()绀轰嬪疄鐜 |
274 | 274 | ||
275 | 275 | ||
276 | ```c | 276 | ```c |
@@ -283,18 +283,18 @@ void suspend_wakeup_init_user(void) { | |||
283 | } | 283 | } |
284 | ``` | 284 | ``` |
285 | 285 | ||
286 | ### 键盘 挂起/唤醒 函数文档 | 286 | ### 閿洏 鎸傝捣/鍞ら啋 鍑芥暟鏂囨。 |
287 | 287 | ||
288 | * 键盘/修订: `void suspend_power_down_kb(void)` 和`void suspend_wakeup_init_user(void)` | 288 | * 閿洏/淇: `void suspend_power_down_kb(void)` 鍜`void suspend_wakeup_init_user(void)` |
289 | * 布局: `void suspend_power_down_kb(void)` 和 `void suspend_wakeup_init_user(void)` | 289 | * 甯冨眬: `void suspend_power_down_kb(void)` 鍜 `void suspend_wakeup_init_user(void)` |
290 | 290 | ||
291 | # 层改变代码 | 291 | # 傛敼鍙唬鐮 |
292 | 292 | ||
293 | 每层改这鼍驮诵写。这对于指或自义处理很有用。 | 293 | 姣忓綋傛敼鍙樿繖涓氨杩愯屼鐮傝繖瀵逛簬灞傛寚绀烘垨鑷畾涔夊眰澶勭悊堟湁鐢ㄣ |
294 | 294 | ||
295 | ### `layer_state_set_*` 例实现 | 295 | ### `layer_state_set_*` 绀轰嬪疄鐜 |
296 | 296 | ||
297 | 例使用了Planck键盘示范了绾紊置 [RGB背光灯](feature_rgblight.md)之与层对应 | 297 | 鏈嬩娇鐢ㄤ簡Planck閿洏绀鸿寖浜嗗浣曡缃 [RGB鑳屽厜鐏](feature_rgblight.md)浣夸嬩笌灞傚搴 |
298 | 298 | ||
299 | ```c | 299 | ```c |
300 | uint32_t layer_state_set_user(uint32_t state) { | 300 | uint32_t layer_state_set_user(uint32_t state) { |
@@ -318,31 +318,31 @@ uint32_t layer_state_set_user(uint32_t state) { | |||
318 | return state; | 318 | return state; |
319 | } | 319 | } |
320 | ``` | 320 | ``` |
321 | ### `layer_state_set_*` 函数文档 | 321 | ### `layer_state_set_*` 鍑芥暟鏂囨。 |
322 | 322 | ||
323 | * 键盘/修订: `uint32_t layer_state_set_kb(uint32_t state)` | 323 | * 閿洏/淇: `uint32_t layer_state_set_kb(uint32_t state)` |
324 | * 布局: `uint32_t layer_state_set_user(uint32_t state)` | 324 | * 甯冨眬: `uint32_t layer_state_set_user(uint32_t state)` |
325 | 325 | ||
326 | 326 | ||
327 | 该`状态`是活动层的bitmask, 详见[布局攀](keymap.md#布局的层状态) | 327 | 璇`鐘鎬乣鏄娲诲姩灞傜殑bitmask, 璇﹁[冨眬姒傝堪](keymap.md#甯冨眬鐨勫眰鐘舵) |
328 | 328 | ||
329 | 329 | ||
330 | # 掉电保置 (EEPROM) | 330 | # 帀鐢繚瀛橀厤缃 (EEPROM) |
331 | 331 | ||
332 | 这会让你的配置长期的保存在键盘中。这些配置保存在你主控的EEPROM里,掉电不会消失。 设置可以用`eeconfig_read_kb`和`eeconfig_read_user`读取,可以用`eeconfig_update_kb`和`eeconfig_update_user`写入。这对于您希望能够切换的功能很有用(比如切换RGB层指示。此外,你可以用`eeconfig_init_kb`和`eeconfig_init_user`来设置EEPROM默认值。 | 332 | 杩欎細璁╀綘鐨勯厤缃暱鏈熺殑淇濆瓨鍦ㄩ敭鐩樹腑銆傝繖浜涢厤缃繚瀛樺湪浣犱富鎺х殑EEPROM閲岋紝鎺夌數涓嶄細娑堝け銆 璁剧疆鍙互鐢╜eeconfig_read_kb`鍜宍eeconfig_read_user`璇诲彇锛屽彲浠ョ敤`eeconfig_update_kb`鍜宍eeconfig_update_user`鍐欏叆銆傝繖瀵逛簬鎮ㄥ笇鏈涜兘澶熷垏鎹㈢殑鍔熻兘寰堟湁鐢(姣斿鍒囨崲RGB灞傛寚绀恒傛澶栵紝浣犲彲浠ョ敤`eeconfig_init_kb`鍜宍eeconfig_init_user`鏉ヨ缃瓻EPROM榛樿鍊笺 |
333 | 333 | ||
334 | 最复杂的部分可能是,有很多方法可以通过EEPROM存储和访问数据,并且并没有用哪种方法是“政治正确”的。你每个功能只有一个双字(四字节)空间。 | 334 | 鏈澶嶆潅鐨勯儴鍒嗗彲鑳芥槸锛屾湁寰堝鏂规硶鍙互閫氳繃EEPROM瀛樺偍鍜岃闂暟鎹紝骞朵笖骞舵病鏈夌敤鍝鏂规硶鏄滄斂娌绘纭濈殑銆備綘姣忎釜鍔熻兘鍙湁涓涓弻瀛(鍥涘瓧鑺)绌洪棿銆 |
335 | 335 | ||
336 | 记住EEPROM是有写入寿命的。尽管写入寿命很高,但是并不是只有设置写道EEPROM中。如果你写入频繁,你的MCU寿命将会变短。 | 336 | 璁颁綇EEPROM鏄湁鍐欏叆瀵垮懡鐨勩傚敖绠″啓鍏ュ鍛藉緢楂橈紝浣嗘槸骞朵笉鏄彧鏈夎缃啓閬揈EPROM涓傚鏋滀綘鍐欏叆棰戠箒锛屼綘鐨凪CU瀵垮懡灏嗕細鍙樼煭銆 |
337 | 337 | ||
338 | * 如果您不理解这隼敲茨赡芟望避免用这鎏匦裕蛭它相当丛印 | 338 | * 濡傛灉鎮ㄤ嶇悊瑙欎釜渚嬪瓙锛岄堟偍鍙兘屾湜閬垮厤浣跨敤杩欎鐗规э紝鍥犱哄畠鐩稿綋澶嶆潅銆 |
339 | 339 | ||
340 | ### 例实现 | 340 | ### 绀轰嬪疄鐜 |
341 | 341 | ||
342 | 本例讲解了如何添加设置,并且读写。本里使用了用户布局。这是一个复杂的函数,有很多事情要做。实际上,它使用了很多上述函数来工作! | 342 | 鏈緥璁茶В浜嗗浣曟坊鍔犺缃紝骞朵笖璇诲啓銆傛湰閲屼娇鐢ㄤ簡鐢ㄦ埛甯冨眬銆傝繖鏄竴涓鏉傜殑鍑芥暟锛屾湁寰堝浜嬫儏瑕佸仛銆傚疄闄呬笂锛屽畠浣跨敤浜嗗緢澶氫笂杩板嚱鏁版潵宸ヤ綔锛 |
343 | 343 | ||
344 | 344 | ||
345 | 在你的keymap.c文韵麓胩砑又ゲ: | 345 | 鍦ㄤ綘鐨keymap.c鏂囦欢涓屽皢浠ヤ笅浠鐮佹坊鍔犺嚦椤閮: |
346 | ```c | 346 | ```c |
347 | typedef union { | 347 | typedef union { |
348 | uint32_t raw; | 348 | uint32_t raw; |
@@ -354,19 +354,19 @@ typedef union { | |||
354 | user_config_t user_config; | 354 | user_config_t user_config; |
355 | ``` | 355 | ``` |
356 | 356 | ||
357 | 以上代码建立了一个结构体,该结构体可以存储设置并可用于写入EEPROM。如此这般将无需定义变量,因为在结构体中已然定义。要记住`bool` (布尔)值使用1位, `uint8_t`使用8位, `uint16_t`使用16位。你可以混合搭配使用,但是顺序记错可能会招致麻烦,因为那会改变写入写出的值。 | 357 | 浠ヤ笂浠g爜寤虹珛浜嗕竴涓粨鏋勪綋锛岃缁撴瀯浣撳彲浠ュ瓨鍌ㄨ缃苟鍙敤浜庡啓鍏EPROM銆傚姝よ繖鑸皢鏃犻渶瀹氫箟鍙橀噺锛屽洜涓哄湪缁撴瀯浣撲腑宸茬劧瀹氫箟銆傝璁颁綇`bool` (甯冨皵)鍊间娇鐢1浣, `uint8_t`浣跨敤8浣, `uint16_t`浣跨敤16浣嶃備綘鍙互娣峰悎鎼厤浣跨敤锛屼絾鏄『搴忚閿欏彲鑳戒細鎷涜嚧楹荤儲锛屽洜涓洪偅浼氭敼鍙樺啓鍏ュ啓鍑虹殑鍊笺 |
358 | 358 | ||
359 | `layer_state_set_*`函数中使用了`rgb_layer_change`,使用了`keyboard_post_init_user`和`process_record_user`来配置一切。 | 359 | `layer_state_set_*`鍑芥暟涓娇鐢ㄤ簡`rgb_layer_change`锛屼娇鐢ㄤ簡`keyboard_post_init_user`鍜宍process_record_user`鏉ラ厤缃竴鍒囥 |
360 | 360 | ||
361 | 首先要使用`keyboard_post_init_user,你要加入`eeconfig_read_user()`来填充你刚刚创建的结构体。然后您可以立即使用这个结构来控制您的布局中的功能。就像这样: | 361 | 棣栧厛瑕佷娇鐢╜keyboard_post_init_user锛屼綘瑕佸姞鍏eeconfig_read_user()`鏉ュ~鍏呬綘鍒氬垰鍒涘缓鐨勭粨鏋勪綋銆傜劧鍚庢偍鍙互绔嬪嵆浣跨敤杩欎釜缁撴瀯鏉ユ帶鍒舵偍鐨勫竷灞涓殑鍔熻兘銆傚氨鍍忚繖鏍凤細 |
362 | ```c | 362 | ```c |
363 | void keyboard_post_init_user(void) { | 363 | void keyboard_post_init_user(void) { |
364 | // 调用布局级木卣蟪跏蓟 | 364 | // 璋冪敤甯冨绾у埆鐨勭煩闃鍒濆鍖 |
365 | 365 | ||
366 | // 从EEPROM读用渲 | 366 | // 浠EEPROM璇鐢ㄦ埛閰嶇疆 |
367 | user_config.raw = eeconfig_read_user(); | 367 | user_config.raw = eeconfig_read_user(); |
368 | 368 | ||
369 | // 使能,置默认层 | 369 | // 濡備娇鑳斤紝璁疆榛灞 |
370 | if (user_config.rgb_layer_change) { | 370 | if (user_config.rgb_layer_change) { |
371 | rgblight_enable_noeeprom(); | 371 | rgblight_enable_noeeprom(); |
372 | rgblight_sethsv_noeeprom_cyan(); | 372 | rgblight_sethsv_noeeprom_cyan(); |
@@ -374,7 +374,7 @@ void keyboard_post_init_user(void) { | |||
374 | } | 374 | } |
375 | } | 375 | } |
376 | ``` | 376 | ``` |
377 | 以上函数会在读EEPROM配置后立即使用该设置来设置默认层RGB颜色。"raw"的值是从你上面基于"union"创建的结构体中转换来的。 | 377 | 浠ヤ笂鍑芥暟浼氬湪璇籈EPROM閰嶇疆鍚庣珛鍗充娇鐢ㄨ璁剧疆鏉ヨ缃粯璁ゅ眰RGB棰滆壊銆"raw"鐨勫兼槸浠庝綘涓婇潰鍩轰簬"union"鍒涘缓鐨勭粨鏋勪綋涓浆鎹㈡潵鐨勩 |
378 | 378 | ||
379 | ```c | 379 | ```c |
380 | uint32_t layer_state_set_user(uint32_t state) { | 380 | uint32_t layer_state_set_user(uint32_t state) { |
@@ -391,86 +391,86 @@ uint32_t layer_state_set_user(uint32_t state) { | |||
391 | case _ADJUST: | 391 | case _ADJUST: |
392 | if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); } | 392 | if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); } |
393 | break; | 393 | break; |
394 | default: // 针云他层蚰喜 | 394 | default: // 閽堝鍏朵栧眰鎴栭粯璁ゅ眰 |
395 | if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); } | 395 | if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); } |
396 | break; | 396 | break; |
397 | } | 397 | } |
398 | return state; | 398 | return state; |
399 | } | 399 | } |
400 | ``` | 400 | ``` |
401 | 这样仅在值使能时会改变RGB背光灯。现在配置这个值, 为`process_record_user`创建一个新键码叫做`RGB_LYR`。我们要确保,如果使用正常的RGB代码,使用上面的示例将其关闭,请将其设置为: | 401 | 杩欐牱浠呭湪鍊间娇鑳芥椂浼氭敼鍙楻GB鑳屽厜鐏傜幇鍦ㄩ厤缃繖涓, 涓篳process_record_user`鍒涘缓涓涓柊閿爜鍙仛`RGB_LYR`銆傛垜浠纭繚锛屽鏋滀娇鐢ㄦ甯哥殑RGB浠g爜锛屼娇鐢ㄤ笂闈㈢殑绀轰緥灏嗗叾鍏抽棴锛岃灏嗗叾璁剧疆涓猴細 |
402 | ```c | 402 | ```c |
403 | 403 | ||
404 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | 404 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
405 | switch (keycode) { | 405 | switch (keycode) { |
406 | case FOO: | 406 | case FOO: |
407 | if (record->event.pressed) { | 407 | if (record->event.pressed) { |
408 | // 按下时做点什么 | 408 | // 鎸変笅鏃跺仛鐐逛粈涔 |
409 | } else { | 409 | } else { |
410 | // 释放时做点什么 | 410 | // 閲婃斁鏃跺仛鐐逛粈涔 |
411 | } | 411 | } |
412 | return false; // 跳过此键的进一步处理 | 412 | return false; // 璺宠繃姝ら敭鐨勮繘涓姝ュ鐞 |
413 | case KC_ENTER: | 413 | case KC_ENTER: |
414 | // 在按下回凳辈シ乓舴 | 414 | // 鍦ㄦ寜涓嬪洖杞︽椂鎾斁闊绗 |
415 | if (record->event.pressed) { | 415 | if (record->event.pressed) { |
416 | PLAY_NOTE_ARRAY(tone_qwerty); | 416 | PLAY_NOTE_ARRAY(tone_qwerty); |
417 | } | 417 | } |
418 | return true; // 让QMK产生回车按下/释放事件 | 418 | return true; // 璁QMK浜х敓鍥炶溅鎸変笅/閲婃斁浜嬩欢 |
419 | case RGB_LYR: // 本句让underglow作为层示蛘J褂谩 | 419 | case RGB_LYR: // 鏈彞璁underglow浣滀哄眰鎸囩ず锛屾垨姝甯镐娇鐢ㄣ |
420 | if (record->event.pressed) { | 420 | if (record->event.pressed) { |
421 | user_config.rgb_layer_change ^= 1; // 切换状态 | 421 | user_config.rgb_layer_change ^= 1; // 鍒囨崲鐘舵 |
422 | eeconfig_update_user(user_config.raw); // 向EEPROM写入新状态 | 422 | eeconfig_update_user(user_config.raw); // 鍚EEPROM鍐欏叆鏂扮姸鎬 |
423 | if (user_config.rgb_layer_change) { // 如果层状态皇鼓 | 423 | if (user_config.rgb_layer_change) { // 濡傛灉傜姸鎬佽浣胯兘 |
424 | layer_state_set(layer_state); // 那刻更新阊丈 | 424 | layer_state_set(layer_state); // 閭d箞绔嬪埢鏇鏂板眰滆 |
425 | } | 425 | } |
426 | } | 426 | } |
427 | return false; break; | 427 | return false; break; |
428 | case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // 对于所有的RGB代码 (see quantum_keycodes.h, L400 可以参考) | 428 | case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // 瀵逛簬鎵鏈夌殑RGB浠g爜 (see quantum_keycodes.h, L400 鍙互鍙傝) |
429 | if (record->event.pressed) { //本失能层指示,假你改了这觥阋把它 | 429 | if (record->event.pressed) { //鏈彞澶鑳藉眰鎸囩ず锛屽亣璁句綘鏀瑰彉浜繖涓鈥︿犺鎶婂畠绂佺敤 |
430 | if (user_config.rgb_layer_change) { // 龅笔鼓苁 | 430 | if (user_config.rgb_layer_change) { // 浠呭撲娇鑳芥椂 |
431 | user_config.rgb_layer_change = false; // 失能,然后 | 431 | user_config.rgb_layer_change = false; // 澶辫兘锛岀劧鍚 |
432 | eeconfig_update_user(user_config.raw); // 向EEPROM写入置 | 432 | eeconfig_update_user(user_config.raw); // 鍚EEPROM鍐欏叆缃 |
433 | } | 433 | } |
434 | } | 434 | } |
435 | return true; break; | 435 | return true; break; |
436 | default: | 436 | default: |
437 | return true; // 按他键正 | 437 | return true; // 鎸夊叾粬閿甯 |
438 | } | 438 | } |
439 | } | 439 | } |
440 | ``` | 440 | ``` |
441 | 最后你要加入`eeconfig_init_user`函数,所以当EEPROM重置时,可以指定默认值, 甚至自定义操作。想强制重置EEPROM,请用`EEP_RST`键码或[Bootmagic](feature_bootmagic.md)函数。比如,如果要在默认情况下设置RGB层指示,并保存默认值 | 441 | 鏈鍚庝綘瑕佸姞鍏eeconfig_init_user`鍑芥暟锛屾墍浠ュ綋EEPROM閲嶇疆鏃讹紝鍙互鎸囧畾榛樿鍊, 鐢氳嚦鑷畾涔夋搷浣溿傛兂寮哄埗閲嶇疆EEPROM锛岃鐢╜EEP_RST`閿爜鎴朳Bootmagic](feature_bootmagic.md)鍑芥暟銆傛瘮濡傦紝濡傛灉瑕佸湪榛樿鎯呭喌涓嬭缃甊GB灞傛寚绀猴紝骞朵繚瀛橀粯璁ゅ |
442 | 442 | ||
443 | ```c | 443 | ```c |
444 | void eeconfig_init_user(void) { // EEPROM正被重置 | 444 | void eeconfig_init_user(void) { // EEPROM姝h閲嶇疆 |
445 | user_config.raw = 0; | 445 | user_config.raw = 0; |
446 | user_config.rgb_layer_change = true; // 我们想要认使能 | 446 | user_config.rgb_layer_change = true; // 鎴戜鎯宠榛樿浣胯兘 |
447 | eeconfig_update_user(user_config.raw); // 向EEPROM写入默认值 | 447 | eeconfig_update_user(user_config.raw); // 鍚EEPROM鍐欏叆榛樿鍊 |
448 | 448 | ||
449 | // use the non noeeprom versions, 还要向EEPROM写入这些值 | 449 | // use the non noeeprom versions, 杩樿鍚EEPROM鍐欏叆杩欎簺鍊 |
450 | rgblight_enable(); // 默认使能RGB | 450 | rgblight_enable(); // 榛樿浣胯兘RGB |
451 | rgblight_sethsv_cyan(); // 默认置青色 | 451 | rgblight_sethsv_cyan(); // 榛璁剧疆闈掕壊 |
452 | rgblight_mode(1); // 默认置亮 | 452 | rgblight_mode(1); // 榛璁剧疆闀夸寒 |
453 | } | 453 | } |
454 | ``` | 454 | ``` |
455 | 455 | ||
456 | 然后就完事了。RGB层指示会在你想让它工作时工作。这个设置会一直保存,即便你拔下键盘。如果你使用其他RGB代码,层指示将失能,现在它可以做你所想了。 | 456 | 鐒跺悗灏卞畬浜嬩簡銆俁GB灞傛寚绀轰細鍦ㄤ綘鎯宠瀹冨伐浣滄椂宸ヤ綔銆傝繖涓缃細涓鐩翠繚瀛橈紝鍗充究浣犳嫈涓嬮敭鐩樸傚鏋滀綘浣跨敤鍏朵粬RGB浠g爜锛屽眰鎸囩ず灏嗗け鑳斤紝鐜板湪瀹冨彲浠ュ仛浣犳墍鎯充簡銆 |
457 | 457 | ||
458 | ### 'EECONFIG' 函数文档 | 458 | ### 'EECONFIG' 鍑芥暟鏂囨。 |
459 | 459 | ||
460 | * 键盘/修订: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)`和`void eeconfig_update_kb(uint32_t val)` | 460 | * 閿洏/淇: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)`鍜`void eeconfig_update_kb(uint32_t val)` |
461 | * 布局: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)`和`void eeconfig_update_user(uint32_t val)` | 461 | * 甯冨眬: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)`鍜`void eeconfig_update_user(uint32_t val)` |
462 | 462 | ||
463 | `val` 是你想写入EEPROM的值,`eeconfig_read_*`函数岽EEPROM返回一32位(双字)的值。 | 463 | `val` 鏄綘鎯冲啓鍏EEPROM鐨勫硷紝`eeconfig_read_*`鍑芥暟浼氫EEPROM杩斿洖涓32浣(鍙屽瓧)鐨勫笺 |
464 | 464 | ||
465 | # 自定寤骷-长临值(TAPPING_TERM) | 465 | # 鑷畾涔夊閿-闀挎寜涓寸晫鍊(TAPPING_TERM) |
466 | 默认情况下,击键-长按临界值是全球统一的,并且不能通过键进行配置。对于大多数用户来说这很好。但是在有些情况下,对于`LT`键来说按键延时对双功能键的提升更大,可能是因为有些键比其他的键更容易按住。为了不给每个都自定义键码,本功能可以为每个键定义`TAPPING_TERM`。 | 466 | 榛樿鎯呭喌涓,鍑婚敭-闀挎寜涓寸晫鍊兼槸鍏ㄧ悆缁熶竴鐨勶紝骞朵笖涓嶈兘閫氳繃閿繘琛岄厤缃傚浜庡ぇ澶氭暟鐢ㄦ埛鏉ヨ杩欏緢濂姐備絾鏄湪鏈変簺鎯呭喌涓嬶紝瀵逛簬`LT`閿潵璇存寜閿欢鏃跺鍙屽姛鑳介敭鐨勬彁鍗囨洿澶э紝鍙兘鏄洜涓烘湁浜涢敭姣斿叾浠栫殑閿洿瀹规槗鎸変綇銆備负浜嗕笉缁欐瘡涓兘鑷畾涔夐敭鐮侊紝鏈姛鑳藉彲浠ヤ负姣忎釜閿畾涔塦TAPPING_TERM`銆 |
467 | 467 | ||
468 | 想使能这龉δ艿幕, 要先在`config.h`加上`#define TAPPING_TERM_PER_KEY`。 | 468 | 鎯充娇鑳借繖姛鑳界殑璇, 瑕佸厛鍦`config.h`鍔犱笂`#define TAPPING_TERM_PER_KEY`銆 |
469 | 469 | ||
470 | 470 | ||
471 | ## `get_tapping_term`例实现 | 471 | ## `get_tapping_term`绀轰嬪疄鐜 |
472 | 472 | ||
473 | 想要修改基于键码的`TAPPING TERM`,你要向`keymap.c`文件添加下代码: | 473 | 鎯宠淇敼鍩轰簬閿爜鐨`TAPPING TERM`,浣犺鍚`keymap.c`鏂囦欢娣诲姞濡備笅浠爜: |
474 | 474 | ||
475 | ```c | 475 | ```c |
476 | uint16_t get_tapping_term(uint16_t keycode) { | 476 | uint16_t get_tapping_term(uint16_t keycode) { |
@@ -485,6 +485,6 @@ uint16_t get_tapping_term(uint16_t keycode) { | |||
485 | } | 485 | } |
486 | ``` | 486 | ``` |
487 | 487 | ||
488 | ### `get_tapping_term` 函数文档 | 488 | ### `get_tapping_term` 鍑芥暟鏂囨。 |
489 | 489 | ||
490 | 不像这篇的他功能,这霾猶uantum或者键盘级别的灰没Ъ函数即可。 | 490 | 涓嶅儚杩欑瘒鐨勫叾栧姛兘,杩欎涓嶉渶瑕quantum鎴栬呴敭鐩樼骇鍒殑鍑芥暟屽彧瑕佺敤鎴风у嚱鏁板嵆鍙銆 |