From 4da6d69b36806e4ce39fa39dc6c9ec152772ec13 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 28 Nov 2023 17:31:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=86=85=E5=AD=98=E4=BD=BF?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/zcancmder/basic.hpp | 5 +++-- components/zcancmder/zcanreceiver.cpp | 6 +++--- components/zcancmder/zcanreceiver_master.cpp | 13 ++++++++++--- components/zcancmder/zcanreceiver_master.hpp | 7 +++++++ components/zprotocols/zcancmder_v2 | 2 +- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/components/zcancmder/basic.hpp b/components/zcancmder/basic.hpp index 062206d..9fc91ab 100644 --- a/components/zcancmder/basic.hpp +++ b/components/zcancmder/basic.hpp @@ -15,8 +15,9 @@ typedef enum { } packet_type_t; typedef struct { - CAN_RxHeaderTypeDef pHeader; - uint8_t aData[8]; /*8byte table*/ + // CAN_RxHeaderTypeDef pHeader; + uint8_t dlc; + uint8_t aData[8]; /*8byte table*/ } CANPacket; }; // namespace zcr diff --git a/components/zcancmder/zcanreceiver.cpp b/components/zcancmder/zcanreceiver.cpp index d982cdc..d6905e5 100644 --- a/components/zcancmder/zcanreceiver.cpp +++ b/components/zcancmder/zcanreceiver.cpp @@ -322,7 +322,7 @@ void ZCanCmder::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandle) } if (rxbuf->m_canPacketNum < 255) { - rxbuf->m_canPacket[rxbuf->m_canPacketNum].pHeader = pHeader; + rxbuf->m_canPacket[rxbuf->m_canPacketNum].dlc = pHeader.DLC; memcpy(rxbuf->m_canPacket[rxbuf->m_canPacketNum].aData, aData, 8); rxbuf->m_canPacketNum++; } @@ -344,8 +344,8 @@ void ZCanCmder::loop() { if (rxbuf->dataIsReady) { int dataoff = 0; for (size_t i = 0; i < rxbuf->m_canPacketNum; i++) { - memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData, rxbuf->m_canPacket[i].pHeader.DLC); - dataoff += rxbuf->m_canPacket[i].pHeader.DLC; + memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData, rxbuf->m_canPacket[i].dlc); + dataoff += rxbuf->m_canPacket[i].dlc; } rxbuf->rxdataSize = dataoff; diff --git a/components/zcancmder/zcanreceiver_master.cpp b/components/zcancmder/zcanreceiver_master.cpp index cc6bace..eaa4171 100644 --- a/components/zcancmder/zcanreceiver_master.cpp +++ b/components/zcancmder/zcanreceiver_master.cpp @@ -166,6 +166,9 @@ int32_t ZCanCommnaderMaster::sendCmdAndReceiveBuf(int32_t cmdid, int32_t subModu return errocode; } +void ZCanCommnaderMaster::sendRawPacket(uint8_t *packet, size_t len) { sendPacket(packet, len); } +void ZCanCommnaderMaster::regRawPacketListener(rawpacket_t rawpacketcb) { m_rawpacketcb = rawpacketcb; } + int32_t ZCanCommnaderMaster::sendCmd(int32_t cmdid, int32_t subModuleid, int32_t *param, size_t npara, int32_t *ack, size_t nack, int overtime_ms) { zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff; cmdheader->packetType = kptv2_cmd; @@ -263,6 +266,10 @@ bool ZCanCommnaderMaster::isListenerReg(uint16_t index) { void ZCanCommnaderMaster::callListener(CanPacketRxBuffer *report) { uint16_t index = report->get_cmdheader()->packetindex; + if (m_rawpacketcb) { + m_rawpacketcb(report->get_data(), report->get_datalen()); + } + if (report->get_cmdheader()->packetType == kptv2_ack || report->get_cmdheader()->packetType == kptv2_error_ack) { zlock_guard l(m_on_packet_map_lock); auto it = m_on_packet_map.find(index); @@ -454,7 +461,7 @@ void ZCanCommnaderMaster::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *c rxbuf->lastrxtime = zos_get_tick(); if (rxbuf->m_canPacketNum < ZARRAY_SIZE(rxbuf->m_canPacket)) { - rxbuf->m_canPacket[rxbuf->m_canPacketNum].pHeader = pHeader; + rxbuf->m_canPacket[rxbuf->m_canPacketNum].dlc = pHeader.DLC; memcpy(rxbuf->m_canPacket[rxbuf->m_canPacketNum].aData, aData, 8); rxbuf->m_canPacketNum++; } @@ -479,8 +486,8 @@ void ZCanCommnaderMaster::STM32_HAL_onCAN_Error(CAN_HandleTypeDef *canHandle) { void ZCanCommnaderMaster::processReadyPacket(CanPacketRxBuffer *rxbuf) { int dataoff = 0; for (size_t i = 0; i < rxbuf->m_canPacketNum; i++) { - memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData, rxbuf->m_canPacket[i].pHeader.DLC); - dataoff += rxbuf->m_canPacket[i].pHeader.DLC; + memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData, rxbuf->m_canPacket[i].dlc); + dataoff += rxbuf->m_canPacket[i].dlc; rxbuf->rxdataSize = dataoff; } if (rxbuf->lostpacket) { diff --git a/components/zcancmder/zcanreceiver_master.hpp b/components/zcancmder/zcanreceiver_master.hpp index 7200bea..0f02035 100644 --- a/components/zcancmder/zcanreceiver_master.hpp +++ b/components/zcancmder/zcanreceiver_master.hpp @@ -17,6 +17,8 @@ class ZCanCommnaderMasterListener { zcan_commnader_master_onpacket_t on_ack; }; +typedef function rawpacket_t; + class ZCanCommnaderMaster : public ZCanIRQListener, public IZcanCmderMaster { public: class CFG { @@ -58,6 +60,8 @@ class ZCanCommnaderMaster : public ZCanIRQListener, public IZcanCmderMaster { uint16_t m_index_off = 0; onpacket_t m_on_event; + rawpacket_t m_rawpacketcb = nullptr; + zmutex txlock; public: @@ -70,6 +74,9 @@ class ZCanCommnaderMaster : public ZCanIRQListener, public IZcanCmderMaster { virtual int32_t sendCmdAndReceiveBuf(int32_t cmdid, int32_t moduleid, int32_t *param, size_t npara, uint8_t *ack, int32_t *rxsize, int overtime_ms) override; virtual void regEventPacketListener(onpacket_t on_event) override; + void sendRawPacket(uint8_t *packet, size_t len); + void regRawPacketListener(rawpacket_t rawpacketcb); + public: virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can); virtual void STM32_HAL_onCAN_Error(CAN_HandleTypeDef *can); diff --git a/components/zprotocols/zcancmder_v2 b/components/zprotocols/zcancmder_v2 index 445108a..222df2f 160000 --- a/components/zprotocols/zcancmder_v2 +++ b/components/zprotocols/zcancmder_v2 @@ -1 +1 @@ -Subproject commit 445108a21644b9b770452e7f463615e248f5c504 +Subproject commit 222df2f465a817d54f5d0589d167ac3690c5716e