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;
|
|
|
|
}
|