Spaces:
Running
Running
const char* SettingsManager::NAMESPACE = "ecu"; | |
const char* SettingsManager::SETTINGS_KEY = "settings"; | |
SettingsManager::SettingsManager() : version(1) { | |
setDefaults(); | |
} | |
void SettingsManager::setDefaults() { | |
settings.version = version; | |
// Настройки РХХ | |
settings.idle.targetRPM = 800; | |
settings.idle.valveMinPosition = 0; | |
settings.idle.valveMaxPosition = 255; | |
settings.idle.rpmTolerance = 50; | |
settings.idle.kp = 0.1; | |
settings.idle.ki = 0.05; | |
settings.idle.kd = 0.02; | |
// Общие настройки | |
settings.minAdvance = 0; | |
settings.maxAdvance = 40; | |
settings.injectionTimeMin = 1.0; | |
settings.injectionTimeMax = 20.0; | |
settings.idleRpmMin = 700; | |
settings.idleRpmMax = 900; | |
} | |
void SettingsManager::begin() { | |
if (!load()) { | |
setDefaults(); | |
save(); | |
} | |
} | |
bool SettingsManager::load() { | |
// Здесь должна быть загрузка из EEPROM или SD | |
// Пока просто используем значения по умолчанию | |
setDefaults(); | |
return true; | |
} | |
bool SettingsManager::save() { | |
// Здесь должно быть сохранение в EEPROM или SD | |
return true; | |
} | |
void SettingsManager::reset() { | |
setDefaults(); | |
save(); | |
} | |
bool SettingsManager::validateSettings() { | |
if (settings.version != version) return false; | |
// Проверка настроек РХХ | |
if (settings.idle.targetRPM < 500 || settings.idle.targetRPM > 2000) return false; | |
if (settings.idle.valveMinPosition < 0 || settings.idle.valveMinPosition > 255) return false; | |
if (settings.idle.valveMaxPosition < 0 || settings.idle.valveMaxPosition > 255) return false; | |
if (settings.idle.valveMaxPosition <= settings.idle.valveMinPosition) return false; | |
if (settings.idle.rpmTolerance < 10 || settings.idle.rpmTolerance > 200) return false; | |
if (settings.idle.kp < 0 || settings.idle.ki < 0 || settings.idle.kd < 0) return false; | |
// Проверка общих настроек | |
if (settings.minAdvance < -10 || settings.minAdvance > 20) return false; | |
if (settings.maxAdvance < 20 || settings.maxAdvance > 60) return false; | |
if (settings.maxAdvance <= settings.minAdvance) return false; | |
if (settings.injectionTimeMin < 0.5 || settings.injectionTimeMin > 5.0) return false; | |
if (settings.injectionTimeMax < 5.0 || settings.injectionTimeMax > 30.0) return false; | |
if (settings.injectionTimeMax <= settings.injectionTimeMin) return false; | |
if (settings.idleRpmMin < 500 || settings.idleRpmMin > 1000) return false; | |
if (settings.idleRpmMax < 800 || settings.idleRpmMax > 1500) return false; | |
if (settings.idleRpmMax <= settings.idleRpmMin) return false; | |
return true; | |
} | |
void SettingsManager::setSettings(const SystemSettings& newSettings) { | |
settings = newSettings; | |
if (validateSettings()) { | |
save(); | |
} else { | |
setDefaults(); | |
} | |
} | |
String SettingsManager::exportToJson() { | |
StaticJsonDocument<1024> doc; | |
doc["version"] = settings.version; | |
JsonObject idle = doc.createNestedObject("idle"); | |
idle["targetRPM"] = settings.idle.targetRPM; | |
idle["valveMinPosition"] = settings.idle.valveMinPosition; | |
idle["valveMaxPosition"] = settings.idle.valveMaxPosition; | |
idle["rpmTolerance"] = settings.idle.rpmTolerance; | |
idle["kp"] = settings.idle.kp; | |
idle["ki"] = settings.idle.ki; | |
idle["kd"] = settings.idle.kd; | |
doc["minAdvance"] = settings.minAdvance; | |
doc["maxAdvance"] = settings.maxAdvance; | |
doc["injectionTimeMin"] = settings.injectionTimeMin; | |
doc["injectionTimeMax"] = settings.injectionTimeMax; | |
doc["idleRpmMin"] = settings.idleRpmMin; | |
doc["idleRpmMax"] = settings.idleRpmMax; | |
String output; | |
serializeJson(doc, output); | |
return output; | |
} | |
bool SettingsManager::importFromJson(const String& json) { | |
StaticJsonDocument<1024> doc; | |
DeserializationError error = deserializeJson(doc, json); | |
if (error) return false; | |
SystemSettings newSettings; | |
newSettings.version = doc["version"] | version; | |
JsonObject idle = doc["idle"]; | |
if (idle) { | |
newSettings.idle.targetRPM = idle["targetRPM"] | 800; | |
newSettings.idle.valveMinPosition = idle["valveMinPosition"] | 0; | |
newSettings.idle.valveMaxPosition = idle["valveMaxPosition"] | 255; | |
newSettings.idle.rpmTolerance = idle["rpmTolerance"] | 50; | |
newSettings.idle.kp = idle["kp"] | 0.1; | |
newSettings.idle.ki = idle["ki"] | 0.05; | |
newSettings.idle.kd = idle["kd"] | 0.02; | |
} | |
newSettings.minAdvance = doc["minAdvance"] | 0; | |
newSettings.maxAdvance = doc["maxAdvance"] | 40; | |
newSettings.injectionTimeMin = doc["injectionTimeMin"] | 1.0; | |
newSettings.injectionTimeMax = doc["injectionTimeMax"] | 20.0; | |
newSettings.idleRpmMin = doc["idleRpmMin"] | 700; | |
newSettings.idleRpmMax = doc["idleRpmMax"] | 900; | |
setSettings(newSettings); | |
return true; | |
} | |
bool SettingsManager::saveToSD(const char* filename) { | |
File file = SD.open(filename, FILE_WRITE); | |
if (!file) return false; | |
String json = exportToJson(); | |
file.print(json); | |
file.close(); | |
return true; | |
} | |
bool SettingsManager::loadFromSD(const char* filename) { | |
File file = SD.open(filename); | |
if (!file) return false; | |
String json = file.readString(); | |
file.close(); | |
return importFromJson(json); | |
} | |
bool SettingsManager::isCompatibleVersion(uint32_t ver) const { | |
// В данной версии поддерживаем только версию 1 | |
return ver == 1; | |
} | |