diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index daa44a93..1e37ecb3 100755
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -1894,5 +1894,29 @@
},
"armingCheckFail": {
"message": "FAIL"
+ },
+ "tabPresets": {
+ "message": "Presets"
+ },
+ "presetsPreset": {
+ "message": "Preset"
+ },
+ "presetsDescription": {
+ "message": "Description"
+ },
+ "presetsButtonApply": {
+ "message": "Apply"
+ },
+ "presetApplyTitle" : {
+ "message": "Confirm"
+ },
+ "presetsButtonSaveAndReboot": {
+ "message": "Save and reboot"
+ },
+ "presetsApplyHeader": {
+ "message": "Warning"
+ },
+ "presetApplyDescription": {
+ "message": "Preset overwrites selected configuration values including mixer, filtering, PIDs and other. Settings like: flight modes, radio settings, failsafe and OSD are not changed. Applied values should NOT treated as final values, but entry points for final tuning.
Always check new configuration before flying!"
}
}
\ No newline at end of file
diff --git a/js/fc.js b/js/fc.js
index 6dc0ec24..ef0f73f3 100644
--- a/js/fc.js
+++ b/js/fc.js
@@ -237,7 +237,13 @@ var FC = {
FILTER_CONFIG = {
gyroSoftLpfHz: null,
dtermLpfHz: null,
- yawLpfHz: null
+ yawLpfHz: null,
+ gyroNotchHz1: null,
+ gyroNotchCutoff1: null,
+ dtermNotchHz: null,
+ dtermNotchCutoff: null,
+ gyroNotchHz2: null,
+ gyroNotchCutoff2: null
};
PID_ADVANCED = {
diff --git a/js/gui.js b/js/gui.js
index e3bdeed6..e70376ce 100644
--- a/js/gui.js
+++ b/js/gui.js
@@ -37,7 +37,8 @@ var GUI_control = function () {
'sensors',
'servos',
'setup',
- 'osd'
+ 'osd',
+ 'profiles'
];
this.allowedTabs = this.defaultAllowedTabsWhenDisconnected;
diff --git a/js/model.js b/js/model.js
index b30f8b9f..e67f2780 100644
--- a/js/model.js
+++ b/js/model.js
@@ -2,30 +2,29 @@
// generate mixer
var mixerList = [
- {name: 'Tricopter', model: 'tricopter', image: 'tri'},
- {name: 'Quad +', model: 'quad_x', image: 'quad_p'},
- {name: 'Quad X', model: 'quad_x', image: 'quad_x'},
- {name: 'Bicopter', model: 'custom', image: 'bicopter'},
- {name: 'Gimbal', model: 'custom', image: 'custom'},
- {name: 'Y6', model: 'y6', image: 'y6'},
- {name: 'Hex +', model: 'hex_plus', image: 'hex_p'},
- {name: 'Flying Wing', model: 'custom', image: 'flying_wing'},
- {name: 'Y4', model: 'y4', image: 'y4'},
- {name: 'Hex X', model: 'hex_x', image: 'hex_x'},
- {name: 'Octo X8', model: 'custom', image: 'octo_x8'},
- {name: 'Octo Flat +', model: 'custom', image: 'octo_flat_p'},
- {name: 'Octo Flat X', model: 'custom', image: 'octo_flat_x'},
- {name: 'Airplane', model: 'custom', image: 'airplane'},
- {name: 'Heli 120', model: 'custom', image: 'custom'},
- {name: 'Heli 90', model: 'custom', image: 'custom'},
- {name: 'V-tail Quad', model: 'quad_vtail', image: 'vtail_quad'},
- {name: 'Hex H', model: 'custom', image: 'custom'},
- {name: 'PPM to SERVO', model: 'custom', image: 'custom'},
- {name: 'Dualcopter', model: 'custom', image: 'custom'},
- {name: 'Singlecopter', model: 'custom', image: 'custom'},
- {name: 'A-tail Quad', model: 'quad_atail', image: 'atail_quad'},
- {name: 'Custom', model: 'custom', image: 'custom'},
- {name: 'Custom Airplane', model: 'custom', image: 'custom'},
- {name: 'Custom Tricopter', model: 'custom', image: 'custom'}
-
+ {name: 'Tricopter', model: 'tricopter', image: 'tri'}, // 1
+ {name: 'Quad +', model: 'quad_x', image: 'quad_p'}, // 2
+ {name: 'Quad X', model: 'quad_x', image: 'quad_x'}, // 3
+ {name: 'Bicopter', model: 'custom', image: 'bicopter'}, // 4
+ {name: 'Gimbal', model: 'custom', image: 'custom'}, // 5
+ {name: 'Y6', model: 'y6', image: 'y6'}, // 6
+ {name: 'Hex +', model: 'hex_plus', image: 'hex_p'}, // 7
+ {name: 'Flying Wing', model: 'custom', image: 'flying_wing'}, // 8
+ {name: 'Y4', model: 'y4', image: 'y4'}, // 9
+ {name: 'Hex X', model: 'hex_x', image: 'hex_x'}, // 10
+ {name: 'Octo X8', model: 'custom', image: 'octo_x8'}, // 11
+ {name: 'Octo Flat +', model: 'custom', image: 'octo_flat_p'}, // 12
+ {name: 'Octo Flat X', model: 'custom', image: 'octo_flat_x'}, // 13
+ {name: 'Airplane', model: 'custom', image: 'airplane'}, // 14
+ {name: 'Heli 120', model: 'custom', image: 'custom'}, // 15
+ {name: 'Heli 90', model: 'custom', image: 'custom'}, // 16
+ {name: 'V-tail Quad', model: 'quad_vtail', image: 'vtail_quad'}, // 17
+ {name: 'Hex H', model: 'custom', image: 'custom'}, // 18
+ {name: 'PPM to SERVO', model: 'custom', image: 'custom'}, // 19
+ {name: 'Dualcopter', model: 'custom', image: 'custom'}, // 20
+ {name: 'Singlecopter', model: 'custom', image: 'custom'}, // 21
+ {name: 'A-tail Quad', model: 'quad_atail', image: 'atail_quad'}, // 22
+ {name: 'Custom', model: 'custom', image: 'custom'}, // 23
+ {name: 'Custom Airplane', model: 'custom', image: 'custom'}, // 24
+ {name: 'Custom Tricopter', model: 'custom', image: 'custom'} // 25
];
diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js
index fda9f176..22d4db70 100644
--- a/js/msp/MSPHelper.js
+++ b/js/msp/MSPHelper.js
@@ -824,14 +824,14 @@ var mspHelper = (function (gui) {
FILTER_CONFIG.gyroSoftLpfHz = data.getUint8(0);
FILTER_CONFIG.dtermLpfHz = data.getUint16(1, true);
FILTER_CONFIG.yawLpfHz = data.getUint16(3, true);
- /*
- sbufWriteU16(dst, 1); //masterConfig.gyro_soft_notch_hz_1
- sbufWriteU16(dst, 1); //BF: masterConfig.gyro_soft_notch_cutoff_1
- sbufWriteU16(dst, 1); //BF: currentProfile->pidProfile.dterm_notch_hz
- sbufWriteU16(dst, 1); //currentProfile->pidProfile.dterm_notch_cutoff
- sbufWriteU16(dst, 1); //BF: masterConfig.gyro_soft_notch_hz_2
- sbufWriteU16(dst, 1); //BF: masterConfig.gyro_soft_notch_cutoff_2
- */
+
+ FILTER_CONFIG.gyroNotchHz1 = data.getUint16(5, true);
+ FILTER_CONFIG.gyroNotchCutoff1 = data.getUint16(7, true);
+ FILTER_CONFIG.dtermNotchHz = data.getUint16(9, true);
+ FILTER_CONFIG.dtermNotchCutoff = data.getUint16(11, true);
+ FILTER_CONFIG.gyroNotchHz2 = data.getUint16(13, true);
+ FILTER_CONFIG.gyroNotchCutoff2 = data.getUint16(15, true);
+
break;
case MSPCodes.MSP_SET_FILTER_CONFIG:
@@ -1230,23 +1230,23 @@ var mspHelper = (function (gui) {
buffer.push(lowByte(FILTER_CONFIG.yawLpfHz));
buffer.push(highByte(FILTER_CONFIG.yawLpfHz));
- buffer.push(0);
- buffer.push(0);
+ buffer.push(lowByte(FILTER_CONFIG.gyroNotchHz1));
+ buffer.push(highByte(FILTER_CONFIG.gyroNotchHz1));
- buffer.push(0);
- buffer.push(0);
+ buffer.push(lowByte(FILTER_CONFIG.gyroNotchCutoff1));
+ buffer.push(highByte(FILTER_CONFIG.gyroNotchCutoff1));
- buffer.push(0);
- buffer.push(0);
+ buffer.push(lowByte(FILTER_CONFIG.dtermNotchHz));
+ buffer.push(highByte(FILTER_CONFIG.dtermNotchHz));
- buffer.push(0);
- buffer.push(0);
+ buffer.push(lowByte(FILTER_CONFIG.dtermNotchCutoff));
+ buffer.push(highByte(FILTER_CONFIG.dtermNotchCutoff));
- buffer.push(0);
- buffer.push(0);
+ buffer.push(lowByte(FILTER_CONFIG.gyroNotchHz2));
+ buffer.push(highByte(FILTER_CONFIG.gyroNotchHz2));
- buffer.push(0);
- buffer.push(0);
+ buffer.push(lowByte(FILTER_CONFIG.gyroNotchCutoff2));
+ buffer.push(highByte(FILTER_CONFIG.gyroNotchCutoff2));
break;
case MSPCodes.MSP_SET_PID_ADVANCED:
@@ -1715,5 +1715,208 @@ var mspHelper = (function (gui) {
}
};
+ /*
+ * Basic sending methods used for chaining purposes
+ */
+ self.loadMspIdent = function (callback) {
+ MSP.send_message(MSPCodes.MSP_IDENT, false, false, callback);
+ };
+
+ self.loadINAVPidConfig = function(callback) {
+ if (semver.gt(CONFIG.flightControllerVersion, "1.3.0")) {
+ MSP.send_message(MSPCodes.MSP_INAV_PID, false, false, callback);
+ } else {
+ callback();
+ }
+ };
+
+ self.loadLoopTime = function (callback) {
+ MSP.send_message(MSPCodes.MSP_LOOP_TIME, false, false, callback);
+ };
+
+ self.loadAdvancedConfig = function(callback) {
+ if (semver.gte(CONFIG.flightControllerVersion, "1.3.0")) {
+ MSP.send_message(MSPCodes.MSP_ADVANCED_CONFIG, false, false, callback);
+ } else {
+ callback();
+ }
+ };
+
+ self.loadFilterConfig = function (callback) {
+ if (semver.gte(CONFIG.flightControllerVersion, "1.4.0")) {
+ MSP.send_message(MSPCodes.MSP_FILTER_CONFIG, false, false, callback);
+ } else {
+ callback();
+ }
+ };
+
+ self.loadPidAdvanced = function (callback) {
+ if (semver.gte(CONFIG.flightControllerVersion, "1.4.0")) {
+ MSP.send_message(MSPCodes.MSP_PID_ADVANCED, false, false, callback);
+ } else {
+ callback();
+ }
+ };
+
+ self.loadRcTuningData = function (callback) {
+ MSP.send_message(MSPCodes.MSP_RC_TUNING, false, false, callback);
+ };
+
+ self.loadPidData = function (callback) {
+ MSP.send_message(MSPCodes.MSP_PID, false, false, callback);
+ };
+
+ self.loadPidNames = function (callback) {
+ MSP.send_message(MSPCodes.MSP_PIDNAMES, false, false, callback);
+ };
+
+ self.loadStatus = function (callback) {
+ MSP.send_message(MSPCodes.MSP_STATUS, false, false, callback);
+ };
+
+ self.loadBfConfig = function (callback) {
+ MSP.send_message(MSPCodes.MSP_BF_CONFIG, false, false, callback);
+ };
+
+ self.loadMisc = function (callback) {
+ MSP.send_message(MSPCodes.MSP_MISC, false, false, callback);
+ };
+
+ self.loadArmingConfig = function (callback) {
+ MSP.send_message(MSPCodes.MSP_ARMING_CONFIG, false, false, callback);
+ };
+
+ self.loadRxConfig = function (callback) {
+ if (semver.gte(CONFIG.apiVersion, "1.21.0")) {
+ MSP.send_message(MSPCodes.MSP_RX_CONFIG, false, false, callback);
+ } else {
+ callback();
+ }
+ };
+
+ self.load3dConfig = function (callback) {
+ MSP.send_message(MSPCodes.MSP_3D, false, false, callback);
+ };
+
+ self.loadSensorAlignment = function (callback) {
+ MSP.send_message(MSPCodes.MSP_SENSOR_ALIGNMENT, false, false, callback);
+ };
+
+ self.loadSensorConfig = function (callback) {
+ if (semver.gte(CONFIG.flightControllerVersion, "1.5.0")) {
+ MSP.send_message(MSPCodes.MSP_SENSOR_CONFIG, false, false, callback);
+ } else {
+ callback();
+ }
+ };
+
+ self.loadRcDeadband = function (callback) {
+ if (semver.gte(CONFIG.apiVersion, "1.15.0")) {
+ MSP.send_message(MSPCodes.MSP_RC_DEADBAND, false, false, callback);
+ } else {
+ callback();
+ }
+ };
+
+ self.loadRcMap = function (callback) {
+ MSP.send_message(MSPCodes.MSP_RX_MAP, false, false, callback);
+ };
+
+ self.loadRcData = function (callback) {
+ MSP.send_message(MSPCodes.MSP_RC, false, false, callback);
+ };
+
+ self.loadAccTrim = function (callback) {
+ MSP.send_message(MSPCodes.MSP_ACC_TRIM, false, false, callback);
+ };
+
+ self.saveToEeprom = function saveToEeprom(callback) {
+ MSP.send_message(MSPCodes.MSP_EEPROM_WRITE, false, false, callback);
+ };
+
+ self.saveINAVPidConfig = function (callback) {
+ if (semver.gt(CONFIG.flightControllerVersion, "1.3.0")) {
+ MSP.send_message(MSPCodes.MSP_SET_INAV_PID, mspHelper.crunch(MSPCodes.MSP_SET_INAV_PID), false, callback);
+ } else {
+ callback();
+ }
+ };
+
+ self.saveLooptimeConfig = function (callback) {
+ MSP.send_message(MSPCodes.MSP_SET_LOOP_TIME, mspHelper.crunch(MSPCodes.MSP_SET_LOOP_TIME), false, callback);
+ };
+
+ self.saveAdvancedConfig = function (callback) {
+ if (semver.gte(CONFIG.flightControllerVersion, "1.3.0")) {
+ MSP.send_message(MSPCodes.MSP_SET_ADVANCED_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_ADVANCED_CONFIG), false, callback);
+ } else {
+ callback();
+ }
+ };
+
+ self.saveFilterConfig = function (callback) {
+ if (semver.gte(CONFIG.flightControllerVersion, "1.4.0")) {
+ MSP.send_message(MSPCodes.MSP_SET_FILTER_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_FILTER_CONFIG), false, callback);
+ } else {
+ callback();
+ }
+ };
+
+ self.savePidData = function (callback) {
+ MSP.send_message(MSPCodes.MSP_SET_PID, mspHelper.crunch(MSPCodes.MSP_SET_PID), false, callback);
+ };
+
+ self.saveRcTuningData = function (callback) {
+ MSP.send_message(MSPCodes.MSP_SET_RC_TUNING, mspHelper.crunch(MSPCodes.MSP_SET_RC_TUNING), false, callback);
+ };
+
+ self.savePidAdvanced = function (callback) {
+ if (semver.gte(CONFIG.flightControllerVersion, "1.4.0")) {
+ MSP.send_message(MSPCodes.MSP_SET_PID_ADVANCED, mspHelper.crunch(MSPCodes.MSP_SET_PID_ADVANCED), false, callback);
+ } else {
+ callback();
+ }
+ };
+
+ self.saveBfConfig = function (callback) {
+ MSP.send_message(MSPCodes.MSP_SET_BF_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_BF_CONFIG), false, callback);
+ };
+
+ self.saveMisc = function (callback) {
+ MSP.send_message(MSPCodes.MSP_SET_MISC, mspHelper.crunch(MSPCodes.MSP_SET_MISC), false, callback);
+ };
+
+ self.save3dConfig = function (callback) {
+ MSP.send_message(MSPCodes.MSP_SET_3D, mspHelper.crunch(MSPCodes.MSP_SET_3D), false, callback);
+ };
+
+ self.saveSensorAlignment = function (callback) {
+ MSP.send_message(MSPCodes.MSP_SET_SENSOR_ALIGNMENT, mspHelper.crunch(MSPCodes.MSP_SET_SENSOR_ALIGNMENT), false, callback);
+ };
+
+ self.saveAccTrim = function (callback) {
+ MSP.send_message(MSPCodes.MSP_SET_ACC_TRIM, mspHelper.crunch(MSPCodes.MSP_SET_ACC_TRIM), false, callback);
+ };
+
+ self.saveArmingConfig = function (callback) {
+ MSP.send_message(MSPCodes.MSP_SET_ARMING_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_ARMING_CONFIG), false, callback);
+ };
+
+ self.saveRxConfig = function (callback) {
+ if(semver.gte(CONFIG.apiVersion, "1.21.0")) {
+ MSP.send_message(MSPCodes.MSP_SET_RX_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_RX_CONFIG), false, callback);
+ } else {
+ callback();
+ }
+ };
+
+ self.saveSensorConfig = function (callback) {
+ if(semver.gte(CONFIG.flightControllerVersion, "1.5.0")) {
+ MSP.send_message(MSPCodes.MSP_SET_SENSOR_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_SENSOR_CONFIG), false, callback);
+ } else {
+ callback();
+ }
+ };
+
return self;
})(GUI);
diff --git a/js/msp/MSPchainer.js b/js/msp/MSPchainer.js
new file mode 100644
index 00000000..c8fadc22
--- /dev/null
+++ b/js/msp/MSPchainer.js
@@ -0,0 +1,35 @@
+/*global $*/
+'use strict';
+
+var MSPChainerClass = function () {
+
+ var self = {};
+
+ self.chain = [];
+ self.exitPoint = null;
+ self.chainIndex = 0;
+
+ self.setChain = function(chain) {
+ self.chain = chain;
+ };
+
+ self.setExitPoint = function (exitPoint) {
+ self.exitPoint = exitPoint;
+ };
+
+ self.returnCallback = function () {
+ self.chainIndex++;
+ if (self.chain[self.chainIndex]) {
+ self.chain[self.chainIndex](self.returnCallback);
+ } else {
+ self.exitPoint();
+ }
+ };
+
+ self.execute = function() {
+ self.chainIndex = 0;
+ self.chain[self.chainIndex](self.returnCallback);
+ };
+
+ return self;
+};
\ No newline at end of file
diff --git a/js/serial_backend.js b/js/serial_backend.js
index 5fdbd3b6..fc359fca 100755
--- a/js/serial_backend.js
+++ b/js/serial_backend.js
@@ -260,6 +260,13 @@ function onOpen(openInfo) {
GUI.allowedTabs.splice(GUI.allowedTabs.indexOf('osd'), 1);
}
+ /*
+ * Remove Presets on older than 1.6
+ */
+ if (semver.lt(CONFIG.flightControllerVersion, "1.6.0")) {
+ GUI.allowedTabs.splice(GUI.allowedTabs.indexOf('profiles'), 1);
+ }
+
onConnect();
$('#tabs ul.mode-connected .tab_setup a').click();
diff --git a/main.css b/main.css
index f47e6d05..00e1084d 100644
--- a/main.css
+++ b/main.css
@@ -1819,4 +1819,83 @@ select {
.full-width {
width: 100% !important;
+}
+
+.is-hidden {
+ display: none;
+}
+
+.modal__content {
+
+}
+
+.modal__buttons {
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ margin: 1em;
+}
+
+.modal__button {
+ padding: 1em;
+ text-align: center;
+ background-color: #fff;
+ border-radius: 4px;
+ border: 1px solid #37a8db;
+ color: #37a8db;
+ font-family: 'open_sanssemibold', Arial, serif;
+ font-size: 12px;
+ line-height: 13px;
+ display: block;
+ transition: all ease 0.2s;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.modal__button--main {
+ background-color: #37a8db;
+ text-shadow: 0 1px rgba(0, 0, 0, 0.25);
+ color: #fff;
+ border: 1px solid #3a9dbf;
+ transition: all ease 0.2s;
+}
+
+.modal__button--main:active {
+ background-color: #37a8db;
+ transition: all ease 0.0s;
+ box-shadow: inset 0 1px 5px rgba(0, 0, 0, 0.35);
+}
+
+.modal__button--main:hover {
+ background-color: #3394b5;
+ transition: all ease 0.2s;
+}
+
+.modal__button--disabled {
+ cursor: default;
+ color: #fff;
+ background-color: #AFAFAF;
+ border: 1px solid #AFAFAF;
+ pointer-events: none;
+ text-shadow: none;
+ opacity: 0.5;
+}
+
+.modal__title {
+ border-bottom: 1px solid #37a8db;
+ font-size: 20px;
+ line-height: 24px;
+ height: 30px;
+ font-family: 'open_sanslight', Arial, serif;
+ margin-bottom: 15px;
+}
+
+.modal__title--warning {
+ border-bottom: none;
+ color: darkred;
+}
+
+.modal__text {
+ line-height: 1.5em;
+ font-size: 1.3em;
}
\ No newline at end of file
diff --git a/main.html b/main.html
index 11f36604..0fa78fda 100755
--- a/main.html
+++ b/main.html
@@ -28,6 +28,7 @@
+
@@ -52,6 +53,7 @@
+
@@ -87,6 +89,7 @@
+
@@ -220,6 +223,7 @@
+
@@ -237,11 +241,10 @@
-
+
+
+
+
diff --git a/main.js b/main.js
index b9114559..d793ef96 100644
--- a/main.js
+++ b/main.js
@@ -148,6 +148,9 @@ $(document).ready(function () {
case 'configuration':
TABS.configuration.initialize(content_ready);
break;
+ case 'profiles':
+ TABS.profiles.initialize(content_ready);
+ break;
case 'pid_tuning':
TABS.pid_tuning.initialize(content_ready);
break;
diff --git a/tabs/configuration.js b/tabs/configuration.js
index 3a97fd00..a79555a5 100644
--- a/tabs/configuration.js
+++ b/tabs/configuration.js
@@ -1,3 +1,4 @@
+/*global chrome*/
'use strict';
TABS.configuration = {};
@@ -9,80 +10,62 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
googleAnalytics.sendAppView('Configuration');
}
- function load_config() {
- MSP.send_message(MSPCodes.MSP_BF_CONFIG, false, false, load_misc);
- }
+ var loadChainer = new MSPChainerClass();
- function load_misc() {
- MSP.send_message(MSPCodes.MSP_MISC, false, false, load_arming_config);
- }
+ loadChainer.setChain([
+ mspHelper.loadMspIdent,
+ mspHelper.loadBfConfig,
+ mspHelper.loadMisc,
+ mspHelper.loadArmingConfig,
+ mspHelper.loadLoopTime,
+ mspHelper.loadRxConfig,
+ mspHelper.load3dConfig,
+ mspHelper.loadSensorAlignment,
+ mspHelper.loadAdvancedConfig,
+ mspHelper.loadINAVPidConfig,
+ mspHelper.loadSensorConfig,
+ mspHelper.loadAccTrim
+ ]);
+ loadChainer.setExitPoint(load_html);
+ loadChainer.execute();
- function load_arming_config() {
- MSP.send_message(MSPCodes.MSP_ARMING_CONFIG, false, false, load_loop_time);
- }
+ var saveChainer = new MSPChainerClass();
- function load_loop_time() {
- MSP.send_message(MSPCodes.MSP_LOOP_TIME, false, false, load_rx_config);
- }
+ saveChainer.setChain([
+ mspHelper.saveBfConfig,
+ mspHelper.saveMisc,
+ mspHelper.save3dConfig,
+ mspHelper.saveSensorAlignment,
+ mspHelper.saveAccTrim,
+ mspHelper.saveArmingConfig,
+ mspHelper.saveLooptimeConfig,
+ mspHelper.saveRxConfig,
+ mspHelper.saveAdvancedConfig,
+ mspHelper.saveINAVPidConfig,
+ mspHelper.saveSensorConfig,
+ mspHelper.saveToEeprom
+ ]);
+ saveChainer.setExitPoint(reboot);
- function load_rx_config() {
- var next_callback = load_3d;
- if (semver.gte(CONFIG.apiVersion, "1.21.0")) {
- MSP.send_message(MSPCodes.MSP_RX_CONFIG, false, false, next_callback);
- } else {
- next_callback();
- }
- }
+ function reboot() {
+ //noinspection JSUnresolvedVariable
+ GUI.log(chrome.i18n.getMessage('configurationEepromSaved'));
- function load_3d() {
- MSP.send_message(MSPCodes.MSP_3D, false, false, load_sensor_alignment);
- }
-
- function load_sensor_alignment() {
- MSP.send_message(MSPCodes.MSP_SENSOR_ALIGNMENT, false, false, loadAdvancedConfig);
- }
-
- function loadAdvancedConfig() {
- var next_callback = loadINAVPidConfig;
- if (semver.gte(CONFIG.flightControllerVersion, "1.3.0")) {
- MSP.send_message(MSPCodes.MSP_ADVANCED_CONFIG, false, false, next_callback);
- } else {
- next_callback();
- }
- }
-
- function loadINAVPidConfig() {
- var next_callback = loadSensorConfig;
- if (semver.gt(CONFIG.flightControllerVersion, "1.3.0")) {
- MSP.send_message(MSPCodes.MSP_INAV_PID, false, false, next_callback);
- } else {
- next_callback();
- }
- }
-
- function loadSensorConfig() {
- var next_callback = load_html;
- if (semver.gte(CONFIG.flightControllerVersion, "1.5.0")) {
- MSP.send_message(MSPCodes.MSP_SENSOR_CONFIG, false, false, next_callback);
- } else {
- next_callback();
- }
- }
-
- //Update Analog/Battery Data
- function load_analog() {
- MSP.send_message(MSPCodes.MSP_ANALOG, false, false, function () {
- $('#batteryvoltage').val([ANALOG.voltage.toFixed(1)]);
- $('#batterycurrent').val([ANALOG.amperage.toFixed(2)]);
+ 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_configuration a'));
+ }
+
function load_html() {
$('#content').load("./tabs/configuration.html", process_html);
}
- MSP.send_message(MSPCodes.MSP_IDENT, false, false, load_config);
-
function process_html() {
var i;
@@ -646,86 +629,7 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
}
}
- function save_misc() {
- MSP.send_message(MSPCodes.MSP_SET_MISC, mspHelper.crunch(MSPCodes.MSP_SET_MISC), false, save_3d);
- }
-
- function save_3d() {
- MSP.send_message(MSPCodes.MSP_SET_3D, mspHelper.crunch(MSPCodes.MSP_SET_3D), false, save_sensor_alignment);
- }
-
- function save_sensor_alignment() {
- MSP.send_message(MSPCodes.MSP_SET_SENSOR_ALIGNMENT, mspHelper.crunch(MSPCodes.MSP_SET_SENSOR_ALIGNMENT), false, save_acc_trim);
- }
-
- function save_acc_trim() {
- MSP.send_message(MSPCodes.MSP_SET_ACC_TRIM, mspHelper.crunch(MSPCodes.MSP_SET_ACC_TRIM), false, save_arming_config);
- }
-
- function save_arming_config() {
- MSP.send_message(MSPCodes.MSP_SET_ARMING_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_ARMING_CONFIG), false, save_looptime_config);
- }
-
- function save_looptime_config() {
- MSP.send_message(MSPCodes.MSP_SET_LOOP_TIME, mspHelper.crunch(MSPCodes.MSP_SET_LOOP_TIME), false, save_rx_config);
- }
-
- function save_rx_config() {
- var next_callback = saveAdvancedConfig;
- if(semver.gte(CONFIG.apiVersion, "1.21.0")) {
- MSP.send_message(MSPCodes.MSP_SET_RX_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_RX_CONFIG), false, next_callback);
- } else {
- next_callback();
- }
- }
-
- function saveAdvancedConfig() {
- var next_callback = saveINAVPidConfig;
- if(semver.gte(CONFIG.flightControllerVersion, "1.3.0")) {
- MSP.send_message(MSPCodes.MSP_SET_ADVANCED_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_ADVANCED_CONFIG), false, next_callback);
- } else {
- next_callback();
- }
- }
-
- function saveINAVPidConfig() {
- var next_callback = saveSensorConfig;
- if(semver.gt(CONFIG.flightControllerVersion, "1.3.0")) {
- MSP.send_message(MSPCodes.MSP_SET_INAV_PID, mspHelper.crunch(MSPCodes.MSP_SET_INAV_PID), false, next_callback);
- } else {
- next_callback();
- }
- }
-
- function saveSensorConfig() {
- var next_callback = save_to_eeprom;
- if(semver.gte(CONFIG.flightControllerVersion, "1.5.0")) {
- MSP.send_message(MSPCodes.MSP_SET_SENSOR_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_SENSOR_CONFIG), false, next_callback);
- } else {
- next_callback();
- }
- }
-
- function save_to_eeprom() {
- MSP.send_message(MSPCodes.MSP_EEPROM_WRITE, false, false, reboot);
- }
-
- 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_configuration a'));
- }
-
- MSP.send_message(MSPCodes.MSP_SET_BF_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_BF_CONFIG), false, save_misc);
+ saveChainer.execute();
});
// status data pulled via separate timer with static speed
@@ -736,7 +640,12 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
MSP.send_message(MSPCodes.MSP_SENSOR_STATUS);
}
}, 250, true);
- GUI.interval_add('config_load_analog', load_analog, 250, true); // 4 fps
+ GUI.interval_add('config_load_analog', function () {
+ MSP.send_message(MSPCodes.MSP_ANALOG, false, false, function () {
+ $('#batteryvoltage').val([ANALOG.voltage.toFixed(1)]);
+ $('#batterycurrent').val([ANALOG.amperage.toFixed(2)]);
+ });
+ }, 250, true); // 4 fps
GUI.content_ready(callback);
}
};
diff --git a/tabs/pid_tuning.js b/tabs/pid_tuning.js
index ddf5eeef..54ed95e8 100755
--- a/tabs/pid_tuning.js
+++ b/tabs/pid_tuning.js
@@ -1,3 +1,4 @@
+/*global chrome*/
'use strict';
TABS.pid_tuning = {
@@ -5,60 +6,30 @@ TABS.pid_tuning = {
};
TABS.pid_tuning.initialize = function (callback) {
- var self = this;
+
+ var loadChainer = new MSPChainerClass();
+
+ loadChainer.setChain([
+ mspHelper.loadStatus,
+ mspHelper.loadPidNames,
+ mspHelper.loadPidData,
+ mspHelper.loadRcTuningData,
+ mspHelper.loadINAVPidConfig,
+ mspHelper.loadPidAdvanced,
+ mspHelper.loadFilterConfig
+ ]);
+ loadChainer.setExitPoint(load_html);
+ loadChainer.execute();
if (GUI.active_tab != 'pid_tuning') {
GUI.active_tab = 'pid_tuning';
googleAnalytics.sendAppView('PID Tuning');
}
- function get_pid_names() {
- MSP.send_message(MSPCodes.MSP_PIDNAMES, false, false, get_pid_data);
- }
-
- function get_pid_data() {
- MSP.send_message(MSPCodes.MSP_PID, false, false, get_rc_tuning_data);
- }
-
- function get_rc_tuning_data() {
- MSP.send_message(MSPCodes.MSP_RC_TUNING, false, false, loadINAVPidConfig);
- }
-
- function loadINAVPidConfig() {
- var next_callback = loadPidAdvanced;
- if (semver.gte(CONFIG.flightControllerVersion, "1.4.0")) {
- MSP.send_message(MSPCodes.MSP_INAV_PID, false, false, next_callback);
- } else {
- next_callback();
- }
- }
-
- function loadPidAdvanced() {
- var next_callback = loadFilterConfig;
- if (semver.gte(CONFIG.flightControllerVersion, "1.4.0")) {
- MSP.send_message(MSPCodes.MSP_PID_ADVANCED, false, false, next_callback);
- } else {
- next_callback();
- }
- }
-
- function loadFilterConfig() {
- var next_callback = load_html;
- if (semver.gte(CONFIG.flightControllerVersion, "1.4.0")) {
- MSP.send_message(MSPCodes.MSP_FILTER_CONFIG, false, false, next_callback);
- } else {
- next_callback();
- }
- }
-
-
function load_html() {
$('#content').load("./tabs/pid_tuning.html", process_html);
}
- // requesting MSP_STATUS manually because it contains CONFIG.profile
- MSP.send_message(MSPCodes.MSP_STATUS, false, false, get_pid_names);
-
var sectionClasses = [
'ROLL', // 0
'PITCH', // 1
@@ -181,8 +152,6 @@ TABS.pid_tuning.initialize = function (callback) {
pid_and_rc_to_form();
- var form_e = $('#pid-tuning');
-
if (FC.isRatesInDps()) {
$('.rate-tpa--no-dps').hide();
} else {
diff --git a/tabs/profiles.css b/tabs/profiles.css
new file mode 100644
index 00000000..bda3417f
--- /dev/null
+++ b/tabs/profiles.css
@@ -0,0 +1,27 @@
+#presets-list option {
+ padding: 0.4em;
+ cursor: pointer;
+}
+
+.preset__head {
+ color: #37a8db;
+}
+
+.preset__description {
+ margin-top: 1em;
+}
+
+.preset__features {
+ margin-top: 1em;
+}
+
+.preset__feature {
+ list-style: disc;
+ color: #37a8db;
+ margin-left: 1.5em;
+}
+
+.preset__feature-text {
+ color: #000000;
+ margin-left: -0.5em;
+}
\ No newline at end of file
diff --git a/tabs/profiles.html b/tabs/profiles.html
new file mode 100644
index 00000000..b0866e42
--- /dev/null
+++ b/tabs/profiles.html
@@ -0,0 +1,52 @@
+
\ No newline at end of file
diff --git a/tabs/profiles.js b/tabs/profiles.js
new file mode 100644
index 00000000..e9cba633
--- /dev/null
+++ b/tabs/profiles.js
@@ -0,0 +1,384 @@
+'use strict';
+
+var presets = presets || {};
+
+presets.elementHelper = function (group, field, value) {
+ return {
+ group: group,
+ field: field,
+ value: value
+ }
+};
+
+presets.defaultValues = {
+ PIDs: [
+ [40, 30, 23],
+ [40, 30, 23],
+ [85, 45, 0],
+ [50, 0, 0],
+ [65, 120, 10],
+ [180, 15, 100],
+ [10, 5, 8],
+ [20, 15, 75],
+ [60, 0, 0],
+ [100, 50, 10]
+ ],
+ INAV_PID_CONFIG: {"asynchronousMode": "0", "accelerometerTaskFrequency": 500, "attitudeTaskFrequency": 250, "magHoldRateLimit": 90, "magHoldErrorLpfFrequency": 2, "yawJumpPreventionLimit": 200, "gyroscopeLpf": "3", "accSoftLpfHz": 15},
+ ADVANCED_CONFIG: {"gyroSyncDenominator": 2, "pidProcessDenom": 1, "useUnsyncedPwm": 1, "motorPwmProtocol": 0, "motorPwmRate": 400, "servoPwmRate": 50, "gyroSync": 0},
+ RC_tuning: {"RC_RATE": 0, "RC_EXPO": 0, "roll_pitch_rate": 0, "roll_rate": 0, "pitch_rate": 0, "yaw_rate": 0, "dynamic_THR_PID": 0, "throttle_MID": 0, "throttle_EXPO": 0, "dynamic_THR_breakpoint": 0, "RC_YAW_EXPO": 0},
+ PID_ADVANCED: {"rollPitchItermIgnoreRate": 200, "yawItermIgnoreRate": 50, "yawPLimit": 300, "axisAccelerationLimitRollPitch": 0, "axisAccelerationLimitYaw": 1000},
+ FILTER_CONFIG: {"gyroSoftLpfHz": 60, "dtermLpfHz": 40, "yawLpfHz": 30, "gyroNotchHz1": 0, "gyroNotchCutoff1": 0, "dtermNotchHz": 0, "dtermNotchCutoff": 0, "gyroNotchHz2": 0, "gyroNotchCutoff2": 0},
+ FC_CONFIG: {"loopTime": 2000}
+};
+
+/*
+ * When defining a preset, following fields are required:
+ *
+ * BF_CONFIG::mixerConfiguration
+ *
+ */
+presets.presets = [
+ {
+ name: 'Default Preset',
+ description: "INAV default Quad X configuration",
+ features: [],
+ applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG"],
+ settings: [
+ presets.elementHelper("BF_CONFIG", "mixerConfiguration", 3)
+ ]
+ },
+ {
+ name: '5" Racer',
+ description: "210-250 class racer with F3/F4 CPU on 4S battery",
+ features: [
+ "4S battery",
+ "2000KV - 2600KV motors",
+ "5 inch propellers",
+ "400g-650g weight",
+ "F3 or F4 CPU",
+ "MPU6000 or MPU6050 gyro",
+ "No GPS capabilities"
+ ],
+ applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG"],
+ settings: [
+ presets.elementHelper("BF_CONFIG", "mixerConfiguration", 3),
+ presets.elementHelper("INAV_PID_CONFIG", "asynchronousMode", 2),
+ presets.elementHelper("FC_CONFIG", "loopTime", 1000),
+ presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 0),
+ presets.elementHelper("INAV_PID_CONFIG", "attitudeTaskFrequency", 100),
+ presets.elementHelper("ADVANCED_CONFIG", "gyroSync", 1),
+ presets.elementHelper("ADVANCED_CONFIG", "gyroSyncDenominator", 4),
+ presets.elementHelper("ADVANCED_CONFIG", "motorPwmProtocol", 1),
+ presets.elementHelper("ADVANCED_CONFIG", "motorPwmRate", 2000),
+ presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 90),
+ presets.elementHelper("FILTER_CONFIG", "dtermLpfHz", 80),
+ presets.elementHelper("RC_tuning", "roll_rate", 800),
+ presets.elementHelper("RC_tuning", "pitch_rate", 800),
+ presets.elementHelper("RC_tuning", "yaw_rate", 650),
+ presets.elementHelper("FILTER_CONFIG", "dtermNotchHz", 260),
+ presets.elementHelper("FILTER_CONFIG", "dtermNotchCutoff", 160),
+ presets.elementHelper("FILTER_CONFIG", "gyroNotchHz1", 400),
+ presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff1", 300),
+ presets.elementHelper("FILTER_CONFIG", "gyroNotchHz2", 200),
+ presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff2", 100),
+ presets.elementHelper("PIDs", 0, [43, 40, 20]), //ROLL PIDs
+ presets.elementHelper("PIDs", 1, [58, 50, 22]), //PITCH PIDs
+ presets.elementHelper("PIDs", 2, [70, 45, 0]) //YAW PIDs
+ ]
+ },
+ {
+ name: '10" General Purpose',
+ description: "450-600 class general purpose multirotor",
+ features: [
+ "10 inch propellers",
+ "0.kg - 1.4kg weight",
+ "F1, F3 or F4 CPU",
+ "MPU6000 or MPU6050 gyro",
+ "GPS optional"
+ ],
+ applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG"],
+ settings: [
+ presets.elementHelper("BF_CONFIG", "mixerConfiguration", 3),
+ presets.elementHelper("INAV_PID_CONFIG", "asynchronousMode", 1),
+ presets.elementHelper("FC_CONFIG", "loopTime", 2000),
+ presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 1),
+ presets.elementHelper("ADVANCED_CONFIG", "gyroSync", 1),
+ presets.elementHelper("ADVANCED_CONFIG", "gyroSyncDenominator", 1),
+ presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 70),
+ presets.elementHelper("FILTER_CONFIG", "dtermLpfHz", 40),
+ presets.elementHelper("RC_tuning", "roll_rate", 400),
+ presets.elementHelper("RC_tuning", "pitch_rate", 400),
+ presets.elementHelper("RC_tuning", "yaw_rate", 200),
+ presets.elementHelper("FILTER_CONFIG", "dtermNotchHz", 125),
+ presets.elementHelper("FILTER_CONFIG", "dtermNotchCutoff", 90),
+ presets.elementHelper("FILTER_CONFIG", "gyroNotchHz1", 170),
+ presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff1", 125),
+ presets.elementHelper("FILTER_CONFIG", "gyroNotchHz2", 85),
+ presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff2", 43),
+ presets.elementHelper("INAV_PID_CONFIG", "magHoldRateLimit", 30),
+ presets.elementHelper("PID_ADVANCED", "axisAccelerationLimitRollPitch", 40),
+ presets.elementHelper("PID_ADVANCED", "axisAccelerationLimitYaw", 18),
+ presets.elementHelper("PIDs", 0, [75, 30, 18]), //ROLL PIDs
+ presets.elementHelper("PIDs", 1, [75, 30, 18]), //PITCH PIDs
+ presets.elementHelper("PIDs", 2, [85, 45, 0]) //YAW PIDs
+ ]
+ },
+ {
+ name: '12" General Purpose',
+ description: "550 and above general purpose multirotor",
+ features: [
+ "12 inch propellers",
+ "1.4kg-2kg weight",
+ "F3 or F4 CPU",
+ "MPU6000 or MPU6050 gyro",
+ "GPS optional"
+ ],
+ applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG"],
+ settings: [
+ presets.elementHelper("BF_CONFIG", "mixerConfiguration", 3),
+ presets.elementHelper("INAV_PID_CONFIG", "asynchronousMode", 1),
+ presets.elementHelper("FC_CONFIG", "loopTime", 2000),
+ presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 1),
+ presets.elementHelper("ADVANCED_CONFIG", "gyroSync", 1),
+ presets.elementHelper("ADVANCED_CONFIG", "gyroSyncDenominator", 1),
+ presets.elementHelper("FILTER_CONFIG", "gyroSoftLpfHz", 55),
+ presets.elementHelper("FILTER_CONFIG", "dtermLpfHz", 30),
+ presets.elementHelper("RC_tuning", "roll_rate", 180),
+ presets.elementHelper("RC_tuning", "pitch_rate", 180),
+ presets.elementHelper("RC_tuning", "yaw_rate", 90),
+ presets.elementHelper("FILTER_CONFIG", "dtermNotchHz", 108),
+ presets.elementHelper("FILTER_CONFIG", "dtermNotchCutoff", 72),
+ presets.elementHelper("FILTER_CONFIG", "gyroNotchHz1", 144),
+ presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff1", 90),
+ presets.elementHelper("FILTER_CONFIG", "gyroNotchHz2", 72),
+ presets.elementHelper("FILTER_CONFIG", "gyroNotchCutoff2", 43),
+ presets.elementHelper("INAV_PID_CONFIG", "magHoldRateLimit", 30),
+ presets.elementHelper("PID_ADVANCED", "axisAccelerationLimitRollPitch", 18),
+ presets.elementHelper("PID_ADVANCED", "axisAccelerationLimitYaw", 9),
+ presets.elementHelper("PIDs", 0, [80, 30, 18]), //ROLL PIDs
+ presets.elementHelper("PIDs", 1, [80, 30, 18]), //PITCH PIDs
+ presets.elementHelper("PIDs", 2, [85, 45, 0]), //YAW PIDs
+ presets.elementHelper("PIDs", 7, [10, 7, 75]) //Level PIDs
+ ]
+ },
+ {
+ name: "Airplane General",
+ description: "General setup for airplanes",
+ features: [
+ ],
+ applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG"],
+ settings: [
+ presets.elementHelper("BF_CONFIG", "mixerConfiguration", 14),
+ presets.elementHelper("PIDs", 0, [20, 30, 15]), //ROLL PIDs
+ presets.elementHelper("PIDs", 1, [20, 30, 15]), //PITCH PIDs
+ presets.elementHelper("PIDs", 2, [45, 5, 15]), //YAW PIDs
+ presets.elementHelper("RC_tuning", "roll_rate", 200),
+ presets.elementHelper("RC_tuning", "pitch_rate", 150),
+ presets.elementHelper("RC_tuning", "yaw_rate", 90),
+ presets.elementHelper("ADVANCED_CONFIG", "gyroSync", 1),
+ presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 1)
+ ]
+ },
+ {
+ name: "600mm Flying Wing",
+ description: "Small flying wing on multirotor racer parts",
+ features: [
+ "3S-4S battery",
+ "300g-500g weight"
+ ],
+ applyDefaults: ["PIDs", "INAV_PID_CONFIG", "ADVANCED_CONFIG", "RC_tuning", "PID_ADVANCED", "FILTER_CONFIG", "FC_CONFIG"],
+ settings: [
+ presets.elementHelper("BF_CONFIG", "mixerConfiguration", 8),
+ presets.elementHelper("PIDs", 0, [15, 30, 15]), //ROLL PIDs
+ presets.elementHelper("PIDs", 1, [15, 40, 15]), //PITCH PIDs
+ presets.elementHelper("RC_tuning", "roll_rate", 400),
+ presets.elementHelper("RC_tuning", "pitch_rate", 150),
+ presets.elementHelper("ADVANCED_CONFIG", "gyroSync", 1),
+ presets.elementHelper("INAV_PID_CONFIG", "gyroscopeLpf", 1)
+ ]
+ }
+];
+
+presets.model = (function () {
+
+ var self = {};
+
+ /**
+ * @param {Array} toApply
+ * @param {Object} defaults
+ */
+ self.applyDefaults = function (toApply, defaults) {
+
+ for (var settingToApply in toApply) {
+ if (toApply.hasOwnProperty(settingToApply)) {
+
+ var settingName = toApply[settingToApply],
+ values = defaults[settingName];
+
+ for (var key in values) {
+ if (values.hasOwnProperty(key)) {
+ window[settingName][key] = values[key];
+ }
+ }
+
+ }
+ }
+ };
+
+ self.extractPresetNames = function(presets) {
+
+ var retVal = {};
+
+ for (var i in presets) {
+ if (presets.hasOwnProperty(i)) {
+ retVal[i] = presets[i].name;
+ }
+ }
+
+ return retVal;
+ };
+
+ return self;
+})();
+
+TABS.profiles = {};
+
+TABS.profiles.initialize = function (callback, scrollPosition) {
+
+ var currentPreset,
+ currentPresetId,
+ loadChainer = new MSPChainerClass(),
+ saveChainer = new MSPChainerClass();
+
+ if (GUI.active_tab != 'profiles') {
+ GUI.active_tab = 'profiles';
+ googleAnalytics.sendAppView('Presets');
+ }
+
+ loadChainer.setChain([
+ mspHelper.loadMspIdent,
+ mspHelper.loadBfConfig,
+ mspHelper.loadLoopTime,
+ mspHelper.loadINAVPidConfig,
+ mspHelper.loadAdvancedConfig,
+ mspHelper.loadFilterConfig,
+ mspHelper.loadPidAdvanced,
+ mspHelper.loadRcTuningData,
+ mspHelper.loadPidData
+ ]);
+ loadChainer.setExitPoint(loadHtml);
+ loadChainer.execute();
+
+ saveChainer.setChain([
+ mspHelper.saveINAVPidConfig,
+ mspHelper.saveLooptimeConfig,
+ mspHelper.saveAdvancedConfig,
+ mspHelper.saveFilterConfig,
+ mspHelper.savePidData,
+ mspHelper.saveRcTuningData,
+ mspHelper.savePidAdvanced,
+ mspHelper.saveBfConfig,
+ mspHelper.saveToEeprom
+ ]);
+ saveChainer.setExitPoint(reboot);
+
+ function loadHtml() {
+ $('#content').load("./tabs/profiles.html", processHtml);
+ }
+
+ 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_setup a'));
+ }
+
+ function applyAndSave() {
+
+ presets.model.applyDefaults(currentPreset.applyDefaults, presets.defaultValues);
+
+ var setting;
+
+ //Iterate over settings saved in preset
+ for (var i in currentPreset.settings) {
+ if (currentPreset.settings.hasOwnProperty(i)) {
+ setting = currentPreset.settings[i];
+ //Apply setting
+ window[setting.group][setting.field] = setting.value;
+ }
+ }
+
+ saveChainer.execute();
+ }
+
+ function fillPresetDescription(preset) {
+
+ var $features = $('#preset-features');
+
+ $('#preset-name').html(preset.name);
+ $('#preset-description').html(preset.description);
+
+ $features.find('*').remove();
+
+ for (var i in preset.features) {
+ if (preset.features.hasOwnProperty(i)) {
+ $features.append('' + preset.features[i] + "");
+ }
+ }
+
+ }
+
+ function processHtml() {
+
+ var $presetList = $('#presets-list');
+
+ GUI.fillSelect($presetList, presets.model.extractPresetNames(presets.presets));
+
+ $presetList.change(function () {
+ currentPresetId = $presetList.val();
+ currentPreset = presets.presets[currentPresetId];
+ fillPresetDescription(currentPreset);
+ $('#save-button').removeClass('disabled');
+ });
+
+ $('#execute-button').click(function () {
+ applyAndSave();
+ OSD.GUI.jbox.close();
+ });
+
+ localize();
+
+ //noinspection JSValidateTypes
+ $('#content').scrollTop((scrollPosition) ? scrollPosition : 0);
+
+ OSD.GUI.jbox = new jBox('Modal', {
+ width: 600,
+ height: 240,
+ closeButton: 'title',
+ animation: false,
+ attach: $('#save-button'),
+ title: chrome.i18n.getMessage("presetApplyTitle"),
+ content: $('#presetApplyContent')
+ });
+
+ GUI.interval_add('status_pull', function status_pull() {
+ MSP.send_message(MSPCodes.MSP_STATUS);
+
+ if (semver.gte(CONFIG.flightControllerVersion, "1.5.0")) {
+ MSP.send_message(MSPCodes.MSP_SENSOR_STATUS);
+ }
+ }, 250, true);
+ GUI.content_ready(callback);
+ }
+};
+
+TABS.profiles.cleanup = function (callback) {
+ if (callback) callback();
+};
diff --git a/tabs/receiver.js b/tabs/receiver.js
index a7a8ce42..86680c8b 100644
--- a/tabs/receiver.js
+++ b/tabs/receiver.js
@@ -1,3 +1,5 @@
+/*global chrome*/
+
'use strict';
TABS.receiver = {
@@ -12,38 +14,23 @@ TABS.receiver.initialize = function (callback) {
googleAnalytics.sendAppView('Receiver');
}
- function get_misc_data() {
- MSP.send_message(MSPCodes.MSP_MISC, false, false, get_rc_data);
- }
+ var loadChainer = new MSPChainerClass();
- function get_rc_data() {
- MSP.send_message(MSPCodes.MSP_RC, false, false, get_rc_map);
- }
-
- function get_rc_map() {
- MSP.send_message(MSPCodes.MSP_RX_MAP, false, false, load_config);
- }
-
- // Fetch features so we can check if RX_MSP is enabled:
- function load_config() {
- MSP.send_message(MSPCodes.MSP_BF_CONFIG, false, false, load_rc_configs);
- }
-
- function load_rc_configs() {
- var next_callback = load_html;
- if (semver.gte(CONFIG.apiVersion, "1.15.0")) {
- MSP.send_message(MSPCodes.MSP_RC_DEADBAND, false, false, next_callback);
- } else {
- next_callback();
- }
- }
+ loadChainer.setChain([
+ mspHelper.loadRcTuningData,
+ mspHelper.loadMisc,
+ mspHelper.loadRcData,
+ mspHelper.loadRcMap,
+ mspHelper.loadBfConfig,
+ mspHelper.loadRcDeadband
+ ]);
+ loadChainer.setExitPoint(load_html);
+ loadChainer.execute();
function load_html() {
$('#content').load("./tabs/receiver.html", process_html);
}
- MSP.send_message(MSPCodes.MSP_RC_TUNING, false, false, get_misc_data);
-
function process_html() {
// translate to user-selected language
localize();
diff --git a/tabs/setup.js b/tabs/setup.js
index 9e1eaa06..6f4c2fe7 100755
--- a/tabs/setup.js
+++ b/tabs/setup.js
@@ -1,3 +1,4 @@
+/*global chrome*/
'use strict';
TABS.setup = {
@@ -12,24 +13,21 @@ TABS.setup.initialize = function (callback) {
googleAnalytics.sendAppView('Setup');
}
- function load_ident() {
- MSP.send_message(MSPCodes.MSP_IDENT, false, false, load_config);
- }
+ var loadChainer = new MSPChainerClass();
- function load_config() {
- MSP.send_message(MSPCodes.MSP_BF_CONFIG, false, false, load_misc_data);
- }
-
- function load_misc_data() {
- MSP.send_message(MSPCodes.MSP_MISC, false, false, load_html);
- }
+ loadChainer.setChain([
+ mspHelper.loadStatus,
+ mspHelper.loadMspIdent,
+ mspHelper.loadBfConfig,
+ mspHelper.loadMisc
+ ]);
+ loadChainer.setExitPoint(load_html);
+ loadChainer.execute();
function load_html() {
$('#content').load("./tabs/setup.html", process_html);
}
- MSP.send_message(MSPCodes.MSP_STATUS, false, false, load_ident);
-
function process_html() {
// translate to user-selected language
localize();
@@ -246,9 +244,19 @@ TABS.setup.initializeInstruments = function() {
};
};
-TABS.setup.initialize3D = function (compatibility) {
+TABS.setup.initialize3D = function () {
var self = this,
- loader, canvas, wrapper, renderer, camera, scene, light, light2, modelWrapper, model, model_file,
+ loader,
+ canvas,
+ wrapper,
+ renderer,
+ camera,
+ scene,
+ light,
+ light2,
+ modelWrapper,
+ model,
+ model_file,
useWebGlRenderer = false;
canvas = $('.model-and-info #canvas');
@@ -269,7 +277,7 @@ TABS.setup.initialize3D = function (compatibility) {
// // modelWrapper adds an extra axis of rotation to avoid gimbal lock with the euler angles
- modelWrapper = new THREE.Object3D()
+ modelWrapper = new THREE.Object3D();
//
// load the model including materials
if (useWebGlRenderer) {
@@ -279,10 +287,8 @@ TABS.setup.initialize3D = function (compatibility) {
}
// Temporary workaround for 'custom' model until akfreak's custom model is merged.
- var useLegacyCustomModel = false;
if (model_file == 'custom') {
model_file = 'fallback';
- useLegacyCustomModel = true;
}
// setup scene