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.
inav-configurator/tabs/calibration.js

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();
};