97 lines
2.8 KiB
C++
97 lines
2.8 KiB
C++
/*
|
|
* PackagerAD5421.h
|
|
*
|
|
* Created on: 7 àâã. 2019 ã.
|
|
* Author: user
|
|
*/
|
|
|
|
#ifndef SOURCE_DRIVER_CHIPSET_PACKAGERAD5421_H_
|
|
#define SOURCE_DRIVER_CHIPSET_PACKAGERAD5421_H_
|
|
|
|
#include <cstddef>
|
|
|
|
#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<uint32_t>( *reinterpret_cast<const uint16_t*>( &address ) ) << 24ul ) | ( static_cast<uint32_t>( 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<CrcType>( reinterpret_cast<char*>( &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_ */
|