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
-
+# VILLASnode [](https://git.rwth-aachen.de/acs/VILLASnode/commits/develop) [](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 @@
+
+
+
+
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 @@
+
+
+
+
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));