Commit e5ef7b00 authored by Léo-Paul Géneau's avatar Léo-Paul Géneau 👾

software/js-drone: Set loop execution period as an instance parameter

parent 51fbcbb8
......@@ -18,6 +18,7 @@
* debug: Must be set to 'true' to send drone logs through OPC-UA
* multicastIp: IPv6 of the multicast group of the swarm
* flightScript: URL of user's script to execute to fly drone swarm
* loopPeriod: Minimal period (in milliseconds) between 2 executions of the flight script loop
* subscriberGuidList: List of computer id on which a GUI must be deployed
* subscriberNetIf: Subscriber network interface used for multicast traffic
......
......@@ -22,11 +22,11 @@ md5sum = 01425a1c77e79788e1948398b9136724
[instance-profile]
filename = instance.cfg.in
md5sum = 9c99b9b11e886eee41210e83be239a78
md5sum = 4733c63573e6812c124b356dc146ffcc
[instance-root]
filename = instance-root.cfg.jinja2
md5sum = 626a93a93c89e0fdcab5c25eec1343da
md5sum = 316f77c655540226f22dc7a6322624f1
[instance-subscriber]
filename = instance-subscriber.cfg.in
......@@ -34,7 +34,7 @@ md5sum = 8559dc8c95e9232060be6db3e0af4379
[main]
_update_hash_filename_ = drone-scripts/main.js.jinja2
md5sum = cfdb011b995e976b750fc2c707fbec78
md5sum = 60146505ec8ea50d881d033f63b6725c
[pubsub]
_update_hash_filename_ = drone-scripts/pubsub.js.jinja2
......
......@@ -49,7 +49,7 @@ import { err, exit, open, out } from "std";
pubsubWorker,
worker,
user_script = scriptArgs[1],
FPS = 200, // Minimum value to not overflow radio network
LOOP_EXECUTION_PERIOD = configuration.loopPeriod,
previous_timestamp,
can_update = false;
......@@ -154,23 +154,23 @@ import { err, exit, open, out } from "std";
var timestamp = Date.now(),
timeout;
if (can_update) {
if (FPS <= (timestamp - previous_timestamp)) {
if (LOOP_EXECUTION_PERIOD <= (timestamp - previous_timestamp)) {
// Expected timeout between every update
can_update = false;
worker.postMessage({
type: "update",
timestamp: timestamp
});
// Try to stick to the expected FPS
timeout = FPS - (timestamp - previous_timestamp - FPS);
// Try to stick to the expected LOOP_EXECUTION_PERIOD
timeout = LOOP_EXECUTION_PERIOD - (timestamp - previous_timestamp - LOOP_EXECUTION_PERIOD);
previous_timestamp = timestamp;
} else {
timeout = FPS - (timestamp - previous_timestamp);
timeout = LOOP_EXECUTION_PERIOD - (timestamp - previous_timestamp);
}
} else {
// If timeout occurs, but update is not yet finished
// wait a bit
timeout = FPS / 4;
timeout = LOOP_EXECUTION_PERIOD / 4;
}
// Ensure loop is not done with timeout < 1ms
setTimeout(loop, Math.max(1, timeout));
......@@ -182,12 +182,12 @@ import { err, exit, open, out } from "std";
pubsubWorker.postMessage({
action: "run",
id: configuration.id,
interval: FPS,
interval: LOOP_EXECUTION_PERIOD,
publish: configuration.isADrone
});
load();
} else if (type === 'loaded') {
previous_timestamp = -FPS;
previous_timestamp = -LOOP_EXECUTION_PERIOD;
can_update = true;
// Start the update loop
loop();
......
......@@ -62,6 +62,12 @@
"type": "string",
"default": "https://lab.nexedi.com/nexedi/flight-scripts/-/raw/v2.0/default.js"
},
"loopPeriod": {
"title": "Loop execution period",
"description": "Minimal period between 2 executions of flight script loop",
"type": "integer",
"default": 200
},
"subscriberGuidList": {
"title": "List of subscribers computer ID",
"description": "List of computer ID of swarms subscribers (entities able to listen/send OPC-UA messages from/to the swarm)",
......
......@@ -27,6 +27,7 @@ config-numberOfSubscribers = {{ dumps(len(parameter_dict['subscriberGuidList']))
config-id = {{ dumps(id) }}
config-isASimulation = {{ dumps(parameter_dict['isASimulation']) }}
config-debug = {{ dumps(parameter_dict['debug']) }}
config-loopPeriod = {{ dumps(parameter_dict['loopPeriod']) }}
{% if id < len(parameter_dict['droneGuidList']) -%}
{% do drone_id_list.append(id) %}
config-isADrone = {{ dumps(True) }}
......
......@@ -35,11 +35,12 @@ default-parameters =
"autopilotIp": "192.168.27.1",
"autopilotPort": 7909,
"debug": false,
"droneGuidList": [],
"droneNetIf": "eth0",
"flightScript": "https://lab.nexedi.com/nexedi/flight-scripts/-/raw/v2.0/default.js",
"isASimulation": false,
"loopPeriod": 200,
"multicastIp": "ff15::1111",
"droneGuidList": [],
"subscriberGuidList":[],
"subscriberNetIf": "eth0"
}
......@@ -54,6 +54,7 @@ MONITORED_ITEM_NB = 4
OPC_UA_PORT = 4840
OPC_UA_NET_IF = 'lo'
MCAST_GRP = 'ff15::1111'
LOOP_PERIOD = 200
# OPC UA Pub/Sub related constants
VERSION = 1
......@@ -280,6 +281,7 @@ class SubscriberTestCase(SlapOSInstanceTestCase):
'id': 1,
'debug': False,
'isASimulation': False,
'loopPeriod': LOOP_PERIOD,
'isADrone': False,
'flightScript': 'https://lab.nexedi.com/nexedi/flight-scripts/-/raw/v2.0/subscribe.js',
'netIf': OPC_UA_NET_IF,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment