optical/EMBOS/Users/EmbFunc/operator/exbfiletrans.c
2025-09-04 09:45:08 +08:00

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);
}
}