Initial commit: CCU621_M firmware project with BLE debug link support.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-08 17:28:36 +08:00
commit 9ceb218f80
1597 changed files with 724159 additions and 0 deletions
+246
View File
@@ -0,0 +1,246 @@
#ifndef PCM_COMM_H
#define PCM_COMM_H
#ifdef __cplusplus
extern "C" {
#endif
/*------ Exported includes(头文件) ----------------------*/
#include "publicdata/publicdata.h"
/*------ Exported macro(宏定义) -------------------------*/
/* PCM UDP 网络参数 */
#define PCM_UDP_SRC_PORT 502 /* 本机(终端)UDP socket绑定的源端口 */
#define PCM_UDP_DST_PORT 502 /* 目标(主机)UDP端口 */
/* 终端IP地址基址:本机(终端)从192.168.1.100开始 */
#define PCM_TERM_IP_BASE0 192
#define PCM_TERM_IP_BASE1 168
#define PCM_TERM_IP_BASE2 1
#define PCM_TERM_IP_BASE3 100
/* 主机IP地址基址:1号主机从192.168.1.200开始 */
#define PCM_HOST_IP_BASE0 192
#define PCM_HOST_IP_BASE1 168
#define PCM_HOST_IP_BASE2 1
#define PCM_HOST_IP_BASE3 200
/* 每台主机占用的终端IP地址偏移量(10个地址) */
#define PCM_TERM_IP_OFFSET 10
/* 帧结构定义 */
#define PCM_FRAME_HEAD 0x5A99 /* 帧头 */
#define PCM_FRAME_TAIL 0xA5 /* 帧尾 */
/* 帧功能码 */
#define PCM_CMD_TERM_HEARTBEAT 0x10 /* 分桩心跳帧:终端->主机 */
#define PCM_CMD_HOST_HEARTBEAT 0x11 /* 主机心跳帧:主机->终端 */
#define PCM_CMD_TERM_REQUEST 0x12 /* 分桩请求帧:终端->主机 */
#define PCM_CMD_HOST_RESPONSE 0x13 /* 分桩请求应答帧:主机->终端 */
/* 帧最小长度:帧头(2) + 功能码(1) + 长度(1) + CRC(1) + 帧尾(1) = 6 */
#define PCM_FRAME_MIN_LEN 6
/* 帧最大数据长度 */
#define PCM_FRAME_MAX_DATA_LEN 128
/* 帧最大总长度 */
#define PCM_FRAME_MAX_LEN (PCM_FRAME_MIN_LEN + PCM_FRAME_MAX_DATA_LEN)
/* 通信周期(ms */
#define PCM_HEARTBEAT_PERIOD_MS 1000 /* 心跳周期 */
#define PCM_REQUEST_PERIOD_MS 200 /* 请求/应答周期 */
/* 通信超时时间(ms */
#define PCM_COMM_TIMEOUT_MS 5000 /* 5秒无通信判定超时 */
/* 终端枪工作状态 */
#define PCM_GUN_STATE_IDLE 0 /* 空闲 */
#define PCM_GUN_STATE_PLUG 1 /* 插枪 */
#define PCM_GUN_STATE_INSU_START 2 /* 绝缘启动 */
#define PCM_GUN_STATE_INSU_STOP 3 /* 绝缘停止 */
#define PCM_GUN_STATE_PRE_CHARGE 4 /* 预充启动 */
#define PCM_GUN_STATE_CHARGING 5 /* 充电中 */
#define PCM_GUN_STATE_CHARGE_STOP 6 /* 充电停止 */
#define PCM_GUN_STATE_CHARGE_STOPPED 7 /* 充电停止完成 */
/* 接触器状态 */
#define PCM_CONTACTOR_OPEN 0 /* 断开 */
#define PCM_CONTACTOR_CLOSE 1 /* 闭合 */
/* 模块启停状态 */
#define PCM_MODULE_STANDBY 0 /* 待机 */
#define PCM_MODULE_WORK 1 /* 工作 */
/* 故障状态 */
#define PCM_FAULT_NONE 0 /* 无故障 */
#define PCM_FAULT_EXIST 1 /* 故障 */
/*------ Exported struct(结构体定义) --------------------*/
/**
* @brief PCM 通用帧头结构
*/
typedef struct {
U16_T u16_head; /* 帧头:0x5A99 */
U8_T u8_cmd; /* 帧功能码 */
U8_T u8_len; /* 数据长度 */
}__attribute__((packed)) S_PCM_FRAME_HEAD;
/**
* @brief PCM 通用帧结构(完整帧)
*/
typedef struct {
U16_T u16_head; /* 帧头:0x5A99 */
U8_T u8_cmd; /* 帧功能码 */
U8_T u8_len; /* 数据长度 */
U8_T u8_data[PCM_FRAME_MAX_DATA_LEN]; /* 帧数据 */
U8_T u8_crc; /* CRC校验 */
U8_T u8_tail; /* 帧尾:0xA5 */
}__attribute__((packed)) S_PCM_FRAME;
/**
* @brief 单组终端枪数据(用于终端发送请求帧)
* 对应协议中:终端枪地址 + 工作状态 + 接触器状态x2 + 需求电压 + 需求电流 + 故障状态 + 故障原因
* 每组 11 字节
*/
typedef struct {
U8_T u8_gun_addr; /* 终端枪地址 */
U8_T u8_work_state; /* 终端枪工作状态 */
U8_T u8_contactor_dc; /* 直流输出接触器状态 */
U8_T u8_contactor_discharge; /* 直流输出泄放接触器状态 */
U16_T u16_need_vol; /* 需求电压 BE 0.1V */
U16_T u16_need_cur; /* 需求电流 BE 0.1A */
U8_T u8_fault_state; /* 终端枪故障状态 */
U16_T u16_fault_reason; /* 终端枪故障原因 BE */
}__attribute__((packed)) S_PCM_GUN_TERM_DATA;
/**
* @brief 单组主机应答数据(用于解析主机应答帧)
* 对应协议中:终端枪地址 + 模块启停 + 输出电压 + 输出电流 + 主机故障状态 + 主机故障原因
* 每组 9 字节
*/
typedef struct {
U8_T u8_gun_addr; /* 终端枪地址 */
U8_T u8_module_state; /* 模块启停状态 */
U16_T u16_out_vol; /* 输出电压 BE 0.1V */
U16_T u16_out_cur; /* 输出电流 BE 0.1A */
U8_T u8_host_fault; /* 主机故障状态 */
U16_T u16_host_fault_reason; /* 主机故障原因 BE */
}__attribute__((packed)) S_PCM_GUN_HOST_DATA;
/**
* @brief PCM 主机通信状态(收到的对端信息)
*/
typedef struct {
U32_T u32_host_ip; /* 主机IP地址(网络字节序) */
U16_T u16_host_port; /* 主机端口(网络字节序) */
/* 主机下发的应答数据 */
U8_T u8_gun_num; /* 主机回复的枪数量 */
S_PCM_GUN_HOST_DATA s_gun_data[GUN_MAX_CNT]; /* 各枪应答数据 */
/* 通信状态 */
U32_T u32_last_recv_time; /* 最后接收时间(ms */
U8_T u8_comm_ok; /* 通信状态:0超时 1正常 */
}__attribute__((packed)) S_PCM_HOST_STATE;
/**
* @brief PCM 终端通信数据
*/
typedef struct {
U8_T u8_term_no; /* 终端编号(1开始,对应主机编号) */
U32_T u32_term_ip; /* 本机(终端)IP地址(网络字节序) */
U16_T u16_term_port; /* 本机(终端)端口(网络字节序) */
/* 主机信息 */
U32_T u32_host_ip; /* 目标主机IP地址(网络字节序) */
U16_T u16_host_port; /* 目标主机端口(网络字节序) */
S_PCM_HOST_STATE s_host; /* 主机通信状态 */
/* 本机(终端)枪数据(待发送给主机) */
U8_T u8_gun_num; /* 本机终端枪数量 */
S_PCM_GUN_TERM_DATA s_gun_data[GUN_MAX_CNT]; /* 各枪数据 */
/* 定时器 */
U32_T u32_heartbeat_tick; /* 心跳发送计时 */
U32_T u32_request_tick; /* 请求发送计时 */
}__attribute__((packed)) S_PCM_COMM_DATA;
/*------ Exported variables(变量定义) -------------------*/
/*------ Exported function prototypes (函数声明) -------*/
/**
* @brief 初始化 PCM UDP 通信(终端角色)
*
* @param u8_term_no 终端编号(1开始,对应主机编号)
* @return S8_T 0成功 -1失败
*/
S8_T s8_pcm_udp_init(void);
/**
* @brief PCM UDP 周期处理函数
*
* @param u16_sleep_time_ms 任务周期时间(ms
*/
void v_pcm_udp_periodic_handler(U16_T u16_sleep_time_ms);
/**
* @brief PCM UDP 非阻塞接收处理
*
* @return U8_T 0无数据 1收到有效数据
*/
U8_T u8_pcm_udp_recv_process(void);
/**
* @brief PCM 通信主处理函数(由 mdu_comm_task 调用)
*
* @param u16_sleep_time_ms 任务周期时间(ms
*/
void v_pcm_comm_gw_action(U16_T u16_sleep_time_ms);
/**
* @brief 发送分桩心跳帧(功能码0x10)
*
* @return S8_T 0成功 -1失败
*/
S8_T s8_pcm_send_term_heartbeat(void);
/**
* @brief 发送分桩请求帧(功能码0x12)
*
* @return S8_T 0成功 -1失败
*/
S8_T s8_pcm_send_term_request(void);
/**
* @brief 获取主机通信状态
*
* @return U8_T 0超时 1正常
*/
U8_T u8_pcm_get_host_comm_status(void);
/**
* @brief 获取主机应答枪数据
*
* @param u8_gun_index 枪索引
* @return S_PCM_GUN_HOST_DATA* 主机应答数据指针,失败返回NULL
*/
S_PCM_GUN_HOST_DATA* ps_pcm_get_host_gun_data(U8_T u8_gun_index);
/**
* @brief 更新本机(终端)枪数据(由外部模块调用)
*
* @param u8_gun_index 枪索引
* @param ps_data 终端枪数据指针
*/
void v_pcm_update_term_gun_data(U8_T u8_gun_index, const S_PCM_GUN_TERM_DATA *ps_data);
#ifdef __cplusplus
}
#endif
#endif /* PCM_COMM_H */