323 lines
9.3 KiB
C
323 lines
9.3 KiB
C
|
|
#include "exbfiletrans.h"
|
|
|
|
#include "delay.h"
|
|
#include "crc16.h"
|
|
#include "extendboards.h"
|
|
|
|
#if (CUR_CORE_BOARD == CORE_BOARD_APP)
|
|
#include "workctrl.h"
|
|
#endif
|
|
|
|
// 数据包转换,从操作箱数据包转换成发给外围板的CAN数据包
|
|
void FileHeadFromOperToCan(u8 fileType, BoardFileCtrl * pBoardFile)
|
|
{
|
|
// 机头板协议,界面发送的nodeid仅为0广播或对应的机头号,不需要知道具体的节点ID
|
|
if (pBoardFile->fileHead.protocol == BN_PROTOCOL_HEAD)
|
|
{
|
|
#if (MAX_SUPPORT_HEAD > 0)
|
|
HeadControl * head = GetHeadFromList(1); // 默认广播发送
|
|
HeadControl * temp = NULL; // 临时存储
|
|
int hdnm = pBoardFile->fileHead.nodeid; // 机头号,0为广播
|
|
if (hdnm != 0)
|
|
{// 非广播,找到对应节点
|
|
for(int i = 1; i < MAX_SUPPORT_HEAD+1; i++)
|
|
{
|
|
temp = GetHeadFromList(i+1);
|
|
if (temp->nodeTye == pBoardFile->fileHead.nodeType)
|
|
{
|
|
if (hdnm <= 1)
|
|
{
|
|
head = temp;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
hdnm--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
int timeout = 10;
|
|
while(timeout > 0)
|
|
{
|
|
if (head->transFlag == 0)
|
|
{
|
|
head->transFlag = 1;
|
|
memset(&pBoardFile->filepkt, 0, sizeof(BoardFilePacketCtrl));
|
|
|
|
// 数据包头
|
|
memcpy(pBoardFile->filepkt.pktHead.head.sync, CDP_SYNC, CDPSYNC_LEN);
|
|
pBoardFile->filepkt.pktHead.head.pktId = FILE_HEAD_ID;
|
|
pBoardFile->filepkt.pktHead.head.fnum = 6; // 文件头数据内容共6个CAN数据帧
|
|
|
|
// 数据内容
|
|
// 文件名称
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
for (int j = 0; j < 8; j++)
|
|
{
|
|
pBoardFile->filepkt.pktData[i].data[j] = pBoardFile->fileHead.fileName[i*8+j];
|
|
}
|
|
}
|
|
pBoardFile->filepkt.pktData[4].check.datasize = pBoardFile->fileHead.dataSize;
|
|
pBoardFile->filepkt.pktData[4].check.dataChecksum = pBoardFile->fileHead.dataChecksum;
|
|
pBoardFile->filepkt.pktData[5].info.fileType = fileType;
|
|
pBoardFile->filepkt.pktData[5].info.nodeType = pBoardFile->fileHead.nodeType;
|
|
|
|
pBoardFile->filepkt.pktHead.head.crc = CalcCrc16((u8*)&pBoardFile->filepkt.pktData, pBoardFile->filepkt.pktHead.head.fnum*CAN_DATA_LEN);
|
|
|
|
break;
|
|
}
|
|
DelayRef(100);
|
|
timeout--;
|
|
if (timeout <= 0)
|
|
{// CAN通讯超时
|
|
printf("FileHeadFromOperToCan err\r\n");
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
else if (pBoardFile->fileHead.protocol == BN_PROTOCOL_COLOR)
|
|
{// 换色板协议 因此协议不参与遍历 且节点ID为固定值 故nodeid为第几块 0仍然为广播
|
|
#if (MAX_SUPPORT_COLOR > 0)
|
|
ColorControl * color = GetColorFromList(pBoardFile->fileHead.nodeid+1);
|
|
int timeout = 10;
|
|
while(timeout > 0)
|
|
{
|
|
if (color->transFlag == 0)
|
|
{
|
|
color->transFlag = 1;
|
|
memset(&pBoardFile->filepkt, 0, sizeof(BoardFilePacketCtrl));
|
|
|
|
// 数据包头
|
|
memcpy(pBoardFile->filepkt.pktHead.head.sync, CDP_SYNC, CDPSYNC_LEN);
|
|
pBoardFile->filepkt.pktHead.head.pktId = FILE_HEAD_ID;
|
|
pBoardFile->filepkt.pktHead.head.fnum = 6; // 文件头数据内容共6个CAN数据帧
|
|
|
|
// 数据内容
|
|
// 文件名称
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
for (int j = 0; j < 8; j++)
|
|
{
|
|
pBoardFile->filepkt.pktData[i].data[j] = pBoardFile->fileHead.fileName[i*8+j];
|
|
}
|
|
}
|
|
pBoardFile->filepkt.pktData[4].check.datasize = pBoardFile->fileHead.dataSize;
|
|
pBoardFile->filepkt.pktData[4].check.dataChecksum = pBoardFile->fileHead.dataChecksum;
|
|
pBoardFile->filepkt.pktData[5].data[0] = fileType;
|
|
|
|
pBoardFile->filepkt.pktHead.head.crc = CalcCrc16((u8*)&pBoardFile->filepkt.pktData, pBoardFile->filepkt.pktHead.head.fnum*CAN_DATA_LEN);
|
|
|
|
break;
|
|
}
|
|
DelayRef(100);
|
|
timeout--;
|
|
if (timeout <= 0)
|
|
{// CAN通讯超时
|
|
printf("FileHeadFromOperToCan err\r\n");
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
else if (pBoardFile->fileHead.protocol == BN_PROTOCOL_EXTIO)
|
|
{// IO扩展板协议 因此协议不参与遍历 且节点ID为固定值 故nodeid为第几块 0仍然为广播
|
|
#if (MAX_SUPPORT_EXTIO > 0)
|
|
ExtIOControl * extio = GetExtIOFromList(pBoardFile->fileHead.nodeid+1);
|
|
int timeout = 10;
|
|
while(timeout > 0)
|
|
{
|
|
if (extio->transFlag == 0)
|
|
{
|
|
extio->transFlag = 1;
|
|
memset(&pBoardFile->filepkt, 0, sizeof(BoardFilePacketCtrl));
|
|
|
|
// 数据包头
|
|
memcpy(pBoardFile->filepkt.pktHead.head.sync, CDP_SYNC, CDPSYNC_LEN);
|
|
pBoardFile->filepkt.pktHead.head.pktId = FILE_HEAD_ID;
|
|
pBoardFile->filepkt.pktHead.head.fnum = 6; // 文件头数据内容共6个CAN数据帧
|
|
|
|
// 数据内容
|
|
// 文件名称
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
for (int j = 0; j < 8; j++)
|
|
{
|
|
pBoardFile->filepkt.pktData[i].data[j] = pBoardFile->fileHead.fileName[i*8+j];
|
|
}
|
|
}
|
|
pBoardFile->filepkt.pktData[4].check.datasize = pBoardFile->fileHead.dataSize;
|
|
pBoardFile->filepkt.pktData[4].check.dataChecksum = pBoardFile->fileHead.dataChecksum;
|
|
pBoardFile->filepkt.pktData[5].data[0] = fileType;
|
|
|
|
pBoardFile->filepkt.pktHead.head.crc = CalcCrc16((u8*)&pBoardFile->filepkt.pktData, pBoardFile->filepkt.pktHead.head.fnum*CAN_DATA_LEN);
|
|
|
|
break;
|
|
}
|
|
DelayRef(100);
|
|
timeout--;
|
|
if (timeout <= 0)
|
|
{// CAN通讯超时
|
|
printf("FileHeadFromOperToCan err\r\n");
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
// 数据包转换,从操作箱数据包转换成发给外围板的CAN数据包
|
|
void FileDataFromOperToCan(OperPacket * pPkt, BoardFileCtrl * pBoardFile)
|
|
{
|
|
if (pBoardFile->fileHead.protocol == BN_PROTOCOL_HEAD)
|
|
{// 机头板协议,界面发送的nodeid仅为0广播或对应的机头号,不需要知道具体的节点ID
|
|
#if (MAX_SUPPORT_HEAD > 0)
|
|
HeadControl * head = GetHeadFromList(1); // 默认广播发送
|
|
HeadControl * temp = NULL; // 临时存储
|
|
int hdnm = pBoardFile->fileHead.nodeid; // 机头号,0为广播
|
|
if (hdnm != 0)
|
|
{
|
|
for(int i = 1; i < MAX_SUPPORT_HEAD+1; i++)
|
|
{
|
|
temp = GetHeadFromList(i+1);
|
|
if (temp->nodeTye == pBoardFile->fileHead.nodeType)
|
|
{
|
|
if (hdnm <= 1)
|
|
{
|
|
head = temp;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
hdnm--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
int timeout = 10;
|
|
while(timeout > 0)
|
|
{
|
|
if (head->transFlag == 0)
|
|
{
|
|
head->transFlag = 1;
|
|
memset(&pBoardFile->filepkt, 0, sizeof(BoardFilePacketCtrl));
|
|
|
|
// 数据包头
|
|
memcpy(pBoardFile->filepkt.pktHead.head.sync, CDP_SYNC, CDPSYNC_LEN);
|
|
pBoardFile->filepkt.pktHead.head.pktId = pPkt->transFileData.pktIdx;
|
|
pBoardFile->filepkt.pktHead.head.fnum = (pPkt->transFileData.exLen + CAN_DATA_LEN - 1) / CAN_DATA_LEN;
|
|
|
|
// 数据内容
|
|
// 文件名称
|
|
for (int i = 0; i < pBoardFile->filepkt.pktHead.head.fnum; i++)
|
|
{
|
|
memcpy(&pBoardFile->filepkt.pktData[i].data[0], &pPkt->transFileData.exData[i*CAN_DATA_LEN], CAN_DATA_LEN);
|
|
}
|
|
|
|
pBoardFile->filepkt.pktHead.head.crc = CalcCrc16((u8*)pBoardFile->filepkt.pktData, pBoardFile->filepkt.pktHead.head.fnum*CAN_DATA_LEN);
|
|
|
|
break;
|
|
}
|
|
DelayRef(100);
|
|
timeout--;
|
|
if (timeout <= 0)
|
|
{// CAN通讯超时
|
|
printf("FileDataFromOperToCan err\r\n");
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
else if (pBoardFile->fileHead.protocol == BN_PROTOCOL_COLOR)
|
|
{// 换色板协议 因此协议不参与遍历 且节点ID为固定值 故nodeid为第几块 0仍然为广播
|
|
#if (MAX_SUPPORT_COLOR > 0)
|
|
ColorControl * color = GetColorFromList(pBoardFile->fileHead.nodeid+1);
|
|
int timeout = 10;
|
|
while(timeout > 0)
|
|
{
|
|
if (color->transFlag == 0)
|
|
{
|
|
color->transFlag = 1;
|
|
memset(&pBoardFile->filepkt, 0, sizeof(BoardFilePacketCtrl));
|
|
|
|
// 数据包头
|
|
memcpy(pBoardFile->filepkt.pktHead.head.sync, CDP_SYNC, CDPSYNC_LEN);
|
|
pBoardFile->filepkt.pktHead.head.pktId = pPkt->transFileData.pktIdx;
|
|
pBoardFile->filepkt.pktHead.head.fnum = (pPkt->transFileData.exLen + CAN_DATA_LEN - 1) / CAN_DATA_LEN;
|
|
|
|
// 数据内容
|
|
// 文件名称
|
|
for (int i = 0; i < pBoardFile->filepkt.pktHead.head.fnum; i++)
|
|
{
|
|
memcpy(&pBoardFile->filepkt.pktData[i].data[0], &pPkt->transFileData.exData[i*CAN_DATA_LEN], CAN_DATA_LEN);
|
|
}
|
|
|
|
pBoardFile->filepkt.pktHead.head.crc = CalcCrc16((u8*)pBoardFile->filepkt.pktData, pBoardFile->filepkt.pktHead.head.fnum*8);
|
|
|
|
break;
|
|
}
|
|
DelayRef(100);
|
|
timeout--;
|
|
if (timeout <= 0)
|
|
{// CAN通讯超时
|
|
printf("FileDataFromOperToCan err\r\n");
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
else if (pBoardFile->fileHead.protocol == BN_PROTOCOL_EXTIO)
|
|
{// IO扩展板协议 因此协议不参与遍历 且节点ID为固定值 故nodeid为第几块 0仍然为广播
|
|
#if (MAX_SUPPORT_EXTIO > 0)
|
|
ExtIOControl * extio = GetExtIOFromList(pBoardFile->fileHead.nodeid+1);
|
|
int timeout = 10;
|
|
while(timeout > 0)
|
|
{
|
|
if (extio->transFlag == 0)
|
|
{
|
|
extio->transFlag = 1;
|
|
memset(&pBoardFile->filepkt, 0, sizeof(BoardFilePacketCtrl));
|
|
|
|
// 数据包头
|
|
memcpy(pBoardFile->filepkt.pktHead.head.sync, CDP_SYNC, CDPSYNC_LEN);
|
|
pBoardFile->filepkt.pktHead.head.pktId = pPkt->transFileData.pktIdx;
|
|
pBoardFile->filepkt.pktHead.head.fnum = (pPkt->transFileData.exLen + CAN_DATA_LEN - 1) / CAN_DATA_LEN;
|
|
|
|
// 数据内容
|
|
// 文件名称
|
|
for (int i = 0; i < pBoardFile->filepkt.pktHead.head.fnum; i++)
|
|
{
|
|
memcpy(&pBoardFile->filepkt.pktData[i].data[0], &pPkt->transFileData.exData[i*CAN_DATA_LEN], CAN_DATA_LEN);
|
|
}
|
|
|
|
pBoardFile->filepkt.pktHead.head.crc = CalcCrc16((u8*)pBoardFile->filepkt.pktData, pBoardFile->filepkt.pktHead.head.fnum*8);
|
|
|
|
break;
|
|
}
|
|
DelayRef(100);
|
|
timeout--;
|
|
if (timeout <= 0)
|
|
{// CAN通讯超时
|
|
printf("FileDataFromOperToCan err\r\n");
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
// 用CAN数据帧的格式发送数据包
|
|
void SendPacketWithCanData(u32 exid, BoardFileCtrl * pBoardFile)
|
|
{
|
|
CanTxMsg txMsg;
|
|
txMsg.canTxhead.ExtId = exid;
|
|
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 数据帧
|
|
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
|
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
|
|
|
for (int idx = 0; idx < pBoardFile->filepkt.pktHead.head.fnum+1; idx++)
|
|
{
|
|
memcpy(&txMsg.data, ((u8*)&pBoardFile->filepkt.pktHead)+idx*CAN_DATA_LEN, CAN_DATA_LEN); // 填充数据场
|
|
SendACANDataPacket(&txMsg);
|
|
DelayMs(1);
|
|
}
|
|
}
|
|
|