From f1fb3a5ee54939b3e7f8d5d7bb85e1107d5d13a3 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 5 Aug 2024 19:34:07 +0800 Subject: [PATCH] update --- src/protocol/zfpga_commander/zfpga_commander.cpp | 22 +++++++++++++-------- src/protocol/zfpga_commander/zfpga_commander.hpp | 25 ++++++++++++++++-------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/protocol/zfpga_commander/zfpga_commander.cpp b/src/protocol/zfpga_commander/zfpga_commander.cpp index 31664b2..7a6c41d 100644 --- a/src/protocol/zfpga_commander/zfpga_commander.cpp +++ b/src/protocol/zfpga_commander/zfpga_commander.cpp @@ -170,7 +170,9 @@ void ZFPGACommander::resetRxContext(int32_t cmdIndex) { m_rxReceiptContext.receiptLen = 0; } -void ZFPGACommander::sendPacket(zaf_packet_header_t *packet, uint32_t len, uint32_t overtime) { +shared_ptr ZFPGACommander::sendPacket(zaf_packet_header_t *packet, uint32_t len, uint32_t overtime) { + lock_guard lock(m_tx_lock); + zaf_packet_header_t *rxpacket = (zaf_packet_header_t *)&m_rxReceiptContext.receipt[0]; resetRxContext(packet->index); @@ -199,7 +201,9 @@ void ZFPGACommander::sendPacket(zaf_packet_header_t *packet, uint32_t len, uint3 if (rxpacket->data[0] != 0) { throw zexception(rxpacket->data[0], zaf_ecode_to_string((zaf_error_code_t)rxpacket->data[0])); } else { - return; + shared_ptr receipt; + receipt.reset(new Receipt(m_rxReceiptContext.receipt, m_rxReceiptContext.receiptLen)); + return receipt; } } else { } @@ -207,9 +211,10 @@ void ZFPGACommander::sendPacket(zaf_packet_header_t *packet, uint32_t len, uint3 throw zexception(ke_overtime, "overtime"); } -zaf_packet_header_t *ZFPGACommander::getReceipt() { return (zaf_packet_header_t *)&(m_rxReceiptContext.receipt[0]); } - void ZFPGACommander::writeReg(uint32_t regadd, uint32_t regvalue, uint32_t ®backvalue, int32_t overtime_ms) { + lock_guard lock(m_tx_lock); + + Reginfo *reg = GetRegInfo(regadd); if (reg->flag & kreg_flag_force_write) { @@ -224,6 +229,9 @@ void ZFPGACommander::writeReg(uint32_t regadd, uint32_t regvalue, uint32_t ®b return; } void ZFPGACommander::readReg(uint32_t regadd, uint32_t ®value, int32_t overtime_ms) { + lock_guard lock(m_tx_lock); + + Reginfo *reg = GetRegInfo(regadd); if ((reg->flag & kreg_flag_force_read)) { @@ -239,7 +247,6 @@ void ZFPGACommander::readReg(uint32_t regadd, uint32_t ®value, int32_t overti void ZFPGACommander::_writeReg(uint32_t regadd, uint32_t regvalue, uint32_t ®backvalue, int32_t overtime_ms) { // - lock_guard lock(m_tx_lock); uint8_t txdata[128] = {0}; @@ -267,8 +274,6 @@ void ZFPGACommander::_writeReg(uint32_t regadd, uint32_t regvalue, uint32_t ® regbackvalue = rxpacket->data[1]; } void ZFPGACommander::_readReg(uint32_t regadd, uint32_t ®value, int32_t overtime_ms) { - lock_guard lock(m_tx_lock); - uint8_t txdata[128] = {0}; zaf_packet_header_t *txpacket = (zaf_packet_header_t *)txdata; @@ -337,7 +342,8 @@ bool ZFPGACommander::ping() { } void ZFPGACommander::callcmd(uint32_t cmd, uint32_t delayms) { - lock_guard lock(m_tx_lock); + lock_guard lock(m_tx_lock); + uint8_t txdata[128] = {0}; diff --git a/src/protocol/zfpga_commander/zfpga_commander.hpp b/src/protocol/zfpga_commander/zfpga_commander.hpp index f36aa68..71dc632 100644 --- a/src/protocol/zfpga_commander/zfpga_commander.hpp +++ b/src/protocol/zfpga_commander/zfpga_commander.hpp @@ -37,6 +37,18 @@ class ZFPGARxReceiptContext { size_t receiptLen; }; +class Receipt { + uint8_t data[1024] = {0}; + uint32_t datalen = 0; + + public: + Receipt(uint8_t *data, uint32_t len) { + memcpy(this->data, data, len); + this->datalen = len; + } + zaf_packet_header_t *getpacket() { return (zaf_packet_header_t *)data; } +}; + typedef enum { kreg_flag_r = 0x01, // 可读 @@ -70,15 +82,14 @@ class ZFPGACommander { uint8_t m_rxcache[1024]; size_t m_rxlen = 0; - mutex lock_; - unique_ptr m_thread; + mutex lock_; unique_ptr m_online_detect_thread; ZFPGARxReceiptContext m_rxReceiptContext; mutex m_rxReceiptContext_lock; - mutex m_tx_lock; + recursive_mutex m_tx_lock; binary_cb_t m_raw_data_cb; StateCbFn_t m_stateCbFn; @@ -99,11 +110,9 @@ class ZFPGACommander { bool chIsOn(); public: - void writeReg(uint32_t regadd, uint32_t regvalue, uint32_t ®backvalue, int32_t overtime_ms); - void readReg(uint32_t regadd, uint32_t ®value, int32_t overtime_ms); - void sendPacket(zaf_packet_header_t *packet, uint32_t len, uint32_t overtime); - - zaf_packet_header_t *getReceipt(); + void writeReg(uint32_t regadd, uint32_t regvalue, uint32_t ®backvalue, int32_t overtime_ms); + void readReg(uint32_t regadd, uint32_t ®value, int32_t overtime_ms); + shared_ptr sendPacket(zaf_packet_header_t *packet, uint32_t len, uint32_t overtime); public: void readFPGAVersion(Version &version);