Files
secs2-bootloader/usr/protocol/proto_HSMS.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;
}
}