/* * BiSSCMasterLogic.hh * * Created on: 7 сент. 2021 г. * Author: sozonov */ #ifndef UMLIBRARY_DRIVER_BISSCMASTERLOGIC_HH_ #define UMLIBRARY_DRIVER_BISSCMASTERLOGIC_HH_ #include #include #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( data_first[0] ) ); } }; } /* namespace driver */ #endif /* UMLIBRARY_DRIVER_BISSCMASTERLOGIC_HH_ */