|
@ -45,9 +45,9 @@ void ZCanReceiver::initialize(CFG *cfg) { |
|
|
/**
|
|
|
/**
|
|
|
* @brief 初始化消息接收buf |
|
|
* @brief 初始化消息接收buf |
|
|
*/ |
|
|
*/ |
|
|
m_canPacketRxBuffer[0].dataIsReady = false; |
|
|
|
|
|
m_canPacketRxBuffer[0].id = 0; // 只接收来自主机的消息
|
|
|
|
|
|
m_canPacketRxBuffer[0].m_canPacketNum = 0; |
|
|
|
|
|
|
|
|
m_rxFrameBuffer.dataIsReady = false; |
|
|
|
|
|
m_rxFrameBuffer.id = 0; // 只接收来自主机的消息
|
|
|
|
|
|
m_rxFrameBuffer.canPacketNum = 0; |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* @brief 初始化过滤器 |
|
|
* @brief 初始化过滤器 |
|
@ -94,10 +94,11 @@ HAL_StatusTypeDef ZCanReceiver::initializeFilter() { |
|
|
sFilterConfig.SlaveStartFilterBank = m_config->maxFilterNum; // slave filter start index
|
|
|
sFilterConfig.SlaveStartFilterBank = m_config->maxFilterNum; // slave filter start index
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
/*******************************************************************************
|
|
|
* 接收所有消息 * |
|
|
|
|
|
|
|
|
* 直接收来自主机的消息 * |
|
|
*******************************************************************************/ |
|
|
*******************************************************************************/ |
|
|
filterId = (0); //
|
|
|
filterId = (0); //
|
|
|
mask = (0); //
|
|
|
mask = (0); //
|
|
|
|
|
|
mask = (0xffffffff); //
|
|
|
sFilterConfig.FilterBank = m_config->canFilterIndex0; //
|
|
|
sFilterConfig.FilterBank = m_config->canFilterIndex0; //
|
|
|
sFilterConfig.FilterMaskIdLow = mask & 0xffff; //
|
|
|
sFilterConfig.FilterMaskIdLow = mask & 0xffff; //
|
|
|
sFilterConfig.FilterMaskIdHigh = (mask & 0xffff0000) >> 16; //
|
|
|
sFilterConfig.FilterMaskIdHigh = (mask & 0xffff0000) >> 16; //
|
|
@ -123,6 +124,7 @@ void ZCanReceiver::registerListener(IZCanReceiverListener *listener) { m_listene |
|
|
// return buf;
|
|
|
// return buf;
|
|
|
// }
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
static const char *hex2str(const char *hex, size_t len) __attribute__((unused)); |
|
|
static const char *hex2str(const char *hex, size_t len) { |
|
|
static const char *hex2str(const char *hex, size_t len) { |
|
|
static char buf[256]; |
|
|
static char buf[256]; |
|
|
memset(buf, 0, sizeof(buf)); |
|
|
memset(buf, 0, sizeof(buf)); |
|
@ -291,7 +293,6 @@ void ZCanReceiver::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandl |
|
|
/**
|
|
|
/**
|
|
|
* @brief 中断上下文 |
|
|
* @brief 中断上下文 |
|
|
*/ |
|
|
*/ |
|
|
// ZLOG_INFO("%s\n", __FUNCTION__);
|
|
|
|
|
|
if (canHandle != m_config->canHandle) { |
|
|
if (canHandle != m_config->canHandle) { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
@ -300,14 +301,14 @@ void ZCanReceiver::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandl |
|
|
*/ |
|
|
*/ |
|
|
CAN_RxHeaderTypeDef pHeader; |
|
|
CAN_RxHeaderTypeDef pHeader; |
|
|
uint8_t aData[8] = {0}; |
|
|
uint8_t aData[8] = {0}; |
|
|
CanPacketRxBuffer *rxbuf = &m_canPacketRxBuffer[0]; |
|
|
|
|
|
|
|
|
// CanPacketRxBuffer *rxbuf = &m_canPacketRxBuffer;
|
|
|
while (getRxMessage(&pHeader, aData)) { |
|
|
while (getRxMessage(&pHeader, aData)) { |
|
|
// 过滤掉非标准帧和远程帧,和DLC为0的帧
|
|
|
// 过滤掉非标准帧和远程帧,和DLC为0的帧
|
|
|
if (pHeader.RTR != CAN_RTR_DATA || pHeader.IDE != CAN_ID_STD) continue; |
|
|
if (pHeader.RTR != CAN_RTR_DATA || pHeader.IDE != CAN_ID_STD) continue; |
|
|
if (pHeader.DLC == 0) continue; |
|
|
if (pHeader.DLC == 0) continue; |
|
|
|
|
|
|
|
|
// 上次接收到的消息还没有来的急处理
|
|
|
// 上次接收到的消息还没有来的急处理
|
|
|
if (rxbuf->dataIsReady) continue; |
|
|
|
|
|
|
|
|
if (m_rxFrameBuffer.dataIsReady) continue; |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* @brief 处理接收到的数据 |
|
|
* @brief 处理接收到的数据 |
|
@ -318,29 +319,29 @@ void ZCanReceiver::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandl |
|
|
uint8_t frameoff = (aData[0] & 0x0F); |
|
|
uint8_t frameoff = (aData[0] & 0x0F); |
|
|
|
|
|
|
|
|
// 只接收来自主机的消息
|
|
|
// 只接收来自主机的消息
|
|
|
if (from != rxbuf->id) continue; |
|
|
|
|
|
|
|
|
if (from != m_rxFrameBuffer.id) continue; |
|
|
|
|
|
|
|
|
// 当frameoff==0,重置接收缓存
|
|
|
// 当frameoff==0,重置接收缓存
|
|
|
if (frameoff == 0) { |
|
|
if (frameoff == 0) { |
|
|
rxbuf->m_canPacketNum = 0; |
|
|
|
|
|
|
|
|
m_rxFrameBuffer.canPacketNum = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 当接收到非期望frameoff的数据时,说明发生了丢包,重置接收缓存
|
|
|
// 当接收到非期望frameoff的数据时,说明发生了丢包,重置接收缓存
|
|
|
if (rxbuf->m_canPacketNum != frameoff) { |
|
|
|
|
|
rxbuf->m_canPacketNum = 0; |
|
|
|
|
|
|
|
|
if (m_rxFrameBuffer.canPacketNum != frameoff) { |
|
|
|
|
|
m_rxFrameBuffer.canPacketNum = 0; |
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 接收到有效包
|
|
|
// 接收到有效包
|
|
|
if (rxbuf->m_canPacketNum < ZARRAY_SIZE(rxbuf->m_canPacket)) { |
|
|
|
|
|
rxbuf->m_canPacket[rxbuf->m_canPacketNum].dlc = pHeader.DLC; |
|
|
|
|
|
memcpy(rxbuf->m_canPacket[rxbuf->m_canPacketNum].aData, aData, 8); |
|
|
|
|
|
rxbuf->m_canPacketNum++; |
|
|
|
|
|
|
|
|
if (m_rxFrameBuffer.canPacketNum < ZARRAY_SIZE(m_rxFrameBuffer.canPacket)) { |
|
|
|
|
|
m_rxFrameBuffer.canPacket[m_rxFrameBuffer.canPacketNum].dlc = pHeader.DLC; |
|
|
|
|
|
memcpy(m_rxFrameBuffer.canPacket[m_rxFrameBuffer.canPacketNum].aData, aData, 8); |
|
|
|
|
|
m_rxFrameBuffer.canPacketNum++; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (nframe == frameoff + 1) { |
|
|
if (nframe == frameoff + 1) { |
|
|
rxbuf->m_npacket = nframe; |
|
|
|
|
|
rxbuf->dataIsReady = true; |
|
|
|
|
|
|
|
|
m_rxFrameBuffer.npacket = nframe; |
|
|
|
|
|
m_rxFrameBuffer.dataIsReady = true; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -352,29 +353,45 @@ void ZCanReceiver::STM32_HAL_onCAN_Error(CAN_HandleTypeDef *canHandle) { |
|
|
} |
|
|
} |
|
|
ZLOGE(TAG, "onCAN_Error\r\n"); |
|
|
ZLOGE(TAG, "onCAN_Error\r\n"); |
|
|
} |
|
|
} |
|
|
void ZCanReceiver::loop() { |
|
|
|
|
|
CanPacketRxBuffer *rxbuf = &m_canPacketRxBuffer[0]; |
|
|
|
|
|
if (rxbuf->dataIsReady) { |
|
|
|
|
|
if (rxbuf->m_canPacketNum != rxbuf->m_npacket) { |
|
|
|
|
|
ZLOGE(TAG, "lost packet"); |
|
|
|
|
|
} else { |
|
|
|
|
|
int dataoff = 0; |
|
|
|
|
|
for (size_t i = 0; i < rxbuf->m_canPacketNum; i++) { |
|
|
|
|
|
if (rxbuf->m_canPacket[i].dlc == 0) continue; |
|
|
|
|
|
|
|
|
|
|
|
memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData + 1, rxbuf->m_canPacket[i].dlc - 1); |
|
|
|
|
|
dataoff += rxbuf->m_canPacket[i].dlc - 1; |
|
|
|
|
|
} |
|
|
|
|
|
rxbuf->rxdataSize = dataoff; |
|
|
|
|
|
// ZLOGI(TAG,"rx packet");
|
|
|
|
|
|
for (auto &var : m_listenerList) { |
|
|
|
|
|
if (var) var->onRceivePacket(rxbuf->get_cmdheader(), rxbuf->get_rx_raw_len()); |
|
|
|
|
|
|
|
|
void ZCanReceiver::processRx() { |
|
|
|
|
|
auto *rxbuf = &m_rxFrameBuffer; |
|
|
|
|
|
if (!rxbuf->dataIsReady) return; |
|
|
|
|
|
|
|
|
|
|
|
if (rxbuf->canPacketNum != rxbuf->npacket) { |
|
|
|
|
|
ZLOGE(TAG, "lost packet"); |
|
|
|
|
|
rxbuf->canPacketNum = 0; |
|
|
|
|
|
rxbuf->npacket = 0; |
|
|
|
|
|
rxbuf->dataIsReady = false; |
|
|
|
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
// !处理接收到的数据!
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
// 拷贝接收到的数据到processbuf中
|
|
|
|
|
|
uint8_t *processbuf = m_rxPacketProcessBuf; |
|
|
|
|
|
int32_t processlen = 0; |
|
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < rxbuf->canPacketNum; i++) { |
|
|
|
|
|
if (rxbuf->canPacket[i].dlc == 0) continue; |
|
|
|
|
|
memcpy(processbuf + processlen, rxbuf->canPacket[i].aData + 1, rxbuf->canPacket[i].dlc - 1); |
|
|
|
|
|
processlen += rxbuf->canPacket[i].dlc - 1; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 重新开始接收CAN总线上的数据
|
|
|
rxbuf->dataIsReady = false; |
|
|
rxbuf->dataIsReady = false; |
|
|
|
|
|
rxbuf->canPacketNum = 0; |
|
|
|
|
|
rxbuf->npacket = 0; |
|
|
|
|
|
|
|
|
|
|
|
// 处理接收到的数据
|
|
|
|
|
|
for (auto &var : m_listenerList) { |
|
|
|
|
|
if (var) var->onRceivePacket((zcr_cmd_header_t *)processbuf, processlen); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void ZCanReceiver::loop() { processRx(); } |
|
|
HAL_StatusTypeDef ZCanReceiver::activateRxIT() { |
|
|
HAL_StatusTypeDef ZCanReceiver::activateRxIT() { |
|
|
HAL_StatusTypeDef hal_status = HAL_ERROR; |
|
|
HAL_StatusTypeDef hal_status = HAL_ERROR; |
|
|
if (m_config->rxfifoNum == CAN_RX_FIFO0) { |
|
|
if (m_config->rxfifoNum == CAN_RX_FIFO0) { |
|
|