/* * PackagerAMC1210.h * * Created on: 28 авг. 2019 г. * Author: user */ #ifndef SOURCE_DRIVER_CHIPSET_PACKAGERAMC1210_H_ #define SOURCE_DRIVER_CHIPSET_PACKAGERAMC1210_H_ #include #include namespace driver { namespace chipset { struct PackagerAMC1210 { static const std::size_t FrameSize; //!<Фиксированный размер кадра передаваемого по линии связи для данного типа пакеджера. typedef uint16_t RegAddress; //!<Тип адреса регистра в устройстве. struct Frame { uint16_t frame[8]; bool operator!=( const Frame & other ); }; struct Data { int16_t data[7]; }; static Frame encode( RegAddress rg_address, Data data, bool write_nread ); static Data decode( Frame frame ); struct Packager { typedef PackagerAMC1210::Frame Frame; typedef PackagerAMC1210::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 : 8; 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; }; }; inline driver::chipset::PackagerAMC1210::Frame driver::chipset::PackagerAMC1210::Packager::pack(Data data) const { return encode( rg_address, data, write_nread ); } inline driver::chipset::PackagerAMC1210::Data driver::chipset::PackagerAMC1210::Packager::unpack( Frame frame) const { return decode( frame ); } } /* namespace chipset */ } /* namespace driver */ #endif /* SOURCE_DRIVER_CHIPSET_PACKAGERAMC1210_H_ */