/* * ModbusAnalogWideOutput.cpp * * Created on: 17 апр. 2023 г. * Author: titov */ #include "ModbusAnalogWideOutput.hh" #include 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; }