82 lines
2.8 KiB
C++
82 lines
2.8 KiB
C++
/*
|
||
* PackagerMCP23S17.hpp
|
||
*
|
||
* Created on: 17 июл. 2019 г.
|
||
* Author: titov
|
||
*/
|
||
|
||
#ifndef SOURCE_DRIVER_CHIPSET_PACKAGERMCP23S17_HPP_
|
||
#define SOURCE_DRIVER_CHIPSET_PACKAGERMCP23S17_HPP_
|
||
|
||
#include <cstddef>
|
||
#include <stdint.h>
|
||
|
||
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_ */
|