'use strict'; var ORIG_AUX_CONFIG_IDS = []; TABS.auxiliary = {}; TABS.auxiliary.initialize = function (callback) { GUI.active_tab_ref = this; GUI.active_tab = 'auxiliary'; googleAnalytics.sendAppView('Auxiliary'); function get_mode_ranges() { MSP.send_message(MSPCodes.MSP_MODE_RANGES, false, false, get_box_ids); } function get_box_ids() { MSP.send_message(MSPCodes.MSP_BOXIDS, false, false, get_rc_data); } function get_rc_data() { if (SERIAL_CONFIG.ports.length == 0) { MSP.send_message(MSPCodes.MSP_RC, false, false, get_serial_config); } else { MSP.send_message(MSPCodes.MSP_RC, false, false, load_html); } } function get_serial_config() { MSP.send_message(MSPCodes.MSP_CF_SERIAL_CONFIG, false, false, load_html); } function load_html() { sort_modes_for_display(); GUI.load("./tabs/auxiliary.html", process_html); } MSP.send_message(MSPCodes.MSP_BOXNAMES, false, false, get_mode_ranges); const modeSections = {}; modeSections["ARM"] = "Arming"; modeSections["ANGLE"] = "Flight Modes"; modeSections["NAV RTH"] = "Navigation Modes"; modeSections["NAV ALTHOLD"] = "Flight Mode Modifiers"; modeSections["AUTO TUNE"] = "Fixed Wing"; modeSections["FPV ANGLE MIX"] = "Multi-rotor"; modeSections["OSD OFF"] = "OSD Modes"; modeSections["CAMSTAB"] = "FPV Camera Modes"; modeSections["BEEPER"] = "Misc Modes"; function sort_modes_for_display() { // This array defines the order that the modes are displayed in the configurator modes page const configuratorBoxOrder = [ "ARM", "PREARM", // Arming "ANGLE", "HORIZON", "MANUAL", // Flight modes "NAV RTH", "NAV COURSE HOLD", "NAV CRUISE", "NAV POSHOLD", "NAV WP", "GCS NAV", // Navigation modes "NAV ALTHOLD", "HEADING HOLD", "AIR MODE", "SOARING", "SURFACE", // Flight mode modifiers "AUTO TUNE", "SERVO AUTOTRIM", "AUTO LEVEL", "NAV LAUNCH", "LOITER CHANGE", "FLAPERON", "TURN ASSIST", // Fixed wing specific "FPV ANGLE MIX", "TURTLE", "MC BRAKING", "HEADFREE", "HEADADJ", // Multi-rotor specific "OSD OFF", "OSD ALT 1", "OSD ALT 2", "OSD ALT 3", // OSD "CAMSTAB", "CAMERA CONTROL 1", "CAMERA CONTROL 2", "CAMERA CONTROL 3", // FPV Camera "BEEPER", "LEDS OFF", "LIGHTS", "HOME RESET", "WP PLANNER", "BLACKBOX", "FAILSAFE", "KILLSWITCH", // Misc "TELEMETRY", "MSP RC OVERRIDE", "USER1", "USER2" ]; // Sort the modes var tmpAUX_CONFIG = []; var tmpAUX_CONFIG_IDS =[]; var found = false; var sortedID = 0; for (i=0; i AUX_CONFIG.length) { for (i=0; i 2100) { channelPosition = 2100; } var percentage = (channelPosition - 900) / (2100-900) * 100; $('.modes .ranges .range').each( function () { var auxChannelCandidateIndex = $(this).find('.channel').val(); if (auxChannelCandidateIndex != auxChannelIndex) { return; } $(this).find('.marker').css('left', percentage + '%'); }); } // data pulling functions used inside interval timer function get_rc_data() { if (helper.mspQueue.shouldDrop()) { return; } MSP.send_message(MSPCodes.MSP_RC, false, false, update_ui); } function update_ui() { let hasUsedMode = false; let acroEnabled = true; let acroFail = ["ANGLE", "HORIZON", "MANUAL", "NAV RTH", "NAV POSHOLD", "NAV CRUISE", "NAV COURSE HOLD", "NAV WP", "GCS NAV"]; var auxChannelCount = RC.active_channels - 4; for (var i = 0; i < (auxChannelCount); i++) { update_marker(i, RC.channels[i + 4]); } for (var i = 0; i < AUX_CONFIG.length; i++) { var modeElement = $('#mode-' + i); let inRange = false; if (modeElement.find(' .range').length == 0) { // if the mode is unused, skip it modeElement.removeClass('off').removeClass('on'); continue; } if (FC.isModeBitSet(modeElement.data('origId'))) { // The flight controller can activate the mode $('.mode .name').eq(modeElement.data('index')).data('modeElement').addClass('on').removeClass('inRange').removeClass('off'); if (jQuery.inArray(modeElement.data('modeName'), acroFail) !== -1) { acroEnabled = false; } } else { // Check to see if the mode is in range var modeRanges = modeElement.find(' .range'); for (r = 0; r < modeRanges.length; r++) { var rangeLow = $(modeRanges[r]).find('.lowerLimitValue').html(); var rangeHigh = $(modeRanges[r]).find('.upperLimitValue').html(); var markerPosition = $(modeRanges[r]).find('.marker')[0].style.left; markerPosition = markerPosition.substring(0, markerPosition.length-1); rangeLow = (rangeLow - 900) / (2100-900) * 100; rangeHigh = (rangeHigh - 900) / (2100-900) * 100; if ((markerPosition >= rangeLow) && (markerPosition <= rangeHigh)) { inRange = true; } } if (inRange) { $('.mode .name').eq(modeElement.data('index')).data('modeElement').removeClass('on').addClass('inRange').removeClass('off'); if (jQuery.inArray(modeElement.data('modeName'), acroFail) !== -1) { acroEnabled = false; } } else { // If not, it is shown as disabled. $('.mode .name').eq(modeElement.data('index')).data('modeElement').removeClass('on').removeClass('inRange').addClass('off'); } } hasUsedMode = true; } if (acroEnabled) { $('.acroEnabled').addClass('on').removeClass('off'); } else { $('.acroEnabled').removeClass('on').addClass('off'); } let hideUnused = hideUnusedModes && hasUsedMode; for (let i = 0; i < AUX_CONFIG.length; i++) { let modeElement = $('#mode-' + i); if (modeElement.find(' .range').length == 0) { modeElement.toggle(!hideUnused); } } $(".modeSection").each(function() { $(this).toggle(!hideUnused); }); } let hideUnusedModes = false; chrome.storage.local.get('hideUnusedModes', function (result) { $("input#switch-toggle-unused") .change(function() { hideUnusedModes = $(this).prop("checked"); chrome.storage.local.set({ hideUnusedModes: hideUnusedModes }); update_ui(); }) .prop("checked", !!result.hideUnusedModes) .change(); }); // update ui instantly on first load update_ui(); // enable data pulling helper.mspBalancedInterval.add('aux_data_pull', 50, 1, get_rc_data); $(".tab-auxiliary .acroEnabled").width($("#mode-0 .info").width()); GUI.content_ready(callback); } }; TABS.auxiliary.cleanup = function (callback) { if (callback) callback(); }; $(window).on('resize', function(){ $(".tab-auxiliary .acroEnabled").width($("#mode-0 .info").width()); });