diff --git a/components/iflytop_can_slave_modules/device_base_control_service.cpp b/components/iflytop_can_slave_modules/device_base_control_service.cpp index 43fcb4a..3ff25e2 100644 --- a/components/iflytop_can_slave_modules/device_base_control_service.cpp +++ b/components/iflytop_can_slave_modules/device_base_control_service.cpp @@ -7,6 +7,7 @@ void DeviceBaseControlService::initialize(IflytopCanProtocolStackProcesser* prot m_deviceId = deviceId; ZASSERT(m_protocol_processer != NULL); activeRegs(); + m_protocol_processer->registerListener(this); } void DeviceBaseControlService::activeRegs() { m_protocol_processer->activeReg(REG_DEVICE_ID, icps::kr, m_deviceId); @@ -14,7 +15,7 @@ void DeviceBaseControlService::activeRegs() { m_protocol_processer->activeReg(REG_DEVICE_ENGINEER_MODE_MODE, icps::kwr, 0); } -bool DeviceBaseControlService::isThisRegOwnToMe(icps::Reg_t* reg) { +bool DeviceBaseControlService::isThisRegOwnToMe(IflytopCanProtocolStackProcesser* processer, icps::Reg_t* reg) { switch (reg->add) { case REG_DEVICE_ID: case REG_DEVICE_REBOOT: @@ -26,7 +27,7 @@ bool DeviceBaseControlService::isThisRegOwnToMe(icps::Reg_t* reg) { return false; } -icps::error_t DeviceBaseControlService::processIflytopCanRegisterWriteEvent(IflytopCanProtocolStackWriteEvent* writeEvent) { +icps::error_t DeviceBaseControlService::onHostRegisterWriteEvent(IflytopCanProtocolStackProcesser* processer, IflytopCanProtocolStackWriteEvent* writeEvent) { switch (writeEvent->reg->add) { case REG_DEVICE_ID: return icps::kRegNotWritable; diff --git a/components/iflytop_can_slave_modules/device_base_control_service.hpp b/components/iflytop_can_slave_modules/device_base_control_service.hpp index 490382f..3ed37b6 100644 --- a/components/iflytop_can_slave_modules/device_base_control_service.hpp +++ b/components/iflytop_can_slave_modules/device_base_control_service.hpp @@ -15,7 +15,7 @@ class DeviceBaseControlService; // public: // virtual icps::error_t onSetEngineerMode(DeviceBaseControlService* service, int32_t engineer_mode) = 0; // }; -class DeviceBaseControlService { +class DeviceBaseControlService : public IflytopCanProtocolStackProcesserListener { public: typedef function SetEngineerModeCallback_t; @@ -31,8 +31,8 @@ class DeviceBaseControlService { void initialize(IflytopCanProtocolStackProcesser* protocol_processer, uint8_t deviceId); void setListener(SetEngineerModeCallback_t listener) { m_listener = listener; } - bool isThisRegOwnToMe(icps::Reg_t* reg); - icps::error_t processIflytopCanRegisterWriteEvent(IflytopCanProtocolStackWriteEvent* writeEvent); + virtual bool isThisRegOwnToMe(IflytopCanProtocolStackProcesser* processer, icps::Reg_t* reg); + virtual icps::error_t onHostRegisterWriteEvent(IflytopCanProtocolStackProcesser* processer, IflytopCanProtocolStackWriteEvent* writeEvent); private: void activeRegs(); diff --git a/components/iflytop_can_slave_modules/idcard_reader_service.cpp b/components/iflytop_can_slave_modules/idcard_reader_service.cpp index c5efcef..bb55869 100644 --- a/components/iflytop_can_slave_modules/idcard_reader_service.cpp +++ b/components/iflytop_can_slave_modules/idcard_reader_service.cpp @@ -16,7 +16,7 @@ static int32_t littleEndianBigEnd(int32_t data) { return ret; } -void IDCardReaderService::initialize(const char* name, IflytopCanProtocolStackProcesser* protocolProcesser, int32_t regStartOff, +void IDCardReaderService::initialize(const char* name, IflytopCanProtocolStackProcesser* protocolProcesser, int32_t regStartOff, M3078CodeScanner* codeScanner) { /******************************************************************************* * 通用成员变量初始化 * @@ -25,7 +25,7 @@ void IDCardReaderService::initialize(const char* name, IflytopCanProtocolStackP m_protocolProcesser = protocolProcesser; m_exceptionId = 0; m_regStartOff = regStartOff; - m_stateMachine.initialize(m_name, 10, &IDCardReaderService::onProcessState, this); + m_stateMachine.initialize(m_name, 10, &IDCardReaderService::onProcessState, this); /******************************************************************************* * 专用成员变量初始化 * @@ -37,9 +37,10 @@ void IDCardReaderService::initialize(const char* name, IflytopCanProtocolStackP m_protocolProcesser->activeReg(m_regStartOff + REG_CODE_SCANER_STAT_STATUS, icps::kr, 0); m_protocolProcesser->activeReg(m_regStartOff + REG_CODE_SCANER_STAT_EXCEPTION, icps::kr, 0); m_codeReg = m_protocolProcesser->activeReg(m_regStartOff + REG_CODE_SCANER_CODE, icps::kr | icps::kextreg, 0); + m_protocolProcesser->registerListener(this); } -icps::error_t IDCardReaderService::processWriteEvent(icps::WriteEvent* event) { +icps::error_t IDCardReaderService::onHostRegisterWriteEvent(IflytopCanProtocolStackProcesser* processer, IflytopCanProtocolStackWriteEvent* event) { int regoff = event->reg->add - m_regStartOff; int val = event->newvalue; switch (regoff) { @@ -64,7 +65,7 @@ icps::error_t IDCardReaderService::processWriteEvent(icps::WriteEvent* event) { } return icps::kRegNotWritable; } -icps::error_t IDCardReaderService::processReportEvent(icps::ReportEvent* event) { +void IDCardReaderService::onHostRegisterReportEvent(IflytopCanProtocolStackProcesser* processer, icps::ReportEvent* event) { int regoff = event->reg->add - m_regStartOff; int32_t* val = &event->value; @@ -79,7 +80,7 @@ icps::error_t IDCardReaderService::processReportEvent(icps::ReportEvent* event) *val = data[event->extRegSubOff - 1]; } } - return icps::kSuccess; + return; } void IDCardReaderService::onProcessState(StateMachine::StateProcessContext* context, StateMachine::Event* event) { @@ -183,7 +184,7 @@ void IDCardReaderService::onProcessState(void* module, StateMachine::StateProces * 通用方法 * *******************************************************************************/ void IDCardReaderService::writeRegVal(uint16_t regoff, uint16_t regval) { m_protocolProcesser->writeRegValue(uint16_t(m_regStartOff + regoff), regval, false); } -bool IDCardReaderService::isThisRegOwnToMe(icps::Reg_t* reg) { +bool IDCardReaderService::isThisRegOwnToMe(IflytopCanProtocolStackProcesser* processer, icps::Reg_t* reg) { int regoff = reg->add; if (regoff >= m_regStartOff && regoff < m_regStartOff + REG_CODE_SCANER_SIZE) { return true; diff --git a/components/iflytop_can_slave_modules/idcard_reader_service.hpp b/components/iflytop_can_slave_modules/idcard_reader_service.hpp index dcca3b0..ee8cef3 100644 --- a/components/iflytop_can_slave_modules/idcard_reader_service.hpp +++ b/components/iflytop_can_slave_modules/idcard_reader_service.hpp @@ -28,7 +28,7 @@ using namespace iflytop_can_slave_modules_pri; * https://iflytop1.feishu.cn/wiki/OYZFwSNf2i0Hyek1zouc8eSsnsg * */ -class IDCardReaderService { +class IDCardReaderService : public IflytopCanProtocolStackProcesserListener { public: typedef enum { kidle = 0, @@ -63,13 +63,15 @@ class IDCardReaderService { bool m_oneShutScan; public: - void initialize(const char* name, IflytopCanProtocolStackProcesser* protocolProcesser, int32_t regStartOff, - M3078CodeScanner* codeScanner); + void initialize(const char* name, IflytopCanProtocolStackProcesser* protocolProcesser, int32_t regStartOff, M3078CodeScanner* codeScanner); - bool isThisRegOwnToMe(icps::Reg_t* reg); + virtual bool isThisRegOwnToMe(IflytopCanProtocolStackProcesser* processer, icps::Reg_t* reg); + virtual icps::error_t onHostRegisterWriteEvent(IflytopCanProtocolStackProcesser* processer, IflytopCanProtocolStackWriteEvent* writeEvent); + virtual void onHostRegisterReportEvent(IflytopCanProtocolStackProcesser* processer, icps::ReportEvent* event); - icps::error_t processWriteEvent(icps::WriteEvent* event); - icps::error_t processReportEvent(icps::ReportEvent* event); + // bool isThisRegOwnToMe(icps::Reg_t* reg); + // icps::error_t processWriteEvent(icps::WriteEvent* event); + // icps::error_t processReportEvent(icps::ReportEvent* event); void periodicJob(); diff --git a/components/iflytop_can_slave_v1/iflytop_can_slave.cpp b/components/iflytop_can_slave_v1/iflytop_can_slave.cpp index 6699338..c1010c0 100644 --- a/components/iflytop_can_slave_v1/iflytop_can_slave.cpp +++ b/components/iflytop_can_slave_v1/iflytop_can_slave.cpp @@ -2,8 +2,8 @@ #ifdef HAL_CAN_MODULE_ENABLED #include -#include #include +#include using namespace iflytop; #define TAG "IflytopCanProtocolStackProcesser" @@ -12,7 +12,6 @@ using namespace iflytop; IflytopCanProtocolStackProcesser::IflytopCanProtocolStackProcesser() { memset(&m_config, 0, sizeof(m_config)); - m_listener = NULL; m_regList = NULL; m_regListSize = 0; m_canOnRxDataFlag = false; @@ -110,7 +109,9 @@ void IflytopCanProtocolStackProcesser::initialize(cfg_t *config) { } void IflytopCanProtocolStackProcesser::registerListener( // IflytopCanProtocolStackProcesserListener *listener) { // - m_listener = listener; + ZASSERT(m_listenerSize < ZARRAY_SIZE(m_listeners)); + m_listeners[m_listenerSize] = listener; + m_listenerSize++; } void IflytopCanProtocolStackProcesser::periodicJob() { LoopJobContext loopContext = {0}; @@ -436,7 +437,7 @@ HAL_StatusTypeDef IflytopCanProtocolStackProcesser::activateRxIT() { return hal_status; } HAL_StatusTypeDef IflytopCanProtocolStackProcesser::deactivateRxIT() { - HAL_StatusTypeDef hal_status = HAL_ERROR; + HAL_StatusTypeDef hal_status = HAL_ERROR; if (m_config->rxfifoNum == CAN_RX_FIFO0) { hal_status = HAL_CAN_DeactivateNotification(m_config->canHandle, CAN_IT_RX_FIFO0_MSG_PENDING); } else if (m_config->rxfifoNum == CAN_RX_FIFO1) { @@ -684,7 +685,13 @@ icps::error_t IflytopCanProtocolStackProcesser::callOnHostRegisterWriteEvent(icp writeEvent.newvalue = newvalue; writeEvent.oldvalue = oldvalue; writeEvent.reg = reg; - if (m_listener) return m_listener->onHostRegisterWriteEvent(this, &writeEvent); + // if (m_listener) return m_listener->onHostRegisterWriteEvent(this, &writeEvent); + for (size_t i = 0; i < m_listenerSize; i++) { + if (m_listeners[i]->isThisRegOwnToMe(this, reg)) { + return m_listeners[i]->onHostRegisterWriteEvent(this, &writeEvent); + } + } + newvalue = writeEvent.newvalue; return icps::kSuccess; } @@ -692,7 +699,12 @@ icps::error_t IflytopCanProtocolStackProcesser::callOnHostRegisterReadEvent(icps icps::ReadEvent eve = {0}; eve.reg = reg; eve.value = value; - if (m_listener) return m_listener->onHostRegisterReadEvent(this, &eve); + + for (size_t i = 0; i < m_listenerSize; i++) { + if (m_listeners[i]->isThisRegOwnToMe(this, reg)) { + return m_listeners[i]->onHostRegisterReadEvent(this, &eve); + } + } value = eve.value; return icps::kSuccess; } @@ -700,7 +712,14 @@ void IflytopCanProtocolStackProcesser::callOnRegisterValueAutoReportEvent(icps:: icps::ReportEvent eve = {0}; eve.reg = reg; eve.value = value; - if (m_listener) m_listener->onHostRegisterReportEvent(this, &eve); + // if (m_listener) m_listener->onHostRegisterReportEvent(this, &eve); + + for (size_t i = 0; i < m_listenerSize; i++) { + if (m_listeners[i]->isThisRegOwnToMe(this, reg)) { + m_listeners[i]->onHostRegisterReportEvent(this, &eve); + } + } + value = eve.value; } #if 1 @@ -709,7 +728,13 @@ void IflytopCanProtocolStackProcesser::callOnRegisterExtEvent(icps::Reg_t *reg, eve.reg = reg; eve.value = value; eve.extRegSubOff = subregindex; - if (m_listener) m_listener->onHostRegisterReportEvent(this, &eve); + // if (m_listener) m_listener->onHostRegisterReportEvent(this, &eve); + + for (size_t i = 0; i < m_listenerSize; i++) { + if (m_listeners[i]->isThisRegOwnToMe(this, reg)) { + m_listeners[i]->onHostRegisterReportEvent(this, &eve); + } + } value = eve.value; } #endif diff --git a/components/iflytop_can_slave_v1/iflytop_can_slave.hpp b/components/iflytop_can_slave_v1/iflytop_can_slave.hpp index 7117fc4..06ba440 100644 --- a/components/iflytop_can_slave_v1/iflytop_can_slave.hpp +++ b/components/iflytop_can_slave_v1/iflytop_can_slave.hpp @@ -27,6 +27,7 @@ typedef icps::WriteEvent IflytopCanProtocolStackWriteEvent; class IflytopCanProtocolStackProcesserListener { public: + virtual bool isThisRegOwnToMe(IflytopCanProtocolStackProcesser *processer, icps::Reg_t *reg) { return false; } /** * @brief onHostRegisterWriteEvent * @@ -35,7 +36,7 @@ class IflytopCanProtocolStackProcesserListener { * @param newvalue 新的数值 * @return icps::error_t 该方法返回kSuccess,寄存器的数值才会被赋值 */ - virtual icps::error_t onHostRegisterWriteEvent(IflytopCanProtocolStackProcesser *processer, icps::WriteEvent *event) = 0; + virtual icps::error_t onHostRegisterWriteEvent(IflytopCanProtocolStackProcesser *processer, icps::WriteEvent *event) { return icps::kSuccess; }; /** * @brief * @@ -43,12 +44,12 @@ class IflytopCanProtocolStackProcesserListener { * @param value 读取到的数值,该数值可以被修改,如果不修改怎么保持和寄存器的数值一致 * @return icps::error_t 该方法返回kSuccess,数值才会被读走 */ - virtual icps::error_t onHostRegisterReadEvent(IflytopCanProtocolStackProcesser *processer, icps::ReadEvent *event) = 0; + virtual icps::error_t onHostRegisterReadEvent(IflytopCanProtocolStackProcesser *processer, icps::ReadEvent *event) { return icps::kSuccess; }; /** * @brief onRegisterValuePeriodicReportEvent * 当寄存器数值发生变化时,如果设置了自动上报,该方法就会被回调,用来通知应用层产生了一次消息上报事件。 */ - virtual void onHostRegisterReportEvent(IflytopCanProtocolStackProcesser *processer, icps::ReportEvent *event) = 0; + virtual void onHostRegisterReportEvent(IflytopCanProtocolStackProcesser *processer, icps::ReportEvent *event){}; }; class IflytopCanProtocolStackProcesser : public ZCanIRQListener { @@ -84,9 +85,9 @@ class IflytopCanProtocolStackProcesser : public ZCanIRQListener { private: cfg_t *m_config; // 配置 // IflytopMicroOS *m_os; // 操作系统相关方法 - IflytopCanProtocolStackProcesserListener *m_listener; // 监听者 - icps::Reg_t *m_regList; // 寄存器列表 - uint16_t m_regListSize; // 寄存器列表大小 + // IflytopCanProtocolStackProcesserListener *m_listener; // 监听者 + icps::Reg_t *m_regList; // 寄存器列表 + uint16_t m_regListSize; // 寄存器列表大小 bool m_canOnRxDataFlag; // 是否有数据接收,用于从中断上下文转移到MainLoop上下文 @@ -96,6 +97,9 @@ class IflytopCanProtocolStackProcesser : public ZCanIRQListener { uint8_t m_reportSeq; // 上报序列号 ReportTask m_reportTask; + IflytopCanProtocolStackProcesserListener *m_listeners[30]; + int m_listenerSize = 0; + public: IflytopCanProtocolStackProcesser(); static cfg_t *createDefaultConfig(uint16_t deviceId, uint16_t regListSize); diff --git a/components/single_axis_motor_control_v2/i_iflytop_can_slave_module.cpp b/components/single_axis_motor_control_v2/i_iflytop_can_slave_module.cpp index 373078a..71d746f 100644 --- a/components/single_axis_motor_control_v2/i_iflytop_can_slave_module.cpp +++ b/components/single_axis_motor_control_v2/i_iflytop_can_slave_module.cpp @@ -165,6 +165,7 @@ void IIflytopCanSlaveModule::initialize(const char* name, IflytopCanProtocolStac m_stateticket = 0; m_listener = NULL; + m_protocolProcesser->registerListener(this); } void IIflytopCanSlaveModule::regConfigParas(icsm::ConfigPara* configParas, int configParaNum) { @@ -195,9 +196,9 @@ void IIflytopCanSlaveModule::writeRegValueByRegOff(uint16_t regaddoff, int32_t v m_protocolProcesser->writeRegValue(m_regStart + regaddoff, value, forceupdate); } uint32_t IIflytopCanSlaveModule::getRegOff(IflytopCanProtocolStackWriteEvent* writeEvent) { return writeEvent->reg->add - m_regStart; } -bool IIflytopCanSlaveModule::isMyWriteEvent(IflytopCanProtocolStackWriteEvent* writeEvent) { - if (writeEvent->reg->add >= getRegStartAdd() && // - writeEvent->reg->add <= getRegEndAdd()) { +bool IIflytopCanSlaveModule::isThisRegOwnToMe(IflytopCanProtocolStackProcesser* processer, icps::Reg_t* reg) { + if (reg->add >= getRegStartAdd() && // + reg->add <= getRegEndAdd()) { return true; } return false; @@ -257,7 +258,7 @@ void IIflytopCanSlaveModule::activeReg(uint16_t mappingAdd, uint16_t mask, int32 } } -icps::error_t IIflytopCanSlaveModule::processIflytopCanRegisterWriteEvent(IflytopCanProtocolStackWriteEvent* writeEvent) { +icps::error_t IIflytopCanSlaveModule::onHostRegisterWriteEvent(IflytopCanProtocolStackProcesser* processer, IflytopCanProtocolStackWriteEvent* writeEvent) { /** * @brief * 1.遍历所有配置参数,如果是配置地址,则进行配置 diff --git a/components/single_axis_motor_control_v2/i_iflytop_can_slave_module.hpp b/components/single_axis_motor_control_v2/i_iflytop_can_slave_module.hpp index 0618c21..9698cbe 100644 --- a/components/single_axis_motor_control_v2/i_iflytop_can_slave_module.hpp +++ b/components/single_axis_motor_control_v2/i_iflytop_can_slave_module.hpp @@ -135,12 +135,11 @@ class IIflytopCanSlaveModuleListener { virtual void onException(IIflytopCanSlaveModule* service, int32_t exceptionId) = 0; }; -class IIflytopCanSlaveModule { +class IIflytopCanSlaveModule : public IflytopCanProtocolStackProcesserListener { public: const char* m_name; private: - int32_t m_regStart; int32_t m_regNum; @@ -185,7 +184,7 @@ class IIflytopCanSlaveModule { virtual ~IIflytopCanSlaveModule(){}; protected: - void initialize(const char* name, IflytopCanProtocolStackProcesser* processer, int32_t regoff, int32_t retNum); + void initialize(const char* name, IflytopCanProtocolStackProcesser* processer, int32_t regoff, int32_t retNum); void regConfigParas(icsm::ConfigPara* configParas, int configParaNum); void regActions(icsm::Action* action, int actionNum); @@ -224,12 +223,14 @@ class IIflytopCanSlaveModule { int32_t getModuleTicket(); - /******************************************************************************* * 协议对接 * *******************************************************************************/ - bool isMyWriteEvent(IflytopCanProtocolStackWriteEvent* writeEvent); - icps::error_t processIflytopCanRegisterWriteEvent(IflytopCanProtocolStackWriteEvent* writeEvent); + // bool isMyWriteEvent(IflytopCanProtocolStackWriteEvent* writeEvent); + // icps::error_t processIflytopCanRegisterWriteEvent(IflytopCanProtocolStackWriteEvent* writeEvent); + + virtual bool isThisRegOwnToMe(IflytopCanProtocolStackProcesser* processer, icps::Reg_t* reg); + virtual icps::error_t onHostRegisterWriteEvent(IflytopCanProtocolStackProcesser* processer, IflytopCanProtocolStackWriteEvent* writeEvent); /******************************************************************************* * 协议助手 * *******************************************************************************/ diff --git a/components/single_axis_motor_control_v2/single_axis_motor_control_v2.cpp b/components/single_axis_motor_control_v2/single_axis_motor_control_v2.cpp index 22be105..f6505dc 100644 --- a/components/single_axis_motor_control_v2/single_axis_motor_control_v2.cpp +++ b/components/single_axis_motor_control_v2/single_axis_motor_control_v2.cpp @@ -531,7 +531,7 @@ icps::error_t SingleAxisMotorControlerV2::stop() { writeEvent.reg = reg; writeEvent.newvalue = 1; writeEvent.oldvalue = reg->getValue(); - processIflytopCanRegisterWriteEvent(&writeEvent); + onHostRegisterWriteEvent(getProtocolProcesser(), &writeEvent); return icps::kSuccess; } #endif