好的,我们来整合现有协议,并根据新的协议概念设计新的命令及其响应。
通用响应格式
为了保持一致性,所有命令的响应将遵循以下基本格式:
sn<ID>, ch<ID>, <command_name>_ack :status[OK|ERROR], param1[value1], error_msg["详细错误信息"]
status[OK]: 表示命令成功执行。
status[ERROR]: 表示命令执行失败。
paramX[valueX]: 成功时可能返回的额外参数(例如,getter命令返回的数据)。
error_msg["..."]: 失败时的错误描述。
sn 和 ch 将与请求命令中的 sn 和 ch 对应。
协议设计与响应
0. 初始化与配置
0.1 系统初始化 (System Init)
命令: sn20, ch0, system_init
响应: sn20, ch0, system_init_ack :status[OK]
错误响应: sn20, ch0, system_init_ack :status[ERROR], error_msg["Initialization failed: <reason>"]
0.2 上传相机配置文件 (Upload Camera Config File) (新)
说明:主机发送配置文件内容或路径给设备加载。这里假设设备能从指定路径读取。
命令: sn20, ch0, upload_camera_config :path["/path/to/device/accessible/config.ini"]
响应: sn20, ch0, upload_camera_config_ack :status[OK], file_loaded["config.ini"]
错误响应: sn20, ch0, upload_camera_config_ack :status[ERROR], error_msg["File not found or invalid format"]
(注: 实际文件传输可能需要更复杂的机制,如分块传输,此处简化为一个命令)
0.3 设置图像数字增益 (Set Image Digital RGB Gain) (新 - 对应 "图像增益")
说明:设置图像处理后的数字增益。
命令: sn20, ch0, set_rgb_gain :gain_r[1.0], gain_g[1.0], gain_b[1.0]
响应: sn20, ch0, set_rgb_gain_ack :status[OK], applied_gain_r[1.0], applied_gain_g[1.0], applied_gain_b[1.0]
错误响应: sn20, ch0, set_rgb_gain_ack :status[ERROR], error_msg["Invalid gain value (e.g., out of range 0.1-10.0)"]
0.4 获取图像数字增益 (Get Image Digital RGB Gain) (新)
命令: sn20, ch0, get_rgb_gain
响应: sn20, ch0, get_rgb_gain_ack :status[OK], gain_r[1.0], gain_g[1.0], gain_b[1.0]
错误响应: sn20, ch0, get_rgb_gain_ack :status[ERROR], error_msg["Failed to retrieve gain"]
1. GMSL链路与显示控制
1.1 建立GMSL链接 (Set GMSL Link)
命令: sn20, ch0, set_gmsl_link :img[1920x1080-0x1e], gmsl-speed[6], trigger_gpio[2], osd_gain[16-16-16], show_mode[1]
响应: sn20, ch0, set_gmsl_link_ack :status[OK], link_status[established], negotiated_speed[6]
错误响应: sn20, ch0, set_gmsl_link_ack :status[ERROR], link_status[failed], error_msg["Link negotiation failed: <reason>"]
1.2 DP显示视频 (Set Video Show)
命令: sn20, ch0, set_video_show
响应: sn20, ch0, set_video_show_ack :status[OK], display_status[showing]
错误响应: sn20, ch0, set_video_show_ack :status[ERROR], error_msg["Failed to enable video output"]
1.3 DP不显示视频 (Set Video Hide)
命令: sn20, ch0, set_video_hide
响应: sn20, ch0, set_video_hide_ack :status[OK], display_status[hidden]
错误响应: sn20, ch0, set_video_hide_ack :status[ERROR], error_msg["Failed to disable video output"]
1.4 设置图像显示格式 (Set Video Mode - YUYV/UYVY)
命令 (UYVY): sn20, ch0, set_video_mode :show_mode[1]
命令 (YUYV): sn20, ch0, set_video_mode :show_mode[0]
响应: sn20, ch0, set_video_mode_ack :status[OK], current_mode[1|0]
错误响应: sn20, ch0, set_video_mode_ack :status[ERROR], error_msg["Invalid mode or failed to set"]
1.5 设置多路显示源 (Set Multi-Display Source) (新 - 对应 "显示图像:可以勾选两路...")
说明:假设设备有一个或多个显示输出口(如DP1, DP2),并且可以从不同通道的原始或故障视频流中选择。
output_port: 显示输出端口标识 (如果只有一个输出,此参数可省略或固定)。
input_sn: 输入源的SN (如果总是当前SN,可省略)。
input_ch: 输入源的通道号。
source_type: original 或 faulted。
命令: sn20, chX, set_display_source :output_port[DP1], input_sn[20], input_ch[0], source_type[original]
命令: sn20, chY, set_display_source :output_port[DP1], input_sn[20], input_ch[1], source_type[faulted] (如果想在DP1同时显示ch1的故障视频,这暗示了PIP或分屏能力)
简化版:如果只控制当前sn, ch的输出到固定显示器
命令: sn20, ch0, select_display_content :type[original|faulted]
响应: sn20, ch0, select_display_content_ack :status[OK], displaying[original|faulted]
错误响应: sn20, ch0, select_display_content_ack :status[ERROR], error_msg["Invalid source type or channel"]
(为了简化,我们采用简化版。复杂的多路输出选择器需要更详细的架构定义)
2. 图像故障注入
2.1 添加故障图像 (Add Image Fault)
说明:为故障图像增加一个可选的id,方便单独管理。
命令: sn20, ch0, add_img_fault :id[fault_sun_01], pos[1000x0], path["/home/root/png/1.png"]
命令 (无ID): sn20, ch0, add_img_fault :pos[0x0], path["/home/root/png/5.png"]
响应: sn20, ch0, add_img_fault_ack :status[OK], fault_id[fault_sun_01|generated_id_if_none_provided]
错误响应: sn20, ch0, add_img_fault_ack :status[ERROR], error_msg["Image path not found or invalid position"]
2.2 清除故障图像 (Remove Image Fault)
说明:增加按ID清除的功能。无参数则清除所有。
命令 (清除所有): sn20, ch0, remove_img_fault
命令 (按ID清除): sn20, ch0, remove_img_fault :id[fault_sun_01]
响应: sn20, ch0, remove_img_fault_ack :status[OK], cleared_count[N] (N是被清除的图像数量)
错误响应: sn20, ch0, remove_img_fault_ack :status[ERROR], error_msg["Fault ID not found or failed to remove"]
3. 视频传输故障注入
3.1 丢帧故障 (Set Frame Fault)
命令: sn20, ch0, set_frame_fault :frame_count[5]
响应: sn20, ch0, set_frame_fault_ack :status[OK], frames_to_drop[5]
错误响应: sn20, ch0, set_frame_fault_ack :status[ERROR], error_msg["Invalid frame count"]
清除: sn20, ch0, set_frame_fault :frame_count[0] (响应同上)
3.2 丢行故障 (Set Drop Line)
命令: sn20, ch0, set_drop_line :line_pos[100], line_count[10]
响应: sn20, ch0, set_drop_line_ack :status[OK], lines_dropped_from[100], count[10]
错误响应: sn20, ch0, set_drop_line_ack :status[ERROR], error_msg["Invalid line position or count"]
清除: sn20, ch0, set_drop_line :line_pos[0], line_count[0] (响应同上)
3.3 CRC错误故障 (Set CRC Error)
命令: sn20, ch0, set_crc_error :line_pos[200], line_count[5]
响应: sn20, ch0, set_crc_error_ack :status[OK], crc_error_from_line[200], count[5]
错误响应: sn20, ch0, set_crc_error_ack :status[ERROR], error_msg["Invalid line position or count for CRC error"]
清除: sn20, ch0, set_crc_error :line_pos[0], line_count[0] (响应同上)
3.4 矩形区域数据丢失故障 (Set Rectangular Data Loss Fault) (新 - 对应 "视频传输故障")
说明:在指定区域内的数据丢失,持续指定帧数。
命令: sn20, ch0, set_data_loss_area_fault :start_line[100], start_pixel[200], end_line[150], end_pixel[400], frame_count[10]
响应: sn20, ch0, set_data_loss_area_fault_ack :status[OK], area[100,200-150,400], frames[10]
错误响应: sn20, ch0, set_data_loss_area_fault_ack :status[ERROR], error_msg["Invalid area coordinates or frame count"]
清除: sn20, ch0, set_data_loss_area_fault :frame_count[0] (或定义 clear_data_loss_area_fault)
4. GMSL链路层故障注入
4.1 GMSL视频链路故障 (Set GMSL Video Link Fault) (新)
说明:模拟GMSL数据通路(视频流)中断。
命令: sn20, ch0, set_gmsl_video_link_fault :enable[1], duration[5000ms] (1:使能, 0:禁止; duration 0表示永久)
响应: sn20, ch0, set_gmsl_video_link_fault_ack :status[OK], video_link_fault[enabled|disabled], duration[5000ms]
错误响应: sn20, ch0, set_gmsl_video_link_fault_ack :status[ERROR], error_msg["Failed to set GMSL video link fault"]
清除: sn20, ch0, set_gmsl_video_link_fault :enable[0]
4.2 GMSL控制链路故障 (Set GMSL Control Link Fault) (新)
说明:模拟GMSL控制通路(如I2C反向通道)中断。
命令: sn20, ch0, set_gmsl_control_link_fault :enable[1], duration[3000ms]
响应: sn20, ch0, set_gmsl_control_link_fault_ack :status[OK], control_link_fault[enabled|disabled], duration[3000ms]
错误响应: sn20, ch0, set_gmsl_control_link_fault_ack :status[ERROR], error_msg["Failed to set GMSL control link fault"]
清除: sn20, ch0, set_gmsl_control_link_fault :enable[0]
5. I2C 通讯故障注入
5.1 I2C设备应答异常 (Set I2C Device ACK Fault - General)
命令 (按次数): sn20, ch0, set_i2c_ack_fault :addr[0x32], mode[count], count[5]
命令 (按时间): sn20, ch0, set_i2c_ack_fault :addr[0x32], mode[time], time[3000ms]
响应: sn20, ch0, set_i2c_ack_fault_ack :status[OK], addr[0x32], mode[count|time], value[5|3000ms]
错误响应: sn20, ch0, set_i2c_ack_fault_ack :status[ERROR], error_msg["Invalid I2C address, mode, or value"]
清除 (隐式): 次数耗尽或时间到期自动清除。可添加显式清除:sn20, ch0, clear_i2c_ack_fault :addr[0x32]
5.2 I2C寄存器读写故障 (Set I2C Register R/W Fault) (新 - 对应 "I2C故障" 更细致的控制)
说明:针对特定I2C从设备地址的特定寄存器进行故障注入。
fault_type:
read_value: 读取该寄存器时返回指定的fault_value。
write_nack: 写入该寄存器时模拟NACK。
read_nack: 读取该寄存器时模拟NACK。
mode: once (仅下次), count (接下来N次), always (直到清除)。
命令 (模拟读错误值): sn20, ch0, set_i2c_reg_fault :addr[0x32], reg[0x010A], fault_type[read_value], fault_value[0xAA], mode[count], count[3]
命令 (模拟写NACK): sn20, ch0, set_i2c_reg_fault :addr[0x32], reg[0x02BC], fault_type[write_nack], mode[always]
响应: sn20, ch0, set_i2c_reg_fault_ack :status[OK], addr[0x32], reg[0x010A], fault_type[read_value]
错误响应: sn20, ch0, set_i2c_reg_fault_ack :status[ERROR], error_msg["Invalid I2C params or fault type"]
清除: sn20, ch0, clear_i2c_reg_fault :addr[0x32], reg[0x010A]
清除响应: sn20, ch0, clear_i2c_reg_fault_ack :status[OK], addr[0x32], reg[0x010A]
6. 查询类命令 (示例)
6.1 获取系统状态 (Get System Status) (新)
命令: sn20, ch0, get_system_status
响应: sn20, ch0, get_system_status_ack :status[OK], gmsl_link[connected|disconnected|error], video_output[showing|hidden], resolution[1920x1080], format[UYVY], current_rgb_gain[1.0,1.0,1.0], active_faults_count[2]
错误响应: sn20, ch0, get_system_status_ack :status[ERROR], error_msg["Failed to retrieve system status"]
6.2 获取当前活动故障列表 (Get Active Faults) (新)
命令: sn20, ch0, get_active_faults
响应: sn20, ch0, get_active_faults_ack :status[OK], fault_count[2], fault_1_type[img_overlay], fault_1_details["id:sun_spot, path:/path/img.png"], fault_2_type[i2c_reg_fault], fault_2_details["addr:0x32, reg:0x010A, type:read_value"]
(响应中的故障列表格式可以更结构化,例如JSON数组,但此处为简化表示)
错误响应: sn20, ch0, get_active_faults_ack :status[ERROR], error_msg["Failed to retrieve active faults"]
这个设计涵盖了您现有的协议和新的概念,并为每个命令提供了相应的成功和错误响应。在实际实现中,error_msg 可以包含更具体的错误代码和信息,以便于调试。 按照如下格式添加参数说明等:I2C故障注入命令 (set_i2c_fault)
设置I2C设备应答异常。
格式:
sn<序列号>,ch<通道号>,set_i2c_fault :addr[<设备地址>],mode[count],count[<命令数>]
sn<序列号>,ch<通道号>,set_i2c_fault :addr[<设备地址>],mode[time],time[<时间ms>]
参数说明:
- addr:I2C设备地址,如 0x32
- mode:故障模式,count 表示连续几个命令无应答,time 表示指定时间内无应答
- count:连续无应答的命令数量
- time:无应答持续时间,单位毫秒
示例:
sn20,ch0,set_i2c_fault :addr[0x32],mode[count],count[5]
sn20,ch0,set_i2c_fault :addr[0x32],mode[time],time[3000]
最新发布