MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/driver/BiSSCMasterLogic.hh

94 lines
4.2 KiB
C++
Raw Normal View History

2024-06-07 11:12:56 +03:00
/*
* 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_ */