diff --git a/components/zcancmder/basic.hpp b/components/zcancmder/basic.hpp index fec5d3a..062206d 100644 --- a/components/zcancmder/basic.hpp +++ b/components/zcancmder/basic.hpp @@ -31,10 +31,12 @@ class CanPacketRxBuffer { uint8_t rxdata[1000] = {0}; int rxdataSize = 0; - bool dataIsReady = false; - bool isOnReceive = false; - bool isUsed = false; - bool lostpacket = false; + bool dataIsReady = false; + bool isOnReceive = false; + bool isUsed = false; + bool lostpacket = false; + bool dataIsProcessed = false; + int32_t lastrxtime = 0; public: uint16_t get_packetindex(); diff --git a/components/zcancmder/zcanreceiver_master.cpp b/components/zcancmder/zcanreceiver_master.cpp index 0e76d7a..cc6bace 100644 --- a/components/zcancmder/zcanreceiver_master.cpp +++ b/components/zcancmder/zcanreceiver_master.cpp @@ -122,7 +122,7 @@ int32_t ZCanCommnaderMaster::sendCmdAndReceiveBuf(int32_t cmdid, int32_t subModu zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff; cmdheader->packetType = kptv2_cmd; cmdheader->packetindex = generateFreeIndex(); - cmdheader->cmdMainId = MODULE_CMDID(cmdid); + cmdheader->cmdMainId = MODULE_CMDID(cmdid); cmdheader->cmdSubId = CMD_SUB_ID(cmdid); cmdheader->subModuleid = 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; cmdheader->packetType = kptv2_cmd; cmdheader->packetindex = generateFreeIndex(); - cmdheader->cmdMainId = MODULE_CMDID(cmdid); + cmdheader->cmdMainId = MODULE_CMDID(cmdid); cmdheader->cmdSubId = CMD_SUB_ID(cmdid); cmdheader->subModuleid = 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) { 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; } -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) { /** @@ -448,7 +446,12 @@ void ZCanCommnaderMaster::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *c } else { 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)) { rxbuf->m_canPacket[rxbuf->m_canPacketNum].pHeader = pHeader; @@ -459,7 +462,8 @@ void ZCanCommnaderMaster::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *c * @brief 接收满了 */ if (nframe == frameId + 1) { - rxbuf->dataIsReady = true; + rxbuf->dataIsReady = true; + rxbuf->dataIsProcessed = false; if ((rxbuf->m_canPacketNum) != rxbuf->m_npacket) rxbuf->lostpacket = true; } } @@ -484,16 +488,15 @@ void ZCanCommnaderMaster::processReadyPacket(CanPacketRxBuffer *rxbuf) { } else { callListener(rxbuf); } - rxbuf->dataIsReady = false; } void ZCanCommnaderMaster::loop() { /** * @brief MainLoop上下文 */ - 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]); + m_canPacketRxBuffer[i].dataIsProcessed = true; } } } diff --git a/components/zcancmder/zcanreceiver_master.hpp b/components/zcancmder/zcanreceiver_master.hpp index 455cf1e..7200bea 100644 --- a/components/zcancmder/zcanreceiver_master.hpp +++ b/components/zcancmder/zcanreceiver_master.hpp @@ -97,7 +97,6 @@ class ZCanCommnaderMaster : public ZCanIRQListener, public IZcanCmderMaster { void initCanPacketRxBuffer(CanPacketRxBuffer *buf, uint16_t id); CanPacketRxBuffer *allocCanPacketRxBufferInIRQ(uint16_t id); CanPacketRxBuffer *findCanPacketRxBufferInIRQ(uint16_t id); - void freeCanPacketRxBuffer(uint16_t id); void processReadyPacket(CanPacketRxBuffer *buf); }; diff --git a/components/zprotocol_helper/micro_computer_module_device_script_cmder_paser.cpp b/components/zprotocol_helper/micro_computer_module_device_script_cmder_paser.cpp index 334bef5..0467216 100644 --- a/components/zprotocol_helper/micro_computer_module_device_script_cmder_paser.cpp +++ b/components/zprotocol_helper/micro_computer_module_device_script_cmder_paser.cpp @@ -460,8 +460,14 @@ void MicroComputerModuleDeviceScriptCmderPaser::do_wait_for_module(int32_t modul * @brief */ i++; - if (i % 10 == 0) ZLOGI(TAG, "wait for module %d %d", moduleid, status); - thisThread.sleep(30); + if (i % 10 == 0) { + if (ack->ecode == 0) { + ZLOGI(TAG, "wait for module %d %d", moduleid, status); + } else { + ZLOGI(TAG, "wait for module %d err: %s(%d)", moduleid, err::error2str(ack->ecode), ack->ecode); + } + } + thisThread.sleep(100); } }