MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/systemic/CustomParameters.hpp

156 lines
4.7 KiB
C++

/*
* CustomParameters.h
*
* Created on: 14 íîÿá. 2016 ã.
* Author: Gorbunov_DV
*/
#ifndef SOURCE_SYSTEM_CUSTOMPARAMETERS_H_
#define SOURCE_SYSTEM_CUSTOMPARAMETERS_H_
#include "IParameterProvider.hh"
#include <mutex>
#include "SystemException.hh"
namespace systemic {
//!Ìîäóëü îñóùåòñâëÿþùèé äîñòóï ê ïàðàìåòðàì ñèñòåìû è äèíàìè÷åñêèì ñòðîêàì.
class CustomParameters {
private:
IParameterProvider * * const providers; //!<Ìàññèâ èñòî÷íèêîâ ïàðàìåòðîâ.
const std::size_t size; //!<Ðàçìåð ìàññèâà èñòî÷íèêîâ ïàðàìåòðîâ.
public:
typedef unsigned short ProviderId;
typedef unsigned int Id;
//!Ïîëó÷èòü ñòðîêó.
/*!Âîçâðàùàåò ñòðîêó â ñëó÷àå åñëè îíà åñòü â çàäàííîì èñòî÷íèêå ïàðàìåòðîâ.
*
* \param[in] provider_id Èñòî÷íèê ïàðàìåòðîâ.
* \param[in] parameter_id Èäåíòèôèêàòîð ñòðîêè.
*
* \return Óêàçàòåëü è ðàçìåð ñòðîêè, â ñëó÷àå îøèáêè - (nullptr, 0).
*/
SharedData getString( ProviderId provider_id, Id parameter_id ) const;
/*!Ñîçäàòü ñòðîêó.
*
* \param[in] provider_id Èñòî÷íèê ïàðàìåòðîâ.
* \param[in] parameter_id Èäåíòèôèêàòîð ñòðîêè.
* \param[in] size Ðàçìåð ñòðîêè.
*
* \return Óêàçàòåëü è ðàçìåð ñòðîêè, â ñëó÷àå îøèáêè - (nullptr, 0).
*/
SharedData createString( ProviderId provider_id, Id parameter_id, std::size_t size);
//!Ñèíõðîíèçèðîâàòü ñòðîêó â ÏÇÓ.
/*!Ñèíõðîíèçèðóåò ñòðîêó â ñëó÷àå åñëè:
* * óêàçàòåëü íà ñòðîêó íå èçìåíèëñÿ.
* * ðàçìåð ñòðîêè íå èçìåíèëñÿ.
* * äàííàÿ ñòðîêà ñóùåñòâóåò â çàäàííîì èñòî÷íèêå ïàðàìåòðîâ.
*
* \param[in] provider_id Èñòî÷íèê ïàðàìåòðîâ.
* \param[in] parameter_id Èäåíòèôèêàòîð ñòðîêè.
* \param[in] string Óêàçàòåëü è ðàçìåð ñòðîêè.
* \return Ñòðîêà áóäåò ñèíõðîíèçèðîâàííà, èëè îøèáêà äîñòóïà.
*/
bool flushString( ProviderId provider_id, Id parameter_id, std::pair<const peripheral::protected_char *, std::size_t> string );
//!Äîáàâèòü èñòî÷íèê ïàðàìåòðîâ ñ çàäàííûì èäåíòèôèêàòîðîì.
bool addProvider( IParameterProvider * provider, ProviderId provider_id );
CustomParameters( IParameterProvider * * providers, std::size_t size );
};
template<typename T>
struct Parameter {
SharedData data;
operator bool() const;
};
template<typename T>
struct LocalSetting {
LocalSetting( Parameter<T> & );
typename T::Setting & setting;
std::lock_guard<SharedData> guard;
};
//!Âîçâðàùàåò óêàçàòåëü íà âàëèäíóþ ñòðóêòóðó íàñòðîåê, èëè nullptr.
template<typename T>
Parameter<T> getSetting( CustomParameters & cparams, CustomParameters::ProviderId provider_id, CustomParameters::Id id );
//!Ïîëó÷åíèå ñòðîêè äàííûõ ïî èäåíòèôèêàòîðó.
/*!Ãàðàíòèðóåò ÷òî äëÿ âñåõ âûçîâîâ ñ îäèíàêîâûìè id, provider_id, cparams, ìû ïîëó÷èì îäèíàêîâûå string.
*
*/
bool getStringView( SharedData & string, const CustomParameters & cparams, CustomParameters::ProviderId provider_id, CustomParameters::Id id );
//!Ñîçäàíèå ñòðîêè äàííûõ ïî èäåíòèôèêàòîðó.
/*!Ãàðàíòèðóåò ÷òî äëÿ âñåõ âûçîâîâ ñ îäèíàêîâûìè id, provider_id, cparams, ìû ñîçäàäèì îäèíàêîâûå string.
*
*/
bool createStringView( SharedData & string, CustomParameters & cparams, CustomParameters::ProviderId provider_id, std::size_t size, CustomParameters::Id id );
template<std::size_t size>
struct CustomParametersBox {
IParameterProvider * records[size];
CustomParameters manager;
CustomParametersBox() :
records(), manager( records, size ) {}
};
}
//
//struct InvalidSetting : public systemic::SystemException {
//
// struct Data {
// systemic::CustomParameters::ProviderId provider_id;
// systemic::CustomParameters::Id id;
// } data;
//
// std::size_t id() const noexcept { return 97; }
// std::pair<const char *, std::size_t> binary() const noexcept {
// return std::make_pair<const char *, std::size_t>( reinterpret_cast<const char *>(&data), sizeof(Data) );
// }
//
//};
template<typename T>
inline systemic::Parameter<T> systemic::getSetting( CustomParameters & cparams, CustomParameters::ProviderId provider_id, CustomParameters::Id id ) {
systemic::Parameter<T> result;
SharedData setting = cparams.getString( provider_id, id );
if( setting.get().first )
result.data = setting;
return result;
}
template<typename T>
inline systemic::Parameter<T>::operator bool() const {
//todo: check alignof
if( data.get().second == sizeof(typename T::Setting) )
return LocalSetting<T>(const_cast<Parameter<T> &>(*this)).setting.isValid();
return false;
}
template<typename T>
inline systemic::LocalSetting<T>::LocalSetting( Parameter<T> & parameter ) :
guard( parameter.data ), setting( *reinterpret_cast< typename T::Setting * >( parameter.data.get().first ) ) {}
#endif /* SOURCE_SYSTEM_CUSTOMPARAMETERS_H_ */