Fix driver config store

This commit is contained in:
Theo Arends 2022-09-09 15:06:04 +02:00
parent 9ad002ad19
commit f347a5b19c
2 changed files with 63 additions and 90 deletions

View File

@ -182,8 +182,6 @@
#define SSPM_TOTAL_MODULES 32 // Max number of SPM-4RELAY units for a total of 128 relays #define SSPM_TOTAL_MODULES 32 // Max number of SPM-4RELAY units for a total of 128 relays
const uint32_t SSPM_VERSION = 0x0104; // Latest driver version (See settings deltas below)
enum SspmMachineStates { SPM_NONE, // Do nothing enum SspmMachineStates { SPM_NONE, // Do nothing
SPM_WAIT, // Wait 100ms SPM_WAIT, // Wait 100ms
SPM_RESET, // Toggle ARM reset pin SPM_RESET, // Toggle ARM reset pin
@ -307,79 +305,65 @@ TSspm *Sspm = nullptr;
* Driver Settings load and save using filesystem * Driver Settings load and save using filesystem
\*********************************************************************************************/ \*********************************************************************************************/
uint32_t SSPMSettingsCrc32(void) { const uint32_t XDRV_86_VERSION = 0x0104; // Latest driver version (See settings deltas below)
// Use Tasmota CRC calculation function
return GetCfgCrc32((uint8_t*)&Sspm->Settings +4, sizeof(tSspmSettings) -4); // Skip crc32
}
void SSPMSettingsDefault(void) {
// Init default values in case file is not found
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: SPM " D_USE_DEFAULTS));
void Xdrv86SettingsLoad(void) {
// *** Start init default values in case file is not found ***
memset(&Sspm->Settings, 0x00, sizeof(tSspmSettings)); memset(&Sspm->Settings, 0x00, sizeof(tSspmSettings));
Sspm->Settings.version = SSPM_VERSION; Sspm->Settings.version = XDRV_86_VERSION;
// Init any other parameter in struct
Sspm->Settings.flag.display = SPM_DISPLAY_TABS; Sspm->Settings.flag.display = SPM_DISPLAY_TABS;
// Init any other parameter in struct SSPMSettings
}
void SSPMSettingsDelta(void) { // *** End Init default values ***
// Fix possible setting deltas
if (Sspm->Settings.version != SSPM_VERSION) { // Fix version dependent changes
if (Sspm->Settings.version < 0x0104) {
Sspm->Settings.flag.display = Settings->sbflag1.sspm_display;
}
// Set current version and save settings
Sspm->Settings.version = SSPM_VERSION;
SSPMSettingsSave();
}
}
void SSPMSettingsLoad(void) {
// Init default values in case file is not found
SSPMSettingsDefault();
#ifndef USE_UFILESYS
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV86 Use defaults as file system not enabled"));
#else
// Try to load file /.drvset086 // Try to load file /.drvset086
char filename[20]; char filename[20];
// Use for drivers: // Use for drivers:
snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), XDRV_86); snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), XDRV_86);
#ifdef USE_UFILESYS
if (TfsLoadFile(filename, (uint8_t*)&Sspm->Settings, sizeof(tSspmSettings))) { if (TfsLoadFile(filename, (uint8_t*)&Sspm->Settings, sizeof(tSspmSettings))) {
// Fix possible setting deltas if (Sspm->Settings.version != XDRV_86_VERSION) { // Fix version dependent changes
SSPMSettingsDelta();
AddLog(LOG_LEVEL_INFO, PSTR("CFG: SPM loaded from file")); // *** Start fix possible setting deltas ***
if (Sspm->Settings.version < 0x0104) {
Sspm->Settings.flag.display = Settings->sbflag1.sspm_display;
}
// *** End setting deltas ***
// Set current version and save settings
Sspm->Settings.version = XDRV_86_VERSION;
Xdrv86SettingsSave();
}
AddLog(LOG_LEVEL_INFO, PSTR("CFG: XDRV86 loaded from file"));
} else { } else {
// File system not ready: No flash space reserved for file system // File system not ready: No flash space reserved for file system
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: SPM ERROR File system not ready or file not found")); AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV86 Use defaults as file system not ready or file not found"));
} }
#else
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: SPM ERROR File system not enabled"));
#endif // USE_UFILESYS #endif // USE_UFILESYS
} }
void SSPMSettingsSave(void) { void Xdrv86SettingsSave(void) {
#ifdef USE_UFILESYS
// Called from FUNC_SAVE_SETTINGS every SaveData second and at restart // Called from FUNC_SAVE_SETTINGS every SaveData second and at restart
if (SSPMSettingsCrc32() != Sspm->Settings.crc32) { uint32_t crc32 = GetCfgCrc32((uint8_t*)&Sspm->Settings +4, sizeof(tSspmSettings) -4); // Skip crc32
if (crc32 != Sspm->Settings.crc32) {
// Try to save file /.drvset086 // Try to save file /.drvset086
Sspm->Settings.crc32 = SSPMSettingsCrc32(); Sspm->Settings.crc32 = crc32;
char filename[20]; char filename[20];
// Use for drivers: // Use for drivers:
snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), XDRV_86); snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), XDRV_86);
#ifdef USE_UFILESYS
if (TfsSaveFile(filename, (const uint8_t*)&Sspm->Settings, sizeof(tSspmSettings))) { if (TfsSaveFile(filename, (const uint8_t*)&Sspm->Settings, sizeof(tSspmSettings))) {
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: SPM saved to file")); AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV86 saved to file"));
} else { } else {
// File system not ready: No flash space reserved for file system // File system not ready: No flash space reserved for file system
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: SPM ERROR File system not ready or unable to save file")); AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV86 ERROR File system not ready or unable to save file"));
} }
#else
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: SPM ERROR File system not enabled"));
#endif // USE_UFILESYS
} }
#endif // USE_UFILESYS
} }
/*********************************************************************************************/ /*********************************************************************************************/
@ -1803,7 +1787,7 @@ void SSPMInit(void) {
return; return;
} }
SSPMSettingsLoad(); Xdrv86SettingsLoad();
pinMode(SSPM_GPIO_ARM_RESET, OUTPUT); pinMode(SSPM_GPIO_ARM_RESET, OUTPUT);
digitalWrite(SSPM_GPIO_ARM_RESET, 1); digitalWrite(SSPM_GPIO_ARM_RESET, 1);
@ -2504,7 +2488,7 @@ bool Xdrv86(uint8_t function) {
SSPMEvery100ms(); SSPMEvery100ms();
break; break;
case FUNC_SAVE_SETTINGS: case FUNC_SAVE_SETTINGS:
SSPMSettingsSave(); Xdrv86SettingsSave();
break; break;
case FUNC_SET_DEVICE_POWER: case FUNC_SET_DEVICE_POWER:
result = SSPMSetDevicePower(); result = SSPMSetDevicePower();

View File

@ -85,7 +85,7 @@ struct Tm1621 {
* Driver Settings load and save using filesystem * Driver Settings load and save using filesystem
\*********************************************************************************************/ \*********************************************************************************************/
const uint32_t XDRV_87_VERSION = 0x0100; // Latest driver version (See settings deltas below) const uint32_t XDRV_87_VERSION = 0x0104; // Latest driver version (See settings deltas below)
typedef struct { typedef struct {
uint32_t crc32; // To detect file changes uint32_t crc32; // To detect file changes
@ -97,76 +97,65 @@ typedef struct {
} tXdrv87Settings; } tXdrv87Settings;
tXdrv87Settings Xdrv87Settings; tXdrv87Settings Xdrv87Settings;
uint32_t Xdrv87SettingsCrc32(void) { /*********************************************************************************************/
// Use Tasmota CRC calculation function
return GetCfgCrc32((uint8_t*)&Xdrv87Settings +4, sizeof(tXdrv87Settings) -4); // Skip crc32
}
void Xdrv87SettingsDefault(void) {
// Init default values in case file is not found
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV87 " D_USE_DEFAULTS));
memset(&Xdrv87Settings, 0x00, sizeof(tXdrv87Settings));
Xdrv87Settings.version = XDRV_87_VERSION;
// Init any other parameter in struct Xdrv87Settings
Xdrv87Settings.rotate = TM1621_ROTATE;
}
void Xdrv87SettingsDelta(void) {
// Fix possible setting deltas
if (Xdrv87Settings.version != SSPM_VERSION) { // Fix version dependent changes
// Set current version and save settings
Xdrv87Settings.version = SSPM_VERSION;
Xdrv87SettingsSave();
}
}
void Xdrv87SettingsLoad(void) { void Xdrv87SettingsLoad(void) {
// Init default values in case file is not found // *** Start init default values in case file is not found ***
Xdrv87SettingsDefault(); memset(&Xdrv87Settings, 0x00, sizeof(tXdrv87Settings));
Xdrv87Settings.version = XDRV_87_VERSION;
// Init any other parameter in struct
Xdrv87Settings.rotate = TM1621_ROTATE;
// *** End Init default values ***
#ifndef USE_UFILESYS
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV87 Use defaults as file system not enabled"));
#else
// Try to load file /.drvset087 // Try to load file /.drvset087
char filename[20]; char filename[20];
// Use for drivers: // Use for drivers:
snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), XDRV_87); snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), XDRV_87);
#ifdef USE_UFILESYS
if (TfsLoadFile(filename, (uint8_t*)&Xdrv87Settings, sizeof(tXdrv87Settings))) { if (TfsLoadFile(filename, (uint8_t*)&Xdrv87Settings, sizeof(tXdrv87Settings))) {
// Fix possible setting deltas if (Xdrv87Settings.version != XDRV_87_VERSION) { // Fix version dependent changes
Xdrv87SettingsDelta();
// *** Start fix possible setting deltas ***
// if (Xdrv87Settings.version < 0x0105) {
// Xdrv87Settings.spare = test;
// }
// *** End setting deltas ***
// Set current version and save settings
Xdrv87Settings.version = XDRV_87_VERSION;
Xdrv87SettingsSave();
}
AddLog(LOG_LEVEL_INFO, PSTR("CFG: XDRV87 loaded from file")); AddLog(LOG_LEVEL_INFO, PSTR("CFG: XDRV87 loaded from file"));
} else { } else {
// File system not ready: No flash space reserved for file system // File system not ready: No flash space reserved for file system
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV87 ERROR File system not ready or file not found")); AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV87 Use defaults as file system not ready or file not found"));
} }
#else
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV87 ERROR File system not enabled"));
#endif // USE_UFILESYS #endif // USE_UFILESYS
} }
void Xdrv87SettingsSave(void) { void Xdrv87SettingsSave(void) {
#ifdef USE_UFILESYS
// Called from FUNC_SAVE_SETTINGS every SaveData second and at restart // Called from FUNC_SAVE_SETTINGS every SaveData second and at restart
if (Xdrv87SettingsCrc32() != Xdrv87Settings.crc32) { uint32_t crc32 = GetCfgCrc32((uint8_t*)&Xdrv87Settings +4, sizeof(tXdrv87Settings) -4); // Skip crc32
if (crc32 != Xdrv87Settings.crc32) {
// Try to save file /.drvset087 // Try to save file /.drvset087
Xdrv87Settings.crc32 = Xdrv87SettingsCrc32(); Xdrv87Settings.crc32 = crc32;
char filename[20]; char filename[20];
// Use for drivers: // Use for drivers:
snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), XDRV_87); snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), XDRV_87);
#ifdef USE_UFILESYS
if (TfsSaveFile(filename, (const uint8_t*)&Xdrv87Settings, sizeof(tXdrv87Settings))) { if (TfsSaveFile(filename, (const uint8_t*)&Xdrv87Settings, sizeof(tXdrv87Settings))) {
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV87 saved to file")); AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV87 saved to file"));
} else { } else {
// File system not ready: No flash space reserved for file system // File system not ready: No flash space reserved for file system
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV87 ERROR File system not ready or unable to save file")); AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV87 ERROR File system not ready or unable to save file"));
} }
#else
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: XDRV87 ERROR File system not enabled"));
#endif // USE_UFILESYS
} }
#endif // USE_UFILESYS
} }
/*********************************************************************************************/ /*********************************************************************************************/