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

50 lines
1.3 KiB
C++

/*
* SerialPacketReader.cpp
*
* Created on: 17 äåê. 2021 ã.
* Author: titov
*/
#include "SerialPacketReader.hh"
#include <algorithm>
#include <climits>
#include <cstddef>
#include "../communication/format/BinaryHelpers.hh"
driver::SerialPacketReader::SerialPacketReader(
peripheral::ISerialPort & serial_port,
communication::IBinaryDataSubscriber & binary_data,
std::pmr::memory_resource * memory_resource,
std::size_t bitsize, bool data_invers ) : serial_port(serial_port), binary_data(binary_data), bitsize(bitsize), data_frame(memory_resource),
data_invers(data_invers) {
data_frame.resize( communication::format::bits::bytes_on_bits(bitsize) );
}
void driver::SerialPacketReader::process() {
switch(phase) {
case response: {
if (serial_port.receive(&data_frame.front())) {
if( data_invers )
std::reverse(data_frame.begin(), data_frame.end());
binary_data.read( &data_frame.front(), data_frame.size() );
if( not serial_port.transmite(nullptr, bitsize) )
phase = request;
}
} break;
case request: {
if( serial_port.transmite(nullptr, bitsize) )
phase = response;
} break;
default: {} break;
}
}