170 lines
4.7 KiB
C
170 lines
4.7 KiB
C
#include "proto_HSMS.h"
|
|
|
|
#include "string.h"
|
|
#include "stdio.h"
|
|
|
|
#include "bsp_print.h"
|
|
#include "bsp_W5500.h"
|
|
#include "proto_SECS2.h"
|
|
|
|
|
|
static void proto_HSMS_Init(void);
|
|
static void proto_W5500_DataAnalysis(bsp_W5500_Class_t *pW5500_Class,u8 *pData,u16 Len);
|
|
static void proto_HSMS_Rx_DataAnalysis(u8 *pData,u16 Len);
|
|
static void proto_HSMS_Tx_Rsq(proto_HSMS_Header_Data_t *pHeader_Data,u8 *Tx_Data,u16 Tx_Data_Len,void *OtherData);
|
|
|
|
u8 proto_HSMS_Tx_Buffer[1024];
|
|
|
|
proto_HSMS_t HSMS =
|
|
{
|
|
.Init = proto_HSMS_Init,
|
|
.Tx_RsqData = proto_HSMS_Tx_Rsq,
|
|
};
|
|
|
|
proto_HSMS_t *pHSMS = &HSMS;
|
|
|
|
static void proto_HSMS_Init(void)
|
|
{
|
|
W5500.W5500_Class[0].Rx_DataAnalysis = proto_W5500_DataAnalysis;
|
|
}
|
|
|
|
static void proto_HSMS_Send(u8 *pData,u16 Len)
|
|
{
|
|
Debug_UartSend(pData, Len);
|
|
W5500.Socket_Send(&W5500.W5500_Class[0],pData,Len);
|
|
}
|
|
|
|
static void proto_W5500_DataAnalysis(bsp_W5500_Class_t *pW5500_Class,u8 *pData,u16 Len)
|
|
{
|
|
proto_HSMS_Rx_DataAnalysis(pData,Len);
|
|
}
|
|
|
|
/*响应请求*/
|
|
static void proto_HSMS_Tx_Rsq(proto_HSMS_Header_Data_t *pHeader_Data,u8 *Tx_Data,u16 Tx_Data_Len,void *OtherData)
|
|
{
|
|
u8 *Tx = proto_HSMS_Tx_Buffer;
|
|
u16 Len;
|
|
|
|
pHeader_Data->Data_Len = 10 + Tx_Data_Len;
|
|
u32TOu8(pHeader_Data->Data_Len,Tx,PROTO_HSMS_ENDIAN);
|
|
u16TOu8(pHeader_Data->Device_Id,&Tx[4],PROTO_HSMS_ENDIAN);
|
|
|
|
Tx[6] = pHeader_Data->Header_Byte2.ALL_Data;
|
|
Tx[7] = pHeader_Data->Header_Byte3;
|
|
Tx[8] = pHeader_Data->PType;
|
|
Tx[9] = pHeader_Data->SType;
|
|
u32TOu8(pHeader_Data->Sys_Byte,&Tx[10],PROTO_HSMS_ENDIAN);
|
|
Len = 14;
|
|
|
|
if(NULL != Tx_Data && 0 != Tx_Data_Len)
|
|
{
|
|
memcpy(&Tx[Len],Tx_Data,Tx_Data_Len);
|
|
Len += Tx_Data_Len;
|
|
}
|
|
|
|
|
|
proto_HSMS_Send(Tx,Len);
|
|
Debug_UartSend(Tx,Len);
|
|
}
|
|
|
|
void proto_HSMS_Header_DataAnalysis(proto_HSMS_Header_Data_t *pHeader_Data,u8 *pData)
|
|
{
|
|
/*拷贝数据进行解析*/
|
|
pHeader_Data->Data_Len = u8TOu32(&pData[0],PROTO_HSMS_ENDIAN);
|
|
pHeader_Data->Device_Id = u8TOu16(&pData[4],PROTO_HSMS_ENDIAN);
|
|
pHeader_Data->Header_Byte2.ALL_Data = pData[6];
|
|
pHeader_Data->Header_Byte3 = pData[7];
|
|
pHeader_Data->PType = pData[8];
|
|
pHeader_Data->SType = pData[9];
|
|
pHeader_Data->Sys_Byte = u8TOu32(&pData[10],PROTO_HSMS_ENDIAN);
|
|
}
|
|
|
|
void proto_HSMS_Rx_DataAnalysis(u8 *pData,u16 Len)
|
|
{
|
|
if(Len < 14)/*不满足最低长度*/
|
|
return ;
|
|
|
|
proto_HSMS_Header_DataAnalysis(&pHSMS->Rx_Header_Data,pData);
|
|
|
|
/*长度判断*/
|
|
if((pHSMS->Rx_Header_Data.Data_Len + 4) != Len)
|
|
{
|
|
return ;
|
|
}
|
|
|
|
/*不是SECS2编码格式*/
|
|
if(proto_HSMS_PTYPE_SECS2 != pHSMS->Rx_Header_Data.PType)
|
|
{
|
|
return ;
|
|
}
|
|
|
|
switch(pHSMS->Rx_Header_Data.SType)
|
|
{
|
|
/*数据消息*/
|
|
case PROTO_HSMS_STYPE_Data_Message :
|
|
{
|
|
/*匹配设备ID*/
|
|
|
|
if(pHSMS->Flash_ConfigData.Device_Id != pHSMS->Rx_Header_Data.Device_Id)
|
|
{
|
|
return;
|
|
}
|
|
memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t));
|
|
/*去除HSMS头部数据*/
|
|
SECS2.Rx_DataAnalysis(&pHSMS->Tx_Header_Data,&pData[14],Len-14);
|
|
|
|
}break;
|
|
/*选择请求*/
|
|
case PROTO_HSMS_STYPE_Select_Req :
|
|
{
|
|
memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t));
|
|
pHSMS->Tx_Header_Data.SType = PROTO_HSMS_STYPE_Select_Rsq;
|
|
proto_HSMS_Tx_Rsq(&pHSMS->Tx_Header_Data,NULL,0,NULL);
|
|
}break;
|
|
/*选择响应*/
|
|
case PROTO_HSMS_STYPE_Select_Rsq :
|
|
{
|
|
|
|
}break;
|
|
/*取消选择请求*/
|
|
case PROTO_HSMS_STYPE_Deselect_Req :
|
|
{
|
|
memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t));
|
|
pHSMS->Tx_Header_Data.SType = PROTO_HSMS_STYPE_Deselect_Rsq;
|
|
proto_HSMS_Tx_Rsq(&pHSMS->Tx_Header_Data,NULL,0,NULL);
|
|
}break;
|
|
/*取消选择响应*/
|
|
case PROTO_HSMS_STYPE_Deselect_Rsq :
|
|
{
|
|
|
|
}break;
|
|
/*连接测试请求*/
|
|
case PROTO_HSMS_STYPE_Linktest_Req :
|
|
{
|
|
memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t));
|
|
pHSMS->Tx_Header_Data.SType = PROTO_HSMS_STYPE_Linktest_Rsp;
|
|
proto_HSMS_Tx_Rsq(&pHSMS->Tx_Header_Data,NULL,0,NULL);
|
|
}break;
|
|
/*连接测试响应*/
|
|
case PROTO_HSMS_STYPE_Linktest_Rsp :
|
|
{
|
|
|
|
}break;
|
|
/*拒绝请求*/
|
|
case PROTO_HSMS_STYPE_Reject_Req :
|
|
{
|
|
|
|
}break;
|
|
/*断开请求*/
|
|
case PROTO_HSMS_STYPE_Separate_Req :
|
|
{
|
|
|
|
}break;
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|