94 lines
4.2 KiB
C++
94 lines
4.2 KiB
C++
/*
|
||
* BiSSCMasterLogic.hh
|
||
*
|
||
* Created on: 7 сент. 2021 г.
|
||
* Author: sozonov
|
||
*/
|
||
|
||
#ifndef UMLIBRARY_DRIVER_BISSCMASTERLOGIC_HH_
|
||
#define UMLIBRARY_DRIVER_BISSCMASTERLOGIC_HH_
|
||
#include <stdint.h>
|
||
#include <memory_resource>
|
||
|
||
|
||
#include "../systemic/IProcess.hh"
|
||
#include "../peripheral/IMemoryAccess.hh"
|
||
#include "../peripheral/ISerialPort.hh"
|
||
|
||
#include "../communication/format/BinaryDataPublisher.hh"
|
||
|
||
namespace driver {
|
||
|
||
enum CrcPolinom : uint16_t{
|
||
crc6_BiSS_C,
|
||
};
|
||
|
||
class BiSSCMasterLogic : public communication::ISubscriberRegistrator, public systemic::IProcess {
|
||
public:
|
||
explicit BiSSCMasterLogic ( peripheral::ISerialPort *_serial_port, uint16_t _crc_polinom, std::pmr::memory_resource * memory_resource );
|
||
|
||
//todo: необходимо изменить, после релизации метода CRC во время инициализации (tasks: UFC-677, UFC-680)
|
||
typedef CrcPolinom CrcType;
|
||
|
||
// communication::ISubscriberRegistrator override methods
|
||
virtual void addSubscriber( std::size_t bit_address, std::size_t bit_len, communication::IBinaryDataSubscriber * subscriber ) override ;
|
||
|
||
//!Основной фоновый метод, отвечающий за прием и чтение и разбор фрейма данных.
|
||
void process();
|
||
|
||
/*!Метод разбора сообщения на составляющие: флаги предепреждения и ошибки, проверка контрольной суммы, а так-же "полезные" данные из фрейма.
|
||
*
|
||
* @param data - указатель на данные, которые в процессе работы разбирутся на составляющие, в указателе останется только "чистая информация", без crc и fW, fE
|
||
* @return флаг проверки контрольной суммы (1/0 - успех/неудача)
|
||
*/
|
||
bool parce( uint16_t *data);
|
||
|
||
private:
|
||
communication::format::BinaryDataPublisher binary_sybscriber; //!Абонент.
|
||
|
||
peripheral::ISerialPort *serial_port; //!Интерфейс последовательного порта, по которому будет производится получение пакета данных.
|
||
CrcType crc_type; //!<Тип полинома для подсчёта контрольной суммы.
|
||
|
||
uint16_t data_lenght; //!<Длина данных в битах, получаемых по протоколу BiSS-C.
|
||
|
||
bool f_reading_data; //!<Флаг, указывающий на то, в какой буфер вести чтение данных.
|
||
uint16_t crc_size; //!<Размер контрольной суммы, содержащейся в посылке.
|
||
uint16_t err_warn_size; //!<Количество бит, отвечающие за статсы ошибок и предупреждений.
|
||
|
||
const uint16_t size_of_array = ( data_lenght + ( ( data_lenght ) % CHAR_BIT ) ) / CHAR_BIT ;
|
||
|
||
uint16_t tmp_data_to_transm[32];
|
||
uint16_t data_first[32]; //!<Буфер данных, которых необходимо записать в память.
|
||
|
||
bool fE; //!<Статус ошибки, пришедший в BiSS-C фрейме данных.
|
||
bool fW; //!<Статус предупреждения, пришедший в BiSS-C фрейме данных.
|
||
bool crc_error; //!<Статус ошибки проверки контрольной суммы.
|
||
|
||
bool read_complete;
|
||
bool write_complete;
|
||
|
||
bool spi_tx_result = false;
|
||
|
||
void update_size( std::size_t binary_sybscriber_BitSize );
|
||
|
||
std::size_t data_lenth_to_subscriber;
|
||
|
||
public:
|
||
|
||
const bool & get_fE() { return fE; };
|
||
|
||
const bool & get_fW() { return fW; };
|
||
|
||
const bool & get_crcError() { return crc_error; };
|
||
|
||
//!Получение значения текущего времени.
|
||
float getData() const { return ( static_cast<float>( data_first[0] ) ); }
|
||
|
||
};
|
||
|
||
} /* namespace driver */
|
||
|
||
|
||
|
||
#endif /* UMLIBRARY_DRIVER_BISSCMASTERLOGIC_HH_ */
|