/* * PackagerMCP23S17.hpp * * Created on: 17 июл. 2019 г. * Author: titov */ #ifndef SOURCE_DRIVER_CHIPSET_PACKAGERMCP23S17_HPP_ #define SOURCE_DRIVER_CHIPSET_PACKAGERMCP23S17_HPP_ #include #include namespace driver { namespace chipset { struct PackagerMCP23S17 { typedef uint16_t HardwareAddress; //!<Тип адреса микросхемы. typedef uint16_t Data; //!<Тип данных используемых пользователем для хранения полезной информации. typedef uint32_t Frame; //!<Тип данных отправляемый и получаемый по линии связи. static const std::size_t FrameSize; //!<Фиксированная длина кадра данных передаваемая по линии связи для расширителя портов. typedef uint16_t RegAddress; //!<Тип адреса регистра в устройстве. /*! \brief Упаковать пользовательские данные для передаче по линии связи. * \param [in] Адрес регистра * \param [in] Данные регистра * \param [in] Признак чтения(true) или записи(false) * \return Подготовленный кадр для передачи по линии связи. */ static Frame encode( RegAddress rg_address, Data data, bool write_nread, HardwareAddress hw_address ); static Data decode( Frame frame ); struct Packager { typedef PackagerMCP23S17::Frame Frame; typedef PackagerMCP23S17::Data Data; HardwareAddress hw_address; RegAddress rg_address; bool write_nread; Frame pack( Data ) const; Data unpack( Frame ) const; }; private: //!Структура адресного заголовка фрейма. struct AddressingRegisterForm { uint16_t REGISTER_ADDRESS : 8; uint16_t RW_FLAG : 1; uint16_t ADDRESS_CODE : 3; uint16_t FIXED_CODE : 4; }; //!Структура компановки адресного заголовка и СЛОВА данных. struct RegisterAddressAndData { AddressingRegisterForm address; Data data; }; }; } } inline driver::chipset::PackagerMCP23S17::Packager::Frame driver::chipset::PackagerMCP23S17::Packager::pack( Data data ) const { return encode( rg_address, data, write_nread, hw_address ); } inline driver::chipset::PackagerMCP23S17::Packager::Data driver::chipset::PackagerMCP23S17::Packager::unpack( Frame frame ) const { return decode( frame ); } #endif /* SOURCE_DRIVER_CHIPSET_PACKAGERMCP23S17_HPP_ */