Add task confirmation, numeric debug status and communication handoff

This commit is contained in:
2026-09-30 17:56:34 +08:00
parent 790eddd900
commit 2544a8f2b8
6 changed files with 250 additions and 1 deletions
BIN
View File
Binary file not shown.
+35 -1
View File
@@ -1,3 +1,37 @@
# AMI
YMR A11仪表
YMR A11 仪表,使用淘晶驰 TJC4827X543_011 串口屏,分辨率 480 × 272。
当前通讯协议为 **v1.1(debug 数字状态版)**,工程使用 USART HMI 1.68.1.3037 编辑、编译。
## 工程与交接资料
- [AMI.HMI](AMI.HMI):最新版屏幕工程,打开后编译并下载到对应型号屏幕。
- [通讯交接文档](docs/通讯交接文档.md):可编辑协议说明,包含全部状态编号、任务帧、主页面属性及联调步骤。
- [PDF 文档](docs/AMI仪表通讯交接文档.pdf):适合直接转交接手者的 5 页版本。
- [C 发送示例](examples/ami_debug_send.c):主控更新 debug 状态的参考函数。
- [验证说明](docs/验证说明.txt):已完成检查和实物验证范围。
## 最小通讯示例
主控向屏幕发送 ASCII 指令,每条末尾追加三个实际字节 `FF FF FF`,当前波特率为 `9600`:
```text
d0=1
d1=2
page debug
```
这三条分别将配电箱状态设为正常、左急停及行程/惯性状态设为故障、进入 debug 页面。`d0=1` 的完整字节为 `64 30 3D 31 FF FF FF`。
Debug 共 16 个全局变量 `d0~d15`,状态统一为 `0=未知、1=正常、2=故障`。页面每 250 ms 自动更新文字和颜色,`d1` 同时更新两个对应位置。不要继续直接写入旧接口的 `debug.tN.txt/pco`,它们会被刷新脚本覆盖。
主页面右上角隐藏热区进入 debug;debug 的返回按钮切回主页面。六个任务按钮进入确认页,确认后屏幕向主控发送 `AA 55 01 NN 0D 0A`,`NN=01~06`;取消不发送任务帧。任务帧结束符与主控发给屏幕的文本指令结束符不同。
## 验证与接手事项
工程编译通过:0 错误、0 警告。模拟器已验证状态转换、跨页更新和 `d1` 双位置同步;任务回传此前已做模拟检查。
实际屏幕、串口和主控尚未联机验证,C 示例尚未在目标主控工程编译。主页面部分数值的单位和缩放仍需与主控统一。任务执行裁决、VCU 通知、EBS 灯及 ECUBACK 安全输出由主控实现;仪表显示不能作为执行成功或安全回路导通的证明。
许可证沿用仓库中的 [AGPL-3.0](LICENSE)。
Binary file not shown.
+192
View File
@@ -0,0 +1,192 @@
# AMI 仪表通讯交接文档
协议版本 1.1(debug 数字状态版) | 2026-09-30
适用工程:AMI.HMI;屏幕 TJC4827X543_011,480 × 272;编辑器 USART HMI 1.68.1.3037。本文以随附的精简指令版工程为准。
## 1. 接手先看这三点
主控 → 屏幕:发送文本指令,末尾必须追加三个实际字节 FF FF FF。屏幕 → 主控:用户确认任务后发送固定 6 字节帧 AA 55 01 NN 0D 0A。这两种帧的结束方式不同。
debug 状态只发送 d0~d15 的数值;0=未知,1=正常,2=故障。屏幕自动处理中文和颜色,不再要求主控发送 txt/pco。
任务帧表示用户选择请求。仪表没有实现主控执行确认、运行完成回传或安全互锁裁决,主控必须自行判断能否执行。
## 2. 串口与发送规则
| 项目 | 当前约定 |
| --- | --- |
| 波特率 | 9600(Program.s 中 baud=9600) |
| 串口格式 | 联调使用 8N1;实物 UART 参数及电平按该型号规格书确认 |
| 接收模式 | recmod=0,使用屏幕原生文本指令协议 |
| 指令编码 | dN=状态 等指令为 ASCII;发送中文时使用 GB2312 |
| 指令结束 | 每条指令后加 FF FF FF;不需要 CR/LF,不发送字符串“FF FF FF” |
| 接线 | 主控 TX → 屏 RX,屏 TX → 主控 RX,共地;本交接未核实连接器针脚和电平 |
## 3. 最小可用示例
以下三条依次设置配电箱正常、左急停/行程/惯性故障,再进入 debug 页面。仅发送指令本身,每条追加结束符。
```text
d0=1
d1=2
page debug
```
发送 d0=1 的完整字节:64 30 3D 31 FF FF FF(7 字节)。连续发送多条时,每条都要独立追加结束符,串口队列不得让不同任务的字节交错。
---
# 4. Debug 状态编号
主控发送 dN=V;N 为下表编号,V 只能取 0、1、2。默认全部为 0。下表顺序是工程中的接口映射,不是电气线束针脚顺序。
| 变量 | 原始信号名 | 检测内容 |
| --- | --- | --- |
| d0 | Safe_DBBox_OUT | 配电箱安全回路 |
| d1 | Safe_L&BOTS&IW | 左急停、超行程和惯性开关 |
| d2 | Safe_Ba_BOX | 电池箱安全回路 |
| d3 | Safe_RSTOP | 右急停和驾驶舱急停 |
| d4 | Safe_LAST | 安全回路末端 |
| d5 | Safe_S | 左右后悬安全回路 |
| d6 | Safe_RES1 | RES 安全回路 |
| d7 | Safe_Control | 主控盒安全回路 |
| d8 | EBS_BE | 制动舵机电源 |
| d9 | EBS_12V | 电磁阀电源 |
| d10 | EBS_AIR | 气压传感器电源 |
| d11 | EBS_Oil | 油压传感器电源 |
| d12 | Driverless_INS | 惯导电源 |
| d13 | Driverless_WSS | 轮速传感器电源 |
| d14 | Driverless_Camera | 摄像头电源 |
| d15 | 12V_Control | 主控盒供电 |
## 显示与生命周期
0 → 灰色“未知”(33840);1 → 绿色“正常”(2016);2 → 红色“故障”(63488)。其他数值显示未知,但主控应限制为 0~2。颜色由工程脚本处理。
d1 同时更新左急停及行程/惯性两个位置;一次发送即可同步。后悬、RES、主控盒在原图中未标出接入点,独立显示;连线表示原图的示意顺序,不能据此推断具体断点。
d0~d15 为全局变量,任何页面均可更新,切页保留,断电重置。debug 后初始化立即绘制状态,tm0 每 250 ms 刷新;离开 debug 后定时器停止,但全局变量仍可接收更新。
通讯断线不会自动恢复未知。主控或通讯管理层应在数据超时后将相应 dN 清为 0;建议仅发送变化项,并按项目周期补发完整状态。旧的 debug.tN.txt/pco 赋值会被定时器覆盖,接手代码应改为 dN=V。
---
# 5. 任务选择回传
方向:屏幕 → 主控。用户点击主页面左侧按钮后进入 CONFIRM,显示所选任务。点击“确认发送”输出下表帧并返回 dash;点击“取消返回”不输出任务帧。
| 编号 NN | 任务 | 完整帧(十六进制) |
| --- | --- | --- |
| 01 | 八字绕环 | AA 55 01 01 0D 0A |
| 02 | 直线加速 | AA 55 01 02 0D 0A |
| 03 | 高速循迹 | AA 55 01 03 0D 0A |
| 04 | 车检测试 | AA 55 01 04 0D 0A |
| 05 | EBS 测试 | AA 55 01 05 0D 0A |
| 06 | 手动驾驶 | AA 55 01 06 0D 0A |
| 偏移 | 字节 | 含义 |
| --- | --- | --- |
| 0~1 | AA 55 | 帧头 |
| 2 | 01 | 任务选择消息类型 |
| 3 | 01~06 | 任务编号,单字节二进制 |
| 4~5 | 0D 0A | 固定帧尾 |
## 主控接收与处理
按连续字节流解析,不能假定一次 UART/DMA 回调正好收到一帧。维护接收缓冲,搜索 AA 55,等待至少 6 字节,检查类型=01、编号=1~6、帧尾=0D 0A。合法则交给任务状态机并消费 6 字节;非法则丢弃首字节重新搜索。
当前帧没有长度字段、序列号、校验和或 CRC;屏幕也没有 ACK 等待、自动重发机制。主控自行决定忙碌时如何处理新任务和重复请求。确认发送后,仪表仅把“当前任务”更新为用户选择,不证明主控已接受或车辆正在执行。
## 上电与其他返回帧
Program.s 上电通过 printh 发出 00 00 00 FF FF FF 88 FF FF FF。该启动数据不是任务指令。屏幕还可能输出官方错误、查询结果等返回数据,接收层要与任务帧区分。
联调可发送 bkcmd=3(同样加 FF FF FF)打开成功/失败反馈。官方执行成功码为 01 FF FF FF,变量名称无效为 1A FF FF FF。反馈是屏幕执行文本指令的结果,不是任务执行 ACK。当前工程未主动设置 bkcmd,不应以“没有成功返回”判断命令失败。
---
# 6. 主页面与页面切换
主页面数字控件已设为全局,可通过带页面名的属性指令跨页更新。它们是整数显示控件,没有约定浮点缩放。不要直接发送小数值。
| 显示项 | 赋值命令示例 | 说明 |
| --- | --- | --- |
| 当前车速 | dash.speed.val=30 | 界面标注 km/h;示例显示 30 |
| 高压电压 | dash.ts.val=300 | 示例为显示值;电气单位需与主控统一 |
| 扭矩千分 | dash.mct.val=500 | 保留界面“扭矩千分”定义 |
| 高压电流 | dash.dl.val=20 | 示例为显示值 |
| 电机温度 | dash.djwd.val=45 | 示例为显示值 |
| MCU 温度 | dash.mcuwd.val=40 | 示例为显示值 |
| 最高单体 | dash.dtwd.val=50 | 含义/单位待主控确认,不能仅按控件名猜测 |
数值 val 按有符号 32 位整数使用。电压、电流、温度及“最高单体”的单位、有效范围、无效值和缩放未形成主控协议;本版只确认控件名及整数赋值方式。联调前应由接手者补齐这些定义。
## 页面指令
```text
page dash
page debug
```
每条后加 FF FF FF。页面 ID:dash=0、debug=1、CONFIRM=2。优先用页面名,不依赖页面顺序。CONFIRM 应由六个任务按钮进入,避免未设置 pending_task 时直接进入。
隐藏入口:dash 右上角 x=440,y=0,w=40,h=25;debug 右上角“返回”切回 dash。调试页状态是显示功能,不输出 ECU/继电器动作指令。
## 其他文本与安全动作
dash 的 sd(锁定显示)、EBS 文本为私有控件;只在 dash 当前显示时用 sd.txt="已锁定" 或 EBS.txt="EBS 正常" 更新,中文需 GB2312。切页后会恢复设计初值。debug 的 d8 不会自动驱动主页面 EBS 文本。
按用户提供的状态表:EBS 舵机、电磁阀、气压、油压检测故障时的 VCU 通知、EBS 灯供地及 ECUBACK 断开,由主控实现;无人驾驶 INS/WSS/Camera 故障的 VCU 通知与 ECUBACK 断开也由主控实现,其 EBS 灯逻辑与前四项不同。屏幕工程不包含这些安全输出,也不把检测电平自动解释为正常/故障。
---
# 7. 主控发送参考与验收
以下 C 示例一次提交整条消息,防止命令与结束符被交错。UART_SendBytes 是待接入的驱动接口;必须在返回前完成发送或复制数据,异步 DMA 不能继续引用函数栈缓冲。
```text
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>
extern void UART_SendBytes(const uint8_t *data, size_t len);
int ami_set_debug(unsigned id, unsigned state)
{
uint8_t buf[24];
if (id > 15 || state > 2) return -1;
int n = snprintf((char *)buf, sizeof buf,
"d%u=%u", id, state);
if (n < 0 || (size_t)n > sizeof buf - 4) return -1;
buf[n++] = 0xFF;
buf[n++] = 0xFF;
buf[n++] = 0xFF;
UART_SendBytes(buf, (size_t)n);
return 0;
}
```
## 联调验收顺序
① 下载配套 AMI.HMI 编译生成的屏幕资源;将 UART 参数、电平和接线与实际型号核对。② 在 dash 页面发送 d0=1、d1=2,打开隐藏入口,应见配电箱绿正常、左急停和行程/惯性同时红故障。③ debug 内发送 d0=2、d1=1,应在约 250 ms 刷新周期内变色;发送 d0=0 应恢复灰未知。
④ 离开再进入 debug,状态应保留;断电重启应全为未知。⑤ 六个任务逐项确认并记录实际收到的 6 字节帧;逐项取消应无新增任务帧。⑥ 主控接收测试覆盖拆帧、粘帧、启动数据及非法编号。⑦ 单独验证安全逻辑,不能以仪表显示替代主控/执行器测试。
## 已完成与待验证
已完成:USART HMI 编译 0 错误、0 警告;模拟器验证跨页数值更新、正常/故障/未知转换,以及 d1 双位置同步。六个任务回传此前已做模拟检查。待完成:实际屏幕下载、UART 收发、触摸行为、数据时序和车辆安全动作。C 示例仅为驱动接入参考,本次未在目标主控工程中编译。
## 8. 工程版本与资料
配套 AMI.HMI 的 SHA-256:
4b7986154d6f0a7a4226ee4591373f39f9ed70af5a6c81ee9380c6e9f72c0ada
旧版工程不能与本版 dN 接口混用。配套文件包括 AMI.HMI、PDF、通讯交接文档.md 和 ami_debug_send.c;其中 Markdown 为可编辑文字源,C 文件为参考发送函数。仓库中的实际位置见 README。
官方协议依据:wiki.tjc1688.com/commands/index.html;wiki.tjc1688.com/return/index.html;wiki.tjc1688.com/variables/bkcmd.html。项目自定义任务帧和 dN 编号以本文及配套工程为准。
+4
View File
@@ -0,0 +1,4 @@
精简数字接口版:d0-d15,0未知/1正常/2故障;tm0=250ms。
编译0错误0警告,模拟器通过跨页更新、三态显示、d1双位置同步。
真实屏幕及主控串口未联机验证。
主控C示例尚未在目标工程编译。
+19
View File
@@ -0,0 +1,19 @@
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>
extern void UART_SendBytes(const uint8_t *data, size_t len);
int ami_set_debug(unsigned id, unsigned state)
{
uint8_t buf[24];
if (id > 15 || state > 2) return -1;
int n = snprintf((char *)buf, sizeof buf,
"d%u=%u", id, state);
if (n < 0 || (size_t)n > sizeof buf - 4) return -1;
buf[n++] = 0xFF;
buf[n++] = 0xFF;
buf[n++] = 0xFF;
UART_SendBytes(buf, (size_t)n);
return 0;
}