154 lines
4.9 KiB
C++
154 lines
4.9 KiB
C++
#include "settings.h"
|
|
#include "config.h"
|
|
#include <FS.h>
|
|
|
|
Settings settings;
|
|
|
|
Setting all_settings[] = {
|
|
{"fps", &settings.fps, TYPE_UINT8},
|
|
|
|
{"effects.big_clock.spacing", &settings.effects.big_clock.spacing, TYPE_UINT8},
|
|
|
|
{"effects.confetti.pixels_per_loop", &settings.effects.confetti.pixels_per_loop, TYPE_UINT8},
|
|
|
|
{"effects.blur2d.count", &settings.effects.blur2d.count, TYPE_UINT8},
|
|
|
|
{"effects.cycle.random", &settings.effects.cycle.random, TYPE_BOOL},
|
|
{"effects.cycle.time", &settings.effects.cycle.time, TYPE_UINT16},
|
|
|
|
{"effects.dvd.width", &settings.effects.dvd.width, TYPE_UINT8},
|
|
{"effects.dvd.height", &settings.effects.dvd.height, TYPE_UINT8},
|
|
{"effects.dvd.speed", &settings.effects.dvd.speed, TYPE_UINT8},
|
|
|
|
{"effects.dynamic.single_loop_time", &settings.effects.dynamic.single_loop_time, TYPE_UINT16},
|
|
{"effects.dynamic.multi_loop_time", &settings.effects.dynamic.multi_loop_time, TYPE_UINT16},
|
|
{"effects.dynamic.big_loop_time", &settings.effects.dynamic.big_loop_time, TYPE_UINT16},
|
|
{"effects.dynamic.big_size", &settings.effects.dynamic.big_size, TYPE_UINT8},
|
|
|
|
{"effects.fire.cooldown", &settings.effects.fire.cooldown, TYPE_UINT8},
|
|
{"effects.fire.spark_chance", &settings.effects.fire.spark_chance, TYPE_UINT8},
|
|
|
|
{"effects.firework.drag", &settings.effects.firework.drag, TYPE_UINT8},
|
|
{"effects.firework.bounce", &settings.effects.firework.bounce, TYPE_UINT8},
|
|
{"effects.firework.gravity", &settings.effects.firework.gravity, TYPE_UINT8},
|
|
{"effects.firework.sparks", &settings.effects.firework.sparks, TYPE_UINT8},
|
|
|
|
{"effects.gol.start_percentage", &settings.effects.gol.start_percentage, TYPE_UINT8},
|
|
{"effects.gol.blend_speed", &settings.effects.gol.blend_speed, TYPE_UINT8},
|
|
{"effects.gol.restart_after_steps", &settings.effects.gol.restart_after_steps, TYPE_UINT8},
|
|
|
|
{"effects.lightspeed.count", &settings.effects.lightspeed.count, TYPE_UINT8},
|
|
|
|
{"effects.matrix.length_min", &settings.effects.matrix.length_min, TYPE_UINT8},
|
|
{"effects.matrix.length_max", &settings.effects.matrix.length_max, TYPE_UINT8},
|
|
{"effects.matrix.speed_min", &settings.effects.matrix.speed_min, TYPE_UINT8},
|
|
{"effects.matrix.speed_max", &settings.effects.matrix.speed_max, TYPE_UINT8},
|
|
{"effects.matrix.count", &settings.effects.matrix.count, TYPE_UINT8},
|
|
{"effects.matrix.random_count", &settings.effects.matrix.random_count, TYPE_UINT8},
|
|
|
|
{"effects.sines.count", &settings.effects.sines.count, TYPE_UINT8},
|
|
|
|
{"effects.snake.direction_change", &settings.effects.snake.direction_change, TYPE_UINT8},
|
|
|
|
{"effects.tv_static.black_bar_speed", &settings.effects.tv_static.black_bar_speed, TYPE_UINT16},
|
|
};
|
|
|
|
const uint8_t all_settings_size = 32;
|
|
|
|
bool change_setting(const char* key, uint16_t new_value) {
|
|
LOGln("Settings * Setting %s to new value %d.", key, new_value);
|
|
Setting* s = NULL;
|
|
for (uint8_t i=0; i<all_settings_size; i++) {
|
|
s = &(all_settings[i]);
|
|
|
|
if (strcmp(key, s->name)==0) {
|
|
break;
|
|
}
|
|
}
|
|
if (s==NULL) {
|
|
LOGln("Settings * No setting matching the name %s found.", key);
|
|
return false;
|
|
}
|
|
|
|
// Check data size
|
|
if (s->type == TYPE_BOOL && new_value > 1) {
|
|
LOGln("Settings * Data type of %s is boolean, but new value is > 1.", key);
|
|
return false;
|
|
}
|
|
if (s->type == TYPE_UINT8 && new_value>0xFF) {
|
|
LOGln("Settings * Data type of %s is uint8_t, but new value is > 0xFF.", key);
|
|
return false;
|
|
}
|
|
|
|
*(s->value) = new_value;
|
|
return true;
|
|
}
|
|
|
|
uint16_t setting_default(Setting* s) {
|
|
Settings defaults;
|
|
auto p_settings = std::addressof(settings);
|
|
auto p_defaults = std::addressof(defaults);
|
|
uint16_t* p_this = s->value;
|
|
uint16_t diff = p_this - (uint16_t*)p_settings;
|
|
uint16_t default_value = *((uint16_t*)p_defaults + diff);
|
|
return default_value;
|
|
}
|
|
|
|
bool save_settings() {
|
|
if (!SPIFFS.begin()) {
|
|
LOGln("Settings * Could not open SPIFFS for saving.");
|
|
return false;
|
|
}
|
|
|
|
File f = SPIFFS.open("/pitrix_settings.txt", "w");
|
|
if (!f) {
|
|
LOGln("Settings * Could not open /pitrix_settings.txt for writing.");
|
|
return false;
|
|
}
|
|
|
|
Setting* s;
|
|
for (uint8_t i=0; i<all_settings_size; i++) {
|
|
s = &(all_settings[i]);
|
|
uint16_t value = *(s->value);
|
|
uint16_t default_value = setting_default(s);
|
|
if (default_value != value) {
|
|
char buf[50];
|
|
snprintf(buf, 50, "%s=%d", s->name, value);
|
|
LOGln("Saving: %s", buf);
|
|
f.println(buf);
|
|
}
|
|
}
|
|
|
|
f.close();
|
|
return true;
|
|
}
|
|
|
|
bool load_settings() {
|
|
if (!SPIFFS.begin()) {
|
|
LOGln("Settings * Could not open SPIFFS for loading.");
|
|
return false;
|
|
}
|
|
|
|
File f = SPIFFS.open("/pitrix_settings.txt", "r");
|
|
if (!f) {
|
|
LOGln("Settings * Could not open /pitrix_settings.txt for reading.");
|
|
return false;
|
|
}
|
|
|
|
String s = f.readString();
|
|
f.close();
|
|
|
|
while (s.length() > 0) {
|
|
int pos = s.lastIndexOf('\n');
|
|
String part = s.substring(pos + 1);
|
|
if (pos==-1) pos=0;
|
|
s.remove(pos);
|
|
pos = part.indexOf('=');
|
|
if (pos < 1) continue;
|
|
String key = part.substring(0, pos);
|
|
uint16_t value = part.substring(pos + 1).toInt();
|
|
change_setting(key.c_str(), value);
|
|
}
|
|
return true;
|
|
}
|