optical/NxFuncs/transdata/transdata.c

233 lines
6.2 KiB
C
Raw Normal View History

2025-09-04 01:45:08 +00:00
#define _IN_TRANSDATA_C
#include "transdata.h"
#if (TRANS_APP_FILE == 1 || TRANS_DATA_FILE == 1)
#include "comm.h"
#include "canctrl.h"
#include "crc16.h"
void InitFileTransCtrl(FileTransCtrl * pfileTransCtrl)
{
//printf("InitFileTransCtrl\r\n");
memset(pfileTransCtrl, 0, sizeof(FileTransCtrl));
}
int WriteRsvBitmap(u32 idx, u8 sta, FileTransCtrl * pfileTransCtrl)
{
u8 mod;
u32 baddr, yus;
if (idx >= LEN_RSV_BMP*8)
{
printf("error in WriteRsvBitmap idx=%d, packetNum=%d\r\n", idx, pfileTransCtrl->packetNum);
return -1;
}
baddr = (idx)/8;
if (baddr >= LEN_RSV_BMP)
{
printf("error in WriteRsvBitmap baddr=%d, lenBmp=%d\r\n",baddr, pfileTransCtrl->lenBmp);
return -1;
}
yus = idx%8;
mod = 0x01;
while (yus != 0)
{
yus--;
mod <<= 1;
}
if (sta == 0)
{
pfileTransCtrl->rsvBitmap[baddr] &= ~mod;
}
else
{
pfileTransCtrl->rsvBitmap[baddr] |= mod;
}
return 0;
}
int IsResvFinish(FileTransCtrl * pfileTransCtrl)
{
u8 mod;
u32 zss, yus;
u32 i;
zss = (pfileTransCtrl->packetNum)/8;
yus = pfileTransCtrl->packetNum%8;
for (i = 0; i < zss; i++)
{
if (pfileTransCtrl->rsvBitmap[i] != 0xff)
{
return FALSE;
}
}
mod = 0x01;
for (i = 0; i < yus; i++)
{
if ((pfileTransCtrl->rsvBitmap[zss] & mod) == 0)
{
return FALSE;
}
mod <<= 1;
}
return TRUE;
}
/*
* <EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*return: 0:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
*/
int TransDataProc(BoardFileCanCtrl filecan, FileTransCtrl * pfileTransCtrl, u8 nodetype)
{
if (filecan.head.sync[0] == CDP_SYNC[0] &&
filecan.head.sync[1] == CDP_SYNC[1] &&
filecan.head.sync[2] == CDP_SYNC[2] &&
1) // <20><><EFBFBD>ݰ<EFBFBD>ͷ
{
//printf("get a packet head,id=%d\r\n", filecan.head.pktId);
if (filecan.head.pktId == FILE_HEAD_ID) // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
{
printf("start receive file\r\n");
InitFileTransCtrl(pfileTransCtrl);
pfileTransCtrl->pBoardFile = &g_boardFile;
pfileTransCtrl->transActive = TRANS_ACTIVE;
pfileTransCtrl->transflag = TRANS_READY;
pfileTransCtrl->rsvPktCount = 0;
}
// <20><>¼<EFBFBD><C2BC>ǰ<EFBFBD><C7B0><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD>ID,֡<><D6A1><EFBFBD><EFBFBD>,crcУ<63><D0A3>
pfileTransCtrl->pBoardFile->filepkt.pktHead.head.pktId = filecan.head.pktId;
pfileTransCtrl->pBoardFile->filepkt.pktHead.head.fnum = filecan.head.fnum;
pfileTransCtrl->pBoardFile->filepkt.pktHead.head.crc = filecan.head.crc;
pfileTransCtrl->rsvFrameCount = 0;
}
else // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//printf("get a packet data\r\n");
if (pfileTransCtrl->transActive != TRANS_ACTIVE)
{
//printf("TransDataProc file not active\r\n");
return -1;
}
if (pfileTransCtrl->transflag != TRANS_READY &&
pfileTransCtrl->transflag != TRANS_DOING &&
1 )
{
//printf("TransDataProc file not ready\r\n");
return -2;
}
if (pfileTransCtrl->transflag == TRANS_READY)
{
pfileTransCtrl->transflag = TRANS_DOING;
}
// <20><><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD>
memcpy(&pfileTransCtrl->pBoardFile->filepkt.pktData[pfileTransCtrl->rsvFrameCount].data, &filecan.data, CAN_DATA_LEN);
pfileTransCtrl->rsvFrameCount++;
// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (pfileTransCtrl->rsvFrameCount == pfileTransCtrl->pBoardFile->filepkt.pktHead.head.fnum)
{// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,У<><D0A3>
//printf("a packet receive over\r\n");
u16 crc = CalcCrc16((u8*)&pfileTransCtrl->pBoardFile->filepkt.pktData, pfileTransCtrl->pBoardFile->filepkt.pktHead.head.fnum*CAN_DATA_LEN);
if (crc == pfileTransCtrl->pBoardFile->filepkt.pktHead.head.crc)
{// У<><D0A3><EFBFBD><EFBFBD>ȷ
if (pfileTransCtrl->pBoardFile->filepkt.pktHead.head.pktId == FILE_HEAD_ID)
{// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ͷ
printf("receive start over\r\n");
memcpy(&pfileTransCtrl->pBoardFile->fileHead, &pfileTransCtrl->pBoardFile->filepkt.pktData, 6*CAN_DATA_LEN);// 6Ϊ<36>ļ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
if (pfileTransCtrl->pBoardFile->fileHead.nodeType != nodetype)
{
printf("send to nodetype=0x%x\r\n", pfileTransCtrl->pBoardFile->fileHead.nodeType);
pfileTransCtrl->transActive = TRANS_NONE;
pfileTransCtrl->transflag = TRANS_NOT_BEG;
return -3;
}
pfileTransCtrl->packetNum = ((pfileTransCtrl->pBoardFile->fileHead.dataSize+1024-1)/1024);
pfileTransCtrl->lenBmp = (pfileTransCtrl->packetNum+CAN_DATA_LEN-1)/CAN_DATA_LEN;
printf("now dataChecksum=%d, receive:dataSize=%d, dataChecksum=0x%x\r\n",
pfileTransCtrl->dataChecksum,
pfileTransCtrl->pBoardFile->fileHead.dataSize,
pfileTransCtrl->pBoardFile->fileHead.dataChecksum);
if (pfileTransCtrl->pBoardFile->fileHead.fileType == FILE_TYPE_PGM)
{
InitSaveApp(); // <20><>Ҫһ<D2AA><D2BB>ʱ<EFBFBD><CAB1>
}
}
else
{
pfileTransCtrl->dataChecksum += CalcCheckSum((u8*)&pfileTransCtrl->pBoardFile->filepkt.pktData, 128*CAN_DATA_LEN);// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>128<32><38>CAN<41><4E><EFBFBD><EFBFBD>֡
if (pfileTransCtrl->pBoardFile->fileHead.fileType == FILE_TYPE_PGM)
{// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>,<2C><><EFBFBD><EFBFBD>norflash,<2C><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λͼ
int rst, idx;
u32 ofst;
idx = (pfileTransCtrl->pBoardFile->filepkt.pktHead.head.pktId == 0 ? 0:1);
if (pfileTransCtrl->pBoardFile->filepkt.pktHead.head.pktId == 0)
{
ofst = 0;
}
else
{
ofst = (pfileTransCtrl->pBoardFile->filepkt.pktHead.head.pktId-1)*pfileTransCtrl->pBoardFile->filepkt.pktHead.head.fnum*CAN_DATA_LEN;
}
rst = SaveAppData(idx,
(u8*)&pfileTransCtrl->pBoardFile->filepkt.pktData,
pfileTransCtrl->pBoardFile->filepkt.pktHead.head.fnum*CAN_DATA_LEN,
ofst);
if (rst >= 0)
{
pfileTransCtrl->rsvPktCount++;
WriteRsvBitmap(pfileTransCtrl->pBoardFile->filepkt.pktHead.head.pktId, 1, pfileTransCtrl);
}
else
{
printf("TransDataProc WriteFileApp error rst= %d \r\n", rst);
}
}
}
// <20><EFBFBD><E9BFB4><EFBFBD><EFBFBD>λͼ<CEBB><CDBC><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((IsResvFinish(pfileTransCtrl) == TRUE) && (pfileTransCtrl->rsvPktCount == pfileTransCtrl->packetNum))
{
//if (pfileTransCtrl->dataChecksum == pfileTransCtrl->pBoardFile->fileHead.dataChecksum)
if (1)
{
pfileTransCtrl->transflag = TRANS_DONE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
printf("TransDataProc Receive file finish\r\n");
}
else
{
printf("TransDataProc dataChecksum error, calc=0x%x, send=0x%x\r\n",
pfileTransCtrl->dataChecksum, pfileTransCtrl->pBoardFile->fileHead.dataChecksum);
}
}
}
else
{
printf("TransDataProc check crc error\r\n");
}
}
}
return 0;
}
int GetLenBmp(FileTransCtrl * pfileTransCtrl)
{
return pfileTransCtrl->lenBmp;
}
#endif