50 lines
1.3 KiB
C++
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;
|
|
}
|
|
}
|