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

component/qjs-wrapper: v↑ qjs-wrapper (1.3 -> 2.0)

parent cf006ece
...@@ -4,12 +4,18 @@ extends = ...@@ -4,12 +4,18 @@ extends =
../curl/buildout.cfg ../curl/buildout.cfg
../git/buildout.cfg ../git/buildout.cfg
../jsoncpp/buildout.cfg ../jsoncpp/buildout.cfg
../qjs-wrapper/buildout.hash.cfg
../tinyxml2/buildout.cfg ../tinyxml2/buildout.cfg
../zlib/buildout.cfg ../zlib/buildout.cfg
parts = parts =
mavsdk mavsdk
[autopilot-wrapper-header]
recipe = slapos.recipe.build:download
shared = true
url = ${:_profile_base_location_}/../qjs-wrapper/${:filename}
[c-astral-headers] [c-astral-headers]
recipe = slapos.recipe.build:gitclone recipe = slapos.recipe.build:gitclone
repository = https://lab.nexedi.com/nexedi/c-astral-c-library repository = https://lab.nexedi.com/nexedi/c-astral-c-library
...@@ -57,3 +63,12 @@ environment = ...@@ -57,3 +63,12 @@ environment =
CMAKE_CFLAGS=-I${tinyxml2:location}/include CMAKE_CFLAGS=-I${tinyxml2:location}/include
CMAKE_LIBRARY_PATH=${curl:location}/lib:${jsoncpp:location}/lib:${tinyxml2:location}/lib:${zlib:location}/lib CMAKE_LIBRARY_PATH=${curl:location}/lib:${jsoncpp:location}/lib:${tinyxml2:location}/lib:${zlib:location}/lib
[mavsdk-wrapper]
recipe = slapos.recipe.cmmi
configure-command = true
url = https://lab.nexedi.com/nexedi/mavsdk-wrapper/-/archive/update_set_target_coordinates/mavsdk-wrapper-update_set_target_coordinates.tar.gz
md5sum = 4e5d53ca3c12f6019048a2e3b6351fe2
environment =
CPLUS_INCLUDE_PATH=${autopilot-wrapper-header:location}:${mavsdk:location}/include:${mavsdk:location}/include/mavsdk
LDFLAGS=-L${mavsdk:location}/lib -Wl,-rpath=${mavsdk:location}/lib
#ifndef __AUTOPILOT_H__
#define __AUTOPILOT_H__
#ifndef DLL_PUBLIC
#define DLL_PUBLIC __attribute__ ((visibility ("default")))
#endif
/*
* 0. latitude (double, degrees)
* 1. longitude (double, degrees)
* 2. absolute altitude (double, meters)
* 3. relative altitude (double, meters)
*/
#define POSITION_ARRAY_SIZE 4
/*
* 0. yaw angle (float, degrees)
* 1. air speed (float, m/s)
* 2. climb rate (float, m/s)
*/
#define SPEED_ARRAY_SIZE 3
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
// Connexion management functions
DLL_PUBLIC int start(const char * ip, int port, const char * log_file, int timeout);
DLL_PUBLIC int stop();
DLL_PUBLIC int reboot(void);
// Flight state management functions
DLL_PUBLIC int arm(void);
DLL_PUBLIC int takeOff(void);
DLL_PUBLIC int takeOffAndWait(void);
DLL_PUBLIC int triggerParachute(void);
// Flight management functions
DLL_PUBLIC int loiter(double la, double lo, float a, float radius);
DLL_PUBLIC int setAirspeed(float airspeed);
DLL_PUBLIC int setTargetCoordinates(double la, double lo, float a);
// Information functions
DLL_PUBLIC float getAltitude(void);
DLL_PUBLIC float getAltitudeRel(void);
DLL_PUBLIC float getInitialAltitude(void);
DLL_PUBLIC double getInitialLatitude(void);
DLL_PUBLIC double getInitialLongitude(void);
DLL_PUBLIC double getLatitude(void);
DLL_PUBLIC double getLongitude(void);
DLL_PUBLIC double *getPositionArray(void);
DLL_PUBLIC float *getSpeedArray(void);
DLL_PUBLIC double getTakeOffAltitude(void);
DLL_PUBLIC float getYaw(void);
DLL_PUBLIC float getSpeed(void);
DLL_PUBLIC float getClimbRate(void);
DLL_PUBLIC int healthAllOk(void);
#ifdef __cplusplus
}
#endif
#endif /* __AUTOPILOT_H__ */
...@@ -9,9 +9,8 @@ parts = qjs-wrapper ...@@ -9,9 +9,8 @@ parts = qjs-wrapper
[qjs-wrapper] [qjs-wrapper]
recipe = slapos.recipe.cmmi recipe = slapos.recipe.cmmi
configure-command = true configure-command = true
url = https://lab.nexedi.com/nexedi/qjs-wrapper/-/archive/v1.3/qjs-wrapper-v1.3.tar.gz url = https://lab.nexedi.com/nexedi/qjs-wrapper/-/archive/update_settarget/qjs-wrapper-update_settarget.tar.gz
md5sum = 5f63356c6a10bf227e2641ea4f78c7a2 md5sum = 7f69d896b3e27962ae26c5c7888f07bc
environment = environment =
C_INCLUDE_PATH=include:${open62541:location}/include:${open62541:location}/deps:${open62541:location}/src/pubsub:${quickjs:location}/include C_INCLUDE_PATH=include:${open62541:location}/include:${open62541:location}/deps:${open62541:location}/src/pubsub:${quickjs:location}/include:${autopilot-wrapper-header:location}
CPLUS_INCLUDE_PATH=include:${mavsdk:location}/include:${mavsdk:location}/include/mavsdk LDFLAGS=-L${open62541:location}/lib -Wl,-rpath=${open62541:location}/lib -L${mavsdk-wrapper:location}/lib -Wl,-rpath=${mavsdk-wrapper:location}/lib
LDFLAGS=-L${open62541:location}/lib -Wl,-rpath=${open62541:location}/lib -L${mavsdk:location}/lib -Wl,-rpath=${mavsdk:location}/lib
# THIS IS NOT A BUILDOUT FILE, despite purposedly using a compatible syntax.
# The only allowed lines here are (regexes):
# - "^#" comments, copied verbatim
# - "^[" section beginings, copied verbatim
# - lines containing an "=" sign which must fit in the following categorie.
# - "^\s*filename\s*=\s*path\s*$" where "path" is relative to this file
# Copied verbatim.
# - "^\s*hashtype\s*=.*" where "hashtype" is one of the values supported
# by the re-generation script.
# Re-generated.
# - other lines are copied verbatim
# Substitution (${...:...}), extension ([buildout] extends = ...) and
# section inheritance (< = ...) are NOT supported (but you should really
# not need these here).
[autopilot-wrapper-header]
filename = autopilot_wrapper.h
md5sum = facfc36f1ed4672d78f4e345800f02a6
...@@ -18,7 +18,7 @@ md5sum = 360b58007c25727b7bd8a9154d5cafd4 ...@@ -18,7 +18,7 @@ md5sum = 360b58007c25727b7bd8a9154d5cafd4
[instance-default] [instance-default]
filename = instance-default.cfg filename = instance-default.cfg
md5sum = 903939308701b11b1ff751784a9be110 md5sum = 696ec3cc5c7bcda336b9bb68ef1555bd
[instance-drone] [instance-drone]
filename = instance-drone.cfg filename = instance-drone.cfg
...@@ -26,7 +26,7 @@ md5sum = 1ff50063f5a54712a0bc0ff38fa74630 ...@@ -26,7 +26,7 @@ md5sum = 1ff50063f5a54712a0bc0ff38fa74630
[main] [main]
filename = main.js filename = main.js
md5sum = 21217f85fdab2f6307e3edc6ba74d0b6 md5sum = 81e692d3edcfe666bb4d7505b3375d8d
[pubsub] [pubsub]
filename = pubsub.js filename = pubsub.js
...@@ -34,4 +34,4 @@ md5sum = 1555496ad591a31a845f33488d5c335d ...@@ -34,4 +34,4 @@ md5sum = 1555496ad591a31a845f33488d5c335d
[worker] [worker]
filename = worker.js filename = worker.js
md5sum = 9167a47913658d395a328f67b5a80d36 md5sum = f201266b4607ca08d647886afd1e5c96
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
{% set drone_guid_list = slapparameter_dict.get('droneGuidList', []) -%} {% set drone_guid_list = slapparameter_dict.get('droneGuidList', []) -%}
{% set subscriber_guid_list = slapparameter_dict.get('subscriberGuidList', []) -%} {% set subscriber_guid_list = slapparameter_dict.get('subscriberGuidList', []) -%}
{% set guid_list = drone_guid_list + subscriber_guid_list -%} {% set guid_list = drone_guid_list + subscriber_guid_list -%}
{% set nb_peer = len(guid_list) -%}
{% set drone_id_list = [] -%} {% set drone_id_list = [] -%}
{% set subscriber_id_list = [] -%} {% set subscriber_id_list = [] -%}
...@@ -27,7 +26,8 @@ return = instance-path ...@@ -27,7 +26,8 @@ return = instance-path
sla-computer_guid = {{ guid }} sla-computer_guid = {{ guid }}
config-autopilotIp = {{ autopilot_ip }} config-autopilotIp = {{ autopilot_ip }}
config-autopilotPort = {{ dumps(autopilot_port) }} config-autopilotPort = {{ dumps(autopilot_port) }}
config-numberOfPeers = {{ dumps(nb_peer) }} config-numberOfDrone = {{ dumps(len(drone_guid_list)) }}
config-numberOfSubscriber = {{ dumps(len(subscriber_guid_list)) }}
config-id = {{ dumps(id) }} config-id = {{ dumps(id) }}
config-isASimulation = {{ dumps(is_a_simulation) }} config-isASimulation = {{ dumps(is_a_simulation) }}
{% if guid in drone_guid_list -%} {% if guid in drone_guid_list -%}
......
...@@ -14,9 +14,14 @@ ...@@ -14,9 +14,14 @@
"description": "Port on which autopilot service is running.", "description": "Port on which autopilot service is running.",
"type": "integer" "type": "integer"
}, },
"numberOfPeers": { "numberOfDrone": {
"title": "Number of Peers", "title": "Number of drone",
"description": "Number of drones and subscribers in the swarm", "description": "Number of drone in the swarm",
"type": "integer"
},
"numberOfSubscriber": {
"title": "Number of subscriber",
"description": "Number of subscriber of the swarm",
"type": "integer" "type": "integer"
}, },
"id": { "id": {
......
...@@ -36,10 +36,10 @@ import { open, exit } from "std"; ...@@ -36,10 +36,10 @@ import { open, exit } from "std";
// to prevent it to finish (and so, exit the quickjs process) // to prevent it to finish (and so, exit the quickjs process)
worker = new Worker("{{ worker_script }}"); worker = new Worker("{{ worker_script }}");
function quit(is_a_drone, shutdown, exit_code) { function quit(is_a_drone, exit_code) {
stopPubsub(); stopPubsub();
if (is_a_drone) { if (is_a_drone) {
stop(shutdown); stop();
} }
exit(exit_code); exit(exit_code);
} }
...@@ -141,7 +141,7 @@ import { open, exit } from "std"; ...@@ -141,7 +141,7 @@ import { open, exit } from "std";
can_update = true; can_update = true;
} else if (type === 'exited') { } else if (type === 'exited') {
worker.onmessage = null; worker.onmessage = null;
quit(configuration.isADrone, !configuration.isASimulation, e.data.exit); quit(configuration.isADrone, e.data.exit);
} else { } else {
console.log('Unsupported message type', type); console.log('Unsupported message type', type);
quit(configuration.isADrone, !configuration.isASimulation, 1); quit(configuration.isADrone, !configuration.isASimulation, 1);
......
...@@ -5,16 +5,18 @@ extends = ...@@ -5,16 +5,18 @@ extends =
[sqdr-source] [sqdr-source]
recipe = slapos.recipe.build:gitclone recipe = slapos.recipe.build:gitclone
repository = https://lab.nexedi.com/slaposdrone/squadrone.git repository = https://lab.nexedi.com/slaposdrone/squadrone.git
revision = v1.0 revision = de17993
git-executable = ${git:location}/bin/git git-executable = ${git:location}/bin/git
[qjs-wrapper] [sqdr-wrapper]
recipe = slapos.recipe.cmmi recipe = slapos.recipe.cmmi
configure-command = true configure-command = true
url =
path = ${sqdr-source:location} path = ${sqdr-source:location}
md5sum =
environment = environment =
C_INCLUDE_PATH=include:${open62541:location}/include:${open62541:location}/deps:${open62541:location}/src/pubsub:${quickjs:location}/include CPLUS_INCLUDE_PATH=include:${autopilot-wrapper-header:location}
CPLUS_INCLUDE_PATH=include LDFLAGS=-L${sqdr-source:location}/lib -Wl,-rpath=${sqdr-source:location}/lib
LDFLAGS=-L${open62541:location}/lib -Wl,-rpath=${open62541:location}/lib -L${sqdr-source:location}/lib -Wl,-rpath=${sqdr-source:location}/lib
[qjs-wrapper]
environment =
C_INCLUDE_PATH=include:${open62541:location}/include:${open62541:location}/deps:${open62541:location}/src/pubsub:${quickjs:location}/include:${autopilot-wrapper-header:location}
LDFLAGS=-L${open62541:location}/lib -Wl,-rpath=${open62541:location}/lib -L${sqdr-wrapper:location}/lib -Wl,-rpath=${sqdr-wrapper:location}/lib
...@@ -256,13 +256,14 @@ class JSDroneTestCase(SlapOSInstanceTestCase): ...@@ -256,13 +256,14 @@ class JSDroneTestCase(SlapOSInstanceTestCase):
{ {
'autopilotIp': '192.168.27.1', 'autopilotIp': '192.168.27.1',
'autopilotPort': 7909, 'autopilotPort': 7909,
'numberOfDrone': 0,
'numberOfSubscriber': 1,
'id': 0, 'id': 0,
'isASimulation': False, 'isASimulation': False,
'isADrone': False, 'isADrone': False,
'flightScript': 'https://lab.nexedi.com/nexedi/flight-scripts/raw/master/subscribe.js', 'flightScript': 'https://lab.nexedi.com/nexedi/flight-scripts/raw/master/subscribe.js',
'multicastIp': MCAST_GRP, 'netIf': OPC_UA_NET_IF,
'numberOfPeers': 1, 'multicastIp': MCAST_GRP
'netIf': OPC_UA_NET_IF
} }
) )
......
...@@ -32,7 +32,9 @@ import { Worker } from "os"; ...@@ -32,7 +32,9 @@ import { Worker } from "os";
var CONF_PATH = {{ json_module.dumps(configuration) }}, var CONF_PATH = {{ json_module.dumps(configuration) }},
conf_file = std.open(CONF_PATH, "r"), conf_file = std.open(CONF_PATH, "r"),
configuration = JSON.parse(conf_file.readAsString()), configuration = JSON.parse(conf_file.readAsString()),
last_message_timestamp = 0,
parent = Worker.parent, parent = Worker.parent,
peer_dict = {},
user_me = { user_me = {
//for debugging purpose //for debugging purpose
fdopen: std.fdopen, fdopen: std.fdopen,
...@@ -60,7 +62,11 @@ import { Worker } from "os"; ...@@ -60,7 +62,11 @@ import { Worker } from "os";
loiter: loiter, loiter: loiter,
sendMsg: function (msg, id) { sendMsg: function (msg, id) {
if (id === undefined) { id = -1; } if (id === undefined) { id = -1; }
setMessage(JSON.stringify({ content: msg, dest_id: id })); setMessage(JSON.stringify({
content: msg,
timestamp: Date.now(),
dest_id: id
}));
}, },
setAirspeed: setAirspeed, setAirspeed: setAirspeed,
setTargetCoordinates: setTargetCoordinates setTargetCoordinates: setTargetCoordinates
...@@ -90,25 +96,30 @@ import { Worker } from "os"; ...@@ -90,25 +96,30 @@ import { Worker } from "os";
} }
function handleMainMessage(evt) { function handleMainMessage(evt) {
var type = evt.data.type, message, drone_id; var type = evt.data.type, message, peer_id;
if (type === "initPubsub") { if (type === "initPubsub") {
initPubsub(configuration.numberOfPeers); initPubsub(configuration.numberOfDrone, configuration.numberOfSubscriber);
for (drone_id = 0; drone_id < configuration.numberOfPeers; drone_id++) { for (peer_id = 0; peer_id < configuration.numberOfDrone + configuration.numberOfSubscriber; peer_id++) {
user_me.drone_dict[drone_id] = new Drone(drone_id); peer_dict[peer_id] = new Drone(peer_id);
user_me.drone_dict[drone_id].init(drone_id); peer_dict[peer_id].init(peer_id);
if (peer_id < configuration.numberOfDrone) {
user_me.drone_dict[peer_id] = peer_dict[peer_id];
}
} }
parent.postMessage({type: "initialized"}); parent.postMessage({type: "initialized"});
} else if (type === "load") { } else if (type === "load") {
loadUserScript(evt.data.path); loadUserScript(evt.data.path);
parent.postMessage({type: "loaded"}); parent.postMessage({type: "loaded"});
} else if (type === "update") { } else if (type === "update") {
Object.entries(user_me.drone_dict).forEach(function ([id, drone]) { Object.entries(peer_dict).forEach(function ([id, peer]) {
message = drone.message; message = peer.message;
if (user_me.id !== Number(id) && message.length > 0) { if (user_me.id !== Number(id) && message.length > 0) {
message = JSON.parse(message); message = JSON.parse(message);
if (user_me.hasOwnProperty("onGetMsg") && if (message.timestamp != last_message_timestamp &&
user_me.hasOwnProperty("onGetMsg") &&
[-1, user_me.id].includes(message.dest_id)) { [-1, user_me.id].includes(message.dest_id)) {
last_message_timestamp = message.timestamp;
user_me.onGetMsg(message.content); user_me.onGetMsg(message.content);
} }
} }
......
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