From 6bb0f643c85190489b26d8905d64809f98346d4a Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 30 Oct 2023 09:47:40 +0800 Subject: [PATCH] update --- api/api.hpp | 4 +++- api/i_zcan_cmder.hpp | 9 +++++---- api/i_zcan_cmder_master.hpp | 2 ++ api/packet_interface.hpp | 1 + api/reg_index.hpp | 3 +++ api/zi_event_bus.hpp | 25 +++++++++++++++++++++++++ api/zi_module.hpp | 2 +- cmdid.hpp | 3 +++ protocol_event_bus_sender.cpp | 19 +++++++++++++++++++ protocol_event_bus_sender.hpp | 13 +++++++++++++ zmodule_device_manager.cpp | 13 +++++++++++++ zmodule_device_manager.hpp | 13 +++++++++++++ zmodule_device_script_cmder_paser.cpp | 18 +++++++++++------- zmodule_device_script_cmder_paser.hpp | 7 ++++++- 14 files changed, 118 insertions(+), 14 deletions(-) create mode 100644 api/zi_event_bus.hpp create mode 100644 protocol_event_bus_sender.cpp create mode 100644 protocol_event_bus_sender.hpp diff --git a/api/api.hpp b/api/api.hpp index 563c92e..f81a369 100644 --- a/api/api.hpp +++ b/api/api.hpp @@ -25,4 +25,6 @@ // #include "zi_code_scaner.hpp" // -#include "zi_pipette_ctrl_module.hpp" \ No newline at end of file +#include "zi_pipette_ctrl_module.hpp" +// +#include "zi_event_bus.hpp" \ No newline at end of file diff --git a/api/i_zcan_cmder.hpp b/api/i_zcan_cmder.hpp index f8c70d0..8521204 100644 --- a/api/i_zcan_cmder.hpp +++ b/api/i_zcan_cmder.hpp @@ -17,10 +17,11 @@ class IZcanCmderListener { class IZCanCmder { public: public: - virtual void registerListener(IZcanCmderListener *listener) = 0; - virtual int32_t sendBufAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) = 0; - virtual int32_t sendAck(zcr_cmd_header_t *rx_cmd_header, int32_t *ackvar, int32_t nack) = 0; - virtual int32_t sendErrorAck(zcr_cmd_header_t *rx_cmd_header, int32_t errorcode) = 0; + virtual void registerListener(IZcanCmderListener *listener) = 0; + virtual int32_t sendBufAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) = 0; + virtual int32_t sendAck(zcr_cmd_header_t *rx_cmd_header, int32_t *ackvar, int32_t nack) = 0; + virtual int32_t sendErrorAck(zcr_cmd_header_t *rx_cmd_header, int32_t errorcode) = 0; + virtual int32_t triggerEvent(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) = 0; }; } // namespace iflytop \ No newline at end of file diff --git a/api/i_zcan_cmder_master.hpp b/api/i_zcan_cmder_master.hpp index bcbacee..43909eb 100644 --- a/api/i_zcan_cmder_master.hpp +++ b/api/i_zcan_cmder_master.hpp @@ -17,6 +17,8 @@ class IZcanCmderMaster { public: 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) = 0; 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) = 0; + + virtual void regEventPacketListener(function on_event) = 0; }; } // namespace iflytop \ No newline at end of file diff --git a/api/packet_interface.hpp b/api/packet_interface.hpp index b44f1f9..ef80fa9 100644 --- a/api/packet_interface.hpp +++ b/api/packet_interface.hpp @@ -18,6 +18,7 @@ typedef enum { kptv2_cmd = 0, kptv2_ack = 1, kptv2_error_ack = 2, + kptv2_event = 3, } zcan_cmd_packet_type_t; } // namespace zcr diff --git a/api/reg_index.hpp b/api/reg_index.hpp index 5a82883..bd2d684 100644 --- a/api/reg_index.hpp +++ b/api/reg_index.hpp @@ -19,6 +19,9 @@ typedef enum { kreg_module_errorbitflag1 = REG_INDEX(0, 7), // kreg_module_input_state = REG_INDEX(0, 8), // kreg_module_output_state = REG_INDEX(0, 9), // + kreg_module_raw_sector_size = REG_INDEX(0, 10), // sector_size + kreg_module_raw_sector_num = REG_INDEX(0, 11), // + kreg_module_is_online = REG_INDEX(0, 12), // kreg_module_last_cmd_exec_status = REG_INDEX(20, 0), // 上一条指令执行的状态 kreg_module_last_cmd_exec_val0 = REG_INDEX(20, 1), // 上一条指令执行的结果0 kreg_module_last_cmd_exec_val1 = REG_INDEX(20, 2), // 上一条指令执行的结果1 diff --git a/api/zi_event_bus.hpp b/api/zi_event_bus.hpp new file mode 100644 index 0000000..6a7b9a9 --- /dev/null +++ b/api/zi_event_bus.hpp @@ -0,0 +1,25 @@ +#pragma once +#include + +#include + +#include "errorcode.hpp" + +namespace iflytop { +using namespace std; + +typedef enum { + kreg_change_event = 1, +} event_type_t; + +class ZIEventBusSender { + public: + virtual ~ZIEventBusSender() {} + /** + * @brief 模块状态发生改变,具体的状态上位机通过查询指令进行确定 + * + * @param moduleid + */ + virtual void push_reg_state_change_event(int32_t moduleid, int32_t regindex, int32_t toval) = 0; +}; +} // namespace iflytop diff --git a/api/zi_module.hpp b/api/zi_module.hpp index ecbc779..34a1893 100644 --- a/api/zi_module.hpp +++ b/api/zi_module.hpp @@ -66,7 +66,7 @@ class ZIModule { virtual int32_t module_read_adc(int32_t adcindex, int32_t *adc) { return err::koperation_not_support; } - virtual int32_t module_read_raw(int32_t startadd, uint8_t *data, int32_t *len) { return err::koperation_not_support; } + virtual int32_t module_read_raw(int32_t index, uint8_t *data, int32_t *len) { return err::koperation_not_support; } virtual int32_t module_set_inited_flag(int32_t flag) { m_inited_flag = flag; diff --git a/cmdid.hpp b/cmdid.hpp index 8931ad4..c5d8e34 100644 --- a/cmdid.hpp +++ b/cmdid.hpp @@ -11,6 +11,9 @@ typedef enum { virtual int32_t module_start() { return err::koperation_not_support; } #endif + + kevent_bus_reg_change_report = CMDID(0, 100), // para:{}, ack:{} + kmodule_stop = CMDID(1, 1), // para:{}, ack:{} kmodule_break = CMDID(1, 2), // para:{}, ack:{} kmodule_get_last_exec_status = CMDID(1, 3), // para:{}, ack:{4} diff --git a/protocol_event_bus_sender.cpp b/protocol_event_bus_sender.cpp new file mode 100644 index 0000000..2b7dd7e --- /dev/null +++ b/protocol_event_bus_sender.cpp @@ -0,0 +1,19 @@ +#include "protocol_event_bus_sender.hpp" + +#include "api/api.hpp" +namespace iflytop { +using namespace std; + +void ProtocolEventBusSender::initialize(IZCanCmder* zcan_cmder) { m_zcan_cmder = zcan_cmder; } + +void ProtocolEventBusSender::push_reg_state_change_event(int32_t moduleid, int32_t event_id, int32_t eventval) { + zcr_cmd_header_t rx_cmd_header = {0}; + int32_t data[4]; + data[0] = kreg_change_event; + data[1] = moduleid; + data[2] = event_id; + data[3] = eventval; + m_zcan_cmder->triggerEvent(&rx_cmd_header, (uint8_t*)data, sizeof(data)); +} + +} // namespace iflytop \ No newline at end of file diff --git a/protocol_event_bus_sender.hpp b/protocol_event_bus_sender.hpp new file mode 100644 index 0000000..c8b66aa --- /dev/null +++ b/protocol_event_bus_sender.hpp @@ -0,0 +1,13 @@ +#include "api/api.hpp" +namespace iflytop { +using namespace std; + +class ProtocolEventBusSender : public ZIEventBusSender { + IZCanCmder* m_zcan_cmder = nullptr; + + public: + void initialize(IZCanCmder* zcan_cmder); + + virtual void push_reg_state_change_event(int32_t moduleid, int32_t event_id, int32_t eventval) override; +}; +} // namespace iflytop \ No newline at end of file diff --git a/zmodule_device_manager.cpp b/zmodule_device_manager.cpp index 2f373fa..4dc4fa0 100644 --- a/zmodule_device_manager.cpp +++ b/zmodule_device_manager.cpp @@ -16,6 +16,19 @@ using namespace std; void ZModuleDeviceManager::initialize(IZcanCmderMaster *cancmder) { m_cancmder = cancmder; assert(m_cancmder != nullptr); + + m_cancmder->regEventPacketListener([this](uint8_t *data, size_t len) { + if (len < 4) return; + + int32_t *pdata = (int32_t *)data; + int32_t event = pdata[0]; + if (event == kreg_change_event) { + int32_t moduleid = pdata[1]; + int32_t event_id = pdata[2]; + int32_t eventval = pdata[3]; + callOnRegValChangeEvent(moduleid, event_id, eventval); + } + }); } void ZModuleDeviceManager::registerModule(ZIModule *module) { assert(module != nullptr); diff --git a/zmodule_device_manager.hpp b/zmodule_device_manager.hpp index a0fbc41..fa85f30 100644 --- a/zmodule_device_manager.hpp +++ b/zmodule_device_manager.hpp @@ -1,4 +1,5 @@ #pragma once +#include #include #include "api/api.hpp" @@ -6,14 +7,26 @@ #include "cmdid.hpp" namespace iflytop { +using namespace std; class ZModuleDeviceManager { private: map m_modulers; IZcanCmderMaster *m_cancmder = nullptr; + typedef function regval_change_event_t; + + regval_change_event_t m_on_reg_val_change_event_cb; + list m_on_reg_val_change_event_cbs; + public: void initialize(IZcanCmderMaster *m_cancmder); void registerModule(ZIModule *module); + + void regOnRegValChangeEvent(regval_change_event_t on_regval_change_event) { m_on_reg_val_change_event_cbs.push_back(on_regval_change_event); } + void callOnRegValChangeEvent(int32_t moduleid, int32_t event_id, int32_t eventval) { + for (auto &cb : m_on_reg_val_change_event_cbs) + if (cb) cb(moduleid, event_id, eventval); + } /******************************************************************************* * ZIModule * *******************************************************************************/ diff --git a/zmodule_device_script_cmder_paser.cpp b/zmodule_device_script_cmder_paser.cpp index 206c874..736225b 100644 --- a/zmodule_device_script_cmder_paser.cpp +++ b/zmodule_device_script_cmder_paser.cpp @@ -6,11 +6,11 @@ using namespace iflytop; using namespace std; -#define PROCESS_PACKET_XX(var_funcname, cmdhelp, XP, XACK, ...) \ - cancmder->regCMD(#var_funcname, cmdhelp, XP, [this](int32_t paramN, const char* paraV[], ICmdParserACK* ack) { \ - ack->ecode = m_deviceManager->var_funcname(__VA_ARGS__); \ - ack->acktype = ICmdParserACK::kAckType_int32; \ - ack->rawlen = XACK * 4; \ +#define PROCESS_PACKET_XX(var_funcname, cmdhelp, XP, XACK, ...) \ + m_cmdParser->regCMD(#var_funcname, cmdhelp, XP, [this](int32_t paramN, const char* paraV[], ICmdParserACK* ack) { \ + ack->ecode = m_deviceManager->var_funcname(__VA_ARGS__); \ + ack->acktype = ICmdParserACK::kAckType_int32; \ + ack->rawlen = XACK * 4; \ }); #define PROCESS_PACKET_00(var_funcname, cmdhelp) PROCESS_PACKET_XX(var_funcname, cmdhelp, 0, 0) @@ -46,6 +46,10 @@ using namespace std; void ZModuleDeviceScriptCmderPaser::initialize(ICmdParser* cancmder, ZModuleDeviceManager* deviceManager) { m_cmdParser = cancmder; m_deviceManager = deviceManager; + regfn(); +} + +void ZModuleDeviceScriptCmderPaser::regfn() { #if 0 /******************************************************************************* * ZIModule * @@ -114,7 +118,7 @@ void ZModuleDeviceScriptCmderPaser::initialize(ICmdParser* cancmder, ZModuleDevi PROCESS_PACKET_10(module_factory_reset, "(mid)"); PROCESS_PACKET_10(module_flush_cfg, "(mid)"); PROCESS_PACKET_10(module_active_cfg, "(mid)"); - cancmder->regCMD("module_read_raw", "(mid, readsize)", 2, [this](int32_t paramN, const char* paraV[], ICmdParserACK* ack) { + m_cmdParser->regCMD("module_read_raw", "(mid, readsize)", 2, [this](int32_t paramN, const char* paraV[], ICmdParserACK* ack) { if (atoi(paraV[2]) > (int32_t)sizeof(ack->rawdata)) { ack->ecode = err::kbuffer_not_enough; return; @@ -197,7 +201,7 @@ void ZModuleDeviceScriptCmderPaser::initialize(ICmdParser* cancmder, ZModuleDevi PROCESS_PACKET_10(code_scaner_start_scan, "(mid)"); PROCESS_PACKET_10(code_scaner_stop_scan, "(mid)"); - cancmder->regCMD("code_scaner_read_scaner_result", "(mid, pad0)", 2, [this](int32_t paramN, const char* paraV[], ICmdParserACK* ack) { + m_cmdParser->regCMD("code_scaner_read_scaner_result", "(mid, pad0)", 2, [this](int32_t paramN, const char* paraV[], ICmdParserACK* ack) { if (atoi(paraV[2]) > (int32_t)sizeof(ack->rawdata)) { ack->ecode = err::kbuffer_not_enough; return; diff --git a/zmodule_device_script_cmder_paser.hpp b/zmodule_device_script_cmder_paser.hpp index 8afbca9..b5cadd9 100644 --- a/zmodule_device_script_cmder_paser.hpp +++ b/zmodule_device_script_cmder_paser.hpp @@ -1,5 +1,6 @@ #pragma once -#include + +#include #include "api/api.hpp" #include "api/i_cmdparser.hpp" @@ -7,16 +8,20 @@ #include "zmodule_device_manager.hpp" namespace iflytop { +using namespace std; class ZModuleDeviceScriptCmderPaser { private: ICmdParser* m_cmdParser = nullptr; ZModuleDeviceManager* m_deviceManager; + public: void initialize(ICmdParser* cancmder, ZModuleDeviceManager* deviceManager); ICmdParser* getCmdParser() { return m_cmdParser; } ZModuleDeviceManager* getDeviceManager() { return m_deviceManager; } + private: + void regfn(); }; } // namespace iflytop