/* * PackagerAD5421.h * * Created on: 7 авг. 2019 г. * Author: user */ #ifndef SOURCE_DRIVER_CHIPSET_PACKAGERAD5421_H_ #define SOURCE_DRIVER_CHIPSET_PACKAGERAD5421_H_ #include #include "../../common/Crc.hpp" namespace driver { namespace chipset { struct PackagerAD5421 { typedef uint16_t Data; //!<Тип данных используемых пользователем для хранения полезной информации. typedef uint32_t Frame; //!<Тип данных отправляемый и получаемый по линии связи. static const std::size_t FrameSize; //!<Фиксированный размер кадра передаваемого по линии связи. typedef uint16_t RegAddress; //!<Тип адреса регистра в устройстве. typedef common::crc::Crc8_PRIME CrcType; static Frame encode( RegAddress rg_address, Data data, bool write_nread ); static Data decode( Frame frame ); struct Packager { typedef PackagerAD5421::Frame Frame; typedef PackagerAD5421::Data Data; RegAddress rg_address; bool write_nread; Frame pack( Data ) const; Data unpack( Frame ) const; }; private: static const uint16_t READ_OP_CODE = 0x01; static const uint16_t WRITE_OP_CODE = 0x00; //!Структура адресного заголовка фрейма. struct AddressingRegisterForm { uint16_t REGISTER_ADDRESS : 7; uint16_t READ_WRITE_OP : 1; AddressingRegisterForm(uint16_t reg_addr, bool write_nread) : REGISTER_ADDRESS(reg_addr), READ_WRITE_OP(write_nread ? WRITE_OP_CODE : READ_OP_CODE) {} }; //!Структура компановки адресного заголовка и СЛОВА данных. struct RegisterAddressAndData { AddressingRegisterForm address; Data data; operator Frame() const { uint32_t frame = ( static_cast( *reinterpret_cast( &address ) ) << 24ul ) | ( static_cast( data ) << 8 ); uint32_t frame_to_crc_check = ( (frame << 8) & 0xFF0000 ) | ( (frame << 24) & 0xFF000000 ) | ( (frame >> 8) & 0xFF00 ) | ( (frame >> 24) & 0xFF ); uint32_t crc = common::crc::crcCalc( reinterpret_cast( &frame_to_crc_check ), 3 ); frame |= crc; return ((frame >> 16) & 0xFFFF) | frame << 16; } RegisterAddressAndData(uint16_t reg_addr, bool write_nread, Data data) : address(reg_addr, write_nread), data(data) {} }; }; inline driver::chipset::PackagerAD5421::Packager::Frame driver::chipset::PackagerAD5421::Packager::pack( Data data ) const { return encode( rg_address, data, write_nread ); } inline driver::chipset::PackagerAD5421::Packager::Data driver::chipset::PackagerAD5421::Packager::unpack( Frame frame ) const { return decode( frame ); } } /* namespace chipset */ } /* namespace driver */ #endif /* SOURCE_DRIVER_CHIPSET_PACKAGERAD5421_H_ */