#include "preportional_valve_ctrl.hpp" #include "transmit_disfection_protocol/transmit_disfection_protocol.hpp" using namespace iflytop; using namespace zscanprotocol; #define WORK_STATE_REG 0x0000 #define CTRL_STATE_REG 0x0001 #define POS_STATE_REG 0x0013 #define OVERTIME 30 #define TAG "PreportionalValveCtrl" void PreportionalValveCtrl::initialize(UART_HandleTypeDef* huart) { m_modbusBlockHost.initialize(huart); } int32_t PreportionalValveCtrl::writeReg06(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal) { // 重发三次 for (size_t i = 0; i < 3; i++) { int32_t err = m_modbusBlockHost.writeReg06(slaveAddr, regAddr, regVal, OVERTIME); if (err == 0) return 0; } return err::kerr_subdevice_offline; } int32_t PreportionalValveCtrl::readReg03(uint8_t slaveAddr, uint16_t regAddr, uint16_t* regVal) { // 重发三次 for (size_t i = 0; i < 3; i++) { int32_t err = m_modbusBlockHost.readReg03(slaveAddr, regAddr, regVal, OVERTIME); if (err == 0) return 0; } return err::kerr_subdevice_offline; } int32_t PreportionalValveCtrl::setValvePos(int32_t valueid, int32_t pos) { // int32_t ret = 0; if (valueid > 255 || valueid < 1) { return err::kerr_invalid_param; } ret = writeReg06(valueid, CTRL_STATE_REG, pos); if (!ret) return err::kerr_subdevice_offline; m_last_set_valve_ticket = HAL_GetTick(); m_targetpos[valueid] = pos; return 0; } int32_t PreportionalValveCtrl::getValvePos(int32_t valueid, int32_t* pos) { int32_t ret = 0; if (valueid > 255 || valueid < 1) { return err::kerr_invalid_param; } uint16_t pos16 = 0; ret = readReg03(valueid, POS_STATE_REG, &pos16); if (!ret) return err::kerr_subdevice_offline; *pos = pos16; return 0; } int32_t PreportionalValveCtrl::getValveOrderPos(int32_t valueid, int32_t* pos) { int32_t ret = 0; if (valueid > 255 || valueid < 1) { return err::kerr_invalid_param; } uint16_t pos16 = 0; ret = readReg03(valueid, CTRL_STATE_REG, &pos16); if (!ret) return err::kerr_subdevice_offline; *pos = pos16; return 0; } int32_t PreportionalValveCtrl::isBusy(int32_t valueid, int32_t* busy) { #if 1 int32_t orderpos = 0; int32_t pos = 0; int32_t err = 0; #if 0 err = getValveOrderPos(valueid, &orderpos); if (err != 0) return err; #endif orderpos = m_targetpos[valueid]; err = getValvePos(valueid, &pos); if (err != 0) return err; if (abs(m_targetpos[valueid] - pos) <= 11) { *busy = 0; } else { *busy = 1; } return 0; #endif } int32_t PreportionalValveCtrl::getValveWorkState(int32_t valueid, int32_t* state) { int32_t ret = 0; if (valueid > 255 || valueid < 1) { return err::kerr_invalid_param; } uint16_t state16 = 0; ret = readReg03(valueid, WORK_STATE_REG, &state16); if (!ret) return err::kerr_subdevice_offline; *state = state16; return 0; }