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 @@
- -
+
@@ -14,15 +13,6 @@
CH4
-
-
- - - - - -
-
@@ -30,4 +20,7 @@
+ +
+
\ 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 + '\ - \ - \ - \ - \ - '); - - 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(''); - } - - // 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(''); } + // 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);