// // Created by titov on 03.11.2021. // #include "MemoryAccessPublisher.hh" #include 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; }