/* * ModbusAnalogOutput.cpp * * Created on: 19 мар. 2021 г. * Author: titov */ #include "ModbusAnalogOutput.hh" #include driver::modbus::ModbusAnalogOutput::ModbusAnalogOutput( float coeff, float offset, float invalid, bool sign, float initial, float up_limit, float down_limit ) : coeff(coeff), offset(offset), invalid(invalid), sign(sign), up_limit(up_limit), down_limit(down_limit), value(initial) {} const float & driver::modbus::ModbusAnalogOutput::signal() const { return value; } driver::modbus::ModbusAnalogOutput::Status driver::modbus::ModbusAnalogOutput::read( uint16_t & output ) { output = reg; return Done; } driver::modbus::ModbusAnalogOutput::Status driver::modbus::ModbusAnalogOutput::write( uint16_t input ) { if( sign ) { int16_t signed_input; std::memcpy( &signed_input, &input, sizeof(input) ); if( signed_input >= down_limit and signed_input <= up_limit ) { reg = input; value = signed_input * coeff + offset; return Done; } else { value = invalid; return Failure; } } else { if( input >= down_limit and input <= up_limit ) { reg = input; value = input * coeff + offset; return Done; } else { value = invalid; return Failure; } } }