2014-08-09 18:01:17 +00:00
|
|
|
'use strict';
|
|
|
|
|
2015-03-10 23:19:24 +00:00
|
|
|
TABS.pid_tuning = {
|
2016-06-24 09:04:18 +00:00
|
|
|
controllerChanged: false
|
2015-03-10 23:19:24 +00:00
|
|
|
};
|
|
|
|
|
2014-08-12 14:20:26 +00:00
|
|
|
TABS.pid_tuning.initialize = function (callback) {
|
2014-10-01 10:58:09 +00:00
|
|
|
var self = this;
|
2014-10-01 11:16:22 +00:00
|
|
|
if (GUI.active_tab != 'pid_tuning') {
|
|
|
|
GUI.active_tab = 'pid_tuning';
|
|
|
|
}
|
2014-03-08 05:25:15 +00:00
|
|
|
|
2016-06-24 09:07:12 +00:00
|
|
|
// requesting MSP_STATUS manually because it contains CONFIG.profile
|
|
|
|
MSP.promise(MSP_codes.MSP_STATUS).then(function() {
|
2015-01-29 17:27:50 +00:00
|
|
|
if (GUI.canChangePidController) {
|
2016-06-24 09:07:12 +00:00
|
|
|
return MSP.promise(MSP_codes.MSP_PID_CONTROLLER);
|
2015-01-29 17:27:50 +00:00
|
|
|
}
|
2016-06-24 09:07:12 +00:00
|
|
|
return true;
|
|
|
|
}).then(function() {
|
|
|
|
return MSP.promise(MSP_codes.MSP_PIDNAMES)
|
|
|
|
}).then(function() {
|
|
|
|
return MSP.promise(MSP_codes.MSP_PID);
|
|
|
|
}).then(function() {
|
|
|
|
return MSP.promise(MSP_codes.MSP_RC_TUNING);
|
|
|
|
}).then(function() {
|
2016-06-24 10:50:33 +00:00
|
|
|
return MSP.promise(MSP_codes.MSP_SPECIAL_PARAMETERS);
|
2016-06-24 09:07:12 +00:00
|
|
|
}).then(function() {
|
|
|
|
return MSP.promise(MSP_codes.MSP_ADVANCED_TUNING);
|
|
|
|
}).then(function() {
|
|
|
|
return MSP.promise(MSP_codes.MSP_FILTER_CONFIG);
|
|
|
|
}).then(function() {
|
2014-03-22 23:28:41 +00:00
|
|
|
$('#content').load("./tabs/pid_tuning.html", process_html);
|
2016-06-24 09:07:12 +00:00
|
|
|
});
|
2014-08-14 14:48:16 +00:00
|
|
|
|
2015-03-11 20:24:46 +00:00
|
|
|
function pid_and_rc_to_form() {
|
2015-03-11 20:34:02 +00:00
|
|
|
// Fill in the data from PIDs array
|
2014-03-22 23:28:41 +00:00
|
|
|
var i = 0;
|
2014-08-12 14:20:26 +00:00
|
|
|
$('.pid_tuning .ROLL input').each(function () {
|
2014-03-22 23:28:41 +00:00
|
|
|
switch (i) {
|
|
|
|
case 0:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[0][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[0][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[0][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
2014-03-08 05:25:15 +00:00
|
|
|
|
2014-03-22 23:28:41 +00:00
|
|
|
i = 0;
|
2014-08-12 14:20:26 +00:00
|
|
|
$('.pid_tuning .PITCH input').each(function () {
|
2014-03-22 23:28:41 +00:00
|
|
|
switch (i) {
|
|
|
|
case 0:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[1][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[1][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[1][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
2014-03-08 05:25:15 +00:00
|
|
|
|
2014-03-22 23:28:41 +00:00
|
|
|
i = 0;
|
2014-08-12 14:20:26 +00:00
|
|
|
$('.pid_tuning .YAW input').each(function () {
|
2014-03-22 23:28:41 +00:00
|
|
|
switch (i) {
|
|
|
|
case 0:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[2][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[2][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[2][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
2013-04-08 23:09:11 +00:00
|
|
|
|
2014-03-22 23:28:41 +00:00
|
|
|
i = 0;
|
2014-08-12 14:20:26 +00:00
|
|
|
$('.pid_tuning .ALT input').each(function () {
|
2014-03-22 23:28:41 +00:00
|
|
|
switch (i) {
|
|
|
|
case 0:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[3][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[3][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[3][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
2013-04-08 23:09:11 +00:00
|
|
|
|
2014-03-22 23:28:41 +00:00
|
|
|
i = 0;
|
2014-08-12 14:20:26 +00:00
|
|
|
$('.pid_tuning .Pos input').each(function () {
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[4][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
});
|
2014-03-08 05:25:15 +00:00
|
|
|
|
2014-03-22 23:28:41 +00:00
|
|
|
i = 0;
|
2014-08-12 14:20:26 +00:00
|
|
|
$('.pid_tuning .PosR input').each(function () {
|
2014-03-22 23:28:41 +00:00
|
|
|
switch (i) {
|
|
|
|
case 0:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[5][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[5][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[5][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
2013-04-08 23:09:11 +00:00
|
|
|
|
2014-03-22 23:28:41 +00:00
|
|
|
i = 0;
|
2014-08-12 14:20:26 +00:00
|
|
|
$('.pid_tuning .NavR input').each(function () {
|
2014-03-22 23:28:41 +00:00
|
|
|
switch (i) {
|
|
|
|
case 0:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[6][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[6][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[6][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
2013-04-08 23:09:11 +00:00
|
|
|
|
2014-03-22 23:28:41 +00:00
|
|
|
i = 0;
|
2014-08-12 14:20:26 +00:00
|
|
|
$('.pid_tuning .LEVEL input').each(function () {
|
2014-03-22 23:28:41 +00:00
|
|
|
switch (i) {
|
|
|
|
case 0:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[7][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[7][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[7][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
2013-04-08 23:09:11 +00:00
|
|
|
|
2014-03-22 23:28:41 +00:00
|
|
|
i = 0;
|
2014-08-12 14:20:26 +00:00
|
|
|
$('.pid_tuning .MAG input').each(function () {
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[8][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
});
|
2013-04-08 23:49:49 +00:00
|
|
|
|
2014-03-22 23:28:41 +00:00
|
|
|
i = 0;
|
2014-08-12 14:20:26 +00:00
|
|
|
$('.pid_tuning .Vario input').each(function () {
|
2014-03-22 23:28:41 +00:00
|
|
|
switch (i) {
|
|
|
|
case 0:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[9][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[9][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
2016-06-17 18:27:10 +00:00
|
|
|
$(this).val(PIDs[9][i++]);
|
2014-03-22 23:28:41 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
2014-03-08 05:25:15 +00:00
|
|
|
|
2014-03-22 23:28:41 +00:00
|
|
|
// Fill in data from RC_tuning object
|
2016-06-14 12:20:23 +00:00
|
|
|
$('.pid_tuning input[name="rc_rate"]').val(RC_tuning.RC_RATE.toFixed(2));
|
|
|
|
$('.pid_tuning input[name="roll_pitch_rate"]').val(RC_tuning.roll_pitch_rate.toFixed(2));
|
|
|
|
$('.pid_tuning input[name="roll_rate"]').val(RC_tuning.roll_rate.toFixed(2));
|
|
|
|
$('.pid_tuning input[name="pitch_rate"]').val(RC_tuning.pitch_rate.toFixed(2));
|
|
|
|
$('.pid_tuning input[name="yaw_rate"]').val(RC_tuning.yaw_rate.toFixed(2));
|
|
|
|
$('.pid_tuning input[name="rc_expo"]').val(RC_tuning.RC_EXPO.toFixed(2));
|
|
|
|
$('.pid_tuning input[name="rc_yaw_expo"]').val(RC_tuning.RC_YAW_EXPO.toFixed(2));
|
2016-06-24 10:50:33 +00:00
|
|
|
$('.pid_tuning input[name="rc_rate_yaw"]').val(SPECIAL_PARAMETERS.RC_RATE_YAW.toFixed(2));
|
2016-06-14 12:20:23 +00:00
|
|
|
|
|
|
|
$('.tpa input[name="tpa"]').val(RC_tuning.dynamic_THR_PID.toFixed(2));
|
|
|
|
$('.tpa input[name="tpa-breakpoint"]').val(RC_tuning.dynamic_THR_breakpoint);
|
|
|
|
|
|
|
|
if (semver.lt(CONFIG.apiVersion, "1.10.0")) {
|
|
|
|
$('.pid_tuning input[name="rc_yaw_expo"]').hide();
|
|
|
|
$('.pid_tuning input[name="rc_expo"]').attr("rowspan", "3");
|
|
|
|
}
|
2016-06-21 00:16:22 +00:00
|
|
|
|
2016-06-24 09:26:54 +00:00
|
|
|
$('.pid_filter .gyro').val(FILTER_CONFIG.gyro_soft_lpf_hz);
|
|
|
|
$('.pid_filter .dterm').val(FILTER_CONFIG.dterm_lpf_hz);
|
|
|
|
$('.pid_filter .yaw').val(FILTER_CONFIG.yaw_lpf_hz);
|
2016-06-24 12:29:46 +00:00
|
|
|
|
|
|
|
if (CONFIG.flightControllerIdentifier == "BTFL" && semver.lt(CONFIG.flightControllerVersion, "2.8.1")) {
|
|
|
|
$('.pid_filter').hide();
|
|
|
|
$('.pid_tuning input[name="rc_rate_yaw"]').hide();
|
|
|
|
}
|
2015-03-10 23:19:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function form_to_pid_and_rc() {
|
2015-03-11 20:34:02 +00:00
|
|
|
// Catch all the changes and stuff the inside PIDs array
|
2015-03-10 23:19:24 +00:00
|
|
|
var i = 0;
|
|
|
|
$('table.pid_tuning tr.ROLL input').each(function () {
|
|
|
|
PIDs[0][i++] = parseFloat($(this).val());
|
|
|
|
});
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
$('table.pid_tuning tr.PITCH input').each(function () {
|
|
|
|
PIDs[1][i++] = parseFloat($(this).val());
|
|
|
|
});
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
$('table.pid_tuning tr.YAW input').each(function () {
|
|
|
|
PIDs[2][i++] = parseFloat($(this).val());
|
|
|
|
});
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
$('table.pid_tuning tr.ALT input').each(function () {
|
|
|
|
PIDs[3][i++] = parseFloat($(this).val());
|
|
|
|
});
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
$('table.pid_tuning tr.Vario input').each(function () {
|
|
|
|
PIDs[9][i++] = parseFloat($(this).val());
|
|
|
|
});
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
$('table.pid_tuning tr.Pos input').each(function () {
|
|
|
|
PIDs[4][i++] = parseFloat($(this).val());
|
|
|
|
});
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
$('table.pid_tuning tr.PosR input').each(function () {
|
|
|
|
PIDs[5][i++] = parseFloat($(this).val());
|
|
|
|
});
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
$('table.pid_tuning tr.NavR input').each(function () {
|
|
|
|
PIDs[6][i++] = parseFloat($(this).val());
|
|
|
|
});
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
$('table.pid_tuning tr.LEVEL input').each(function () {
|
|
|
|
PIDs[7][i++] = parseFloat($(this).val());
|
|
|
|
});
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
$('table.pid_tuning tr.MAG input').each(function () {
|
|
|
|
PIDs[8][i++] = parseFloat($(this).val());
|
|
|
|
});
|
|
|
|
|
|
|
|
// catch RC_tuning changes
|
2016-06-14 12:20:23 +00:00
|
|
|
RC_tuning.RC_RATE = parseFloat($('.pid_tuning input[name="rc_rate"]').val());
|
|
|
|
RC_tuning.roll_pitch_rate = parseFloat($('.pid_tuning input[name="roll_pitch_rate"]').val());
|
|
|
|
RC_tuning.roll_rate = parseFloat($('.pid_tuning input[name="roll_rate"]').val());
|
|
|
|
RC_tuning.pitch_rate = parseFloat($('.pid_tuning input[name="pitch_rate"]').val());
|
|
|
|
RC_tuning.yaw_rate = parseFloat($('.pid_tuning input[name="yaw_rate"]').val());
|
|
|
|
RC_tuning.RC_EXPO = parseFloat($('.pid_tuning input[name="rc_expo"]').val());
|
|
|
|
RC_tuning.RC_YAW_EXPO = parseFloat($('.pid_tuning input[name="rc_yaw_expo"]').val());
|
2016-06-24 10:50:33 +00:00
|
|
|
SPECIAL_PARAMETERS.RC_RATE_YAW = parseFloat($('.pid_tuning input[name="rc_rate_yaw"]').val());
|
2016-06-14 12:20:23 +00:00
|
|
|
|
|
|
|
RC_tuning.dynamic_THR_PID = parseFloat($('.tpa input[name="tpa"]').val());
|
|
|
|
RC_tuning.dynamic_THR_breakpoint = parseInt($('.tpa input[name="tpa-breakpoint"]').val());
|
2016-06-24 09:26:54 +00:00
|
|
|
FILTER_CONFIG.gyro_soft_lpf_hz = parseInt($('.pid_filter .gyro').val());
|
|
|
|
FILTER_CONFIG.dterm_lpf_hz = parseInt($('.pid_filter .dterm').val());
|
|
|
|
FILTER_CONFIG.yaw_lpf_hz = parseInt($('.pid_filter .yaw').val());
|
2015-03-10 23:19:24 +00:00
|
|
|
}
|
2015-11-02 09:10:08 +00:00
|
|
|
function hideUnusedPids(sensors_detected) {
|
|
|
|
$('.tab-pid_tuning table.pid_tuning').hide();
|
|
|
|
$('#pid_main').show();
|
|
|
|
|
|
|
|
if (have_sensor(sensors_detected, 'acc')) {
|
|
|
|
$('#pid_accel').show();
|
|
|
|
}
|
|
|
|
if (have_sensor(sensors_detected, 'baro')) {
|
|
|
|
$('#pid_baro').show();
|
|
|
|
}
|
|
|
|
if (have_sensor(sensors_detected, 'mag')) {
|
|
|
|
$('#pid_mag').show();
|
|
|
|
}
|
|
|
|
if (bit_check(BF_CONFIG.features, 7)) { //This will need to be reworked to remove BF_CONFIG reference eventually
|
|
|
|
$('#pid_gps').show();
|
|
|
|
}
|
|
|
|
if (have_sensor(sensors_detected, 'sonar')) {
|
2015-11-09 09:33:33 +00:00
|
|
|
$('#pid_baro').show();
|
2015-11-02 09:10:08 +00:00
|
|
|
}
|
|
|
|
}
|
2015-03-10 23:19:24 +00:00
|
|
|
function process_html() {
|
|
|
|
// translate to user-selected language
|
|
|
|
localize();
|
|
|
|
|
2015-11-02 09:10:08 +00:00
|
|
|
hideUnusedPids(CONFIG.activeSensors);
|
|
|
|
|
|
|
|
$('#showAllPids').on('click', function(){
|
2015-11-04 21:22:23 +00:00
|
|
|
if($(this).text() == "Show all PIDs") {
|
2015-11-02 09:10:08 +00:00
|
|
|
$('.tab-pid_tuning table.pid_tuning').show();
|
2015-11-04 21:22:23 +00:00
|
|
|
$(this).text('Hide unused PIDs');
|
2015-11-02 09:10:08 +00:00
|
|
|
} else {
|
|
|
|
hideUnusedPids(CONFIG.activeSensors);
|
2015-11-04 21:22:23 +00:00
|
|
|
$(this).text('Show all PIDs');
|
2015-11-02 09:10:08 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-12-12 23:42:49 +00:00
|
|
|
$('#resetPIDs').on('click', function(){
|
|
|
|
MSP.send_message(MSP_codes.MSP_SET_RESET_CURR_PID, false, false, false);
|
2016-06-24 09:07:12 +00:00
|
|
|
updateActivatedTab();
|
2015-12-12 23:42:49 +00:00
|
|
|
});
|
|
|
|
|
2015-11-02 09:10:08 +00:00
|
|
|
$('.pid_tuning tr').each(function(){
|
|
|
|
for(i = 0; i < PID_names.length; i++) {
|
|
|
|
if($(this).hasClass(PID_names[i])) {
|
|
|
|
$(this).find('td:first').text(PID_names[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-03-10 23:19:24 +00:00
|
|
|
|
2015-03-11 20:24:46 +00:00
|
|
|
pid_and_rc_to_form();
|
2014-03-08 05:25:15 +00:00
|
|
|
|
2015-01-29 17:27:50 +00:00
|
|
|
var pidController_e = $('select[name="controller"]');
|
2015-11-14 00:41:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
var pidControllerList;
|
|
|
|
|
|
|
|
if (semver.lt(CONFIG.apiVersion, "1.14.0")) {
|
|
|
|
pidControllerList = [
|
|
|
|
{ name: "MultiWii (Old)"},
|
|
|
|
{ name: "MultiWii (rewrite)"},
|
|
|
|
{ name: "LuxFloat"},
|
|
|
|
{ name: "MultiWii (2.3 - latest)"},
|
|
|
|
{ name: "MultiWii (2.3 - hybrid)"},
|
|
|
|
{ name: "Harakiri"}
|
|
|
|
]
|
|
|
|
} else {
|
|
|
|
pidControllerList = [
|
2016-06-19 21:50:14 +00:00
|
|
|
{ name: ""},
|
|
|
|
{ name: "Integer"},
|
|
|
|
{ name: "Float"},
|
2015-11-14 00:41:23 +00:00
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
for (var i = 0; i < pidControllerList.length; i++) {
|
|
|
|
pidController_e.append('<option value="' + (i) + '">' + pidControllerList[i].name + '</option>');
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-03-10 23:19:24 +00:00
|
|
|
var form_e = $('#pid-tuning');
|
|
|
|
|
2015-01-29 17:27:50 +00:00
|
|
|
if (GUI.canChangePidController) {
|
|
|
|
pidController_e.val(PID.controller);
|
|
|
|
} else {
|
|
|
|
GUI.log(chrome.i18n.getMessage('pidTuningUpgradeFirmwareToChangePidController', [CONFIG.apiVersion, CONFIGURATOR.pidControllerChangeMinApiVersion]));
|
2015-03-10 23:19:24 +00:00
|
|
|
|
2015-01-29 17:27:50 +00:00
|
|
|
pidController_e.empty();
|
|
|
|
pidController_e.append('<option value="">Unknown</option>');
|
2015-03-10 23:19:24 +00:00
|
|
|
|
2015-01-29 17:27:50 +00:00
|
|
|
pidController_e.prop('disabled', true);
|
|
|
|
}
|
2015-11-02 09:10:08 +00:00
|
|
|
|
2015-05-07 21:10:26 +00:00
|
|
|
if (semver.lt(CONFIG.apiVersion, "1.7.0")) {
|
2016-06-14 12:20:23 +00:00
|
|
|
$('.tpa .tpa-breakpoint').hide();
|
|
|
|
|
|
|
|
$('.pid_tuning .roll_rate').hide();
|
|
|
|
$('.pid_tuning .pitch_rate').hide();
|
2015-03-11 21:56:02 +00:00
|
|
|
} else {
|
2016-06-14 12:20:23 +00:00
|
|
|
$('.pid_tuning .roll_pitch_rate').hide();
|
|
|
|
}
|
|
|
|
|
2016-06-25 00:17:24 +00:00
|
|
|
function drawRateCurve(rateElement, sRateElement, expoElement, canvasElement) {
|
2016-06-14 12:20:23 +00:00
|
|
|
var rate = parseFloat(rateElement.val()),
|
2016-06-25 00:17:24 +00:00
|
|
|
sRate = parseFloat(sRateElement.val()),
|
2016-06-14 12:20:23 +00:00
|
|
|
expo = parseFloat(expoElement.val()),
|
|
|
|
context = canvasElement.getContext("2d");
|
|
|
|
|
|
|
|
// local validation to deal with input event
|
|
|
|
if (rate >= parseFloat(rateElement.prop('min')) &&
|
|
|
|
rate <= parseFloat(rateElement.prop('max')) &&
|
|
|
|
expo >= parseFloat(expoElement.prop('min')) &&
|
|
|
|
expo <= parseFloat(expoElement.prop('max'))) {
|
|
|
|
|
|
|
|
var rateHeight = canvasElement.height;
|
|
|
|
var rateWidth = canvasElement.width;
|
|
|
|
|
|
|
|
// math magic by englishman
|
|
|
|
var ratey = rateHeight * rate;
|
2016-06-25 00:17:24 +00:00
|
|
|
ratey = 1 / (1 - ((ratey / rateHeight) * sRate))
|
2016-06-14 12:20:23 +00:00
|
|
|
|
|
|
|
// draw
|
|
|
|
context.clearRect(0, 0, rateWidth, rateHeight);
|
|
|
|
context.beginPath();
|
|
|
|
context.moveTo(0, rateHeight);
|
|
|
|
context.quadraticCurveTo(rateWidth * 11 / 20, rateHeight - ((ratey / 2) * (1 - expo)), rateWidth, rateHeight - ratey);
|
|
|
|
context.lineWidth = 2;
|
|
|
|
context.strokeStyle = '#ffbb00';
|
|
|
|
context.stroke();
|
|
|
|
}
|
2015-03-11 21:56:02 +00:00
|
|
|
}
|
2015-01-29 17:27:50 +00:00
|
|
|
|
2014-03-22 23:28:41 +00:00
|
|
|
// UI Hooks
|
2016-06-14 12:20:23 +00:00
|
|
|
// curves
|
|
|
|
$('.pid_tuning').on('input change', function () {
|
|
|
|
setTimeout(function () { // let global validation trigger and adjust the values first
|
|
|
|
var rateElement = $('.pid_tuning input[name="rc_rate"]'),
|
2016-06-25 00:17:24 +00:00
|
|
|
sRateElementRoll = $('.pid_tuning input[name="roll_rate"]'),
|
|
|
|
sRateElementPitch = $('.pid_tuning input[name="pitch_rate"]'),
|
|
|
|
sRateElementYaw = $('.pid_tuning input[name="yaw_rate"]'),
|
2016-06-14 12:20:23 +00:00
|
|
|
expoElement = $('.pid_tuning input[name="rc_expo"]'),
|
|
|
|
yawExpoElement = $('.pid_tuning input[name="rc_yaw_expo"]'),
|
|
|
|
rcCurveElement = $('.pitch_roll_curve canvas').get(0),
|
|
|
|
rcYawCurveElement = $('.yaw_curve canvas').get(0);
|
|
|
|
|
2016-06-25 00:17:24 +00:00
|
|
|
var rateElementYaw = 1;
|
|
|
|
if (CONFIG.flightControllerIdentifier == "BTFL" && semver.gte(CONFIG.flightControllerVersion, "2.8.1")) {
|
|
|
|
rateElementYaw = $('.pid_tuning input[name="rc_rate_yaw"]');
|
|
|
|
}
|
|
|
|
|
|
|
|
drawRateCurve(rateElement, sRateElementRoll, expoElement, rcCurveElement);
|
|
|
|
//drawRateCurve(rateElement, sRateElementPitch, expoElement, rcCurveElement); // Add Pitch Curve
|
|
|
|
drawRateCurve(rateElementYaw, sRateElementYaw, yawExpoElement, rcYawCurveElement);
|
2016-06-14 12:20:23 +00:00
|
|
|
}, 0);
|
|
|
|
}).trigger('input');
|
2014-03-08 05:25:15 +00:00
|
|
|
|
2014-08-12 14:20:26 +00:00
|
|
|
$('a.refresh').click(function () {
|
|
|
|
GUI.tab_switch_cleanup(function () {
|
2014-05-06 15:34:59 +00:00
|
|
|
GUI.log(chrome.i18n.getMessage('pidTuningDataRefreshed'));
|
2014-08-12 13:51:31 +00:00
|
|
|
TABS.pid_tuning.initialize();
|
2014-03-22 23:28:41 +00:00
|
|
|
});
|
|
|
|
});
|
2014-03-08 05:25:15 +00:00
|
|
|
|
2015-03-10 23:19:24 +00:00
|
|
|
form_e.find('input').each(function (k, item) {
|
|
|
|
$(item).change(function () {
|
|
|
|
pidController_e.prop("disabled", true);
|
|
|
|
TABS.pid_tuning.controllerChanged = false;
|
|
|
|
})
|
|
|
|
});
|
2014-03-22 23:28:41 +00:00
|
|
|
|
2015-03-10 23:19:24 +00:00
|
|
|
pidController_e.change(function () {
|
|
|
|
if (PID.controller != pidController_e.val()) {
|
|
|
|
form_e.find('input').each(function (k, item) {
|
|
|
|
$(item).prop('disabled', true);
|
|
|
|
TABS.pid_tuning.controllerChanged = true;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
2014-03-22 23:28:41 +00:00
|
|
|
|
2016-06-24 09:07:12 +00:00
|
|
|
$('.delta select').val(ADVANCED_TUNING.deltaMethod).change(function() {
|
2016-06-24 12:29:46 +00:00
|
|
|
ADVANCED_TUNING.deltaMethod = $(this).val();
|
2016-06-24 09:07:12 +00:00
|
|
|
});
|
2014-03-22 23:28:41 +00:00
|
|
|
|
2016-06-24 12:29:46 +00:00
|
|
|
if (CONFIG.flightControllerIdentifier == "BTFL" && semver.lt(CONFIG.flightControllerVersion, "2.8.2")) {
|
|
|
|
$('.delta').hide();
|
|
|
|
}
|
|
|
|
|
2015-03-10 23:19:24 +00:00
|
|
|
// update == save.
|
|
|
|
$('a.update').click(function () {
|
|
|
|
form_to_pid_and_rc();
|
|
|
|
if (GUI.canChangePidController && TABS.pid_tuning.controllerChanged) {
|
|
|
|
PID.controller = pidController_e.val();
|
|
|
|
MSP.send_message(MSP_codes.MSP_SET_PID_CONTROLLER, MSP.crunch(MSP_codes.MSP_SET_PID_CONTROLLER), false, function () {
|
|
|
|
MSP.send_message(MSP_codes.MSP_EEPROM_WRITE, false, false, function () {
|
|
|
|
GUI.log(chrome.i18n.getMessage('pidTuningEepromSaved'));
|
|
|
|
});
|
2015-11-23 22:00:05 +00:00
|
|
|
TABS.pid_tuning.initialize();
|
2015-03-10 23:19:24 +00:00
|
|
|
});
|
2015-01-29 17:27:50 +00:00
|
|
|
} else {
|
2016-06-24 09:07:12 +00:00
|
|
|
if (TABS.pid_tuning.controllerChanged) { return; }
|
|
|
|
MSP.promise(MSP_codes.MSP_SET_PID, MSP.crunch(MSP_codes.MSP_SET_PID)).then(function() {
|
|
|
|
if (TABS.pid_tuning.controllerChanged) { Promise.reject('pid controller changed'); }
|
2016-06-24 12:29:46 +00:00
|
|
|
if (CONFIG.flightControllerIdentifier == "BTFL" && semver.gte(CONFIG.flightControllerVersion, "2.8.1")) {
|
|
|
|
return MSP.promise(MSP_codes.MSP_SET_SPECIAL_PARAMETERS, MSP.crunch(MSP_codes.MSP_SET_SPECIAL_PARAMETERS));
|
|
|
|
}
|
2016-06-24 09:07:12 +00:00
|
|
|
}).then(function() {
|
|
|
|
if (TABS.pid_tuning.controllerChanged) { Promise.reject('pid controller changed'); }
|
|
|
|
return MSP.promise(MSP_codes.MSP_SET_ADVANCED_TUNING, MSP.crunch(MSP_codes.MSP_SET_ADVANCED_TUNING));
|
|
|
|
}).then(function() {
|
|
|
|
if (TABS.pid_tuning.controllerChanged) { Promise.reject('pid controller changed'); }
|
2016-06-24 12:29:46 +00:00
|
|
|
if (CONFIG.flightControllerIdentifier == "BTFL" && semver.gte(CONFIG.flightControllerVersion, "2.8.1")) {
|
|
|
|
return MSP.promise(MSP_codes.MSP_SET_FILTER_CONFIG, MSP.crunch(MSP_codes.MSP_SET_FILTER_CONFIG));
|
|
|
|
}
|
2016-06-24 09:07:12 +00:00
|
|
|
}).then(function() {
|
|
|
|
return MSP.promise(MSP_codes.MSP_SET_RC_TUNING, MSP.crunch(MSP_codes.MSP_SET_RC_TUNING));
|
|
|
|
}).then(function() {
|
|
|
|
return MSP.promise(MSP_codes.MSP_EEPROM_WRITE);
|
|
|
|
}).then(function() {
|
|
|
|
GUI.log(chrome.i18n.getMessage('pidTuningEepromSaved'));
|
|
|
|
});
|
2015-01-29 17:27:50 +00:00
|
|
|
}
|
2013-12-15 01:28:12 +00:00
|
|
|
});
|
2014-03-22 23:28:41 +00:00
|
|
|
|
2014-03-30 09:51:16 +00:00
|
|
|
// status data pulled via separate timer with static speed
|
2014-10-01 10:58:09 +00:00
|
|
|
GUI.interval_add('status_pull', function status_pull() {
|
2014-06-01 12:10:18 +00:00
|
|
|
MSP.send_message(MSP_codes.MSP_STATUS);
|
2014-03-30 09:51:16 +00:00
|
|
|
}, 250, true);
|
2014-07-10 16:14:33 +00:00
|
|
|
|
2015-11-11 21:01:22 +00:00
|
|
|
GUI.content_ready(callback);
|
2014-03-22 23:28:41 +00:00
|
|
|
}
|
2014-07-10 16:14:33 +00:00
|
|
|
};
|
|
|
|
|
2014-08-12 14:20:26 +00:00
|
|
|
TABS.pid_tuning.cleanup = function (callback) {
|
2015-03-11 20:34:02 +00:00
|
|
|
if (callback) {
|
|
|
|
callback();
|
|
|
|
}
|
2016-06-14 12:20:23 +00:00
|
|
|
};
|