MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/driver/DataImageF150221.cpp
2024-06-07 11:12:56 +03:00

172 lines
4.1 KiB
C++

/*
* DataImageF150221.cpp
*
* Created on:
* Author: titov
*/
#include "DataImageF150221.hh"
bool driver::bf::DataImageF150221::insert_new_setting(
Id id, Size size ) {
if( get_image_size() + sizeof( SettingInfo ) + aligned_size( size ) > max_size )
return false;
move_buff( data_buff, data_buff + head->buff_size, aligned_size( sizeof( SettingInfo ) ) );
unsigned int next_index = head->setting_count;
info[next_index].id = id;
info[next_index].size = size;
info[next_index].crc = 0;
head->setting_count = next_index + 1;
data_buff = data_buff + aligned_size( sizeof( SettingInfo ) );
head->buff_size = head->buff_size + aligned_size( size );
return true;
}
bool driver::bf::DataImageF150221::build_from_buff( char * buff, std::size_t buff_size, std::size_t buff_align ) {
max_size = buff_size;
data_align = buff_align;
head = reinterpret_cast<Head *>( buff );
info = reinterpret_cast<SettingInfo *>( buff + sizeof(Head) );
data_buff = buff + aligned_size( sizeof(Head) + aligned_size( sizeof(SettingInfo) ) * head->setting_count );
return get_image_size() < buff_size;
}
bool driver::bf::DataImageF150221::change_size(
Size new_size, Setting setting ) {
int delta = aligned_size( new_size ) - aligned_size( setting.info->size );
if( delta + get_image_size() > max_size )
return false;
move_buff( setting.buffer, data_buff + head->buff_size, delta );
setting.info->size = new_size;
setting.info->crc = 0;
head->buff_size = head->buff_size + delta;
return true;
}
bool driver::bf::DataImageF150221::change_setting_info(
Id id, Size size ) {
Setting setting = extract_setting( id );
if( setting.info == &default_info )
return insert_new_setting( id, size );
else
return change_size( size, setting );
}
std::size_t driver::bf::DataImageF150221::get_image_size() const {
return sizeof(Head) + sizeof(SettingInfo) * head->setting_count + head->buff_size;
}
std::size_t driver::bf::DataImageF150221::show_setting_size(
Id id ) const {
return extract_setting( id ).info->size;
}
char * driver::bf::DataImageF150221::show_setting_data_buff(
Id id ) const {
return extract_setting( id ).buffer;
}
void driver::bf::DataImageF150221::move_buff(
char * from, char * to, int delta ) {
if( delta > 0 ) do {
*( to + delta ) = *to;
} while( to-- != from );
else if( delta < 0 ) do {
*( from + delta ) = *from;
} while( from++ != to );
}
driver::bf::DataImageF150221::SettingInfo driver::bf::DataImageF150221::default_info =
{static_cast<uint16_t>(ULLONG_MAX), 0, 0};
driver::bf::DataImageF150221::Setting driver::bf::DataImageF150221::extract_setting( Id id ) const {
char * current_ptr = data_buff;
for( unsigned int i = 0; i < head->setting_count; i++ ) {
if( info[i].id == id ) {
if( current_ptr > data_buff + max_size )
return { &default_info, nullptr };
return { &info[i], current_ptr };
}
current_ptr = current_ptr + aligned_size( info[i].size );
}
return { &default_info, nullptr };
}
std::pair<char *, std::size_t> driver::bf::DataImageF150221::show_setting( Id id ) const {
Setting setting = extract_setting( id );
return { setting.buffer, setting.info->size };
}
std::pair<char *, std::size_t> driver::bf::DataImageF150221::show_setting_crc(
Id id ) const {
Setting setting = extract_setting( id );
return { reinterpret_cast<char *>( &setting.info->crc ), sizeof(setting.info->crc) };
}
std::size_t driver::bf::DataImageF150221::aligned_size(
std::size_t size ) const {
return ( size + data_align - 1 ) & ~( data_align - 1 );
}
void driver::bf::DataImageF150221::reset() {
if(head) {
head->buff_size = 0;
head->setting_count = 0;
head->info_crc = 0;
data_buff = reinterpret_cast<char *>( head ) + aligned_size( sizeof(Head) + sizeof(SettingInfo) * head->setting_count );
}
}