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; } } }