bugfixes & tiny optimizations
parent
fd62b8568c
commit
01a5c753aa
|
@ -1,6 +1,6 @@
|
|||
<span>xx.xx.xxxx - 0.20</span>
|
||||
<p>
|
||||
- Minor improvements<br />
|
||||
- Minor iprovements & bugfixes<br />
|
||||
</p>
|
||||
<span>12.09.2013 - 0.19</span>
|
||||
<p>
|
||||
|
|
|
@ -224,7 +224,6 @@ function process_data(command, message_buffer, message_length_expected) {
|
|||
CONFIG.profile = data.getUint8(10);
|
||||
|
||||
$('span.cycle-time').html(CONFIG.cycleTime);
|
||||
sensor_status(CONFIG.activeSensors);
|
||||
break;
|
||||
case MSP_codes.MSP_RAW_IMU:
|
||||
SENSOR_DATA.accelerometer[0] = data.getInt16(0, 1) / 1000; // properly scaled
|
||||
|
|
|
@ -190,17 +190,14 @@ function onOpen(openInfo) {
|
|||
}
|
||||
}, 10000);
|
||||
|
||||
// baseflight specific
|
||||
send_message(MSP_codes.MSP_UID, MSP_codes.MSP_UID);
|
||||
send_message(MSP_codes.MSP_ACC_TRIM, MSP_codes.MSP_ACC_TRIM);
|
||||
|
||||
// request configuration data
|
||||
send_message(MSP_codes.MSP_STATUS, MSP_codes.MSP_STATUS);
|
||||
send_message(MSP_codes.MSP_PID, MSP_codes.MSP_PID);
|
||||
send_message(MSP_codes.MSP_RC_TUNING, MSP_codes.MSP_RC_TUNING);
|
||||
send_message(MSP_codes.MSP_UID, MSP_codes.MSP_UID);
|
||||
send_message(MSP_codes.MSP_STATUS, MSP_codes.MSP_STATUS); // in theory this could be removed (MSP_STATUS is pulled in initial tab)
|
||||
send_message(MSP_codes.MSP_IDENT, MSP_codes.MSP_IDENT, false, function() {
|
||||
GUI.timeout_remove('connecting'); // kill connecting timer
|
||||
|
||||
// Update UI elements that doesn't need consistent refreshing
|
||||
sensor_status(CONFIG.activeSensors);
|
||||
$('.software-version').html(CONFIG.version);
|
||||
|
||||
configuration_received = true;
|
||||
|
|
|
@ -1,173 +1,175 @@
|
|||
var yaw_fix = 0.0;
|
||||
|
||||
function tab_initialize_initial_setup() {
|
||||
ga_tracker.sendAppView('Initial Setup');
|
||||
GUI.active_tab = 'initial_setup';
|
||||
|
||||
send_message(MSP_codes.MSP_IDENT, MSP_codes.MSP_IDENT, false, function() {
|
||||
// Fill in the accel trimms from CONFIG object
|
||||
$('input[name="pitch"]').val(CONFIG.accelerometerTrims[0]);
|
||||
$('input[name="roll"]').val(CONFIG.accelerometerTrims[1]);
|
||||
|
||||
// Display multiType
|
||||
var str = '';
|
||||
switch (CONFIG.multiType) {
|
||||
case 1: // TRI
|
||||
str = 'TRI';
|
||||
break;
|
||||
case 2: // QUAD +
|
||||
str = 'Quad +';
|
||||
break;
|
||||
case 3: // QUAD X
|
||||
str = 'Quad X';
|
||||
break;
|
||||
case 4: // BI
|
||||
str = 'BI';
|
||||
break;
|
||||
case 5: // GIMBAL
|
||||
str = 'Gimbal';
|
||||
break;
|
||||
case 6: // Y6
|
||||
str = 'Y6';
|
||||
break;
|
||||
case 7: // HEX 6
|
||||
str = 'HEX 6';
|
||||
break;
|
||||
case 8: // FLYING_WING
|
||||
str = 'Flying Wing';
|
||||
break;
|
||||
case 9: // Y4
|
||||
str = 'Y4';
|
||||
break;
|
||||
case 10: // HEX6 X
|
||||
str = 'HEX6 X';
|
||||
break;
|
||||
case 11: // OCTO X8
|
||||
case 12:
|
||||
case 13:
|
||||
str = 'OCTO X8';
|
||||
break;
|
||||
case 14: // AIRPLANE
|
||||
str = 'Airplane';
|
||||
break;
|
||||
case 15: // Heli 120
|
||||
str = 'Heli 120';
|
||||
break;
|
||||
case 16: // Heli 90
|
||||
str = 'Heli 90';
|
||||
break;
|
||||
case 17: // Vtail
|
||||
str = 'Vtail';
|
||||
break;
|
||||
case 18: // HEX6 H
|
||||
str = 'HEX6 H';
|
||||
break;
|
||||
case 19: // PPM to SERVO
|
||||
str = 'PPM to SERVO';
|
||||
break;
|
||||
case 20: // Dualcopter
|
||||
str = 'Dualcopter';
|
||||
break;
|
||||
case 21: //
|
||||
str = 'Singlecopter';
|
||||
break;
|
||||
}
|
||||
|
||||
$('span.model').html('Model: ' + str);
|
||||
|
||||
// UI Hooks
|
||||
$('a.calibrateAccel').click(function() {
|
||||
var self = $(this);
|
||||
send_message(MSP_codes.MSP_ACC_TRIM, MSP_codes.MSP_ACC_TRIM, false, function() {
|
||||
var yaw_fix = 0.0;
|
||||
|
||||
if (!self.hasClass('calibrating')) {
|
||||
self.addClass('calibrating');
|
||||
|
||||
// During this period MCU won't be able to process any serial commands because its locked in a for/while loop
|
||||
// until this operation finishes, sending more commands through data_poll() will result in serial buffer overflow
|
||||
GUI.interval_pause('initial_setup_data_pull');
|
||||
send_message(MSP_codes.MSP_ACC_CALIBRATION, MSP_codes.MSP_ACC_CALIBRATION);
|
||||
|
||||
GUI.timeout_add('button_reset', function() {
|
||||
GUI.interval_resume('initial_setup_data_pull');
|
||||
self.removeClass('calibrating');
|
||||
}, 2000);
|
||||
// Fill in the accel trimms from CONFIG object
|
||||
$('input[name="pitch"]').val(CONFIG.accelerometerTrims[0]);
|
||||
$('input[name="roll"]').val(CONFIG.accelerometerTrims[1]);
|
||||
|
||||
// Display multiType
|
||||
var str = '';
|
||||
switch (CONFIG.multiType) {
|
||||
case 1: // TRI
|
||||
str = 'TRI';
|
||||
break;
|
||||
case 2: // QUAD +
|
||||
str = 'Quad +';
|
||||
break;
|
||||
case 3: // QUAD X
|
||||
str = 'Quad X';
|
||||
break;
|
||||
case 4: // BI
|
||||
str = 'BI';
|
||||
break;
|
||||
case 5: // GIMBAL
|
||||
str = 'Gimbal';
|
||||
break;
|
||||
case 6: // Y6
|
||||
str = 'Y6';
|
||||
break;
|
||||
case 7: // HEX 6
|
||||
str = 'HEX 6';
|
||||
break;
|
||||
case 8: // FLYING_WING
|
||||
str = 'Flying Wing';
|
||||
break;
|
||||
case 9: // Y4
|
||||
str = 'Y4';
|
||||
break;
|
||||
case 10: // HEX6 X
|
||||
str = 'HEX6 X';
|
||||
break;
|
||||
case 11: // OCTO X8
|
||||
case 12:
|
||||
case 13:
|
||||
str = 'OCTO X8';
|
||||
break;
|
||||
case 14: // AIRPLANE
|
||||
str = 'Airplane';
|
||||
break;
|
||||
case 15: // Heli 120
|
||||
str = 'Heli 120';
|
||||
break;
|
||||
case 16: // Heli 90
|
||||
str = 'Heli 90';
|
||||
break;
|
||||
case 17: // Vtail
|
||||
str = 'Vtail';
|
||||
break;
|
||||
case 18: // HEX6 H
|
||||
str = 'HEX6 H';
|
||||
break;
|
||||
case 19: // PPM to SERVO
|
||||
str = 'PPM to SERVO';
|
||||
break;
|
||||
case 20: // Dualcopter
|
||||
str = 'Dualcopter';
|
||||
break;
|
||||
case 21: //
|
||||
str = 'Singlecopter';
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
$('a.calibrateMag').click(function() {
|
||||
var self = $(this);
|
||||
|
||||
if (!self.hasClass('calibrating')) {
|
||||
self.addClass('calibrating');
|
||||
$('span.model').html('Model: ' + str);
|
||||
|
||||
send_message(MSP_codes.MSP_MAG_CALIBRATION, MSP_codes.MSP_MAG_CALIBRATION);
|
||||
// UI Hooks
|
||||
$('a.calibrateAccel').click(function() {
|
||||
var self = $(this);
|
||||
|
||||
GUI.timeout_add('button_reset', function() {
|
||||
self.removeClass('calibrating');
|
||||
}, 30000);
|
||||
}
|
||||
if (!self.hasClass('calibrating')) {
|
||||
self.addClass('calibrating');
|
||||
|
||||
// During this period MCU won't be able to process any serial commands because its locked in a for/while loop
|
||||
// until this operation finishes, sending more commands through data_poll() will result in serial buffer overflow
|
||||
GUI.interval_pause('initial_setup_data_pull');
|
||||
send_message(MSP_codes.MSP_ACC_CALIBRATION, MSP_codes.MSP_ACC_CALIBRATION);
|
||||
|
||||
GUI.timeout_add('button_reset', function() {
|
||||
GUI.interval_resume('initial_setup_data_pull');
|
||||
self.removeClass('calibrating');
|
||||
}, 2000);
|
||||
}
|
||||
});
|
||||
|
||||
$('a.calibrateMag').click(function() {
|
||||
var self = $(this);
|
||||
|
||||
if (!self.hasClass('calibrating')) {
|
||||
self.addClass('calibrating');
|
||||
|
||||
send_message(MSP_codes.MSP_MAG_CALIBRATION, MSP_codes.MSP_MAG_CALIBRATION);
|
||||
|
||||
GUI.timeout_add('button_reset', function() {
|
||||
self.removeClass('calibrating');
|
||||
}, 30000);
|
||||
}
|
||||
});
|
||||
|
||||
$('a.resetSettings').click(function() {
|
||||
send_message(MSP_codes.MSP_RESET_CONF, MSP_codes.MSP_RESET_CONF);
|
||||
});
|
||||
|
||||
|
||||
$('input[name="pitch"], input[name="roll"]').change(function() {
|
||||
// if any of the fields changed, unlock update button
|
||||
$('a.update').addClass('active');
|
||||
});
|
||||
|
||||
$('a.update').click(function() {
|
||||
CONFIG.accelerometerTrims[0] = parseInt($('input[name="pitch"]').val());
|
||||
CONFIG.accelerometerTrims[1] = parseInt($('input[name="roll"]').val());
|
||||
|
||||
var buffer_out = new Array();
|
||||
buffer_out[0] = lowByte(CONFIG.accelerometerTrims[0]);
|
||||
buffer_out[1] = highByte(CONFIG.accelerometerTrims[0]);
|
||||
buffer_out[2] = lowByte(CONFIG.accelerometerTrims[1]);
|
||||
buffer_out[3] = highByte(CONFIG.accelerometerTrims[1]);
|
||||
|
||||
// Send over the new trims
|
||||
send_message(MSP_codes.MSP_SET_ACC_TRIM, buffer_out);
|
||||
|
||||
// Save changes to EEPROM
|
||||
send_message(MSP_codes.MSP_EEPROM_WRITE, MSP_codes.MSP_EEPROM_WRITE);
|
||||
|
||||
// remove the active status
|
||||
$(this).removeClass('active');
|
||||
});
|
||||
|
||||
// reset yaw button hook
|
||||
$('div#interactive_block > a.reset').click(function() {
|
||||
yaw_fix = SENSOR_DATA.kinematicsZ * - 1.0;
|
||||
console.log("YAW reset to 0");
|
||||
});
|
||||
|
||||
$('#content .backup').click(configuration_backup);
|
||||
|
||||
$('#content .restore').click(configuration_restore);
|
||||
|
||||
GUI.interval_add('initial_setup_data_pull', function() {
|
||||
// Update cube
|
||||
var cube = $('div#cube');
|
||||
|
||||
cube.css('-webkit-transform', 'rotateY(' + ((SENSOR_DATA.kinematicsZ * -1.0) - yaw_fix) + 'deg)');
|
||||
$('#cubePITCH', cube).css('-webkit-transform', 'rotateX(' + SENSOR_DATA.kinematicsY + 'deg)');
|
||||
$('#cubeROLL', cube).css('-webkit-transform', 'rotateZ(' + SENSOR_DATA.kinematicsX + 'deg)');
|
||||
|
||||
// Update Compass
|
||||
$('div#compass .pointer').css('-webkit-transform', 'rotate(' + (SENSOR_DATA.kinematicsZ) + 'deg)');
|
||||
$('div#compass .value').html(SENSOR_DATA.kinematicsZ + '°');
|
||||
|
||||
// Update voltage indicator
|
||||
$('span.bat-voltage').html(BATTERY.voltage + ' V');
|
||||
|
||||
// Request new data
|
||||
send_message(MSP_codes.MSP_STATUS, MSP_codes.MSP_STATUS);
|
||||
send_message(MSP_codes.MSP_ATTITUDE, MSP_codes.MSP_ATTITUDE);
|
||||
send_message(MSP_codes.MSP_COMP_GPS, MSP_codes.MSP_COMP_GPS);
|
||||
send_message(MSP_codes.MSP_ANALOG, MSP_codes.MSP_ANALOG);
|
||||
}, 50, true);
|
||||
});
|
||||
|
||||
$('a.resetSettings').click(function() {
|
||||
send_message(MSP_codes.MSP_RESET_CONF, MSP_codes.MSP_RESET_CONF);
|
||||
});
|
||||
|
||||
|
||||
$('input[name="pitch"], input[name="roll"]').change(function() {
|
||||
// if any of the fields changed, unlock update button
|
||||
$('a.update').addClass('active');
|
||||
});
|
||||
|
||||
$('a.update').click(function() {
|
||||
CONFIG.accelerometerTrims[0] = parseInt($('input[name="pitch"]').val());
|
||||
CONFIG.accelerometerTrims[1] = parseInt($('input[name="roll"]').val());
|
||||
|
||||
var buffer_out = new Array();
|
||||
buffer_out[0] = lowByte(CONFIG.accelerometerTrims[0]);
|
||||
buffer_out[1] = highByte(CONFIG.accelerometerTrims[0]);
|
||||
buffer_out[2] = lowByte(CONFIG.accelerometerTrims[1]);
|
||||
buffer_out[3] = highByte(CONFIG.accelerometerTrims[1]);
|
||||
|
||||
// Send over the new trims
|
||||
send_message(MSP_codes.MSP_SET_ACC_TRIM, buffer_out);
|
||||
|
||||
// Save changes to EEPROM
|
||||
send_message(MSP_codes.MSP_EEPROM_WRITE, MSP_codes.MSP_EEPROM_WRITE);
|
||||
|
||||
// remove the active status
|
||||
$(this).removeClass('active');
|
||||
});
|
||||
|
||||
// reset yaw button hook
|
||||
$('div#interactive_block > a.reset').click(function() {
|
||||
yaw_fix = SENSOR_DATA.kinematicsZ * - 1.0;
|
||||
console.log("YAW reset to 0");
|
||||
});
|
||||
|
||||
$('#content .backup').click(configuration_backup);
|
||||
|
||||
$('#content .restore').click(configuration_restore);
|
||||
|
||||
GUI.interval_add('initial_setup_data_pull', function() {
|
||||
// Update cube
|
||||
var cube = $('div#cube');
|
||||
|
||||
cube.css('-webkit-transform', 'rotateY(' + ((SENSOR_DATA.kinematicsZ * -1.0) - yaw_fix) + 'deg)');
|
||||
$('#cubePITCH', cube).css('-webkit-transform', 'rotateX(' + SENSOR_DATA.kinematicsY + 'deg)');
|
||||
$('#cubeROLL', cube).css('-webkit-transform', 'rotateZ(' + SENSOR_DATA.kinematicsX + 'deg)');
|
||||
|
||||
// Update Compass
|
||||
$('div#compass .pointer').css('-webkit-transform', 'rotate(' + (SENSOR_DATA.kinematicsZ) + 'deg)');
|
||||
$('div#compass .value').html(SENSOR_DATA.kinematicsZ + '°');
|
||||
|
||||
// Update voltage indicator
|
||||
$('span.bat-voltage').html(BATTERY.voltage + ' V');
|
||||
|
||||
// Request new data
|
||||
send_message(MSP_codes.MSP_STATUS, MSP_codes.MSP_STATUS);
|
||||
send_message(MSP_codes.MSP_ATTITUDE, MSP_codes.MSP_ATTITUDE);
|
||||
send_message(MSP_codes.MSP_COMP_GPS, MSP_codes.MSP_COMP_GPS);
|
||||
send_message(MSP_codes.MSP_ANALOG, MSP_codes.MSP_ANALOG);
|
||||
}, 50, true);
|
||||
});
|
||||
}
|
|
@ -2,233 +2,237 @@ function tab_initialize_pid_tuning() {
|
|||
ga_tracker.sendAppView('PID Tuning');
|
||||
GUI.active_tab = 'pid_tuning';
|
||||
|
||||
// Fill in the data from PIDs array
|
||||
var needle = 0;
|
||||
send_message(MSP_codes.MSP_PID, MSP_codes.MSP_PID, false, function() {
|
||||
send_message(MSP_codes.MSP_RC_TUNING, MSP_codes.MSP_RC_TUNING, false, function() {
|
||||
// Fill in the data from PIDs array
|
||||
var needle = 0;
|
||||
|
||||
var i = 0;
|
||||
$('.pid_tuning .ROLL input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(3));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(0));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .PITCH input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(3));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(0));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .YAW input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(3));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(0));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .ALT input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(3));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(0));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .Pos input').each(function() {
|
||||
$(this).val(PIDs[needle][i++].toFixed(2));
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .PosR input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(2));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(3));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .NavR input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(2));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(3));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .LEVEL input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(2));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(0));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .MAG input').each(function() {
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
});
|
||||
needle++;
|
||||
|
||||
// Fill in data from RC_tuning object
|
||||
$('.rate-tpa input[name="roll-pitch"]').val(RC_tuning.roll_pitch_rate.toFixed(2));
|
||||
$('.rate-tpa input[name="yaw"]').val(RC_tuning.yaw_rate.toFixed(2));
|
||||
$('.rate-tpa input[name="tpa"]').val(RC_tuning.dynamic_THR_PID.toFixed(2));
|
||||
|
||||
// UI Hooks
|
||||
$('.pid_tuning input, .rate-tpa input').change(function() {
|
||||
// if any of the fields changed, unlock update button
|
||||
$('a.update').addClass('active');
|
||||
});
|
||||
|
||||
$('a.update').click(function() {
|
||||
if ($(this).hasClass('active')) {
|
||||
// Catch all the changes and stuff the inside PIDs array
|
||||
var needle_main = 0;
|
||||
var needle_secondary = 0;
|
||||
var i = 0;
|
||||
$('.pid_tuning .ROLL input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(3));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(0));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
$('.pid_tuning input').each(function() {
|
||||
PIDs[needle_main][needle_secondary] = parseFloat($(this).val());
|
||||
needle_secondary++;
|
||||
|
||||
// exceptions (required for the "shorter" PID arrays, 2 fields, 1 field, etc)
|
||||
if (needle_main == 4) {
|
||||
if (needle_secondary >= 2) {
|
||||
needle_main++;
|
||||
needle_secondary = 0;
|
||||
}
|
||||
} else if (needle_main == 8) {
|
||||
if (needle_secondary >= 1) {
|
||||
needle_main++;
|
||||
needle_secondary = 0;
|
||||
}
|
||||
} else {
|
||||
if (needle_secondary >= 3) {
|
||||
needle_main++;
|
||||
needle_secondary = 0;
|
||||
}
|
||||
}
|
||||
i = 0;
|
||||
$('.pid_tuning .PITCH input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(3));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(0));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .YAW input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(3));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(0));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .ALT input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(3));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(0));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .Pos input').each(function() {
|
||||
$(this).val(PIDs[needle][i++].toFixed(2));
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .PosR input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(2));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(3));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .NavR input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(2));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(3));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .LEVEL input').each(function() {
|
||||
switch (i) {
|
||||
case 0:
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
break;
|
||||
case 1:
|
||||
$(this).val(PIDs[needle][i++].toFixed(2));
|
||||
break;
|
||||
case 2:
|
||||
$(this).val(PIDs[needle][i++].toFixed(0));
|
||||
break;
|
||||
}
|
||||
});
|
||||
needle++;
|
||||
|
||||
i = 0;
|
||||
$('.pid_tuning .MAG input').each(function() {
|
||||
$(this).val(PIDs[needle][i++].toFixed(1));
|
||||
});
|
||||
needle++;
|
||||
|
||||
// Fill in data from RC_tuning object
|
||||
$('.rate-tpa input[name="roll-pitch"]').val(RC_tuning.roll_pitch_rate.toFixed(2));
|
||||
$('.rate-tpa input[name="yaw"]').val(RC_tuning.yaw_rate.toFixed(2));
|
||||
$('.rate-tpa input[name="tpa"]').val(RC_tuning.dynamic_THR_PID.toFixed(2));
|
||||
|
||||
// UI Hooks
|
||||
$('.pid_tuning input, .rate-tpa input').change(function() {
|
||||
// if any of the fields changed, unlock update button
|
||||
$('a.update').addClass('active');
|
||||
});
|
||||
|
||||
var PID_buffer_out = new Array();
|
||||
var PID_buffer_needle = 0;
|
||||
for (var i = 0; i < PIDs.length; i++) {
|
||||
switch (i) {
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
PID_buffer_out[PID_buffer_needle] = parseInt(PIDs[i][0] * 10);
|
||||
PID_buffer_out[PID_buffer_needle + 1] = parseInt(PIDs[i][1] * 1000);
|
||||
PID_buffer_out[PID_buffer_needle + 2] = parseInt(PIDs[i][2]);
|
||||
break;
|
||||
case 4:
|
||||
PID_buffer_out[PID_buffer_needle] = parseInt(PIDs[i][0] * 100);
|
||||
PID_buffer_out[PID_buffer_needle + 1] = parseInt(PIDs[i][1] * 100);
|
||||
PID_buffer_out[PID_buffer_needle + 2] = parseInt(PIDs[i][2]);
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
PID_buffer_out[PID_buffer_needle] = parseInt(PIDs[i][0] * 10);
|
||||
PID_buffer_out[PID_buffer_needle + 1] = parseInt(PIDs[i][1] * 100);
|
||||
PID_buffer_out[PID_buffer_needle + 2] = parseInt(PIDs[i][2] * 1000);
|
||||
break;
|
||||
$('a.update').click(function() {
|
||||
if ($(this).hasClass('active')) {
|
||||
// Catch all the changes and stuff the inside PIDs array
|
||||
var needle_main = 0;
|
||||
var needle_secondary = 0;
|
||||
|
||||
$('.pid_tuning input').each(function() {
|
||||
PIDs[needle_main][needle_secondary] = parseFloat($(this).val());
|
||||
needle_secondary++;
|
||||
|
||||
// exceptions (required for the "shorter" PID arrays, 2 fields, 1 field, etc)
|
||||
if (needle_main == 4) {
|
||||
if (needle_secondary >= 2) {
|
||||
needle_main++;
|
||||
needle_secondary = 0;
|
||||
}
|
||||
} else if (needle_main == 8) {
|
||||
if (needle_secondary >= 1) {
|
||||
needle_main++;
|
||||
needle_secondary = 0;
|
||||
}
|
||||
} else {
|
||||
if (needle_secondary >= 3) {
|
||||
needle_main++;
|
||||
needle_secondary = 0;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var PID_buffer_out = new Array();
|
||||
var PID_buffer_needle = 0;
|
||||
for (var i = 0; i < PIDs.length; i++) {
|
||||
switch (i) {
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
PID_buffer_out[PID_buffer_needle] = parseInt(PIDs[i][0] * 10);
|
||||
PID_buffer_out[PID_buffer_needle + 1] = parseInt(PIDs[i][1] * 1000);
|
||||
PID_buffer_out[PID_buffer_needle + 2] = parseInt(PIDs[i][2]);
|
||||
break;
|
||||
case 4:
|
||||
PID_buffer_out[PID_buffer_needle] = parseInt(PIDs[i][0] * 100);
|
||||
PID_buffer_out[PID_buffer_needle + 1] = parseInt(PIDs[i][1] * 100);
|
||||
PID_buffer_out[PID_buffer_needle + 2] = parseInt(PIDs[i][2]);
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
PID_buffer_out[PID_buffer_needle] = parseInt(PIDs[i][0] * 10);
|
||||
PID_buffer_out[PID_buffer_needle + 1] = parseInt(PIDs[i][1] * 100);
|
||||
PID_buffer_out[PID_buffer_needle + 2] = parseInt(PIDs[i][2] * 1000);
|
||||
break;
|
||||
}
|
||||
PID_buffer_needle += 3;
|
||||
}
|
||||
|
||||
// Send over the PID changes
|
||||
send_message(MSP_codes.MSP_SET_PID, PID_buffer_out);
|
||||
|
||||
// catch RC_tuning changes
|
||||
RC_tuning.roll_pitch_rate = parseFloat($('.rate-tpa input[name="roll-pitch"]').val());
|
||||
RC_tuning.yaw_rate = parseFloat($('.rate-tpa input[name="yaw"]').val());
|
||||
RC_tuning.dynamic_THR_PID = parseFloat($('.rate-tpa input[name="tpa"]').val());
|
||||
|
||||
var RC_tuning_buffer_out = new Array();
|
||||
RC_tuning_buffer_out[0] = parseInt(RC_tuning.RC_RATE * 100);
|
||||
RC_tuning_buffer_out[1] = parseInt(RC_tuning.RC_EXPO * 100);
|
||||
RC_tuning_buffer_out[2] = parseInt(RC_tuning.roll_pitch_rate * 100);
|
||||
RC_tuning_buffer_out[3] = parseInt(RC_tuning.yaw_rate * 100);
|
||||
RC_tuning_buffer_out[4] = parseInt(RC_tuning.dynamic_THR_PID * 100);
|
||||
RC_tuning_buffer_out[5] = parseInt(RC_tuning.throttle_MID * 100);
|
||||
RC_tuning_buffer_out[6] = parseInt(RC_tuning.throttle_EXPO * 100);
|
||||
|
||||
// Send over the RC_tuning changes
|
||||
send_message(MSP_codes.MSP_SET_RC_TUNING, RC_tuning_buffer_out);
|
||||
|
||||
// Save changes to EEPROM
|
||||
send_message(MSP_codes.MSP_EEPROM_WRITE, MSP_codes.MSP_EEPROM_WRITE);
|
||||
|
||||
// remove the active status
|
||||
$(this).removeClass('active');
|
||||
}
|
||||
PID_buffer_needle += 3;
|
||||
}
|
||||
|
||||
// Send over the PID changes
|
||||
send_message(MSP_codes.MSP_SET_PID, PID_buffer_out);
|
||||
|
||||
// catch RC_tuning changes
|
||||
RC_tuning.roll_pitch_rate = parseFloat($('.rate-tpa input[name="roll-pitch"]').val());
|
||||
RC_tuning.yaw_rate = parseFloat($('.rate-tpa input[name="yaw"]').val());
|
||||
RC_tuning.dynamic_THR_PID = parseFloat($('.rate-tpa input[name="tpa"]').val());
|
||||
|
||||
var RC_tuning_buffer_out = new Array();
|
||||
RC_tuning_buffer_out[0] = parseInt(RC_tuning.RC_RATE * 100);
|
||||
RC_tuning_buffer_out[1] = parseInt(RC_tuning.RC_EXPO * 100);
|
||||
RC_tuning_buffer_out[2] = parseInt(RC_tuning.roll_pitch_rate * 100);
|
||||
RC_tuning_buffer_out[3] = parseInt(RC_tuning.yaw_rate * 100);
|
||||
RC_tuning_buffer_out[4] = parseInt(RC_tuning.dynamic_THR_PID * 100);
|
||||
RC_tuning_buffer_out[5] = parseInt(RC_tuning.throttle_MID * 100);
|
||||
RC_tuning_buffer_out[6] = parseInt(RC_tuning.throttle_EXPO * 100);
|
||||
|
||||
// Send over the RC_tuning changes
|
||||
send_message(MSP_codes.MSP_SET_RC_TUNING, RC_tuning_buffer_out);
|
||||
|
||||
// Save changes to EEPROM
|
||||
send_message(MSP_codes.MSP_EEPROM_WRITE, MSP_codes.MSP_EEPROM_WRITE);
|
||||
|
||||
// remove the active status
|
||||
$(this).removeClass('active');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// enable data pulling
|
||||
GUI.interval_add('pid_data_poll', function() {
|
||||
send_message(MSP_codes.MSP_STATUS, MSP_codes.MSP_STATUS);
|
||||
}, 50);
|
||||
// enable data pulling
|
||||
GUI.interval_add('pid_data_poll', function() {
|
||||
send_message(MSP_codes.MSP_STATUS, MSP_codes.MSP_STATUS);
|
||||
}, 50);
|
||||
});
|
||||
});
|
||||
}
|
381
tabs/receiver.js
381
tabs/receiver.js
|
@ -1,203 +1,204 @@
|
|||
var samples_i;
|
||||
function tab_initialize_receiver() {
|
||||
ga_tracker.sendAppView('Receiver Page');
|
||||
GUI.active_tab = 'receiver';
|
||||
|
||||
// fill in data from RC_tuning
|
||||
$('.tunings .throttle input[name="mid"]').val(RC_tuning.throttle_MID.toFixed(2));
|
||||
$('.tunings .throttle input[name="expo"]').val(RC_tuning.throttle_EXPO.toFixed(2));
|
||||
send_message(MSP_codes.MSP_RC_TUNING, MSP_codes.MSP_RC_TUNING, false, function() {
|
||||
// fill in data from RC_tuning
|
||||
$('.tunings .throttle input[name="mid"]').val(RC_tuning.throttle_MID.toFixed(2));
|
||||
$('.tunings .throttle input[name="expo"]').val(RC_tuning.throttle_EXPO.toFixed(2));
|
||||
|
||||
$('.tunings .rate input[name="rate"]').val(RC_tuning.RC_RATE.toFixed(2));
|
||||
$('.tunings .rate input[name="expo"]').val(RC_tuning.RC_EXPO.toFixed(2));
|
||||
|
||||
// Setup plot variables and plot it self
|
||||
samples_i = 300;
|
||||
|
||||
RX_plot_data = new Array(8);
|
||||
for (var i = 0; i < 8; i++) {
|
||||
RX_plot_data[i] = new Array();
|
||||
}
|
||||
$('.tunings .rate input[name="rate"]').val(RC_tuning.RC_RATE.toFixed(2));
|
||||
$('.tunings .rate input[name="expo"]').val(RC_tuning.RC_EXPO.toFixed(2));
|
||||
|
||||
// Setup plot variables and plot it self
|
||||
var samples_i = 300;
|
||||
|
||||
RX_plot_data = new Array(8);
|
||||
for (var i = 0; i < 8; i++) {
|
||||
RX_plot_data[i] = new Array();
|
||||
}
|
||||
|
||||
for (var i = 0; i <= 300; i++) {
|
||||
RX_plot_data[0].push([i, 0]);
|
||||
RX_plot_data[1].push([i, 0]);
|
||||
RX_plot_data[2].push([i, 0]);
|
||||
RX_plot_data[3].push([i, 0]);
|
||||
RX_plot_data[4].push([i, 0]);
|
||||
RX_plot_data[5].push([i, 0]);
|
||||
RX_plot_data[6].push([i, 0]);
|
||||
RX_plot_data[7].push([i, 0]);
|
||||
}
|
||||
|
||||
e_RX_plot = document.getElementById("RX_plot");
|
||||
|
||||
RX_plot_options = {
|
||||
title: "Channel width (us)",
|
||||
shadowSize: 0,
|
||||
yaxis : {
|
||||
max: 2200,
|
||||
min: 800,
|
||||
noTicks: 10
|
||||
},
|
||||
xaxis : {
|
||||
//noTicks = 0
|
||||
},
|
||||
grid : {
|
||||
backgroundColor: "#FFFFFF"
|
||||
},
|
||||
legend : {
|
||||
position: "we",
|
||||
backgroundOpacity: 0
|
||||
}
|
||||
};
|
||||
|
||||
// UI Hooks
|
||||
$('.tunings input').change(function() {
|
||||
// if any of the fields changed, unlock update button
|
||||
$('a.update').addClass('active');
|
||||
});
|
||||
|
||||
// curves
|
||||
$('.tunings .throttle input').change(function() {
|
||||
var mid = parseFloat($('.tunings .throttle input[name="mid"]').val());
|
||||
var expo = parseFloat($('.tunings .throttle input[name="expo"]').val());
|
||||
|
||||
var throttle_curve = $('.throttle_curve canvas').get(0);
|
||||
var context = throttle_curve.getContext("2d");
|
||||
context.clearRect(0, 0, 220, 58);
|
||||
|
||||
// math magic by englishman
|
||||
var midx = 220 * mid;
|
||||
var midxl = midx * .5;
|
||||
var midxr = (((220 - midx) * .5) + midx);
|
||||
var midy = 58 - (midx * (58 / 220));
|
||||
var midyl = 58 - ((58 - midy) * .5 *(expo + 1));
|
||||
var midyr = (midy / 2) * (expo + 1);
|
||||
|
||||
context.beginPath();
|
||||
context.moveTo(0, 58);
|
||||
context.quadraticCurveTo(midxl, midyl, midx, midy);
|
||||
context.moveTo(midx, midy);
|
||||
context.quadraticCurveTo(midxr, midyr, 220, 0);
|
||||
|
||||
context.lineWidth = 2;
|
||||
context.stroke();
|
||||
});
|
||||
$('.tunings .throttle input').trigger('change'); // initial software trigger
|
||||
|
||||
$('.tunings .rate input').change(function() {
|
||||
var rate = parseFloat($('.tunings .rate input[name="rate"]').val());
|
||||
var expo = parseFloat($('.tunings .rate input[name="expo"]').val());
|
||||
|
||||
var pitch_roll_curve = $('.pitch_roll_curve canvas').get(0);
|
||||
var context = pitch_roll_curve.getContext("2d");
|
||||
context.clearRect(0, 0, 220, 58);
|
||||
|
||||
// math magic by englishman
|
||||
var ratey = 58 * rate;
|
||||
|
||||
context.beginPath();
|
||||
context.moveTo(0, 58);
|
||||
context.quadraticCurveTo(110, 58 - ((ratey / 2) * (1 - expo)), 220, 58 - ratey);
|
||||
context.lineWidth = 2;
|
||||
context.stroke();
|
||||
});
|
||||
$('.tunings .rate input').trigger('change'); // initial software trigger
|
||||
|
||||
$('a.update').click(function() {
|
||||
if ($(this).hasClass('active')) {
|
||||
// catch RC_tuning changes
|
||||
RC_tuning.throttle_MID = parseFloat($('.tunings .throttle input[name="mid"]').val());
|
||||
RC_tuning.throttle_EXPO = parseFloat($('.tunings .throttle input[name="expo"]').val());
|
||||
|
||||
RC_tuning.RC_RATE = parseFloat($('.tunings .rate input[name="rate"]').val());
|
||||
RC_tuning.RC_EXPO = parseFloat($('.tunings .rate input[name="expo"]').val());
|
||||
|
||||
var RC_tuning_buffer_out = new Array();
|
||||
RC_tuning_buffer_out[0] = parseInt(RC_tuning.RC_RATE * 100);
|
||||
RC_tuning_buffer_out[1] = parseInt(RC_tuning.RC_EXPO * 100);
|
||||
RC_tuning_buffer_out[2] = parseInt(RC_tuning.roll_pitch_rate * 100);
|
||||
RC_tuning_buffer_out[3] = parseInt(RC_tuning.yaw_rate * 100);
|
||||
RC_tuning_buffer_out[4] = parseInt(RC_tuning.dynamic_THR_PID * 100);
|
||||
RC_tuning_buffer_out[5] = parseInt(RC_tuning.throttle_MID * 100);
|
||||
RC_tuning_buffer_out[6] = parseInt(RC_tuning.throttle_EXPO * 100);
|
||||
|
||||
// Send over the RC_tuning changes
|
||||
send_message(MSP_codes.MSP_SET_RC_TUNING, RC_tuning_buffer_out);
|
||||
|
||||
// Save changes to EEPROM
|
||||
send_message(MSP_codes.MSP_EEPROM_WRITE, MSP_codes.MSP_EEPROM_WRITE);
|
||||
|
||||
// remove the active status
|
||||
$(this).removeClass('active');
|
||||
for (var i = 0; i <= 300; i++) {
|
||||
RX_plot_data[0].push([i, 0]);
|
||||
RX_plot_data[1].push([i, 0]);
|
||||
RX_plot_data[2].push([i, 0]);
|
||||
RX_plot_data[3].push([i, 0]);
|
||||
RX_plot_data[4].push([i, 0]);
|
||||
RX_plot_data[5].push([i, 0]);
|
||||
RX_plot_data[6].push([i, 0]);
|
||||
RX_plot_data[7].push([i, 0]);
|
||||
}
|
||||
});
|
||||
|
||||
// enable RC data pulling
|
||||
GUI.interval_add('receiver_poll', function() {
|
||||
// Update UI with latest data
|
||||
$('.tab-receiver meter:eq(0)').val(RC.throttle);
|
||||
$('.tab-receiver .value:eq(0)').html(RC.throttle);
|
||||
|
||||
$('.tab-receiver meter:eq(1)').val(RC.pitch);
|
||||
$('.tab-receiver .value:eq(1)').html(RC.pitch);
|
||||
e_RX_plot = document.getElementById("RX_plot");
|
||||
|
||||
$('.tab-receiver meter:eq(2)').val(RC.roll);
|
||||
$('.tab-receiver .value:eq(2)').html(RC.roll);
|
||||
|
||||
$('.tab-receiver meter:eq(3)').val(RC.yaw);
|
||||
$('.tab-receiver .value:eq(3)').html(RC.yaw);
|
||||
|
||||
|
||||
$('.tab-receiver meter:eq(4)').val(RC.AUX1);
|
||||
$('.tab-receiver .value:eq(4)').html(RC.AUX1);
|
||||
|
||||
$('.tab-receiver meter:eq(5)').val(RC.AUX2);
|
||||
$('.tab-receiver .value:eq(5)').html(RC.AUX2);
|
||||
|
||||
$('.tab-receiver meter:eq(6)').val(RC.AUX3);
|
||||
$('.tab-receiver .value:eq(6)').html(RC.AUX3);
|
||||
|
||||
$('.tab-receiver meter:eq(7)').val(RC.AUX4);
|
||||
$('.tab-receiver .value:eq(7)').html(RC.AUX4);
|
||||
|
||||
// push latest data to the main array
|
||||
RX_plot_data[0].push([samples_i, RC.throttle]);
|
||||
RX_plot_data[1].push([samples_i, RC.pitch]);
|
||||
RX_plot_data[2].push([samples_i, RC.roll]);
|
||||
RX_plot_data[3].push([samples_i, RC.yaw]);
|
||||
RX_plot_data[4].push([samples_i, RC.AUX1]);
|
||||
RX_plot_data[5].push([samples_i, RC.AUX2]);
|
||||
RX_plot_data[6].push([samples_i, RC.AUX3]);
|
||||
RX_plot_data[7].push([samples_i, RC.AUX4]);
|
||||
|
||||
// Remove old data from array
|
||||
while (RX_plot_data[0].length > 300) {
|
||||
RX_plot_data[0].shift();
|
||||
RX_plot_data[1].shift();
|
||||
RX_plot_data[2].shift();
|
||||
RX_plot_data[3].shift();
|
||||
RX_plot_data[4].shift();
|
||||
RX_plot_data[5].shift();
|
||||
RX_plot_data[6].shift();
|
||||
RX_plot_data[7].shift();
|
||||
RX_plot_options = {
|
||||
title: "Channel width (us)",
|
||||
shadowSize: 0,
|
||||
yaxis : {
|
||||
max: 2200,
|
||||
min: 800,
|
||||
noTicks: 10
|
||||
},
|
||||
xaxis : {
|
||||
//noTicks = 0
|
||||
},
|
||||
grid : {
|
||||
backgroundColor: "#FFFFFF"
|
||||
},
|
||||
legend : {
|
||||
position: "we",
|
||||
backgroundOpacity: 0
|
||||
}
|
||||
};
|
||||
|
||||
// redraw plot
|
||||
Flotr.draw(e_RX_plot, [
|
||||
{data: RX_plot_data[0], label: "THROTTLE"},
|
||||
{data: RX_plot_data[1], label: "PITCH"},
|
||||
{data: RX_plot_data[2], label: "ROLL"},
|
||||
{data: RX_plot_data[3], label: "YAW"},
|
||||
{data: RX_plot_data[4], label: "AUX1"},
|
||||
{data: RX_plot_data[5], label: "AUX2"},
|
||||
{data: RX_plot_data[6], label: "AUX3"},
|
||||
{data: RX_plot_data[7], label: "AUX4"} ], RX_plot_options);
|
||||
|
||||
samples_i++;
|
||||
// UI Hooks
|
||||
$('.tunings input').change(function() {
|
||||
// if any of the fields changed, unlock update button
|
||||
$('a.update').addClass('active');
|
||||
});
|
||||
|
||||
// Request new data
|
||||
send_message(MSP_codes.MSP_STATUS, MSP_codes.MSP_STATUS);
|
||||
send_message(MSP_codes.MSP_RC, MSP_codes.MSP_RC);
|
||||
}, 50);
|
||||
// curves
|
||||
$('.tunings .throttle input').change(function() {
|
||||
var mid = parseFloat($('.tunings .throttle input[name="mid"]').val());
|
||||
var expo = parseFloat($('.tunings .throttle input[name="expo"]').val());
|
||||
|
||||
var throttle_curve = $('.throttle_curve canvas').get(0);
|
||||
var context = throttle_curve.getContext("2d");
|
||||
context.clearRect(0, 0, 220, 58);
|
||||
|
||||
// math magic by englishman
|
||||
var midx = 220 * mid;
|
||||
var midxl = midx * .5;
|
||||
var midxr = (((220 - midx) * .5) + midx);
|
||||
var midy = 58 - (midx * (58 / 220));
|
||||
var midyl = 58 - ((58 - midy) * .5 *(expo + 1));
|
||||
var midyr = (midy / 2) * (expo + 1);
|
||||
|
||||
context.beginPath();
|
||||
context.moveTo(0, 58);
|
||||
context.quadraticCurveTo(midxl, midyl, midx, midy);
|
||||
context.moveTo(midx, midy);
|
||||
context.quadraticCurveTo(midxr, midyr, 220, 0);
|
||||
|
||||
context.lineWidth = 2;
|
||||
context.stroke();
|
||||
});
|
||||
$('.tunings .throttle input').trigger('change'); // initial software trigger
|
||||
|
||||
$('.tunings .rate input').change(function() {
|
||||
var rate = parseFloat($('.tunings .rate input[name="rate"]').val());
|
||||
var expo = parseFloat($('.tunings .rate input[name="expo"]').val());
|
||||
|
||||
var pitch_roll_curve = $('.pitch_roll_curve canvas').get(0);
|
||||
var context = pitch_roll_curve.getContext("2d");
|
||||
context.clearRect(0, 0, 220, 58);
|
||||
|
||||
// math magic by englishman
|
||||
var ratey = 58 * rate;
|
||||
|
||||
context.beginPath();
|
||||
context.moveTo(0, 58);
|
||||
context.quadraticCurveTo(110, 58 - ((ratey / 2) * (1 - expo)), 220, 58 - ratey);
|
||||
context.lineWidth = 2;
|
||||
context.stroke();
|
||||
});
|
||||
$('.tunings .rate input').trigger('change'); // initial software trigger
|
||||
|
||||
$('a.update').click(function() {
|
||||
if ($(this).hasClass('active')) {
|
||||
// catch RC_tuning changes
|
||||
RC_tuning.throttle_MID = parseFloat($('.tunings .throttle input[name="mid"]').val());
|
||||
RC_tuning.throttle_EXPO = parseFloat($('.tunings .throttle input[name="expo"]').val());
|
||||
|
||||
RC_tuning.RC_RATE = parseFloat($('.tunings .rate input[name="rate"]').val());
|
||||
RC_tuning.RC_EXPO = parseFloat($('.tunings .rate input[name="expo"]').val());
|
||||
|
||||
var RC_tuning_buffer_out = new Array();
|
||||
RC_tuning_buffer_out[0] = parseInt(RC_tuning.RC_RATE * 100);
|
||||
RC_tuning_buffer_out[1] = parseInt(RC_tuning.RC_EXPO * 100);
|
||||
RC_tuning_buffer_out[2] = parseInt(RC_tuning.roll_pitch_rate * 100);
|
||||
RC_tuning_buffer_out[3] = parseInt(RC_tuning.yaw_rate * 100);
|
||||
RC_tuning_buffer_out[4] = parseInt(RC_tuning.dynamic_THR_PID * 100);
|
||||
RC_tuning_buffer_out[5] = parseInt(RC_tuning.throttle_MID * 100);
|
||||
RC_tuning_buffer_out[6] = parseInt(RC_tuning.throttle_EXPO * 100);
|
||||
|
||||
// Send over the RC_tuning changes
|
||||
send_message(MSP_codes.MSP_SET_RC_TUNING, RC_tuning_buffer_out);
|
||||
|
||||
// Save changes to EEPROM
|
||||
send_message(MSP_codes.MSP_EEPROM_WRITE, MSP_codes.MSP_EEPROM_WRITE);
|
||||
|
||||
// remove the active status
|
||||
$(this).removeClass('active');
|
||||
}
|
||||
});
|
||||
|
||||
// enable RC data pulling
|
||||
GUI.interval_add('receiver_poll', function() {
|
||||
// Update UI with latest data
|
||||
$('.tab-receiver meter:eq(0)').val(RC.throttle);
|
||||
$('.tab-receiver .value:eq(0)').html(RC.throttle);
|
||||
|
||||
$('.tab-receiver meter:eq(1)').val(RC.pitch);
|
||||
$('.tab-receiver .value:eq(1)').html(RC.pitch);
|
||||
|
||||
$('.tab-receiver meter:eq(2)').val(RC.roll);
|
||||
$('.tab-receiver .value:eq(2)').html(RC.roll);
|
||||
|
||||
$('.tab-receiver meter:eq(3)').val(RC.yaw);
|
||||
$('.tab-receiver .value:eq(3)').html(RC.yaw);
|
||||
|
||||
|
||||
$('.tab-receiver meter:eq(4)').val(RC.AUX1);
|
||||
$('.tab-receiver .value:eq(4)').html(RC.AUX1);
|
||||
|
||||
$('.tab-receiver meter:eq(5)').val(RC.AUX2);
|
||||
$('.tab-receiver .value:eq(5)').html(RC.AUX2);
|
||||
|
||||
$('.tab-receiver meter:eq(6)').val(RC.AUX3);
|
||||
$('.tab-receiver .value:eq(6)').html(RC.AUX3);
|
||||
|
||||
$('.tab-receiver meter:eq(7)').val(RC.AUX4);
|
||||
$('.tab-receiver .value:eq(7)').html(RC.AUX4);
|
||||
|
||||
// push latest data to the main array
|
||||
RX_plot_data[0].push([samples_i, RC.throttle]);
|
||||
RX_plot_data[1].push([samples_i, RC.pitch]);
|
||||
RX_plot_data[2].push([samples_i, RC.roll]);
|
||||
RX_plot_data[3].push([samples_i, RC.yaw]);
|
||||
RX_plot_data[4].push([samples_i, RC.AUX1]);
|
||||
RX_plot_data[5].push([samples_i, RC.AUX2]);
|
||||
RX_plot_data[6].push([samples_i, RC.AUX3]);
|
||||
RX_plot_data[7].push([samples_i, RC.AUX4]);
|
||||
|
||||
// Remove old data from array
|
||||
while (RX_plot_data[0].length > 300) {
|
||||
RX_plot_data[0].shift();
|
||||
RX_plot_data[1].shift();
|
||||
RX_plot_data[2].shift();
|
||||
RX_plot_data[3].shift();
|
||||
RX_plot_data[4].shift();
|
||||
RX_plot_data[5].shift();
|
||||
RX_plot_data[6].shift();
|
||||
RX_plot_data[7].shift();
|
||||
};
|
||||
|
||||
// redraw plot
|
||||
Flotr.draw(e_RX_plot, [
|
||||
{data: RX_plot_data[0], label: "THROTTLE"},
|
||||
{data: RX_plot_data[1], label: "PITCH"},
|
||||
{data: RX_plot_data[2], label: "ROLL"},
|
||||
{data: RX_plot_data[3], label: "YAW"},
|
||||
{data: RX_plot_data[4], label: "AUX1"},
|
||||
{data: RX_plot_data[5], label: "AUX2"},
|
||||
{data: RX_plot_data[6], label: "AUX3"},
|
||||
{data: RX_plot_data[7], label: "AUX4"} ], RX_plot_options);
|
||||
|
||||
samples_i++;
|
||||
|
||||
// Request new data
|
||||
send_message(MSP_codes.MSP_STATUS, MSP_codes.MSP_STATUS);
|
||||
send_message(MSP_codes.MSP_RC, MSP_codes.MSP_RC);
|
||||
}, 50);
|
||||
});
|
||||
}
|
Loading…
Reference in New Issue