MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/driver/ModbusAnalogWideOutput.cpp

99 lines
2.2 KiB
C++

/*
* ModbusAnalogWideOutput.cpp
*
* Created on: 17 àïð. 2023 ã.
* Author: titov
*/
#include "ModbusAnalogWideOutput.hh"
#include <cstring>
bool driver::modbus::ModbusAnalogWideOutput::update() {
if( format_signed ) {
int32_t signed_input;
memcpy( &signed_input, data, sizeof(int32_t) );
if( signed_input >= down_limit and signed_input <= up_limit ) {
value = ( signed_input * coeff + offset );
return true;
} else
return false;
} else {
uint32_t unsigned_input;
memcpy( &unsigned_input, data, sizeof(uint32_t) );
if( unsigned_input >= down_limit and unsigned_input <= up_limit ) {
value = (unsigned_input * coeff + offset );
return true;
} else
return false;
}
}
driver::modbus::ModbusAnalogWideOutput::Part::Status driver::modbus::ModbusAnalogWideOutput::Part::read(
uint16_t & reg ) {
reg = *data;
return Done;
}
driver::modbus::ModbusAnalogWideOutput::Part::Status driver::modbus::ModbusAnalogWideOutput::Part::write(
uint16_t reg ) {
*data = reg;
return Done;
}
driver::modbus::ModbusAnalogWideOutput::PartUpdater::Status driver::modbus::ModbusAnalogWideOutput::PartUpdater::write(
uint16_t reg ) {
*data = reg;
return self.update() ? Done : Failure;
}
driver::modbus::ModbusAnalogWideOutput::ModbusAnalogWideOutput(
float coeff, float offset, float invalid, bool sign, float initial,
float up_limit, float down_limit, WordSequence sequnece) :
coeff(coeff), offset(offset), invalid(invalid), format_signed(sign),
up_limit(up_limit), down_limit(down_limit), value(initial),
one( sequnece == LowFirstHighSecond ? &data[1] : &data[0] ),
two( *this, sequnece == HighFirstLowSecond ? &data[1] : &data[0] ) {}
driver::modbus::IModBusDispatch & driver::modbus::ModbusAnalogWideOutput::first() {
return one;
}
driver::modbus::IModBusDispatch & driver::modbus::ModbusAnalogWideOutput::second() {
return two;
}
const float & driver::modbus::ModbusAnalogWideOutput::signal() const {
return value;
}