/* * BinaryCrcCheck.cpp * * Created on: 21 мая 2023 г. * Author: titov */ #include "BinaryCrcCheck.hh" driver::BinaryCrcCheck::BinaryCrcCheck( common::crc::ICrcUnit::CrcCalcualtor calculator, communication::IBinaryDataSubscriber & protected_data, std::size_t crc_bit_address, std::size_t crc_bit_len, std::size_t data_bit_address, std::size_t data_bit_len, std::pmr::memory_resource * memory_resource ) : calculator(calculator), protected_data(protected_data), extract_crc(crc_bit_address, crc_bit_len, false), extract_data(data_bit_address, data_bit_len), crc_mismatch(false), buffer_data(memory_resource) { data_octet_size = communication::format::bits::octet_on_bits(data_bit_len); buffer_data.reserve( data_byte_size = communication::format::bits::bytes_on_bits(data_bit_len) ); temp_data_buffer = &buffer_data.front(); } void driver::BinaryCrcCheck::read( const void * frame, std::size_t frame_size ) { //Размер кадра не проверяем. (void) frame_size; const void * data = extract_data( frame, temp_data_buffer ); uint32_t crc_origin = 0; extract_crc( frame, &crc_origin ); uint32_t crc_calc = (*calculator)( reinterpret_cast(data), data_octet_size ); bool crc_valid = (crc_origin == crc_calc); if( crc_valid ) protected_data.read( data, data_byte_size ); crc_mismatch = not crc_valid; } const bool & driver::BinaryCrcCheck::error() const { return crc_mismatch; }