diff --git a/Doxyfile b/Doxyfile index db6470e7f..39536f28f 100644 --- a/Doxyfile +++ b/Doxyfile @@ -1003,7 +1003,7 @@ VERBATIM_HEADERS = YES # compiled with the --with-libclang option. # The default value is: NO. -CLANG_ASSISTED_PARSING = NO +#CLANG_ASSISTED_PARSING = NO # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that @@ -1011,7 +1011,7 @@ CLANG_ASSISTED_PARSING = NO # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. -CLANG_OPTIONS = +#CLANG_OPTIONS = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index diff --git a/README.md b/README.md index fd6d16289..1faecce2e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ -# VILLASnode -build status +# VILLASnode [![build status](https://git.rwth-aachen.de/acs/VILLASnode/badges/develop/build.svg)](https://git.rwth-aachen.de/acs/VILLASnode/commits/develop) [![coverage report](https://git.rwth-aachen.de/acs/VILLASnode/badges/develop/coverage.svg)](https://git.rwth-aachen.de/acs/VILLASnode/commits/develop) + This is VILLASnode, a gateway for processing and forwardning simulation data between real-time simulators. + ## Documentation The documentation for this software is available at [doc/Mainpage](doc/Mainpage.md). diff --git a/doc/Contributing.md b/doc/Contributing.md new file mode 120000 index 000000000..44fcc6343 --- /dev/null +++ b/doc/Contributing.md @@ -0,0 +1 @@ +../CONTRIBUTING.md \ No newline at end of file diff --git a/doc/License.md b/doc/License.md new file mode 120000 index 000000000..0c9476f2b --- /dev/null +++ b/doc/License.md @@ -0,0 +1 @@ +../COPYING.md \ No newline at end of file diff --git a/doc/Readme.md b/doc/Readme.md new file mode 120000 index 000000000..32d46ee88 --- /dev/null +++ b/doc/Readme.md @@ -0,0 +1 @@ +../README.md \ No newline at end of file diff --git a/doc/pictures/villas_fpga.png b/doc/pictures/villas_fpga.png new file mode 100644 index 000000000..6f5ca5f0d Binary files /dev/null and b/doc/pictures/villas_fpga.png differ diff --git a/doc/pictures/villas_fpga.svg b/doc/pictures/villas_fpga.svg new file mode 100644 index 000000000..3e318b38b --- /dev/null +++ b/doc/pictures/villas_fpga.svg @@ -0,0 +1,108 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/doc/pictures/villas_node.png b/doc/pictures/villas_node.png new file mode 100644 index 000000000..0b6314262 Binary files /dev/null and b/doc/pictures/villas_node.png differ diff --git a/doc/pictures/villas_node.svg b/doc/pictures/villas_node.svg new file mode 100644 index 000000000..1acfe1d32 --- /dev/null +++ b/doc/pictures/villas_node.svg @@ -0,0 +1,107 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/etc/gtnet_test1.conf b/etc/gtnet_test1.conf new file mode 100644 index 000000000..3e5d147b3 --- /dev/null +++ b/etc/gtnet_test1.conf @@ -0,0 +1,62 @@ +# This is an example for a minimal loopback configuration. +# +# All messages will be sent back to the origin using UDP packets. +# +# You can use this configuration in conjunction with the 'send', 'receive' and 'random' +# utilities as shown below (run all three steps in parallel). +# +# 0. Overview: +# +# ./signal --PIPE--> ./pipe --UDP--> ./node --UDP--> ./pipe +# +# 1. Start server: +# +# $ ./node etc/loopback.conf +# +# 2. Send random data to server: +# +# $ ./signal random -r 10 -v 4 | ./pipe etc/loopback.conf node1 +# +# 3. Receive data from server: +# +# $ ./pipe etc/loopback.conf node2 +# +# Author: Steffen Vogel +# Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC +## + +stats = 1; +debug = 10; + +nodes = { + node1 = { + type = "socket", + layer = "udp", + local = "192.168.88.128:12002", # Local ip:port, use '*' for random port + remote = "192.168.88.129:12001", + header = "villas", # 'gtnet-skt' or 'villas'. If not provided, 'villas' header will be used + vectorize = 1, # Number of samples to fetch per iteration from the socket + netem = { + enabled = false, + delay = 1000000, # In micro seconds! + jitter = 300000, + distribution = "normal" + } + }, + node2 = { + type = "socket", + layer = "udp", + local = "*:12004", # Local ip:port, use '*' for random port + remote = "192.168.88.129:12005", + header = "villas", # 'gtnet-skt' or 'villas'. If not provided, 'villas' header will be used + vectorize = 1 # Number of samples to fetch per iteration from the socket + } +}; + +paths = ( + { + in = "node1", # Name of the node we listen to (see above) + out = "node1", # And we loop back to the origin + hook = ["print"] + } +); diff --git a/etc/gtnet_test2.conf b/etc/gtnet_test2.conf new file mode 100644 index 000000000..1c40c3dd4 --- /dev/null +++ b/etc/gtnet_test2.conf @@ -0,0 +1,62 @@ +# This is an example for a minimal loopback configuration. +# +# All messages will be sent back to the origin using UDP packets. +# +# You can use this configuration in conjunction with the 'send', 'receive' and 'random' +# utilities as shown below (run all three steps in parallel). +# +# 0. Overview: +# +# ./signal --PIPE--> ./pipe --UDP--> ./node --UDP--> ./pipe +# +# 1. Start server: +# +# $ ./node etc/loopback.conf +# +# 2. Send random data to server: +# +# $ ./signal random -r 10 -v 4 | ./pipe etc/loopback.conf node1 +# +# 3. Receive data from server: +# +# $ ./pipe etc/loopback.conf node2 +# +# Author: Steffen Vogel +# Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC +## + +stats = 1; +debug = 10; + +nodes = { + node1 = { + type = "socket", + layer = "udp", + local = "192.168.88.128:12002", # Local ip:port, use '*' for random port + remote = "192.168.88.129:12001", + header = "villas", # 'gtnet-skt' or 'villas'. If not provided, 'villas' header will be used + vectorize = 1, # Number of samples to fetch per iteration from the socket + netem = { + enabled = false, + delay = 1000000, # In micro seconds! + jitter = 300000, + distribution = "normal" + } + }, + node2 = { + type = "socket", + layer = "udp", + local = "192.168.88.128:12004", # Local ip:port, use '*' for random port + remote = "192.168.88.129:12001", + header = "villas", # 'gtnet-skt' or 'villas'. If not provided, 'villas' header will be used + vectorize = 1 # Number of samples to fetch per iteration from the socket + } +}; + +paths = ( + { + in = "node1", # Name of the node we listen to (see above) + out = "node2", # And we loop back to the origin + hook = ["print"] + } +); diff --git a/etc/gtnet_test3.conf b/etc/gtnet_test3.conf new file mode 100644 index 000000000..9470160ec --- /dev/null +++ b/etc/gtnet_test3.conf @@ -0,0 +1,62 @@ +# This is an example for a minimal loopback configuration. +# +# All messages will be sent back to the origin using UDP packets. +# +# You can use this configuration in conjunction with the 'send', 'receive' and 'random' +# utilities as shown below (run all three steps in parallel). +# +# 0. Overview: +# +# ./signal --PIPE--> ./pipe --UDP--> ./node --UDP--> ./pipe +# +# 1. Start server: +# +# $ ./node etc/loopback.conf +# +# 2. Send random data to server: +# +# $ ./signal random -r 10 -v 4 | ./pipe etc/loopback.conf node1 +# +# 3. Receive data from server: +# +# $ ./pipe etc/loopback.conf node2 +# +# Author: Steffen Vogel +# Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC +## + +stats = 1; +debug = 10; + +nodes = { + node1 = { + type = "socket", + layer = "udp", + local = "192.168.88.128:12002", # Local ip:port, use '*' for random port + remote = "192.168.88.129:12001", + header = "gtnet-skt", # 'gtnet-skt' or 'villas'. If not provided, 'villas' header will be used + vectorize = 1, # Number of samples to fetch per iteration from the socket + netem = { + enabled = false, + delay = 1000000, # In micro seconds! + jitter = 300000, + distribution = "normal" + } + }, + node2 = { + type = "socket", + layer = "udp", + local = "192.168.88.128:12004", # Local ip:port, use '*' for random port + remote = "192.168.88.129:12001", + header = "gtnet-skt", # 'gtnet-skt' or 'villas'. If not provided, 'villas' header will be used + vectorize = 1 # Number of samples to fetch per iteration from the socket + } +}; + +paths = ( + { + in = "node1", # Name of the node we listen to (see above) + out = "node2", # And we loop back to the origin + hook = ["print"] + } +); diff --git a/etc/gtnet_test4.conf b/etc/gtnet_test4.conf new file mode 100644 index 000000000..b80cbd41d --- /dev/null +++ b/etc/gtnet_test4.conf @@ -0,0 +1,62 @@ +# This is an example for a minimal loopback configuration. +# +# All messages will be sent back to the origin using UDP packets. +# +# You can use this configuration in conjunction with the 'send', 'receive' and 'random' +# utilities as shown below (run all three steps in parallel). +# +# 0. Overview: +# +# ./signal --PIPE--> ./pipe --UDP--> ./node --UDP--> ./pipe +# +# 1. Start server: +# +# $ ./node etc/loopback.conf +# +# 2. Send random data to server: +# +# $ ./signal random -r 10 -v 4 | ./pipe etc/loopback.conf node1 +# +# 3. Receive data from server: +# +# $ ./pipe etc/loopback.conf node2 +# +# Author: Steffen Vogel +# Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC +## + +stats = 1; +debug = 10; + +nodes = { + node1 = { + type = "socket", + layer = "udp", + local = "192.168.88.128:12002", # Local ip:port, use '*' for random port + remote = "192.168.88.129:12001", + header = "gtnet-skt", # 'gtnet-skt' or 'villas'. If not provided, 'villas' header will be used + vectorize = 1, # Number of samples to fetch per iteration from the socket + netem = { + enabled = false, + delay = 1000000, # In micro seconds! + jitter = 300000, + distribution = "normal" + } + }, + node2 = { + type = "socket", + layer = "udp", + local = "192.168.88.128:12004", # Local ip:port, use '*' for random port + remote = "192.168.88.129:12001", + header = "gtnet-skt", # 'gtnet-skt' or 'villas'. If not provided, 'villas' header will be used + vectorize = 1 # Number of samples to fetch per iteration from the socket + } +}; + +paths = ( + { + in = "node1", # Name of the node we listen to (see above) + out = "node1", # And we loop back to the origin + hook = ["print"] + } +); diff --git a/lib/kernel/kernel.c b/lib/kernel/kernel.c index 8474faf5a..6548dbf49 100644 --- a/lib/kernel/kernel.c +++ b/lib/kernel/kernel.c @@ -184,6 +184,7 @@ int kernel_irq_setaffinity(unsigned irq, uintmax_t new, uintmax_t *old) { char fn[64]; FILE *f; + int ret = 0; snprintf(fn, sizeof(fn), "/proc/irq/%u/smp_affinity", irq); @@ -192,10 +193,10 @@ int kernel_irq_setaffinity(unsigned irq, uintmax_t new, uintmax_t *old) return -1; /* IRQ does not exist */ if (old) - fscanf(f, "%jx", old); + ret = fscanf(f, "%jx", old); fprintf(f, "%jx", new); fclose(f); - return 0; + return ret; } diff --git a/lib/path.c b/lib/path.c index 2e36caaad..b783c816f 100644 --- a/lib/path.c +++ b/lib/path.c @@ -88,7 +88,7 @@ static void * path_run(void *arg) /* Main thread loop */ for (;;) { /* Fill smps[] free sample blocks from the pool */ - ready += pool_get_many(&p->pool, (void **) smps, cnt - ready); + ready += sample_get_many(&p->pool, smps, cnt - ready); if (ready != cnt) warn("Pool underrun for path %s", path_name(p));