169 lines
5.2 KiB
C++
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_ */
|