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