mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-28 05:06:32 +00:00
Move all RAM usage to heap
Move all register usage to heap and add mapped information to relay scan
This commit is contained in:
parent
9d5fd97b2f
commit
8398c9c459
@ -161,13 +161,14 @@ enum SspmMachineStates { SPM_NONE, // Do nothing
|
|||||||
TasmotaSerial *SspmSerial;
|
TasmotaSerial *SspmSerial;
|
||||||
|
|
||||||
// Global structure containing driver saved variables
|
// Global structure containing driver saved variables
|
||||||
struct {
|
typedef struct {
|
||||||
uint32_t crc32; // To detect file changes
|
uint32_t crc32; // To detect file changes
|
||||||
uint32_t version; // To detect driver function changes
|
uint32_t version; // To detect driver function changes
|
||||||
uint16_t module_map[32]; // Max possible SPM relay modules
|
uint16_t module_map[32]; // Max possible SPM relay modules
|
||||||
} SSPMSettings;
|
} tSspmSettings;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
tSspmSettings Settings;
|
||||||
float voltage[SSPM_MAX_MODULES][4]; // 123.12 V
|
float voltage[SSPM_MAX_MODULES][4]; // 123.12 V
|
||||||
float current[SSPM_MAX_MODULES][4]; // 123.12 A
|
float current[SSPM_MAX_MODULES][4]; // 123.12 A
|
||||||
float active_power[SSPM_MAX_MODULES][4]; // 123.12 W
|
float active_power[SSPM_MAX_MODULES][4]; // 123.12 W
|
||||||
@ -209,28 +210,28 @@ TSspm *Sspm = nullptr;
|
|||||||
|
|
||||||
uint32_t SSPMSettingsCrc32(void) {
|
uint32_t SSPMSettingsCrc32(void) {
|
||||||
// Use Tasmota CRC calculation function
|
// Use Tasmota CRC calculation function
|
||||||
return GetCfgCrc32((uint8_t*)&SSPMSettings +4, sizeof(SSPMSettings) -4); // Skip crc32
|
return GetCfgCrc32((uint8_t*)&Sspm->Settings +4, sizeof(tSspmSettings) -4); // Skip crc32
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSPMSettingsDefault(void) {
|
void SSPMSettingsDefault(void) {
|
||||||
// Init default values in case file is not found
|
// Init default values in case file is not found
|
||||||
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: SPM " D_USE_DEFAULTS));
|
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: SPM " D_USE_DEFAULTS));
|
||||||
|
|
||||||
memset(&SSPMSettings, 0x00, sizeof(SSPMSettings));
|
memset(&Sspm->Settings, 0x00, sizeof(tSspmSettings));
|
||||||
SSPMSettings.version = SSPM_VERSION;
|
Sspm->Settings.version = SSPM_VERSION;
|
||||||
// Init any other parameter in struct SSPMSettings
|
// Init any other parameter in struct SSPMSettings
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSPMSettingsDelta(void) {
|
void SSPMSettingsDelta(void) {
|
||||||
// Fix possible setting deltas
|
// Fix possible setting deltas
|
||||||
if (SSPMSettings.version != SSPM_VERSION) { // Fix version dependent changes
|
if (Sspm->Settings.version != SSPM_VERSION) { // Fix version dependent changes
|
||||||
|
|
||||||
// if (Settings->version < 0x01010101) {
|
// if (Settings->version < 0x01010101) {
|
||||||
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// Set current version and save settings
|
// Set current version and save settings
|
||||||
SSPMSettings.version = SSPM_VERSION;
|
Sspm->Settings.version = SSPM_VERSION;
|
||||||
SSPMSettingsSave();
|
SSPMSettingsSave();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -245,7 +246,7 @@ void SSPMSettingsLoad(void) {
|
|||||||
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
|
#ifdef USE_UFILESYS
|
||||||
if (TfsLoadFile(filename, (uint8_t*)&SSPMSettings, sizeof(SSPMSettings))) {
|
if (TfsLoadFile(filename, (uint8_t*)&Sspm->Settings, sizeof(tSspmSettings))) {
|
||||||
// Fix possible setting deltas
|
// Fix possible setting deltas
|
||||||
SSPMSettingsDelta();
|
SSPMSettingsDelta();
|
||||||
|
|
||||||
@ -258,22 +259,22 @@ void SSPMSettingsLoad(void) {
|
|||||||
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: SPM ERROR File system not enabled"));
|
AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: SPM ERROR File system not enabled"));
|
||||||
#endif // USE_UFILESYS
|
#endif // USE_UFILESYS
|
||||||
|
|
||||||
SSPMSettings.crc32 = SSPMSettingsCrc32();
|
Sspm->Settings.crc32 = SSPMSettingsCrc32();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSPMSettingsSave(void) {
|
void SSPMSettingsSave(void) {
|
||||||
// Called from FUNC_SAVE_SETTINGS every SaveData second and at restart
|
// Called from FUNC_SAVE_SETTINGS every SaveData second and at restart
|
||||||
|
|
||||||
if (SSPMSettingsCrc32() != SSPMSettings.crc32) {
|
if (SSPMSettingsCrc32() != Sspm->Settings.crc32) {
|
||||||
// Try to save file /.drvset086
|
// Try to save file /.drvset086
|
||||||
SSPMSettings.crc32 = SSPMSettingsCrc32();
|
Sspm->Settings.crc32 = SSPMSettingsCrc32();
|
||||||
|
|
||||||
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
|
#ifdef USE_UFILESYS
|
||||||
if (TfsSaveFile(filename, (const uint8_t*)&SSPMSettings, sizeof(SSPMSettings))) {
|
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: SPM 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
|
||||||
@ -299,7 +300,7 @@ uint32_t SSMPGetModuleId(uint32_t module) {
|
|||||||
uint32_t SSPMGetMappedModuleId(uint32_t module) {
|
uint32_t SSPMGetMappedModuleId(uint32_t module) {
|
||||||
// Return mapped module number
|
// Return mapped module number
|
||||||
for (uint32_t module_nr = 0; module_nr < Sspm->module_max; module_nr++) {
|
for (uint32_t module_nr = 0; module_nr < Sspm->module_max; module_nr++) {
|
||||||
if (SSPMSettings.module_map[module] == SSMPGetModuleId(module_nr)) {
|
if (Sspm->Settings.module_map[module] == SSMPGetModuleId(module_nr)) {
|
||||||
return module_nr; // 0, 1, ..
|
return module_nr; // 0, 1, ..
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -309,7 +310,7 @@ uint32_t SSPMGetMappedModuleId(uint32_t module) {
|
|||||||
uint32_t SSPMGetModuleNumberFromMap(uint32_t id) {
|
uint32_t SSPMGetModuleNumberFromMap(uint32_t id) {
|
||||||
// Return module number based on first two bytes of module id
|
// Return module number based on first two bytes of module id
|
||||||
for (uint32_t module_nr = 0; module_nr < SSPM_MAX_MODULES; module_nr++) {
|
for (uint32_t module_nr = 0; module_nr < SSPM_MAX_MODULES; module_nr++) {
|
||||||
if (id == SSPMSettings.module_map[module_nr]) {
|
if (id == Sspm->Settings.module_map[module_nr]) {
|
||||||
return module_nr; // 0, 1, ...
|
return module_nr; // 0, 1, ...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -970,12 +971,14 @@ void SSPMHandleReceivedData(void) {
|
|||||||
*/
|
*/
|
||||||
if ((0x24 == Sspm->expected_bytes) && (Sspm->module_max < SSPM_MAX_MODULES)) {
|
if ((0x24 == Sspm->expected_bytes) && (Sspm->module_max < SSPM_MAX_MODULES)) {
|
||||||
memcpy(Sspm->module[Sspm->module_max], SspmBuffer + 19, SSPM_MODULE_NAME_SIZE);
|
memcpy(Sspm->module[Sspm->module_max], SspmBuffer + 19, SSPM_MODULE_NAME_SIZE);
|
||||||
if (0 == SSPMSettings.module_map[Sspm->module_max]) {
|
uint32_t module_id = SspmBuffer[19] << 8 | SspmBuffer[20];
|
||||||
SSPMSettings.module_map[Sspm->module_max] = SspmBuffer[19] << 8 | SspmBuffer[20];
|
if (0 == Sspm->Settings.module_map[Sspm->module_max]) {
|
||||||
|
Sspm->Settings.module_map[Sspm->module_max] = module_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
AddLog(LOG_LEVEL_INFO, PSTR("SPM: 4Relay %d type %d version %d.%d.%d found with id %12_H"),
|
uint32_t mapped = SSPMGetModuleNumberFromMap(module_id) +1;
|
||||||
Sspm->module_max +1, SspmBuffer[35], SspmBuffer[36], SspmBuffer[37], SspmBuffer[38], Sspm->module[Sspm->module_max]);
|
AddLog(LOG_LEVEL_INFO, PSTR("SPM: 4Relay %d (mapped to %d) type %d version %d.%d.%d found with id %12_H"),
|
||||||
|
Sspm->module_max +1, mapped, SspmBuffer[35], SspmBuffer[36], SspmBuffer[37], SspmBuffer[38], Sspm->module[Sspm->module_max]);
|
||||||
|
|
||||||
Sspm->module_max++;
|
Sspm->module_max++;
|
||||||
}
|
}
|
||||||
@ -1449,7 +1452,7 @@ void CmndSSPMMap(void) {
|
|||||||
for (char* str = strtok_r(XdrvMailbox.data, ",", &p); str && i < Sspm->module_max; str = strtok_r(nullptr, ",", &p)) {
|
for (char* str = strtok_r(XdrvMailbox.data, ",", &p); str && i < Sspm->module_max; str = strtok_r(nullptr, ",", &p)) {
|
||||||
uint32_t module = atoi(str);
|
uint32_t module = atoi(str);
|
||||||
if ((module > 0) && (module <= Sspm->module_max)) { // Only valid modules 1 to x
|
if ((module > 0) && (module <= Sspm->module_max)) { // Only valid modules 1 to x
|
||||||
SSPMSettings.module_map[i] = SSMPGetModuleId(module -1);
|
Sspm->Settings.module_map[i] = SSMPGetModuleId(module -1);
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user