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