/* * PackagerADS1259.h * * Created on: 7 авг. 2019 г. * Author: user */ #ifndef SOURCE_DRIVER_CHIPSET_PACKAGERADS1259_H_ #define SOURCE_DRIVER_CHIPSET_PACKAGERADS1259_H_ #include #include namespace driver { namespace chipset { struct PackagerADS1259 { typedef uint16_t Data; //!<Тип данных используемых пользователем для хранения полезной информации. typedef uint32_t Frame; //!<Тип данных отправляемый и получаемый по линии связи. static const std::size_t FrameSize; //!<Фиксированный размер кадра передаваемого по линии связи. typedef uint16_t RegAddress; //!<Тип адреса регистра в устройстве. static Frame encode( RegAddress rg_address, Data data, bool write_nread ); static Frame encode( RegAddress control_reg ); static Data decode( Frame frame ); struct Packager { typedef PackagerADS1259::Frame Frame; typedef PackagerADS1259::Data Data; RegAddress rg_address; bool write_nread; Frame pack( Data ) const; Data unpack( Frame ) const; }; struct CommandPackager { typedef PackagerADS1259::Frame Frame; typedef PackagerADS1259::Data Data; Frame pack( Data ) const; Data unpack( Frame ) const; }; struct AdcResultPackager { static const uint32_t read_adc_command = 0x12 << 8; typedef uint32_t Frame; typedef uint32_t Data; Frame pack( Data ) const; Data unpack( Frame ) const; }; struct AdcContModePackager { typedef uint32_t Frame; typedef uint32_t Data; static Frame encode() { return 0xFFFFFFFFul; } static Data decode(Frame frame) { return (frame >> 16ul) | (frame << 16ul); } struct RdataCrc { uint32_t adc_result : 24; uint32_t crc : 8; static RdataCrc createRdataCrc(uint32_t data) { return { .adc_result = data >> 8, .crc = data & 0xFF }; } static uint16_t calcCrc(uint32_t data) { return ( (data >> 8) + (data >> 16) + data + 0x9B ) & 0xFF; } static bool checkCrc(const RdataCrc & rdata) { return rdata.crc == calcCrc(rdata.adc_result); } }; }; private: static const uint16_t READ_OP_CODE = 0x02; static const uint16_t WRITE_OP_CODE = 0x04; //!Структура адресного заголовка фрейма. struct AddressingRegisterForm { uint16_t NUM_REG_TO_READ : 8; uint16_t REGISTER_ADDRESS : 4; uint16_t READ_WRITE_OP : 4; AddressingRegisterForm(uint16_t reg_addr, bool write_nread) : REGISTER_ADDRESS(reg_addr), READ_WRITE_OP(write_nread ? WRITE_OP_CODE : READ_OP_CODE), NUM_REG_TO_READ(0) {} }; //!Структура компановки адресного заголовка и СЛОВА данных. struct RegisterAddressAndData { AddressingRegisterForm address; Data data; RegisterAddressAndData(uint16_t reg_addr, bool write_nread, Data data) : address(reg_addr, write_nread), data(data << 8) {} }; struct CommandRegisterForm { uint16_t c1 : 8; uint16_t command : 8; uint16_t c2 : 16; CommandRegisterForm(uint16_t command) : command(command), c1(0), c2(0) {} }; }; } /* namespace chipset */ } /* namespace driver */ inline driver::chipset::PackagerADS1259::Packager::Frame driver::chipset::PackagerADS1259::Packager::pack( Data data ) const { return encode( rg_address, data, write_nread ); } inline driver::chipset::PackagerADS1259::Packager::Data driver::chipset::PackagerADS1259::Packager::unpack( Frame frame ) const { return decode( frame ); } inline driver::chipset::PackagerADS1259::CommandPackager::Frame driver::chipset::PackagerADS1259::CommandPackager::pack( Data data) const { return encode( data ); } inline driver::chipset::PackagerADS1259::CommandPackager::Data driver::chipset::PackagerADS1259::CommandPackager::unpack( Frame frame) const { return 0; } inline driver::chipset::PackagerADS1259::AdcResultPackager::Frame driver::chipset::PackagerADS1259::AdcResultPackager::pack( Data data) const { return read_adc_command; } inline driver::chipset::PackagerADS1259::AdcResultPackager::Data driver::chipset::PackagerADS1259::AdcResultPackager::unpack( Frame frame) const { return ((frame >> 16ul) | (frame << 16ul)) & 0xFFFFFFul; } #endif /* SOURCE_DRIVER_CHIPSET_PACKAGERADS1259_H_ */