Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * @file config_defaults.c
- * @brief Фабричные дефолты и хелперы нормализации/сброса.
- * @date 2025-09-15
- */
- #include "config_defaults.h"
- #include "eeprom_24xx.h" /* только если хочешь тут же делать init; можно и в main */
- #include <string.h>
- /* ===== Фабричные дефолты в ПЗУ (Flash) =====
- * Можно держать разные наборы под разные версии payload.
- * Эти const-структуры лежат в Flash, не занимают RAM.
- */
- static const ConfigPayload kDefaults_v1 = {
- .fan_t1 = 50,
- .fan_t2 = 60,
- .fan_t3 = 70,
- .fan_t4 = 80,
- .fan_tMax = 85,
- .forcedMode = 0,
- .gas_min10 = 5,
- .gas_max10 = 15,
- .triac_ms = 100,
- .uart_on = 0,
- };
- /* Если появится v2/v3 — добавляй аналогичные константы: kDefaults_v2, kDefaults_v3, ... */
- bool config_defaults_get(uint8_t version, ConfigPayload *out_payload)
- {
- if (!out_payload) return false;
- switch (version) {
- case 1:
- memcpy(out_payload, &kDefaults_v1, sizeof(ConfigPayload));
- return true;
- default:
- /* Версия неизвестна — можно:
- * 1) вернуть false, пусть вызывающий решает, или
- * 2) отдать «самые последние» дефолты (fallback).
- */
- return false;
- }
- }
- void config_sanitize(ConfigPayload *io)
- {
- if (!io) return;
- /* ----- Вентилятор: 30..130 и неубывающая цепочка ----- */
- const uint8_t TLO = 30, THI = 130;
- #define CLAMP_U8(v, lo, hi) do { if ((v) < (lo)) (v) = (lo); else if ((v) > (hi)) (v) = (hi); } while(0)
- CLAMP_U8(io->fan_t1, TLO, THI);
- CLAMP_U8(io->fan_t2, TLO, THI);
- CLAMP_U8(io->fan_t3, TLO, THI);
- CLAMP_U8(io->fan_t4, TLO, THI);
- CLAMP_U8(io->fan_tMax, TLO, THI);
- if (io->fan_t2 < io->fan_t1) io->fan_t2 = io->fan_t1;
- if (io->fan_t3 < io->fan_t2) io->fan_t3 = io->fan_t2;
- if (io->fan_t4 < io->fan_t3) io->fan_t4 = io->fan_t3;
- if (io->fan_tMax < io->fan_t4) io->fan_tMax = io->fan_t4;
- /* ----- Принудительный режим: 0..4 ----- */
- if (io->forcedMode > 4) io->forcedMode = 4; /* нижняя граница 0 уже обеспечена типом */
- /* ----- Газ (×10): 5..15 и min<=max ----- */
- const uint8_t GLO = 5, GHI = 15;
- CLAMP_U8(io->gas_min10, GLO, GHI);
- CLAMP_U8(io->gas_max10, GLO, GHI);
- if (io->gas_min10 > io->gas_max10)
- io->gas_max10 = io->gas_min10;
- /* ----- Триак: 10..250 мс, шаг 10 ----- */
- if (io->triac_ms < 10) io->triac_ms = 10;
- if (io->triac_ms > 250) io->triac_ms = 250;
- /* округление к ближайшему шагу 10 */
- io->triac_ms = (uint16_t)((io->triac_ms + 5u) / 10u) * 10u;
- if (io->triac_ms < 10) io->triac_ms = 10;
- if (io->triac_ms > 250) io->triac_ms = 250;
- /* ----- UART: только 0/1 ----- */
- if (io->uart_on > 1) io->uart_on = 1;
- #undef CLAMP_U8
- }
- bool config_factory_reset(uint8_t version)
- {
- ConfigPayload def = {0};
- if (!config_defaults_get(version, &def)) {
- /* если версия неизвестна — можно выбрать fallback: взять v1 */
- memcpy(&def, &kDefaults_v1, sizeof(def));
- }
- config_sanitize(&def);
- /* Попробуем сохранить в EEPROM, если она готова.
- * Если ee24_init()/is_ready делаются раньше в main — можно сразу звать save.
- * Иначе тут можно проверить готовность: это на твоё усмотрение.
- */
- return config_store_save(version, &def);
- }
Advertisement
Add Comment
Please, Sign In to add comment