/* * CustomParametersConsoleCustomizer.cpp * * Created on: 22 нояб. 2016 г. * Author: Gorbunov_DV */ #include "CustomParametersConsoleCustomizer.hh" #include #include #include #include #include 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 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 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(); }