96 lines
2.1 KiB
C
96 lines
2.1 KiB
C
|
|
#include "update_protocol.h"
|
||
|
|
#include "string.h"
|
||
|
|
#include "public.h"
|
||
|
|
|
||
|
|
static struct
|
||
|
|
{
|
||
|
|
update_send_t pfnSend;
|
||
|
|
|
||
|
|
}g_update_protoc;
|
||
|
|
|
||
|
|
|
||
|
|
void update_send_cmd(uint8_t Cmd, uint16_t Indx, int PageNum)
|
||
|
|
{
|
||
|
|
uint8_t sData[24]={0};
|
||
|
|
uint8_t sLen =0;
|
||
|
|
uint16_t crc16;
|
||
|
|
|
||
|
|
update_protocol_hd_t *Frame = (update_protocol_hd_t*)sData;
|
||
|
|
|
||
|
|
Frame->Header = 0x7a;
|
||
|
|
Frame->SlvAddr = 0x01;
|
||
|
|
Frame->Cmd = Cmd;
|
||
|
|
|
||
|
|
if (Cmd == 0x01)
|
||
|
|
{
|
||
|
|
Frame->PayloadLen = 1;
|
||
|
|
sData[sizeof(update_protocol_hd_t)] = Indx;
|
||
|
|
}
|
||
|
|
else if (Cmd == 0x02)
|
||
|
|
{
|
||
|
|
Frame->PayloadLen = 4;
|
||
|
|
update_protocol_get_t *GDData = (update_protocol_get_t*)&sData[sizeof(update_protocol_hd_t)];
|
||
|
|
GDData->PackageIndex = Indx;
|
||
|
|
GDData->PackageNum = PageNum;
|
||
|
|
}
|
||
|
|
|
||
|
|
sLen = sizeof(update_protocol_hd_t) + Frame->PayloadLen;
|
||
|
|
crc16 = CRC_Modbus(CRC16_BASE, sData, sLen);
|
||
|
|
sData[sLen++] = crc16;
|
||
|
|
sData[sLen++] = (crc16 >> 8) & 0x00ff;
|
||
|
|
|
||
|
|
g_update_protoc.pfnSend(sData, sLen);
|
||
|
|
}
|
||
|
|
|
||
|
|
void update_init(update_send_t pCbs)
|
||
|
|
{
|
||
|
|
g_update_protoc.pfnSend =pCbs;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
int update_unpack(uint8_t* rxData, int rLen,uint8_t *cmd, uint8_t* dev_addr, void *pload, int *pLen){
|
||
|
|
|
||
|
|
uint16_t crc16;
|
||
|
|
|
||
|
|
uint16_t check;
|
||
|
|
|
||
|
|
check = CRC_Modbus(CRC16_BASE, rxData, rLen - 2);
|
||
|
|
|
||
|
|
crc16 = (rxData[rLen - 1] << 8) | rxData[rLen - 2];
|
||
|
|
|
||
|
|
if (check != crc16 || rxData[0] !=0x7a || pload ==0)
|
||
|
|
{
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
|
||
|
|
update_protocol_hd_t *Frame = (update_protocol_hd_t*)rxData;
|
||
|
|
|
||
|
|
*dev_addr = Frame->SlvAddr;
|
||
|
|
|
||
|
|
*cmd = Frame->Cmd;
|
||
|
|
|
||
|
|
if (Frame->Cmd == 0x81){
|
||
|
|
|
||
|
|
//update_protocol_req_t *UpData = (update_protocol_req_t*)&rxData[sizeof(update_protocol_hd_t)];
|
||
|
|
|
||
|
|
pload = 0;
|
||
|
|
|
||
|
|
*pLen = 0;
|
||
|
|
|
||
|
|
|
||
|
|
}else if (Frame->Cmd == 0x82){
|
||
|
|
|
||
|
|
update_protocol_rsp_t *DownData = (update_protocol_rsp_t *)&rxData[sizeof(update_protocol_hd_t)];
|
||
|
|
|
||
|
|
memcpy(pload , &rxData[sizeof(update_protocol_hd_t) + sizeof(update_protocol_rsp_t)],DownData->DataLen);
|
||
|
|
|
||
|
|
*pLen = DownData->DataLen;
|
||
|
|
|
||
|
|
}else{
|
||
|
|
|
||
|
|
return -2;
|
||
|
|
}
|
||
|
|
|
||
|
|
return 0;
|
||
|
|
}
|