diff --git a/LCS/WinCCWrapper/include/WinCCManager.h b/LCS/WinCCWrapper/include/WinCCManager.h index e20173301ce710a339820b9be779fad17ede6c8b..620d4adeb6880338f34919832481f7cf0146ce18 100644 --- a/LCS/WinCCWrapper/include/WinCCManager.h +++ b/LCS/WinCCWrapper/include/WinCCManager.h @@ -72,6 +72,9 @@ public: //! get the datapoint with the given name and return it's DynVar value in parameter value. returns true upon success. bool get_datapoint(const std::string &name, DynVar &value); + bool get_datapoint(const std::string &name, std::vector<int> &value); + + //! mark the datapoint with given name valid. returns true upon success. bool set_datapoint_valid(const std::string &name) { return set_datapoint_validity(name, true, nullptr); } //! mark the datapoint with given name invalid. returns true upon success. diff --git a/LCS/WinCCWrapper/include/WinCCWrapper.h b/LCS/WinCCWrapper/include/WinCCWrapper.h index f81fa55ea6c834e6c668863a3257bf895584239f..76a5cc33e9562994fe71b2d6654555691f77fdf3 100644 --- a/LCS/WinCCWrapper/include/WinCCWrapper.h +++ b/LCS/WinCCWrapper/include/WinCCWrapper.h @@ -50,6 +50,8 @@ public: //! set the datapoint with given name to the given int value, mark it valid/invalid, returns true upon success. bool set_datapoint(const std::string &name, int value, bool valid=true); + //! set the datapoint with given name to the given std::vector<int> value, mark it valid/invalid, returns true upon success. + bool set_datapoint(const std::string &name, std::vector<int> &value, bool valid=true); //! set the datapoint with given name to the given long value, mark it valid/invalid, returns true upon success. bool set_datapoint(const std::string &name, long value, bool valid=true); //! set the datapoint with given name to the given float value, mark it valid/invalid, returns true upon success. @@ -60,8 +62,6 @@ public: bool set_datapoint(const std::string &name, std::string value, bool valid=true); //! set the datapoint with given name to the given time_t value, mark it valid/invalid, returns true upon success. bool set_datapoint_time(const std::string &name, time_t value, bool valid=true); - //! set the datapoint with given name to the given DynVar value, mark it valid/invalid, returns true upon success. - bool set_datapoint(const std::string &name, DynVar value, bool valid=true); //! mark the datapoint with given name valid. bool set_datapoint_valid(const std::string &name); @@ -80,8 +80,8 @@ public: std::string get_datapoint_string(const std::string &name); //! get the datapoint with the given name and return it as a time_t value if possible, otherwise an exception is raised. time_t get_datapoint_time(const std::string &name); - //! get the datapoint with the given name and return it as a DynVar value if possible, otherwise an exception is raised. - DynVar get_datapoint_DynVar(const std::string &name); + //! get the datapoint with the given name and return it as a std::vector<int> value if possible, otherwise an exception is raised. + std::vector<int> get_datapoint_int_vector(const std::string &name); private: // get_datapoint diff --git a/LCS/WinCCWrapper/src/WinCCManager.cc b/LCS/WinCCWrapper/src/WinCCManager.cc index 6b311931ec905e2820eac1f101ac223a9c89b76f..96ade22ce8bedc365ac07901bd9847e88a4bd129 100644 --- a/LCS/WinCCWrapper/src/WinCCManager.cc +++ b/LCS/WinCCWrapper/src/WinCCManager.cc @@ -32,6 +32,7 @@ #include <IntegerVar.hxx> #include <LongVar.hxx> #include <TextVar.hxx> +#include <DynVar.hxx> #include <cassert> #include <DynVar.hxx> @@ -226,6 +227,28 @@ bool WinCCManager::get_datapoint_variable(const std::string &name, Variable *&va template <typename Tval> Variable::ConvertResult convert(Variable *var, Tval &value, Variable *&converted_var); +template <> +Variable::ConvertResult convert(Variable *var, std::vector<int> &value, Variable *&converted_var) +{ + Variable::ConvertResult cr = var->convert(VariableType::DYN_VAR, converted_var); + if(Variable::ConvertResult::OK == cr) + { + DynVar *dv = (DynVar*)converted_var; + value.resize(dv->getNumberOfItems()); + + for(unsigned int i = 0; dv->getNumberOfItems(); i++) { + Variable *elem = dv->getAt(i); + if(elem->inherits(VariableType::INTEGER_VAR)) { + value[i] = ((IntegerVar*)elem)->getValue(); + } + else + return Variable::ConvertResult::CONV_NOT_DEFINED; + } + } + return cr; +} + + template <> Variable::ConvertResult convert(Variable *var, int &value, Variable *&converted_var) { @@ -286,19 +309,6 @@ Variable::ConvertResult convert(Variable *var, struct tm &value, Variable *&conv return cr; } -template <> -Variable::ConvertResult convert(Variable *var, int[] &value, Variable *&converted_var) -{ - Variable::ConvertResult cr = var->convert(VariableType::DYN_VAR, converted_var); - if(Variable::ConvertResult::OK == cr) { - for (int i = 0; i < value.getNumberOfItems(); i++) { - value[i] = ((DynVar*)converted_var)->getNext(); - } - } - - return cr; -} - //internal generic method to get the typed (Tval) value of a datapoint //used by the public strictly typed methods template <typename Tval> @@ -356,7 +366,7 @@ bool WinCCManager::get_datapoint(const std::string &name, struct tm &value) return _get_datapoint(name, value); } -bool WinCCManager::get_datapoint(const std::string &name, DynVar &value) +bool WinCCManager::get_datapoint(const std::string &name, std::vector<int> &value) { return _get_datapoint(name, value); } diff --git a/LCS/WinCCWrapper/src/WinCCWrapper.cc b/LCS/WinCCWrapper/src/WinCCWrapper.cc index 239e30f6b1faf193cc15bbf5009aac6985353de4..b3d62bcbf000560b2cdeeed96d810d66ebd6e862 100644 --- a/LCS/WinCCWrapper/src/WinCCWrapper.cc +++ b/LCS/WinCCWrapper/src/WinCCWrapper.cc @@ -74,6 +74,18 @@ bool WinCCWrapper::set_datapoint(const std::string &name, int value, bool valid) return manager->set_datapoint(name + DP_SUFFIX, variable, valid); } +bool WinCCWrapper::set_datapoint(const std::string &name, std::vector<int> &value, bool valid) +{ + DynVar variable(VariableType::INTEGER_VAR); + + for(auto iter = value.cbegin(); iter != value.cend(); iter++) { + IntegerVar elem{*iter}; + variable.append(elem); + } + + return manager->set_datapoint(name + DP_SUFFIX, variable, valid); +} + bool WinCCWrapper::set_datapoint(const std::string &name, long value, bool valid) { LongVar variable{value}; @@ -110,13 +122,6 @@ bool WinCCWrapper::set_datapoint_time(const std::string &name, time_t value, boo return manager->set_datapoint(name + DP_SUFFIX, variable, valid); } -bool WinCCWrapper::set_datapoint(const std::string &name, DynVar value, bool valid) -{ - DynVar variable{value}; - - return manager->set_datapoint(name + DP_SUFFIX, variable, valid); -} - // get_datapoint template <typename T> bool WinCCWrapper::get_datapoint(const std::string &name, T &value) @@ -132,6 +137,14 @@ int WinCCWrapper::get_datapoint_int(const std::string &name) throw std::runtime_error("Could not get datapoint"); } +std::vector<int> WinCCWrapper::get_datapoint_int_vector(const std::string &name) +{ + std::vector<int> value; + if(get_datapoint(name, value)) + return value; + throw std::runtime_error("Could not get datapoint"); +} + long WinCCWrapper::get_datapoint_long(const std::string &name) { long value; @@ -172,14 +185,6 @@ time_t WinCCWrapper::get_datapoint_time(const std::string &name) throw std::runtime_error("Could not get datapoint"); } -DynVar WinCCWrapper::get_datapoint_DynVar(const std::string &name) -{ - DynVar value; - if(get_datapoint(name, value)) - return value; - throw std::runtime_error("Could not get datapoint"); -} - bool WinCCWrapper::set_datapoint_valid(const std::string &name) { return manager->set_datapoint_valid(name + DP_SUFFIX); diff --git a/LCS/WinCCWrapper/src/WinCCWrapper_boost_python.cc b/LCS/WinCCWrapper/src/WinCCWrapper_boost_python.cc index f635cbc1f704786ca825afad5d644bbd5ad12e70..9e4818ab3fd65a4018be312212ccee031fe08a27 100644 --- a/LCS/WinCCWrapper/src/WinCCWrapper_boost_python.cc +++ b/LCS/WinCCWrapper/src/WinCCWrapper_boost_python.cc @@ -26,6 +26,7 @@ BOOST_PYTHON_MODULE(pywincc) using namespace LOFAR::WINCCWRAPPER; bool (WinCCWrapper::*set_datapoint_int)(const std::string&, int, bool) = &WinCCWrapper::set_datapoint; + bool (WinCCWrapper::*set_datapoint_int_vector)(const std::string&, std::vector<int>&, bool) = &WinCCWrapper::set_datapoint; bool (WinCCWrapper::*set_datapoint_long)(const std::string&, long, bool) = &WinCCWrapper::set_datapoint; bool (WinCCWrapper::*set_datapoint_float)(const std::string&, float, bool) = &WinCCWrapper::set_datapoint; bool (WinCCWrapper::*set_datapoint_bool)(const std::string&, bool, bool) = &WinCCWrapper::set_datapoint; @@ -33,10 +34,10 @@ BOOST_PYTHON_MODULE(pywincc) bool (WinCCWrapper::*set_datapoint_time)(const std::string&, time_t, bool) = &WinCCWrapper::set_datapoint_time; bool (WinCCWrapper::*set_datapoint_valid)(const std::string&) = &WinCCWrapper::set_datapoint_valid; bool (WinCCWrapper::*set_datapoint_invalid)(const std::string&) = &WinCCWrapper::set_datapoint_invalid; - bool (WinCCWrapper::*set_datapoint_DynVar)(const std::string&, DynVar, bool) = &WinCCWrapper::set_datapoint; class_<WinCCWrapper>("WinCCWrapper", init<const std::string&>()) .def("set_datapoint_int", set_datapoint_int) + .def("set_datapoint_int_vector", set_datapoint_int_vector) .def("set_datapoint_long", set_datapoint_long) .def("set_datapoint_float", set_datapoint_float) .def("set_datapoint_bool", set_datapoint_bool) @@ -45,15 +46,14 @@ BOOST_PYTHON_MODULE(pywincc) .def("set_datapoint", set_datapoint_float) // 'common'/'generic' set_datapoint python method just calls set_datapoint_float .def("set_datapoint_valid", set_datapoint_valid) .def("set_datapoint_invalid", set_datapoint_invalid) - .def("set_datapoint_DynVar", set_datapoint_DynVar) .def("get_datapoint_int", &WinCCWrapper::get_datapoint_int) + .def("get_datapoint_int_vector", &WinCCWrapper::get_datapoint_int_vector) .def("get_datapoint_long", &WinCCWrapper::get_datapoint_long) .def("get_datapoint_float", &WinCCWrapper::get_datapoint_float) .def("get_datapoint_bool", &WinCCWrapper::get_datapoint_bool) .def("get_datapoint_string", &WinCCWrapper::get_datapoint_string) .def("get_datapoint_time", &WinCCWrapper::get_datapoint_time) .def("get_datapoint", &WinCCWrapper::get_datapoint_float) // 'common'/'generic' get_datapoint python method just calls get_datapoint_float - .def("get_datapoint_DynVar", &WinCCWrapper:get_datapoint_DynVar) ; }