54 lines
1.5 KiB
C++
54 lines
1.5 KiB
C++
//
|
|
// Created by titov on 03.11.2021.
|
|
//
|
|
|
|
#include "MemoryAccessPublisher.hh"
|
|
|
|
#include <algorithm>
|
|
|
|
driver::MemoryAccessPublisher::MemoryAccessPublisher(peripheral::IMemoryAccess & memory_access,
|
|
std::pmr::memory_resource * memory_resource) :
|
|
memory(memory_access), subscribers(memory_resource),
|
|
begin(-1), size(0), data_frame(memory_resource) {}
|
|
|
|
void driver::MemoryAccessPublisher::addSubscriber(std::size_t bit_address, std::size_t bit_len,
|
|
communication::IBinaryDataSubscriber * subscriber) {
|
|
|
|
phase = mute;
|
|
|
|
subscribers.addSubscriber(bit_address, bit_len, subscriber);
|
|
|
|
begin = std::min( begin, bit_address / CHAR_BIT );
|
|
std::size_t end = subscribers.getBitSize() / CHAR_BIT + 1; //todo: check it!
|
|
size = end - begin;
|
|
|
|
data_frame.resize( size );
|
|
|
|
phase = request;
|
|
|
|
}
|
|
|
|
void driver::MemoryAccessPublisher::process() {
|
|
//Метод может прерывать все методы класса, но не наоборот.
|
|
switch(phase) {
|
|
case request:
|
|
|
|
if( memory.read( &data_frame.front(), begin, size ) ) {
|
|
phase = response;
|
|
} else break;
|
|
|
|
case response:
|
|
if( memory.isReadComplete() ) {
|
|
subscribers.read(&data_frame.front(), data_frame.size());
|
|
phase = request;
|
|
} break;
|
|
|
|
case mute: break;
|
|
}
|
|
|
|
}
|
|
|
|
bool driver::MemoryAccessPublisher::probe() const {
|
|
return false;
|
|
}
|