From 78ca69f44549db8ec9b8feb82a8263d666ca3ccc Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 27 Oct 2023 19:55:44 +0800 Subject: [PATCH] update --- components/zcancmder/zcanreceiver.cpp | 5 +-- components/zcancmder/zcanreceiver.hpp | 2 +- components/zcancmder/zcanreceiver_master.cpp | 48 +++++++++++++++++++++++++++- components/zcancmder/zcanreceiver_master.hpp | 3 +- components/zprotocols/zcancmder_v2 | 2 +- 5 files changed, 54 insertions(+), 6 deletions(-) diff --git a/components/zcancmder/zcanreceiver.cpp b/components/zcancmder/zcanreceiver.cpp index 5ac953a..aa1303c 100644 --- a/components/zcancmder/zcanreceiver.cpp +++ b/components/zcancmder/zcanreceiver.cpp @@ -173,8 +173,9 @@ void ZCanCmder::sendStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, s sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len); } #endif -int32_t ZCanCmder::sendAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) { - zlock_guard l(m_lock); +int32_t ZCanCmder::sendBufAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) { + zlock_guard l(m_lock); + ZASSERT(sizeof(txbuff) > sizeof(zcr_cmd_header_t) + len); zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff; memcpy(txheader, rx_cmd_header, sizeof(zcr_cmd_header_t)); txheader->packetType = kptv2_ack; diff --git a/components/zcancmder/zcanreceiver.hpp b/components/zcancmder/zcanreceiver.hpp index ea66a9e..3792cb8 100644 --- a/components/zcancmder/zcanreceiver.hpp +++ b/components/zcancmder/zcanreceiver.hpp @@ -71,7 +71,7 @@ class ZCanCmder : public ZCanIRQListener, public IZCanCmder { void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; } virtual void registerListener(IZcanCmderListener *listener) override; - virtual int32_t sendAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) override; + virtual int32_t sendBufAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) override; virtual int32_t sendAck(zcr_cmd_header_t *rx_cmd_header, int32_t *ackvar, int32_t nack) override; virtual int32_t sendErrorAck(zcr_cmd_header_t *rx_cmd_header, int32_t errorcode) override; diff --git a/components/zcancmder/zcanreceiver_master.cpp b/components/zcancmder/zcanreceiver_master.cpp index 06122ec..7f8ac7e 100644 --- a/components/zcancmder/zcanreceiver_master.cpp +++ b/components/zcancmder/zcanreceiver_master.cpp @@ -118,6 +118,53 @@ HAL_StatusTypeDef ZCanCommnaderMaster::initializeFilter() { ZLOGI(TAG, "HAL_CAN_ConfigFilter filterID1 %08x", filterId >> 3); return HAL_Status; } +int32_t ZCanCommnaderMaster::sendCmdAndReceiveBuf(int32_t cmdid, int32_t submoduleid, int32_t *param, size_t npara, uint8_t *ack, int32_t *rxsize, int overtime_ms) { + zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff; + cmdheader->packetType = kptv2_cmd; + cmdheader->packetindex = generateFreeIndex(); + cmdheader->cmdmoduleid = MODULE_CMDID(cmdid); + cmdheader->subcmdid = SUBCMDID(cmdid); + cmdheader->submoduleid = submoduleid; + // ZLOGI(TAG, "sendCmd %d %d %d %d", cmdheader->packetindex, cmdheader->cmdmoduleid, cmdheader->subcmdid, cmdheader->submoduleid); + int32_t *sendparam = (int32_t *)cmdheader->data; + for (size_t i = 0; i < npara; i++) { + sendparam[i] = param[i]; + } + int32_t txlen = sizeof(zcr_cmd_header_t) + npara * sizeof(int32_t); + + // 注册监听者 + bool rxdataIsReady = false; + int32_t errocode = 0; + regListener(cmdheader->packetindex, [this, &rxdataIsReady, &ack, &rxsize, &errocode](CanPacketRxBuffer *report) { + if (report->get_cmdheader()->packetType == kptv2_error_ack) { + auto *error_ack = report->get_data_as(); + errocode = *error_ack; + } else if (*rxsize < report->get_datalen()) { + errocode = err::kbuffer_not_enough; + } else { + *rxsize = report->get_datalen(); + memcpy(ack, report->get_data(), *rxsize); + } + rxdataIsReady = true; + }); + + // 发送消息 + sendPacket(txbuff, txlen); + + // 等待回执 + uint32_t enterticket = zos_get_tick(); + while (!rxdataIsReady) { + if (zos_haspassedms(enterticket) > (uint32_t)overtime_ms) { + ZLOGE(TAG, "sendPacketBlock timeout"); + unregListener(cmdheader->packetindex); + return err::kovertime; + } + osDelay(1); + } + unregListener(cmdheader->packetindex); + + return errocode; +} 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; @@ -143,7 +190,6 @@ int32_t ZCanCommnaderMaster::sendCmd(int32_t cmdid, int32_t submoduleid, int32_t // ZLOGI(TAG, "...................................."); if (report->get_cmdheader()->packetType == kptv2_error_ack) { auto *error_ack = report->get_data_as(); - errocode = *error_ack; // ZLOGI(TAG, "error_ack %d %s", *error_ack, err::error2str(*error_ack)); } else { diff --git a/components/zcancmder/zcanreceiver_master.hpp b/components/zcancmder/zcanreceiver_master.hpp index 97eef5e..ff909ad 100644 --- a/components/zcancmder/zcanreceiver_master.hpp +++ b/components/zcancmder/zcanreceiver_master.hpp @@ -64,8 +64,9 @@ class ZCanCommnaderMaster : public ZCanIRQListener, public IZcanCmderMaster { CFG *createCFG(); void init(CFG *cfg); - void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; } + void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; } virtual int32_t sendCmd(int32_t cmdid, int32_t moduleid, int32_t *param, size_t npara, int32_t *ack, size_t nack, int overtime_ms) override; + 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; public: virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can); diff --git a/components/zprotocols/zcancmder_v2 b/components/zprotocols/zcancmder_v2 index 481aede..4aed09f 160000 --- a/components/zprotocols/zcancmder_v2 +++ b/components/zprotocols/zcancmder_v2 @@ -1 +1 @@ -Subproject commit 481aede1a713fc1e3a12d91970ee9aea6d722d7d +Subproject commit 4aed09f7ae4d1a12628abf0ef81e6a3ae88909c2