mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-29 13:46:37 +00:00
Add SSPM mapping warning
Add SSPM mapping warning when 4Relay modules are added, removed or inserted
This commit is contained in:
parent
dc2fbb060a
commit
5eb25ef1c4
@ -142,6 +142,8 @@
|
|||||||
|
|
||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
|
|
||||||
|
#define SSPM_FINAL_MAX_MODULES 32 // Max number of SPM-4RELAY units for a total of 128 relays
|
||||||
|
|
||||||
const uint32_t SSPM_VERSION = 0x01010101; // Latest driver version (See settings deltas below)
|
const uint32_t SSPM_VERSION = 0x01010101; // Latest driver version (See settings deltas below)
|
||||||
|
|
||||||
enum SspmMachineStates { SPM_NONE, // Do nothing
|
enum SspmMachineStates { SPM_NONE, // Do nothing
|
||||||
@ -164,7 +166,7 @@ TasmotaSerial *SspmSerial;
|
|||||||
typedef 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[SSPM_FINAL_MAX_MODULES]; // Max possible SPM relay modules
|
||||||
} tSspmSettings;
|
} tSspmSettings;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -198,6 +200,7 @@ typedef struct {
|
|||||||
uint8_t mstate;
|
uint8_t mstate;
|
||||||
uint8_t last_button;
|
uint8_t last_button;
|
||||||
uint8_t error_led_blinks;
|
uint8_t error_led_blinks;
|
||||||
|
bool map_change;
|
||||||
bool discovery_triggered;
|
bool discovery_triggered;
|
||||||
} TSspm;
|
} TSspm;
|
||||||
|
|
||||||
@ -294,27 +297,45 @@ uint32_t SSMPGetModuleId(uint32_t module) {
|
|||||||
if (module < Sspm->module_max) {
|
if (module < Sspm->module_max) {
|
||||||
module_id = Sspm->module[module][0] << 8 | Sspm->module[module][1];
|
module_id = Sspm->module[module][0] << 8 | Sspm->module[module][1];
|
||||||
}
|
}
|
||||||
return module_id;
|
return module_id; // 0 if not found, else first two bytes of module_id
|
||||||
|
}
|
||||||
|
|
||||||
|
int SSPMGetMappedModuleIdIfFound(uint32_t module) {
|
||||||
|
// Return mapped module number
|
||||||
|
for (uint32_t module_nr = 0; module_nr < Sspm->module_max; module_nr++) {
|
||||||
|
if (Sspm->Settings.module_map[module] == SSMPGetModuleId(module_nr)) {
|
||||||
|
return module_nr; // 0, 1, ..
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1; // -1 if not found
|
||||||
}
|
}
|
||||||
|
|
||||||
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++) {
|
int module_nr = SSPMGetMappedModuleIdIfFound(module);
|
||||||
if (Sspm->Settings.module_map[module] == SSMPGetModuleId(module_nr)) {
|
if (-1 == module_nr) {
|
||||||
return module_nr; // 0, 1, ..
|
module_nr = module; // input module number if not found used as fallback
|
||||||
|
}
|
||||||
|
return (uint32_t)module_nr; // 0, 1, ...
|
||||||
|
}
|
||||||
|
|
||||||
|
int SSPMGetModuleNumberFromMapIfFound(uint32_t 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++) {
|
||||||
|
if (id == Sspm->Settings.module_map[module_nr]) {
|
||||||
|
return module_nr; // 0, 1, ...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return module;
|
return -1; // -1 if not found
|
||||||
}
|
}
|
||||||
|
|
||||||
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++) {
|
int module_nr = SSPMGetModuleNumberFromMapIfFound(id);
|
||||||
if (id == Sspm->Settings.module_map[module_nr]) {
|
if (-1 == module_nr) {
|
||||||
return module_nr; // 0, 1, ...
|
module_nr = 0; // 0 if not found used as fallback
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
return (uint32_t)module_nr; // 0, 1, ...
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSPMSetLock(uint32_t seconds) {
|
void SSPMSetLock(uint32_t seconds) {
|
||||||
@ -975,12 +996,34 @@ void SSPMHandleReceivedData(void) {
|
|||||||
if (0 == Sspm->Settings.module_map[Sspm->module_max]) {
|
if (0 == Sspm->Settings.module_map[Sspm->module_max]) {
|
||||||
Sspm->Settings.module_map[Sspm->module_max] = module_id;
|
Sspm->Settings.module_map[Sspm->module_max] = module_id;
|
||||||
}
|
}
|
||||||
|
int mapped = SSPMGetModuleNumberFromMapIfFound(module_id);
|
||||||
uint32_t mapped = SSPMGetModuleNumberFromMap(module_id) +1;
|
if (-1 == mapped) { Sspm->map_change = true; }
|
||||||
|
mapped++;
|
||||||
AddLog(LOG_LEVEL_INFO, PSTR("SPM: 4Relay %d (mapped to %d) type %d version %d.%d.%d found with id %12_H"),
|
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 +1, mapped, SspmBuffer[35], SspmBuffer[36], SspmBuffer[37], SspmBuffer[38], Sspm->module[Sspm->module_max]);
|
||||||
|
|
||||||
Sspm->module_max++;
|
Sspm->module_max++;
|
||||||
|
/*
|
||||||
|
// Debugging module removal/addition/change (exception 3)
|
||||||
|
if ((1 == Sspm->module_max) && (Settings->flag3.user_esp8285_enable)) { // SO51
|
||||||
|
SspmBuffer[19] = 0x4B;
|
||||||
|
SspmBuffer[20] = 0x62;
|
||||||
|
memcpy(Sspm->module[Sspm->module_max], SspmBuffer + 19, SSPM_MODULE_NAME_SIZE);
|
||||||
|
module_id = SspmBuffer[19] << 8 | SspmBuffer[20];
|
||||||
|
if (0 == Sspm->Settings.module_map[Sspm->module_max]) {
|
||||||
|
Sspm->Settings.module_map[Sspm->module_max] = module_id;
|
||||||
|
}
|
||||||
|
mapped = SSPMGetModuleNumberFromMapIfFound(module_id);
|
||||||
|
if (-1 == mapped) {
|
||||||
|
Sspm->map_change = true;
|
||||||
|
}
|
||||||
|
mapped++;
|
||||||
|
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++;
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
SSPMSendAck(command_sequence);
|
SSPMSendAck(command_sequence);
|
||||||
break;
|
break;
|
||||||
@ -989,6 +1032,40 @@ void SSPMHandleReceivedData(void) {
|
|||||||
AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 19 00 00 03 a1 16
|
AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 19 00 00 03 a1 16
|
||||||
*/
|
*/
|
||||||
SSPMSendAck(command_sequence);
|
SSPMSendAck(command_sequence);
|
||||||
|
|
||||||
|
// Warn for mapping change when removal or addition of 4Relay modules
|
||||||
|
for (uint32_t module = Sspm->module_max; module < SSPM_MAX_MODULES; module++) {
|
||||||
|
// Clear obsolete mapping slots
|
||||||
|
Sspm->Settings.module_map[module] = 0;
|
||||||
|
}
|
||||||
|
for (uint32_t module = 0; module < Sspm->module_max; module++) {
|
||||||
|
// Remove not scanned module (probably physical removed) from mapping
|
||||||
|
if (-1 == SSPMGetMappedModuleIdIfFound(module)) {
|
||||||
|
// Clear mapping slot
|
||||||
|
Sspm->Settings.module_map[module] = 0;
|
||||||
|
Sspm->map_change = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (uint32_t module = 0; module < Sspm->module_max; module++) {
|
||||||
|
// Add scanned module to mapping
|
||||||
|
uint32_t module_id = SSMPGetModuleId(module);
|
||||||
|
if (-1 == SSPMGetModuleNumberFromMapIfFound(module_id)) {
|
||||||
|
// Scanned module not in mapping list (probably due to physical install)
|
||||||
|
for (uint32_t i = 0; i < Sspm->module_max; i++) {
|
||||||
|
// Find empty slot in mapping and insert
|
||||||
|
if (0 == Sspm->Settings.module_map[i]) {
|
||||||
|
Sspm->Settings.module_map[i] = module_id;
|
||||||
|
Sspm->map_change = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Sspm->map_change) {
|
||||||
|
Sspm->map_change = false;
|
||||||
|
AddLog(LOG_LEVEL_INFO, PSTR("SPM: WARNING 4Relay mapping possibly changed"));
|
||||||
|
}
|
||||||
|
|
||||||
Sspm->module_selected = Sspm->module_max;
|
Sspm->module_selected = Sspm->module_max;
|
||||||
SSPMSendSetTime();
|
SSPMSendSetTime();
|
||||||
break;
|
break;
|
||||||
@ -1052,7 +1129,7 @@ void SSPMInit(void) {
|
|||||||
!ValidTemplate(PSTR("Sonoff SPM (POC2)"))) { return; }
|
!ValidTemplate(PSTR("Sonoff SPM (POC2)"))) { return; }
|
||||||
if (!PinUsed(GPIO_RXD) || !PinUsed(GPIO_TXD)) { return; }
|
if (!PinUsed(GPIO_RXD) || !PinUsed(GPIO_TXD)) { return; }
|
||||||
|
|
||||||
Sspm = (TSspm*)calloc(sizeof(TSspm), 1);
|
Sspm = (TSspm*)calloc(sizeof(TSspm), 1); // Need calloc to reset registers to 0/false
|
||||||
if (!Sspm) { return; }
|
if (!Sspm) { return; }
|
||||||
SspmBuffer = (uint8_t*)malloc(SSPM_SERIAL_BUFFER_SIZE);
|
SspmBuffer = (uint8_t*)malloc(SSPM_SERIAL_BUFFER_SIZE);
|
||||||
if (!SspmBuffer) {
|
if (!SspmBuffer) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user