diff --git a/lib/momentum/momentum.h b/lib/momentum/momentum.h index 1bbbde2d4..bc9dea329 100644 --- a/lib/momentum/momentum.h +++ b/lib/momentum/momentum.h @@ -43,11 +43,6 @@ typedef enum { SpiCount, } SpiHandle; -_Static_assert(sizeof(MenuStyle) == sizeof(uint8_t), "enum too big, fix load/save"); -_Static_assert(sizeof(BatteryIcon) == sizeof(uint8_t), "enum too big, fix load/save"); -_Static_assert(sizeof(SpiHandle) == sizeof(uint8_t), "enum too big, fix load/save"); -_Static_assert(sizeof(FuriHalSerialId) == sizeof(uint8_t), "enum too big, fix load/save"); - typedef struct { char asset_pack[ASSET_PACKS_NAME_LEN]; uint32_t anim_speed; diff --git a/lib/momentum/settings.c b/lib/momentum/settings.c index f5b1d3de6..898b98c81 100644 --- a/lib/momentum/settings.c +++ b/lib/momentum/settings.c @@ -47,7 +47,6 @@ typedef enum { momentum_settings_type_str, momentum_settings_type_int, momentum_settings_type_uint, - momentum_settings_type_enum, momentum_settings_type_bool, } momentum_settings_type; @@ -60,19 +59,20 @@ static const struct { struct { int32_t i_min; int32_t i_max; + uint8_t i_sz; }; struct { uint32_t u_min; uint32_t u_max; + uint8_t u_sz; }; - uint8_t e_cnt; }; -#define clamp(t, min, max) .t##_min = min, .t##_max = max #define setting(t, n) .type = momentum_settings_type##t, .key = #n, .val = &momentum_settings.n #define setting_str(n) setting(_str, n), .str_len = sizeof(momentum_settings.n) -#define setting_int(n, min, max) setting(_int, n), clamp(i, min, max) -#define setting_uint(n, min, max) setting(_uint, n), clamp(u, min, max) -#define setting_enum(n, cnt) setting(_enum, n), .e_cnt = cnt +#define num(t, n, min, max) .t##_min = min, .t##_max = max, .t##_sz = sizeof(momentum_settings.n) +#define setting_int(n, min, max) setting(_int, n), num(i, n, min, max) +#define setting_uint(n, min, max) setting(_uint, n), num(u, n, min, max) +#define setting_enum(n, cnt) setting_uint(n, 0, cnt - 1) #define setting_bool(n) setting(_bool, n) } momentum_settings_entries[] = { {setting_str(asset_pack)}, @@ -131,15 +131,13 @@ void momentum_settings_load() { break; case momentum_settings_type_int: ok = flipper_format_read_int32(file, entry.key, &val_int, 1); - if(ok) *(int32_t*)entry.val = CLAMP(val_int, entry.i_max, entry.i_min); + val_int = CLAMP(val_int, entry.i_max, entry.i_min); + if(ok) memcpy(entry.val, &val_int, entry.i_sz); break; case momentum_settings_type_uint: ok = flipper_format_read_uint32(file, entry.key, &val_uint, 1); - if(ok) *(uint32_t*)entry.val = CLAMP(val_uint, entry.u_max, entry.u_min); - break; - case momentum_settings_type_enum: - ok = flipper_format_read_uint32(file, entry.key, &val_uint, 1); - if(ok) *(uint8_t*)entry.val = CLAMP(val_uint, entry.e_cnt - 1U, 0U); + val_uint = CLAMP(val_uint, entry.u_max, entry.u_min); + if(ok) memcpy(entry.val, &val_uint, entry.u_sz); break; case momentum_settings_type_bool: ok = flipper_format_read_bool(file, entry.key, &val_bool, 1); @@ -164,7 +162,8 @@ void momentum_settings_save() { FlipperFormat* file = flipper_format_file_alloc(storage); if(flipper_format_file_open_always(file, MOMENTUM_SETTINGS_PATH)) { - uint32_t tmp_enum; + int32_t tmp_int; + uint32_t tmp_uint; for(size_t entry_i = 0; entry_i < COUNT_OF(momentum_settings_entries); entry_i++) { #define entry momentum_settings_entries[entry_i] switch(entry.type) { @@ -172,14 +171,14 @@ void momentum_settings_save() { flipper_format_write_string_cstr(file, entry.key, (char*)entry.val); break; case momentum_settings_type_int: - flipper_format_write_int32(file, entry.key, (int32_t*)entry.val, 1); + tmp_int = 0; + memcpy(&tmp_int, entry.val, entry.i_sz); + flipper_format_write_int32(file, entry.key, &tmp_int, 1); break; case momentum_settings_type_uint: - flipper_format_write_uint32(file, entry.key, (uint32_t*)entry.val, 1); - break; - case momentum_settings_type_enum: - tmp_enum = *(uint8_t*)entry.val; - flipper_format_write_uint32(file, entry.key, &tmp_enum, 1); + tmp_uint = 0; + memcpy(&tmp_uint, entry.val, entry.u_sz); + flipper_format_write_uint32(file, entry.key, &tmp_uint, 1); break; case momentum_settings_type_bool: flipper_format_write_bool(file, entry.key, (bool*)entry.val, 1);