Commit 45accab3 authored by Thomas Gambier's avatar Thomas Gambier 🚴🏼

Make the qjs wrapper a binary to display the positions of the drones

parent ad90f05d
...@@ -6,8 +6,9 @@ ...@@ -6,8 +6,9 @@
#include "ua_pubsub.h" #include "ua_pubsub.h"
#include "pubsub.h" #include "pubsub.h"
#include "dronedge.h"
static UA_Server *server; static UA_Server *global_server;
UA_NodeId connectionIdent, publishedDataSetIdent, writerGroupIdent, UA_NodeId connectionIdent, publishedDataSetIdent, writerGroupIdent,
readerGroupIdent, readerIdent; readerGroupIdent, readerIdent;
...@@ -87,7 +88,7 @@ UA_StatusCode writeVariable(char *name, void * UA_RESTRICT pvalue, UA_DataType t ...@@ -87,7 +88,7 @@ UA_StatusCode writeVariable(char *name, void * UA_RESTRICT pvalue, UA_DataType t
UA_Variant var; UA_Variant var;
UA_Variant_init(&var); UA_Variant_init(&var);
UA_Variant_setScalar(&var, pvalue, &type); UA_Variant_setScalar(&var, pvalue, &type);
return UA_Server_writeValue(server, varNodeId, var); return UA_Server_writeValue(global_server, varNodeId, var);
} }
static void static void
...@@ -271,6 +272,7 @@ addSubscribedVariables (UA_Server *server, UA_NodeId dataSetReaderId, int nb, ...@@ -271,6 +272,7 @@ addSubscribedVariables (UA_Server *server, UA_NodeId dataSetReaderId, int nb,
vAttr.dataType = readerConfig.dataSetMetaData.fields[i].dataType; vAttr.dataType = readerConfig.dataSetMetaData.fields[i].dataType;
UA_NodeId newNode; UA_NodeId newNode;
printf("Subscribing to node is %d which is %s\n", (UA_UInt32) readerConfig.dataSetMetaData.fieldsSize*nb + i + 50000, readerConfig.dataSetMetaData.fields[i].name.data);
retval |= UA_Server_addVariableNode(server, retval |= UA_Server_addVariableNode(server,
UA_NODEID_NUMERIC(1, (UA_UInt32) readerConfig.dataSetMetaData.fieldsSize*nb + i + 50000), UA_NODEID_NUMERIC(1, (UA_UInt32) readerConfig.dataSetMetaData.fieldsSize*nb + i + 50000),
folderId, folderId,
...@@ -351,35 +353,35 @@ int runPubsub(UA_String *transportProfile, ...@@ -351,35 +353,35 @@ int runPubsub(UA_String *transportProfile,
char readerName[19]; char readerName[19];
UA_StatusCode retval = UA_STATUSCODE_GOOD; UA_StatusCode retval = UA_STATUSCODE_GOOD;
server = UA_Server_new(); global_server = UA_Server_new();
UA_ServerConfig *config = UA_Server_getConfig(server); UA_ServerConfig *config = UA_Server_getConfig(global_server);
UA_ServerConfig_setDefault(config); UA_ServerConfig_setDefault(config);
UA_ServerConfig_addPubSubTransportLayer(config, UA_PubSubTransportLayerUDPMP()); UA_ServerConfig_addPubSubTransportLayer(config, UA_PubSubTransportLayerUDPMP());
callbackUpdate = update; callbackUpdate = update;
retval |= addPubSubConnection(server, transportProfile, networkAddressUrl, id); retval |= addPubSubConnection(global_server, transportProfile, networkAddressUrl, id);
if (retval != UA_STATUSCODE_GOOD) if (retval != UA_STATUSCODE_GOOD)
return EXIT_FAILURE; return EXIT_FAILURE;
/* Publishing */ /* Publishing */
addPublishedDataSet(server, id); addPublishedDataSet(global_server, id);
for(size_t i = 0; i < nbVariable; i++) { for(size_t i = 0; i < nbVariable; i++) {
retval |= addVariable(server, variableArray[i]); retval |= addVariable(global_server, variableArray[i]);
if (retval != UA_STATUSCODE_GOOD) if (retval != UA_STATUSCODE_GOOD)
return EXIT_FAILURE; return EXIT_FAILURE;
addDataSetField(server, variableArray[i]); addDataSetField(global_server, variableArray[i]);
} }
addWriterGroup(server); addWriterGroup(global_server);
retval |= addDataSetWriter(server); retval |= addDataSetWriter(global_server);
if (retval != UA_STATUSCODE_GOOD) if (retval != UA_STATUSCODE_GOOD)
return EXIT_FAILURE; return EXIT_FAILURE;
/* Subscribing */ /* Subscribing */
retval |= addReaderGroup(server); retval |= addReaderGroup(global_server);
if (retval != UA_STATUSCODE_GOOD) if (retval != UA_STATUSCODE_GOOD)
return EXIT_FAILURE; return EXIT_FAILURE;
...@@ -391,20 +393,104 @@ int runPubsub(UA_String *transportProfile, ...@@ -391,20 +393,104 @@ int runPubsub(UA_String *transportProfile,
for (size_t i = 0; i < nbReader; i++) { for (size_t i = 0; i < nbReader; i++) {
publisherIdent = get_reader_id(i); publisherIdent = get_reader_id(i);
UA_snprintf(readerName, sizeof(readerName - 1), "DataSet Reader %d", publisherIdent); UA_snprintf(readerName, sizeof(readerName - 1), "DataSet Reader %d", publisherIdent);
printf("DataSet Reader %d", publisherIdent);
readerConfig.name = UA_STRING(readerName); readerConfig.name = UA_STRING(readerName);
readerConfig.publisherId.data = &publisherIdent; readerConfig.publisherId.data = &publisherIdent;
retval |= addDataSetReader(server, variableArray, nbVariable, publisherIdent); retval |= addDataSetReader(global_server, variableArray, nbVariable, publisherIdent);
if (retval != UA_STATUSCODE_GOOD) if (retval != UA_STATUSCODE_GOOD)
return EXIT_FAILURE; return EXIT_FAILURE;
/* Add SubscribedVariables to the created DataSetReader */ /* Add SubscribedVariables to the created DataSetReader */
retval |= addSubscribedVariables(server, readerIdent, i, init_node_id); retval |= addSubscribedVariables(global_server, readerIdent, i, init_node_id);
if (retval != UA_STATUSCODE_GOOD) if (retval != UA_STATUSCODE_GOOD)
return EXIT_FAILURE; return EXIT_FAILURE;
} }
retval |= UA_Server_run(server, running); retval |= UA_Server_run(global_server, running);
UA_Server_delete(server); UA_Server_delete(global_server);
return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE; return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
} }
#define MAX_DRONE_ID 10
int drone_ids[MAX_DRONE_ID];
void init_node_id(UA_UInt32 id, int nb, int magic) {
return;
}
int get_reader_id(int nb) {
return drone_ids[nb];
}
UA_Float altitude_rel[MAX_DRONE_ID];
UA_Float altitude_abs[MAX_DRONE_ID];
UA_Double longitude[MAX_DRONE_ID];
UA_Double latitude[MAX_DRONE_ID];
void update(UA_UInt32 id, const UA_DataValue* value) {
UA_UInt16 index = id - 50000;
UA_UInt16 drone_id = index / 4;
if ((index % 4) == 3) {
// this is relative altitude in float
altitude_rel[drone_id] = *(UA_Float *)value->value.data;
} else if ((index % 4) == 2) {
// this is absolute altitude in float
altitude_abs[drone_id] = *(UA_Float *)value->value.data;
printf("DRONE %d: (%010f, %010f, %010f, %010f)\n", drone_id, latitude[drone_id], longitude[drone_id], altitude_abs[drone_id], altitude_rel[drone_id]);
} else if ((index % 4) == 1) {
// this is longitude in double
longitude[drone_id] = *(UA_Double *)value->value.data;
} else if ((index % 4) == 0) {
// this is latitude in double
latitude[drone_id] = *(UA_Double *)value->value.data;
}
return;
}
static void
usage(char *progname) {
printf("usage: %s <uri> [device] drone_id1 drone_id2 ...\n", progname);
}
int main(int argc, char **argv) {
UA_String transportProfile = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL , UA_STRING("opc.udp://224.0.0.22:4840/")};
UA_UInt16 drone_id_index, i;
UA_Boolean running = true;
if(argc < 2) {
usage(argv[0]);
return EXIT_FAILURE;
}
if(strcmp(argv[1], "-h") == 0) {
usage(argv[0]);
return EXIT_SUCCESS;
} else if(strncmp(argv[1], "opc.udp://", 10) == 0) {
networkAddressUrl.url = UA_STRING(argv[1]);
drone_id_index = 1;
} else if(strncmp(argv[1], "opc.eth://", 10) == 0) {
transportProfile =
UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-eth-uadp");
if(argc < 3) {
printf("Error: UADP/ETH needs an interface name\n");
return EXIT_FAILURE;
}
networkAddressUrl.networkInterface = UA_STRING(argv[2]);
networkAddressUrl.url = UA_STRING(argv[1]);
drone_id_index = 1;
} else {
printf ("Error: unknown URI\n");
return EXIT_FAILURE;
}
if (argc - drone_id_index < 1) {
usage(argv[0]);
return EXIT_FAILURE;
}
if (argc - drone_id_index > 10) {
printf("Cannot support more than MAX_DRONE_ID drone ids");
return EXIT_FAILURE;
}
for (i = drone_id_index; i < argc; i++)
drone_ids[i-drone_id_index] = (int)strtol(argv[i], NULL, 10);
return runPubsub(&transportProfile, &networkAddressUrl, droneVariableArray, 4, 0 /* this reader id */, argc-drone_id_index, init_node_id, get_reader_id, update, &running);
}
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