diff --git a/CMakeLists.txt b/CMakeLists.txt index fb8b7dde..9ed10c52 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 2.8...3.8) PROJECT(OpenVLBI C CXX) LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/") @@ -14,6 +14,7 @@ find_package(Threads REQUIRED) option(CMAKE_BUILD_RPATH_USE_ORIGIN "rpath issue fix" ON) option(WITH_VLBI_SERVER "Add OpenVLBI servers" ON) option(WITH_INDI_SERVER "Add INDI server for OpenVLBI" ON) +option(WITH_SHARED_SERVER "Add shared server library for OpenVLBI" ON) option(WITH_DUMMY_SERVER "Add dummy server for OpenVLBI" ON) option(WITH_JSON_SERVER "Add JSON server for OpenVLBI" ON) @@ -21,7 +22,7 @@ set (CMAKE_CXX_STANDARD 11) set (CMAKE_C_STANDARD 11) set (VLBI_VERSION_MAJOR 3) set (VLBI_VERSION_MINOR 0) -set (VLBI_VERSION_RELEASE 2) +set (VLBI_VERSION_RELEASE 3) set (VLBI_VERSION_STRING "${VLBI_VERSION_MAJOR}.${VLBI_VERSION_MINOR}.${VLBI_VERSION_RELEASE}") set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") set(DATA_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}") @@ -125,4 +126,12 @@ add_executable(vlbi_server_dummy ${CMAKE_CURRENT_SOURCE_DIR}/vlbi_server_dummy.c target_link_libraries(vlbi_server_dummy openvlbi_server openvlbi ${M_LIB} ${ZLIB_LIBRARY}) install(TARGETS vlbi_server_dummy RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) endif(WITH_DUMMY_SERVER) + +if(WITH_SHARED_SERVER) +add_library(vlbi_server SHARED ${CMAKE_CURRENT_SOURCE_DIR}/vlbi_server.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vlbi/instancecollection.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vlbi/collection.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vlbi/base64.c ${CMAKE_CURRENT_SOURCE_DIR}/vlbi_server_shared.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vlbi_server_dummy.cpp) +target_link_libraries(vlbi_server openvlbi_server openvlbi ${CFITSIO_LIBRARIES} ${M_LIB} ${ZLIB_LIBRARY}) +set_target_properties(vlbi_server PROPERTIES VERSION ${VLBI_VERSION_STRING} SOVERSION ${VLBI_VERSION_MAJOR}) +install(TARGETS vlbi_server LIBRARY DESTINATION ${LIB_INSTALL_DIR}) +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/vlbi_server_c.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include/OpenVLBI) +endif(WITH_SHARED_SERVER) endif(WITH_VLBI_SERVER) diff --git a/dsp/dsp.h.cmake b/dsp/dsp.h.cmake index bc23e370..1c69b01c 100644 --- a/dsp/dsp.h.cmake +++ b/dsp/dsp.h.cmake @@ -81,12 +81,12 @@ typedef double complex_t[2]; #define dsp_t_min -dsp_t_max ///Size of strings #define DSP_NAME_SIZE 128 -///Hypercomplex type -typedef struct hypercomplex_t{ +///Multicomplex type +typedef struct multicomplex_t { int dims; double real; double *imaginary; -} hypercomplex; +} multicomplex; /** * \brief get/set the maximum number of threads allowed * \param value if greater than 1, set a maximum number of threads allowed diff --git a/vlbi/baselinecollection.cpp b/vlbi/baselinecollection.cpp index 63e33c8a..4973c089 100644 --- a/vlbi/baselinecollection.cpp +++ b/vlbi/baselinecollection.cpp @@ -1,19 +1,19 @@ /* OpenVLBI - Open Source Very Long Baseline Interferometry -* Copyright © 2017-2023 Ilia Platone +* Copyright © 2017-2022 Ilia Platone * -* 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 2 of the License, or -* (at your option) any later version. +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 3 of the License, or (at your option) 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. +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. * -* You should have received a copy of the GNU General Public License along -* with this program; if not, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +* You should have received a copy of the GNU Lesser General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include @@ -50,16 +50,14 @@ void BaselineCollection::update() for(int i = 0; i < getNodes()->count() * (getNodes()->count() - 1) / 2; i++) { VLBINode** nodes = (VLBINode**)malloc(sizeof(VLBINode*) * getCorrelationOrder()); - char name[DSP_NAME_SIZE * getCorrelationOrder() + getCorrelationOrder()]; + char name[150] = ""; for(int o = 0; o < getCorrelationOrder(); o++) { int idx = (i + o * (i / getNodes()->count() + 1)) % getNodes()->count(); nodes[o] = getNodes()->at(idx); if(o == 0) sprintf(name, "%s", nodes[o]->getName()); - else { - strcat(name, "*"); - strcat(name, nodes[o]->getName()); - } + else + sprintf(name, "%s_%s", name, nodes[o]->getName()); } VLBIBaseline *b = new VLBIBaseline(nodes, getCorrelationOrder()); if(!this->contains(name)) @@ -108,6 +106,54 @@ bool BaselineCollection::contains(const char* element) return VLBICollection::contains(element); } +bool BaselineCollection::contains(const char** elements) +{ + return get(elements) != nullptr; +} + +bool BaselineCollection::contains(VLBINode** elements) +{ + return get(elements) != nullptr; +} + +VLBIBaseline *BaselineCollection::get(const char** elements) +{ + VLBIBaseline *b = nullptr; + int x = 0; + for(x = 0; x < count(); x++) { + b = at(x); + int match = 0; + for(int y = 0; y < getCorrelationOrder(); y++) { + for(int z = 0; z < getCorrelationOrder(); z++) { + if(!strcmp(b->getNode(y)->getName(), elements[z])) match ++; + } + } + if(match < getCorrelationOrder()) continue; + break; + } + if(x == count() || b == nullptr) return nullptr; + return b; +} + +VLBIBaseline *BaselineCollection::get(VLBINode **nodes) +{ + VLBIBaseline *b = nullptr; + int x = 0; + for(x = 0; x < count(); x++) { + b = at(x); + int match = 0; + for(int y = 0; y < getCorrelationOrder(); y++) { + for(int z = 0; z < getCorrelationOrder(); z++) { + if(!strcmp(b->getNode(y)->getName(), nodes[z]->getName())) match ++; + } + } + if(match < getCorrelationOrder()) continue; + break; + } + if(x == count() || b == nullptr) return nullptr; + return b; +} + void BaselineCollection::setTarget(double *target) { memcpy(Stream->target, target, sizeof(double) * 3); diff --git a/vlbi/baselinecollection.h b/vlbi/baselinecollection.h index 1bc4ecb2..63c5eb62 100644 --- a/vlbi/baselinecollection.h +++ b/vlbi/baselinecollection.h @@ -32,10 +32,14 @@ class BaselineCollection : public VLBICollection void add(VLBIBaseline *element); void removeAt(int index); VLBIBaseline *get(const char* name); + VLBIBaseline *get(const char** names); + VLBIBaseline *get(VLBINode **nodes); void remove(const char* element); void clear(); VLBIBaseline * at(int index); bool contains(const char *element); + bool contains(const char** elements); + bool contains(VLBINode** elements); int indexOf(VLBIBaseline *element); void setTarget(double *target); void setRa(double ra); diff --git a/vlbi/nodecollection.cpp b/vlbi/nodecollection.cpp index 2ad06774..8f78c8d3 100644 --- a/vlbi/nodecollection.cpp +++ b/vlbi/nodecollection.cpp @@ -1,19 +1,19 @@ /* OpenVLBI - Open Source Very Long Baseline Interferometry -* Copyright © 2017-2023 Ilia Platone +* Copyright © 2017-2022 Ilia Platone * -* 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 2 of the License, or -* (at your option) any later version. +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 3 of the License, or (at your option) 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. +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. * -* You should have received a copy of the GNU General Public License along -* with this program; if not, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +* You should have received a copy of the GNU Lesser General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include @@ -74,12 +74,10 @@ bool NodeCollection::contains(const char* element) void NodeCollection::setRelative(bool value) { relative = value; - if(value) + baselines->setRelative(value); + for(int x = 0; x < count(); x++) { - for(int x = 0; x < count(); x++) - { - memcpy(at(x)->stationLocation().coordinates, station.coordinates, sizeof(dsp_location)); - } + memcpy(at(x)->stationLocation().coordinates, station.coordinates, sizeof(dsp_location)); } } diff --git a/vlbi_server.cpp b/vlbi_server.cpp index 064d5c79..5740a098 100644 --- a/vlbi_server.cpp +++ b/vlbi_server.cpp @@ -34,8 +34,8 @@ static int is_running = 1; static InstanceCollection *contexts; VLBI::Server::Server() { - input = stdin; - output = stdout; + setInput(fdopen(0, "rb")); + setOutput(fdopen(1, "w+")); Ra = 0; Dec = 0; Freq = 1420000000; @@ -52,7 +52,7 @@ VLBI::Server::Server() if(nullptr == tmpdir) tmpdir = (char*)"/tmp"; context = (char*)malloc(9); - strcpy(context, "OpenVLBI\0"); + memcpy(context, "OpenVLBI\0", 9); contexts = new InstanceCollection(); } @@ -725,8 +725,8 @@ int main(int argc, char *argv[]) #endif int opt; dsp_set_app_name(argv[0]); - dsp_set_stdout(stderr); - dsp_set_stderr(stderr); + dsp_set_stdout(fdopen(2, "w+")); + dsp_set_stderr(fdopen(2, "w+")); while ((opt = getopt(argc, argv, "t:f:o:vh")) != -1) { switch (opt) diff --git a/vlbi_server_shared.cpp b/vlbi_server_shared.cpp new file mode 100644 index 00000000..e32dfb29 --- /dev/null +++ b/vlbi_server_shared.cpp @@ -0,0 +1,53 @@ +#include "vlbi_server_dummy.h" +#include "vlbi_server_shared.h" + +void VLBI_Server_Parse() { VLBI::server->Parse(); } +void VLBI_Server_addContext(const char *name) { VLBI::server->addContext(name); } +void VLBI_Server_delContext(const char *name) { VLBI::server->delContext(name); } +void VLBI_Server_setContext(const char *name) { VLBI::server->setContext(name); } +vlbi_context VLBI_Server_getContext() { return VLBI::server->getContext(); } +char* VLBI_Server_currentContext() { return VLBI::server->currentContext(); } +void VLBI_Server_addModel(const char *name, char *format, char *b64) { VLBI::server->addModel(name, format, b64); } +dsp_stream_p VLBI_Server_getModel(const char *name) { return VLBI::server->getModel(name); } +char* VLBI_Server_getModel(const char *name, char *format) { return VLBI::server->getModel(name, format); } +void VLBI_Server_delModel(const char *name) { VLBI::server->delModel(name); } +int VLBI_Server_getModels(char** names) { return VLBI::server->getModels(names); } +void VLBI_Server_addNodeFromFits(const char *name, char *b64) { VLBI::server->addNode(name, b64); } +void VLBI_Server_addNodes(const char *name, char *b64) { VLBI::server->addNodes(name, b64); } +void VLBI_Server_addNode(const char *name, dsp_location *locations, void *buf, int len, timespec starttime, bool geo) { VLBI::server->addNode(name, locations, buf, len, starttime, geo); } +void VLBI_Server_delNode(const char *name) { VLBI::server->delNode(name); } +void VLBI_Server_CopyNode(const char *name, const char *node) { VLBI::server->CopyNode(name, node); } +void VLBI_Server_Plot(const char *name, int flags) { VLBI::server->Plot(name, flags); } +void VLBI_Server_Idft(const char *name, const char *magnitude, const char *phase) { VLBI::server->Idft(name, magnitude, phase); } +void VLBI_Server_Dft(const char *name, const char *magnitude, const char *phase) { VLBI::server->Dft(name, magnitude, phase); } +void VLBI_Server_Mask(const char *name, const char *model, const char *mask) { VLBI::server->Mask(name, model, mask); } +void VLBI_Server_Stack(const char *name, const char *model1, const char *model2) { VLBI::server->Stack(name, model1, model2); } +void VLBI_Server_Copy(const char *name, const char *model) { VLBI::server->Copy(name, model); } +void VLBI_Server_Diff(const char *name, const char *model1, const char *model2) { VLBI::server->Diff(name, model1, model2); } +void VLBI_Server_Convolve(const char *name, const char *model1, const char *model2) { VLBI::server->Convolve(name, model1, model2); } +void VLBI_Server_LowPass(const char *name, const char *node, double freq) { VLBI::server->LowPass(name, node, freq); } +void VLBI_Server_HighPass(const char *name, const char *node, double freq) { VLBI::server->HighPass(name, node, freq); } +void VLBI_Server_BandPass(const char *name, const char *node, double lofreq, double hifreq) { VLBI::server->BandPass(name, node, lofreq, hifreq); } +void VLBI_Server_BandReject(const char *name, const char *node, double lofreq, double hifreq) { VLBI::server->BandReject(name, node, lofreq, hifreq); } +void VLBI_Server_Shift(const char *name) { VLBI::server->Shift(name); } +void VLBI_Server_setRa(double value) { VLBI::server->setRa(value); } +void VLBI_Server_setDec(double value) { VLBI::server->setDec(value); } +void VLBI_Server_setFreq(double value) { VLBI::server->setFreq(value); } +void VLBI_Server_setSampleRate(double value) { VLBI::server->setSampleRate(value); } +void VLBI_Server_setBps(int value) { VLBI::server->setBps(value); } +void VLBI_Server_setWidth(int value) { VLBI::server->setWidth(value); } +void VLBI_Server_setHeight(int value) { VLBI::server->setHeight(value); } +double VLBI_Server_getRa() { return VLBI::server->getRa(); } +double VLBI_Server_getDec() { return VLBI::server->getDec(); } +double VLBI_Server_getFreq() { return VLBI::server->getFreq(); } +double VLBI_Server_getSampleRate() { return VLBI::server->getSampleRate(); } +void VLBI_Server_setCorrelationOrder(int order) { VLBI::server->setCorrelationOrder(order); } +double VLBI_Server_getBps() { return VLBI::server->getBps(); } +double VLBI_Server_getWidth() { return VLBI::server->getWidth(); } +double VLBI_Server_getHeight() { return VLBI::server->getHeight(); } +void VLBI_Server_setInput(FILE* in) { VLBI::server->setInput(in); } +FILE* VLBI_Server_getInput() { return VLBI::server->getInput(); } +void VLBI_Server_setOutput(FILE* out) { VLBI::server->setOutput(out); } +FILE* VLBI_Server_getOutput() { return VLBI::server->getOutput(); } +void VLBI_Server_setDelegate(vlbi_func2_t func) { VLBI::server->setDelegate(func); } +vlbi_func2_t VLBI_Server_getDelegate() { return VLBI::server->getDelegate(); } diff --git a/vlbi_server_shared.h b/vlbi_server_shared.h new file mode 100644 index 00000000..61b8c02e --- /dev/null +++ b/vlbi_server_shared.h @@ -0,0 +1,399 @@ +/* OpenVLBI - Open Source Very Long Baseline Interferometry +* Copyright © 2017-2023 Ilia Platone +* +* 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 2 of the License, or +* (at your option) 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, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef VLBI_SERVER_SHARED_H +#define VLBI_SERVER_SHARED_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef DLL_EXPORT +#ifdef _WIN32 +#define DLL_EXPORT __declspec(dllexport) +#else +#define DLL_EXPORT extern +#endif +#endif + +/** +* \brief Flags that characterize a plot +* \sa Server::Plot() +*/ +typedef enum +{ + ///This indicates that the nodes have a positional stream companion + plot_flags_moving_baseline = 1, + ///This will fill all baselines projected pixels with ones + plot_flags_uv_coverage = 2, + ///This indicates that the nodes are synced already and no delay calculation will be done + plot_flags_synced = 4, + ///This will use a custom visibility delegate + plot_flags_custom_delegate = 8, +} vlbi_plot_flags; + +/** +* \brief Called immediately after main(), can be overriden to add your custom arguments +* \param argc Non-negative value representing the number of arguments passed to the program from the environment in which the program is run. +* \param argv Pointer to the first element of an array of argc + 1 pointers, of which the last one is null and the previous ones, if any, point to strings that represent the arguments passed to the program from the host environment. +*/ +DLL_EXPORT int VLBI_Server_Init(int argc, char** argv); + +/** +* \brief main() creates a loop that calls Parse(), you can use this one, which uses the standard syntax or override it with your own implementation +*/ +DLL_EXPORT void VLBI_Server_Parse(); + +/** +* \brief add a new OpenVLBI context by giving it a name. VLBI::Server has an internal context collection +* \param name The name of the new context +*/ +DLL_EXPORT void VLBI_Server_addContext(const char *name); + +/** +* \brief delete an existing OpenVLBI context by name. +* \param name The name of the context to be deleted +*/ +DLL_EXPORT void VLBI_Server_delContext(const char *name); + +/** +* \brief set the current OpenVLBI context by passing its name. +* \param name The name of the context +*/ +DLL_EXPORT void VLBI_Server_setContext(const char *name); + +/** +* \brief Obtain the current OpenVLBI context object. +* \return The vlbi_context object representing the current context +*/ +DLL_EXPORT vlbi_context VLBI_Server_getContext(); + +/** +* \brief Obtain the name current OpenVLBI context. +* \return The name of the current context +*/ +DLL_EXPORT char* VLBI_Server_currentContext(); + +/** +* \brief Create a new model from a picture, give it a name and add it to the current context. +* \param name The name of the new model +* \param format The format of the new model, can be one of png, jpeg or fits +* \param b64 The file buffer base64 encoded +*/ +DLL_EXPORT void VLBI_Server_addModel(const char *name, char *format, char *b64); + +/** +* \brief Obtain the dsp_stream_p object of a model by passing its name. +* \param name The name of the model +* \return The dsp_stream_p object representing the model +*/ +DLL_EXPORT dsp_stream_p VLBI_Server_getModel(const char *name); + +/** +* \brief Obtain the base64 encoded file buffer of a model by passing its name. +* \param name The name of the model +* \param format The format of the picture exported, can be one of png, jpeg or fits +* \return The file buffer base64 encoded +*/ +DLL_EXPORT char* VLBI_Server_getModelBase64(const char *name, char *format); + +/** +* \brief delete from the current context an existing model by name. +* \param name The name of the model to be deleted +*/ +DLL_EXPORT void VLBI_Server_delModel(const char *name); + +/** +* \brief get the names of all the models of the current context. +* \param names The pointer of a char* array to be filled with the names of the models +* \return The number of models in the current context +*/ +DLL_EXPORT int VLBI_Server_getModels(char** names); + +/** +* \brief Create a new node from a monodimensional image FITS file, give it a name and add it to the current context. +* \param name The name of the new node +* \param b64 The file buffer base64 encoded +*/ +DLL_EXPORT void VLBI_Server_addNodeFromFits(const char *name, char *b64); + +/** +* \brief Create as many nodes as the rows number of an SDFITS file, give it a name and add it to the current context. +* \param name The name of the new node +* \param b64 The file buffer base64 encoded +*/ +DLL_EXPORT void VLBI_Server_addNodes(const char *name, char *b64); + +/** +* \brief Create a new node from a its raw data, give it a name and add it to the current context. +* \param name The name of the new node +* \param locations A pointer to its location(s), will be pointed from the new node, so don't free() it until the node is deleted +* \param buf The data buffer of the new node. Will be casted, according the current value of Bps, to the element type with the current word size +* \param len The number of elements +* \param starttime The UTC time of the first element +* \param geo If 1, consider all elements of location as geographic coordinates, if 0 as relative to the current context' station location +*/ +DLL_EXPORT void VLBI_Server_addNode(const char *name, dsp_location *locations, void *buf, int len, timespec starttime, bool geo); + +/** +* \brief delete from the current context an existing node by name. +* \param name The name of the node to be deleted +*/ +DLL_EXPORT void VLBI_Server_delNode(const char *name); + +/** +* \brief Copy a node into another node +* \param name The name of the new node +* \param node The name of the node to be copied +*/ +DLL_EXPORT void VLBI_Server_CopyNode(const char *name, const char *node); + +/** +* \brief Plot the current observation into a new model. +* \param name The name of the new model +* \param flags The vlbi_plot_flags that characterize this observation +*/ +DLL_EXPORT void VLBI_Server_Plot(const char *name, int flags); + +/** +* \brief Obtain an inverse fourier transform from the magnitude and phase models passed. +* \param name The name of the new model +* \param magnitude The name of the model used as magnitude +* \param phase The name of the model used as phase +*/ +DLL_EXPORT void VLBI_Server_Idft(const char *name, const char *magnitude, const char *phase); + +/** +* \brief Save the magnitude and phase to new models obtained by the fourier transform of the model passed. +* \param name The name of the model +* \param magnitude The name of the new model that will contain the magnitude +* \param phase The name of the new model that will contain the phase +*/ +DLL_EXPORT void VLBI_Server_Dft(const char *name, const char *magnitude, const char *phase); + +/** +* \brief Mask a model with another model by multiplication +* \param name The name of the new model +* \param model The name of the model to be masked +* \param mask The name of the mask model +*/ +DLL_EXPORT void VLBI_Server_Mask(const char *name, const char *model, const char *mask); + +/** +* \brief Stack a model with another model +* \param name The name of the new model +* \param model1 The name of the first model to be stacked +* \param model2 The name of the second model to be stacked +*/ +DLL_EXPORT void VLBI_Server_Stack(const char *name, const char *model1, const char *model2); + +/** +* \brief Copy a model into another model +* \param name The name of the new model +* \param model The name of the model to be copied +*/ +DLL_EXPORT void VLBI_Server_Copy(const char *name, const char *model); + +/** +* \brief Diff a model with another model +* \param name The name of the new model +* \param model1 The name of the first model +* \param model2 The name of the second model to be subtracted from model1 +*/ +DLL_EXPORT void VLBI_Server_Diff(const char *name, const char *model1, const char *model2); + +/** +* \brief Convolve a model with a convolution matrix model +* \param name The name of the new model +* \param model1 The name of the model +* \param model2 The name of the model used as convolution matrix +*/ +DLL_EXPORT void VLBI_Server_Convolve(const char *name, const char *model1, const char *model2); + +/** +* \brief Apply a low pass filter on a node buffer +* \param name The name of the new node +* \param node The name of the unfiltered node +* \param freq The cutoff frequency in radians +*/ +DLL_EXPORT void VLBI_Server_LowPass(const char *name, const char *node, double freq); + +/** +* \brief Apply a high pass filter on a node buffer +* \param name The name of the new node +* \param node The name of the unfiltered node +* \param freq The cutoff frequency in radians +*/ +DLL_EXPORT void VLBI_Server_HighPass(const char *name, const char *node, double freq); + +/** +* \brief Apply a band pass filter on a node buffer +* \param name The name of the new node +* \param node The name of the unfiltered node +* \param lofreq The low cut frequency in radians +* \param hifreq The high cut frequency in radians +*/ +DLL_EXPORT void VLBI_Server_BandPass(const char *name, const char *node, double lofreq, double hifreq); + +/** +* \brief Apply a band reject filter on a node buffer +* \param name The name of the new node +* \param node The name of the unfiltered node +* \param lofreq The low cut frequency in radians +* \param hifreq The high cut frequency in radians +*/ +DLL_EXPORT void VLBI_Server_BandReject(const char *name, const char *node, double lofreq, double hifreq); + +/** +* \brief Shift a model by its dimension in-place +* \param name The name of the model +*/ +DLL_EXPORT void VLBI_Server_Shift(const char *name); + +/** +* \brief set the target right ascension coordinate, do this before calling Plot() +* \param value The RA coordinate in hours +*/ +DLL_EXPORT void VLBI_Server_setRa(double value); + +/** +* \brief set the target declination coordinate, do this before calling Plot() +* \param value The Declination coordinate in degrees +*/ +DLL_EXPORT void VLBI_Server_setDec(double value); + +/** +* \brief set the frequency observed, do this before calling Plot() +* \param value The frequency in Hz +*/ +DLL_EXPORT void VLBI_Server_setFreq(double value); + +/** +* \brief set the sampling frequency, do this before calling Plot() +* \param value The sample rate, in samples per second +*/ +DLL_EXPORT void VLBI_Server_setSampleRate(double value); + +/** +* \brief set the bytes per sample, do this before calling addNode() +* \param value The word width in bytes +*/ +DLL_EXPORT void VLBI_Server_setBps(int value); + +/** +* \brief set the plot width, do this before calling Plot() +* \param value plot width in pixels +*/ +DLL_EXPORT void VLBI_Server_setWidth(int value); + +/** +* \brief set the plot height, do this before calling Plot() +* \param value plot height in pixels +*/ +DLL_EXPORT void VLBI_Server_setHeight(int value); + +/** +* \brief get the current right ascension coordinate +* \return The current right ascension in hours +*/ +DLL_EXPORT double VLBI_Server_getRa(); + +/** +* \brief get the current declination coordinate +* \return The current declination in hours +*/ +DLL_EXPORT double VLBI_Server_getDec(); + +/** +* \brief get the current frequency +* \return The frequency in Hz +*/ +DLL_EXPORT double VLBI_Server_getFreq(); + +/** +* \brief get the current sample rate +* \return The sampling rate in sps +*/ +DLL_EXPORT double VLBI_Server_getSampleRate(); + +/** +* \brief set the current correlation order +* \param order The correlation order +*/ +DLL_EXPORT void VLBI_Server_setCorrelationOrder(int order); + +/** +* \brief get the bytes per sample +* \return The word width in bytes +*/ +DLL_EXPORT double VLBI_Server_getBps(); + +/** +* \brief get the plot width +* \return The plot width in pixels +*/ +DLL_EXPORT double VLBI_Server_getWidth(); + +/** +* \brief get the plot height +* \return The plot height in pixels +*/ +DLL_EXPORT double VLBI_Server_getHeight(); + +/** +* \brief set the input stream +* \param in The input stream file pointer +*/ +DLL_EXPORT void VLBI_Server_setInput(FILE* in); + +/** +* \brief get the input stream +* \return The input stream file pointer +*/ +DLL_EXPORT FILE* VLBI_Server_getInput(); + +/** +* \brief set the output stream +* \param out The output stream file pointer +*/ +DLL_EXPORT void VLBI_Server_setOutput(FILE* out); + +/** +* \brief get the output stream +* \return The output stream file pointer +*/ +DLL_EXPORT FILE* VLBI_Server_getOutput(); + +/** +* \brief set the delegate function +* \param func The new delegate +*/ +DLL_EXPORT void VLBI_Server_setDelegate(vlbi_func2_t func); + +/** +* \brief get the current delegate function +* \return The current delegate +*/ +DLL_EXPORT vlbi_func2_t VLBI_Server_getDelegate(); + +#ifdef __cplusplus +} +#endif +#endif //VLBI_SERVER_SHARED