MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/communication/service/CustomParametersConsoleCustomizer.cpp

172 lines
4.0 KiB
C++
Raw Permalink Normal View History

2024-06-07 11:12:56 +03:00
/*
* 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();
}