172 lines
4.0 KiB
C++
172 lines
4.0 KiB
C++
/*
|
||
* CustomParametersConsoleCustomizer.cpp
|
||
*
|
||
* Created on: 22 нояб. 2016 г.
|
||
* Author: Gorbunov_DV
|
||
*/
|
||
|
||
#include "CustomParametersConsoleCustomizer.hh"
|
||
|
||
#include <cstddef>
|
||
#include <stdint.h>
|
||
#include <climits>
|
||
|
||
#include <mutex>
|
||
#include <shared_mutex>
|
||
|
||
namespace communication { namespace service {
|
||
|
||
using driver::IRxLink;
|
||
using driver::ITxLink;
|
||
|
||
CustomParametersConsoleCustomizer::CustomParametersConsoleCustomizer(
|
||
driver::IParamStorage & storage ) :
|
||
write_param(storage), read_param(storage),
|
||
requestLoadParametersToMemory(storage), requestStoreParametersToMemory(storage), storage_state(storage), erase_storage(storage) {}
|
||
|
||
void CustomParametersConsoleCustomizer::WriteParameterMessageHandler::handler( IMessageLink * link ) {
|
||
|
||
ParametersPackHead head;
|
||
ParamSetting param_head;
|
||
|
||
IRxLink & indata = link->getData();
|
||
|
||
if( indata >> head ) {
|
||
|
||
Quantity quantity = head.quantity;
|
||
|
||
if( storage ) for( Quantity i = 0; i < quantity and ( indata >> param_head ); i++ ) {
|
||
|
||
std::size_t n = param_head.byte_size * 8 / CHAR_BIT; //проблема количества бит
|
||
|
||
systemic::SharedData parameter = storage->createParameterBuff( param_head.id, n );
|
||
|
||
if( parameter.get().first ) {
|
||
|
||
std::lock_guard<systemic::SharedData> lock(parameter);
|
||
|
||
indata.receive( parameter.get().first, parameter.get().second );
|
||
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void CustomParametersConsoleCustomizer::ReadParameterMessageHandler::handler( IMessageLink * link ) {
|
||
|
||
ParametersPackHead head;
|
||
uint16_t buff_id[max_read_parameter];
|
||
|
||
IRxLink & indata = link->getData();
|
||
|
||
if( indata >> head ) {
|
||
|
||
Quantity quantity = head.quantity;
|
||
|
||
std::size_t total_size = 0;
|
||
|
||
//Вычисление размера.
|
||
if( storage ) for( Quantity i = 0; i < quantity; i++ ) {
|
||
|
||
if( not ( indata >> buff_id[i] ) )
|
||
return;
|
||
|
||
uint16_t id = buff_id[i];
|
||
|
||
systemic::SharedData parameter = storage->getParameterBuff(id);
|
||
|
||
total_size += parameter.get().second;
|
||
|
||
}
|
||
|
||
ITxLink & outdata( link->createMessage( sizeof(ParametersPackHead) + sizeof(ParamSetting)*quantity + total_size ) );
|
||
|
||
outdata << head;
|
||
|
||
if( storage ) for( std::size_t i = 0; i < quantity; i++ ) {
|
||
|
||
uint16_t id = buff_id[i];
|
||
|
||
systemic::SharedData parameter = storage->getParameterBuff(id);
|
||
|
||
ParamSetting param_head;
|
||
|
||
if( parameter.get().first ) {
|
||
|
||
param_head.id = id;
|
||
param_head.byte_size = parameter.get().second * CHAR_BIT / 8; //проблема количества бит
|
||
|
||
}
|
||
|
||
outdata << param_head;
|
||
|
||
{
|
||
std::shared_lock<systemic::SharedData> lock( parameter );
|
||
|
||
outdata.send( parameter.get().first, parameter.get().second );
|
||
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
void CustomParametersConsoleCustomizer::RequestLoadParametersToMemory::handler( IMessageLink * link ) {
|
||
|
||
ParametersPackHead head;
|
||
|
||
IRxLink & indata = link->getData();
|
||
|
||
if( indata >> head ) {
|
||
|
||
if( storage )
|
||
storage->load();
|
||
|
||
}
|
||
}
|
||
|
||
void CustomParametersConsoleCustomizer::RequestStoreParametersToMemory::handler( IMessageLink * link ) {
|
||
|
||
ParametersPackHead head;
|
||
|
||
IRxLink & indata = link->getData();
|
||
|
||
if( indata >> head ) {
|
||
|
||
if( storage )
|
||
storage->flush();
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
} /* namespace system */
|
||
|
||
void communication::service::CustomParametersConsoleCustomizer::RequestStorageState::handler(
|
||
IMessageLink * link ) {
|
||
|
||
ParametersPackHead head;
|
||
|
||
IRxLink & indata = link->getData();
|
||
|
||
if( indata >> head ) {
|
||
|
||
bool state = storage ? storage->isDataSync() : false;
|
||
|
||
ITxLink & outdata( link->createMessage( sizeof(ParametersPackHead) + sizeof(bool) ) );
|
||
|
||
outdata << head;
|
||
outdata << state;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
void communication::service::CustomParametersConsoleCustomizer::EraseStorage::handler(
|
||
IMessageLink * link ) {
|
||
|
||
if(storage)
|
||
storage->clear();
|
||
|
||
}
|