diff --git a/common/include/villas/window.h b/common/include/villas/window.h new file mode 100644 index 000000000..d4836b8f9 --- /dev/null +++ b/common/include/villas/window.h @@ -0,0 +1,48 @@ +/** A sliding/moving window. + * + * @file + * @author Steffen Vogel + * @copyright 2014-2019, Institute for Automation of Complex Power Systems, EONERC + * @license GNU General Public License (version 3) + * + * VILLAScommon + * + * 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 . + *********************************************************************************/ + +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct window { + double *data; + + size_t steps; + size_t mask; + size_t pos; +}; + +int window_init(struct window *w, size_t steps, double init); + +int window_destroy(struct window *w); + +double window_update(struct window *w, double in); + +#ifdef __cplusplus +} +#endif diff --git a/common/lib/CMakeLists.txt b/common/lib/CMakeLists.txt index d76ac4857..4f9ecdb6c 100644 --- a/common/lib/CMakeLists.txt +++ b/common/lib/CMakeLists.txt @@ -48,6 +48,7 @@ add_library(villas-common SHARED version.cpp copyright.cpp common.c + window.c ) execute_process( diff --git a/common/lib/window.c b/common/lib/window.c new file mode 100644 index 000000000..103b527d3 --- /dev/null +++ b/common/lib/window.c @@ -0,0 +1,61 @@ +/** A sliding/moving window. + * + * @author Steffen Vogel + * @copyright 2014-2019, Institute for Automation of Complex Power Systems, EONERC + * @license GNU General Public License (version 3) + * + * VILLAScommon + * + * 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 + +#include +#include + +int window_init(struct window *w, size_t steps, double init) +{ + size_t len = LOG2_CEIL(steps); + + /* Allocate memory for ciruclar history buffer */ + w->data = alloc(len * sizeof(double)); + if (!w->data) + return -1; + + for (size_t i = 0; i < len; i++) + w->data[i] = init; + + w->steps = steps; + w->pos = len; + w->mask = len - 1; + + return 0; +} + +int window_destroy(struct window *w) +{ + free(w->data); + + return 0; +} + +double window_update(struct window *w, double in) +{ + double out = w->data[(w->pos - w->steps) & w->mask]; + + w->data[w->pos++] = in; + + return out; +}