86 lines
2.6 KiB
C++
86 lines
2.6 KiB
C++
/*
|
|
* PackagerADS1259Extended.h
|
|
*
|
|
* Created on: 8 èþë. 2020 ã.
|
|
* Author: krugliy
|
|
*/
|
|
|
|
#ifndef UMLIBRARY_DRIVER_CHIPSET_PACKAGERADS1259EXTENDED_H_
|
|
#define UMLIBRARY_DRIVER_CHIPSET_PACKAGERADS1259EXTENDED_H_
|
|
|
|
#include <cstddef>
|
|
#include <stdint.h>
|
|
|
|
namespace driver {
|
|
namespace chipset {
|
|
|
|
struct PackagerADS1259Extended {
|
|
|
|
//Íà ñàìîì äåëå Data ïðåäñòàâëÿåò èç ñåáÿ âîò ÷òî:
|
|
struct RdataCrc {
|
|
uint32_t adc_result : 24;
|
|
uint32_t crc : 8;
|
|
|
|
static RdataCrc createRdataCrc(uint32_t data) { return { .adc_result = ((data & 0xFFul) << 16) | (data & 0xFF00ul) | ((data & 0xFF0000ul) >> 16), .crc = data >> 24 }; }
|
|
|
|
static uint16_t calcCrc(uint32_t data) { return ( data + (data >> 8) + (data >> 16) + 0x9B ) & 0xFF; }
|
|
|
|
static bool checkCrc(const RdataCrc & rdata) { return rdata.crc == calcCrc(rdata.adc_result); }
|
|
|
|
};
|
|
|
|
typedef uint32_t Data; //!<Òèï äàííûõ èñïîëüçóåìûõ ïîëüçîâàòåëåì äëÿ õðàíåíèÿ ïîëåçíîé èíôîðìàöèè.
|
|
typedef uint64_t Frame; //!<Òèï äàííûõ îòïðàâëÿåìûé è ïîëó÷àåìûé ïî ëèíèè ñâÿçè.
|
|
|
|
static const std::size_t FrameSize; //!<Ôèêñèðîâàííûé ðàçìåð (â áèòàõ) êàäðà, ïåðåäàâàåìîãî ïî ëèíèè ñâÿçè.
|
|
|
|
//!Êîäèðîâàíèå ïåðåäàâàåìûõ äàííûõ.
|
|
static Frame encode();
|
|
|
|
//!Äåêîäèðîâàíèå ïðèíÿòîãî êàäðà.
|
|
static Data decode( Frame frame );
|
|
|
|
typedef uint16_t RegAddress; //!<Òèï àäðåñà ðåãèñòðà â óñòðîéñòâå.
|
|
|
|
struct Packager {
|
|
typedef PackagerADS1259Extended::Frame Frame;
|
|
typedef PackagerADS1259Extended::Data Data;
|
|
|
|
enum : RegAddress {
|
|
RDATA = 0x12 //Read data by opcode
|
|
};
|
|
|
|
//!Óïàêîâêà äàííûõ âî ôðýéì.
|
|
Frame pack() const;
|
|
|
|
//!Ðàñïàêîâêà äàííûõ èç ôðýéìà.
|
|
Data unpack( Frame frame ) const;
|
|
};
|
|
|
|
//!Ñòðóêòóðà êîìïàíîâêè àäðåñíîãî çàãîëîâêà è ÑËÎÂÀ äàííûõ.
|
|
struct LongCommandRegisterForm {
|
|
uint16_t second_opcode_byte : 8;
|
|
uint16_t first_opcode_byte : 8;
|
|
uint16_t data;
|
|
|
|
LongCommandRegisterForm(uint16_t first_opcode, uint16_t second_opcode) : second_opcode_byte(second_opcode), first_opcode_byte(first_opcode) {}
|
|
};
|
|
|
|
//!Ñòðóêòóðà êîìïàíîâêè àäðåñíîãî çàãîëîâêà è ÑËÎÂÀ äàííûõ, äëÿ êîðîòêèõ êîìàíä.
|
|
struct ShortCommandRegisterForm {
|
|
uint16_t opcode_byte : 8;
|
|
uint32_t data;
|
|
|
|
static ShortCommandRegisterForm fromFrame(Frame frame);
|
|
|
|
ShortCommandRegisterForm(uint16_t opcode) : opcode_byte(opcode) {}
|
|
ShortCommandRegisterForm(): opcode_byte(0) {}
|
|
};
|
|
|
|
};
|
|
|
|
} /* namespace chipset */
|
|
} /* namespace driver */
|
|
|
|
#endif /* UMLIBRARY_DRIVER_CHIPSET_PACKAGERADS1259EXTENDED_HH_ */
|