diff --git a/locales/en/messages.json b/locales/en/messages.json
index ef0fa052..acf7a1a8 100644
--- a/locales/en/messages.json
+++ b/locales/en/messages.json
@@ -9,12 +9,21 @@
"error": {
"message": "Error: {{errorMessage}}"
},
+ "errorTitle": {
+ "message": "Error"
+ },
"warningTitle": {
"message": "Warning"
},
"noticeTitle": {
"message": "Notice"
},
+ "operationNotSupported": {
+ "message": "This operation is not supported by your hardware."
+ },
+ "storageDeviceNotReady": {
+ "message": "The storage device is not ready. In the case of a microSD card, make sure it is properly recognised by your flight controller."
+ },
"options_title": {
"message": "Application Options"
},
@@ -598,8 +607,20 @@
"initialSetupButtonRestore": {
"message": "Restore"
},
+ "initialSetupButtonRebootBootloader": {
+ "message": "Activate Boot Loader / DFU"
+ },
+ "initialSetupButtonRebootMsc": {
+ "message": "Activate Mass Storage Device Mode"
+ },
"initialSetupBackupRestoreText": {
- "message": "Backup your configuration in case of an accident, CLI settings are not included - See 'dump' cli command"
+ "message": "Backup your configuration in case of an accident, CLI settings are not included - use the command 'diff all' in CLI for this."
+ },
+ "initialSetupRebootBootloaderText": {
+ "message": "Reboot into boot loader / DFU mode."
+ },
+ "initialSetupRebootMscText": {
+ "message": "Reboot into mass storage device (MSC) mode. Once activated, the onboard flash or SD card on your flight controller will be recognised as a storage device by your computer, and allow you to download your log files. Eject and power cycel your flight controller to leave mass storage device mode."
},
"initialSetupBackupSuccess": {
"message": "Backup saved successfully"
diff --git a/src/js/main.js b/src/js/main.js
index 326921c2..9ebe303a 100644
--- a/src/js/main.js
+++ b/src/js/main.js
@@ -642,4 +642,16 @@ function openNewWindowsInExternalBrowser() {
} catch (ex) {
console.log("require does not exist, maybe inside chrome");
}
-}
\ No newline at end of file
+}
+
+function showErrorDialog(message) {
+ var dialog = $('.dialogError')[0];
+
+ $('.dialogError-content').html(message);
+
+ $('.dialogError-closebtn').click(function() {
+ dialog.close();
+ });
+
+ dialog.showModal();
+}
diff --git a/src/js/msp/MSPHelper.js b/src/js/msp/MSPHelper.js
index b82c5c76..ba13a314 100644
--- a/src/js/msp/MSPHelper.js
+++ b/src/js/msp/MSPHelper.js
@@ -27,6 +27,12 @@ function MspHelper () {
'RUNCAM_DEVICE_CONTROL': 14, // support communitate with RunCam Device
'LIDAR_TF': 15
};
+
+ self.REBOOT_TYPES = {
+ FIRMWARE: 0,
+ BOOTLOADER: 1,
+ MSC: 2
+ };
}
MspHelper.prototype.reorderPwmProtocols = function (protocol) {
@@ -617,6 +623,17 @@ MspHelper.prototype.process_data = function(dataHandler) {
break;
case MSPCodes.MSP_SET_REBOOT:
+ if (semver.gte(CONFIG.apiVersion, "1.40.0")) {
+ var rebootType = data.read8();
+ if (rebootType === self.REBOOT_TYPES.MSC) {
+ if (data.read8() === 0) {
+ console.log('Storage device not ready.');
+
+ showErrorDialog(i18n.getMessage('storageDeviceNotReady'));
+ break;
+ }
+ }
+ }
console.log('Reboot request accepted');
break;
@@ -1185,6 +1202,11 @@ MspHelper.prototype.process_data = function(dataHandler) {
console.log('Unknown code detected: ' + code);
} else {
console.log('FC reports unsupported message error: ' + code);
+
+ switch (code) {
+ case MSPCodes.MSP_SET_REBOOT:
+ showErrorDialog(i18n.getMessage('operationNotSupported'));
+ }
}
}
// trigger callbacks, cleanup/remove callback after trigger
@@ -1207,7 +1229,6 @@ MspHelper.prototype.process_data = function(dataHandler) {
}
}
-
/**
* Encode the request body for the MSP request with the given code and return it as an array of bytes.
*/
diff --git a/src/js/tabs/setup.js b/src/js/tabs/setup.js
index 686b0698..6682c6db 100755
--- a/src/js/tabs/setup.js
+++ b/src/js/tabs/setup.js
@@ -59,9 +59,31 @@ TABS.setup.initialize = function (callback) {
self.initializeInstruments();
-
$('#arming-disable-flag-row').attr('title', i18n.getMessage('initialSetupArmingDisableFlagsTooltip'));
+ if (semver.gte(CONFIG.apiVersion, "1.40.0")) {
+ if (isExpertModeEnabled()) {
+ $('.initialSetupRebootBootloader').show();
+ } else {
+ $('.initialSetupRebootBootloader').hide();
+ }
+
+ $('a.rebootBootloader').click(function () {
+ var buffer = [];
+ buffer.push(1);
+ MSP.send_message(MSPCodes.MSP_SET_REBOOT, buffer, false);
+ });
+
+ $('a.rebootMsc').click(function () {
+ var buffer = [];
+ buffer.push(2);
+ MSP.send_message(MSPCodes.MSP_SET_REBOOT, buffer, false);
+ });
+ } else {
+ $('.initialSetupRebootBootloader').hide();
+ $('.initialSetupRebootMsc').hide();
+ }
+
// UI Hooks
$('a.calibrateAccel').click(function () {
var self = $(this);
diff --git a/src/main.html b/src/main.html
index cdd9775b..94b1652e 100755
--- a/src/main.html
+++ b/src/main.html
@@ -323,5 +323,15 @@
+
+