MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/logging/LogStorageStreamAgent.cpp

91 lines
2.3 KiB
C++
Raw Normal View History

#include "LogStorageStreamAgent.hh"
namespace logging {
LogStorageStreamAgent::LogStorageStreamAgent( StorageReadInterface & _storage ) : storage(_storage), log_parameters(*this), reading_records_block(*this) {}
communication::IMessageHandler * LogStorageStreamAgent::get_context_of( StreamingContex context ) {
communication::IMessageHandler * mh;
switch (context) {
case LOG_STORAGE_PARAMETES: {
mh = &log_parameters;
} break;
case READ_RECORDS_BLOCK: {
mh = &reading_records_block;
} break;
default: {
mh = nullptr;
} break;
}
return mh;
}
void LogStorageStreamAgent::LogParameters::handler( communication::IMessageLink * link ) {
using driver::IRxLink;
using driver::ITxLink;
uint16_t n = agent.storage.blocks_count();
uint16_t l = agent.storage.block_size();
uint32_t power_on = agent.storage.power_on();
uint64_t time = std::time( nullptr );
ITxLink & outdata(link->createMessage( sizeof(uint16_t) * 2 + sizeof(uint32_t) + sizeof(uint64_t) ) );
outdata << n;
outdata << l;
outdata << power_on;
outdata << time;
}
void LogStorageStreamAgent::ReadingRecordsBlock::handler( communication::IMessageLink * link ) {
using driver::IRxLink;
using driver::ITxLink;
IRxLink & indata( link->getData() );
StorageManager::BlockId requested_block;
if( indata >> requested_block ) {
std::pair<StorageManager::prefetch_result, StorageManager::DataBlock> prefetch_result = agent.storage.prefetch_block( requested_block );
if( prefetch_result.first == StorageManager::COMPLETE ) {
Responce responce_head;
responce_head.operation_result = prefetch_result.first;
responce_head.length = prefetch_result.second.second;
ITxLink & outdata( link->createMessage( sizeof(Responce) + prefetch_result.second.second ) );
outdata << responce_head;
outdata.send( prefetch_result.second.first, prefetch_result.second.second );
} else {
Responce responce;
responce.operation_result = prefetch_result.first;
responce.length = 0;
ITxLink & outdata( link->createMessage( sizeof(Responce) ) );
outdata << responce;
}
}
}
}