# Example configuration file for VILLASnode
#
# This example includes all valid configuration options for the server.
# Please note, that using all options at the same time does not really
# makes sense. The purpose of this example is to serve as a reference.
#
# The syntax of this file is similar to JSON.
# A detailed description of the format can be found here:
#   http://www.hyperrealm.com/libconfig/libconfig_manual.html#Configuration-Files
#
# Author:	Steffen Vogel <stvogel@eonerc.rwth-aachen.de>
# Copyright:	2016, Institute for Automation of Complex Power Systems, EONERC
##

# Some global settings are used by multiple configuration files
# and therefore defined in separate files
@include "global.conf"
@include "plugins.conf"

############    Dictionary of nodes    ############

nodes = {
	udp_node = {					# The dictionary is indexed by the name of the node.
		type	= "socket",			# Type can be one of: socket, opal, file, gtfpga, ngsi
							# Start the server without arguments for a list of supported node types.
		
	### The following settings are specific to the socket node-type!! ###

		layer	= "udp",			# Layer can be one of:
							#   udp                    Send / receive UDP packets
							#   ip                     Send / receive IP packets
							#   eth                    Send / receive raw Ethernet frames (IEEE802.3)
							

		header	= "gtnet-skt:fake",		# Header can be one of:
							#   default | villas       Use VILLASnode protocol (see struct msg) (default)
							#   none | gtnet-skt       Use no header, send raw data as used by RTDS GTNETv2-SKT
							#   fake | gtnet-skt:fake  Same as 'none', but use first three data values as
							#                             sequence, seconds & nanoseconds timestamp
							#                             In this mode values are uint32_t not floats!

		endian = "network",			# Endianess of header and data:
							#   big | network          Use big endianess. Also know as network byte order (default)
							#   little                 Use little endianess.
							
		local	= "127.0.0.1:12001",		# This node only received messages on this IP:Port pair
		remote	= "127.0.0.1:12000"		# This node sents outgoing messages to this IP:Port pair
		
		vectorize = 30				# Receive and sent 30 samples per message (combining).
	},
	ethernet_node = {
		type	= "socket",			# See above.
		
	### The following settings are specific to the socket node-type!! ###

		layer	= "eth",
		local	= "*:12002",			# It's possible to use an '*' for both the port and address
							# in UDP / TCP and IP modes.
							# This will choose a random port.
							# And listen on all available interfaces.
		remote	= "12:34:56:78:90:12003",	# Currently IPv6 is not supported!

		netem = {				# Network emulation settings
							# Those settings can be specified for each node invidually!
			delay		= 100000,	# Additional latency in microseconds
			jitter		= 30000,	# Jitter in uS
			distribution	= "normal",	# Distribution of delay: uniform, normal, pareto, paretonormal
			loss		= 10		# Packet loss in percent
			duplicate	= 10,		# Duplication in percent
			corrupt 	= 10		# Corruption in percent
		}
	},
	opal_node = {					# The server can be started as an Asynchronous process
		type	= "opal",			# from within an OPAL-RT model.
		
	### The following settings are specific to the opal node-type!! ###

		send_id	= 1,				# It's possible to have multiple send / recv Icons per model
		recv_id	= 1,				# Specify the ID here.
		reply = true
	},
	file_node = {
		type	= "file",
		
	### The following settings are specific to the file node-type!! ###

		in = {
			path = "logs/input.log",	# These options specify the path prefix where the the files are stored
			mode = "r",			# The mode in which files should be opened (see open(2))
							
			epoch_mode = "direct"		# One of: direct (default), wait, relative, absolute
			epoch = 10			# The interpretation of this value depends on epoch_mode (default is 0).
							# Consult the documentation of a full explanation

			rate = 2.0			# A constant rate at which the lines of the input files should be read
							# A missing or zero value will use the timestamp in the first column
							# of the file to determine the pause between consecutive lines.
			
			splitted = false
		},
		out = {
			path = "logs/output_%F_%T.log"	# The output path accepts all format tokens of (see strftime(3))
			mode = "a+"			# You might want to use "a+" to append to a file

			split	= 100,			# Split output file every 100 MB
		}
	},
	gtfpga_node = {
		type = "gtfpga",
		
	### The following settings are specific to the gtfpga node-type!! ###

		slot = "01:00.0",			# The PCIe slot location (see first column in 'lspci' output)
		id = "1ab8:4005",			# The PCIe vendor:device ID (see third column in 'lspci -n' output)
		
		rate = 1
	},
	ngsi_node = {
		type = "ngsi",
		
	### The following settings are specific to the ngsi node-type!! ###

		endpoint = "http://46.101.131.212:1026",# The HTTP REST API endpoint of the FIRWARE context broker
		
		entity_id = "S3_ElectricalGrid",	
		entity_type = "ElectricalGridMonitoring",
		
		timeout = 5,				# Timeout of HTTP request in seconds (default is 1)
		verify_ssl = false,			# Verification of SSL server certificates (default is true)

		mapping = [				# Format: "AttributeName(AttributeType)"
			"PTotalLosses(MW)",
			"QTotalLosses(Mvar)"
		]
	}
};


############       List of paths       ############

paths = (
	{
		enabled = true,				# Enable this path (default: true)
		reverse = true,				# Setup a path in the reverse direction as well (default: false)
		
		in = "acs",				# Name of the node we receive messages from (see node dictionary)
		out = "sintef",				# Name of the node we send messages to.
		
		rate = 100,				# Send message over this path with a fixed (constant) rate (default: 0).
							# Setting this value to 0 will disable this feature.
		
		hook = "print",				# Register custom hook funktion (see src/hooks.c)

		poolsize = 30				# The amount of samples which are kept in a circular buffer.
							# This number must be larger than the 'vectorize' settings of all
							# associated input and output nodes!
	},
	{
		enabled = false,
		reverse = false,
		
		in = "opal_node",			# There's only a single source node allowed!
		out = [ "udp_node", "tcp_node" ],	# Multiple destination nodes are supported too.
		
		hook = [ "print", "decimate:10" ]	# Same is true for hooks.
							# Multipe hook functions are executed in the order they are specified here.
	},
	{
		in = "socket_node",
		out = "file_node",			# This path includes all available example hooks.

		hook = [
			"ts",				# Replace the timestamp of messages with the time of reception
			"skip_unchanged:0.1",		# Skip messages whose values have not changed more than 0.1 from the previous message.
			"skip_first:10",		# Skip all messages which have been received in the first 10 seconds
			"print",			# Print all messages to stdout
			"decimate:2",			# Only forward every 2nd message
			"convert:fixed",		# Convert all values to fixed precission. Use 'float' to convert to floating point.
			"fir:0"				# Apply finite impulse response filter to first value.
							# Coefficients are hard-coded in 'include/config.h'.
		]
	}
);