53 lines
1.5 KiB
C++
53 lines
1.5 KiB
C++
/*
|
||
* 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<const char *>(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;
|
||
|
||
}
|