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