From 670ae846902f242cb9b91e4c1c279016b02999d5 Mon Sep 17 00:00:00 2001
From: philmoz <philmoz@users.noreply.github.com>
Date: Fri, 10 Nov 2023 20:20:20 +1100
Subject: [PATCH] fix(cpn): Default calibration values for 6POS switch (#4271)

---
 companion/src/firmwares/generalsettings.cpp | 33 +++++++++++++++++----
 companion/src/firmwares/generalsettings.h   |  1 +
 companion/src/mdichild.cpp                  |  6 ++++
 3 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp
index 1e9b7958a10..758cd92bc8f 100644
--- a/companion/src/firmwares/generalsettings.cpp
+++ b/companion/src/firmwares/generalsettings.cpp
@@ -87,12 +87,6 @@ void GeneralSettings::clear()
 
 void GeneralSettings::init()
 {
-  for (int i = 0; i < CPN_MAX_ANALOGS; ++i) {
-    calibMid[i]     = 0x200;
-    calibSpanNeg[i] = 0x180;
-    calibSpanPos[i] = 0x180;
-  }
-
   Firmware * firmware = Firmware::getCurrentVariant();
   Board::Type board = firmware->getBoard();
 
@@ -125,6 +119,18 @@ void GeneralSettings::init()
 
   setDefaultControlTypes(board);
 
+  for (int i = 0; i < CPN_MAX_ANALOGS; ++i) {
+    if ((i >= CPN_MAX_STICKS) && (i < CPN_MAX_STICKS + CPN_MAX_POTS) && (potConfig[i-CPN_MAX_STICKS] == Board::POT_MULTIPOS_SWITCH)) {
+      calibMid[i]     = 773;;
+      calibSpanNeg[i] = 5388;
+      calibSpanPos[i] = 9758;
+    } else {
+      calibMid[i]     = 0x200;
+      calibSpanNeg[i] = 0x180;
+      calibSpanPos[i] = 0x180;
+    }
+  }
+
   backlightMode = 3; // keys and sticks
   backlightDelay = 2; // 2 * 5 = 10 secs
   inactivityTimer = 10;
@@ -675,6 +681,21 @@ AbstractStaticItemModel * GeneralSettings::uartSampleModeItemModel()
   return mdl;
 }
 
+bool GeneralSettings::fix6POSCalibration()
+{
+  bool changed = false;
+  // Fix default 6POS calibration
+  for (int i = CPN_MAX_STICKS; i < CPN_MAX_STICKS+CPN_MAX_POTS; i += 1) {
+    if ((potConfig[i-CPN_MAX_STICKS] == Board::POT_MULTIPOS_SWITCH) && (calibMid[i] == 0x200) && (calibSpanNeg[i] == 0x180) && (calibSpanPos[i] == 0x180)) {
+      calibMid[i] = 773;;
+      calibSpanNeg[i] = 5388;
+      calibSpanPos[i] = 9758;
+      changed = true;
+    }
+  }
+  return changed;
+}
+
 /*
     TrainerMix
 */
diff --git a/companion/src/firmwares/generalsettings.h b/companion/src/firmwares/generalsettings.h
index 0709a67ca87..eb860470eb9 100644
--- a/companion/src/firmwares/generalsettings.h
+++ b/companion/src/firmwares/generalsettings.h
@@ -180,6 +180,7 @@ class GeneralSettings {
     int getDefaultStick(unsigned int channel) const;
     RawSource getDefaultSource(unsigned int channel) const;
     int getDefaultChannel(unsigned int stick) const;
+    bool fix6POSCalibration();
 
     char semver[8 + 1];
     unsigned int version;
diff --git a/companion/src/mdichild.cpp b/companion/src/mdichild.cpp
index 94cdc346e75..f1107c948ad 100644
--- a/companion/src/mdichild.cpp
+++ b/companion/src/mdichild.cpp
@@ -1277,6 +1277,9 @@ bool MdiChild::loadFile(const QString & filename, bool resetCurrentFile)
     setCurrentFile(filename);
   }
 
+  if (radioData.generalSettings.fix6POSCalibration())
+    setModified();
+
   //  set after successful import
   if (getStorageType(filename) == STORAGE_TYPE_YML)
     setModified();
@@ -1657,6 +1660,9 @@ void MdiChild::openModelTemplate(int row)
     QMessageBox::warning(this, CPN_STR_TTL_WARNING, warning);
   }
 
+  if (radioData.generalSettings.fix6POSCalibration())
+    setModified();
+
   radioData.models[row] = data.models[0];
 
   //  reset module bindings