diff --git a/api/zi_module.hpp b/api/zi_module.hpp index 34a1893..1c86594 100644 --- a/api/zi_module.hpp +++ b/api/zi_module.hpp @@ -47,6 +47,8 @@ class ZIModule { return id; }; + virtual int32_t module_ping() = 0; + virtual int32_t module_stop() { return err::koperation_not_support; } virtual int32_t module_break() { return err::koperation_not_support; } virtual int32_t module_start() { return err::koperation_not_support; } diff --git a/cmdid.hpp b/cmdid.hpp index 8cd0370..cf31f70 100644 --- a/cmdid.hpp +++ b/cmdid.hpp @@ -14,6 +14,7 @@ typedef enum { kevent_bus_reg_change_report = CMDID(0, 100), // para:{}, ack:{} + kmodule_ping = CMDID(1, 0), // 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_parser.cpp b/protocol_parser.cpp index 2226a5e..f84e60c 100644 --- a/protocol_parser.cpp +++ b/protocol_parser.cpp @@ -117,7 +117,7 @@ void ZIProtocolParser::onRceivePacket(zcr_cmd_header_t* rxcmd, uint8_t* data, in virtual ~ZIModule() {} virtual int32_t getid(int32_t *id) = 0; - + virtual int32_t module_ping() = 0; virtual int32_t module_stop() = 0; virtual int32_t module_break() = 0; virtual int32_t module_start() { return err::koperation_not_support; } @@ -155,6 +155,8 @@ void ZIProtocolParser::onRceivePacket(zcr_cmd_header_t* rxcmd, uint8_t* data, in virtual int32_t module_enable(int32_t enable) { return err::koperation_not_support; } #endif + + PROCESS_PACKET_00(kmodule_ping, ZIModule, module_ping); PROCESS_PACKET_00(kmodule_stop, ZIModule, module_stop); PROCESS_PACKET_00(kmodule_break, ZIModule, module_break); PROCESS_PACKET_01(kmodule_get_last_exec_status, ZIModule, module_get_last_exec_status); diff --git a/protocol_proxy.cpp b/protocol_proxy.cpp index ab4203b..c14484b 100644 --- a/protocol_proxy.cpp +++ b/protocol_proxy.cpp @@ -73,6 +73,7 @@ using namespace iflytop; #define PROXY_IMPL_42(cmdindex, overtime) PROXY_IMPL_XX(cmdindex, 4, 2, PROXY_IMPL_4X_PARA(), PROXY_IMPL_X2_ACK(), overtime); #define PROXY_IMPL_43(cmdindex, overtime) PROXY_IMPL_XX(cmdindex, 4, 3, PROXY_IMPL_4X_PARA(), PROXY_IMPL_X3_ACK(), overtime); +int32_t ZIProtocolProxy::module_ping() { PROXY_IMPL_00(kmodule_ping, 30); } int32_t ZIProtocolProxy::module_stop() { PROXY_IMPL_00(kmodule_stop, 30); } int32_t ZIProtocolProxy::module_break() { PROXY_IMPL_00(kmodule_break, 30); } int32_t ZIProtocolProxy::module_start() { PROXY_IMPL_00(kmodule_start, 30); } diff --git a/protocol_proxy.hpp b/protocol_proxy.hpp index 9b0eaf0..5c14814 100644 --- a/protocol_proxy.hpp +++ b/protocol_proxy.hpp @@ -32,6 +32,8 @@ class ZIProtocolProxy : public ZIMotor, // *******************************************************************************/ #if 0 #endif + virtual int32_t module_ping() override; + virtual int32_t module_stop() override; virtual int32_t module_break() override; virtual int32_t module_start() override; diff --git a/zmodule_device_manager.cpp b/zmodule_device_manager.cpp index 3d24308..2b5e4b5 100644 --- a/zmodule_device_manager.cpp +++ b/zmodule_device_manager.cpp @@ -15,20 +15,21 @@ using namespace std; void ZModuleDeviceManager::initialize(IZcanCmderMaster *cancmder) { m_cancmder = cancmder; - assert(m_cancmder != nullptr); - - m_cancmder->regEventPacketListener([this](int32_t fromboard, zcr_cmd_header_t *packet, int32_t datalen) { - if (datalen < 4) return; - - int32_t *pdata = (int32_t *)packet->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); - } - }); + // assert(m_cancmder != nullptr); + if (m_cancmder) { + m_cancmder->regEventPacketListener([this](int32_t fromboard, zcr_cmd_header_t *packet, int32_t datalen) { + if (datalen < 4) return; + + int32_t *pdata = (int32_t *)packet->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); @@ -41,6 +42,7 @@ void ZModuleDeviceManager::registerModule(ZIModule *module) { /******************************************************************************* * ZIModule * *******************************************************************************/ +int32_t ZModuleDeviceManager::module_ping(uint16_t id) { PROXY_IMPL(ZIModule, module_ping); } int32_t ZModuleDeviceManager::module_stop(uint16_t id) { PROXY_IMPL(ZIModule, module_stop); } int32_t ZModuleDeviceManager::module_break(uint16_t id) { PROXY_IMPL(ZIModule, module_break); } int32_t ZModuleDeviceManager::module_get_last_exec_status(uint16_t id, int32_t *ack0) { PROXY_IMPL(ZIModule, module_get_last_exec_status, ack0); } diff --git a/zmodule_device_manager.hpp b/zmodule_device_manager.hpp index d667512..d407baf 100644 --- a/zmodule_device_manager.hpp +++ b/zmodule_device_manager.hpp @@ -69,6 +69,7 @@ class ZModuleDeviceManager { virtual int32_t module_enable(int32_t enable) override; #endif + virtual int32_t module_ping(uint16_t id); virtual int32_t module_stop(uint16_t id); virtual int32_t module_break(uint16_t id); diff --git a/zmodule_device_script_cmder_paser.cpp b/zmodule_device_script_cmder_paser.cpp index 08f9f31..afc5376 100644 --- a/zmodule_device_script_cmder_paser.cpp +++ b/zmodule_device_script_cmder_paser.cpp @@ -100,7 +100,7 @@ void ZModuleDeviceScriptCmderPaser::regfn() { virtual int32_t motor_move_to_zero_backward_and_calculated_shift(int32_t findzerospeed, int32_t findzeroedge_speed, int32_t acc, int32_t overtime) override; virtual int32_t module_enable(uint16_t id, int32_t enable); #endif - + PROCESS_PACKET_10(module_ping, "(mid)"); PROCESS_PACKET_10(module_stop, "(mid)"); PROCESS_PACKET_10(module_start, "(mid)"); PROCESS_PACKET_10(module_break, "(mid)");