MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/driver/ParamStaticStorage.hh

169 lines
5.2 KiB
C++

/*
* ParamStaticStorage.h
*
* Created on: 19 íîÿá. 2018 ã.
* Author: titov
*/
#ifndef SOURCE_DRIVER_PARAMSTATICSTORAGE_H_
#define SOURCE_DRIVER_PARAMSTATICSTORAGE_H_
#include "IParamStorage.hh"
#include "../systemic/IParameterProvider.hh"
#include "../systemic/IProcess.hh"
#include "../peripheral/IMemoryAccess.hh"
#include <memory_resource>
#include <deque>
#include <cstddef>
#include <stdint.h>
namespace driver { namespace detail {
class ParamStaticStorage : public IParamStorage, public systemic::IProcess {
private:
peripheral::IMemoryAccess & memory; //!<Óêàçàòåëü íà èíòåðôåéñ ðàáîòû ñ ïàìÿòüþ
char * const buff; //!<Áóôåð äëÿ ðàáîòû ñ äàííûìè õðàíèìûìè â ïàìÿòè.
const std::size_t buff_size; //!<Ðàçìåð áóôåðà.
//systemic::IProcessControl * proc_ctrl;
//!Ñòðóêòóðà îïèñàíèÿ äàííûõ â áóôåðå, äàííûõ õðàíèìûõ â memory.
struct DataImage {
//!Çàãîëîâîê: îïèñàíèå äàííûõ â ïàìÿòè.
struct Head {
uint16_t setting_count; //!<Êîëè÷åñòâî íàñòðîåê.
uint16_t buff_size; //!<Ñóììàðíûé ðàçìåð âñåõ íàñòðîåê.
uint32_t setting_crc; //!<Êîíòðîëüíàÿ ñóììà âñåãî DataImage.
} * head;
//!Èíôîðìàöèîííàÿ ñòðóêòóðà îïèñàíèÿ ïàðàìåòðà, îáðàç â ÏÇÓ.
struct SettingInfo {
uint16_t id; //!<Èäåíòèôèêàòîð íàñòðîéêè
uint16_t setting_size; //!<Ðàçìåð ñòðóêòóðû
} * info; //!<Ìàññèâ ñòðóêòóð
char * data_buff; //!<Óêàçàòåëü íà íà÷àëî äàííûõ íàñòðîåê.
std::size_t max_size; //!<Ìàêñèìàëüíûé ðàçìåð äàííûõ â áóôåðå.
std::size_t data_align; //!<Âûðàâíèâàíèå äàííûõ â áóôåðå.
//!Ôóíêöèÿ âû÷èñëÿåò óêàçàòåëü íà áóôåð íàñòðîéêè.
char * extract_setting_data_buff( unsigned int id, unsigned int size ) const;
unsigned int show_setting_size( unsigned int id ) const;
const char * show_setting_data_buff( unsigned int id ) const;
//!Ôóíêöèÿ èçìåíÿåò ñòðóêòóðó áóôåðà ïîä íîâûå ïîòðåáíîñòè.
/*!Ôóíêöèÿ èçìåíÿåò ñòðóêòóðó áóôåðà äëÿ âîçìîæíîñòè õðàíåíèÿ íàñòðîéêè ñ èäåíòèôèêàòîðîì id, ðàçìåðîì size.
* \param[in] id Èäåíòèôèêàòîð íàñòðîéêè, íîâûé èëè ñóùåñòâóþùèé.
* \param[in] size Ðàçìåðë íàñòðîéêè.
* \return Ïðèçíàê çàâåðøåíèÿ îïåðàöèè: true - åñëè ìåñòî ïîä íàñòðîéêó âûäåëåíî, false - â ñëó÷àå îøèáêè.
*/
bool change_setting_info( unsigned int id, unsigned int size );
//!Ôóíêöèÿ ñòðîèò îáðàç äàííûõ èñõîäÿ èç ïðåäîñòàâëåííîãî ìàññèâà áàéò.
//!\param[in] buff Ìàññèâ áàéò â êîòîðîì õðàíÿòüñÿ äàííûå ñîîòâåñòâóþùèå îáðàçó.
bool build_from_buff( char * buff, std::size_t buff_size, std::size_t buff_align );
//!Ôóíêöèÿ âîçâðàùàåò ðàçìåð îáðàçà.
std::size_t get_image_size() const;
void reset();
private:
bool insert_new_setting( unsigned int id, unsigned int size );
bool change_size( unsigned int size, unsigned int index,
char * data_pointer );
//!Ôóíêöèÿ ïåðåìåùàåò îòðåçîê ïàìÿòè íà âûáðàííîå ñìåùåíèå.
/*!Ôóíêöèÿ ïåðåìåùàåò îòðåçîê ïàìÿòè íà âûáðàííîå ñìåùåíèå.
* \param[in] from Óêàçàòåëü íà íà÷àëî îòðåçêà ïàìÿòè.
* \param[in] to Óêàçàòåëü íà êîíåö îòðåçêà ïàìÿòè.
* \param[in] delta Ñìåùåíèå íà êîòîðîå íåîáõîäèìî âñå ïåðåìåñòèòü.
*/
void move_buff( char * from, char * to, int delta );
//!Ôóíêöèÿ âîçâðàùàåò ðàçìåð çàíèìàåìîé ïàìÿòè â ñîîòâåñòâèè ñ âûðàâíèâàíèåì.
std::size_t aligned_size( std::size_t ) const;
} image;
struct State {
enum Id {
Idle,
StartWrite,
WaitWrite,
StartReadHead,
WaitReadHead,
StartReadEnd,
WaitReadEnd,
StartWriteOnce,
WaitWriteOnce,
StartReadOnce,
WaitReadOnce,
StartUpdateCrc,
WaitUpdateCrc,
StartReadCrc,
};
};
State::Id state;
bool data_ready;
bool crc_error;
bool check_crc();
void update_crc();
bool isMemoryProcessing() const;
void disableProcess() {}
void enableProcess() {}
void temp_construct();
void temp_destruct();
typedef systemic::IParameterProvider::Id Id;
std::deque<Id, std::pmr::polymorphic_allocator<Id> > tasks;
struct Temp {
std::pair<char *, std::size_t> buff;
char * target;
std::size_t offset;
} temp;
public:
ParamStaticStorage( peripheral::IMemoryAccess & memory,
char * buff, std::size_t buff_size, std::pmr::memory_resource * task_buffer );
systemic::SharedData getParameterBuff( Id parameter_id ) const;
bool flushParameterBuff( Id parameter_id );
public:
void flush(); //!<
void load();
systemic::SharedData createParameterBuff( IParamStorage::Id parameter_id, std::size_t parameter_size );
std::pair<const char *, std::size_t> get4read( IParamStorage::Id id ) const;
bool isDataSync() const;
void clear(); //!<
//!Çàïðîñ îøèáêè ïàðàìåòðîâ.
/*!
* \return Ïðèçíàê îøèáêè ïàðàìåòðîâ
*/
bool isCrcError() const;
public:
void init( float );
void process();
};
}}
#endif /* SOURCE_DRIVER_PARAMSTATICSTORAGE_H_ */