精简 usr_app 架构:去掉关机/休眠死代码,按键复用 key.c 状态机,ISR 重活统一延后到任务上下文
Type-C 长供电、上电即工作、无软关机,删除 app_boot/app_power 及 DP0 开关相关逻辑, 去掉空占位 app_fan_run 和无效的 usr_timer_pick_mode/rearm(数码管 4ms 扫描已 priority=1, 系统本来就不会进低功耗)。按键 5s 配对 / 12s OTA 改走 key.c 长按分级,去掉自计时与 1~5s 死区。 新增 app_defer,NVM/配对/OTA 只在 ISR 置位、在 500ms 任务上下文落地,避免再在 usr_timer 里写 flash。 规格书与注释同步精简。
This commit is contained in:
+93
-60
@@ -7,12 +7,18 @@
|
||||
| 工程 | `温湿度风扇_soc_JieLi-JL7016` |
|
||||
| 产品码 | ProdtCode=`CBR3`,productCode=`PRCBR3` |
|
||||
| 协议 | 见宝 SOC 55AA,V1.0.0 |
|
||||
| 文档版本 | V1.2.0 |
|
||||
| 文档版本 | V2.2.0 |
|
||||
| 日期 | 2026.08.31 |
|
||||
| 作者 | cyWu |
|
||||
| 读者 | WorkBuddy / 固件开发 |
|
||||
| 参考工程 | `D:\Jianbao\Project\产品\宠物\门夹弹力绳\门夹弹力绳_soc_JieLi-JL7016` |
|
||||
|
||||
> **V2.2.0 变更(2026-08-31):** 顺着 V2.1.0 删 `app_power` 的思路,继续清掉同一类"保留但无调用者"的死代码:删除 `app_function_soft_off()` / `app_function_is_power_on()` / `app_function_power_on_silent()`,`gDevData.power` 恒为 1、写死在 `app_function_init()`(不再需要 `s_func.app_power` 状态字段);`usr_on_key_short()` 里对应的"软关态唤醒"死分支一并删除。
|
||||
>
|
||||
> **V2.1.0 变更(2026-08-31):** 关机功能确认彻底不存在(关机=拔电),**整模块删除 `app_power.c/.h`**(原 request/finalize 深睡钩子已无任何触发源,纯累赘代码);`usr_jb_main.c`/`app_function.c`/`app_disp.c` 里所有 `app_power_poweroff_pending()` 判断一并清理。同时把配对/OTA/NVM 落盘的"ISR 打标志"统一收进新模块 `app_defer.c/.h`(见 16 章)。
|
||||
>
|
||||
> **V2.0.0 变更(2026-08-31):** **上电即自动开机**,删除 `app_boot`(原阻塞式 3s/5s/12s 开机判定整模块移除)。按键语义改为运行态按住分级:**短按切档;按住 5s 松手清绑定进配对;按住 12s 到点即进 OTA;取消长按 3s 软关机**(拔电即关)。详见 5.1/5.2/5.3。
|
||||
>
|
||||
> **V1.2.0 变更(2026-08-31):** 风扇档位占空比按用户拍板改为 **1档 50%(5000/10000)、2档 75%(7500/10000)**(原 35%/65%,第 5.3/7/17/18 章同步)。
|
||||
>
|
||||
> **V1.1.0 变更(2026-08-31):** IO 分离。CT1642 改走 **PG0(CLK)/PG1(DATA)**,AHT20 独占 **PC4(SCL)/PC5(SDA)**,两路物理隔离,**删除 `bsp_bus` 共线分时机制**(原 8.3 节整体替换为"IO 独立")。同时把 2.2 节显示协议修正为实测 **18bit 帧**。
|
||||
@@ -25,9 +31,9 @@
|
||||
|
||||
1. **先改协议再写业务。** Excel 里 `cond_config1~7` 已是 **7 字节**,当前工程 `jb_protocol.*` / `dp_definition.json` 仍是 6 字节。必须按 Excel 重新生成协议,禁止继续按 6 字节解析。
|
||||
2. **不要把业务算法写进 `jb_product.c`。** 只把 DP 写入 `gDevData` 并转调 `app_*`。组合根是 `usr_jb_main.c`(照门夹)。
|
||||
3. **不要抄门夹的电池 / USB 直通开机 / 低电拒绝开机。** 本机 USB 常电、无电池。插上电 **不会** 自动工作,必须长按 3s。
|
||||
3. **不要抄门夹的电池 / 低电拒绝开机。** 本机 USB 常电、无电池。**上电即开机**(V2.0.0 起,不再长按 3s 才开机);拔电即关,无软关机深睡。
|
||||
4. **不要把调试 UART 放在 PC5。** 调试 UART TX = **PG6**(`IO_PORTG_06`)。PC5 是 AHT20 SDA(独立使用)。
|
||||
5. **DP0 `power` 预留,不当开关。** 真开关只有按键 3s 软开关机。运行中上报 `power=1`,写忽略。
|
||||
5. **DP0 `power` 预留,不当开关。** 上电恒为开机态(`power=1`),运行中上报 `power=1`,写忽略;停机靠短按切到 0 档或拔电。
|
||||
6. **CT1642 与 AHT20 已 IO 分离(V1.1.0)。** CT1642 走 PG0(CLK)/PG1(DATA),AHT20 走 PC4(SCL)/PC5(SDA),两路独立、无总线竞争,**不存在分时/总线锁**(见 8.3)。
|
||||
7. 每个模块必须能用 `board_pin.h` 的 `BOARD_xxx_ENABLE` **单独关掉** 仍能编过、能配网上报(关掉的模块返回空操作)。
|
||||
8. 日志全部 **英文**。中文只出现在注释和本文。
|
||||
@@ -95,45 +101,48 @@ apps/earphone/app_main.c
|
||||
└─ usr_rtc_init()
|
||||
└─ usr_jb_init() ← 唯一组合根
|
||||
bsp_hw_init()
|
||||
app_led_init() ← 必须在开机等待之前
|
||||
app_boot_wait_key() ← 3s/5s/12s,失败则 soft poweroff 不返回
|
||||
app_led_init() ← 灯效事件表最先装载
|
||||
jbInit() + userInit()
|
||||
若 usr_goto_updata → OTA
|
||||
app_nvm_load() ← 恢复 VM
|
||||
app_fan_init()
|
||||
app_disp_init()
|
||||
app_th_init()
|
||||
app_mode_init()
|
||||
app_cond_init()
|
||||
app_timer_init()
|
||||
(上电即开机:无按键等待,不再有 app_boot)
|
||||
app_fan_init() / app_disp_init()
|
||||
usr_timer_add(app_disp_scan, 4ms, priority=1) ← CT1642 扫描,常驻
|
||||
app_th_init() / app_mode_init() / app_arbiter_init()
|
||||
app_cond_init() / app_timer_init()
|
||||
app_nvm_init() + app_nvm_load() ← 恢复 VM
|
||||
app_function_init()
|
||||
user_key_init() + lock_if_held
|
||||
usr_timer_rearm(20ms)
|
||||
usr_timer_add(usr_timer_tick, 20ms, priority=1) ← 常驻,永不重挂
|
||||
```
|
||||
|
||||
**20ms 业务节拍**(`usr_timer_tick`,与门夹相同,禁止再开 1ms ISR):
|
||||
**20ms 业务节拍**(`usr_timer_tick`,硬件定时器中断上下文,禁止再开 1ms ISR):
|
||||
|
||||
1. `jbTimerIrq()` × dt
|
||||
2. `user_key_scan` + `user_key_handle`
|
||||
3. `app_th_poll`(内部 2s 才真正采;IO 分离后采集与显示互不干扰)
|
||||
4. `app_cond_run` / `app_timer_run` / `app_mode_run`(仲裁见第 12 章)
|
||||
5. `app_fan_run`
|
||||
6. `app_disp_run`(闪烁、刷新)
|
||||
7. `app_led_run`
|
||||
8. `app_function_poll`(同步 DP)
|
||||
9. 重装定时器(按键按住 / 风扇转 / 关机流程中 → 不可睡)
|
||||
1. `jbTimerIrq()` × dt
|
||||
2. `user_key_scan` + `user_key_handle`
|
||||
3. `app_th_poll`(内部 2s 才真正采;IO 分离后采集与显示互不干扰)
|
||||
4. `app_mode_run`(通风/强力状态机;条件/定时引擎在 500ms 任务上下文,见下)
|
||||
5. `app_disp_run`(闪烁、刷新)
|
||||
6. `app_function_poll`(同步 DP)
|
||||
7. `app_nvm_tick`(变化检测 + 500ms 防抖计时,不写 flash)
|
||||
8. `app_led_run`
|
||||
|
||||
`usr_timer_loop()`(BLE 500ms)只做:`userHandle()` 填温湿度 DP + `jbProtocolHandle()`。
|
||||
**priority 固定 1、只注册一次,不动态重挂**:本产品 Type-C 长供电,不需要低功耗;
|
||||
且 `app_disp_scan` 本身就以 priority=1 常驻,系统本来就永远无法进入低功耗——
|
||||
按业务状态动态切换 `usr_timer_tick` 自己的 priority 没有任何实际效果,已删除
|
||||
(原 `usr_timer_pick_mode`/`usr_timer_rearm`,规格书 V2.3.0 起废弃)。
|
||||
|
||||
`usr_timer_loop()`(BLE 500ms 任务上下文):`userHandle()` 填温湿度 DP、
|
||||
`jbProtocolHandle()`、`app_cond_run()`/`app_timer_run()`(条件/定时引擎,
|
||||
仲裁见第 12 章)、`app_function_loop()`(VM 落盘 + 配对/OTA 落地)。
|
||||
|
||||
可直接复用门夹源码(拷贝后改引脚/事件表,不要改框架语义):
|
||||
|
||||
| 复用 | 路径 | 改什么 |
|
||||
|---|---|---|
|
||||
| 按键 FSM | `key.c` / `key.h` / `key_manager.c` | 短按切档、长按关机 |
|
||||
| 按键 FSM | `key.c` / `key.h` / `key_manager.c` | 短按切档;**按住分级 5s 配对 / 12s OTA**(V2.0.0,无长按关机) |
|
||||
| LED 事件库 | `led.c` / `led.h` / `led_manager.c` | 单灯 PC2,删红绿双通道 |
|
||||
| 开机判定 | `app_boot.c` | **删除 USB 直通、低电拒绝** |
|
||||
| ~~开机判定~~ | ~~`app_boot.c`~~ | **V2.0.0 已整模块删除**(上电即开机,判定下沉到 key_manager) |
|
||||
| 配对会话 | `app_pair.c` | 120s 超时,灯效改单灯 |
|
||||
| 软关机 | `app_power.c` 精简 | 无电池、无充电;只保留 request/finalize |
|
||||
| ~~软关机~~ | ~~`app_power.c`~~ | **V2.1.0 已整模块删除**:无电池、无充电,关机=拔电,无软件关机路径 |
|
||||
| RTC | `usr_rtc.c` | 原样 |
|
||||
| 协议骨架 | `usr_jb_proto` | 重生 7 字节条件 |
|
||||
|
||||
@@ -170,38 +179,57 @@ P0 建议先 `MODE/COND/TIMER/NVM=0`,台上只验按键、灯、PWM、数码
|
||||
|
||||
## 5. 电源与按键
|
||||
|
||||
### 5.1 关机 / 开机
|
||||
### 5.1 上电 / 断电(V2.0.0 改:上电即开机)
|
||||
|
||||
- 关机 = `power_set_soft_poweroff()`:风扇 PWM=0 并关 MCPWM,数码管锁存灭(全段灭),LED 灭,BLE 停。
|
||||
- **插 USB / 冷启动不会自动进入工作态。** 必须按住 3s。
|
||||
- DP0 不参与。不要用 APP 开关机。
|
||||
- 无电池逻辑。
|
||||
- **插 USB / 冷启动直接进入工作态**,无需按键,无 3s 等待。上电流程:
|
||||
`bsp_hw_init()` → `app_led_init()` → `jbInit()/userInit()` → 各 `app_*_init()`
|
||||
(`app_function_init()` 里写死 `gDevData.power=1`)→ `app_nvm_load()` →
|
||||
`user_key_init()` + `user_key_lock_if_held()` → 起 20ms 业务节拍。
|
||||
- **关机 = 拔电。** 已取消按键长按 3s 软关机(原 3s 与新的 5s/12s 时间轴直接冲突)。
|
||||
`app_power.c` 的软关机能力(request/finalize + 关机前落盘)**V2.1.0 已整模块删除**
|
||||
(无任何触发源,纯累赘代码);**V2.2.0** 进一步删除 `app_function_soft_off` /
|
||||
`app_function_is_power_on` / `app_function_power_on_silent`(同样无调用者的
|
||||
死代码,`power` 恒 1 不再需要状态字段)。
|
||||
- 上电若键仍按着:`user_key_lock_if_held()` 只锁**短按**(防一上电就切档),
|
||||
不锁长按分级 —— 所以"插电时就按住 5s"照样进配对。
|
||||
- DP0 不参与开关机,运行中恒上报 `power=1`(写死,非每 tick 同步),写忽略。
|
||||
- 无电池、无充电逻辑。
|
||||
|
||||
### 5.2 关机态按住(`app_boot.c`,用 `timer_get_ms()` 轮询,与运行态 FSM 分开)
|
||||
### 5.2 按住分级(运行态,`key_manager.c` 直接复用 `key.c` 长按/连按/释放事件)
|
||||
|
||||
| 松开时已按住 | 行为 |
|
||||
上电后**任意时刻**按住 PB1 都按同一套时序判定(不再有"关机态/开机态"两套):
|
||||
|
||||
| 按住时长 | 行为 |
|
||||
|---|---|
|
||||
| < 3000 ms | 继续软关机 |
|
||||
| ≥ 3000 且 < 5000 ms | 正常开机,加载 VM,恢复上次 mode/gear 并从周期起点开跑 |
|
||||
| ≥ 5000 且 < 12000 ms | 开机 + `usr_clear_pair_info` + 进配对(换手机用这条) |
|
||||
| ≥ 12000 ms | 进 OTA(门夹 `usr_app_ota_init` 路径) |
|
||||
| < 5000 ms 松开 | 短按:切档(见 5.3) |
|
||||
| 满 5000 ms(仍按住) | **只**切配对提示灯(100ms 快闪),**不清绑定** |
|
||||
| 满 5s 后、12s 前松开 | 提交配对:`usr_goto_pair_mode()`(断连+清绑定+**重发绑定广播**)+ `app_pair_start()` 起 120s 会话(换手机用这条) |
|
||||
| 满 12000 ms(仍按住,到点即触发) | 进 OTA(`usr_app_ota_init`),不等松手;同时撤销本次配对 |
|
||||
|
||||
设计理由:配对刻意不在 5s 到点提交 —— 用户可能想继续按到 12s 进 OTA,
|
||||
提前清绑定会误伤已配对的手机。
|
||||
|
||||
⚠ **上下文约束**:这几个回调跑在 20ms 硬件定时器中断上下文,只准置标志 +
|
||||
切灯效(纯 RAM)。清绑定(写 VM)与 `usr_app_ota_init`(BLE 广播切换)
|
||||
一律延后到 `app_function_loop()`(500ms 任务上下文)执行 —— 违反会栈溢出软复位
|
||||
(2026-08-31 事故定论)。因此配对/OTA 的实际生效有最多 500ms 延迟。
|
||||
|
||||
按住过程 LED 提示(单灯):
|
||||
|
||||
- ≥3s:常亮(将开机)
|
||||
- ≥5s:100ms 闪(将配对)
|
||||
- ≥12s:200ms 闪(将 OTA)
|
||||
|
||||
开机后若键仍按着:`user_key_lock_if_held()`,直到松开才接受短按/长按。
|
||||
- ≥5s:100ms 闪(将配网,松手生效)
|
||||
- ≥12s:200ms 闪(已进入 OTA)
|
||||
|
||||
### 5.3 开机态按键
|
||||
|
||||
| 事件 | 行为 |
|
||||
|---|---|
|
||||
| 短按 | 风扇档位循环:1(50%) → 2(75%) → 3(100%) → 0(关风扇) → 1 … **立刻退出通风/强力**,改为手动档。设备仍开机,数码管继续刷 |
|
||||
| 长按 3s | 请求软关机。VM **不清** |
|
||||
| 短按(<1s 松开) | 风扇档位循环:1(50%) → 2(75%) → 3(100%) → 0(关风扇) → 1 … **立刻退出通风/强力**,改为手动档。设备仍开机,数码管继续刷 |
|
||||
| 按住 5s 后松开 | 清绑定 + 进配对(见 5.2) |
|
||||
| 按住 12s | 进 OTA(见 5.2) |
|
||||
| ~~长按 3s 软关机~~ | **V2.0.0 已取消**,拔电即关 |
|
||||
|
||||
配对进行中:长按关机可忽略(与门夹一致,避免配到一半睡死)。短按仍可切档。
|
||||
OTA 进行中:忽略配对/短按之外的重复分级(`app_led_is_ota()` 为 1 时不再重入)。
|
||||
配对进行中:短按仍可切档。
|
||||
|
||||
---
|
||||
|
||||
@@ -211,6 +239,7 @@ P0 建议先 `MODE/COND/TIMER/NVM=0`,台上只验按键、灯、PWM、数码
|
||||
|---|---|---|
|
||||
| 软关机 / 未开机 | 灭 | — |
|
||||
| 正常开机 | 常亮 | 低 |
|
||||
| 按住满 5s(待配网,未松手) | 100ms 亮 / 100ms 灭 | 中 |
|
||||
| 配对中 | 100ms 亮 / 100ms 灭,直到成功或 120s 失败 | 中 |
|
||||
| 配对成功 | 常亮(可保持 3s 再回到常亮,允许直接常亮) | 中 |
|
||||
| 配对失败 | 200ms 闪 3s,然后常亮 | 中 |
|
||||
@@ -232,9 +261,10 @@ LED **不** 表示风扇档位,**不** 表示温湿度告警(告警走数码
|
||||
| 2 | 75% | 7500/10000(用户拍板 2026-08-31) |
|
||||
| 3 | 100% | 10000/10000 |
|
||||
|
||||
- 模块接口建议:`app_fan_init` / `app_fan_set_gear(uint8_t)` / `app_fan_get_gear` / `app_fan_run`。
|
||||
- 模块接口:`app_fan_init` / `app_fan_set_gear(uint8_t)` / `app_fan_get_gear`。
|
||||
- DP2 必须等于 **当前真实档位**(通风停 5 分钟那段报 0)。
|
||||
- 换档无需软爬坡(P0 不做)。若 100% 上电冲击过大,允许后续加 200ms 爬升,不作为 P0 验收。
|
||||
- 换档无需软爬坡(P0 不做,也不做占位接口)。若 100% 上电冲击过大,后续要加
|
||||
200ms 爬升时再新增 `app_fan_run` 接口即可,不作为 P0 验收。
|
||||
|
||||
---
|
||||
|
||||
@@ -441,11 +471,11 @@ usr_rtc_get_time() 失败 → 全部定时不执行(等同 time_en=0)
|
||||
- 条件作废标志、模式已运行秒数、AHT20 原始采样
|
||||
- BLE 三元组(走现有 `CFG_USER_PAIR_INFO`,出厂重置 **不清**)
|
||||
|
||||
开机 3s 成功后:加载上述字段,**按上次 mode/gear 从周期起点继续工作**。
|
||||
上电(V2.0.0 起无需按键)后:加载上述字段,**按上次 mode/gear 从周期起点继续工作**。
|
||||
|
||||
首次上电(VM 无效):mode=0,gear=0,条件/定时全 0,`cond_en=time_en=0`。
|
||||
|
||||
写 VM 时机:APP 改配置后、单次定时自毁使能时、软关机前、档位/模式稳定变化时(可做 500ms 防抖,避免短按循环打爆 Flash)。
|
||||
写 VM 时机:APP 改配置后、单次定时自毁使能时、档位/模式稳定变化时(可做 500ms 防抖,避免短按循环打爆 Flash)。
|
||||
|
||||
---
|
||||
|
||||
@@ -454,7 +484,7 @@ usr_rtc_get_time() 失败 → 全部定时不执行(等同 time_en=0)
|
||||
- **清全部业务 VM**(第 13 章列表)。
|
||||
- **保留 BLE 配对,不断开、不软复位。**
|
||||
- RAM 中 mode=0,gear=0,风扇停,条件/定时停止。
|
||||
- 换机:用户关机后 **长按 5s** 清配对进绑定广播。
|
||||
- 换机:运行中 **按住 5s 后松手** 清配对进绑定广播(见 5.2,无需关机)。
|
||||
|
||||
---
|
||||
|
||||
@@ -478,7 +508,7 @@ usr_rtc_get_time() 失败 → 全部定时不执行(等同 time_en=0)
|
||||
| 25 factory_reset | 第 14 章 |
|
||||
| 26~28 | 存 RAM/VM 可不实现动作 |
|
||||
|
||||
OTA:12s 开机走门夹 `usr_app_ota_init`。`jbOnOtaNotify` 等协议 OTA **P2 可继续 stub**,注释写明未实现,禁止假装升级成功后擦用户区。
|
||||
OTA:运行态按住 12s 走门夹 `usr_app_ota_init`(在 `app_function_loop` 任务上下文调用,灯效 200ms 闪)。`jbOnOtaNotify` 等协议 OTA **P2 可继续 stub**,注释写明未实现,禁止假装升级成功后擦用户区。
|
||||
|
||||
配对超时 120s,失败保持开机。
|
||||
|
||||
@@ -495,11 +525,10 @@ apps/usr_periph/
|
||||
usr_rtc.c/.h # 已有则保留
|
||||
|
||||
apps/usr_app/
|
||||
key.c/.h, key_manager.c/.h # 拷贝门夹
|
||||
key.c/.h, key_manager.c/.h # 拷贝门夹;短按切档 + 按住 5s/12s 分级
|
||||
led.c/.h, led_manager.c/.h # 改单灯
|
||||
app_boot.c/.h # 拷贝后删 USB/电池
|
||||
app_led.c/.h
|
||||
app_power.c/.h # 精简
|
||||
app_led.c/.h # 含长按 5s "将配网"提示灯
|
||||
app_defer.c/.h # ISR→任务上下文延后执行标志位(NVM/配对/OTA 统一收口)
|
||||
app_pair.c/.h
|
||||
app_fan.c/.h
|
||||
app_disp.c/.h # 数值、闪烁、--
|
||||
@@ -523,13 +552,17 @@ apps/usr_app/
|
||||
**目标:** 两路 IO(CT1642 显示 / AHT20 采集)、PWM、按键、灯可独立开关验证。
|
||||
|
||||
- [ ] `board_pin.h` + UART TX=PG6,打印正常,且不影响 PC5
|
||||
- [ ] 关机态 3s 开机、<3s 仍睡;开机态 3s 关机
|
||||
- [ ] 短按四态循环,示波器/听感确认 50/75/100/0%
|
||||
- [ ] 插电即开机(不按键,直接进工作态、数码管亮、LED 常亮)
|
||||
- [ ] 长按 3s **不再**关机(已取消软关机按键入口)
|
||||
- [ ] 短按(<5s 松手)四态循环,示波器/听感确认 50/75/100/0%
|
||||
- [ ] 按住满 5s → 100ms 快闪;此时松手 → 清绑定进配对(APP 可搜到)
|
||||
- [ ] 按住满 5s 不松手继续到 12s → 不进配对,直接进 OTA(200ms 闪)
|
||||
- [ ] LED 开机常亮、模拟配对闪、模拟 OTA 闪(可用宏强制)
|
||||
- [ ] CT1642 两管能稳定显示写死的 `25` 和 `60`,无鬼影
|
||||
- [ ] AHT20 串口打印 ℃/%,CRC 正确;采数时数码管不闪、不乱码(IO 独立,无需锁存)
|
||||
- [ ] `BOARD_TH_ENABLE=0` 时显示仍可刷;`BOARD_DISP_ENABLE=0` 时传感器仍可打印
|
||||
- [ ] 12s 能进 OTA 广播(可先只打日志 + LED)
|
||||
- [ ] 长按进配对/OTA 后不复位(验证动作确实走的任务上下文)
|
||||
|
||||
**P0 关闭:** `BOARD_MODE/COND/TIMER/NVM_ENABLE=0`
|
||||
|
||||
@@ -539,7 +572,7 @@ apps/usr_app/
|
||||
- [ ] 通风 25/5、强力 15min 后停;短按立即退模式
|
||||
- [ ] 超限闪(可用调试宏灌假温度)、失败 `--`
|
||||
- [ ] DP0 写 0 风扇不变、设备不关
|
||||
- [ ] VM:改档/改模式/写下条件定时后断电,3s 开机从周期头恢复 mode
|
||||
- [ ] VM:改档/改模式/写下条件定时后断电,重新上电从周期头恢复 mode
|
||||
- [ ] 定时引擎可只存不跑(`BOARD_TIMER_ENABLE=0` 仍能保存 DP)
|
||||
|
||||
### P2 — 自动化
|
||||
|
||||
Reference in New Issue
Block a user