diff --git a/js/model.js b/js/model.js
index 9ff5813f..49792765 100644
--- a/js/model.js
+++ b/js/model.js
@@ -799,6 +799,22 @@ helper.mixer = (function (mixerList) {
}
}
+ publicScope.countSurfaceType = function(mixer, surface) {
+ let count = 0;
+
+ for (const i in mixer.servoMixer) {
+ if (mixer.servoMixer.hasOwnProperty(i)) {
+ const s = mixer.servoMixer[i];
+
+ if (s.getInput() === surface) {
+ count++;
+ }
+ }
+ }
+
+ return count;
+ }
+
return publicScope;
})(mixerList);
diff --git a/tabs/mixer.js b/tabs/mixer.js
index 3aee4b46..85462cec 100644
--- a/tabs/mixer.js
+++ b/tabs/mixer.js
@@ -111,10 +111,10 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
let outputPad = 1;
let outputArea = null;
let inputBoxes = null;
- let surfaceSet = {
- aileron: false,
- elevator: false,
- rudder: false,
+ let surfaces = {
+ aileronSet: helper.mixer.countSurfaceType(currentMixerPreset, INPUT_STABILIZED_ROLL),
+ elevatorSet: helper.mixer.countSurfaceType(currentMixerPreset, INPUT_STABILIZED_PITCH),
+ rudderSet: helper.mixer.countSurfaceType(currentMixerPreset, INPUT_STABILIZED_YAW),
};
let motors = [];
let servoRules = SERVO_RULES;
@@ -131,7 +131,7 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
switch (parseInt(servo.getInput())) {
case INPUT_STABILIZED_PITCH:
case INPUT_RC_PITCH:
- outputArea = getOutputImageArea(currentMixerPreset.imageOutputsNumbers, INPUT_STABILIZED_PITCH, surfaceSet.elevator);
+ outputArea = getOutputImageArea(currentMixerPreset.imageOutputsNumbers, INPUT_STABILIZED_PITCH, surfaces.elevatorSet);
if (outputArea != null) {
mixerPreview.append('
S' + outputPad + '
');
@@ -148,12 +148,12 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
});
}
- surfaceSet.elevator = true;
+ surfaces.elevatorSet--;
}
break;
case INPUT_STABILIZED_ROLL:
case INPUT_RC_ROLL:
- outputArea = getOutputImageArea(currentMixerPreset.imageOutputsNumbers, INPUT_STABILIZED_ROLL, surfaceSet.aileron);
+ outputArea = getOutputImageArea(currentMixerPreset.imageOutputsNumbers, INPUT_STABILIZED_ROLL, surfaces.aileronSet);
if (outputArea != null) {
mixerPreview.append('S' + outputPad + '
');
@@ -170,12 +170,12 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
});
}
- surfaceSet.aileron = true;
+ surfaces.aileronSet--;
}
break;
case INPUT_STABILIZED_YAW:
case INPUT_RC_YAW:
- outputArea = getOutputImageArea(currentMixerPreset.imageOutputsNumbers, INPUT_STABILIZED_YAW, surfaceSet.rudder);
+ outputArea = getOutputImageArea(currentMixerPreset.imageOutputsNumbers, INPUT_STABILIZED_YAW, surfaces.rudderSet);
if (outputArea != null) {
mixerPreview.append('S' + outputPad + '
');
@@ -192,7 +192,7 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
});
}
- surfaceSet.rudder = true;
+ surfaces.rudderSet--;
}
break;
}
@@ -205,7 +205,7 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
if (motors.length > 0) {
mixerPreview.append('S' + motors.join('/') + '
');
- outputArea = getOutputImageArea(currentMixerPreset.imageOutputsNumbers, INPUT_STABILIZED_THROTTLE, false);
+ outputArea = getOutputImageArea(currentMixerPreset.imageOutputsNumbers, INPUT_STABILIZED_THROTTLE, 0);
if (outputArea != null) {
$("#motorsPreview").css("top", outputArea.top + "px");
$("#motorsPreview").css("left", outputArea.left + "px");
@@ -216,24 +216,35 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
}
}
- function getOutputImageArea(outputImageAreas, input, secondSurface) {
+ var lastRoll = -1;
+ var lastPitch = -1;
+ var lastYaw = -1;
+
+ function getOutputImageArea(outputImageAreas, input, surfacesSet) {
let returnArea = null;
- let firstAileronFound = false;
- let firstRuddervatorFound = false;
for (let area of outputImageAreas) {
if (area.input == input) {
if ( input === INPUT_STABILIZED_THROTTLE
- || (input === INPUT_STABILIZED_YAW && !secondSurface)
- || ((input === INPUT_STABILIZED_ROLL && !secondSurface) || (input === INPUT_STABILIZED_ROLL && secondSurface && firstAileronFound))
- || ((input === INPUT_STABILIZED_PITCH && !secondSurface) || (input === INPUT_STABILIZED_PITCH && secondSurface && firstRuddervatorFound))
+ || (surfacesSet > 0 &&
+ ((input === INPUT_STABILIZED_YAW && surfacesSet !== lastYaw)
+ || (input === INPUT_STABILIZED_ROLL && surfacesSet !== lastRoll)
+ || (input === INPUT_STABILIZED_PITCH && surfacesSet !== lastPitch))
+ )
) {
returnArea = area;
- break;
- } else if (input === INPUT_STABILIZED_ROLL) {
- firstAileronFound = true;
+ }
+
+ if (input === INPUT_STABILIZED_ROLL) {
+ lastRoll = surfacesSet-1;
} else if (input === INPUT_STABILIZED_PITCH) {
- firstRuddervatorFound = true;
+ lastPitch = surfacesSet-1;
+ } else if (input === INPUT_STABILIZED_YAW) {
+ lastYaw = surfacesSet-1;
+ }
+
+ if (returnArea !== null) {
+ break;
}
}
}