/*global $,helper,mspHelper,MSP,GUI,SERVO_RULES,MOTOR_RULES,MIXER_CONFIG,googleAnalytics,LOGIC_CONDITIONS,TABS,ServoMixRule*/
'use strict';
TABS.mixer = {};
TABS.mixer.initialize = function (callback, scrollPosition) {
let loadChainer = new MSPChainerClass(),
saveChainer = new MSPChainerClass(),
currentPlatform,
currentMixerPreset,
loadedMixerPresetID,
$servoMixTable,
$servoMixTableBody,
$motorMixTable,
$motorMixTableBody,
modal,
motorWizardModal;
if (GUI.active_tab != 'mixer') {
GUI.active_tab = 'mixer';
googleAnalytics.sendAppView('Mixer');
}
loadChainer.setChain([
mspHelper.loadMixerConfig,
mspHelper.loadMotors,
mspHelper.loadServoMixRules,
mspHelper.loadMotorMixRules,
mspHelper.loadOutputMappingExt,
mspHelper.loadTimerOutputModes,
mspHelper.loadLogicConditions,
mspHelper.loadEzTune,
]);
loadChainer.setExitPoint(loadHtml);
loadChainer.execute();
saveChainer.setChain([
mspHelper.saveMixerConfig,
mspHelper.sendServoMixer,
mspHelper.sendMotorMixer,
mspHelper.sendTimerOutputModes,
saveSettings,
mspHelper.saveToEeprom
]);
saveChainer.setExitPoint(reboot);
function saveSettings(onComplete) {
Settings.saveInputs().then(onComplete);
}
function reboot() {
//noinspection JSUnresolvedVariable
GUI.log(chrome.i18n.getMessage('configurationEepromSaved'));
GUI.tab_switch_cleanup(function() {
MSP.send_message(MSPCodes.MSP_SET_REBOOT, false, false, reinitialize);
});
}
function reinitialize() {
//noinspection JSUnresolvedVariable
GUI.log(chrome.i18n.getMessage('deviceRebooting'));
GUI.handleReconnect($('.tab_mixer a'));
}
function loadHtml() {
GUI.load("./tabs/mixer.html", Settings.processHtml(processHtml));
}
function renderOutputTable() {
let outputCount = OUTPUT_MAPPING.getOutputCount(),
$outputRow = $('#output-row'),
$functionRow = $('#function-row');
$outputRow.append('
');
$functionRow.append('
');
for (let i = 1; i <= outputCount; i++) {
let timerId = OUTPUT_MAPPING.getTimerId(i - 1);
let color = OUTPUT_MAPPING.getOutputTimerColor(i - 1);
$outputRow.append('
S' + i + ' (Timer ' + (timerId + 1) + ')
');
$functionRow.append('
-
');
}
$outputRow.find('td').css('width', 100 / (outputCount + 1) + '%');
}
function updateTimerOverride() {
let timers = OUTPUT_MAPPING.getUsedTimerIds();
for(let i =0; i < timers.length;++i) {
let timerId = timers[i];
$select = $('#timer-output-' + timerId);
if(!$select) {
continue;
}
OUTPUT_MAPPING.setTimerOverride(timerId, $select.val());
}
}
function renderTimerOverride() {
let outputCount = OUTPUT_MAPPING.getOutputCount(),
$container = $('#timerOutputsList'), timers = {};
let usedTimers = OUTPUT_MAPPING.getUsedTimerIds();
for (t of usedTimers) {
var usageMode = OUTPUT_MAPPING.getTimerOverride(t);
$container.append(
'
' +
'' +
'' +
'
'
);
}
}
function renderOutputMapping() {
let outputMap = OUTPUT_MAPPING.getOutputTable(
MIXER_CONFIG.platformType == PLATFORM_MULTIROTOR || MIXER_CONFIG.platformType == PLATFORM_TRICOPTER,
MOTOR_RULES.getNumberOfConfiguredMotors(),
SERVO_RULES.getUsedServoIndexes()
);
for (let i = 1; i <= OUTPUT_MAPPING.getOutputCount(); i++) {
$('#function-' + i).html(outputMap[i - 1]);
}
renderServoOutputImage(outputMap);
}
function renderServoOutputImage(outputMap) {
let mixerPreview = $('.mixerPreview');
mixerPreview.find('.outputImageNumber').remove();
$(".mix-rule-servo").each(function() {
$(this).css("background-color", "");
$(this).css("font-weight", "");
$(this).css("color", "");
});
if (MIXER_CONFIG.platformType == PLATFORM_AIRPLANE) {
if (outputMap != null && currentMixerPreset.hasOwnProperty('imageOutputsNumbers')) {
let outputPad = 1;
let outputArea = null;
let inputBoxes = null;
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;
for (let omIndex of outputMap) {
if (omIndex != '-') {
omIndex = omIndex.split(' ');
if (omIndex[0] == "Motor") {
motors.push(outputPad);
} else {
let servo = servoRules.getServoMixRuleFromTarget(omIndex[1]);
if (servo == null) {continue;}
let divID = "servoPreview" + omIndex[1];
switch (parseInt(servo.getInput())) {
case INPUT_STABILIZED_PITCH:
case STABILIZED_PITCH_POSITIVE:
case STABILIZED_PITCH_NEGATIVE:
case INPUT_RC_PITCH:
outputArea = getOutputImageArea(currentMixerPreset.imageOutputsNumbers, INPUT_STABILIZED_PITCH, surfaces.elevatorSet);
if (outputArea != null) {
mixerPreview.append('
S' + outputPad + '
');
$("#"+divID).css("top", outputArea.top + "px");
$("#"+divID).css("left", outputArea.left + "px");
$("#"+divID).css("border-color", outputArea.colour);
inputBoxes = getServoNumberInput(servo.getTarget());
if (inputBoxes.length > 0) {
$.each(inputBoxes, function() {
$(this).css("background-color", outputArea.colour);
$(this).css("font-weight", "bold");
$(this).css("color", "#FFFFFF");
});
}
surfaces.elevatorSet--;
}
break;
case INPUT_STABILIZED_ROLL:
case STABILIZED_ROLL_POSITIVE:
case STABILIZED_ROLL_NEGATIVE:
case INPUT_RC_ROLL:
outputArea = getOutputImageArea(currentMixerPreset.imageOutputsNumbers, INPUT_STABILIZED_ROLL, surfaces.aileronSet);
if (outputArea != null) {
mixerPreview.append('
S' + outputPad + '
');
$("#"+divID).css("top", outputArea.top + "px");
$("#"+divID).css("left", outputArea.left + "px");
$("#"+divID).css("border-color", outputArea.colour);
inputBoxes = getServoNumberInput(servo.getTarget());
if (inputBoxes.length > 0) {
$.each(inputBoxes, function() {
$(this).css("background-color", outputArea.colour);
$(this).css("font-weight", "bold");
$(this).css("color", "#FFFFFF");
});
}
surfaces.aileronSet--;
}
break;
case INPUT_STABILIZED_YAW:
case STABILIZED_YAW_POSITIVE:
case STABILIZED_YAW_NEGATIVE:
case INPUT_RC_YAW:
outputArea = getOutputImageArea(currentMixerPreset.imageOutputsNumbers, INPUT_STABILIZED_YAW, surfaces.rudderSet);
if (outputArea != null) {
mixerPreview.append('