Commit 28e45b22 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 b7780cc1
......@@ -22,11 +22,11 @@ md5sum = 01425a1c77e79788e1948398b9136724
[instance-profile]
filename = instance.cfg.in
md5sum = 1fc2d0375dad559fe2dca4822bfa6f69
md5sum = 0a8bde4a885bd99ed9e591ef970bbaf4
[instance-root]
filename = instance-root.cfg.jinja
md5sum = 08cbb1ffc6625e02046f7e7185ff70ac
md5sum = e22626f4465f9e696eb1b84900a150ff
[instance-subscriber]
filename = instance-subscriber.cfg.in
......@@ -34,7 +34,7 @@ md5sum = 8559dc8c95e9232060be6db3e0af4379
[main]
_update_hash_filename_ = drone-scripts/main.js.jinja
md5sum = 089e84ebf7f0467c81728d8a69996fcf
md5sum = 85135842e42a1f48a474467508723c0c
[pubsub]
_update_hash_filename_ = drone-scripts/pubsub.js.jinja
......
......@@ -61,7 +61,7 @@ import { err, exit, open, out } from "std";
tail_pid,
worker,
user_script = scriptArgs[1],
FPS = 200, // Minimum value to not overflow radio network
LOOP_EXECUTION_PERIOD = configuration.loopPeriod,
previous_timestamp,
can_update = false;
......@@ -177,23 +177,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));
......@@ -205,12 +205,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();
......
......@@ -56,6 +56,12 @@
"type": "string",
"default": "https://lab.nexedi.com/nexedi/flight-scripts/raw/master/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)",
......
......@@ -26,6 +26,7 @@ config-numberOfDrones = {{ dumps(len(parameter_dict['droneGuidList'])) }}
config-numberOfSubscribers = {{ dumps(len(parameter_dict['subscriberGuidList'])) }}
config-id = {{ dumps(id) }}
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,10 +35,11 @@ default-parameters =
"autopilotIp": "192.168.27.1",
"autopilotPort": 7909,
"debug": false,
"droneGuidList": [],
"droneNetIf": "eth0",
"flightScript": "https://lab.nexedi.com/nexedi/flight-scripts/raw/master/default.js",
"loopPeriod": 200,
"multicastIp": "ff15::1111",
"droneGuidList": [],
"subscriberGuidList":[],
"subscriberNetIf": "eth0"
}
......@@ -52,6 +52,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
......@@ -262,6 +263,7 @@ class SubscriberTestCase(SlapOSInstanceTestCase):
'numberOfSubscribers': 1,
'id': 1,
'isADrone': False,
'loopPeriod': LOOP_PERIOD,
'flightScript': 'https://lab.nexedi.com/nexedi/flight-scripts/raw/api_update/subscribe.js',
'netIf': OPC_UA_NET_IF,
'multicastIp': MCAST_GRP
......@@ -302,7 +304,7 @@ class SubscriberTestCase(SlapOSInstanceTestCase):
)),
)
self.send_ua_networkMessage()
time.sleep(0.1)
time.sleep(100)
self.assertEqual(ws.recv_frame().data, MESSAGE_CONTENT.replace(b'\\', b''))
self.assertEqual(
ws.recv_frame().data,
......
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