2 changed files with 159 additions and 0 deletions
-
104components/iflytop_can_slave_modules/io_control_service.cpp
-
55components/iflytop_can_slave_modules/io_control_service.hpp
@ -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() {}
|
@ -0,0 +1,55 @@ |
|||
#pragma once
|
|||
#include "sdk/hal/zhal.hpp"
|
|||
#ifdef HAL_CAN_MODULE_ENABLED
|
|||
#include <stdlib.h>
|
|||
|
|||
#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<void(int io_off, bool ioval)> write_io_cb_t; |
|||
typedef function<bool(int io_off)> 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
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue