diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 20bc9f87..7e01fe95 100755 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -138,7 +138,7 @@ }, "tabSwitchUpgradeRequired": { - "message": "You need to upgrade your firmware before you can view any of the tabs." + "message": "You need to upgrade your firmware before you can use the $1 tab." }, "firmwareVersion": { "message": "Firmware Version: $1" @@ -220,6 +220,9 @@ "defaultDonateText": { "message": "This utility is fully open source and is available free of charge to all cleanflight users.
If you found the cleanflight or cleanflight configurator useful, please consider supporting its development by donating." }, + "initialSetupBackupAndRestoreApiVersion": { + "message": "Backup and restore functionality disabled. You have firmware with API version $1, backup and restore requires $2. Please backup your settings via the CLI, see Cleanflight documentation for procedure." + }, "initialSetupButtonCalibrateAccel": { "message": "Calibrate Accelerometer" }, diff --git a/js/data_storage.js b/js/data_storage.js index 48bd873b..dffb6a7b 100755 --- a/js/data_storage.js +++ b/js/data_storage.js @@ -2,7 +2,8 @@ var CONFIGURATOR = { 'releaseDate': 1421431075334, // new Date().getTime() - 2015.01.16 - 'apiVersionAccepted': 1.4, + 'apiVersionAccepted': 1.2, + 'backupRestoreMinApiVersionAccepted': 1.4, 'backupFileMinVersionAccepted': '0.55', // chrome.runtime.getManifest().version is stored as string, so does this one 'connectionValid': false, 'connectionValidCliOnly': false, diff --git a/js/gui.js b/js/gui.js index 4b2aa076..f6007a9b 100644 --- a/js/gui.js +++ b/js/gui.js @@ -13,6 +13,28 @@ var GUI_control = function () { this.optional_usb_permissions = false; // controlled by usb permissions code this.interval_array = []; this.timeout_array = []; + this.defaultAllowedTabsWhenDisconnected = [ + 'landing', + 'firmware_flasher' + ]; + this.defaultAllowedTabsWhenConnected = [ + 'adjustments', + 'auxiliary', + 'cli', + 'configuration', + 'gps', + 'led_strip', + 'logging', + 'modes', + 'motors', + 'pid_tuning', + 'ports', + 'receiver', + 'sensors', + 'servos', + 'setup' + ]; + this.allowedTabs = this.defaultAllowedTabsWhenDisconnected; // check which operating system is user running if (navigator.appVersion.indexOf("Win") != -1) this.operating_system = "Windows"; diff --git a/js/serial_backend.js b/js/serial_backend.js index 9ae7d631..7847ae62 100755 --- a/js/serial_backend.js +++ b/js/serial_backend.js @@ -27,7 +27,7 @@ $(document).ready(function () { GUI.connected_to = false; CONFIGURATOR.connectionValid = false; - CONFIGURATOR.connectionValidCliOnly = false; + GUI.allowedTabs = GUI.defaultAllowedTabsWhenDisconnected.slice(); MSP.disconnect_cleanup(); PortUsage.reset(); @@ -46,14 +46,10 @@ $(document).ready(function () { // reset active sensor indicators sensor_status(0); - // de-select any selected tabs - $('#tabs > ul li').removeClass('active'); - // detach listeners and remove element data $('#content').empty(); - - // load default html - TABS.landing.initialize(); + + $('#tabs .tab_landing a').click(); } $(this).data("clicks", !clicks); @@ -164,15 +160,16 @@ function onOpen(openInfo) { MSP.send_message(MSP_codes.MSP_UID, false, false, function () { GUI.log(chrome.i18n.getMessage('uniqueDeviceIdReceived', [CONFIG.uid[0].toString(16) + CONFIG.uid[1].toString(16) + CONFIG.uid[2].toString(16)])); - GUI.timeout_remove('connecting'); // kill connecting timer - // continue as usually CONFIGURATOR.connectionValid = true; + GUI.allowedTabs = GUI.defaultAllowedTabsWhenConnected.slice(); + if (CONFIG.apiVersion < 1.4) { + GUI.allowedTabs.splice(GUI.allowedTabs.indexOf('led_strip'), 1); + } - $('div#port-picker a.connect').text(chrome.i18n.getMessage('disconnect')).addClass('active'); - $('#tabs ul.mode-disconnected').hide(); - $('#tabs ul.mode-connected').show(); - $('#tabs ul.mode-connected li a:first').click(); + onConnect(); + + $('#tabs ul.mode-connected .tab_setup a').click(); }); }); }); @@ -181,10 +178,9 @@ function onOpen(openInfo) { } else { GUI.log(chrome.i18n.getMessage('firmwareVersionNotSupported', [CONFIGURATOR.apiVersionAccepted])); CONFIGURATOR.connectionValid = true; // making it possible to open the CLI tab - $('div#port-picker a.connect').text(chrome.i18n.getMessage('disconnect')).addClass('active'); - $('#tabs li a:last').click(); // open CLI tab - GUI.timeout_remove('connecting'); // kill connecting timer - CONFIGURATOR.connectionValidCliOnly = true; + GUI.allowedTabs = ['cli']; + onConnect(); + $('#tabs .tab_cli a').click(); } }); } else { @@ -202,15 +198,22 @@ function onOpen(openInfo) { } } +function onConnect() { + GUI.timeout_remove('connecting'); // kill connecting timer + $('div#port-picker a.connect').text(chrome.i18n.getMessage('disconnect')).addClass('active'); + $('#tabs ul.mode-disconnected').hide(); + $('#tabs ul.mode-connected').show(); +} + function onClosed(result) { if (result) { // All went as expected GUI.log(chrome.i18n.getMessage('serialPortClosedOk')); } else { // Something went wrong GUI.log(chrome.i18n.getMessage('serialPortClosedFail')); } - $('#tabs ul.mode-disconnected').show(); + $('#tabs ul.mode-connected').hide(); - $('#tabs ul.mode-disconnected li a:first').click(); + $('#tabs ul.mode-disconnected').show(); } function read_serial(info) { diff --git a/main.js b/main.js index bf7ea997..374f4cdc 100755 --- a/main.js +++ b/main.js @@ -60,10 +60,13 @@ $(document).ready(function () { $('a', ui_tabs).click(function () { if ($(this).parent().hasClass('active') == false && !GUI.tab_switch_in_progress) { // only initialize when the tab isn't already active var self = this, - tab = $(self).parent().prop('class'); + tabClass = $(self).parent().prop('class'); var tabRequiresConnection = $(self).parent().hasClass('mode-connected'); + var tab = tabClass.substring(4); + var tabName = $(self).text(); + if (tabRequiresConnection && !CONFIGURATOR.connectionValid) { GUI.log(chrome.i18n.getMessage('tabSwitchConnectionRequired')); return; @@ -74,9 +77,8 @@ $(document).ready(function () { return; } - - if (CONFIGURATOR.connectionValidCliOnly) { - GUI.log(chrome.i18n.getMessage('tabSwitchUpgradeRequired')); + if (GUI.allowedTabs.indexOf(tab) < 0) { + GUI.log(chrome.i18n.getMessage('tabSwitchUpgradeRequired', [tabName])); return; } @@ -101,62 +103,62 @@ $(document).ready(function () { } switch (tab) { - case 'tab_landing': + case 'landing': TABS.landing.initialize(content_ready); break; - case 'tab_firmware_flasher': + case 'firmware_flasher': TABS.firmware_flasher.initialize(content_ready); break; - case 'tab_auxiliary': + case 'auxiliary': TABS.auxiliary.initialize(content_ready); break; - case 'tab_adjustments': + case 'adjustments': TABS.adjustments.initialize(content_ready); break; - case 'tab_ports': + case 'ports': TABS.ports.initialize(content_ready); break; - case 'tab_led_strip': + case 'led_strip': TABS.led_strip.initialize(content_ready); break; - case 'tab_setup': + case 'setup': TABS.setup.initialize(content_ready); break; - case 'tab_configuration': + case 'configuration': TABS.configuration.initialize(content_ready); break; - case 'tab_pid_tuning': + case 'pid_tuning': TABS.pid_tuning.initialize(content_ready); break; - case 'tab_receiver': + case 'receiver': TABS.receiver.initialize(content_ready); break; - case 'tab_modes': + case 'modes': TABS.modes.initialize(content_ready); break; - case 'tab_servos': + case 'servos': TABS.servos.initialize(content_ready); break; - case 'tab_gps': + case 'gps': TABS.gps.initialize(content_ready); break; - case 'tab_motors': + case 'motors': TABS.motors.initialize(content_ready); break; - case 'tab_sensors': + case 'sensors': TABS.sensors.initialize(content_ready); break; - case 'tab_logging': + case 'logging': TABS.logging.initialize(content_ready); break; - case 'tab_cli': + case 'cli': TABS.cli.initialize(content_ready); break; default: - console.log('Tab not found'); + console.log('Tab not found:' + tab); } }); } diff --git a/tabs/setup.js b/tabs/setup.js index 6968cca7..c0ef8c27 100644 --- a/tabs/setup.js +++ b/tabs/setup.js @@ -38,6 +38,12 @@ TABS.setup.initialize = function (callback) { // translate to user-selected language localize(); + if (CONFIG.apiVersion < CONFIGURATOR.backupRestoreMinApiVersionAccepted) { + $('#content .backup').addClass('disabled'); + $('#content .restore').addClass('disabled'); + + GUI.log(chrome.i18n.getMessage('initialSetupBackupAndRestoreApiVersion', [CONFIG.apiVersion, CONFIGURATOR.backupRestoreMinApiVersionAccepted])); + } // initialize 3D self.initialize3D(); @@ -112,6 +118,9 @@ TABS.setup.initialize = function (callback) { }); $('#content .backup').click(function () { + if ($(this).hasClass('disabled')) { + return; + } configuration_backup(function () { GUI.log(chrome.i18n.getMessage('initialSetupBackupSuccess')); googleAnalytics.sendEvent('Configuration', 'Backup', 'true'); @@ -119,6 +128,9 @@ TABS.setup.initialize = function (callback) { }); $('#content .restore').click(function () { + if ($(this).hasClass('disabled')) { + return; + } configuration_restore(function () { GUI.log(chrome.i18n.getMessage('initialSetupRestoreSuccess')); googleAnalytics.sendEvent('Configuration', 'Restore', 'true');