2248 lines
72 KiB
C
2248 lines
72 KiB
C
|
||
#include "extendboards.h"
|
||
#include "delay.h"
|
||
#include "crc16.h"
|
||
#include "filetrans.h"
|
||
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
|
||
//-------------------------------------------------------------------------------
|
||
|
||
|
||
#if (MAX_SUPPORT_CORE > 0)
|
||
|
||
CoreControl g_extendCtrlList[MAX_SUPPORT_CORE];
|
||
|
||
#define EXID_CORE_STA1 MAKE_EXID(BN_PROTOCOL_MVCTRL, BN_ID_CORE_1, 0, BN_CMD_REGVAL) // 第一块的状态变化 ID
|
||
#define EXID_CORE_STA2 MAKE_EXID(BN_PROTOCOL_MVCTRL, BN_ID_CORE_2, 0, BN_CMD_REGVAL) // 第二块的状态变化 ID
|
||
#define EXID_CORE_STA3 MAKE_EXID(BN_PROTOCOL_MVCTRL, BN_ID_CORE_3, 0, BN_CMD_REGVAL) // 第三块的状态变化 ID
|
||
|
||
#define CUR_BOARD_INSTA_EXID MAKE_EXID(BN_PROTOCOL_MVCTRL, CUR_COREBOARD_ID, 0, BN_CMD_REGVAL)
|
||
|
||
#define EXID_CORE_CTRL1 MAKE_EXID(BN_PROTOCOL_MVCTRL, BN_ID_CORE_1, 0, BN_CMD_WTREG) // 第一块的控制数据 ID
|
||
#define EXID_CORE_CTRL2 MAKE_EXID(BN_PROTOCOL_MVCTRL, BN_ID_CORE_2, 0, BN_CMD_WTREG) // 第二块的控制数据 ID
|
||
#define EXID_CORE_CTRL3 MAKE_EXID(BN_PROTOCOL_MVCTRL, BN_ID_CORE_3, 0, BN_CMD_WTREG) // 第三块的控制数据 ID
|
||
|
||
#define CUR_BOARD_OUTCTRL_EXID MAKE_EXID(BN_PROTOCOL_MVCTRL, CUR_COREBOARD_ID, 0, BN_CMD_WTREG)
|
||
|
||
|
||
const u32 g_coreInExid[MAX_SUPPORT_CORE] =
|
||
{
|
||
EXID_CORE_STA1,
|
||
#if (MAX_SUPPORT_CORE > 1)
|
||
EXID_CORE_STA2,
|
||
#endif
|
||
#if (MAX_SUPPORT_CORE > 2)
|
||
EXID_CORE_STA3,
|
||
#endif
|
||
};
|
||
|
||
const u32 g_coreOutExid[MAX_SUPPORT_CORE] =
|
||
{
|
||
EXID_CORE_CTRL1,
|
||
#if (MAX_SUPPORT_CORE > 1)
|
||
EXID_CORE_CTRL2,
|
||
#endif
|
||
#if (MAX_SUPPORT_CORE > 2)
|
||
EXID_CORE_CTRL3,
|
||
#endif
|
||
};
|
||
|
||
#endif
|
||
|
||
|
||
//-------------------------------------------------------------------------
|
||
|
||
int g_curBoardIdx = -1; // 当前板卡在列表中的下角标
|
||
int g_curBoardID = -1; // 当前板卡的节点ID
|
||
int g_curBoardInstaExid = -1;
|
||
int g_curBoardOutCtrlExid = -1;
|
||
|
||
int g_wrcmdtoogle = 0;
|
||
int g_rdcmdtoogle = 0;
|
||
u32 g_rdcmdbitmap = 0;
|
||
|
||
int g_wrstatoogle = 0;
|
||
int g_rdstatoogle = 0;
|
||
u32 g_rdstabitmap = 0;
|
||
|
||
#if (RD_HEAD_PARA_NUM > 0)
|
||
u8 g_exbNvPara[RD_HEAD_PARA_NUM][BOARD_PARA_SIZE]; // 外围板非易失性参数
|
||
u8 g_receiveEn[RD_HEAD_PARA_NUM] = {0}; // 接收允许
|
||
u8 g_receivenum[RD_HEAD_PARA_NUM] = {0}; // 接收计数
|
||
u8 g_framenum[RD_HEAD_PARA_NUM] = {0}; // 数据包帧数
|
||
u16 g_datacrc[RD_HEAD_PARA_NUM] = {0}; // 数据crc校验值
|
||
#endif
|
||
|
||
s32 headparaval = 0;
|
||
|
||
#define TOOGLE_ADD 0x00010000
|
||
|
||
#define PORT_ADDR_MOD 0x0000FFFF
|
||
#define PORT_TOOG_MOD 0xFFFF0000
|
||
|
||
#define CMDSTA_BMP_FULL 0x000000FF
|
||
|
||
//-------------------------------------------------------------------------
|
||
|
||
static const u32 IDX_TO_BIT[32] =
|
||
{
|
||
0x00000001,
|
||
0x00000002,
|
||
0x00000004,
|
||
0x00000008,
|
||
0x00000010,
|
||
0x00000020,
|
||
0x00000040,
|
||
0x00000080,
|
||
0x00000100,
|
||
0x00000200,
|
||
0x00000400,
|
||
0x00000800,
|
||
0x00001000,
|
||
0x00002000,
|
||
0x00004000,
|
||
0x00008000,
|
||
0x00010000,
|
||
0x00020000,
|
||
0x00040000,
|
||
0x00080000,
|
||
0x00100000,
|
||
0x00200000,
|
||
0x00400000,
|
||
0x00800000,
|
||
0x01000000,
|
||
0x02000000,
|
||
0x04000000,
|
||
0x08000000,
|
||
0x10000000,
|
||
0x20000000,
|
||
0x40000000,
|
||
0x80000000,
|
||
};
|
||
|
||
#if (MAX_SUPPORT_HEAD > 0)
|
||
|
||
HeadControl g_headList[MAX_SUPPORT_HEAD+1];
|
||
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_COLOR > 0)
|
||
|
||
ColorControl g_colorList[MAX_SUPPORT_COLOR+1];
|
||
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_EXTIO > 0)
|
||
|
||
ExtIOControl g_extioList[MAX_SUPPORT_EXTIO+1];
|
||
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_SEWHD > 0)
|
||
|
||
SewHeadControl g_sewHeadList[MAX_SUPPORT_SEWHD+1];
|
||
|
||
#endif
|
||
//-------------------------------------------------------------------------
|
||
|
||
void InitBoardsList(void)
|
||
{
|
||
int i;
|
||
int id;
|
||
|
||
// 核心主板
|
||
g_curBoardIdx = CUR_CORE_IDX;
|
||
g_curBoardID = -1;
|
||
g_curBoardInstaExid = -1;
|
||
g_curBoardOutCtrlExid = -1;
|
||
|
||
#if (MAX_SUPPORT_CORE > 0)
|
||
for (i = 0; i < MAX_SUPPORT_CORE; i++)
|
||
{
|
||
InitCoreControl(&(g_extendCtrlList[i]));
|
||
id = i+1;
|
||
g_extendCtrlList[i].staexid = MAKE_EXID(BN_PROTOCOL_MVCTRL, id, 0, BN_CMD_REGVAL);
|
||
g_extendCtrlList[i].cmdexid = MAKE_EXID(BN_PROTOCOL_MVCTRL, id, 0, BN_CMD_WTREG);
|
||
|
||
if (g_curBoardIdx == i)
|
||
{
|
||
g_curBoardID = id;
|
||
g_curBoardInstaExid = g_extendCtrlList[i].staexid;
|
||
g_curBoardOutCtrlExid = g_extendCtrlList[i].cmdexid;
|
||
}
|
||
|
||
}
|
||
#endif
|
||
|
||
if (g_curBoardIdx >= 0)
|
||
{
|
||
printf("cur board idx = %d\r\n", g_curBoardIdx);
|
||
}
|
||
else
|
||
{
|
||
printf("init extendCtrlList error\r\n");
|
||
}
|
||
|
||
//-------------------------------------------------------------------------
|
||
|
||
// 机头板
|
||
#if (MAX_SUPPORT_HEAD > 0)
|
||
for (i = 0; i < MAX_SUPPORT_HEAD+1; i++) // 0为广播命令 故MAX_SUPPORT_HEAD+1
|
||
{
|
||
InitHeadControl(&(g_headList[i]));
|
||
|
||
if (i == 0)
|
||
{
|
||
g_headList[i].nodeId = BN_ID_BROADCAST;
|
||
}
|
||
else
|
||
{
|
||
id = i + HEAD_NODEID_BASE - 1;
|
||
g_headList[i].nodeId = id;
|
||
}
|
||
}
|
||
#endif // (MAX_SUPPORT_HEAD > 0)
|
||
|
||
//-------------------------------------------------------------------------
|
||
|
||
// 换色板
|
||
#if (MAX_SUPPORT_COLOR > 0)
|
||
for (i = 0; i < MAX_SUPPORT_COLOR+1; i++)
|
||
{
|
||
InitColorControl(&(g_colorList[i]));
|
||
if (i == 0)
|
||
{
|
||
g_colorList[i].nodeId = BN_ID_BROADCAST;
|
||
}
|
||
else
|
||
{
|
||
id = i + COLOR_NODEID_BASE - 1;
|
||
g_colorList[i].nodeId = id;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
//-------------------------------------------------------------------------
|
||
|
||
// IO扩展板
|
||
#if (MAX_SUPPORT_EXTIO > 0)
|
||
for (i = 0; i < MAX_SUPPORT_EXTIO+1; i++)
|
||
{
|
||
InitExtIOControl(&(g_extioList[i]));
|
||
if (i == 0)
|
||
{
|
||
g_extioList[i].nodeId = BN_ID_BROADCAST;
|
||
}
|
||
else
|
||
{
|
||
id = i + EXTIO_NODEID_BASE - 1;
|
||
g_extioList[i].nodeId = id;
|
||
}
|
||
}
|
||
#endif
|
||
//-------------------------------------------------------------------------
|
||
|
||
// 缝纫机头板
|
||
#if (MAX_SUPPORT_SEWHD > 0)
|
||
for (i = 0; i < MAX_SUPPORT_SEWHD+1; i++)
|
||
{
|
||
InitSewHeadControl(&(g_sewHeadList[i]));
|
||
if (i == 0)
|
||
{
|
||
g_sewHeadList[i].nodeId = BN_ID_BROADCAST;
|
||
}
|
||
else
|
||
{
|
||
id = i + SEWHD_NODEID_BASE - 1;
|
||
g_sewHeadList[i].nodeId = id;
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
|
||
//---------------------------------------------------
|
||
// 设置过滤器
|
||
void CoreCanFilter(u8 fifo)
|
||
{
|
||
int filteridx = 0;
|
||
CAN_FilterTypeDef hFilterConfig;
|
||
|
||
if (1)
|
||
{// 防止报警
|
||
filteridx = filteridx;
|
||
hFilterConfig.FilterBank = 1;
|
||
hFilterConfig.FilterBank = hFilterConfig.FilterBank;
|
||
}
|
||
|
||
|
||
#if (MAX_SUPPORT_CORE > 1)
|
||
// 请求本节点输入变化的远程帧和控制本节点输出的数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST; // 过滤器组为标识符列表模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器组位宽为32位
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(g_curBoardInstaExid, CAN_RTR_REMOTE)); // 设定第一个过滤器高16位
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(g_curBoardInstaExid, CAN_RTR_REMOTE)); // 设定第一个过滤器低16位
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(g_curBoardOutCtrlExid, CAN_RTR_DATA)); // 设定第二个过滤器高16位
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(g_curBoardOutCtrlExid, CAN_RTR_DATA)); // 设定第二个过滤器低16位
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
|
||
// 针对本类设备的所有ID的广播的远程帧和数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_MVCTRL, BN_ID_BROADCAST, 0, 0), 0)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_MVCTRL, BN_ID_BROADCAST, 0, 0), 0)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_TID, 0)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_TID, 0)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
|
||
// 针对其他N1的寄存器变化数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_MVCTRL, 0, 0, BN_CMD_WTREG), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_MVCTRL, 0, 0, BN_CMD_WTREG), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_REMOTE)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_REMOTE)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig);
|
||
filteridx++;
|
||
|
||
// 针对其他N1的寄存器变化数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_MVCTRL, 0, 0, BN_CMD_REGVAL), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_MVCTRL, 0, 0, BN_CMD_REGVAL), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_REMOTE)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_REMOTE)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_HEAD > 0)
|
||
// 针对机头板的状态变化数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_HEAD, 0, 0, BN_CMD_EXSTA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_HEAD, 0, 0, BN_CMD_EXSTA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
|
||
// 针对机头板的总线状态命令的数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_HEAD, 0, 0, BN_CMD_BUSSTA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_HEAD, 0, 0, BN_CMD_BUSSTA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
|
||
// 针对机头板的读取寄存器命令的数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_HEAD, 0, 0, BN_CMD_REGVAL), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_HEAD, 0, 0, BN_CMD_REGVAL), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
|
||
// 针对机头板的读写参数命令的数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_HEAD, 0, 0, BN_CMD_NVPARA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_HEAD, 0, 0, BN_CMD_NVPARA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_COLOR > 0)
|
||
// 针对换色板的状态变化数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_COLOR, 0, 0, BN_CMD_EXSTA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_COLOR, 0, 0, BN_CMD_EXSTA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
|
||
|
||
// 针对换色板的读取寄存器命令的数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_COLOR, 0, 0, BN_CMD_REGVAL), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_COLOR, 0, 0, BN_CMD_REGVAL), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
|
||
// 针对换色板的读写参数命令的数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_COLOR, 0, 0, BN_CMD_NVPARA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_COLOR, 0, 0, BN_CMD_NVPARA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_EXTIO > 0)
|
||
// 针对IO扩展板的状态变化数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_EXTIO, 0, 0, BN_CMD_EXSTA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_EXTIO, 0, 0, BN_CMD_EXSTA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
|
||
// 针对IO扩展板的读取寄存器命令的数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_EXTIO, 0, 0, BN_CMD_REGVAL), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_EXTIO, 0, 0, BN_CMD_REGVAL), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_SEWHD > 0)
|
||
// 针对缝纫机头板的状态变化数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_SEWHD, 0, 0, BN_CMD_EXSTA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_SEWHD, 0, 0, BN_CMD_EXSTA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
|
||
// 针对缝纫机头板的总线状态命令的数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_SEWHD, 0, 0, BN_CMD_BUSSTA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_SEWHD, 0, 0, BN_CMD_BUSSTA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
|
||
// 针对缝纫机头板的读取寄存器命令的数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_SEWHD, 0, 0, BN_CMD_REGVAL), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_SEWHD, 0, 0, BN_CMD_REGVAL), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
|
||
// 针对缝纫机头板的读写参数命令的数据帧
|
||
hFilterConfig.FilterBank = filteridx; // 设置过滤器组,范围为0~13
|
||
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 过滤器组为标识符屏蔽位模式
|
||
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为1个32位过滤器
|
||
hFilterConfig.FilterIdHigh = HIWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_SEWHD, 0, 0, BN_CMD_NVPARA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterIdLow = LOWORD(MAKE_FILTER(MAKE_EXID(BN_PROTOCOL_SEWHD, 0, 0, BN_CMD_NVPARA), CAN_RTR_DATA)); // 设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterMaskIdHigh = HIWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
|
||
hFilterConfig.FilterMaskIdLow = LOWORD(MAKE_FILTER(BNMASK_PRT|BNMASK_CMD, CAN_RTR_DATA)); // 设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)
|
||
hFilterConfig.FilterFIFOAssignment = fifo; // 关联到接收FIFO0
|
||
hFilterConfig.SlaveStartFilterBank = 14;
|
||
hFilterConfig.FilterActivation = ENABLE; // 使能过滤器
|
||
HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig); // 写入设置
|
||
filteridx++;
|
||
#endif
|
||
|
||
}
|
||
|
||
void InitExtendBoards()
|
||
{
|
||
InitBoardsList();
|
||
|
||
RegistFilter(CoreCanFilter);
|
||
|
||
InitCanCtrl();
|
||
}
|
||
|
||
//-------------------------------------------------------------------------
|
||
|
||
|
||
//-------------------------------------------------------------------------
|
||
|
||
void InputsTask()
|
||
{
|
||
int rslt;
|
||
CanRxMsg rxMsg;
|
||
u32 tid, sid, cmd, dev, toogle;
|
||
int i, count, idx;
|
||
CtrlBusPacket pkt;
|
||
|
||
count = 0;
|
||
// CAN输入
|
||
do
|
||
{
|
||
rslt = GetACanDataPacket(&rxMsg);
|
||
if (rslt == 0)
|
||
{
|
||
dev = GET_PRT_FROM_EXID(rxMsg.canRxhead.ExtId);
|
||
tid = GET_TID_FROM_EXID(rxMsg.canRxhead.ExtId);
|
||
sid = GET_SID_FROM_EXID(rxMsg.canRxhead.ExtId);
|
||
cmd = GET_CMD_FROM_EXID(rxMsg.canRxhead.ExtId);
|
||
sid = sid;
|
||
if (rxMsg.canRxhead.RTR == CAN_RTR_REMOTE) // 远程帧
|
||
{
|
||
if ((dev == BN_PROTOCOL_ALL || dev == BN_PROTOCOL_MVCTRL) && // 全部设备或N1
|
||
(tid == BN_ID_BROADCAST || tid == g_curBoardID) ) // 全部ID或本板
|
||
{
|
||
if (cmd == BN_CMD_REGVAL) // 请求本节点发送寄存器
|
||
{
|
||
// printf("receive sta request packet\r\n");
|
||
if (g_curBoardIdx >= 0)
|
||
{
|
||
g_extendCtrlList[g_curBoardIdx].refreshflag = 1; // 设置本板状态刷新标志,重新发送
|
||
}
|
||
else
|
||
{
|
||
printf("error: g_curBoardIdx not init\r\n");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
printf("other Remote cmd, cmd=0x%x\r\n", cmd);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
printf("other Remote packet, exid=0x%x\r\n", rxMsg.canRxhead.ExtId);
|
||
}
|
||
}
|
||
else if (rxMsg.canRxhead.RTR == CAN_RTR_DATA && rxMsg.canRxhead.DLC == CAN_DATA_LEN) // 数据帧,数据长度为8
|
||
{
|
||
#if (MAX_SUPPORT_CORE > 0)
|
||
if (dev == BN_PROTOCOL_MVCTRL)
|
||
{
|
||
if (tid == BN_ID_BROADCAST || tid == g_curBoardID) // 全部ID或本板
|
||
{
|
||
if (cmd == BN_CMD_WTREG) // 写入命令或数据
|
||
{
|
||
// 写入命令到本节点
|
||
if (g_curBoardIdx >= 0)
|
||
{
|
||
memcpy(pkt.cancomm.data.buff, rxMsg.data, CAN_DATA_LEN);
|
||
|
||
toogle = pkt.cancomm.data.wrport.portaddr & PORT_TOOG_MOD;
|
||
idx = pkt.cancomm.data.wrport.portaddr & PORT_ADDR_MOD;
|
||
|
||
// printf("refresh this cmd, toogle=0x%x, idx=%d, cmd=0x%x\r\n", toogle, idx, pkt.cancomm.data.wrport.wrdata);
|
||
if (toogle != g_rdcmdtoogle) // 新命令
|
||
{
|
||
// 清空状态buff
|
||
g_rdcmdtoogle = toogle;
|
||
g_rdcmdbitmap = 0;
|
||
g_extendCtrlList[g_curBoardIdx].newcmdflag = 0;
|
||
memset(g_extendCtrlList[g_curBoardIdx].cmdbuff, 0, sizeof(CORE_CHG_BUF_LEN));
|
||
// printf("get new cmd begin\r\n");
|
||
}
|
||
if (idx < CORE_CHG_BUF_LEN)
|
||
{
|
||
g_extendCtrlList[g_curBoardIdx].cmdbuff[idx] = pkt.cancomm.data.wrport.wrdata;
|
||
|
||
g_rdcmdbitmap |= IDX_TO_BIT[idx];
|
||
if (g_rdcmdbitmap == CMDSTA_BMP_FULL)
|
||
{
|
||
g_extendCtrlList[g_curBoardIdx].newcmdflag = 1; // 设置收到新命令状态
|
||
// printf("get new cmd end\r\n");
|
||
}
|
||
}
|
||
// printf("refresh this cmd, toogle=0x%x, idx=%d, cmd=0x%x\r\n", toogle, idx, pkt.cancomm.data.wrport.wrdata);
|
||
}
|
||
else
|
||
{
|
||
printf("error: g_curBoardIdx not init\r\n");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//printf("get other core data for this, cmd=%d, sid=%d\r\n", cmd, sid);
|
||
}
|
||
}
|
||
else // 其他节点ID
|
||
{
|
||
if (cmd == BN_CMD_REGVAL) // 寄存器变化命令
|
||
{
|
||
for (i = 0; i < MAX_SUPPORT_CORE ; i++)
|
||
{
|
||
if (g_extendCtrlList[i].staexid == rxMsg.canRxhead.ExtId) // 找到其他节点ID相符的缓冲区
|
||
{
|
||
// 刷新状态到缓冲区
|
||
memcpy(pkt.cancomm.data.buff, rxMsg.data, CAN_DATA_LEN);
|
||
|
||
toogle = pkt.cancomm.data.wrport.portaddr & PORT_TOOG_MOD;
|
||
idx = pkt.cancomm.data.wrport.portaddr & PORT_ADDR_MOD;
|
||
|
||
if (toogle != g_rdstatoogle) // 新状态
|
||
{
|
||
// 清空状态buff
|
||
memset(g_extendCtrlList[i].stabuff, 0, sizeof(CORE_CHG_BUF_LEN));
|
||
g_rdstatoogle = toogle;
|
||
g_rdstabitmap = 0;
|
||
g_extendCtrlList[i].stachangeflag = 0;
|
||
// printf("get new status begin, toogle=0x%x, idx=%d\r\n", toogle, idx);
|
||
}
|
||
|
||
if (idx < CORE_CHG_BUF_LEN)
|
||
{
|
||
g_extendCtrlList[i].stabuff[idx] = pkt.cancomm.data.wrport.wrdata;
|
||
|
||
g_rdstabitmap |= IDX_TO_BIT[idx];
|
||
if (g_rdstabitmap == CMDSTA_BMP_FULL)
|
||
{
|
||
g_extendCtrlList[i].stachangeflag = 1; // 设置收到新命令状态
|
||
// printf("get new status ok\r\n");
|
||
}
|
||
}
|
||
// printf("refresh core %d status, toogle=0x%x, idx=%d, val=0x%x\r\n", i+1, toogle, idx, pkt.cancomm.data.wrport.wrdata);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//printf("get other core data, exid=0x%x\r\n", rxMsg.canRxhead.ExtId);
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_HEAD > 0)
|
||
else if (dev == BN_PROTOCOL_HEAD) // 机头板
|
||
{
|
||
if (cmd == BN_CMD_EXSTA)
|
||
{
|
||
//printf("get head sta packet, sid=%d\r\n", sid);
|
||
if (tid == g_curBoardID)
|
||
{
|
||
for (i = 0; i < MAX_SUPPORT_HEAD+1; i++)
|
||
{
|
||
if (sid == g_headList[i].nodeId)
|
||
{
|
||
g_headList[i].exbSta.cancomm.exId.id = rxMsg.canRxhead.ExtId;
|
||
memcpy(g_headList[i].exbSta.cancomm.data.buff, rxMsg.data, CAN_DATA_LEN);
|
||
g_headList[i].staFlag = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else if (cmd == BN_CMD_BUSSTA) // 总线状态命令
|
||
{
|
||
printf("get head bus sta packet, sid=%d\r\n", sid);
|
||
if (tid == g_curBoardID)
|
||
{
|
||
for (i = 0; i < MAX_SUPPORT_HEAD+1; i++)
|
||
{
|
||
if (sid == g_headList[i].nodeId)
|
||
{
|
||
g_headList[i].busSta.cancomm.exId.id = rxMsg.canRxhead.ExtId;
|
||
memcpy(g_headList[i].busSta.cancomm.data.buff, rxMsg.data, CAN_DATA_LEN);
|
||
g_headList[i].busFlag = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else if (cmd == BN_CMD_REGVAL) // 读取寄存器命令
|
||
{
|
||
//printf("get head reg val packet, sid=%d, tid=%d\r\n", sid, tid);
|
||
if (tid == g_curBoardID)
|
||
{
|
||
for (i = 0; i < MAX_SUPPORT_HEAD+1; i++)
|
||
{
|
||
if (sid == g_headList[i].nodeId)
|
||
{
|
||
memcpy(pkt.cancomm.data.buff, rxMsg.data, CAN_DATA_LEN);
|
||
u32 highaddr, lowaddr;
|
||
highaddr = pkt.cancomm.data.rdport.portaddr & PORT_ADDR_HIGH;
|
||
lowaddr = pkt.cancomm.data.rdport.portaddr & PORT_ADDR_LOW;
|
||
if (highaddr == BOARD_VERSION)
|
||
{
|
||
if (g_headList[i].regVal.rdnewbverflag == 1) // 新程序版本
|
||
{
|
||
g_headList[i].regVal.rdbverbitmap = 0;
|
||
g_headList[i].regVal.rdnewbverflag = 0; // 清空
|
||
g_headList[i].verFlag = 0;
|
||
memset(g_headList[i].regVal.exbVer, 0, BOARD_VER_LEN*sizeof(u32));
|
||
}
|
||
if (lowaddr < BOARD_VER_LEN)
|
||
{
|
||
g_headList[i].regVal.exbVer[lowaddr] = pkt.cancomm.data.rdport.status;
|
||
g_headList[i].regVal.rdbverbitmap |= IDX_TO_BIT[lowaddr];
|
||
if (g_headList[i].regVal.rdbverbitmap == CMDSTA_BMP_FULL)
|
||
{
|
||
g_headList[i].verFlag = 1;
|
||
}
|
||
}
|
||
}
|
||
else if (highaddr == GET_NV_PARA) // 读取参数
|
||
{
|
||
g_headList[i].headParaFlag = 1;
|
||
headparaval = pkt.cancomm.data.rdport.status;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#if (RD_HEAD_PARA_NUM > 0)
|
||
else if (cmd == BN_CMD_NVPARA) // 读取非易失性参数
|
||
{
|
||
if (tid == g_curBoardID)
|
||
{
|
||
for (i = 0; i < MAX_SUPPORT_HEAD+1; i++)
|
||
{
|
||
if (sid == g_headList[i].nodeId)
|
||
{
|
||
int id = 0;
|
||
if (g_headList[i].nodeTye == FLAT_EMB_HEAD)
|
||
{
|
||
id = 1;
|
||
}
|
||
else if (g_headList[i].nodeTye == CHENILLE_HEAD)
|
||
{
|
||
id = 2;
|
||
}
|
||
else if (g_headList[i].nodeTye == COIL_HEAD)
|
||
{
|
||
id = 3;
|
||
}
|
||
int rslt = ReceiveBoardNvParaProc(rxMsg, id, g_headList[i].nodeTye);
|
||
if (rslt == 0)
|
||
{
|
||
g_headList[i].nvParaFlag = 1;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
else
|
||
{
|
||
printf("get other head data packet, exid=0x%x\r\n", rxMsg.canRxhead.ExtId);
|
||
}
|
||
}
|
||
#endif
|
||
#if (MAX_SUPPORT_COLOR > 0)
|
||
else if (dev == BN_PROTOCOL_COLOR)
|
||
{
|
||
if (cmd == BN_CMD_EXSTA)
|
||
{
|
||
//printf("get color sta packet, sid=0x%x, tid=0x%x\r\n", sid, tid);
|
||
if (tid == g_curBoardID)
|
||
{
|
||
for (i = 0; i < MAX_SUPPORT_COLOR+1; i++)
|
||
{
|
||
if (sid == g_colorList[i].nodeId)
|
||
{
|
||
g_colorList[i].exbSta.cancomm.exId.id = rxMsg.canRxhead.ExtId;
|
||
memcpy(g_colorList[i].exbSta.cancomm.data.buff, rxMsg.data, CAN_DATA_LEN);
|
||
g_colorList[i].staFlag = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else if (cmd == BN_CMD_REGVAL) // 读取寄存器命令
|
||
{
|
||
//printf("get color reg val packet, sid=%d, tid=%d\r\n", sid, tid);
|
||
if (tid == g_curBoardID)
|
||
{
|
||
for (i = 0; i < MAX_SUPPORT_COLOR+1; i++)
|
||
{
|
||
if (sid == g_colorList[i].nodeId)
|
||
{
|
||
memcpy(pkt.cancomm.data.buff, rxMsg.data, CAN_DATA_LEN);
|
||
u32 highaddr, lowaddr;
|
||
highaddr = pkt.cancomm.data.rdport.portaddr & PORT_ADDR_HIGH;
|
||
lowaddr = pkt.cancomm.data.rdport.portaddr & PORT_ADDR_LOW;
|
||
if (highaddr == BOARD_VERSION)
|
||
{
|
||
if (g_colorList[i].regVal.rdnewbverflag == 1) // 新程序版本
|
||
{
|
||
g_colorList[i].regVal.rdbverbitmap = 0;
|
||
g_colorList[i].regVal.rdnewbverflag = 0; // 清空
|
||
g_colorList[i].verFlag = 0;
|
||
memset(g_colorList[i].regVal.exbVer, 0, BOARD_VER_LEN*sizeof(u32));
|
||
}
|
||
if (lowaddr < BOARD_VER_LEN)
|
||
{
|
||
g_colorList[i].regVal.exbVer[lowaddr] = pkt.cancomm.data.rdport.status;
|
||
g_colorList[i].regVal.rdbverbitmap |= IDX_TO_BIT[lowaddr];
|
||
if (g_colorList[i].regVal.rdbverbitmap == CMDSTA_BMP_FULL)
|
||
{
|
||
g_colorList[i].verFlag = 1;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#if (RD_HEAD_PARA_NUM > 0)
|
||
else if (cmd == BN_CMD_NVPARA) // 读取非易失性参数
|
||
{
|
||
if (tid == g_curBoardID)
|
||
{
|
||
for (i = 0; i < MAX_SUPPORT_COLOR+1; i++)
|
||
{
|
||
if (sid == g_colorList[i].nodeId)
|
||
{
|
||
int id = 0;
|
||
if (i == 2) // 毛巾换色板
|
||
{
|
||
id = 4;
|
||
}
|
||
int rslt = ReceiveBoardNvParaProc(rxMsg, id, 0);
|
||
if (rslt == 0)
|
||
{
|
||
g_colorList[i].nvParaFlag = 1;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
else
|
||
{
|
||
printf("get other color data packet, exid=0x%x\r\n", rxMsg.canRxhead.ExtId);
|
||
}
|
||
}
|
||
#endif // (MAX_SUPPORT_COLOR > 0)
|
||
|
||
#if (MAX_SUPPORT_EXTIO > 0)
|
||
else if (dev == BN_PROTOCOL_EXTIO)
|
||
{
|
||
if (cmd == BN_CMD_EXSTA)
|
||
{
|
||
//printf("get extio sta packet, sid=0x%x, tid=0x%x\r\n", sid, tid);
|
||
if (tid == g_curBoardID)
|
||
{
|
||
for (i = 0; i < MAX_SUPPORT_EXTIO+1; i++)
|
||
{
|
||
if (sid == g_extioList[i].nodeId)
|
||
{
|
||
g_extioList[i].exbSta.cancomm.exId.id = rxMsg.canRxhead.ExtId;
|
||
memcpy(g_extioList[i].exbSta.cancomm.data.buff, rxMsg.data, CAN_DATA_LEN);
|
||
g_extioList[i].staFlag = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else if (cmd == BN_CMD_REGVAL) // 读取寄存器命令
|
||
{
|
||
//printf("get extio reg val packet, sid=%d, tid=%d\r\n", sid, tid);
|
||
if (tid == g_curBoardID)
|
||
{
|
||
for (i = 0; i < MAX_SUPPORT_EXTIO+1; i++)
|
||
{
|
||
if (sid == g_extioList[i].nodeId)
|
||
{
|
||
memcpy(pkt.cancomm.data.buff, rxMsg.data, CAN_DATA_LEN);
|
||
u32 highaddr, lowaddr;
|
||
highaddr = pkt.cancomm.data.rdport.portaddr & PORT_ADDR_HIGH;
|
||
lowaddr = pkt.cancomm.data.rdport.portaddr & PORT_ADDR_LOW;
|
||
if (highaddr == BOARD_VERSION)
|
||
{
|
||
if (g_extioList[i].regVal.rdnewbverflag == 1) // 新程序版本
|
||
{
|
||
g_extioList[i].regVal.rdbverbitmap = 0;
|
||
g_extioList[i].regVal.rdnewbverflag = 0; // 清空
|
||
g_extioList[i].verFlag = 0;
|
||
memset(g_extioList[i].regVal.exbVer, 0, BOARD_VER_LEN*sizeof(u32));
|
||
}
|
||
if (lowaddr < BOARD_VER_LEN)
|
||
{
|
||
g_extioList[i].regVal.exbVer[lowaddr] = pkt.cancomm.data.rdport.status;
|
||
g_extioList[i].regVal.rdbverbitmap |= IDX_TO_BIT[lowaddr];
|
||
if (g_extioList[i].regVal.rdbverbitmap == CMDSTA_BMP_FULL)
|
||
{
|
||
g_extioList[i].verFlag = 1;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
printf("get other extio data packet, exid=0x%x\r\n", rxMsg.canRxhead.ExtId);
|
||
}
|
||
}
|
||
#endif // (MAX_SUPPORT_EXTIO > 0)
|
||
|
||
#if (MAX_SUPPORT_SEWHD > 0)
|
||
else if (dev == BN_PROTOCOL_SEWHD)
|
||
{
|
||
if (cmd == BN_CMD_EXSTA)
|
||
{
|
||
//printf("get color sta packet, sid=0x%x, tid=0x%x\r\n", sid, tid);
|
||
if (tid == g_curBoardID)
|
||
{
|
||
for (i = 0; i < MAX_SUPPORT_SEWHD+1; i++)
|
||
{
|
||
if (sid == g_sewHeadList[i].nodeId)
|
||
{
|
||
g_sewHeadList[i].exbSta.cancomm.exId.id = rxMsg.canRxhead.ExtId;
|
||
memcpy(g_sewHeadList[i].exbSta.cancomm.data.buff, rxMsg.data, CAN_DATA_LEN);
|
||
g_sewHeadList[i].staFlag = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else if (cmd == BN_CMD_REGVAL) // 读取寄存器命令
|
||
{
|
||
//printf("get color reg val packet, sid=%d, tid=%d\r\n", sid, tid);
|
||
if (tid == g_curBoardID)
|
||
{
|
||
for (i = 0; i < MAX_SUPPORT_SEWHD+1; i++)
|
||
{
|
||
if (sid == g_sewHeadList[i].nodeId)
|
||
{
|
||
memcpy(pkt.cancomm.data.buff, rxMsg.data, CAN_DATA_LEN);
|
||
u32 highaddr, lowaddr;
|
||
highaddr = pkt.cancomm.data.rdport.portaddr & PORT_ADDR_HIGH;
|
||
lowaddr = pkt.cancomm.data.rdport.portaddr & PORT_ADDR_LOW;
|
||
if (highaddr == BOARD_VERSION)
|
||
{
|
||
if (g_sewHeadList[i].regVal.rdnewbverflag == 1) // 新程序版本
|
||
{
|
||
g_sewHeadList[i].regVal.rdbverbitmap = 0;
|
||
g_sewHeadList[i].regVal.rdnewbverflag = 0; // 清空
|
||
g_sewHeadList[i].verFlag = 0;
|
||
memset(g_sewHeadList[i].regVal.exbVer, 0, BOARD_VER_LEN*sizeof(u32));
|
||
}
|
||
if (lowaddr < BOARD_VER_LEN)
|
||
{
|
||
g_sewHeadList[i].regVal.exbVer[lowaddr] = pkt.cancomm.data.rdport.status;
|
||
g_sewHeadList[i].regVal.rdbverbitmap |= IDX_TO_BIT[lowaddr];
|
||
if (g_sewHeadList[i].regVal.rdbverbitmap == CMDSTA_BMP_FULL)
|
||
{
|
||
g_sewHeadList[i].verFlag = 1;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
printf("get other sew head data packet, exid=0x%x\r\n", rxMsg.canRxhead.ExtId);
|
||
}
|
||
}
|
||
#endif // (MAX_SUPPORT_SEWHD > 0)
|
||
|
||
else
|
||
{
|
||
printf("get other data packet, exid=0x%x\r\n", rxMsg.canRxhead.ExtId);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
printf("other packet,RTR=%d,ID=%x,DLC=%d\r\n", rxMsg.canRxhead.RTR, rxMsg.canRxhead.ExtId, rxMsg.canRxhead.DLC);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// printf("no data");
|
||
break;
|
||
}
|
||
count++;
|
||
if (count > 10)
|
||
{
|
||
break;
|
||
}
|
||
}while(1);
|
||
}
|
||
|
||
void OutputsTask()
|
||
{
|
||
CanTxMsg txMsg;
|
||
int i, j;
|
||
CtrlBusPacket pkt;
|
||
|
||
//-------------------------------------------------------------------------
|
||
|
||
#if (MAX_SUPPORT_CORE > 0)
|
||
// 发给其他核心主板的控制命令和本节点的状态命令
|
||
for (i = 0; i < MAX_SUPPORT_CORE; i++)
|
||
{
|
||
if (g_curBoardIdx == i) // 本节点的状态发送
|
||
{
|
||
if (g_extendCtrlList[i].refreshflag != 0)
|
||
{
|
||
if (g_extendCtrlList[i].ReSendStatus != NULL)
|
||
{
|
||
g_extendCtrlList[i].ReSendStatus(1);
|
||
}
|
||
|
||
g_extendCtrlList[i].refreshflag = 0;
|
||
g_extendCtrlList[i].stachangeflag = 1;
|
||
}
|
||
if (g_extendCtrlList[i].stachangeflag != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = g_extendCtrlList[i].staexid;
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 数据帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
|
||
for (j = 0; j < CORE_CHG_BUF_LEN; j++)
|
||
{
|
||
pkt.cancomm.data.wrport.portaddr = j | g_wrstatoogle; // 地址
|
||
pkt.cancomm.data.wrport.wrdata = g_extendCtrlList[i].stabuff[j]; // 数据
|
||
memcpy(txMsg.data, pkt.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg);
|
||
// printf("send sta change, toogle=0x%x, idx=%d, sta=0x%x\r\n", g_wrstatoogle, j, pkt.cancomm.data.wrport.wrdata);
|
||
}
|
||
|
||
g_extendCtrlList[i].stachangeflag = 0;
|
||
g_wrstatoogle += TOOGLE_ADD;
|
||
}
|
||
}
|
||
else // 其他节点的命令发送
|
||
{
|
||
if (g_extendCtrlList[i].newcmdflag != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = g_extendCtrlList[i].cmdexid;
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 数据帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
|
||
for (j = 0; j < CORE_CHG_BUF_LEN; j++)
|
||
{
|
||
pkt.cancomm.data.wrport.portaddr = j | g_wrcmdtoogle; // 地址
|
||
pkt.cancomm.data.wrport.wrdata = g_extendCtrlList[i].cmdbuff[j]; // 数据
|
||
memcpy(txMsg.data, pkt.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg);
|
||
// printf("send cmd, toogle=0x%x, idx=%d, sta=0x%x\r\n", g_wrcmdtoogle, j, pkt.cancomm.data.wrport.wrdata);
|
||
}
|
||
|
||
g_extendCtrlList[i].newcmdflag = 0;
|
||
g_wrcmdtoogle += TOOGLE_ADD;
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_HEAD > 0)
|
||
for (i = 0; i < MAX_SUPPORT_HEAD+1; i++)
|
||
{
|
||
if (g_headList[i].cmdFlag != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_HEAD, g_headList[i].nodeId, g_curBoardID, BN_CMD_EXCTRL);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 数据帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memcpy(txMsg.data, g_headList[i].ctrlCmd.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg);
|
||
g_headList[i].cmdFlag = 0;
|
||
}
|
||
|
||
if (g_headList[i].refSta != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_HEAD, g_headList[i].nodeId, g_curBoardID, BN_CMD_EXSTA);
|
||
txMsg.canTxhead.RTR = CAN_RTR_REMOTE; // 远程帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = 0; // 数据场长度
|
||
memset(txMsg.data, 0, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送远程帧
|
||
g_headList[i].refSta = 0;
|
||
}
|
||
|
||
if (g_headList[i].refVer != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_HEAD, g_headList[i].nodeId, g_curBoardID, BN_CMD_REGVAL);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 数据帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memset(&g_headList[i].rdReg.cancomm.data.buff, 0, CAN_DATA_LEN);
|
||
g_headList[i].rdReg.cancomm.data.rdport.portaddr = BOARD_VERSION;
|
||
memcpy(txMsg.data, g_headList[i].rdReg.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送
|
||
g_headList[i].refVer = 0;
|
||
}
|
||
|
||
if (g_headList[i].traFlag != 0) // 遍历命令
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_HEAD, g_headList[i].nodeId, g_curBoardID, BN_CMD_TRAVERSE);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 数据帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memcpy(txMsg.data, g_headList[i].traCmd.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg);
|
||
g_headList[i].traFlag = 0;
|
||
}
|
||
|
||
if (g_headList[i].transFlag != 0) // 数据传输命令
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_HEAD, g_headList[i].nodeId, g_curBoardID, BN_CMD_TRANS_DATA);
|
||
ExboardDataTrans(txMsg.canTxhead.ExtId);
|
||
g_headList[i].transFlag = 0;
|
||
}
|
||
|
||
if (g_headList[i].exbupdateFlag != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_HEAD, g_headList[i].nodeId, g_curBoardID, BN_CMD_REGVAL);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 数据帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memcpy(txMsg.data, g_headList[i].rdReg.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送远程帧
|
||
g_headList[i].exbupdateFlag = 0;
|
||
}
|
||
|
||
if (g_headList[i].refNvPara != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_HEAD, g_headList[i].nodeId, g_curBoardID, BN_CMD_NVPARA);
|
||
txMsg.canTxhead.RTR = CAN_RTR_REMOTE; // 远程帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = 0; // 数据场长度
|
||
memset(txMsg.data, 0, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送远程帧
|
||
g_headList[i].refNvPara = 0;
|
||
}
|
||
|
||
if (g_headList[i].refHeadPara != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_HEAD, g_headList[i].nodeId, g_curBoardID, BN_CMD_REGVAL);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 远程帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memcpy(txMsg.data, g_headList[i].rdReg.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送远程帧
|
||
g_headList[i].refHeadPara = 0;
|
||
}
|
||
|
||
}
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_COLOR > 0)
|
||
for (i = 0; i < MAX_SUPPORT_COLOR+1; i++)
|
||
{
|
||
if (g_colorList[i].cmdFlag != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_COLOR, g_colorList[i].nodeId, g_curBoardID, BN_CMD_EXCTRL);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 数据帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memcpy(txMsg.data, g_colorList[i].ctrlCmd.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg);
|
||
g_colorList[i].cmdFlag = 0;
|
||
}
|
||
|
||
if (g_colorList[i].refSta != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_COLOR, g_colorList[i].nodeId, g_curBoardID, BN_CMD_EXSTA);
|
||
txMsg.canTxhead.RTR = CAN_RTR_REMOTE; // 远程帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = 0; // 数据场长度
|
||
memset(txMsg.data, 0, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送远程帧
|
||
g_colorList[i].refSta = 0;
|
||
}
|
||
|
||
if (g_colorList[i].refVer != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_COLOR, g_colorList[i].nodeId, g_curBoardID, BN_CMD_REGVAL);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 数据帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memset(&g_colorList[i].rdReg.cancomm.data.buff, 0, CAN_DATA_LEN);
|
||
g_colorList[i].rdReg.cancomm.data.rdport.portaddr = BOARD_VERSION;
|
||
memcpy(txMsg.data, g_colorList[i].rdReg.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送
|
||
g_colorList[i].refVer = 0;
|
||
}
|
||
|
||
if (g_colorList[i].transFlag != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_COLOR, g_colorList[i].nodeId, g_curBoardID, BN_CMD_TRANS_DATA);
|
||
ExboardDataTrans(txMsg.canTxhead.ExtId);
|
||
g_colorList[i].transFlag = 0;
|
||
}
|
||
|
||
if (g_colorList[i].exbupdateFlag != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_COLOR, g_colorList[i].nodeId, g_curBoardID, BN_CMD_REGVAL);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 远程帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memcpy(txMsg.data, g_colorList[i].rdReg.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送远程帧
|
||
g_colorList[i].exbupdateFlag = 0;
|
||
}
|
||
|
||
if (g_colorList[i].refNvPara != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_COLOR, g_colorList[i].nodeId, g_curBoardID, BN_CMD_NVPARA);
|
||
txMsg.canTxhead.RTR = CAN_RTR_REMOTE; // 远程帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = 0; // 数据场长度
|
||
memset(txMsg.data, 0, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送远程帧
|
||
g_colorList[i].refNvPara = 0;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_EXTIO > 0)
|
||
for (i = 0; i < MAX_SUPPORT_EXTIO+1; i++)
|
||
{
|
||
if (g_extioList[i].cmdFlag != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_EXTIO, g_extioList[i].nodeId, g_curBoardID, BN_CMD_EXCTRL);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 数据帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memcpy(txMsg.data, g_extioList[i].ctrlCmd.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg);
|
||
g_extioList[i].cmdFlag = 0;
|
||
}
|
||
|
||
if (g_extioList[i].refSta != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_EXTIO, g_extioList[i].nodeId, g_curBoardID, BN_CMD_EXSTA);
|
||
txMsg.canTxhead.RTR = CAN_RTR_REMOTE; // 远程帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = 0; // 数据场长度
|
||
memset(txMsg.data, 0, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送远程帧
|
||
g_extioList[i].refSta = 0;
|
||
}
|
||
|
||
if (g_extioList[i].refVer != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_EXTIO, g_extioList[i].nodeId, g_curBoardID, BN_CMD_REGVAL);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 数据帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memset(&g_extioList[i].rdReg.cancomm.data.buff, 0, CAN_DATA_LEN);
|
||
g_extioList[i].rdReg.cancomm.data.rdport.portaddr = BOARD_VERSION;
|
||
memcpy(txMsg.data, g_extioList[i].rdReg.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送
|
||
g_extioList[i].refVer = 0;
|
||
}
|
||
|
||
if (g_extioList[i].transFlag != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_EXTIO, g_extioList[i].nodeId, g_curBoardID, BN_CMD_TRANS_DATA);
|
||
ExboardDataTrans(txMsg.canTxhead.ExtId);
|
||
g_extioList[i].transFlag = 0;
|
||
}
|
||
|
||
if (g_extioList[i].exbupdateFlag != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_EXTIO, g_extioList[i].nodeId, g_curBoardID, BN_CMD_REGVAL);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 远程帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memcpy(txMsg.data, g_extioList[i].rdReg.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送远程帧
|
||
g_extioList[i].exbupdateFlag = 0;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_SEWHD > 0)
|
||
for (i = 0; i < MAX_SUPPORT_SEWHD+1; i++)
|
||
{
|
||
if (g_sewHeadList[i].cmdFlag != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_SEWHD, g_sewHeadList[i].nodeId, g_curBoardID, BN_CMD_EXCTRL);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 数据帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memcpy(txMsg.data, g_sewHeadList[i].ctrlCmd.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg);
|
||
g_sewHeadList[i].cmdFlag = 0;
|
||
}
|
||
|
||
if (g_sewHeadList[i].refSta != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_SEWHD, g_sewHeadList[i].nodeId, g_curBoardID, BN_CMD_EXSTA);
|
||
txMsg.canTxhead.RTR = CAN_RTR_REMOTE; // 远程帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = 0; // 数据场长度
|
||
memset(txMsg.data, 0, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送远程帧
|
||
g_sewHeadList[i].refSta = 0;
|
||
}
|
||
|
||
if (g_sewHeadList[i].refVer != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_SEWHD, g_sewHeadList[i].nodeId, g_curBoardID, BN_CMD_REGVAL);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 数据帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memset(&g_sewHeadList[i].rdReg.cancomm.data.buff, 0, CAN_DATA_LEN);
|
||
g_sewHeadList[i].rdReg.cancomm.data.rdport.portaddr = BOARD_VERSION;
|
||
memcpy(txMsg.data, g_sewHeadList[i].rdReg.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送
|
||
g_sewHeadList[i].refVer = 0;
|
||
}
|
||
|
||
if (g_sewHeadList[i].transFlag != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_SEWHD, g_sewHeadList[i].nodeId, g_curBoardID, BN_CMD_TRANS_DATA);
|
||
ExboardDataTrans(txMsg.canTxhead.ExtId);
|
||
g_sewHeadList[i].transFlag = 0;
|
||
}
|
||
|
||
if (g_sewHeadList[i].exbupdateFlag != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_SEWHD, g_sewHeadList[i].nodeId, g_curBoardID, BN_CMD_REGVAL);
|
||
txMsg.canTxhead.RTR = CAN_RTR_DATA; // 远程帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = CAN_DATA_LEN; // 数据场长度
|
||
memcpy(txMsg.data, g_sewHeadList[i].rdReg.cancomm.data.buff, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送远程帧
|
||
g_sewHeadList[i].exbupdateFlag = 0;
|
||
}
|
||
|
||
if (g_sewHeadList[i].refNvPara != 0)
|
||
{
|
||
txMsg.canTxhead.ExtId = MAKE_EXID(BN_PROTOCOL_SEWHD, g_sewHeadList[i].nodeId, g_curBoardID, BN_CMD_NVPARA);
|
||
txMsg.canTxhead.RTR = CAN_RTR_REMOTE; // 远程帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = 0; // 数据场长度
|
||
memset(txMsg.data, 0, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送远程帧
|
||
g_sewHeadList[i].refNvPara = 0;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
}
|
||
|
||
void ExtendBoardTask(void)
|
||
{
|
||
InputsTask();
|
||
OutputsTask();
|
||
}
|
||
|
||
//-------------------------------------------------------------------------
|
||
|
||
CoreControl * GetCoreFromList(u8 id)
|
||
{
|
||
#if (MAX_SUPPORT_CORE > 0)
|
||
if (id > 0 && id <= MAX_SUPPORT_CORE)
|
||
{
|
||
return &(g_extendCtrlList[id-1]);
|
||
}
|
||
else
|
||
#endif
|
||
{
|
||
return NULL;
|
||
}
|
||
}
|
||
|
||
HeadControl * GetHeadFromList(u8 id)
|
||
{
|
||
#if (MAX_SUPPORT_HEAD > 0)
|
||
if (id > 0 && id <= MAX_SUPPORT_HEAD+1)
|
||
{
|
||
return &(g_headList[id-1]);
|
||
}
|
||
else
|
||
#endif
|
||
{
|
||
return NULL;
|
||
}
|
||
}
|
||
|
||
ColorControl * GetColorFromList(u8 id)
|
||
{
|
||
#if (MAX_SUPPORT_COLOR > 0)
|
||
if (id > 0 && id <= MAX_SUPPORT_COLOR+1)
|
||
{
|
||
return &(g_colorList[id-1]);
|
||
}
|
||
else
|
||
#endif
|
||
{
|
||
return NULL;
|
||
}
|
||
}
|
||
|
||
ExtIOControl * GetExtIOFromList(u8 id)
|
||
{
|
||
#if (MAX_SUPPORT_EXTIO > 0)
|
||
if (id > 0 && id <= MAX_SUPPORT_EXTIO+1)
|
||
{
|
||
return &(g_extioList[id-1]);
|
||
}
|
||
else
|
||
#endif
|
||
{
|
||
return NULL;
|
||
}
|
||
}
|
||
|
||
int GetCurBoardID(void)
|
||
{
|
||
return g_curBoardID;
|
||
}
|
||
|
||
//------------------------------------------------------------------------
|
||
#if (MAX_SUPPORT_CORE > 0)
|
||
|
||
int IsNewControlCommand(void)
|
||
{
|
||
if (g_extendCtrlList[g_curBoardIdx].newcmdflag != 0)
|
||
{
|
||
printf("can data inter\r\n");
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
// 请求其他板子发送状态
|
||
void RequestExStatus(void)
|
||
{
|
||
CanTxMsg txMsg;
|
||
int i;
|
||
for (i = 0; i < MAX_SUPPORT_CORE; i++)
|
||
{
|
||
if (g_curBoardIdx != i) // 其他点的状态请求
|
||
{
|
||
txMsg.canTxhead.ExtId = g_extendCtrlList[i].staexid;
|
||
txMsg.canTxhead.RTR = CAN_RTR_REMOTE; // 远程帧
|
||
txMsg.canTxhead.IDE = CAN_ID_EXT; // 扩展帧
|
||
txMsg.canTxhead.DLC = 0; // 数据场长度
|
||
memset(txMsg.data, 0, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg); // 发送远程帧
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
//-------------------------------------------------------------------------
|
||
// 机头板协议,上位机不需要知道对应的节点ID,只需告知节点类型和机头号即可
|
||
// 换色板协议 需告知第几块板卡
|
||
// IO扩展板协议 需告知第几块板卡
|
||
void StartBoardUpdate(u8 protocol, u8 nodetype, u8 nodeid)
|
||
{
|
||
#if (MAX_SUPPORT_HEAD > 0)
|
||
if (protocol == BN_PROTOCOL_HEAD)
|
||
{
|
||
HeadControl * head = GetHeadFromList(1); // 默认广播发送
|
||
HeadControl * temp = NULL; // 临时存储
|
||
if (nodeid != 0)
|
||
{
|
||
for(int i = 1; i < MAX_SUPPORT_HEAD+1; i++)
|
||
{
|
||
temp = GetHeadFromList(i+1);
|
||
if (temp->nodeTye == nodetype)
|
||
{
|
||
if (nodeid <= 1)
|
||
{
|
||
head = temp;
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
nodeid--;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
head->rdReg.cancomm.data.rdport.portaddr = EXBOARD_UPDATE;
|
||
head->rdReg.cancomm.data.rdport.status = nodetype;
|
||
head->exbupdateFlag = 1;
|
||
}
|
||
else
|
||
#endif
|
||
#if (MAX_SUPPORT_COLOR > 0)
|
||
if (protocol == BN_PROTOCOL_COLOR)
|
||
{
|
||
ColorControl * color = GetColorFromList(nodeid+1);
|
||
color->exbupdateFlag = 1;
|
||
}
|
||
else
|
||
#endif
|
||
#if (MAX_SUPPORT_EXTIO > 0)
|
||
if (protocol == BN_PROTOCOL_EXTIO)
|
||
{
|
||
ExtIOControl * extio = GetExtIOFromList(nodeid+1);
|
||
extio->exbupdateFlag = 1;
|
||
}
|
||
else
|
||
#endif
|
||
{
|
||
}
|
||
}
|
||
|
||
// 设置外围板非易失性参数
|
||
void SetBoardNvPara(int protocolType, int nodetype, int nodeId, u8 parablockID, u8 paraID, s32 paraVal)
|
||
{
|
||
#if (MAX_SUPPORT_HEAD > 0)
|
||
if (protocolType == BN_PROTOCOL_HEAD)
|
||
{
|
||
SetHeadNvParaCmd(nodetype, nodeId, parablockID, paraID, paraVal);
|
||
}
|
||
else
|
||
#endif
|
||
#if (MAX_SUPPORT_COLOR > 0)
|
||
if (protocolType == BN_PROTOCOL_COLOR)
|
||
{
|
||
if (nodeId != 0) // 20220628 不支持广播设置,因为界面存在乱发命令的情况
|
||
{
|
||
SetColorNvParaCmd(nodeId, parablockID, paraID, paraVal);
|
||
}
|
||
}
|
||
else
|
||
#endif
|
||
{
|
||
}
|
||
}
|
||
|
||
//-------------------------------------------------------------------------
|
||
#if (MAX_SUPPORT_HEAD > 0)
|
||
|
||
// 进入遍历状态
|
||
void EnterTraverse(void)
|
||
{
|
||
memset(&g_headList[0].traCmd.cancomm.data, 0, CAN_DATA_LEN);
|
||
|
||
g_headList[0].traCmd.cancomm.data.traverse.tracmd = TRA_CMD_ENTER_TRA;
|
||
|
||
g_headList[0].traFlag = 1;
|
||
|
||
OutputsTask();
|
||
}
|
||
|
||
/* function:总线遍历
|
||
* return: 0:
|
||
* -1: 参数错误
|
||
*/
|
||
int TraverseSingleNode(u8 traNodeType, u8 traNodeId)
|
||
{
|
||
printf("traverse nodeid=%d, nodetype=%d\r\n", traNodeId, traNodeType);
|
||
|
||
memset(&g_headList[0].traCmd.cancomm.data, 0, CAN_DATA_LEN);
|
||
|
||
g_headList[0].traCmd.cancomm.data.traverse.tracmd = TRA_CMD_NODE_TRA_BEG;
|
||
g_headList[0].traCmd.cancomm.data.traverse.nodetype = traNodeType;
|
||
g_headList[0].traCmd.cancomm.data.traverse.nodeid = traNodeId;
|
||
|
||
g_headList[0].traFlag = 1;
|
||
|
||
OutputsTask();
|
||
|
||
return 0;
|
||
}
|
||
|
||
/* function:当前节点已遍历,返回确认数据包
|
||
* return: 0:
|
||
*/
|
||
int CurNodeTraverseAlready(u32 nodeid)
|
||
{
|
||
printf("nodeid %d already set\r\n", nodeid);
|
||
|
||
for(int i = 1; i < MAX_SUPPORT_HEAD+1; i++)
|
||
{
|
||
if(g_headList[i].nodeId == nodeid)
|
||
{
|
||
memset(&g_headList[i].traCmd.cancomm.data, 0, CAN_DATA_LEN);
|
||
g_headList[i].traCmd.cancomm.data.traverse.tracmd = TRA_CMD_NODE_TRA_END;
|
||
g_headList[i].traCmd.cancomm.data.traverse.nodeid = nodeid;
|
||
g_headList[i].traFlag = 1;
|
||
break;
|
||
}
|
||
}
|
||
OutputsTask();
|
||
return 0;
|
||
}
|
||
|
||
|
||
void ExitTravers() // 退出遍历
|
||
{
|
||
memset(&g_headList[0].traCmd.cancomm.data, 0, CAN_DATA_LEN);
|
||
|
||
g_headList[0].traCmd.cancomm.data.traverse.tracmd = TRA_CMD_EXIT_TRA;
|
||
g_headList[0].traFlag = 1;
|
||
|
||
OutputsTask();
|
||
|
||
printf("exit traverse\r\n");
|
||
}
|
||
|
||
//---------------------------------------------------
|
||
// 请求总线状态
|
||
void InquireBusSta(int idx)
|
||
{
|
||
memset(&g_headList[idx].traCmd.cancomm.data, 0, CAN_DATA_LEN);
|
||
|
||
g_headList[idx].traCmd.cancomm.data.traverse.tracmd = TRA_CMD_ASK_TRA_STA;
|
||
|
||
g_headList[idx].traFlag = 1;
|
||
|
||
OutputsTask();
|
||
|
||
printf("inquire bus sta, idx=%d\r\n", idx);
|
||
}
|
||
|
||
u32 GetHeadStatus(int idx)
|
||
{
|
||
u32 sta;
|
||
|
||
HeadCommand * pSta;
|
||
if (idx > 0 && idx <= MAX_SUPPORT_HEAD)
|
||
{
|
||
pSta = (HeadCommand *)( &(g_headList[idx].exbSta.cancomm.data.buff));
|
||
sta = pSta->headSta.staBits;
|
||
}
|
||
else
|
||
{
|
||
sta = 0;
|
||
}
|
||
return sta;
|
||
}
|
||
|
||
void CleanHeadStatus(int idx)
|
||
{
|
||
HeadCommand * pSta;
|
||
if (idx > 0 && idx <= MAX_SUPPORT_HEAD)
|
||
{
|
||
pSta = (HeadCommand *)( &(g_headList[idx].exbSta.cancomm.data.buff));
|
||
pSta->headSta.staBits = 0;
|
||
}
|
||
}
|
||
|
||
void RequestHeadsStatus(void)
|
||
{
|
||
RequestHeadStatus(&(g_headList[0])); // 发送广播命令
|
||
OutputsTask();
|
||
}
|
||
|
||
void RequestHeadsVersion(void)
|
||
{
|
||
RequestHeadVersion(&(g_headList[0])); // 广播询问
|
||
|
||
for(int i = 1; i < MAX_SUPPORT_HEAD+1; i++)
|
||
{
|
||
g_headList[i].regVal.rdnewbverflag = 1;
|
||
}
|
||
}
|
||
|
||
void RequestAHeadNvPara(int idx)
|
||
{
|
||
if (idx <= 0)
|
||
{
|
||
return;
|
||
}
|
||
RequestHeadNvPara(&(g_headList[idx]));
|
||
}
|
||
|
||
// 设置主轴角度
|
||
void SendHeadAngCmd(int idx, u8 para1, u16 para2, u8 para3)
|
||
{
|
||
HeadCommand ncmd;
|
||
memset(&ncmd, 0, sizeof(HeadCommand));
|
||
ncmd.setmsang.cmd = CTRL_CMD_HEAD_MSANG;
|
||
ncmd.setmsang.validFlag = para1;
|
||
ncmd.setmsang.msang = para2;
|
||
ncmd.setmsang.nodetype = para3;
|
||
SendHeadCommand(&g_headList[idx], &ncmd); // 节点命令
|
||
|
||
OutputsTask(); // 刷新输入输出
|
||
}
|
||
|
||
// 设置机头板非易失性参数
|
||
void SetHeadNvParaCmd(int nodetype, int idx, u8 parablockid, u8 paraid, s32 paraval)
|
||
{
|
||
if (idx < 0 || idx > MAX_SUPPORT_HEAD)
|
||
{
|
||
return;
|
||
}
|
||
HeadCommand ncmd;
|
||
|
||
memset(&ncmd, 0, sizeof(HeadCommand));
|
||
if (nodetype == FLAT_EMB_HEAD)
|
||
{
|
||
ncmd.headNvPara.cmd = CTRL_CMD_HEAD_NVPARA;
|
||
}
|
||
else if (nodetype == CHENILLE_HEAD)
|
||
{
|
||
ncmd.headNvPara.cmd = CTRL_CMD_CHENILLE_NVPARA;
|
||
}
|
||
else if (nodetype == COIL_HEAD)
|
||
{
|
||
ncmd.headNvPara.cmd = CTRL_CMD_COIL_NVPARA;
|
||
}
|
||
ncmd.headNvPara.parablockID = parablockid;
|
||
ncmd.headNvPara.paraID = paraid;
|
||
ncmd.headNvPara.paraval = paraval;
|
||
|
||
SendHeadCommand(&g_headList[idx], &ncmd); // 节点命令
|
||
|
||
OutputsTask(); // 刷新输入输出
|
||
}
|
||
|
||
u16 GetHeadPotValue(int idx)
|
||
{
|
||
u32 sta;
|
||
|
||
HeadCommand * pSta;
|
||
if (idx > 0 && idx <= MAX_SUPPORT_HEAD)
|
||
{
|
||
pSta = (HeadCommand *)( &(g_headList[idx].exbSta.cancomm.data.buff));
|
||
sta = pSta->headSta.potValue;
|
||
}
|
||
else
|
||
{
|
||
sta = 0;
|
||
}
|
||
return sta;
|
||
}
|
||
|
||
int GetHeadCurrentNeele(int idx)
|
||
{
|
||
u32 sta;
|
||
|
||
HeadCommand * pSta;
|
||
if (idx > 0 && idx <= MAX_SUPPORT_HEAD)
|
||
{
|
||
pSta = (HeadCommand *)( &(g_headList[idx].exbSta.cancomm.data.buff));
|
||
sta = pSta->headSta.setedNP;
|
||
}
|
||
else
|
||
{
|
||
sta = 0;
|
||
}
|
||
return sta;
|
||
}
|
||
#endif
|
||
//-------------------------------------------------------------------------
|
||
|
||
#if (MAX_SUPPORT_COLOR > 0)
|
||
|
||
void RequestColorsVersion(void)
|
||
{
|
||
RequestColorVersion(&(g_colorList[0]));
|
||
for(int i = 1; i < MAX_SUPPORT_COLOR+1; i++)
|
||
{
|
||
g_colorList[i].regVal.rdnewbverflag = 1;
|
||
}
|
||
}
|
||
|
||
void RequestAColorNvPara(int idx)
|
||
{
|
||
if (idx <= 0)
|
||
{
|
||
return;
|
||
}
|
||
|
||
RequestColorNvPara(&(g_colorList[idx]));
|
||
}
|
||
|
||
void SendColorCtrlCmd(int idx, u8 subcmd, u8 para1, u8 para2)
|
||
{
|
||
ColorCommand ncmd;
|
||
|
||
memset(&ncmd, 0, sizeof(ColorCommand));
|
||
ncmd.colorCtrl.cmd = CTRL_CMD_COLOR_CTRL;
|
||
ncmd.colorCtrl.subcmd = subcmd;
|
||
ncmd.colorCtrl.para[0] = para1;
|
||
ncmd.colorCtrl.para[1] = para2;
|
||
|
||
SendColorCommand(&g_colorList[idx], &ncmd); // 节点命令
|
||
OutputsTask(); // 刷新输入输出
|
||
}
|
||
|
||
// 设置换色板非易失性参数
|
||
void SetColorNvParaCmd(int idx, u8 parablockid, u8 paraid, s32 paraval)
|
||
{
|
||
if (idx < 0 || idx > MAX_SUPPORT_COLOR)
|
||
{
|
||
return;
|
||
}
|
||
|
||
ColorCommand ncmd;
|
||
|
||
memset(&ncmd, 0, sizeof(ColorCommand));
|
||
ncmd.colorNvPara.cmd = CTRL_CMD_COLOR_NVPARA;
|
||
ncmd.colorNvPara.parablockID = parablockid;
|
||
ncmd.colorNvPara.paraID = paraid;
|
||
ncmd.colorNvPara.paraval = paraval;
|
||
|
||
SendColorCommand(&g_colorList[idx], &ncmd); // 节点命令
|
||
OutputsTask(); // 刷新输入输出
|
||
}
|
||
|
||
void SendColorParaCmd(int idx, u8 para1)
|
||
{
|
||
ColorCommand ncmd;
|
||
memset(&ncmd, 0, sizeof(ColorCommand));
|
||
ncmd.colorPara.cmd = CTRL_CMD_COLOR_PARA;
|
||
ncmd.colorPara.needleNums = para1;
|
||
SendColorCommand(&g_colorList[idx], &ncmd); // 节点命令
|
||
OutputsTask(); // 刷新输入输出
|
||
}
|
||
|
||
void CleanColorSta(int idx)
|
||
{
|
||
memset(&(g_colorList[idx].exbSta.cancomm.data.buff), 0, CAN_DATA_LEN);
|
||
}
|
||
|
||
u16 GetColorStatus(int idx)
|
||
{
|
||
u16 sta;
|
||
ColorCommand * pSta;
|
||
pSta = (ColorCommand *)( &(g_colorList[idx].exbSta.cancomm.data.buff));
|
||
sta = pSta->colorSta.staBits;
|
||
|
||
return sta;
|
||
}
|
||
|
||
u16 GetColorPotValue(int idx)
|
||
{
|
||
u16 sta;
|
||
ColorCommand * pSta;
|
||
pSta = (ColorCommand *)( &(g_colorList[idx].exbSta.cancomm.data.buff));
|
||
sta = pSta->colorSta.potValue;
|
||
|
||
return sta;
|
||
}
|
||
|
||
int GetColorCurrentNeele(int idx)
|
||
{
|
||
int sta;
|
||
ColorCommand * pSta;
|
||
pSta = (ColorCommand *)( &(g_colorList[idx].exbSta.cancomm.data.buff));
|
||
sta = (int)pSta->colorSta.curNeedle;
|
||
|
||
return sta;
|
||
}
|
||
|
||
void RequestColorsStatus(void)
|
||
{
|
||
RequestColorStatus(&(g_colorList[0])); // 发送广播命令
|
||
OutputsTask();
|
||
}
|
||
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_EXTIO > 0)
|
||
|
||
u16 GetExtIOStatus(int idx)
|
||
{
|
||
u16 sta;
|
||
ExtIOCommand * pSta;
|
||
if (idx > 0 && idx <= MAX_SUPPORT_EXTIO)
|
||
{
|
||
pSta = (ExtIOCommand *)( &(g_extioList[idx].exbSta.cancomm.data.buff));
|
||
sta = pSta->extIOSta.inputSta;
|
||
}
|
||
else
|
||
{
|
||
sta = 0;
|
||
}
|
||
return sta;
|
||
}
|
||
|
||
void CleanExtIOStatus(int idx)
|
||
{
|
||
ExtIOCommand * pSta;
|
||
if (idx > 0 && idx <= MAX_SUPPORT_EXTIO)
|
||
{
|
||
pSta = (ExtIOCommand *)( &(g_extioList[idx].exbSta.cancomm.data.buff));
|
||
pSta->extIOSta.inputSta = 0;
|
||
}
|
||
}
|
||
|
||
void RequestExtIOsStatus(void)
|
||
{
|
||
RequestExtIOStatus(&(g_extioList[0])); // 发送广播命令
|
||
OutputsTask();
|
||
}
|
||
|
||
void RequestExtIOsVersion(void)
|
||
{
|
||
RequestExtIOVersion(&(g_extioList[0])); // 广播询问
|
||
|
||
for(int i = 1; i < MAX_SUPPORT_EXTIO+1; i++)
|
||
{
|
||
g_extioList[i].regVal.rdnewbverflag = 1;
|
||
}
|
||
}
|
||
|
||
void SetExtOutputOn(int idx, u16 bit)
|
||
{
|
||
ExtIOCommand ncmd;
|
||
memset(&ncmd, 0, sizeof(ExtIOCommand));
|
||
ncmd.extIOCtrl.cmd = CTRL_CMD_EXTIO_CTRL;
|
||
ncmd.extIOCtrl.subcmd = CTRL_SUBCMD_OUT_ON;
|
||
ncmd.extIOCtrl.outctrl = bit;
|
||
|
||
SendExtIOCommand(&g_extioList[idx], &ncmd);
|
||
OutputsTask(); // 刷新输入输出
|
||
}
|
||
|
||
void SetExtOutputOff(int idx, u16 bit)
|
||
{
|
||
ExtIOCommand ncmd;
|
||
memset(&ncmd, 0, sizeof(ExtIOCommand));
|
||
ncmd.extIOCtrl.cmd = CTRL_CMD_EXTIO_CTRL;
|
||
ncmd.extIOCtrl.subcmd = CTRL_SUBCMD_OUT_OFF;
|
||
ncmd.extIOCtrl.outctrl = bit;
|
||
|
||
SendExtIOCommand(&g_extioList[idx], &ncmd);
|
||
OutputsTask(); // 刷新输入输出
|
||
}
|
||
|
||
#endif
|
||
|
||
#if (MAX_SUPPORT_SEWHD > 0)
|
||
void RequestSewHeadsStatus(void)
|
||
{
|
||
RequestSewHeadStatus(&(g_sewHeadList[0])); // 发送广播命令
|
||
OutputsTask();
|
||
}
|
||
|
||
void RequestSewHeadsVersion(void)
|
||
{
|
||
RequestSewHeadVersion(&(g_sewHeadList[0]));
|
||
for(int i = 1; i < MAX_SUPPORT_SEWHD+1; i++)
|
||
{
|
||
g_sewHeadList[i].regVal.rdnewbverflag = 1;
|
||
}
|
||
}
|
||
|
||
void CleanSewHeadSta(int idx)
|
||
{
|
||
memset(&(g_sewHeadList[idx].exbSta.cancomm.data.buff), 0, CAN_DATA_LEN);
|
||
}
|
||
|
||
u16 GetSewHeadStatus(int idx)
|
||
{
|
||
u16 sta;
|
||
SewHeadCommand * pSta;
|
||
pSta = (SewHeadCommand *)( &(g_sewHeadList[idx].exbSta.cancomm.data.buff));
|
||
sta = pSta->headSta.staBits;
|
||
|
||
return sta;
|
||
}
|
||
|
||
void SendSewHeadCtrlCmd(int idx, u8 subcmd, u8 para1, u8 para2)
|
||
{
|
||
SewHeadCommand ncmd;
|
||
|
||
memset(&ncmd, 0, sizeof(SewHeadCommand));
|
||
ncmd.headCtrl.cmd = CTRL_CMD_SEW_HEAD_CTRL;
|
||
ncmd.headCtrl.subcmd = subcmd;
|
||
ncmd.headCtrl.para[0] = para1;
|
||
ncmd.headCtrl.para[1] = para2;
|
||
|
||
SendSewHeadCommand(&g_sewHeadList[idx], &ncmd); // 节点命令
|
||
OutputsTask(); // 刷新输入输出
|
||
}
|
||
#endif
|
||
|
||
#if (RD_HEAD_PARA_NUM > 0)
|
||
/*
|
||
* 0:接收完成且正确
|
||
* -1:接收未完成
|
||
* -2:CRC校验错误
|
||
* -3:参数错误
|
||
*/
|
||
int ReceiveBoardNvParaProc(CanRxMsg rxMsg, int id, u8 nodetype)
|
||
{
|
||
if (id < 1 || id > RD_HEAD_PARA_NUM)
|
||
{
|
||
return -3;
|
||
}
|
||
|
||
BoardFileCanCtrl * rxbuf = (BoardFileCanCtrl*)(&rxMsg.data);
|
||
int rslt = -1;
|
||
if ( rxbuf->head.sync[0] == CDP_SYNC[0] &&
|
||
rxbuf->head.sync[1] == CDP_SYNC[1] &&
|
||
rxbuf->head.sync[2] == CDP_SYNC[2] &&
|
||
1 ) // 判断是否为数据包头
|
||
{
|
||
if ((nodetype == FLAT_EMB_HEAD && rxbuf->head.pktId == 0) || // 平绣机头板参数
|
||
(nodetype == CHENILLE_HEAD && rxbuf->head.pktId == 1) || // 毛巾机头板参数
|
||
(nodetype == COIL_HEAD && rxbuf->head.pktId == 2) || // 缠绕机头板参数
|
||
(nodetype == 0 && rxbuf->head.pktId == 3) || // 毛巾换色板参数
|
||
0)
|
||
{
|
||
g_receiveEn[id-1] = 0x5A;
|
||
g_receivenum[id-1] = 0;
|
||
g_framenum[id-1] = rxbuf->head.fnum;
|
||
g_datacrc[id-1] = rxbuf->head.crc;
|
||
memset(&g_exbNvPara[id-1][0], 0, BOARD_PARA_SIZE);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (g_receiveEn[id-1] == 0x5A)
|
||
{
|
||
// 拷贝数据内容
|
||
memcpy(&g_exbNvPara[id-1][g_receivenum[id-1]*8], &rxbuf->data, CAN_DATA_LEN);
|
||
g_receivenum[id-1]++;
|
||
|
||
if (g_receivenum[id-1] == g_framenum[id-1]) // 接收完成
|
||
{
|
||
g_receiveEn[id-1] = 0;
|
||
u16 crc = CalcCrc16((u8*)(&g_exbNvPara[id-1][0]), BOARD_PARA_SIZE);
|
||
if (crc != g_datacrc[id-1])
|
||
{
|
||
rslt = -2;
|
||
}
|
||
else
|
||
{
|
||
rslt = 0;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return rslt;
|
||
}
|
||
|
||
u8* GetBoardNvPara(int id)
|
||
{
|
||
if (id < 1)
|
||
{
|
||
return NULL;
|
||
}
|
||
return (u8*)(&g_exbNvPara[id-1][0]);
|
||
}
|
||
#endif
|
||
|
||
void ParaDataFromOperToCan(u8 protocol, OperPacket * pPkt, BoardFilePacketCtrl * pBoard)
|
||
{
|
||
u32 exid = 0;
|
||
#if (MAX_SUPPORT_HEAD > 0 || MAX_SUPPORT_COLOR > 0)
|
||
int i = 0;
|
||
u8 nodeId = 0; // 0为广播
|
||
#endif
|
||
|
||
memset(pBoard, 0, sizeof(BoardFilePacketCtrl));
|
||
|
||
#if (MAX_SUPPORT_HEAD > 0)
|
||
if (protocol == BN_PROTOCOL_HEAD)
|
||
{ // 机头板协议,只需告知节点类型和相应的机头号即可,不需关心具体的节点ID
|
||
if (pPkt->boardPara.nodeId != 0)
|
||
{
|
||
int hdnm = pPkt->boardPara.nodeId; // 对应机头号
|
||
for (i = 1; i < MAX_SUPPORT_HEAD+1; i++)
|
||
{
|
||
if (g_headList[i].nodeTye == pPkt->boardPara.nodeType)
|
||
{
|
||
if (hdnm <= 1)
|
||
{
|
||
nodeId = g_headList[i].nodeId;
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
hdnm--;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (pPkt->boardPara.nodeType == FLAT_EMB_HEAD)
|
||
{
|
||
pBoard->pktHead.head.pktId = 0; // 平绣机头板参数
|
||
}
|
||
else if (pPkt->boardPara.nodeType == CHENILLE_HEAD)
|
||
{
|
||
pBoard->pktHead.head.pktId = 1; // 毛巾机头板参数
|
||
}
|
||
else if (pPkt->boardPara.nodeType == COIL_HEAD)
|
||
{
|
||
pBoard->pktHead.head.pktId = 2; // 缠绕机头板参数
|
||
}
|
||
else
|
||
{
|
||
printf("set head para, nodeType unknown\r\n"); // 20230807新增,防止界面节点类型发送错误
|
||
return;
|
||
}
|
||
}
|
||
else
|
||
#endif
|
||
#if (MAX_SUPPORT_COLOR > 0)
|
||
if (protocol == BN_PROTOCOL_COLOR)
|
||
{
|
||
u8 boardnum = pPkt->boardPara.nodeId;
|
||
if (boardnum == 0 || boardnum > MAX_SUPPORT_COLOR)
|
||
{
|
||
return; // 20220628 不再支持广播设置,防止界面乱发命令
|
||
}
|
||
nodeId = g_colorList[boardnum].nodeId;
|
||
if (boardnum == 2)
|
||
{
|
||
pBoard->pktHead.head.pktId = 3; // 毛巾换色板参数
|
||
}
|
||
}
|
||
else
|
||
#endif
|
||
{
|
||
printf("not support protocol\r\n");
|
||
return;
|
||
}
|
||
|
||
memcpy(pBoard->pktHead.head.sync, CDP_SYNC, CDPSYNC_LEN);
|
||
|
||
pBoard->pktHead.head.fnum = BOARD_PARA_SIZE/CAN_DATA_LEN;
|
||
|
||
for (int j = 0; j < pBoard->pktHead.head.fnum; j++)
|
||
{
|
||
memcpy(&pBoard->pktData[j].data, &pPkt->boardPara.exData[j*CAN_DATA_LEN], CAN_DATA_LEN);
|
||
}
|
||
|
||
pBoard->pktHead.head.crc = CalcCrc16((u8*)pBoard->pktData, BOARD_PARA_SIZE);
|
||
|
||
#if (MAX_SUPPORT_HEAD > 0)
|
||
if (protocol == BN_PROTOCOL_HEAD)
|
||
{
|
||
if (i <= MAX_SUPPORT_HEAD) // 找到对应的节点或广播
|
||
{
|
||
exid = MAKE_EXID(BN_PROTOCOL_HEAD, nodeId, g_curBoardID, BN_CMD_NVPARA);
|
||
}
|
||
}
|
||
else
|
||
#endif
|
||
#if (MAX_SUPPORT_COLOR > 0)
|
||
if (protocol == BN_PROTOCOL_COLOR)
|
||
{
|
||
exid = MAKE_EXID(BN_PROTOCOL_COLOR, nodeId, g_curBoardID, BN_CMD_NVPARA);
|
||
}
|
||
else
|
||
#endif
|
||
{
|
||
}
|
||
|
||
if (exid != 0)
|
||
{
|
||
SendPacketDataWithCanFrame(exid, pBoard);
|
||
}
|
||
}
|
||
|
||
// 用CAN数据帧的格式发送数据包
|
||
void SendPacketDataWithCanFrame(u32 exid, BoardFilePacketCtrl * pBoard)
|
||
{
|
||
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 < pBoard->pktHead.head.fnum+1; idx++)
|
||
{
|
||
memcpy(&txMsg.data, ((u8*)&pBoard->pktHead)+idx*CAN_DATA_LEN, CAN_DATA_LEN); // 填充数据场
|
||
SendACANDataPacket(&txMsg);
|
||
DelayMs(1);
|
||
}
|
||
}
|
||
|
||
s32 GetHeadPara(void)
|
||
{
|
||
return headparaval;
|
||
}
|
||
|
||
//-------------------------------------------------------------------------
|
||
|
||
|
||
//-------------------------------------------------------------------------
|
||
|
||
|
||
//-------------------------------------------------------------------------
|
||
|
||
|
||
//-------------------------------------------------------------------------
|