MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/driver/chipset/PackagerAD5421.hh
2024-06-07 11:12:56 +03:00

97 lines
3.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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_ */