// // Created by titov on 25.11.2021. // #ifndef UMLIBRARY_DEV_COMMUNICATION_BISSCCHANNEL_HH #define UMLIBRARY_DEV_COMMUNICATION_BISSCCHANNEL_HH #include "../../communication/format/BinaryDataPublisher.hh" #include "../../common/Crc.hpp" namespace communication { namespace bissc { //!Формат кадра данных соотвествующий каналу протокола BiSS-C. /*!Канал имеет контрольную сумму, флаг предупреждения и флаг ошибки данных канала.\n * Контрольная сумма считается по всем данным канала, кроме поля crc. * Контрольная сумма лежит в младших битах. * * Канал данных имеет следующие характеристики: * * Размер от 0 до 64 бит; * * Стоп-бит в начале кадра или его отсутвие; * * Время обработки данных от 0 мкс до таймаута шины; * * Выравнивание данных по правому или левому краю; * * Код полинома CRC от 0 до 16 бит; * * Стартовое значение CRC от 0 до 16 бит. */ class BissCChannel : public format::BinaryDataPublisher { bool fault; bool warning; mutable bool crc_error; uint16_t (* const crc_check)(const char * data, std::size_t size); const std::size_t fault_offset; const std::size_t warning_offset; const uint16_t crc_mask; const uint64_t data_mask; const std::size_t crc_bitsize; public: BissCChannel( std::pmr::memory_resource * memory_resource, std::size_t channel_bitsize, std::size_t crc_bitsize, uint16_t (* crc_check)(const char * data, std::size_t size), std::size_t fault_offset = -1, std::size_t warning_offset = -1); virtual void read( const void * data, std::size_t size ) override; const bool & isFault() const; const bool & isWarning() const; bool isCrcError() const; }; } } #endif //UMLIBRARY_DEV_COMMUNICATION_BISSCCHANNEL_HH