You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
340 lines
11 KiB
JavaScript
340 lines
11 KiB
JavaScript
'use strict';
|
|
|
|
const path = require('path');
|
|
|
|
const MSPChainerClass = require('./../js/msp/MSPchainer');
|
|
const mspHelper = require('./../js/msp/MSPHelper');
|
|
const MSPCodes = require('./../js/msp/MSPCodes');
|
|
const MSP = require('./../js/msp');
|
|
const { GUI, TABS } = require('./../js/gui');
|
|
const FC = require('./../js/fc');
|
|
const timeout = require('./../js/timeouts');
|
|
const interval = require('./../js/intervals');
|
|
const i18n = require('./../js/localization');
|
|
const jBox = require('./../js/libraries/jBox/jBox.min');
|
|
|
|
TABS.calibration = {};
|
|
|
|
TABS.calibration.model = (function () {
|
|
var publicScope = {},
|
|
privateScope = {};
|
|
|
|
privateScope.step = null;
|
|
|
|
publicScope.next = function () {
|
|
|
|
if (privateScope.step === null) {
|
|
privateScope.step = 1;
|
|
} else {
|
|
var count = 0;
|
|
for (var i = 0; i < 6; i++) {
|
|
if (FC.CALIBRATION_DATA.acc['Pos' + i] === 1) {
|
|
count++;
|
|
}
|
|
}
|
|
|
|
privateScope.step = count;
|
|
}
|
|
|
|
console.log(privateScope.step);
|
|
|
|
if (privateScope.step > 5) {
|
|
privateScope.step = null;
|
|
}
|
|
|
|
return privateScope.step;
|
|
};
|
|
|
|
publicScope.getStep = function () {
|
|
return privateScope.step;
|
|
};
|
|
|
|
return publicScope;
|
|
})();
|
|
|
|
TABS.calibration.initialize = function (callback) {
|
|
|
|
var loadChainer = new MSPChainerClass(),
|
|
saveChainer = new MSPChainerClass(),
|
|
modalStart,
|
|
modalStop,
|
|
modalProcessing;
|
|
|
|
if (GUI.active_tab != 'calibration') {
|
|
GUI.active_tab = 'calibration';
|
|
}
|
|
loadChainer.setChain([
|
|
mspHelper.queryFcStatus,
|
|
mspHelper.loadSensorConfig,
|
|
mspHelper.loadCalibrationData
|
|
]);
|
|
loadChainer.setExitPoint(loadHtml);
|
|
loadChainer.execute();
|
|
|
|
saveChainer.setChain([
|
|
mspHelper.saveCalibrationData,
|
|
mspHelper.saveToEeprom
|
|
]);
|
|
saveChainer.setExitPoint(reboot);
|
|
|
|
function reboot() {
|
|
//noinspection JSUnresolvedVariable
|
|
GUI.log(i18n.getMessage('configurationEepromSaved'));
|
|
|
|
GUI.tab_switch_cleanup(function() {
|
|
MSP.send_message(MSPCodes.MSP_SET_REBOOT, false, false, reinitialize);
|
|
});
|
|
}
|
|
|
|
function reinitialize() {
|
|
//noinspection JSUnresolvedVariable
|
|
GUI.log(i18n.getMessage('deviceRebooting'));
|
|
GUI.handleReconnect($('.tab_calibration a'));
|
|
}
|
|
|
|
function loadHtml() {
|
|
GUI.load(path.join(__dirname, "calibration.html"), processHtml);
|
|
}
|
|
|
|
function updateCalibrationSteps() {
|
|
for (var i = 0; i < 6; i++) {
|
|
var $element = $('[data-step="' + (i + 1) + '"]');
|
|
|
|
if (FC.CALIBRATION_DATA.acc['Pos' + i] === 0) {
|
|
$element.removeClass('finished').removeClass('active');
|
|
} else {
|
|
$element.addClass("finished").removeClass('active');
|
|
}
|
|
}
|
|
}
|
|
|
|
function updateSensorData() {
|
|
var pos = ['X', 'Y', 'Z'];
|
|
pos.forEach(function (item) {
|
|
$('[name=accGain' + item + ']').val(FC.CALIBRATION_DATA.accGain[item]);
|
|
$('[name=accZero' + item + ']').val(FC.CALIBRATION_DATA.accZero[item]);
|
|
$('[name=Mag' + item + ']').val(FC.CALIBRATION_DATA.magZero[item]);
|
|
$('[name=MagGain' + item + ']').val(FC.CALIBRATION_DATA.magGain[item]);
|
|
});
|
|
$('[name=OpflowScale]').val(FC.CALIBRATION_DATA.opflow.Scale);
|
|
updateCalibrationSteps();
|
|
}
|
|
|
|
function checkFinishAccCalibrate() {
|
|
if (TABS.calibration.model.next() === null) {
|
|
modalStop = new jBox('Modal', {
|
|
width: 400,
|
|
height: 200,
|
|
animation: false,
|
|
closeOnClick: false,
|
|
closeOnEsc: false,
|
|
content: $('#modal-acc-calibration-stop')
|
|
}).open();
|
|
}
|
|
updateSensorData();
|
|
}
|
|
|
|
function calibrateNew() {
|
|
var newStep = null,
|
|
$button = $(this);
|
|
|
|
if (TABS.calibration.model.getStep() === null) {
|
|
for (var i = 0; i < 6; i++) {
|
|
if (FC.CALIBRATION_DATA.acc['Pos' + i] === 1) {
|
|
FC.CALIBRATION_DATA.acc['Pos' + i] = 0;
|
|
}
|
|
}
|
|
updateCalibrationSteps();
|
|
modalStart = new jBox('Modal', {
|
|
width: 400,
|
|
height: 200,
|
|
animation: false,
|
|
closeOnClick: false,
|
|
closeOnEsc: false,
|
|
content: $('#modal-acc-calibration-start')
|
|
}).open();
|
|
} else {
|
|
newStep = TABS.calibration.model.next();
|
|
}
|
|
|
|
/*
|
|
* Communication
|
|
*/
|
|
if (newStep !== null) {
|
|
$button.addClass('disabled');
|
|
|
|
modalProcessing = new jBox('Modal', {
|
|
width: 400,
|
|
height: 120,
|
|
animation: false,
|
|
closeOnClick: false,
|
|
closeOnEsc: false,
|
|
content: $('#modal-acc-processing')
|
|
}).open();
|
|
|
|
MSP.send_message(MSPCodes.MSP_ACC_CALIBRATION, false, false, function () {
|
|
GUI.log(i18n.getMessage('initialSetupAccelCalibStarted'));
|
|
});
|
|
|
|
timeout.add('acc_calibration_timeout', function () {
|
|
$button.removeClass('disabled');
|
|
|
|
modalProcessing.close();
|
|
MSP.send_message(MSPCodes.MSP_CALIBRATION_DATA, false, false, checkFinishAccCalibrate);
|
|
GUI.log(i18n.getMessage('initialSetupAccelCalibEnded'));
|
|
}, 2000);
|
|
}
|
|
}
|
|
|
|
function setupCalibrationButton(callback) {
|
|
if (FC.getAccelerometerCalibrated()) {
|
|
$('#calibrate-start-button').html(i18n.getMessage("AccResetBtn"));
|
|
$('#calibrate-start-button').prop("title", i18n.getMessage("AccResetBtn"));
|
|
$('#calibrate-start-button').removeClass("calibrate");
|
|
$('#calibrate-start-button').addClass("resetCalibration");
|
|
} else {
|
|
$('#calibrate-start-button').html(i18n.getMessage("AccBtn"));
|
|
$('#calibrate-start-button').prop("title", i18n.getMessage("AccBtn"));
|
|
$('#calibrate-start-button').addClass("calibrate");
|
|
$('#calibrate-start-button').removeClass("resetCalibration");
|
|
}
|
|
|
|
if (callback) callback();
|
|
}
|
|
|
|
function actionCalibrateButton(callback) {
|
|
if ($('#calibrate-start-button').hasClass("resetCalibration")) {
|
|
resetAccCalibration();
|
|
} else {
|
|
calibrateNew();
|
|
}
|
|
|
|
|
|
}
|
|
|
|
function resetAccCalibration() {
|
|
var pos = ['X', 'Y', 'Z'];
|
|
pos.forEach(function (item) {
|
|
FC.CALIBRATION_DATA.accGain[item] = 4096;
|
|
FC.CALIBRATION_DATA.accZero[item] = 0;
|
|
});
|
|
|
|
saveChainer.execute();
|
|
}
|
|
|
|
function processHtml() {
|
|
$('#calibrateButtonSave').on('click', function () {
|
|
FC.CALIBRATION_DATA.opflow.Scale = parseFloat($('[name=OpflowScale]').val());
|
|
saveChainer.execute();
|
|
});
|
|
|
|
if (FC.SENSOR_CONFIG.magnetometer === 0) {
|
|
//Comment for test
|
|
$('#mag_btn, #mag-calibrated-data').css('pointer-events', 'none').css('opacity', '0.4');
|
|
}
|
|
|
|
if (FC.SENSOR_CONFIG.opflow === 0) {
|
|
//Comment for test
|
|
$('#opflow_btn, #opflow-calibrated-data').css('pointer-events', 'none').css('opacity', '0.4');
|
|
}
|
|
|
|
$('#mag_btn').on('click', function () {
|
|
MSP.send_message(MSPCodes.MSP_MAG_CALIBRATION, false, false, function () {
|
|
GUI.log(i18n.getMessage('initialSetupMagCalibStarted'));
|
|
});
|
|
|
|
var button = $(this);
|
|
|
|
$(button).addClass('disabled');
|
|
|
|
let modalProcessing = new jBox('Modal', {
|
|
width: 400,
|
|
height: 120,
|
|
animation: false,
|
|
closeOnClick: false,
|
|
closeOnEsc: false,
|
|
content: $('#modal-compass-processing').clone()
|
|
}).open();
|
|
|
|
var countdown = 30;
|
|
interval.add('compass_calibration_interval', function () {
|
|
countdown--;
|
|
if (countdown === 0) {
|
|
setTimeout(function () {
|
|
$(button).removeClass('disabled');
|
|
|
|
modalProcessing.close();
|
|
GUI.log(i18n.getMessage('initialSetupMagCalibEnded'));
|
|
|
|
MSP.send_message(MSPCodes.MSP_CALIBRATION_DATA, false, false, updateSensorData);
|
|
interval.remove('compass_calibration_interval');
|
|
|
|
//Cleanup
|
|
//delete modalProcessing;
|
|
$('.jBox-wrapper').remove();
|
|
}, 1000);
|
|
} else {
|
|
modalProcessing.content.find('.modal-compass-countdown').text(countdown);
|
|
}
|
|
|
|
}, 1000);
|
|
});
|
|
|
|
$('#opflow_btn').on('click', function () {
|
|
MSP.send_message(MSPCodes.MSP2_INAV_OPFLOW_CALIBRATION, false, false, function () {
|
|
GUI.log(i18n.getMessage('initialSetupOpflowCalibStarted'));
|
|
});
|
|
|
|
var button = $(this);
|
|
|
|
$(button).addClass('disabled');
|
|
|
|
modalProcessing = new jBox('Modal', {
|
|
width: 400,
|
|
height: 120,
|
|
animation: false,
|
|
closeOnClick: false,
|
|
closeOnEsc: false,
|
|
content: $('#modal-opflow-processing')
|
|
}).open();
|
|
|
|
var countdown = 30;
|
|
interval.add('opflow_calibration_interval', function () {
|
|
countdown--;
|
|
$('#modal-opflow-countdown').text(countdown);
|
|
if (countdown === 0) {
|
|
$(button).removeClass('disabled');
|
|
|
|
modalProcessing.close();
|
|
GUI.log(i18n.getMessage('initialSetupOpflowCalibEnded'));
|
|
MSP.send_message(MSPCodes.MSP_CALIBRATION_DATA, false, false, updateSensorData);
|
|
interval.remove('opflow_calibration_interval');
|
|
}
|
|
}, 1000);
|
|
});
|
|
|
|
$('#modal-start-button').on('click', function () {
|
|
modalStart.close();
|
|
TABS.calibration.model.next();
|
|
});
|
|
|
|
$('#modal-stop-button').on('click', function () {
|
|
modalStop.close();
|
|
});
|
|
|
|
// translate to user-selected language
|
|
i18n.localize();
|
|
|
|
setupCalibrationButton();
|
|
$('#calibrate-start-button').on('click', actionCalibrateButton);
|
|
|
|
MSP.send_message(MSPCodes.MSP_CALIBRATION_DATA, false, false, updateSensorData);
|
|
|
|
GUI.content_ready(callback);
|
|
}
|
|
};
|
|
|
|
TABS.calibration.cleanup = function (callback) {
|
|
if (callback) callback();
|
|
};
|