MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/driver/BinaryCrcCheck.cpp

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