/* * DataImageF150221.hh * * Created on: 15 февр. 2021 г. * Author: titov */ #ifndef UMLIBRARY_DRIVER_DATAIMAGEF150221_HH_ #define UMLIBRARY_DRIVER_DATAIMAGEF150221_HH_ #include #include #include #include namespace driver { namespace bf { //!Структура описания данных в буфере: формат от 15 02 2021. struct DataImageF150221 { typedef uint16_t Id; typedef uint16_t Size; typedef uint16_t Crc; //!Заголовок: описание данных в памяти. struct Head { uint16_t setting_count; //!<Количество настроек. uint16_t buff_size; //!<Суммарный размер всех настроек. uint32_t info_crc; //!<Контрольная сумма структур описания, без конторльных сумм данных. } * head; //!<Указатель на начало образа, заголовок. //!Информационная структура описания параметра, образ в ПЗУ. struct SettingInfo { uint16_t id; //!<Идентификатор настройки uint16_t size; //!<Размер структуры uint16_t crc; //!<Контрольная сумма данных настройки. uint16_t key; //!<Поле для выравнивания. } * info; //!<Массив структур char * data_buff; //!<Указатель на начало данных настроек. std::size_t max_size; //!<Максимальный размер данных в буфере. std::size_t data_align; //!<Выравнивание данных в буфере. std::size_t show_setting_size( Id id ) const; //!<Получить размер буфера по id, либо 0. char * show_setting_data_buff( Id id ) const; //!<Получить буфер данных на чтение по id, либо 0. std::pair show_setting( Id id ) const; std::pair show_setting_crc( Id id ) const; //!Функция изменяет структуру буфера под новые потребности. /*!Функция изменяет структуру буфера для возможности хранения настройки с идентификатором id, размером size. * \param[in] id Идентификатор настройки, новый или существующий. * \param[in] size Размер настройки. * \return Признак завершения операции: true - если место под настройку выделено, false - в случае ошибки. */ bool change_setting_info( Id id, Size 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(); protected: static SettingInfo default_info; struct Setting { SettingInfo * info; char * buffer; }; Setting extract_setting( Id id ) const; private: bool insert_new_setting( Id id, Size size ); bool change_size( Size size, Setting setting ); //!Функция перемещает отрезок памяти на выбранное смещение. /*!Функция перемещает отрезок памяти на выбранное смещение. * \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; }; }} #endif /* UMLIBRARY_DRIVER_DATAIMAGEF150221_HH_ */