|
@ -122,7 +122,7 @@ int32_t ZCanCommnaderMaster::sendCmdAndReceiveBuf(int32_t cmdid, int32_t subModu |
|
|
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff; |
|
|
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff; |
|
|
cmdheader->packetType = kptv2_cmd; |
|
|
cmdheader->packetType = kptv2_cmd; |
|
|
cmdheader->packetindex = generateFreeIndex(); |
|
|
cmdheader->packetindex = generateFreeIndex(); |
|
|
cmdheader->cmdMainId = MODULE_CMDID(cmdid); |
|
|
|
|
|
|
|
|
cmdheader->cmdMainId = MODULE_CMDID(cmdid); |
|
|
cmdheader->cmdSubId = CMD_SUB_ID(cmdid); |
|
|
cmdheader->cmdSubId = CMD_SUB_ID(cmdid); |
|
|
cmdheader->subModuleid = subModuleid; |
|
|
cmdheader->subModuleid = subModuleid; |
|
|
// ZLOGI(TAG, "sendCmd %d %d %d %d", cmdheader->packetindex, cmdheader->cmdMainId, cmdheader->cmdSubId, cmdheader->subModuleid);
|
|
|
// ZLOGI(TAG, "sendCmd %d %d %d %d", cmdheader->packetindex, cmdheader->cmdMainId, cmdheader->cmdSubId, cmdheader->subModuleid);
|
|
@ -170,7 +170,7 @@ int32_t ZCanCommnaderMaster::sendCmd(int32_t cmdid, int32_t subModuleid, int32_t |
|
|
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff; |
|
|
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff; |
|
|
cmdheader->packetType = kptv2_cmd; |
|
|
cmdheader->packetType = kptv2_cmd; |
|
|
cmdheader->packetindex = generateFreeIndex(); |
|
|
cmdheader->packetindex = generateFreeIndex(); |
|
|
cmdheader->cmdMainId = MODULE_CMDID(cmdid); |
|
|
|
|
|
|
|
|
cmdheader->cmdMainId = MODULE_CMDID(cmdid); |
|
|
cmdheader->cmdSubId = CMD_SUB_ID(cmdid); |
|
|
cmdheader->cmdSubId = CMD_SUB_ID(cmdid); |
|
|
cmdheader->subModuleid = subModuleid; |
|
|
cmdheader->subModuleid = subModuleid; |
|
|
// ZLOGI(TAG, "sendCmd %d %d %d %d", cmdheader->packetindex, cmdheader->cmdMainId, cmdheader->cmdSubId, cmdheader->subModuleid);
|
|
|
// ZLOGI(TAG, "sendCmd %d %d %d %d", cmdheader->packetindex, cmdheader->cmdMainId, cmdheader->cmdSubId, cmdheader->subModuleid);
|
|
@ -381,12 +381,18 @@ void ZCanCommnaderMaster::initCanPacketRxBuffer(CanPacketRxBuffer *buf, uint16_t |
|
|
|
|
|
|
|
|
CanPacketRxBuffer *ZCanCommnaderMaster::allocCanPacketRxBufferInIRQ(uint16_t id) { |
|
|
CanPacketRxBuffer *ZCanCommnaderMaster::allocCanPacketRxBufferInIRQ(uint16_t id) { |
|
|
for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) { |
|
|
for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) { |
|
|
if (m_canPacketRxBuffer[i].isUsed && m_canPacketRxBuffer[i].id == id) { |
|
|
|
|
|
// 说明当前id的缓存已经存在,但由于丢包数据灭有收集满
|
|
|
|
|
|
if (!m_canPacketRxBuffer[i].dataIsReady) { |
|
|
|
|
|
initCanPacketRxBuffer(&m_canPacketRxBuffer[i], id); |
|
|
|
|
|
m_canPacketRxBuffer[i].isUsed = true; |
|
|
|
|
|
return &m_canPacketRxBuffer[i]; |
|
|
|
|
|
|
|
|
CanPacketRxBuffer *packetbuf = &m_canPacketRxBuffer[i]; |
|
|
|
|
|
if (packetbuf->dataIsReady) { |
|
|
|
|
|
// 等待等待处理完成后释放
|
|
|
|
|
|
if (packetbuf->dataIsProcessed) packetbuf->isUsed = false; |
|
|
|
|
|
} else { |
|
|
|
|
|
// 数据已经开始接收,但超时未处理,回收buffer
|
|
|
|
|
|
if (packetbuf->isUsed && zos_haspassedms(packetbuf->lastrxtime) > 100) { |
|
|
|
|
|
packetbuf->isUsed = false; |
|
|
|
|
|
} |
|
|
|
|
|
// 数据开始接收了,但又收到了0号包,回收buffer
|
|
|
|
|
|
if (packetbuf->isUsed && id == packetbuf->id) { |
|
|
|
|
|
packetbuf->isUsed = false; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -408,14 +414,6 @@ CanPacketRxBuffer *ZCanCommnaderMaster::findCanPacketRxBufferInIRQ(uint16_t id) |
|
|
} |
|
|
} |
|
|
return nullptr; |
|
|
return nullptr; |
|
|
} |
|
|
} |
|
|
void ZCanCommnaderMaster::freeCanPacketRxBuffer(uint16_t id) { |
|
|
|
|
|
for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) { |
|
|
|
|
|
if (m_canPacketRxBuffer[i].isUsed && m_canPacketRxBuffer[i].id == id) { |
|
|
|
|
|
m_canPacketRxBuffer[i].isUsed = false; |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void ZCanCommnaderMaster::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandle) { |
|
|
void ZCanCommnaderMaster::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandle) { |
|
|
/**
|
|
|
/**
|
|
@ -448,7 +446,12 @@ void ZCanCommnaderMaster::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *c |
|
|
} else { |
|
|
} else { |
|
|
rxbuf = findCanPacketRxBufferInIRQ(from); |
|
|
rxbuf = findCanPacketRxBufferInIRQ(from); |
|
|
} |
|
|
} |
|
|
if (!rxbuf) return; |
|
|
|
|
|
|
|
|
if (!rxbuf) { |
|
|
|
|
|
ZLOGE(TAG, "board[%d] packetId[%d] find rx buff fail", from, frameId); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
rxbuf->lastrxtime = zos_get_tick(); |
|
|
|
|
|
|
|
|
if (rxbuf->m_canPacketNum < ZARRAY_SIZE(rxbuf->m_canPacket)) { |
|
|
if (rxbuf->m_canPacketNum < ZARRAY_SIZE(rxbuf->m_canPacket)) { |
|
|
rxbuf->m_canPacket[rxbuf->m_canPacketNum].pHeader = pHeader; |
|
|
rxbuf->m_canPacket[rxbuf->m_canPacketNum].pHeader = pHeader; |
|
@ -459,7 +462,8 @@ void ZCanCommnaderMaster::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *c |
|
|
* @brief 接收满了 |
|
|
* @brief 接收满了 |
|
|
*/ |
|
|
*/ |
|
|
if (nframe == frameId + 1) { |
|
|
if (nframe == frameId + 1) { |
|
|
rxbuf->dataIsReady = true; |
|
|
|
|
|
|
|
|
rxbuf->dataIsReady = true; |
|
|
|
|
|
rxbuf->dataIsProcessed = false; |
|
|
if ((rxbuf->m_canPacketNum) != rxbuf->m_npacket) rxbuf->lostpacket = true; |
|
|
if ((rxbuf->m_canPacketNum) != rxbuf->m_npacket) rxbuf->lostpacket = true; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -484,16 +488,15 @@ void ZCanCommnaderMaster::processReadyPacket(CanPacketRxBuffer *rxbuf) { |
|
|
} else { |
|
|
} else { |
|
|
callListener(rxbuf); |
|
|
callListener(rxbuf); |
|
|
} |
|
|
} |
|
|
rxbuf->dataIsReady = false; |
|
|
|
|
|
} |
|
|
} |
|
|
void ZCanCommnaderMaster::loop() { |
|
|
void ZCanCommnaderMaster::loop() { |
|
|
/**
|
|
|
/**
|
|
|
* @brief MainLoop上下文 |
|
|
* @brief MainLoop上下文 |
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) { |
|
|
for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) { |
|
|
if (m_canPacketRxBuffer[i].isUsed && m_canPacketRxBuffer[i].dataIsReady) { |
|
|
|
|
|
|
|
|
if (m_canPacketRxBuffer[i].isUsed && m_canPacketRxBuffer[i].dataIsReady && !m_canPacketRxBuffer[i].dataIsProcessed) { |
|
|
processReadyPacket(&m_canPacketRxBuffer[i]); |
|
|
processReadyPacket(&m_canPacketRxBuffer[i]); |
|
|
|
|
|
m_canPacketRxBuffer[i].dataIsProcessed = true; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|