Browse Source

添加GPIO输入读取

master
zhaohe 2 years ago
parent
commit
62f322c59d
  1. 104
      components/iflytop_can_slave_modules/io_control_service.cpp
  2. 55
      components/iflytop_can_slave_modules/io_control_service.hpp

104
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() {}

55
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 <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
Loading…
Cancel
Save