1
0
Fork 0
mirror of https://github.com/iNavFlight/inav-configurator.git synced 2025-07-23 16:25:19 +03:00

adaptive intervals

This commit is contained in:
Pawel Spychalski (DzikuVx) 2017-01-25 21:13:58 +01:00
parent dc40b96238
commit 37738ac269
12 changed files with 87 additions and 9 deletions

View file

@ -77,6 +77,7 @@ GUI_control.prototype.tab_switch_cleanup = function (callback) {
MSP.callbacks_cleanup(); // we don't care about any old data that might or might not arrive MSP.callbacks_cleanup(); // we don't care about any old data that might or might not arrive
helper.interval.killAll(['global_data_refresh', 'msp-load-update']); helper.interval.killAll(['global_data_refresh', 'msp-load-update']);
helper.mspBalancedInterval.flush();
if (this.active_tab) { if (this.active_tab) {
TABS[this.active_tab].cleanup(callback); TABS[this.active_tab].cleanup(callback);

View file

@ -0,0 +1,72 @@
'use strict';
var helper = helper || {};
helper.mspBalancedInterval = (function (mspQueue, intervalHandler) {
var publicScope = {},
privateScope = {};
/**
* How often balancing should be executed [Hz]
* @type {number}
*/
privateScope.balancingFrequency = 0.5;
privateScope.intervals = [];
/**
*
* @param {string} name
* @param {number} requestedInterval
* @param {number} messagesInInterval
* @param {function} code
*/
publicScope.add = function (name, requestedInterval, messagesInInterval, code) {
privateScope.intervals.push({
name: name,
requestedInterval: requestedInterval,
messagesInInterval: messagesInInterval,
code: code
});
intervalHandler.add(name, code, mspQueue.getIntervalPrediction(requestedInterval, messagesInInterval));
};
/**
* Periodically executed balancing handler
*/
publicScope.balancer = function () {
var interval;
for (var i in privateScope.intervals) {
if (privateScope.intervals.hasOwnProperty(i)) {
interval = privateScope.intervals[i];
intervalHandler.remove(interval.name);
intervalHandler.add(
interval.name,
interval.code,
mspQueue.getIntervalPrediction(
interval.requestedInterval,
interval.messagesInInterval
)
);
}
}
};
/**
* Real interval cleaning happens win helper.interval.killAll method
* both methods have to be executed
*/
publicScope.flush = function () {
privateScope.intervals = [];
};
setInterval(publicScope.balancer, Math.round(1000 / privateScope.balancingFrequency));
return publicScope;
})(helper.mspQueue, helper.interval);

View file

@ -116,6 +116,8 @@ $(document).ready(function () {
helper.timeout.killAll(); helper.timeout.killAll();
helper.interval.killAll(['global_data_refresh', 'msp-load-update']); helper.interval.killAll(['global_data_refresh', 'msp-load-update']);
helper.mspBalancedInterval.flush();
GUI.tab_switch_cleanup(); GUI.tab_switch_cleanup();
GUI.tab_switch_in_progress = false; GUI.tab_switch_in_progress = false;
CONFIGURATOR.connectionValid = false; CONFIGURATOR.connectionValid = false;

View file

@ -249,14 +249,14 @@ helper.mspQueue = (function (serial, MSP) {
}; };
/** /**
* This method return periodic for polling interval that should populate queue in 75% or less * This method return periodic for polling interval that should populate queue in 80% or less
* @param {number} requestedInterval * @param {number} requestedInterval
* @param {number} messagesInInterval * @param {number} messagesInInterval
* @returns {number} * @returns {number}
*/ */
publicScope.getIntervalPrediction = function (requestedInterval, messagesInInterval) { publicScope.getIntervalPrediction = function (requestedInterval, messagesInInterval) {
var requestedRate = (1000 / requestedInterval) * messagesInInterval, var requestedRate = (1000 / requestedInterval) * messagesInInterval,
availableRate = (1000 / publicScope.getRoundtrip()) * 0.75; availableRate = (1000 / publicScope.getRoundtrip()) * 0.8;
if (requestedRate < availableRate) { if (requestedRate < availableRate) {
return requestedInterval; return requestedInterval;

View file

@ -97,6 +97,7 @@
<script type="text/javascript" src="./js/eventFrequencyAnalyzer.js"></script> <script type="text/javascript" src="./js/eventFrequencyAnalyzer.js"></script>
<script type="text/javascript" src="./js/periodicStatusUpdater.js"></script> <script type="text/javascript" src="./js/periodicStatusUpdater.js"></script>
<script type="text/javascript" src="./js/serial_queue.js"></script> <script type="text/javascript" src="./js/serial_queue.js"></script>
<script type="text/javascript" src="./js/msp_balanced_interval.js"></script>
<title></title> <title></title>
</head> </head>
<body> <body>

View file

@ -274,7 +274,7 @@ TABS.adjustments.initialize = function (callback) {
update_ui(); update_ui();
// enable data pulling // enable data pulling
helper.interval.add('aux_data_pull', get_rc_data, helper.mspQueue.getIntervalPrediction(50, 1)); helper.mspBalancedInterval.add('aux_data_pull', 50, 1, get_rc_data);
GUI.content_ready(callback); GUI.content_ready(callback);
} }

View file

@ -293,7 +293,7 @@ TABS.auxiliary.initialize = function (callback) {
update_ui(); update_ui();
// enable data pulling // enable data pulling
helper.interval.add('aux_data_pull', get_rc_data, helper.mspQueue.getIntervalPrediction(50, 1)); helper.mspBalancedInterval.add('aux_data_pull', 50, 1, get_rc_data);
GUI.content_ready(callback); GUI.content_ready(callback);
} }

View file

@ -103,7 +103,7 @@ TABS.gps.initialize = function (callback) {
* enable data pulling * enable data pulling
* GPS is usually refreshed at 5Hz, there is no reason to pull it much more often, really... * GPS is usually refreshed at 5Hz, there is no reason to pull it much more often, really...
*/ */
helper.interval.add('gps_pull', function gps_update() { helper.mspBalancedInterval.add('gps_pull', 200, 3, function gps_update() {
// avoid usage of the GPS commands until a GPS sensor is detected for targets that are compiled without GPS support. // avoid usage of the GPS commands until a GPS sensor is detected for targets that are compiled without GPS support.
if (!have_sensor(CONFIG.activeSensors, 'gps')) { if (!have_sensor(CONFIG.activeSensors, 'gps')) {
//return; //return;
@ -114,7 +114,7 @@ TABS.gps.initialize = function (callback) {
} }
get_raw_gps_data(); get_raw_gps_data();
}, helper.mspQueue.getIntervalPrediction(200, 3), true); });
//check for internet connection on load //check for internet connection on load
if (navigator.onLine) { if (navigator.onLine) {

View file

@ -88,6 +88,7 @@ TABS.logging.initialize = function (callback) {
} }
} else { } else {
helper.interval.killAll(['global_data_refresh', 'msp-load-update']); helper.interval.killAll(['global_data_refresh', 'msp-load-update']);
helper.mspBalancedInterval.flush();
$('.speed').prop('disabled', false); $('.speed').prop('disabled', false);
$(this).text(chrome.i18n.getMessage('loggingStart')); $(this).text(chrome.i18n.getMessage('loggingStart'));

View file

@ -236,6 +236,7 @@ TABS.motors.initialize = function (callback) {
// timer initialization // timer initialization
helper.interval.killAll(['motor_and_status_pull', 'global_data_refresh', 'msp-load-update']); helper.interval.killAll(['motor_and_status_pull', 'global_data_refresh', 'msp-load-update']);
helper.mspBalancedInterval.flush();
helper.interval.add('IMU_pull', function imu_data_pull() { helper.interval.add('IMU_pull', function imu_data_pull() {

View file

@ -460,7 +460,7 @@ TABS.receiver.initialize = function (callback) {
samples++; samples++;
} }
helper.interval.add('receiver_pull', get_rc_data, helper.mspQueue.getIntervalPrediction(35, 1), true); helper.mspBalancedInterval.add('receiver_pull', 35, 1, get_rc_data);
GUI.content_ready(callback); GUI.content_ready(callback);
} }

View file

@ -179,8 +179,8 @@ TABS.setup.initialize = function (callback) {
}); });
} }
helper.interval.add('setup_data_pull_fast', get_fast_data, helper.mspQueue.getIntervalPrediction(40, 1), true); // 25 fps helper.mspBalancedInterval.add('setup_data_pull_fast', 40, 1, get_fast_data);
helper.interval.add('setup_data_pull_slow', get_slow_data, helper.mspQueue.getIntervalPrediction(250, 1), true); // 4 fps helper.mspBalancedInterval.add('setup_data_pull_slow', 250, 1, get_slow_data);
helper.interval.add('gui_analog_update', function () { helper.interval.add('gui_analog_update', function () {
bat_voltage_e.text(chrome.i18n.getMessage('initialSetupBatteryValue', [ANALOG.voltage])); bat_voltage_e.text(chrome.i18n.getMessage('initialSetupBatteryValue', [ANALOG.voltage]));