Files
secs2-bootloader/usr/protocol/proto_SECS2.c

1915 lines
72 KiB
C
Raw Permalink 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.

#include "proto_SECS2.h"
#include "string.h"
#include "stdio.h"
#include "bsp_DS1302.h"
#include "proto_PM100.h"
#include "bsp_Flash.h"
#include "os_timer.h"
#include "bsp_W5500.h"
#define PROTO_SECS2_MESSAGE_DATA_NUM (50) /*解析的最多的数据类型*/
#define PROTO_SECS2_MESSAGE_DATA_BUFFER_NUM (255) /*解析的数据类型的最多字节数量*/
u8 proto_SECS2_Tx_Buffer[2048];
/*数据接收解析*/
static proto_SECS2_MessageData_t proto_SECS2_Rx_MessageData[PROTO_SECS2_MESSAGE_DATA_NUM];
static u8 proto_SECS2_Rx_MessageDataBuffer[PROTO_SECS2_MESSAGE_DATA_BUFFER_NUM];
// 发送正常状态项
static void send_normal_alarm_item(proto_SECS2_MessageData_t *MessageData, u8 *Tx, u16 *TxLen);
// 发送单个报警项
static void send_alarm_item(proto_SECS2_MessageData_t *MessageData, u8 *Tx, u16 *TxLen, u8 index, u8 is_alarm, const char *start_str, const char *duration_str);
/*发送的数据*/
static proto_SECS2_MessageData_t proto_SECS2_Tx_MessageData[PROTO_SECS2_MESSAGE_DATA_NUM];
static u8 proto_SECS2_Rx_MessageDataAnalysis_List(u8 *pData,u16 Len);
static u16 proto_HSMS_AddData(u8 *pTxData,proto_SECS2_MessageData_t *pData);
static void proto_SECS2_Rx_Task(proto_HSMS_Header_Data_t *pHeader_Data,u8 *pData,u16 Len);
static void proto_SECS2_Tx_Alarm_Task(void);
static void proto_SECS2_Tx_Dev_State_Task(void);
proto_SECS2_t SECS2 =
{
.Rx_DataAnalysis = proto_SECS2_Rx_Task,
.Tx_Alarm_Task = proto_SECS2_Tx_Alarm_Task,
.Tx_Dev_State_Task = proto_SECS2_Tx_Dev_State_Task,
};
proto_SECS2_t *pSECS2 = &SECS2;
static void proto_SECS2_Send(proto_HSMS_Header_Data_t *pHeader_Data,u8 *pData,u16 Len)
{
HSMS.Tx_RsqData(pHeader_Data,pData,Len,NULL);
}
/*时间秒数转换*/
// 判断闰年
static u8 is_leap_year(u16 year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 将年月日时分秒转换为从2000-01-01 00:00:00开始的秒数
static u32 datetime_to_seconds(u16 year, u8 month, u8 day, u8 hour, u8 minute, u8 second)
{
const u8 month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
u32 days = 0;
u16 y;
for (y = 2000; y < year; y++) {
days += 365;
if (is_leap_year(y)) days++;
}
for (u8 m = 1; m < month; m++) {
days += month_days[m-1];
if (m == 2 && is_leap_year(year)) days++;
}
days += (day - 1);
return days * 86400UL + hour * 3600UL + minute * 60UL + second;
}
// 获取当前时间的秒数
static u32 get_current_seconds(void)
{
u16 year = 2000 + DS1302.Time.Year;
return datetime_to_seconds(year, DS1302.Time.Month, DS1302.Time.Day,
DS1302.Time.Hour, DS1302.Time.Minute, DS1302.Time.Second);
}
// 格式化当前时间为 YYYYMMDDHHMMSS 字符串
static void format_current_time_str(char *buf, u16 len)
{
snprintf(buf, len, "20%02d%02d%02d%02d%02d%02d",
DS1302.Time.Year, DS1302.Time.Month, DS1302.Time.Day,
DS1302.Time.Hour, DS1302.Time.Minute, DS1302.Time.Second);
}
/**
* @brief 发送 S1F3 响应(单个数据、多个数据、全部数据)
* @param pHeader_Data HSMS 消息头
* @param pIndexArray 请求的索引数组uint32
* @param IndexCount 索引数量
*/
void proto_SECS2_Tx_S1F3(proto_HSMS_Header_Data_t *pHeader_Data, u32 *pIndexArray, u8 IndexCount)
{
u8 *Tx = proto_SECS2_Tx_Buffer;
u16 TxLen = 0;
u8 i;
u8 list_count;
u8 has_all_data_request = 0;
u64 Temp;
pHeader_Data->Header_Byte3++; /* 响应消息的 Function 加 1 */
pHeader_Data->Header_Byte2.Analysis_Data.Wait = 0;
Temp = ((u64)PM100.Opera_Status.Warming_Code << 32) | (u64)PM100.Opera_Status.Alarm_Code;
/* 检查是否有全部数据请求0xFFFFFFFF */
for (i = 0; i < IndexCount; i++)
{
if (pIndexArray[i] == 0xFFFFFFFF)
{
has_all_data_request = 1;
break;
}
}
if (has_all_data_request)
{
/* ========== 全部数据响应 ========== */
u8 Get_Data_NUM = 0;
proto_SECS2_MessageData_t MessageData;
/* 统计使能的数据项 */
for (i = 0; i < 32; i++)
{
if ((PROTO_PM100_GET_DATA_CODE >> i) & 0x00000001)
{
Get_Data_NUM++;
}
}
/* 外层列表Get_Data_NUM + 4状态项+ 19527 SN号 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = Get_Data_NUM + 4 + 1; /* 增加9527 SN号项 */
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 实时数据项0~31 */
for (i = 0; i < 32; i++)
{
if ((PROTO_PM100_GET_DATA_CODE >> i) & 0x00000001)
{
/* 子列表2个元素索引 + 数据) */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 2;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 索引 uint16 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_2Byte_uint;
u16 index = i;
MessageData.pData = (void *)(&index);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 数据 float */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_float;
float *pAnalogData = (float *)&PM100.AnalogData;
float value = pAnalogData[i];
MessageData.pData = (void *)(&value);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
}
}
/* 状态项 3001~3005 */
for (i = 0; i < 4; i++)
{
u32 status_index = 3001 + i;
u8 status_value = 0;
/* 获取状态值 */
switch (status_index)
{
case 3001:
if (PM100.Opera_Status.Run_Status == PROTO_PM100_MODE_NORMAL)
status_value = PROTO_PM100_MODE_NORMAL;
else if (PM100.Opera_Status.Run_Status == PROTO_PM100_MODE_POWER_SAVING)
status_value = PROTO_PM100_MODE_POWER_SAVING;
break;
case 3002:
if (PM100.Opera_Status.MP_Status == PROTO_PM100_MODE_RUNING)
status_value = PROTO_PM100_MODE_RUNING;
else if (PM100.Opera_Status.MP_Status == PROTO_PM100_MODE_STOP)
status_value = PROTO_PM100_MODE_STOP;
break;
case 3003:
if (PM100.Opera_Status.BP_Status == PROTO_PM100_MODE_RUNING)
status_value = PROTO_PM100_MODE_RUNING;
else if (PM100.Opera_Status.BP_Status == PROTO_PM100_MODE_STOP)
status_value = PROTO_PM100_MODE_STOP;
break;
case 3004:
if(PM100.error_code & PROTO_PM100_ERROR_CODE_TIMEOUT)
{
status_value = PROTO_PM100_MODE_OFFLINE;
}
else
{
if(Temp!=0)
{
status_value = PROTO_PM100_MODE_ALARM;
}else if(PROTO_PM100_MODE_RUNING == PM100.Opera_Status.BP_Status && PROTO_PM100_MODE_RUNING == PM100.Opera_Status.MP_Status)
{
status_value = PROTO_PM100_MODE_RUN;
}else if(PROTO_PM100_MODE_STOP == PM100.Opera_Status.BP_Status || PROTO_PM100_MODE_STOP == PM100.Opera_Status.MP_Status)
{
status_value = PROTO_PM100_MODE_IDIE;
}else
{
status_value = PROTO_PM100_MODE_ONLINE;
}
}
break;
case 3005:
/* 警告报警码特殊处理,返回 8 字节 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 2;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
MessageData.DataType = PROTO_SECS2_DATA_TYPE_2Byte_uint;
u16 idx = 3005;
MessageData.pData = (void *)(&idx);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
u64 warning_alarm = ((u64)PM100.Opera_Status.Warming_Code << 32) | (u64)PM100.Opera_Status.Alarm_Code;
MessageData.DataType = PROTO_SECS2_DATA_TYPE_8Byte_uint;
MessageData.pData = (void *)(&warning_alarm);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
continue; /* 跳过后续 ASCII 处理 */
}
/* 子列表2个元素索引 + 数据) */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 2;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 索引 uint16 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_2Byte_uint;
u16 index = status_index;
MessageData.pData = (void *)(&index);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 数据 (单字符) */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_1Byte_uint;
MessageData.pData = (void *)(&status_value);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
}
/* 子列表2个元素索引 + 数据) */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 2;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 索引 uint169527 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_2Byte_uint;
u16 sn_index = 9527;
MessageData.pData = (void *)(&sn_index);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 数据 ASCII字符串"SN100000011" */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
// char sn_string[] = "SN100000011";
// MessageData.pData = (void *)sn_string;
MessageData.pData = (void *)Usr_Flash.FlashData.Device_SN;
MessageData.DataNum = strlen(Usr_Flash.FlashData.Device_SN);
// MessageData.DataNum = sizeof(sn_string) - 1; /* 长度11不包括null终止符 */
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
}
else if (IndexCount == 1)
{
/* ========== 单个数据响应 ========== */
proto_SECS2_MessageData_t MessageData;
u32 index = pIndexArray[0];
/* 外层列表1个元素数据 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 1;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 根据索引类型返回数据 */
if (index <= 31)
{
/* 模拟数据 float */
float *pAnalogData = (float *)&PM100.AnalogData;
float value = pAnalogData[index];
MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_float;
MessageData.pData = (void *)(&value);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
}
else if (index >= 3001 && index <= 3005)
{
/* 状态数据 */
if (index == 3005)
{
/* 警告报警码8字节 */
u64 warning_alarm = ((u64)PM100.Opera_Status.Warming_Code << 32) | (u64)PM100.Opera_Status.Alarm_Code;
MessageData.DataType = PROTO_SECS2_DATA_TYPE_8Byte_uint;
MessageData.pData = (void *)(&warning_alarm);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
}
else
{
/* 状态字符ASCII */
u8 status_value = 0;
switch (index)
{
case 3001:
if (PM100.Opera_Status.Run_Status == PROTO_PM100_MODE_NORMAL)
status_value = PROTO_PM100_MODE_NORMAL;
else if (PM100.Opera_Status.Run_Status == PROTO_PM100_MODE_POWER_SAVING)
status_value = PROTO_PM100_MODE_POWER_SAVING;
break;
case 3002:
if (PM100.Opera_Status.MP_Status == PROTO_PM100_MODE_RUNING)
status_value = PROTO_PM100_MODE_RUNING;
else if (PM100.Opera_Status.MP_Status == PROTO_PM100_MODE_STOP)
status_value = PROTO_PM100_MODE_STOP;
break;
case 3003:
if (PM100.Opera_Status.BP_Status == PROTO_PM100_MODE_RUNING)
status_value = PROTO_PM100_MODE_RUNING;
else if (PM100.Opera_Status.BP_Status == PROTO_PM100_MODE_STOP)
status_value = PROTO_PM100_MODE_STOP;
break;
case 3004:
if(PM100.error_code & PROTO_PM100_ERROR_CODE_TIMEOUT)
{
status_value = PROTO_PM100_MODE_OFFLINE;
}
else
{
if(Temp!=0)
{
status_value = PROTO_PM100_MODE_ALARM;
}else if(PROTO_PM100_MODE_RUNING == PM100.Opera_Status.BP_Status && PROTO_PM100_MODE_RUNING == PM100.Opera_Status.MP_Status)
{
status_value = PROTO_PM100_MODE_RUN;
}else if(PROTO_PM100_MODE_STOP == PM100.Opera_Status.BP_Status || PROTO_PM100_MODE_STOP == PM100.Opera_Status.MP_Status)
{
status_value = PROTO_PM100_MODE_IDIE;
}else
{
status_value = PROTO_PM100_MODE_ONLINE;
}
}
break;
}
MessageData.DataType = PROTO_SECS2_DATA_TYPE_1Byte_uint;
MessageData.pData = (void *)(&status_value);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
}
}
else if (index == 9527)
{
/* 9527 SN号ASCII字符串 */
// char sn_string[] = "SN100000011";
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
// MessageData.pData = (void *)sn_string;
// MessageData.DataNum = 11; /* 长度11不包括null终止符 */
MessageData.pData = (void *)Usr_Flash.FlashData.Device_SN;
MessageData.DataNum = strlen(Usr_Flash.FlashData.Device_SN);
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
}
}
else
{
/* ========== 多个数据响应 ========== */
proto_SECS2_MessageData_t MessageData;
/* 外层列表IndexCount 个元素 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = IndexCount;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
for (i = 0; i < IndexCount; i++)
{
u32 index = pIndexArray[i];
if (index <= 31)
{
/* 模拟数据 float */
float *pAnalogData = (float *)&PM100.AnalogData;
float value = pAnalogData[index];
MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_float;
MessageData.pData = (void *)(&value);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
}
else if (index >= 3001 && index <= 3005)
{
if (index == 3005)
{
/* 警告报警码8字节 */
u64 warning_alarm = ((u64)PM100.Opera_Status.Warming_Code << 32) | (u64)PM100.Opera_Status.Alarm_Code;
MessageData.DataType = PROTO_SECS2_DATA_TYPE_8Byte_uint;
MessageData.pData = (void *)(&warning_alarm);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
}
else
{
/* 状态字符ASCII */
u8 status_value = 0;
switch (index)
{
case 3001:
if (PM100.Opera_Status.Run_Status == PROTO_PM100_MODE_NORMAL)
status_value = PROTO_PM100_MODE_NORMAL;
else if (PM100.Opera_Status.Run_Status == PROTO_PM100_MODE_POWER_SAVING)
status_value = PROTO_PM100_MODE_POWER_SAVING;
break;
case 3002:
if (PM100.Opera_Status.MP_Status == PROTO_PM100_MODE_RUNING)
status_value = PROTO_PM100_MODE_RUNING;
else if (PM100.Opera_Status.MP_Status == PROTO_PM100_MODE_STOP)
status_value = PROTO_PM100_MODE_STOP;
break;
case 3003:
if (PM100.Opera_Status.BP_Status == PROTO_PM100_MODE_RUNING)
status_value = PROTO_PM100_MODE_RUNING;
else if (PM100.Opera_Status.BP_Status == PROTO_PM100_MODE_STOP)
status_value = PROTO_PM100_MODE_STOP;
break;
case 3004:
if(PM100.error_code & PROTO_PM100_ERROR_CODE_TIMEOUT)
{
status_value = PROTO_PM100_MODE_OFFLINE;
}
else
{
if(Temp!=0)
{
status_value = PROTO_PM100_MODE_ALARM;
}else if(PROTO_PM100_MODE_RUNING == PM100.Opera_Status.BP_Status && PROTO_PM100_MODE_RUNING == PM100.Opera_Status.MP_Status)
{
status_value = PROTO_PM100_MODE_RUN;
}else if(PROTO_PM100_MODE_STOP == PM100.Opera_Status.BP_Status || PROTO_PM100_MODE_STOP == PM100.Opera_Status.MP_Status)
{
status_value = PROTO_PM100_MODE_IDIE;
}else
{
status_value = PROTO_PM100_MODE_ONLINE;
}
}
break;
}
MessageData.DataType = PROTO_SECS2_DATA_TYPE_1Byte_uint;
MessageData.pData = (void *)(&status_value);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
}
}
else if (index == 9527)
{
/*9527 SN号ASCII字符串 */
// char sn_string[] = "SN100000011";
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData.pData = (void *)Usr_Flash.FlashData.Device_SN;
MessageData.DataNum = strlen(Usr_Flash.FlashData.Device_SN);
// MessageData.pData = (void *)sn_string;
// MessageData.DataNum = sizeof(sn_string) - 1; /* 长度11不包括null终止符 */
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
}
}
}
/* 发送数据 */
proto_SECS2_Send(pHeader_Data, Tx, TxLen);
}
void proto_SECS2_Tx_S2F49(proto_HSMS_Header_Data_t *pHeader_Data,void *pData,u16 Len)
{
u8 *Tx = proto_SECS2_Tx_Buffer,TxLen = 0;
u8 Tx_Data = 1;
proto_SECS2_MessageData_t MessageData;
pHeader_Data->Header_Byte3++;
pHeader_Data->Header_Byte2.Analysis_Data.Wait = 0;
MessageData.DataType = PROTO_SECS2_DATA_TYPE_Bool;
MessageData.pData = (void *)(&Tx_Data);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData);
/*将发送数据拼接到HSMS后面*/
proto_SECS2_Send(pHeader_Data,Tx,TxLen);
}
void proto_SECS2_Tx_S1F1(proto_HSMS_Header_Data_t *pHeader_Data,void *pData,u16 Len)
{
u8 *Tx = proto_SECS2_Tx_Buffer,TxLen=0;
u8 list_count = 0;
proto_SECS2_MessageData_t MessageData;
pHeader_Data->Header_Byte3++;
pHeader_Data->Header_Byte2.Analysis_Data.Wait = 0;
/*List 2 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 2;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData);
/*ASCII Station_Type[8] */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData.pData = (void *)Usr_Flash.FlashData.Station_Type;
MessageData.DataNum = strlen(Usr_Flash.FlashData.Station_Type);
TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData);
/*ASCII "2025.ver12" */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData.pData = (void *)Usr_Flash.FlashData.Version;
MessageData.DataNum = strlen(Usr_Flash.FlashData.Version);
TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData);
/*将发送数据拼接到HSMS后面*/
proto_SECS2_Send(pHeader_Data,Tx,TxLen);
}
void proto_SECS2_Tx_S6F11(proto_HSMS_Header_Data_t *pHeader_Base, u8 index, u8 is_alarm, const char *start_str, u32 duration_sec)
{
u8 *Tx = proto_SECS2_Tx_Buffer;
u16 TxLen = 0;
u8 list_count;
proto_SECS2_MessageData_t MessageData;
proto_HSMS_Header_Data_t Header = *pHeader_Base;
Header.Header_Byte2.Analysis_Data.Wait = PROTO_ALARM_CHANGE_RX_WAIT;
/* 外层列表3个元素 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 3;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* Data ID 从 Flash 读取 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData.pData = (void *)&Usr_Flash.FlashData.Data_ID1;
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* Collection Event ID 从 Flash 读取 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData.pData = (void *)&Usr_Flash.FlashData.Collection_event_ID1;
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 第三层列表1个元素 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 1;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 第四层列表2个元素 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 2;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* Report ID - 置空(或从 Flash 读取) */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
u32 empty_report_id = 0;
MessageData.pData = (void *)&empty_report_id;
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 报警数据列表:只包含 1 个报警项 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 1;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
char duration_str[20];
snprintf(duration_str, sizeof(duration_str), "%lu", duration_sec);
// 调用send_alarm_item 发送单个报警项
send_alarm_item(&MessageData, Tx, &TxLen, index, is_alarm, start_str, duration_str);
/* 发送消息 */
proto_SECS2_Send(&Header, Tx, TxLen);
}
char alarm_description[32];
char ip_description[32];
// 发送单个报警项
static void send_alarm_item(proto_SECS2_MessageData_t *MessageData, u8 *Tx, u16 *TxLen, u8 index, u8 is_alarm, const char *start_str, const char *duration_str)
{
u8 list_count;
u32 alarm_id_to_send;
char alarm_type[20];
char empty_ascii[1] = "";
u32 empty_uint = 0;
char begin_warning[6] = "Begin";
char end_warning[6] = "End";
// 设置报警ID和描述
if(90 == index && 1 == is_alarm)
{
alarm_id_to_send = 90;
snprintf(alarm_description, sizeof(alarm_description), "%s",
"Pump Offline");
strncpy(alarm_type, "Major Alarm", sizeof(alarm_type));
}
else if (is_alarm)
{
alarm_id_to_send = 50 + index; // 报警ID从50开始
snprintf(alarm_description, sizeof(alarm_description), "%s",
proto_PM100_Str_AlarmCode[index]);
strncpy(alarm_type, "Major Alarm", sizeof(alarm_type));
}
else
{
alarm_id_to_send = index; // 警告ID从0开始
snprintf(alarm_description, sizeof(alarm_description), "%s",
proto_PM100_Str_WarmingCode[index]);
strncpy(alarm_type, "Major Warning", sizeof(alarm_type));
}
/* 单个报警项列表19个元素 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 19;
MessageData->pData = (void *)(&list_count);
MessageData->DataNum = 1;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 1. AlarmID */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData->pData = (void *)&alarm_id_to_send;
MessageData->DataNum = 1;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 2. 报警类型 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)alarm_type;
MessageData->DataNum = strlen(alarm_type);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 3. 报警机台和位置 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)Usr_Flash.FlashData.Device_Model;
MessageData->DataNum = strlen(Usr_Flash.FlashData.Device_Model);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 4. IP+port*/
sprintf(ip_description,"%d.%d.%d.%d:%d",W5500.IP_Addr[0],W5500.IP_Addr[1],W5500.IP_Addr[2],W5500.IP_Addr[3],(W5500.IP_Addr[2],W5500.W5500_Class[0].ConfigData.Port[0] << 8) | W5500.W5500_Class[0].ConfigData.Port[1]);
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)ip_description;
MessageData->DataNum = strlen(ip_description);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 5. 设备型号 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)Usr_Flash.FlashData.Device_ID;
MessageData->DataNum = strlen(Usr_Flash.FlashData.Device_ID);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 6. 报警描述 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)alarm_description;
MessageData->DataNum = strlen(alarm_description);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 7. Over Trigger */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)empty_ascii;
MessageData->DataNum = 0;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 8. Equipment */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)empty_ascii;
MessageData->DataNum = 0;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 9. Begin Warning */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
if(strcmp(duration_str,"0") == 0)
{
MessageData->pData = (void *)begin_warning;
MessageData->DataNum = strlen(begin_warning);
}else
{
MessageData->pData = (void *)end_warning;
MessageData->DataNum = strlen(end_warning);
}
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 10. Variable data 2 - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)empty_ascii;
MessageData->DataNum = 0;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 11. 设备类型 - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData->pData = (void *)&empty_uint;
MessageData->DataNum = 1;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 12. Sensor名称 - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData->pData = (void *)&empty_uint;
MessageData->DataNum = 1;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 13. 报警值 - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData->pData = (void *)&empty_uint;
MessageData->DataNum = 1;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 14. 报警单位 - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData->pData = (void *)&empty_uint;
MessageData->DataNum = 1;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 15. 开始时间 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)start_str;
MessageData->DataNum = strlen(start_str);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 16. 报警时长 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)duration_str;
MessageData->DataNum = strlen(duration_str);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 17. 报警类型 (策略报警/机台报警) - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)empty_ascii;
MessageData->DataNum = 0;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 18. 机台名称(flash) */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)Usr_Flash.FlashData.Station_Name;
MessageData->DataNum = strlen(Usr_Flash.FlashData.Station_Name);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 19. 腔体名称(flash) */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)Usr_Flash.FlashData.Chamber_Name;
MessageData->DataNum = strlen(Usr_Flash.FlashData.Chamber_Name);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
}
// 发送正常状态项
static void send_normal_alarm_item(proto_SECS2_MessageData_t *MessageData, u8 *Tx, u16 *TxLen)
{
u8 list_count;
u32 alarm_id_to_send = 0;
char alarm_description[32] = "Normal";
char alarm_type[20] = "Normal";
char empty_ascii[1] = "";
u32 empty_uint = 0;
char begin_warning[6] = "Begin";
/* 单个报警项列表19个元素 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 19;
MessageData->pData = (void *)(&list_count);
MessageData->DataNum = 1;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 1. AlarmID */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData->pData = (void *)&alarm_id_to_send;
MessageData->DataNum = 1;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 2. 报警类型 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)alarm_type;
MessageData->DataNum = strlen(alarm_type);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 3. 报警机台和位置 (前10位字符) */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)Usr_Flash.FlashData.Device_Model;
MessageData->DataNum = strlen(Usr_Flash.FlashData.Device_Model);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 4. IP+port*/
sprintf(alarm_description,"%d.%d.%d.%d:%d",W5500.IP_Addr[0],W5500.IP_Addr[1],W5500.IP_Addr[2],W5500.IP_Addr[3],(W5500.IP_Addr[2],W5500.W5500_Class[0].ConfigData.Port[0] << 8) | W5500.W5500_Class[0].ConfigData.Port[1]);
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)alarm_description;
MessageData->DataNum = strlen(alarm_description);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 5. 设备型号 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)Usr_Flash.FlashData.Device_ID;
MessageData->DataNum = strlen(Usr_Flash.FlashData.Device_ID);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 6. 报警描述 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)alarm_description;
MessageData->DataNum = strlen(alarm_description);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 7. Over Trigger - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)empty_ascii;
MessageData->DataNum = 0;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 8. Equipment - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)empty_ascii;
MessageData->DataNum = 0;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 9. Begin Warning - 固定为"Begin" */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)begin_warning;
MessageData->DataNum = 5;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 10. Variable data 2 - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)empty_ascii;
MessageData->DataNum = 0;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 11. 设备类型 - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData->pData = (void *)&empty_uint;
MessageData->DataNum = 1;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 12. Sensor名称 - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData->pData = (void *)&empty_uint;
MessageData->DataNum = 1;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 13. 报警值 - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData->pData = (void *)&empty_uint;
MessageData->DataNum = 1;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 14. 报警单位 - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData->pData = (void *)&empty_uint;
MessageData->DataNum = 1;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 15. 开始时间 - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)empty_ascii;
MessageData->DataNum = 0;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 16. 报警时长 - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)empty_ascii;
MessageData->DataNum = 0;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 17. 报警类型 (策略报警/机台报警) - 置空 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)empty_ascii;
MessageData->DataNum = 0;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
}
void proto_SECS2_Tx_S1F13(proto_HSMS_Header_Data_t *pHeader_Data,void *pData,u16 Len)
{
u8 *Tx = proto_SECS2_Tx_Buffer,TxLen=0;
u8 list_count;
proto_SECS2_MessageData_t MessageData;
pHeader_Data->Header_Byte3++;
pHeader_Data->Header_Byte2.Analysis_Data.Wait = 0;
/*List 2*/
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 2;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData);
/*Bool 0*/
u8 bool_value = 1;
MessageData.DataType = PROTO_SECS2_DATA_TYPE_Bool;
MessageData.pData = (void *)(&bool_value);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData);
/*List 2*/
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 2;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData);
/*ASCII PK1143*/
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
//MessageData.pData = (void *)(PK_string);
MessageData.pData = (void *)Usr_Flash.FlashData.Manufacturer;
MessageData.DataNum = strlen(Usr_Flash.FlashData.Manufacturer);
TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData);
/*ASCII 001181*/
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
// MessageData.pData = (void *)(CODE_string);
MessageData.pData = (void *)Usr_Flash.FlashData.Version;
MessageData.DataNum = strlen(Usr_Flash.FlashData.Version);
TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData);
/*将发送数据拼接到HSMS后面*/
proto_SECS2_Send(pHeader_Data,Tx,TxLen);
}
void proto_SECS2_Tx_S2F31(proto_HSMS_Header_Data_t *pHeader_Data,void *pData,u16 Len,u8 bool)
{
u8 *Tx = proto_SECS2_Tx_Buffer,TxLen = 0;
// u8 binary_value = 1;
// char binary_value[8]="Ture";
proto_SECS2_MessageData_t MessageData;
pHeader_Data->Header_Byte3++;
pHeader_Data->Header_Byte2.Analysis_Data.Wait = 0;
MessageData.DataType = PROTO_SECS2_DATA_TYPE_Bool;
MessageData.pData = (void *)(&bool);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData);
/*将发送数据拼接到HSMS后面*/
proto_SECS2_Send(pHeader_Data,Tx,TxLen);
}
void proto_SECS2_Tx_Device_S6F11(proto_HSMS_Header_Data_t *pHeader_Data, void *pData, u16 Len)
{
u8 *Tx = proto_SECS2_Tx_Buffer;
u16 TxLen = 0;
u8 list_count,status_value;
u64 Temp;
Temp = ((u64)PM100.Opera_Status.Warming_Code << 32) | (u64)PM100.Opera_Status.Alarm_Code;
// 构建状态字符串
char status_buffer[20] = "";
char time_string[15]; // 14位时间字符串 + 1个null终止符
proto_SECS2_MessageData_t MessageData;
/* 外层列表3个元素 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 3;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 第一个元素: Data ID (U4) */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
u32 data_id=1;
//MessageData.pData = (void *)&Usr_Flash.FlashData.Data_ID1;
MessageData.pData=(void *)data_id;
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 第二个元素: Collection event ID (U4) */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
//MessageData.pData = (void *)&Usr_Flash.FlashData.Collection_event_ID1;
u32 collection_event_id=2;
MessageData.pData=(void *)collection_event_id;
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 第三层列表1个元素 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 1;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 第四层列表2个元素 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 2;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* Report ID (U4) */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
//MessageData.pData = (void *)&Usr_Flash.FlashData.Report_ID1;
u32 report_id=3;
MessageData.pData=(void *)report_id;
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 第五层列表7个元素 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 7;
MessageData.pData = (void *)(&list_count);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 1. 机台名称(flash) */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData.pData = (void *)Usr_Flash.FlashData.Station_Name;
MessageData.DataNum = strlen(Usr_Flash.FlashData.Station_Name);
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 2. 腔体名称(flash) */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData.pData = (void *)Usr_Flash.FlashData.Chamber_Name;
MessageData.DataNum = strlen(Usr_Flash.FlashData.Chamber_Name);
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 3. 附属设备类型 - 固定为'PUMP' */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData.pData = (void *)"PUMP";
MessageData.DataNum = 4; // "PUMP"的长度
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 4. 附属设备状态 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
// BP状态改变
// if (PM100.Dev_Status_Control.Opera_Status_Last.BP_Status != PM100.Opera_Status.BP_Status) {
// if (PROTO_PM100_MODE_RUNING == PM100.Opera_Status.BP_Status) {
// strcat(status_buffer, "BP run");
// } else {
// strcat(status_buffer, "BP stop");
// }
// }
//
// // MP状态改变
// if (PM100.Dev_Status_Control.Opera_Status_Last.MP_Status != PM100.Opera_Status.MP_Status) {
// if (PROTO_PM100_MODE_RUNING == PM100.Opera_Status.MP_Status) {
// strcat(status_buffer, "MP run");
// } else {
// strcat(status_buffer, "MP stop");
// }
// }
//
// // 运行模式改变
// if (PM100.Dev_Status_Control.Opera_Status_Last.Run_Status != PM100.Opera_Status.Run_Status) {
// if (PROTO_PM100_MODE_POWER_SAVING == PM100.Opera_Status.Run_Status) {
// strcat(status_buffer, "Power-saving mode");
// } else {
// strcat(status_buffer, "Normal mode");
// }
// }
if(PM100.error_code & PROTO_PM100_ERROR_CODE_TIMEOUT)
{
status_value = PROTO_PM100_MODE_OFFLINE;
}
else
{
if(Temp!=0)
{
status_value = PROTO_PM100_MODE_ALARM;
}else if(PROTO_PM100_MODE_RUNING == PM100.Opera_Status.BP_Status && PROTO_PM100_MODE_RUNING == PM100.Opera_Status.MP_Status)
{
status_value = PROTO_PM100_MODE_RUN;
}else if(PROTO_PM100_MODE_STOP == PM100.Opera_Status.BP_Status || PROTO_PM100_MODE_STOP == PM100.Opera_Status.MP_Status)
{
status_value = PROTO_PM100_MODE_IDIE;
}else
{
status_value = PROTO_PM100_MODE_PE;
}
}
MessageData.pData = (void *)&status_value;
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 5. 状态切换成功时间 - 从DS1302获取 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
// bsp_DS1302_Time_t current_time;
snprintf(time_string, sizeof(time_string), "20%02d%02d%02d%02d%02d%02d",
DS1302.Time.Year, DS1302.Time.Month, DS1302.Time.Day,
DS1302.Time.Hour, DS1302.Time.Minute, DS1302.Time.Second);
MessageData.pData = (void *)time_string;
MessageData.DataNum = 14; // 14位时间字符串长度
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 6. 腔体位置 - 设为空ALL表示没有具体位置*/
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData.pData = (void *)"ALL";
MessageData.DataNum = 3; // "ALL"的长度
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
sprintf(alarm_description,"%d.%d.%d.%d:%d",W5500.IP_Addr[0],W5500.IP_Addr[1],W5500.IP_Addr[2],W5500.IP_Addr[3],(W5500.W5500_Class[0].ConfigData.Port[0] << 8) | W5500.W5500_Class[0].ConfigData.Port[1]);
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData.pData = (void *)alarm_description;
MessageData.DataNum = strlen(alarm_description);
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 将发送数据拼接到HSMS后面 */
proto_SECS2_Send(pHeader_Data, Tx, TxLen);
}
/*警报主动上传*/
static void proto_SECS2_Tx_Alarm_Task(void)
{
static u32 Sys_Byte;
u32 now_sec;
char now_str[15];
u8 offline;
static u8 last_offline_state = 0; // 上一次离线状态
static u32 offline_start_sec = 0; // 离线开始秒数
static char offline_start_str[15] = {0};// 离线开始时间字符串
/*1s判断一次*/
if (TIME_TRUE == OsTimer_CheckTimeOut(PM100.Alarm_Control.StartTime, osTime_MSecTick, 1000))
{
u64 Temp,activated_bits,changed_bits,deactivated_bits;
PM100.Alarm_Control.StartTime = osTime_MSecTick;
Temp = ((u64)PM100.Opera_Status.Warming_Code << 32) | (u64)PM100.Opera_Status.Alarm_Code;
offline = (PM100.error_code & PROTO_PM100_ERROR_CODE_TIMEOUT) ? 1 : 0;
if(offline != last_offline_state) /*超时*/
{
proto_HSMS_Header_Data_t Header_Data;
Header_Data.Device_Id = HSMS.Flash_ConfigData.Device_Id;
Header_Data.Header_Byte2.Analysis_Data.Stream = 6;
Header_Data.Header_Byte2.Analysis_Data.Wait = PROTO_ALARM_CHANGE_RX_WAIT;
Header_Data.Header_Byte3 = 11;
Header_Data.PType = proto_HSMS_PTYPE_SECS2;
Header_Data.SType = PROTO_HSMS_STYPE_Data_Message;
now_sec = get_current_seconds();
format_current_time_str(now_str, sizeof(now_str));
if (offline == 1 && last_offline_state == 0) // 在线 → 离线
{
offline_start_sec = now_sec;
strcpy(offline_start_str, now_str);
pSECS2->sys_count++;
Header_Data.Sys_Byte = pSECS2->sys_count;
proto_SECS2_Tx_S6F11(&Header_Data, 90, 1, now_str, 0);
}
else if (offline == 0 && last_offline_state == 1) // 离线 → 在线
{
u32 duration = now_sec - offline_start_sec;
pSECS2->sys_count++;
Header_Data.Sys_Byte = pSECS2->sys_count;
proto_SECS2_Tx_S6F11(&Header_Data, 90, 1, offline_start_str, duration);
offline_start_sec = 0;
offline_start_str[0] = '\0';
}
last_offline_state = offline;
}
else if(PM100.Alarm_Control.Code_Last != Temp)
{
changed_bits = Temp ^ PM100.Alarm_Control.Code_Last;
activated_bits = changed_bits & Temp; // 新激活的位
deactivated_bits = changed_bits & PM100.Alarm_Control.Code_Last; // 消失的位
// if(0 != Temp)
// {
now_sec = get_current_seconds();
format_current_time_str(now_str, sizeof(now_str));
proto_HSMS_Header_Data_t Header_Data;
Header_Data.Device_Id = HSMS.Flash_ConfigData.Device_Id;
Header_Data.Header_Byte2.Analysis_Data.Stream = 6;
Header_Data.Header_Byte2.Analysis_Data.Wait = PROTO_ALARM_CHANGE_RX_WAIT;
Header_Data.Header_Byte3 = 11;
Header_Data.PType = proto_HSMS_PTYPE_SECS2;
Header_Data.SType = PROTO_HSMS_STYPE_Data_Message;
pSECS2->sys_count++;
Header_Data.Sys_Byte = pSECS2->sys_count;
// 处理激活的报警开始事件时长0
for (u8 i = 0; i < 32; i++) {
if (activated_bits & ((u64)1 << i)) {
strcpy(PM100.Opera_Status.alarm_start_str[i], now_str);
PM100.Opera_Status.alarm_start_sec[i] = now_sec;
pSECS2->sys_count++;
Header_Data.Sys_Byte = pSECS2->sys_count;
proto_SECS2_Tx_S6F11(&Header_Data, i, 1, now_str, 0);
}
}
for (u8 i = 32; i < 64; i++) {
if (activated_bits & ((u64)1 << i)) {
u8 idx = i - 32;
strcpy(PM100.Opera_Status.warning_start_str[idx], now_str);
PM100.Opera_Status.warning_start_sec[idx] = now_sec;
pSECS2->sys_count++;
Header_Data.Sys_Byte = pSECS2->sys_count;
proto_SECS2_Tx_S6F11(&Header_Data, idx, 0, now_str, 0);
}
}
// 处理消失的报警(结束事件,计算时长)
for (u8 i = 0; i < 32; i++) {
if (deactivated_bits & ((u64)1 << i)) {
u32 duration = now_sec - PM100.Opera_Status.alarm_start_sec[i];
pSECS2->sys_count++;
Header_Data.Sys_Byte = pSECS2->sys_count;
proto_SECS2_Tx_S6F11(&Header_Data, i, 1,
PM100.Opera_Status.alarm_start_str[i], duration);
// 清空记录
PM100.Opera_Status.alarm_start_str[i][0] = '\0';
PM100.Opera_Status.alarm_start_sec[i] = 0;
}
}
for (u8 i = 32; i < 64; i++) {
if (deactivated_bits & ((u64)1 << i)) {
u8 idx = i - 32;
u32 duration = now_sec - PM100.Opera_Status.warning_start_sec[idx];
pSECS2->sys_count++;
Header_Data.Sys_Byte = pSECS2->sys_count;
proto_SECS2_Tx_S6F11(&Header_Data, idx, 0,
PM100.Opera_Status.warning_start_str[idx], duration);
PM100.Opera_Status.warning_start_str[idx][0] = '\0';
PM100.Opera_Status.warning_start_sec[idx] = 0;
}
}
// }
PM100.Alarm_Control.Code_Last = Temp;
// PM100.Alarm_Control.Reset();
}
}
}
/*设备状态*/
static void proto_SECS2_Tx_Dev_State_Task(void)
{
/*1s判断一次*/
if (TIME_TRUE == OsTimer_CheckTimeOut(PM100.Dev_Status_Control.StartTime, osTime_MSecTick, 1000))
{
u64 Temp;
PM100.Dev_Status_Control.StartTime = osTime_MSecTick;
if( PM100.Dev_Status_Control.Opera_Status_Last.BP_Status != PM100.Opera_Status.BP_Status
|| PM100.Dev_Status_Control.Opera_Status_Last.MP_Status != PM100.Opera_Status.MP_Status
|| PM100.Dev_Status_Control.Opera_Status_Last.Run_Status != PM100.Opera_Status.Run_Status
)
{
proto_HSMS_Header_Data_t Header_Data;
Header_Data.Device_Id = HSMS.Flash_ConfigData.Device_Id;
Header_Data.Header_Byte2.Analysis_Data.Stream = 6; /*S6*/
Header_Data.Header_Byte2.Analysis_Data.Wait = PROTO_STATE_CHANGE_RX_WAIT;
Header_Data.Header_Byte3 = 11; /*F11*/
Header_Data.PType = proto_HSMS_PTYPE_SECS2;
Header_Data.SType = PROTO_HSMS_STYPE_Data_Message;
pSECS2->sys_count++;
Header_Data.Sys_Byte = pSECS2->sys_count;
proto_SECS2_Tx_Device_S6F11(&Header_Data,&Temp,8);
PM100.Dev_Status_Control.Reset();
}
}
}
static void proto_SECS2_Rx_Task(proto_HSMS_Header_Data_t *pHeader_Data,u8 *pData,u16 Len)
{
u16 SnFm;
u8 DataNum;
/* 获取 Stream 和 Function */
SnFm = pHeader_Data->Header_Byte2.Analysis_Data.Stream << 8 | pHeader_Data->Header_Byte3;
//无需回复
if(1 != pHeader_Data->Header_Byte2.Analysis_Data.Wait)
{
if(PROTO_SECS2_S6F12 == SnFm)
{
/* 处理 S5F2 */
}
else
{
return;
}
}
DataNum = proto_SECS2_Rx_MessageDataAnalysis_List(pData,Len);
if(PROTO_SECS2_S1F1 == SnFm || PROTO_SECS2_S1F13 == SnFm) /*S1F1不进行数据判断*/
{
}
else if(0 == DataNum)/*没有解析数据*/
{
return;
}
/*记录系统计数*/
pSECS2->sys_count = pHeader_Data->Sys_Byte;
/*回复对应指令*/
switch(SnFm)
{
case PROTO_SECS2_S1F3 :
{
if (DataNum == 0) return;
u32 index_array[PROTO_SECS2_MESSAGE_DATA_NUM];
u8 index_count = 0;
u8 i;
/* 提取所有索引(假设为 4Byte_uint 类型) */
for (i = 0; i < DataNum; i++)
{
if (proto_SECS2_Rx_MessageData[i].DataType == PROTO_SECS2_DATA_TYPE_4Byte_uint)
{
u32 *pIndex = (u32 *)proto_SECS2_Rx_MessageData[i].pData;
index_array[index_count++] = *pIndex;
}
}
if (index_count > 0)
{
proto_SECS2_Tx_S1F3(pHeader_Data, index_array, index_count);
}
}break;
case PROTO_SECS2_S2F49 :
{
u8 Cmd,Dev,Mode;
u16 Speed;
u8 *pCmdData;
char pText[10];
/*Device Status*/
pCmdData = proto_SECS2_Rx_MessageData[3].pData;
snprintf(pText,10,"%s",pCmdData);
if(0 == strncmp(pText,BP_ON,strlen(BP_ON)))
{
Dev = PROTO_PM100_DEV_BP;
PM100.Control.Start(Dev);
}else if(0 == strncmp(pText,MP_ON,strlen(MP_ON)))
{
Dev = PROTO_PM100_DEV_MP;
PM100.Control.Start(Dev);
}else if(0 == strncmp(pText,ALL_RESET,strlen(ALL_RESET)))
{
PM100.Control.Reset();
}else if(0 == strncmp(pText,BP_STOP,strlen(BP_STOP)))
{
Dev = PROTO_PM100_DEV_BP;
PM100.Control.Stop(Dev);
}else if(0 == strncmp(pText,MP_STOP,strlen(MP_STOP)))
{
Dev = PROTO_PM100_DEV_MP;
PM100.Control.Stop(Dev);
}else if(0 == strncmp(pText,NORMAL,strlen(NORMAL)))
{
Mode = PROTO_PM100_MODE_NORMAL;
PM100.Control.Set_Mode(Mode);
}else if(0 == strncmp(pText,POWER_SAVE,strlen(POWER_SAVE)))
{
Mode = PROTO_PM100_MODE_POWER_SAVING;
PM100.Control.Set_Mode(Mode);
}else if(0 == strncmp(pText,MP_NORMAL_SPEED,strlen(MP_NORMAL_SPEED)))
{
Dev = PROTO_PM100_DEV_MP;
Mode = PROTO_PM100_MODE_NORMAL;
sscanf(pText,"MN%hu",&Speed);
PM100.Control.Set_Speed(Dev,Mode,Speed);
}else if(0 == strncmp(pText,MP_SAVE_SPEED,strlen(MP_SAVE_SPEED)))
{
Dev = PROTO_PM100_DEV_MP;
Mode = PROTO_PM100_MODE_POWER_SAVING;
sscanf(pText,"MS%hu",&Speed);
PM100.Control.Set_Speed(Dev,Mode,Speed);
}else if(0 == strncmp(pText,BP_NORMAL_SPEED,strlen(BP_NORMAL_SPEED)))
{
Dev = PROTO_PM100_DEV_BP;
Mode = PROTO_PM100_MODE_NORMAL;
sscanf(pText,"BN%hu",&Speed);
PM100.Control.Set_Speed(Dev,Mode,Speed);
}else if(0 == strncmp(pText,BP_SAVE_SPEED,strlen(BP_SAVE_SPEED)))
{
Dev = PROTO_PM100_DEV_BP;
Mode = PROTO_PM100_MODE_POWER_SAVING;
sscanf(pText,"BS%hu",&Speed);
PM100.Control.Set_Speed(Dev,Mode,Speed);
}
// /*CMD*/
// pCmdData = proto_SECS2_Rx_MessageData[0].pData;
// snprintf(pText,10,"%s",pCmdData);
// if(0 == strncmp(pText,PROTO_PM100_CMD_STR_START,strlen(PROTO_PM100_CMD_STR_START)) )
// {
// Cmd = PROTO_PM100_CMD_START;
// }
// else if(0 == strncmp(pText,PROTO_PM100_CMD_STR_STOP,strlen(PROTO_PM100_CMD_STR_STOP)) )
// {
// Cmd = PROTO_PM100_CMD_STOP;
// }
// else if(0 == strncmp(pText,PROTO_PM100_CMD_STR_RESET,strlen(PROTO_PM100_CMD_STR_RESET)) )
// {
// Cmd = PROTO_PM100_CMD_RESET;
// }
// else if(0 == strncmp(pText,PROTO_PM100_CMD_STR_SET_MODE,strlen(PROTO_PM100_CMD_STR_SET_MODE)) )
// {
// Cmd = PROTO_PM100_CMD_SET_MODE;
// }
// else if(0 == strncmp(pText,PROTO_PM100_CMD_STR_SET_SPEED,strlen(PROTO_PM100_CMD_STR_SET_SPEED)) )
// {
// Cmd = PROTO_PM100_CMD_SET_SPEED;
// }
// /*Dev*/
// pCmdData = proto_SECS2_Rx_MessageData[1].pData;
// if(PROTO_PM100_DEV_CHAR_MP == pCmdData[0])
// {
// Dev = PROTO_PM100_DEV_MP;
// }
// else if(PROTO_PM100_DEV_CHAR_BP == pCmdData[0])
// {
// Dev = PROTO_PM100_DEV_BP;
// }
//
// /*MOD*/
// pCmdData = proto_SECS2_Rx_MessageData[2].pData;
// if(PROTO_PM100_MODE_CHAR_NORMAL == pCmdData[0])
// {
// Mode = PROTO_PM100_MODE_NORMAL;
// }
// else if(PROTO_PM100_MODE_CHAR_POWER_SAVING == pCmdData[0])
// {
// Mode = PROTO_PM100_MODE_POWER_SAVING;
// }
//
// /*speed*/
// pCmdData = proto_SECS2_Rx_MessageData[3].pData;
// Speed = *(u16 *)pCmdData;
//
// switch(Cmd)
// {
// case PROTO_PM100_CMD_START:
// {
// PM100.Control.Start(Dev);
// }break;
// case PROTO_PM100_CMD_STOP:
// {
// PM100.Control.Stop(Dev);
// }break;
// case PROTO_PM100_CMD_RESET:
// {
// PM100.Control.Reset();
// }break;
// case PROTO_PM100_CMD_SET_MODE:
// {
// PM100.Control.Set_Mode(Mode);
// }break;
// case PROTO_PM100_CMD_SET_SPEED:
// {
// PM100.Control.Set_Speed(Dev,Mode,Speed);
// }break;
// }
proto_SECS2_Tx_S2F49(pHeader_Data,NULL,0);
}break;
case PROTO_SECS2_S1F1 :
{
proto_SECS2_Tx_S1F1(pHeader_Data,NULL,0);
}break;
case PROTO_SECS2_S6F12 : // 修改S5F2改为S6F12
{
if(PROTO_SECS2_DATA_TYPE_Binary == proto_SECS2_Rx_MessageData[0].DataType)
{
u8 *pMessageData = proto_SECS2_Rx_MessageData[0].pData;
if(0 == pMessageData[0])
{
PM100.Alarm_Control.Reset(); /*消除当前报警*/
}
}
}break;
case PROTO_SECS2_S1F13 :
{
proto_SECS2_Tx_S1F13(pHeader_Data,NULL,0);
}break;
case PROTO_SECS2_S2F31 : /*时间校准*/
{
if(PROTO_SECS2_DATA_TYPE_ASCII == proto_SECS2_Rx_MessageData[0].DataType)
{
bsp_DS1302_Time_t time;
u8 *pMessageData = proto_SECS2_Rx_MessageData[0].pData;
DS1302.Time.Year = (u16)(pMessageData[2] - '0') * 10
+ (u16)(pMessageData[3] - '0');
DS1302.Time.Month = (u16)(pMessageData[4] - '0') * 10
+ (u16)(pMessageData[5] - '0');
DS1302.Time.Day = (u16)(pMessageData[6] - '0') * 10
+ (u16)(pMessageData[7] - '0');
DS1302.Time.Hour = (u16)(pMessageData[8] - '0') * 10
+ (u16)(pMessageData[9] - '0');
DS1302.Time.Minute = (u16)(pMessageData[10] - '0') * 10
+ (u16)(pMessageData[11] - '0');
DS1302.Time.Second = (u16)(pMessageData[12] - '0') * 10
+ (u16)(pMessageData[13] - '0');
if(USR_FALSE == DS1302.Set(&DS1302.Time)) /*时间异常*/
{
/* 时间设置失败 */
proto_SECS2_Tx_S2F31(pHeader_Data,NULL,0,0);
}
else /*时间正常*/
{
proto_SECS2_Tx_S2F31(pHeader_Data,NULL,0,1);
}
}
}break;
default:/*无需处理的命令*/
{
/* 不处理 */
}break;
}
}
/*进行List的数据分包处理*/
static u8 proto_SECS2_Rx_MessageDataAnalysis_List(u8 *pData,u16 Len)
{
u8 RecursionNum = 0; /*递归次数*/
u8 MessageDataNum = 0; /*数据项数量*/
u16 LenIndex = 0;
u8 i, k;
/* 遍历接收的数据 */
while (LenIndex < Len)
{
RecursionNum++;
if (RecursionNum > 100)
{
break;
}
u8 format_byte = pData[LenIndex];
u8 data_type = format_byte >> 2;
u8 length_bytes_count = format_byte & 0x03; // 长度字节数
/* 跳过格式字节 */
LenIndex++;
/* 读取长度 */
u16 data_length = 0;
if (length_bytes_count == 1)
{
/* 1字节长度 */
data_length = pData[LenIndex];
LenIndex++;
}
else if (length_bytes_count == 2)
{
/* 2字节长度大端序 */
data_length = (pData[LenIndex] << 8) | pData[LenIndex + 1];
LenIndex += 2;
}
else
{
/* 不支持其他长度格式 */
return 0;
}
/* 如果是list类型记录并跳过 */
if (data_type == PROTO_SECS2_DATA_TYPE_List)
{
// 列表长度就是元素个数
proto_SECS2_Rx_MessageData[MessageDataNum].DataType = data_type;
proto_SECS2_Rx_MessageData[MessageDataNum].ByteLen = data_length;
proto_SECS2_Rx_MessageData[MessageDataNum].pData = &pData[LenIndex];
MessageDataNum++;
// 对于列表data_length 是元素个数,不是字节数
// 这里需要特殊处理,或者将列表视为特殊项
}
else
{
/* 记录数据类型和地址 */
proto_SECS2_Rx_MessageData[MessageDataNum].DataType = data_type;
proto_SECS2_Rx_MessageData[MessageDataNum].ByteLen = data_length;
proto_SECS2_Rx_MessageData[MessageDataNum].pData = &pData[LenIndex];
LenIndex += data_length;
MessageDataNum++;
}
}
/*将数据重新排序为小端序方便进行数据解析*/
LenIndex = 0;
for(i=0;i<MessageDataNum;i++)
{
switch(proto_SECS2_Rx_MessageData[i].DataType)
{
case PROTO_SECS2_DATA_TYPE_Binary :
case PROTO_SECS2_DATA_TYPE_Bool :
case PROTO_SECS2_DATA_TYPE_JIS_8 :
case PROTO_SECS2_DATA_TYPE_1Byte_uint :
case PROTO_SECS2_DATA_TYPE_1Byte_int :
case PROTO_SECS2_DATA_TYPE_ASCII :
{
memcpy(&proto_SECS2_Rx_MessageDataBuffer[LenIndex],
proto_SECS2_Rx_MessageData[i].pData,
proto_SECS2_Rx_MessageData[i].ByteLen);
proto_SECS2_Rx_MessageData[i].DataNum = proto_SECS2_Rx_MessageData[i].ByteLen;
proto_SECS2_Rx_MessageData[i].pData = &proto_SECS2_Rx_MessageDataBuffer[LenIndex];
LenIndex += proto_SECS2_Rx_MessageData[i].ByteLen;
}break;
case PROTO_SECS2_DATA_TYPE_2Byte_uint :
case PROTO_SECS2_DATA_TYPE_2Byte_int :
case PROTO_SECS2_DATA_TYPE_2Byte_char :
{
u8 *p = proto_SECS2_Rx_MessageData[i].pData;
for(k = 0;k<2;k++)
{
proto_SECS2_Rx_MessageDataBuffer[LenIndex + k] = p[1 - k];
}
proto_SECS2_Rx_MessageData[i].DataNum = proto_SECS2_Rx_MessageData[i].ByteLen / 2;
proto_SECS2_Rx_MessageData[i].pData = &proto_SECS2_Rx_MessageDataBuffer[LenIndex];
LenIndex += proto_SECS2_Rx_MessageData[i].ByteLen;
}break;
case PROTO_SECS2_DATA_TYPE_4Byte_uint :
case PROTO_SECS2_DATA_TYPE_4Byte_float :
case PROTO_SECS2_DATA_TYPE_4Byte_int :
{
u8 *p = proto_SECS2_Rx_MessageData[i].pData;
for(k = 0;k<4;k++)
{
proto_SECS2_Rx_MessageDataBuffer[LenIndex + k] = p[3 - k];
}
proto_SECS2_Rx_MessageData[i].DataNum = proto_SECS2_Rx_MessageData[i].ByteLen / 4;
proto_SECS2_Rx_MessageData[i].pData = &proto_SECS2_Rx_MessageDataBuffer[LenIndex];
LenIndex += proto_SECS2_Rx_MessageData[i].ByteLen;
}break;
case PROTO_SECS2_DATA_TYPE_8Byte_uint :
case PROTO_SECS2_DATA_TYPE_8Byte_float :
case PROTO_SECS2_DATA_TYPE_8Byte_int :
{
u8 *p = proto_SECS2_Rx_MessageData[i].pData;
for(k = 0;k<8;k++)
{
proto_SECS2_Rx_MessageDataBuffer[LenIndex + k] = p[7 - k];
}
proto_SECS2_Rx_MessageData[i].DataNum = proto_SECS2_Rx_MessageData[i].ByteLen / 8;
proto_SECS2_Rx_MessageData[i].pData = &proto_SECS2_Rx_MessageDataBuffer[LenIndex];
LenIndex += proto_SECS2_Rx_MessageData[i].ByteLen;
}break;
default:
/* 其他类型不处理 */
break;
}
}
return MessageDataNum;
}
static u16 proto_HSMS_AddData(u8 *pTxData,proto_SECS2_MessageData_t *pData)
{
u8 *p, i;
u16 Byte_Len = 0;
u16 data_length;
p = (u8 *)pData->pData;
/* 计算数据字节长度 */
switch(pData->DataType)
{
case PROTO_SECS2_DATA_TYPE_Binary:
case PROTO_SECS2_DATA_TYPE_Bool:
case PROTO_SECS2_DATA_TYPE_JIS_8:
case PROTO_SECS2_DATA_TYPE_1Byte_uint:
case PROTO_SECS2_DATA_TYPE_1Byte_int:
data_length = 1 * pData->DataNum;
break;
case PROTO_SECS2_DATA_TYPE_ASCII:
data_length = pData->DataNum;
break;
case PROTO_SECS2_DATA_TYPE_2Byte_uint:
case PROTO_SECS2_DATA_TYPE_2Byte_int:
case PROTO_SECS2_DATA_TYPE_2Byte_char:
data_length = 2 * pData->DataNum;
break;
case PROTO_SECS2_DATA_TYPE_4Byte_uint:
case PROTO_SECS2_DATA_TYPE_4Byte_float:
case PROTO_SECS2_DATA_TYPE_4Byte_int:
data_length = 4 * pData->DataNum;
break;
case PROTO_SECS2_DATA_TYPE_8Byte_uint:
case PROTO_SECS2_DATA_TYPE_8Byte_float:
case PROTO_SECS2_DATA_TYPE_8Byte_int:
data_length = 8 * pData->DataNum;
break;
case PROTO_SECS2_DATA_TYPE_List:
data_length = 1; // 列表元素个数占1字节
break;
default:
data_length = 0;
break;
}
/* 根据数据长度选择长度字节数 */
if (data_length <= 255)
{
/* 长度范围为11个长度字节 */
pTxData[0] = (pData->DataType << 2) | 0x01;
pTxData[1] = (u8)data_length;
Byte_Len = 2 + data_length;
}
else
{
/* 长度范围为22个长度字节 */
pTxData[0] = (pData->DataType << 2) | 0x02;
pTxData[1] = (u8)(data_length >> 8); // 高字节
pTxData[2] = (u8)(data_length); // 低字节
Byte_Len = 3 + data_length;
}
switch(pData->DataType)
{
/* 添加List */
case PROTO_SECS2_DATA_TYPE_List:
{
u8 length_byte_count = (pTxData[0] & 0x03); // 获取长度字节数
if (length_byte_count == 1)
{
pTxData[1] = *(u8 *)pData->pData; /* 列表元素个数 */
return 2; // 格式字节 + 长度字节
}
else
{
pTxData[1] = 0; // 高位字节为0元素个数不会超过255
pTxData[2] = *(u8 *)pData->pData; /* 列表元素个数 */
return 3; // 格式字节 + 2个长度字节
}
}break;
/* 1字节类型 */
case PROTO_SECS2_DATA_TYPE_Binary:
case PROTO_SECS2_DATA_TYPE_Bool:
case PROTO_SECS2_DATA_TYPE_JIS_8:
case PROTO_SECS2_DATA_TYPE_1Byte_uint:
case PROTO_SECS2_DATA_TYPE_1Byte_int:
{
u8 offset = (pTxData[0] & 0x03) + 1; // 计算数据偏移
if (pData->DataNum == 1)
{
pTxData[offset] = p[0];
}
else
{
memcpy(&pTxData[offset], p, pData->DataNum);
}
}break;
case PROTO_SECS2_DATA_TYPE_ASCII:
{
u8 offset = (pTxData[0] & 0x03) + 1; // 计算数据偏移
memcpy(&pTxData[offset], p, pData->DataNum);
}break;
/* 2字节类型 - 需要字节序转换 */
case PROTO_SECS2_DATA_TYPE_2Byte_uint:
case PROTO_SECS2_DATA_TYPE_2Byte_int:
case PROTO_SECS2_DATA_TYPE_2Byte_char:
{
u8 offset = (pTxData[0] & 0x03) + 1; // 计算数据偏移
if (pData->DataNum == 1)
{
// 单个元素
pTxData[offset] = p[1]; // 高位字节
pTxData[offset + 1] = p[0]; // 低位字节
}
else
{
// 多个元素 - 需要批量转换
for (i = 0; i < pData->DataNum; i++)
{
pTxData[offset + i*2] = p[i*2 + 1];
pTxData[offset + i*2 + 1] = p[i*2];
}
}
}break;
/* 4字节类型 - 需要字节序转换 */
case PROTO_SECS2_DATA_TYPE_4Byte_uint:
case PROTO_SECS2_DATA_TYPE_4Byte_float:
case PROTO_SECS2_DATA_TYPE_4Byte_int:
{
u8 offset = (pTxData[0] & 0x03) + 1; // 计算数据偏移
if (pData->DataNum == 1)
{
// 单个元素
pTxData[offset] = p[3];
pTxData[offset + 1] = p[2];
pTxData[offset + 2] = p[1];
pTxData[offset + 3] = p[0];
}
else
{
// 多个元素 - 需要批量转换
for (i = 0; i < pData->DataNum; i++)
{
pTxData[offset + i*4] = p[i*4 + 3];
pTxData[offset + i*4 + 1] = p[i*4 + 2];
pTxData[offset + i*4 + 2] = p[i*4 + 1];
pTxData[offset + i*4 + 3] = p[i*4];
}
}
}break;
/* 8字节类型 - 需要字节序转换 */
case PROTO_SECS2_DATA_TYPE_8Byte_uint:
case PROTO_SECS2_DATA_TYPE_8Byte_float:
case PROTO_SECS2_DATA_TYPE_8Byte_int:
{
u8 offset = (pTxData[0] & 0x03) + 1; // 计算数据偏移
if (pData->DataNum == 1)
{
// 单个元素
for (i = 0; i < 8; i++)
{
pTxData[offset + i] = p[7 - i];
}
}
else
{
// 多个元素 - 需要批量转换
for (i = 0; i < pData->DataNum; i++)
{
for (u8 j = 0; j < 8; j++)
{
pTxData[offset + i*8 + j] = p[i*8 + 7 - j];
}
}
}
}break;
}
return Byte_Len;
}