diff --git a/include/villas/dumper.hpp b/include/villas/dumper.hpp new file mode 100644 index 000000000..54c33975c --- /dev/null +++ b/include/villas/dumper.hpp @@ -0,0 +1,42 @@ +/** Dump fields and values in a socket to plot them with villasDump.py. + * + * @file + * @author Manuel Pitz + * @copyright 2014-2020, Institute for Automation of Complex Power Systems, EONERC + * @license GNU General Public License (version 3) + * + * VILLASnode + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *********************************************************************************/ + +#include + +namespace villas { +namespace node { + +class Dumper { + protected: + int socketFd; + std::string socketName; + + public: + Dumper(std::string socketNameIn); + ~Dumper(); + int openSocket(std::string socketNameIn); + void closeSocket(); + void writeData(uint len, double* yData, double* xData = nullptr); + }; +} +} \ No newline at end of file diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index e65aa0058..de06b38d9 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -48,6 +48,7 @@ endif() set(LIB_SRC config_helper.cpp config.cpp + dumper.cpp mapping.cpp memory.cpp memory/heap.cpp diff --git a/lib/dumper.cpp b/lib/dumper.cpp new file mode 100644 index 000000000..95340ae10 --- /dev/null +++ b/lib/dumper.cpp @@ -0,0 +1,89 @@ +/** Dump fields and values in a socket to plot them with villasDump.py. + * + * @file + * @author Manuel Pitz + * @copyright 2014-2020, Institute for Automation of Complex Power Systems, EONERC + * @license GNU General Public License (version 3) + * + * VILLASnode + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *********************************************************************************/ + +#include "villas/dumper.hpp" +#include +#include +#include +#include "villas/log.h" +#include + + + +using namespace villas; +using namespace villas::node; + + +Dumper::Dumper(std::string socketNameIn) : + socketName("") +{ + openSocket(socketNameIn); +} + +Dumper::~Dumper() { + closeSocket(); +} + +int Dumper::openSocket(std::string socketNameIn) { + socketName = socketNameIn; + + socketFd = socket(AF_LOCAL,SOCK_STREAM, 0); + if (socketFd < 0) { + info("Error creating socket %s", socketName.c_str()); + return -1; + } + + sockaddr_un socketaddr_un; + socketaddr_un.sun_family = AF_UNIX; + strcpy(socketaddr_un.sun_path, socketName.c_str()); + socketName = socketNameIn; + + //unlink(socketName.c_str()); + //bind(socketFd, (struct sockaddr *) &socketaddr_un, sizeof(socketaddr_un)); + connect(socketFd, (struct sockaddr *) &socketaddr_un, sizeof(socketaddr_un)); + + return 1; +} + +void Dumper::closeSocket() { + info("Remove socket"); + //unlink(socketName.c_str()); + close(socketFd); +} + +void Dumper::writeData(uint len, double* yData, double* xData) { + ssize_t bytesWritten; + + for (uint i = 0; i - +#include "villas/dumper.hpp" #include #include #include #include #include #include -#include -#include -#include -#include -#include namespace villas { namespace node { -class dataDump { - protected: - int socketFd; - std::string socketName; - - public: - - dataDump(std::string socketNameIn) : - socketName("") - { - openSocket(socketNameIn); - } - - ~dataDump() { - closeSocket(); - } - - int openSocket(std::string socketNameIn) { - socketName = socketNameIn; - - socketFd = socket(AF_LOCAL,SOCK_STREAM, 0); - if (socketFd < 0) { - info("Error creating socket %s", socketName.c_str()); - return -1; - } - - sockaddr_un socketaddr_un; - socketaddr_un.sun_family = AF_UNIX; - strcpy(socketaddr_un.sun_path, socketName.c_str()); - socketName = socketNameIn; - - //unlink(socketName.c_str()); - //bind(socketFd, (struct sockaddr *) &socketaddr_un, sizeof(socketaddr_un)); - connect(socketFd, (struct sockaddr *) &socketaddr_un, sizeof(socketaddr_un)); - - return 1; - } - - void closeSocket() { - info("Remove socket"); - //unlink(socketName.c_str()); - close(socketFd); - } - - void writeData(uint len, double* yData, double* xData = nullptr) { - ssize_t bytesWritten; - - for (uint i = 0; i0) - fh << ";"; - fh << ydata; - - fh.close(); - } - - void dumpData(const char *path, double *ydata, uint size, double *xdata=nullptr){ - - std::ofstream fh; - fh.open(path); - for(uint i = 0 ; i < size ; i++){ - if(i>0)fh << ";"; - fh << ydata[i]; - } - if(xdata){ - fh << "\n"; - for(uint i = 0 ; i < size ; i++){ - if(i>0)fh << ";"; - fh << xdata[i]; - } - } - fh.close(); - } - - void genDftMatrix(){ using namespace std::complex_literals; @@ -480,9 +382,9 @@ return; for(uint i = 0; i< window_size; i++){ tmp_smp_window[i] *= filterWindowCoefficents[i]; } - dumpData("/tmp/plot/signal_windowed",tmp_smp_window,window_size); + //dumpData("/tmp/plot/signal_windowed",tmp_smp_window,window_size); - dumpData("/tmp/plot/smp_window",smp_memory,window_size); + //dumpData("/tmp/plot/smp_window",smp_memory,window_size); for( uint i=0; i < freq_count; i++){ dftResults[i] = 0; @@ -529,7 +431,7 @@ return; } } window_corretion_factor /= window_size; - dumpData("/tmp/plot/filter_window",filterWindowCoefficents,window_size); + //dumpData("/tmp/plot/filter_window",filterWindowCoefficents,window_size); } };