diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 20bc9f876d..7e01fe9570 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 48bd873ba7..dffb6a7b65 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 4b2aa07667..f6007a9b58 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 9ae7d631e6..7847ae62cb 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 bf7ea99705..374f4cdc24 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 6968cca77b..c0ef8c2708 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');