diff --git a/components/iflytop_can_slave_modules/io_control_service.cpp b/components/iflytop_can_slave_modules/io_control_service.cpp new file mode 100644 index 0000000..e5dbc78 --- /dev/null +++ b/components/iflytop_can_slave_modules/io_control_service.cpp @@ -0,0 +1,104 @@ +#include "io_control_service.hpp" +using namespace iflytop; +void IOControlService::initialize(IflytopCanProtocolStackProcesser* protocol_processer, int32_t regStartOff, write_io_cb_t write_io_cb, + read_io_cb_t read_io_cb) { + m_protocol_processer = protocol_processer; + m_slave = protocol_processer->createICPSSlaveModule("IOControlService", this, regStartOff); + m_write_io_cb = write_io_cb; + m_read_io_cb = read_io_cb; + + m_input0Reg = protocol_processer->activeReg(m_slave, REG_IO_INPUT0, icps::kr, 0); + // m_input1Reg = protocol_processer->activeReg(m_slave, REG_IO_INPUT1, icps::kr, 0); + + m_output0Reg = protocol_processer->activeReg(m_slave, REG_IO_OUTPUT0_CTL, icps::kw, 0); + m_output1Reg = protocol_processer->activeReg(m_slave, REG_IO_OUTPUT0_STATE, icps::kr, 0); + m_output1Reg = protocol_processer->activeReg(m_slave, REG_IO_OUTPUT1_CTL, icps::kw, 0); + m_output1Reg = protocol_processer->activeReg(m_slave, REG_IO_OUTPUT1_STATE, icps::kr, 0); + + ZHALCORE::getInstance()->regPeriodJob([this](ZHALCORE::Context& context) { this->readinputjob(); }, 5); +} + +void IOControlService::call_write_io_cb(int io_off, bool ioval) { + if (m_write_io_cb) { + m_write_io_cb(io_off, ioval); + } +} +uint32_t IOControlService::call_read_io_cb(int io_off) { + if (m_read_io_cb) { + return m_read_io_cb(io_off) ? 1 : 0; + } + return 0; +} + +icps::error_t IOControlService::onHostRegisterWriteEvent(IflytopCanProtocolStackWriteEvent* writeEvent) { // + int regoff = writeEvent->reg->add - regStartOff; +#if 0 + if (regoff == REG_IO_OUTPUT0) { + uint32_t mask = writeEvent->newvalue >> 16; + uint32_t val = writeEvent->newvalue & 0xFFFF; + + for (int i = 0; i < 32; i++) { + if (mask & (1 << i)) { + call_write_io_cb(i, val & (1 << i)); + } + } + } else if (regoff == REG_IO_OUTPUT1) { + uint32_t mask = writeEvent->reg->mask >> 16; + uint32_t val = writeEvent->reg->value >> 16; + for (int i = 0; i < 32; i++) { + if (mask & (1 << i)) { + call_write_io_cb(i + 32, val & (1 << i)); + } + } + } +#endif + return icps::kSuccess; +} + +void IOControlService::readinputjob() { + // + uint32_t val = readgpiotable0(); + m_input0Reg->setValue(val); +} + +uint32_t IOControlService::readgpiotable0() { + uint32_t val = 0; + val |= call_read_io_cb(0) << 0; + val |= call_read_io_cb(1) << 1; + val |= call_read_io_cb(2) << 2; + val |= call_read_io_cb(3) << 3; + val |= call_read_io_cb(4) << 4; + val |= call_read_io_cb(5) << 5; + val |= call_read_io_cb(6) << 6; + val |= call_read_io_cb(7) << 7; + + val |= call_read_io_cb(8) << 8; + val |= call_read_io_cb(9) << 9; + val |= call_read_io_cb(10) << 10; + val |= call_read_io_cb(11) << 11; + val |= call_read_io_cb(12) << 12; + val |= call_read_io_cb(13) << 13; + val |= call_read_io_cb(14) << 14; + val |= call_read_io_cb(15) << 15; + + val |= call_read_io_cb(16) << 16; + val |= call_read_io_cb(17) << 17; + val |= call_read_io_cb(18) << 18; + val |= call_read_io_cb(19) << 19; + val |= call_read_io_cb(20) << 20; + val |= call_read_io_cb(21) << 21; + val |= call_read_io_cb(22) << 22; + val |= call_read_io_cb(23) << 23; + + val |= call_read_io_cb(24) << 24; + val |= call_read_io_cb(25) << 25; + val |= call_read_io_cb(26) << 26; + val |= call_read_io_cb(27) << 27; + val |= call_read_io_cb(28) << 28; + val |= call_read_io_cb(29) << 29; + val |= call_read_io_cb(30) << 30; + val |= call_read_io_cb(31) << 31; + return val; +} + +// uint32_t IOControlService::readgpiotable1() {} \ No newline at end of file diff --git a/components/iflytop_can_slave_modules/io_control_service.hpp b/components/iflytop_can_slave_modules/io_control_service.hpp new file mode 100644 index 0000000..17f4ed8 --- /dev/null +++ b/components/iflytop_can_slave_modules/io_control_service.hpp @@ -0,0 +1,55 @@ +#pragma once +#include "sdk/hal/zhal.hpp" +#ifdef HAL_CAN_MODULE_ENABLED +#include + +#include "sdk\components\iflytop_can_slave_v1\iflytop_can_slave.hpp" + +namespace iflytop { + +#define REG_IO_INPUT0 (0) // 输入采集0 + +#define REG_IO_OUTPUT0_CTL (10) // 输出控制 //高16位掩码,低16位输出值 +#define REG_IO_OUTPUT0_STATE (11) // 输出控制 //高16位掩码,低16位输出值 +#define REG_IO_OUTPUT1_CTL (12) // 输出控制 //高16位掩码,低16位输出值 +#define REG_IO_OUTPUT1_STATE (13) // 输出控制 //高16位掩码,低16位输出值 + +class IOControlService; + +class IOControlService : public ICPSListener { + public: + typedef function write_io_cb_t; + typedef function read_io_cb_t; + + private: + IflytopCanProtocolStackProcesser* m_protocol_processer; + int32_t regStartOff; + ICPSSlaveModule* m_slave; + + write_io_cb_t m_write_io_cb; + read_io_cb_t m_read_io_cb; + + icps::Reg_t* m_input0Reg; + icps::Reg_t* m_input1Reg; + + icps::Reg_t* m_output0Reg; + icps::Reg_t* m_output1Reg; + + public: + IOControlService() {} + virtual ~IOControlService() {} + + void initialize(IflytopCanProtocolStackProcesser* protocol_processer, int32_t regStartOff, write_io_cb_t write_io_cb, read_io_cb_t read_io_cb); + + virtual icps::error_t onHostRegisterWriteEvent(IflytopCanProtocolStackWriteEvent* writeEvent); + + private: + void call_write_io_cb(int io_off, bool ioval); + uint32_t call_read_io_cb(int io_off); + uint32_t readgpiotable0(); + // + void readinputjob(); + // uint32_t readgpiotable1(); +}; +} // namespace iflytop +#endif \ No newline at end of file