yjx-sdk-mouse 0.1.9 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,336 +1,334 @@
1
- # yjx-sdk-mouse
2
-
3
- 永佳新鼠标 WebHID SDK,用于在浏览器中连接兼容设备,并读取或写入 DPI、回报率、灯效、休眠策略、按键映射和宏配置。
4
-
5
- ## 安装
6
-
7
- ```bash
8
- npm install yjx-sdk-mouse
9
- ```
10
-
11
- 也可以使用 pnpm:
12
-
13
- ```bash
14
- pnpm add yjx-sdk-mouse
15
- ```
16
-
17
- ## 使用条件
18
-
19
- - 运行环境需要提供 WebHID,即存在 `navigator.hid`。
20
- - 页面需要运行在安全上下文中,例如 HTTPS 或本地开发环境。
21
- - 首次选择设备必须由用户操作触发,因此请在按钮点击等事件中调用 `requestDevices()`。
22
- - SDK 是 ESM 包,请使用 `import` 引入。
23
-
24
- ```ts
25
- if (!('hid' in navigator)) {
26
- throw new Error('当前浏览器不支持 WebHID');
27
- }
28
- ```
29
-
30
- ## 快速开始
31
-
32
- ```ts
33
- import { createMouse } from 'yjx-sdk-mouse';
34
-
35
- const mouse = createMouse();
36
-
37
- document.querySelector('#connect')?.addEventListener('click', async () => {
38
- // 首次连接时弹出浏览器设备选择框。
39
- const selected = await mouse.requestDevices();
40
- const device = selected[0];
41
-
42
- if (!device) {
43
- console.log('未选择设备');
44
- return;
45
- }
46
-
47
- await mouse.init(device.id);
48
- console.log('已连接:', mouse.currentDevice);
49
-
50
- const dpi = await mouse.dpi.get();
51
- console.log('DPI 配置:', dpi);
52
- });
53
- ```
54
-
55
- 浏览器已经授权过设备时,可以先用 `getDevices()` 静默读取:
56
-
57
- ```ts
58
- const devices = await mouse.getDevices();
59
- if (devices[0]) {
60
- await mouse.init(devices[0].id);
61
- }
62
- ```
63
-
64
- 使用完毕后关闭设备:
65
-
66
- ```ts
67
- await mouse.closeDevice();
68
- ```
69
-
70
- ## 创建设备实例
71
-
72
- ### 使用默认设备参数
73
-
74
- `createMouse()` 和 `Mouse.createDefault()` 都会使用 SDK 内置的有线、2.4G 接收器设备过滤参数。
75
-
76
- ```ts
77
- import Mouse, { createMouse } from 'yjx-sdk-mouse';
78
-
79
- const mouse1 = createMouse();
80
- const mouse2 = Mouse.createDefault();
81
- ```
82
-
83
- ### 自定义 VID、PID 和 HID Collection
84
-
85
- ```ts
86
- import { createMouse } from 'yjx-sdk-mouse';
87
-
88
- const mouse = createMouse({
89
- configs: [
90
- {
91
- vendorId: 0xa8a5,
92
- productId: 0x2255,
93
- usagePage: 0xff01,
94
- usage: 0x10,
95
- },
96
- ],
97
- timeout: 3000,
98
- });
99
- ```
100
-
101
- ## DPI
102
-
103
- ```ts
104
- const profile = await mouse.dpi.get();
105
- // { currentIndex, pollRate, levels }
106
-
107
- // 切换到第 2 档,索引从 0 开始。
108
- await mouse.dpi.setCurrentIndex(1);
109
-
110
- // 修改第 1 档 DPI。
111
- await mouse.dpi.setLevel(0, 1600);
112
-
113
- // 一次写入完整配置。
114
- await mouse.dpi.set({
115
- currentIndex: 0,
116
- pollRate: 1000,
117
- levels: [800, 1200, 1600, 2400, 3200, 5000],
118
- });
119
- ```
120
-
121
- 如果界面中维护了尚未写入的本地配置,请使用 `setCurrentIndexFrom()` 或 `setLevelFrom()`,避免先执行 `get()` 而覆盖本地修改:
122
-
123
- ```ts
124
- const draft = await mouse.dpi.get();
125
- draft.levels[0] = 1200;
126
-
127
- await mouse.dpi.setLevelFrom(draft, 1, 1600);
128
- ```
129
-
130
- ## 性能设置
131
-
132
- ```ts
133
- const settings = await mouse.performance.get();
134
- console.log(settings);
135
-
136
- await mouse.performance.set({
137
- pollRate: 1000,
138
- sleepMinutes: 10,
139
- neverSleep: false,
140
- scrollReverse: false,
141
- wakeOnMove: true,
142
- });
143
-
144
- await mouse.performance.setPollRate(500);
145
- ```
146
-
147
- 支持的回报率为 `125 | 250 | 500 | 1000` Hz。
148
-
149
- ## 灯效
150
-
151
- 灯效通过完整 `0x0F` 配置包写入,协议字节在 `packet[9]`,写入时会保留当前 DPI、回报率等其它配置。
152
-
153
- | 协议字节 | 三档机型 | 五档机型 |
154
- | --- | --- | --- |
155
- | `0` | 循环呼吸 `breath` | 波浪 `wave` |
156
- | `1` | 常亮 `steady` | 霓虹 `neon` |
157
- | `2` | 灭灯 `off` | 巡回闪 `chase` |
158
- | `3` | — | YOYO球 `yoyo` |
159
- | `4` | — | 单向闪 `oneWayFlash` |
160
-
161
- ```ts
162
- import { LightMode } from 'yjx-sdk-mouse';
163
-
164
- const light = await mouse.light.get();
165
- // { effect: 'breath' | 'steady' | 'off' | 'yoyo' | 'oneWayFlash', mode: 0 | 1 | 2 | 3 | 4 }
166
-
167
- await mouse.light.set('wave');
168
- await mouse.light.set(LightMode.Neon);
169
- await mouse.light.setYoyo();
170
- await mouse.light.setOneWayFlash();
171
- ```
172
-
173
- 便捷方法:`setBreath()`、`setSteady()`、`setOff()`、`setWave()`、`setNeon()`、`setChase()`、`setYoyo()`、`setOneWayFlash()`。
174
-
175
- ## 按键映射
176
-
177
- ```ts
178
- import { KEY_PRESETS } from 'yjx-sdk-mouse';
179
-
180
- const mapping = await mouse.button.get();
181
- console.log(mapping);
182
-
183
- const mutePreset = KEY_PRESETS.find((item) => item.id === 'mute');
184
- if (mutePreset) {
185
- await mouse.button.setSlot('back', mutePreset);
186
- }
187
-
188
- const volumeDown = KEY_PRESETS.find((item) => item.id === 'volume-down');
189
- if (volumeDown) {
190
- await mouse.button.setSlot('scrollLeft', volumeDown);
191
- await mouse.button.setSlot('scrollRight', volumeDown);
192
- await mouse.button.setSlot('extra', volumeDown);
193
- }
194
-
195
- await mouse.button.resetSlot('scrollLeft');
196
- await mouse.button.resetSlot('extra');
197
- await mouse.button.resetAll();
198
- ```
199
-
200
- 可通过以下导出项构建按键配置界面:
201
-
202
- - `KEY_PRESETS`:全部预设。
203
- - `KEYBOARD_PRESETS`:键盘按键预设。
204
- - `COMMAND_PRESETS`:系统和组合命令预设。
205
- - `COMMAND_PRESET_GROUPS`:已分组的命令预设。
206
- - `BUTTON_SLOTS`、`BUTTON_SLOT_LABEL`:鼠标按键槽位和显示名称(含 `extra` 附加键、`scrollLeft` 左滚、`scrollRight` 右滚)。
207
- - `scroll-left` / `scroll-right` / `disable`:左右滚动和禁用预设。
208
-
209
- ##
210
-
211
- `macroIndex` 范围是 `0..31`。键盘的 `keyCode` 使用 USB HID Keyboard Usage,例如字母 A 为 `0x04`。
212
-
213
- ```ts
214
- import type { MouseMacro } from 'yjx-sdk-mouse';
215
-
216
- const macros: MouseMacro[] = [
217
- {
218
- actions: [
219
- { type: 'keyboard', keyCode: 0x04, action: 'keydown', delay: 20 },
220
- { type: 'keyboard', keyCode: 0x04, action: 'keyup', delay: 20 },
221
- { type: 'mouse', button: 'left', action: 'mousedown', delay: 20 },
222
- { type: 'mouse', button: 'left', action: 'mouseup', delay: 20 },
223
- ],
224
- },
225
- ];
226
-
227
- // 写入 profile 0,并把第 0 个宏分配给后退键。
228
- await mouse.macro.setAndAssign(
229
- 'back',
230
- macros,
231
- {
232
- macroIndex: 0,
233
- repeat: 1,
234
- triggerMode: 0,
235
- },
236
- 0,
237
- );
238
- ```
239
-
240
- 也可以分开写入和分配:
241
-
242
- ```ts
243
- await mouse.macro.set(macros, 0);
244
- await mouse.macro.assignButton('back', { macroIndex: 0 });
245
- ```
246
-
247
- ## 设备信息和事件
248
-
249
- ```ts
250
- const info = await mouse.getDeviceInfo();
251
- console.log(info.boardId, info.firmwareVersion);
252
-
253
- const battery = await mouse.getBatteryStatus();
254
- console.log(`电量 ${battery.level}%`, battery.usbConnected ? 'USB 已连接' : '无线连接');
255
-
256
- const sleepStatus = await mouse.getSleepStatus();
257
- console.log('当前状态:', sleepStatus.sleeping ? '休眠' : '唤醒');
258
-
259
- mouse.on('sleepChange', (event) => {
260
- console.log(event.state === 'sleep' ? '设备进入休眠' : '设备已唤醒');
261
- });
262
-
263
- mouse.on('statusChange', (event) => {
264
- console.log('DPI 档位:', event.dpiIndex);
265
- console.log('回报率:', event.pollRate);
266
- });
267
-
268
- mouse.on('usbChange', (event) => {
269
- console.log('USB 状态:', event.type);
270
- });
271
- ```
272
-
273
- 取消监听:
274
-
275
- ```ts
276
- const handleStatus = (event: { dpiIndex: number }) => {
277
- console.log(event.dpiIndex);
278
- };
279
-
280
- mouse.on('statusChange', handleStatus);
281
- mouse.off('statusChange', handleStatus);
282
- ```
283
-
284
- ## 恢复出厂设置
285
-
286
- 此操作会重置性能、DPI、按键和宏配置:
287
-
288
- ```ts
289
- const result = await mouse.other.factoryReset();
290
- console.log(result);
291
- ```
292
-
293
- ## 原始协议调用
294
-
295
- 只有在需要扩展设备协议时才建议使用:
296
-
297
- ```ts
298
- const response = await mouse.sendRaw(new Uint8Array(64));
299
- await mouse.sendRawNoResponse(new Uint8Array(64));
300
- ```
301
-
302
- ## 主要 API
303
-
304
- | API | 说明 |
305
- | --- | --- |
306
- | `getDevices()` | 获取浏览器已经授权的兼容设备 |
307
- | `requestDevices()` | 打开浏览器设备选择器 |
308
- | `init(id)` | 打开设备并执行连接握手 |
309
- | `closeDevice()` | 关闭当前设备 |
310
- | `getDeviceInfo()` | 获取板卡和固件信息 |
311
- | `getFirmwareVersion(refresh?)` | 获取固件版本,可选择强制刷新 |
312
- | `getBatteryStatus()` / `getBattery()` | 通过 0x30 获取电量百分比和 USB 状态 |
313
- | `getSleepStatus()` | 通过 0xED 主动查询当前休眠/唤醒状态 |
314
- | `on('sleepChange', handler)` | 监听 0xED 休眠和唤醒主动上报 |
315
- | `dpi` | DPI 档位读取和写入 |
316
- | `performance` | 回报率、休眠、滚轮和唤醒设置 |
317
- | `light` | 灯效读取和写入(循环呼吸 / 常亮 / 灭灯 / 波浪 / 霓虹 / 巡回闪 / YOYO球 / 单向闪) |
318
- | `button` | 按键映射读取和写入 |
319
- | `macro` | 宏数据写入和按键分配 |
320
- | `other.factoryReset()` | 恢复出厂设置 |
321
-
322
- ## 错误处理
323
-
324
- 所有设备操作都返回 Promise,建议统一使用 `try/catch`:
325
-
326
- ```ts
327
- try {
328
- const devices = await mouse.requestDevices();
329
- if (devices[0]) {
330
- await mouse.init(devices[0].id);
331
- }
332
- } catch (error) {
333
- console.error('鼠标连接失败:', error);
334
- }
335
- ```
336
-
1
+ # yjx-sdk-mouse
2
+
3
+ 永佳新鼠标 WebHID SDK,用于在浏览器中连接兼容设备,并读取或写入 DPI、回报率、灯效、休眠策略、按键映射和宏配置。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install yjx-sdk-mouse
9
+ ```
10
+
11
+ 也可以使用 pnpm:
12
+
13
+ ```bash
14
+ pnpm add yjx-sdk-mouse
15
+ ```
16
+
17
+ ## 使用条件
18
+
19
+ - 运行环境需要提供 WebHID,即存在 `navigator.hid`。
20
+ - 页面需要运行在安全上下文中,例如 HTTPS 或本地开发环境。
21
+ - 首次选择设备必须由用户操作触发,因此请在按钮点击等事件中调用 `requestDevices()`。
22
+ - SDK 是 ESM 包,请使用 `import` 引入。
23
+
24
+ ```ts
25
+ if (!('hid' in navigator)) {
26
+ throw new Error('当前浏览器不支持 WebHID');
27
+ }
28
+ ```
29
+
30
+ ## 快速开始
31
+
32
+ ```ts
33
+ import { createMouse } from 'yjx-sdk-mouse';
34
+
35
+ const mouse = createMouse();
36
+
37
+ document.querySelector('#connect')?.addEventListener('click', async () => {
38
+ // 首次连接时弹出浏览器设备选择框。
39
+ const selected = await mouse.requestDevices();
40
+ const device = selected[0];
41
+
42
+ if (!device) {
43
+ console.log('未选择设备');
44
+ return;
45
+ }
46
+
47
+ await mouse.init(device.id);
48
+ console.log('已连接:', mouse.currentDevice);
49
+
50
+ const dpi = await mouse.dpi.get();
51
+ console.log('DPI 配置:', dpi);
52
+ });
53
+ ```
54
+
55
+ 浏览器已经授权过设备时,可以先用 `getDevices()` 静默读取:
56
+
57
+ ```ts
58
+ const devices = await mouse.getDevices();
59
+ if (devices[0]) {
60
+ await mouse.init(devices[0].id);
61
+ }
62
+ ```
63
+
64
+ 使用完毕后关闭设备:
65
+
66
+ ```ts
67
+ await mouse.closeDevice();
68
+ ```
69
+
70
+ ## 创建设备实例
71
+
72
+ ### 使用默认设备参数
73
+
74
+ `createMouse()` 和 `Mouse.createDefault()` 都会使用 SDK 内置的有线、2.4G 接收器设备过滤参数。
75
+
76
+ ```ts
77
+ import Mouse, { createMouse } from 'yjx-sdk-mouse';
78
+
79
+ const mouse1 = createMouse();
80
+ const mouse2 = Mouse.createDefault();
81
+ ```
82
+
83
+ ### 自定义 VID、PID 和 HID Collection
84
+
85
+ ```ts
86
+ import { createMouse } from 'yjx-sdk-mouse';
87
+
88
+ const mouse = createMouse({
89
+ configs: [
90
+ {
91
+ vendorId: 0xa8a5,
92
+ productId: 0x2255,
93
+ usagePage: 0xff01,
94
+ usage: 0x10,
95
+ },
96
+ ],
97
+ timeout: 3000,
98
+ });
99
+ ```
100
+
101
+ ## DPI
102
+
103
+ ```ts
104
+ const profile = await mouse.dpi.get();
105
+ // { currentIndex, pollRate, levels }
106
+
107
+ // 切换到第 2 档,索引从 0 开始。
108
+ await mouse.dpi.setCurrentIndex(1);
109
+
110
+ // 修改第 1 档 DPI。
111
+ await mouse.dpi.setLevel(0, 1600);
112
+
113
+ // 一次写入完整配置。
114
+ await mouse.dpi.set({
115
+ currentIndex: 0,
116
+ pollRate: 1000,
117
+ levels: [800, 1200, 1600, 2400, 3200, 5000],
118
+ });
119
+ ```
120
+
121
+ 如果界面中维护了尚未写入的本地配置,请使用 `setCurrentIndexFrom()` 或 `setLevelFrom()`,避免先执行 `get()` 而覆盖本地修改:
122
+
123
+ ```ts
124
+ const draft = await mouse.dpi.get();
125
+ draft.levels[0] = 1200;
126
+
127
+ await mouse.dpi.setLevelFrom(draft, 1, 1600);
128
+ ```
129
+
130
+ ## 性能设置
131
+
132
+ ```ts
133
+ const settings = await mouse.performance.get();
134
+ console.log(settings);
135
+
136
+ await mouse.performance.set({
137
+ pollRate: 1000,
138
+ sleepMinutes: 10,
139
+ neverSleep: false,
140
+ scrollReverse: false,
141
+ wakeOnMove: true,
142
+ });
143
+
144
+ await mouse.performance.setPollRate(500);
145
+ ```
146
+
147
+ 支持的回报率为 `125 | 250 | 500 | 1000` Hz。
148
+
149
+ ## 灯效
150
+
151
+ 灯效通过完整 `0x0F` 配置包写入,协议字节在 `packet[9]`,写入时会保留当前 DPI、回报率等其它配置。
152
+
153
+ | 协议字节 | 三档机型 | 五档机型 |
154
+ | --- | --- | --- |
155
+ | `0` | 循环呼吸 `breath` | 波浪 `wave` |
156
+ | `1` | 常亮 `steady` | 霓虹 `neon` |
157
+ | `2` | 灭灯 `off` | 巡回闪 `chase` |
158
+ | `3` | — | YOYO球 `yoyo` |
159
+ | `4` | — | 单向闪 `oneWayFlash` |
160
+
161
+ ```ts
162
+ import { LightMode } from 'yjx-sdk-mouse';
163
+
164
+ const light = await mouse.light.get();
165
+ // { effect: 'breath' | 'steady' | 'off' | 'yoyo' | 'oneWayFlash', mode: 0 | 1 | 2 | 3 | 4 }
166
+
167
+ await mouse.light.set('wave');
168
+ await mouse.light.set(LightMode.Neon);
169
+ await mouse.light.setYoyo();
170
+ await mouse.light.setOneWayFlash();
171
+ ```
172
+
173
+ 便捷方法:`setBreath()`、`setSteady()`、`setOff()`、`setWave()`、`setNeon()`、`setChase()`、`setYoyo()`、`setOneWayFlash()`。
174
+
175
+ ## 按键映射
176
+
177
+ ```ts
178
+ import { KEY_PRESETS } from 'yjx-sdk-mouse';
179
+
180
+ const mapping = await mouse.button.get();
181
+ console.log(mapping.scrollLeft, mapping.scrollRight, mapping.extra);
182
+
183
+ const mutePreset = KEY_PRESETS.find((item) => item.id === 'mute');
184
+ if (mutePreset) {
185
+ await mouse.button.setSlot('back', mutePreset);
186
+
187
+ // 支持扩展槽位的机型:滚轮左倾、滚轮右倾、附加键。
188
+ await mouse.button.setSlot('scrollLeft', mutePreset);
189
+ await mouse.button.setSlot('scrollRight', mutePreset);
190
+ await mouse.button.setSlot('extra', mutePreset);
191
+ }
192
+
193
+ await mouse.button.resetSlot('back');
194
+ await mouse.button.resetAll();
195
+ ```
196
+
197
+ 可通过以下导出项构建按键配置界面:
198
+
199
+ - `KEY_PRESETS`:全部预设。
200
+ - `KEYBOARD_PRESETS`:键盘按键预设。
201
+ - `COMMAND_PRESETS`:系统和组合命令预设。
202
+ - `COMMAND_PRESET_GROUPS`:已分组的命令预设。
203
+ - `BUTTON_SLOTS`、`BUTTON_SLOT_LABEL`:鼠标按键槽位和显示名称;扩展槽位为 `scrollLeft`、`scrollRight`、`extra`。
204
+
205
+ 扩展槽位在协议中的索引分别为:`extra=6`、`scrollLeft=7`、`scrollRight=8`;索引 `5` 为设备内部 DPI 键,设置其他槽位时 SDK 会自动保留。
206
+
207
+ ##
208
+
209
+ `macroIndex` 范围是 `0..31`。键盘的 `keyCode` 使用 USB HID Keyboard Usage,例如字母 A 为 `0x04`。
210
+
211
+ ```ts
212
+ import type { MouseMacro } from 'yjx-sdk-mouse';
213
+
214
+ const macros: MouseMacro[] = [
215
+ {
216
+ actions: [
217
+ { type: 'keyboard', keyCode: 0x04, action: 'keydown', delay: 20 },
218
+ { type: 'keyboard', keyCode: 0x04, action: 'keyup', delay: 20 },
219
+ { type: 'mouse', button: 'left', action: 'mousedown', delay: 20 },
220
+ { type: 'mouse', button: 'left', action: 'mouseup', delay: 20 },
221
+ ],
222
+ },
223
+ ];
224
+
225
+ // 写入 profile 0,并把第 0 个宏分配给后退键。
226
+ await mouse.macro.setAndAssign(
227
+ 'back',
228
+ macros,
229
+ {
230
+ macroIndex: 0,
231
+ repeat: 1,
232
+ triggerMode: 0,
233
+ },
234
+ 0,
235
+ );
236
+ ```
237
+
238
+ 也可以分开写入和分配:
239
+
240
+ ```ts
241
+ await mouse.macro.set(macros, 0);
242
+ await mouse.macro.assignButton('back', { macroIndex: 0 });
243
+ ```
244
+
245
+ ## 设备信息和事件
246
+
247
+ ```ts
248
+ const info = await mouse.getDeviceInfo();
249
+ console.log(info.boardId, info.firmwareVersion);
250
+
251
+ const battery = await mouse.getBatteryStatus();
252
+ console.log(`电量 ${battery.level}%`, battery.usbConnected ? 'USB 已连接' : '无线连接');
253
+
254
+ const sleepStatus = await mouse.getSleepStatus();
255
+ console.log('当前状态:', sleepStatus.sleeping ? '休眠' : '唤醒');
256
+
257
+ mouse.on('sleepChange', (event) => {
258
+ console.log(event.state === 'sleep' ? '设备进入休眠' : '设备已唤醒');
259
+ });
260
+
261
+ mouse.on('statusChange', (event) => {
262
+ console.log('DPI 档位:', event.dpiIndex);
263
+ console.log('回报率:', event.pollRate);
264
+ });
265
+
266
+ mouse.on('usbChange', (event) => {
267
+ console.log('USB 状态:', event.type);
268
+ });
269
+ ```
270
+
271
+ 取消监听:
272
+
273
+ ```ts
274
+ const handleStatus = (event: { dpiIndex: number }) => {
275
+ console.log(event.dpiIndex);
276
+ };
277
+
278
+ mouse.on('statusChange', handleStatus);
279
+ mouse.off('statusChange', handleStatus);
280
+ ```
281
+
282
+ ## 恢复出厂设置
283
+
284
+ 此操作会重置性能、DPI、按键和宏配置:
285
+
286
+ ```ts
287
+ const result = await mouse.other.factoryReset();
288
+ console.log(result);
289
+ ```
290
+
291
+ ## 原始协议调用
292
+
293
+ 只有在需要扩展设备协议时才建议使用:
294
+
295
+ ```ts
296
+ const response = await mouse.sendRaw(new Uint8Array(64));
297
+ await mouse.sendRawNoResponse(new Uint8Array(64));
298
+ ```
299
+
300
+ ## 主要 API
301
+
302
+ | API | 说明 |
303
+ | --- | --- |
304
+ | `getDevices()` | 获取浏览器已经授权的兼容设备 |
305
+ | `requestDevices()` | 打开浏览器设备选择器 |
306
+ | `init(id)` | 打开设备并执行连接握手 |
307
+ | `closeDevice()` | 关闭当前设备 |
308
+ | `getDeviceInfo()` | 获取板卡和固件信息 |
309
+ | `getFirmwareVersion(refresh?)` | 获取固件版本,可选择强制刷新 |
310
+ | `getBatteryStatus()` / `getBattery()` | 通过 0x30 获取电量百分比和 USB 状态 |
311
+ | `getSleepStatus()` | 通过 0xED 主动查询当前休眠/唤醒状态 |
312
+ | `on('sleepChange', handler)` | 监听 0xED 休眠和唤醒主动上报 |
313
+ | `dpi` | DPI 档位读取和写入 |
314
+ | `performance` | 回报率、休眠、滚轮和唤醒设置 |
315
+ | `light` | 灯效读取和写入(循环呼吸 / 常亮 / 灭灯 / 波浪 / 霓虹 / 巡回闪 / YOYO球 / 单向闪) |
316
+ | `button` | 按键映射读取和写入 |
317
+ | `macro` | 宏数据写入和按键分配 |
318
+ | `other.factoryReset()` | 恢复出厂设置 |
319
+
320
+ ## 错误处理
321
+
322
+ 所有设备操作都返回 Promise,建议统一使用 `try/catch`:
323
+
324
+ ```ts
325
+ try {
326
+ const devices = await mouse.requestDevices();
327
+ if (devices[0]) {
328
+ await mouse.init(devices[0].id);
329
+ }
330
+ } catch (error) {
331
+ console.error('鼠标连接失败:', error);
332
+ }
333
+ ```
334
+