YD_TrainingCompetition_Api/debug-stop-reset-control.md
2026-06-10 15:54:30 +08:00

52 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Debug Session: stop-reset-control
- **Status**: [OPEN]
- **Issue**: 点击停止后设备仍继续计数;清零按钮通常需要点两下才生效。
- **Debug Server**: http://127.0.0.1:7777/event
- **Log File**: .dbg/trae-debug-log-stop-reset-control.ndjson
## Reproduction Steps
1. 进入比赛页,确认串口连接到真实网关串口。
2. 下载本场并点击开始。
3. 等待 2-3 秒后点击“停止”,观察设备是否继续计数。
4. 再点击“清零”,观察是否需要点两下才能生效。
## Hypotheses & Verification
| ID | Hypothesis | Likelihood | Effort | Evidence |
|----|------------|------------|--------|----------|
| A | 停止命令已发出,但设备随后持续上报运行态数据,导致现场看起来“仍未停计” | High | Med | Pending |
| B | 清零第一次点击时,命令发送成功但设备尚未完成状态切换,第二次点击才落入稳定时机 | High | Med | Pending |
| C | 停止/清零的前后顺序或帧间延时与旧 WinForms 不一致,导致设备未按预期处理 | High | Med | Pending |
| D | 后端在按钮操作后立即广播了本地状态,但稍后设备快照又把模式/计数覆盖回页面 | Med | Med | Pending |
## Log Evidence
- 预修复日志确认停止链路已进入后端:
- `CompetitionSessionService.StopAsync` 进入,日志时间 `1781076318182`
- 随后 `SerialGateway.SendAsync` 发出 `5530000000000000000000AA`,日志时间 `1781076318183`
- 约 215ms 后,`CompetitionSessionService.StopAsync` 已把会话切到 `IsTesting=false`,日志时间 `1781076318398`
- 但停止后设备仍持续回传运行态:
- 在 `1781076318433` 之后仍持续出现 `device snapshot observed`
- 快照里 `snapshot.Mode=2`,且第二个设备从 `Counter=64` 继续增长到 `Counter=66`
- 说明“停止按钮无效”不是接口没调到,也不是串口没发,而是设备没有稳定进入停止态
- 清零链路同样已进入后端:
- `CompetitionSessionService.ResetCurrentRoundAsync` 进入,日志时间 `1781076319542`
- 同时 `SerialGateway.SendAsync` 发出 `550A0A0000000000000000AA`
- 本地状态已在 `1781076319543` 被清为 `Count=0 / Mode=0`
- 但清零前一刻设备仍停留在运行态:
- `reset button entered` 时当前场次仍能看到 `participant.Mode=2`
- 清零后紧接着又收到 `snapshot.Mode=2`
- 说明第一次清零经常发生在设备尚未真正停稳的窗口内
- 旧版 WinForms 对照结论:
- 单独停止按钮会先把本地 `Mode` 置为 `0`,再发送 `0x30`
- 下载完成收尾流程是先 `0x30` 再 `0x0A`
- 当前后端停止时没有同步把当前场次参与者 `Mode` 置回 `0`,清零也没有先补一次停止
## Verification Conclusion
- A confirmed:停止命令已发出,但设备随后继续回传运行态数据。
- B confirmed:清零第一次点击常落在设备未停稳的窗口里,因此体感上需要第二次。
- C confirmed:当前停止/清零时序与旧版关键细节仍有差异,至少缺少“停止后本地模式归零”和“清零前先停”的收尾动作。
- D partially confirmed:后端不会在停止后继续写分,但停止广播中的 `participant.Mode` 仍保留旧值,页面会继续显示运行态颜色。
- 最小修复方向:
- 停止命令改为更稳妥的双发 `0x30`
- 手动停止时立即把当前场次参与者 `Mode` 归零
- 清零前先补一次停止,再发送 `0x0A`