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

2248 lines
72 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------