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

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