#pragma once #include #include #include "config.h" static const uint16_t TUNING_MAGIC = 0xDA7A; static const int TUNING_EEPROM_ADDR = 0; struct TuningData { uint16_t magic = 0; float kp = PID_KP; float ki = PID_KI; float kd = PID_KD; uint8_t fanMixMax = FAN_MIX_MAX_PWM; }; inline uint8_t tuningChecksum(const TuningData &data) { const uint8_t *bytes = reinterpret_cast(&data); uint8_t sum = 0; for (uint8_t i = 0; i < sizeof(TuningData) - 1; ++i) { sum ^= bytes[i]; } return sum; } inline bool tuningLoad(TuningData &out) { EEPROM.get(TUNING_EEPROM_ADDR, out); const uint8_t stored = EEPROM.read(TUNING_EEPROM_ADDR + sizeof(TuningData)); if (out.magic != TUNING_MAGIC) { return false; } return tuningChecksum(out) == stored; } inline void tuningSave(const TuningData &data) { EEPROM.put(TUNING_EEPROM_ADDR, data); EEPROM.write(TUNING_EEPROM_ADDR + sizeof(TuningData), tuningChecksum(data)); } inline void tuningClear() { TuningData cleared; tuningSave(cleared); }