From 2537cc878acfb6c2520df9b211cf9dd6d4db3b61 Mon Sep 17 00:00:00 2001 From: elecpower Date: Mon, 5 Apr 2021 22:59:32 +1000 Subject: [PATCH 1/4] Keep pre-existing inactive logical switches --- companion/src/firmwares/modeldata.cpp | 40 ++++++++++++++++++--------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index 85a7f0473..432a375f7 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -653,29 +653,43 @@ int ModelData::updateReference() LogicalSwitchData *lsd = &logicalSw[i]; if (!lsd->isEmpty()) { bool clearlsd = false; + int oldval1; + int oldval2; CSFunctionFamily family = lsd->getFunctionFamily(); switch(family) { case LS_FAMILY_VOFS: - updateSourceIntRef(lsd->val1); - if (lsd->val1 == 0) - clearlsd = true; + if (lsd->val1 != 0) { + updateSourceIntRef(lsd->val1); + if (lsd->val1 == 0) + clearlsd = true; + } break; case LS_FAMILY_STICKY: case LS_FAMILY_VBOOL: - updateSwitchIntRef(lsd->val1); - updateSwitchIntRef(lsd->val2); - if (lsd->val1 == 0 && lsd->val2 == 0) + oldval1 = lsd->val1; + oldval2 = lsd->val2; + if (lsd->val1 != 0) + updateSwitchIntRef(lsd->val1); + if (lsd->val2 != 0) + updateSwitchIntRef(lsd->val2); + if (lsd->val1 == 0 && lsd->val2 == 0 && ((lsd->val1 != oldval1 && oldval2 == 0) || (lsd->val2 != oldval2 && oldval1 == 0))) clearlsd = true; break; case LS_FAMILY_EDGE: - updateSwitchIntRef(lsd->val1); - if (lsd->val1 == 0) - clearlsd = true; + if (lsd->val1 != 0) { + updateSwitchIntRef(lsd->val1); + if (lsd->val1 == 0) + clearlsd = true; + } break; case LS_FAMILY_VCOMP: - updateSourceIntRef(lsd->val1); - updateSourceIntRef(lsd->val2); - if (lsd->val1 == 0 && lsd->val2 == 0) + oldval1 = lsd->val1; + oldval2 = lsd->val2; + if (lsd->val1 != 0) + updateSourceIntRef(lsd->val1); + if (lsd->val2 != 0) + updateSourceIntRef(lsd->val2); + if (lsd->val1 == 0 && lsd->val2 == 0 && ((lsd->val1 != oldval1 && oldval2 == 0) || (lsd->val2 != oldval2 && oldval1 == 0))) clearlsd = true; break; default: @@ -685,7 +699,7 @@ int ModelData::updateReference() lsd->clear(); appendUpdateReferenceParams(REF_UPD_TYPE_LOGICAL_SWITCH, REF_UPD_ACT_CLEAR, i); } - else { + else if (lsd->andsw != 0) { updateSwitchIntRef(lsd->andsw); } } From b6ec55769c2488bc298250e72252d2b6f5a80d26 Mon Sep 17 00:00:00 2001 From: elecpower Date: Mon, 5 Apr 2021 23:28:13 +1000 Subject: [PATCH 2/4] Fix upd ref type so clears refs equal to the one selected for deletion --- companion/src/firmwares/modeldata.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index 432a375f7..c90f90bd2 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -830,6 +830,7 @@ void ModelData::updateTypeIndexRef(R & curRef, const T type, const int idxAdj, c newRef.index = abs(curRef.index); div_t idx = div(newRef.index, updRefInfo.occurences); + div_t newidx; switch (updRefInfo.action) { @@ -847,9 +848,10 @@ void ModelData::updateTypeIndexRef(R & curRef, const T type, const int idxAdj, c if (idx.quot < (updRefInfo.index1 + idxAdj)) return; - newRef.index += updRefInfo.shift; + newRef.index = ((idx.quot + updRefInfo.shift) * updRefInfo.occurences) + idx.rem; + newidx = div(newRef.index, updRefInfo.occurences); - if (idx.quot < (updRefInfo.index1 + idxAdj) || idx.quot > (updRefInfo.maxindex + idxAdj)) { + if (newidx.quot < (updRefInfo.index1 + idxAdj) || newidx.quot > (updRefInfo.maxindex + idxAdj)) { if (defClear) newRef.clear(); else { From 066b4eb7d7d46c2e4373d893cde406b12485dd00 Mon Sep 17 00:00:00 2001 From: elecpower Date: Tue, 6 Apr 2021 05:48:19 +1000 Subject: [PATCH 3/4] For inputs and mixes when updating refs set 'new' FMs to safer option of inactive --- companion/src/firmwares/modeldata.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index c90f90bd2..b24cb4975 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -1097,7 +1097,7 @@ void ModelData::updateFlightModeFlags(unsigned int & curRef) switch (updRefInfo.action) { case REF_UPD_ACT_CLEAR: - flag[updRefInfo.index1] = false; + flag[updRefInfo.index1] = true; break; case REF_UPD_ACT_SHIFT: if(updRefInfo.shift < 0) { @@ -1105,7 +1105,7 @@ void ModelData::updateFlightModeFlags(unsigned int & curRef) if (i - updRefInfo.shift <= updRefInfo.maxindex) flag[i] = flag[i - updRefInfo.shift]; else - flag[i] = false; + flag[i] = true; } } else { @@ -1113,7 +1113,7 @@ void ModelData::updateFlightModeFlags(unsigned int & curRef) if (i - updRefInfo.shift >= updRefInfo.index1) flag[i] = flag[i - updRefInfo.shift]; else - flag[i] = false; + flag[i] = true; } } break; From 43655faee250a12fbd52e3f114728263b32d0d96 Mon Sep 17 00:00:00 2001 From: elecpower Date: Tue, 6 Apr 2021 06:34:11 +1000 Subject: [PATCH 4/4] Check AND switch before clearing LS --- companion/src/firmwares/modeldata.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index b24cb4975..679e90f5f 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -695,13 +695,14 @@ int ModelData::updateReference() default: break; } - if (clearlsd) { + + if (lsd->andsw != 0) + updateSwitchIntRef(lsd->andsw); + + if (clearlsd && lsd->andsw == 0) { lsd->clear(); appendUpdateReferenceParams(REF_UPD_TYPE_LOGICAL_SWITCH, REF_UPD_ACT_CLEAR, i); } - else if (lsd->andsw != 0) { - updateSwitchIntRef(lsd->andsw); - } } } //s1.report("Logical Switches");