diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index cf9456fe..4db47410 100755
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -805,15 +805,13 @@
},
- "servosModel": {
- "message": "Model:"
+ "servosFirmwareUpgradeRequired": {
+ "message": "Servos requires firmware >= 1.10.0."
},
+
"servosChangeDirection": {
"message": "Change Direction in TX To Match"
},
- "servosGyroAccelDirection": {
- "message": "Gyroscope / Accelerometer Direction"
- },
"servosName": {
"message": "Name"
},
@@ -826,8 +824,8 @@
"servosMax": {
"message": "MAX"
},
- "servosDirection": {
- "message": "Direction"
+ "servosDirectionAndRate": {
+ "message": "Direction and rate"
},
"servosLiveMode": {
"message": "Enable Live mode:"
@@ -835,9 +833,6 @@
"servosButtonSave": {
"message": "Save"
},
- "servosModelNoSupport": {
- "message": "This model doesn't support servos"
- },
"servosNormal": {
"message": "Normal"
},
diff --git a/js/backup_restore.js b/js/backup_restore.js
index ddd6e9ac..52029243 100644
--- a/js/backup_restore.js
+++ b/js/backup_restore.js
@@ -448,13 +448,20 @@ function configuration_restore(callback) {
configuration.profiles[profileIndex].ServoConfig.pop();
}
}
+
for (var i = 0; i < configuration.profiles[profileIndex].ServoConfig.length; i++) {
var servoConfig = profiles[profileIndex].ServoConfig;
+
servoConfig[i].angleAtMin = 90;
servoConfig[i].angleAtMax = 90;
servoConfig[i].reversedInputSources = 0;
+
+ // set the rate to 0 if an invalid value is detected.
+ if (servoConfig[i].rate < -100 || servoConfig[i].rate > 100) {
+ servoConfig[i].rate = 0;
+ }
}
-
+
configuration.profiles[profileIndex].ServoRules = [];
}
diff --git a/js/msp.js b/js/msp.js
index f325b6de..49676381 100644
--- a/js/msp.js
+++ b/js/msp.js
@@ -477,7 +477,11 @@ var MSP = {
'min': data.getInt16(i + 0, 1),
'max': data.getInt16(i + 2, 1),
'middle': data.getInt16(i + 4, 1),
- 'rate': data.getInt8(i + 6)
+ 'rate': data.getInt8(i + 6),
+ 'angleAtMin': 90,
+ 'angleAtMax': 90,
+ 'indexOfChannelToForward': undefined,
+ 'reversedInputSources': 0
};
SERVO_CONFIG.push(arr);
diff --git a/tabs/ports.css b/tabs/ports.css
index e29583ab..cca6c065 100644
--- a/tabs/ports.css
+++ b/tabs/ports.css
@@ -71,13 +71,13 @@
border: 1px dashed silver;
margin-bottom: 8px;
}
-.require-support {
+.tab-ports .require-support {
display:none;
}
.tab-ports.supported .require-support {
display:block;
}
-.require-upgrade {
+.tab-ports .require-upgrade {
display:block;
}
.tab-ports.supported .require-upgrade {
diff --git a/tabs/servos.css b/tabs/servos.css
index d1ddefa0..319047f0 100644
--- a/tabs/servos.css
+++ b/tabs/servos.css
@@ -3,10 +3,6 @@
.tab-servos input[type="number"]::-webkit-inner-spin-button {
border: 0;
}
-.tab-servos .supported_wrapper,
-.tab-servos .direction_wrapper {
- display: none;
-}
.tab-servos .title {
margin-top: 10px;
@@ -129,4 +125,17 @@
}
.tab-servos .update:hover {
background-color: #dedcdc;
-}
\ No newline at end of file
+}
+
+.tab-servos .require-support {
+ display:none;
+}
+.tab-servos.supported .require-support {
+ display:block;
+}
+.tab-servos .require-upgrade {
+ display:block;
+}
+.tab-servos.supported .require-upgrade {
+ display:none;
+}
diff --git a/tabs/servos.html b/tabs/servos.html
index fd53aa04..00e9218f 100644
--- a/tabs/servos.html
+++ b/tabs/servos.html
@@ -1,6 +1,5 @@
\ No newline at end of file
diff --git a/tabs/servos.js b/tabs/servos.js
index d8d3b930..2ed1f188 100644
--- a/tabs/servos.js
+++ b/tabs/servos.js
@@ -1,9 +1,3 @@
-/* Please don't take code in this file very seriously !!!
-
- I was "kinda" forced to write this implementation "this way" because the Servo code implementation
- from multiwii is so horrible, obstructive and non dynamic, not to mention it doesn't make any sense
- that there was just no other way around this then hardcoding/implementing each model separately.
-*/
'use strict';
TABS.servos = {};
@@ -46,9 +40,17 @@ TABS.servos.initialize = function (callback) {
}
MSP.send_message(MSP_codes.MSP_IDENT, false, false, get_servo_configurations);
-
- function process_html() {
-
+
+ function update_ui() {
+
+ if (semver.lt(CONFIG.apiVersion, "1.12.0")) {
+
+ $(".tab-servos").removeClass("supported");
+ return;
+ }
+
+ $(".tab-servos").addClass("supported");
+
var servoCheckbox = '';
var servoHeader = '';
for (var i = 0; i < RC.active_channels-4; i++) {
@@ -56,47 +58,19 @@ TABS.servos.initialize = function (callback) {
A' + (i+1) + ' \
';
}
- servoHeader = servoHeader + ' ';
+ servoHeader = servoHeader + ' ';
for (var i = 0; i < RC.active_channels; i++) {
servoCheckbox = servoCheckbox + '\
\
';
}
-
-
$('div.tab-servos table.fields tr.main').append(servoHeader);
- function process_directions(name, obj, bitpos) {
- $('div.direction_wrapper').show();
-
- var val;
-
- $('div.tab-servos table.directions').append('\
- \
- ' + name + ' \
- \
- \
- ' + chrome.i18n.getMessage('servosNormal') + ' \
- ' + chrome.i18n.getMessage('servosReverse') + ' \
- \
- \
- \
- ');
-
- if (bit_check(SERVO_CONFIG[obj].rate, bitpos)) val = 1;
- else val = 0;
-
- $('div.tab-servos table.directions tr:last select').val(val);
- $('div.tab-servos table.directions tr:last select').data('info', {'obj': obj, 'bitpos': bitpos});
- }
-
- function process_servos(name, alternate, obj, directions) {
+ function process_servos(name, alternate, obj) {
$('div.supported_wrapper').show();
-
-
$('div.tab-servos table.fields').append('\
\
@@ -106,46 +80,28 @@ TABS.servos.initialize = function (callback) {
\
' + servoCheckbox + '\
\
- ' + name + ' \
- ' + alternate + ' \
\
\
');
-
-
- // translate to user-selected language
- localize();
-
if (SERVO_CONFIG[obj].indexOfChannelToForward >= 0) {
$('div.tab-servos table.fields tr:last td.channel input').eq(SERVO_CONFIG[obj].indexOfChannelToForward).prop('checked', true);
}
- if (directions == true) {
- $('div.tab-servos table.fields tr:last td.direction input:first').prop('checked', bit_check(SERVO_CONFIG[obj].rate, 0));
- $('div.tab-servos table.fields tr:last td.direction input:last').prop('checked', bit_check(SERVO_CONFIG[obj].rate, 1));
- } else if (directions == 2) {
- // removing checkboxes
- $('div.tab-servos table.fields tr:last td.direction').html('');
+ // adding select box and generating options
+ $('div.tab-servos table.fields tr:last td.direction').append('\
+ \
+ ');
- // adding select box and generating options
- $('div.tab-servos table.fields tr:last td.direction').append('\
- \
- ');
+ var select = $('div.tab-servos table.fields tr:last td.direction select');
- var select = $('div.tab-servos table.fields tr:last td.direction select');
-
- for (var i = 100; i > -101; i--) {
- select.append('Rate: ' + i + '% ');
- }
-
- // select current rate
- select.val(SERVO_CONFIG[obj].rate);
- } else {
- // removing checkboxes
- $('div.tab-servos table.fields tr:last td.direction').html('');
+ for (var i = 100; i > -101; i--) {
+ select.append('Rate: ' + i + '% ');
}
+ // select current rate
+ select.val(SERVO_CONFIG[obj].rate);
+
$('div.tab-servos table.fields tr:last').data('info', {'obj': obj});
// UI hooks
@@ -159,17 +115,6 @@ TABS.servos.initialize = function (callback) {
}
function servos_update(save_configuration_to_eeprom) {
- // update bitfields
- $('div.tab-servos table.directions tr:not(".main")').each(function () {
- var info = $('select', this).data('info');
- var val = parseInt($('select', this).val());
-
- // in this stage we need to know which bitfield and which bitposition needs to be flipped
- if (val) SERVO_CONFIG[info.obj].rate = bit_set(SERVO_CONFIG[info.obj].rate, info.bitpos);
- else SERVO_CONFIG[info.obj].rate = bit_clear(SERVO_CONFIG[info.obj].rate, info.bitpos);
- });
-
- // update the rest
$('div.tab-servos table.fields tr:not(".main")').each(function () {
var info = $(this).data('info');
@@ -187,17 +132,8 @@ TABS.servos.initialize = function (callback) {
SERVO_CONFIG[info.obj].min = parseInt($('.min input', this).val());
SERVO_CONFIG[info.obj].max = parseInt($('.max input', this).val());
- // update rate if direction fields exist
- if ($('.direction input', this).length) {
- if ($('.direction input:first', this).is(':checked')) SERVO_CONFIG[info.obj].rate = bit_set(SERVO_CONFIG[info.obj].rate, 0);
- else SERVO_CONFIG[info.obj].rate = bit_clear(SERVO_CONFIG[info.obj].rate, 0);
-
- if ($('.direction input:last', this).is(':checked')) SERVO_CONFIG[info.obj].rate = bit_set(SERVO_CONFIG[info.obj].rate, 1);
- else SERVO_CONFIG[info.obj].rate = bit_clear(SERVO_CONFIG[info.obj].rate, 1);
- } else if ($('.direction select', this).length) {
- var val = parseInt($('.direction select', this).val());
- SERVO_CONFIG[info.obj].rate = val;
- }
+ var val = parseInt($('.direction select', this).val());
+ SERVO_CONFIG[info.obj].rate = val;
});
//
@@ -217,113 +153,15 @@ TABS.servos.initialize = function (callback) {
}
}
- /*
- MSP.send_message(MSP_codes.MSP_SET_CHANNEL_FORWARDING, MSP.crunch(MSP_codes.MSP_SET_CHANNEL_FORWARDING), false, function () {
- MSP.send_message(MSP_codes.MSP_SET_SERVO_CONF, MSP.crunch(MSP_codes.MSP_SET_SERVO_CONF), false, function () {
- if (save_configuration_to_eeprom) {
- // Save changes to EEPROM
- MSP.send_message(MSP_codes.MSP_EEPROM_WRITE, false, false, function () {
- GUI.log(chrome.i18n.getMessage('servosEepromSave'));
- });
- }
- });
- });
- */
-
}
// drop previous table
$('div.tab-servos table.fields tr:not(:first)').remove();
- var model = $('div.tab-servos strong.model');
- var supported_models = [1, 4, 5, 8, 14, 20, 21, 24, 25];
-
- switch (CONFIG.multiType) {
- case 1: // TRI
- case 25: // CUSTOM_TRI
- // looking ok so far
- model.text('TRI');
-
- process_directions('YAW', 5, 0);
-
- process_servos('Yaw Servo', '', 5, false);
- break;
- case 4: // BI
- // looking ok so far
- model.text('BI');
-
- process_directions('L YAW', 4, 1);
- process_directions('R YAW', 5, 1);
- process_directions('L NICK', 4, 0);
- process_directions('R NICK', 5, 0);
-
- process_servos('Left Servo', '', 4, false);
- process_servos('Right Servo', '', 5, false);
- break;
- case 5: // Gimbal
- // needs to be verified
- model.text('Gimbal');
-
- // rate
- process_servos('Pitch Servo', '', 0, 2);
- process_servos('Roll Servo', '', 1, 2);
- break;
- case 8: // Flying Wing
- // looking ok so far
- model.text('Flying Wing');
-
- process_directions('L ROLL', 3, 1);
- process_directions('R ROLL', 4, 1);
- process_directions('L NICK', 3, 0);
- process_directions('R NICK', 4, 0);
-
- process_servos('Left Wing', '', 3, false);
- process_servos('Right Wing', '', 4, false);
- break;
- case 14: // Airplane
- case 24: // Custom_Airplane
- model.text('Airplane');
-
- // rate
- process_servos('Wing 1', '', 3, 2);
- process_servos('Wing 2', '', 4, 2);
- process_servos('Rudd', '', 5, 2);
- process_servos('Elev', '', 6, 2);
- break;
- case 20: // Dualcopter
- // looking ok so far
- model.text('Dualcopter');
-
- process_directions('PITCH', 4, 0);
- process_directions('ROLL', 5, 0);
-
- process_servos('Roll', '', 5, false);
- process_servos('Nick', '', 4, false);
- break;
- case 21: // Singlecopter
- // looking ok so far
- model.text('Singlecopter');
-
- process_servos('Right', 'R YAW', 3, true);
- process_servos('Left', 'L YAW', 4, true);
- process_servos('Front', 'F YAW', 5, true);
- process_servos('Rear', 'YAW', 6, true);
- break;
-
- default:
- model.text(chrome.i18n.getMessage('servosModelNoSupport'));
+ for (var servoIndex = 0; servoIndex < 8; servoIndex++) {
+ process_servos('Servo ' + servoIndex, '', servoIndex, false);
}
- // implementation of feature servo_tilt
- if (AUX_CONFIG.indexOf('CAMSTAB') > -1 || AUX_CONFIG.indexOf('CAMTRIG') > -1) {
- // Gimbal on
- // needs to be verified
-
- // rate
- process_servos('Pitch Servo', '', 0, 2);
- process_servos('Roll Servo', '', 1, 2);
- }
-
// UI hooks for dynamically generated elements
$('table.directions select, table.directions input, table.fields select, table.fields input').change(function () {
if ($('div.live input').is(':checked')) {
@@ -331,14 +169,20 @@ TABS.servos.initialize = function (callback) {
GUI.timeout_add('servos_update', servos_update, 10);
}
});
-
+
$('a.update').click(function () {
- // standard check for supported_models + custom implementation for feature servo_tilt
- if (supported_models.indexOf(CONFIG.multiType) != -1 || AUX_CONFIG.indexOf('CAMSTAB') > -1 || AUX_CONFIG.indexOf('CAMTRIG') > -1) {
- servos_update(true);
- }
+ servos_update(true);
});
+
+ }
+ function process_html() {
+
+ update_ui();
+
+ // translate to user-selected language
+ localize();
+
// status data pulled via separate timer with static speed
GUI.interval_add('status_pull', function () {
MSP.send_message(MSP_codes.MSP_STATUS);