MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/communication/bissc/BissCChannel.cpp
2024-06-07 11:12:56 +03:00

60 lines
2.3 KiB
C++

//
// Created by titov on 25.11.2021.
//
#include "BissCChannel.hh"
#include "../format/BinaryHelpers.hh"
#include <algorithm>
communication::bissc::BissCChannel::BissCChannel(std::pmr::memory_resource * memory_resource,
std::size_t channel_bitsize, std::size_t crc_bitsize,
uint16_t (*crc_calculation)(const char *, std::size_t),
std::size_t fault_offset,
std::size_t warning_offset) :
format::BinaryDataPublisher(memory_resource),
fault(false), warning(false), crc_error(false),
crc_check(crc_calculation),
crc_mask( ~(static_cast<uint16_t>(-1) << crc_bitsize) ),
data_mask( ~(static_cast<uint64_t>(-1) << static_cast<uint64_t>( channel_bitsize - crc_bitsize ) ) ),
crc_bitsize( crc_bitsize ),
warning_offset(warning_offset), fault_offset(fault_offset) {}
void communication::bissc::BissCChannel::read(const void * data, std::size_t size) {
uint16_t crc_origin = ( *reinterpret_cast<const uint16_t *>(data) & crc_mask );
uint64_t data_value = ( (*reinterpret_cast<const uint64_t *>(data)) >> crc_bitsize ) & data_mask;
uint16_t crc_calc = 0;
crc_calc = crc_check ? (*crc_check)(reinterpret_cast<const char *>(&data_value), size) : crc_origin;
if( crc_calc == crc_origin ) {
if(fault_offset != static_cast<std::size_t>(-1) )
fault = ( data_value >> fault_offset ) & 1u;;
if(warning_offset != static_cast<std::size_t>(-1) )
warning = ( data_value >> warning_offset ) & 1u;
BinaryDataPublisher::read(&data_value, size);
} else
crc_error = true;
}
const bool & communication::bissc::BissCChannel::isFault() const {
return fault;
}
const bool & communication::bissc::BissCChannel::isWarning() const {
return warning;
}
bool communication::bissc::BissCChannel::isCrcError() const {
bool error = crc_error;
crc_error = false;
return error;
}