From 2934c27af2eaf7adef32ebae2244b377986a1bdf Mon Sep 17 00:00:00 2001 From: brichards64 Date: Tue, 15 Sep 2026 15:39:25 +0000 Subject: [PATCH] updated slow control prototype --- src/ServiceDiscovery/Services.cpp | 49 +++++++++++-------- src/ServiceDiscovery/Services.h | 7 +-- .../SlowControlCollection.cpp | 2 +- src/ServiceDiscovery/SlowControlElement.cpp | 48 +++++++++++++++--- src/ServiceDiscovery/SlowControlElement.h | 47 ++++++++++++++---- 5 files changed, 112 insertions(+), 41 deletions(-) diff --git a/src/ServiceDiscovery/Services.cpp b/src/ServiceDiscovery/Services.cpp index de163fca..f30d6325 100644 --- a/src/ServiceDiscovery/Services.cpp +++ b/src/ServiceDiscovery/Services.cpp @@ -65,10 +65,10 @@ bool Services::Init(Store &m_variables, zmq::context_t* context_in, SlowControlC sc_vars->Add("State",SlowControlElementType(INFO),0,0,false,false); (*sc_vars)["State"]->SetValue(0); - sc_vars->Add("LoadConfig",SlowControlElementType(COMMAND),std::bind(&Services::LoadConfigSlowControlFunc, this, std::placeholders::_1),0,false,false); + sc_vars->Add("LoadConfig",SlowControlElementType(COMMAND),std::bind(&Services::LoadConfigSlowControlFunc, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3),0,false,false); AlertSubscribe("LoadConfig", std::bind(&Services::LoadConfigAlertFunc, this, std::placeholders::_1, std::placeholders::_2)); - sc_vars->Add("LocalConfig",SlowControlElementType(INFO),0,std::bind(&Services::SCLocalConfig, this, std::placeholders::_1),false,true); // FIXME hidden until Control page supports JSON + sc_vars->Add("LocalConfig",SlowControlElementType(INFO),0,std::bind(&Services::SCLocalConfig, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3),false,true); // FIXME hidden until Control page supports JSON if(!m_variables.Get("service_name",m_name)) m_name="test_service"; @@ -1135,7 +1135,7 @@ SlowControlElement* Services::GetSlowControlVariable(std::string key){ } -bool Services::AddSlowControlVariable(std::string name, SlowControlElementType type, std::function change_function, std::function read_function){ +bool Services::AddSlowControlVariable(std::string name, SlowControlElementType type, std::function change_function, std::function read_function){ return sc_vars->Add(name, type, change_function, read_function); @@ -1245,15 +1245,17 @@ bool Services::LoadConfigAlertFunc(const char* alert, const char* payload){ } -std::string Services::LoadConfigSlowControlFunc(const char* payload){ +bool Services::LoadConfigSlowControlFunc(const char* value, const char* sc_name, std::string& response){ (*sc_vars)["Config"]->SetValue((int)ConfigState::LoadStart); - bool success = LoadConfigAlertFunc("",payload); + bool success = LoadConfigAlertFunc("", value); if(success)(*sc_vars)["Config"]->SetValue((int)ConfigState::LoadEnd); else (*sc_vars)["Config"]->SetValue((int)ConfigState::LoadFail); - if(!success) return std::string("Failed to load config: ")+payload; - return std::string("Loaded config: ")+payload; + if(!success)response = std::string("Failed to load config: ")+value; + else response = std::string("Loaded config: ")+value; + + return success; } @@ -1361,10 +1363,11 @@ std::string Services::GetLocalConfig(){ } -std::string Services::SCLocalConfig(const char*){ +bool Services::SCLocalConfig(const char* value, const char* sc_name, std::string& response){ - return "base: "+std::to_string(m_base_config_id)+", runmode:"+std::to_string(m_run_mode_config_id)+", testing:"+std::to_string(m_testing)+", config: "+m_local_config; + response = "base: "+std::to_string(m_base_config_id)+", runmode:"+std::to_string(m_run_mode_config_id)+", testing:"+std::to_string(m_testing)+", config: "+m_local_config; + return true; } @@ -1407,7 +1410,7 @@ bool Services::SetChangeConfigFunc(std::function func){ allgood = allgood && sc_vars->Add("ChangeConfig", BUTTON, - [this, func](const char*) -> std::string { + [this, func](const char*, const char*, std::string& response) -> bool { (*sc_vars)["Config"]->SetValue((int)ConfigState::ChangeStart); bool ok = func(m_local_config); int new_state; @@ -1416,13 +1419,15 @@ bool Services::SetChangeConfigFunc(std::function func){ std::cerr<<"ChangeConfig Error"<SetWarning(true); + response = "Error"; } else { new_state = (int)ConfigState::ChangeEnd; sc_vars->SetTesting(m_testing); + response = "OK"; } (*sc_vars)["Config"]->SetValue(new_state); (*sc_vars)["NewConfig"]->SetValue(0); - return (ok ? "OK" : "Error"); + return ok; }, // setter 0, // getter false, // not locked during non-testing runs, as it only allows loading configurations in line with the current run type @@ -1432,10 +1437,11 @@ bool Services::SetChangeConfigFunc(std::function func){ allgood = allgood && sc_vars->Add("ChangeToConfig", COMMAND, - [this, func](const char* payload) -> std::string { + [this, func](const char* payload, const char*, std::string& response) -> bool { (*sc_vars)["Config"]->SetValue((int)ConfigState::ChangeStart); bool ok = func(payload); int new_state = ok ? (int)ConfigState::ChangeEnd : (int)ConfigState::ChangeFail; + response = ok ? "OK" : "Error"; (*sc_vars)["Config"]->SetValue(new_state); if(ok && m_local_config.compare(payload) !=0){ m_local_config = payload; @@ -1447,7 +1453,7 @@ bool Services::SetChangeConfigFunc(std::function func){ std::cerr<<"ChangeConfig Error"< func){ allgood = allgood && sc_vars->Add("RunStop", BUTTON, - [this, func](const char*) -> std::string { + [this, func](const char* payload, const char*, std::string& response) -> bool { ResetConfigIDs(); bool ok = func(); if(!ok){ @@ -1491,7 +1497,8 @@ bool Services::SetRunStopFunc(std::function func){ SendLog("RunStop Error", LogLevel::Error); } (*sc_vars)["Config"]->SetValue((int)ConfigState::Unconfigured); - return (ok ? "OK" : "Error"); + response = ok ? "OK" : "Error"; + return ok; }, // setter 0, // getter false, // not locked during non-testing runs: it is a fallback control in case alert gets missed @@ -1528,21 +1535,23 @@ bool Services::SetExportConfigFunc(std::function func){ allgood = allgood && sc_vars->Add("ExportConfig", BUTTON, - [this, func](const char*) -> std::string { + [this, func](const char* payload, const char*, std::string& response) -> bool { bool ok = func(tmp_config); if(!ok){ sc_vars->SetWarning(true); std::cerr<<"ExportConfig Error"< #include #include +#include //#include // uuid class //#include // generators //#include // streaming operators etc. @@ -113,7 +114,7 @@ namespace ToolFramework { SlowControlCollection* GetSlowControlCollection(); SlowControlElement* GetSlowControlVariable(std::string key); - bool AddSlowControlVariable(std::string name, SlowControlElementType type, std::function change_function=nullptr, std::function read_function=nullptr); + bool AddSlowControlVariable(std::string name, SlowControlElementType type, std::function change_function=nullptr, std::function read_function=nullptr); bool RemoveSlowControlVariable(std::string name); void ClearSlowControlVariables(); void ResetConfigIDs(); @@ -138,14 +139,14 @@ namespace ToolFramework { private: - std::string LoadConfigSlowControlFunc(const char* sc_name); + bool LoadConfigSlowControlFunc(const char* value, const char* sc_name, std::string& response); bool LoadConfigAlertFunc(const char* alert, const char* payload); // private methods for sending from buffer bool SendLog(std::string& msg); bool SendMonitoringData(std::string& msg); static void BufferThread(Thread_args* args); static bool BatchAndSendMulticast(BufferThreadArgs* m_args, bool log_lock, bool mon_lock); - std::string SCLocalConfig(const char*); + bool SCLocalConfig(const char* value, const char* sc_name, std::string& response); //size_t GetMTU(std::string iface_name); //std::set GetInterfaces(); diff --git a/src/ServiceDiscovery/SlowControlCollection.cpp b/src/ServiceDiscovery/SlowControlCollection.cpp index 4c541313..7baf858d 100644 --- a/src/ServiceDiscovery/SlowControlCollection.cpp +++ b/src/ServiceDiscovery/SlowControlCollection.cpp @@ -237,7 +237,7 @@ bool SlowControlCollection::Init(zmq::context_t* context, int sc_port, bool new_ Add("State",SlowControlElementType(INFO),0,0,false,false); SC_vars["State"]->SetValue(0); Add("ClearState",SlowControlElementType(BUTTON), - [this](const char*) -> std::string { ClearState(); return "OK";}, + [this](const char*, const char*, std::string&) -> bool { ClearState(); return true;}, 0,false); // add state to the service discovery broadcast; default is no flags (not active, no error, no warning) diff --git a/src/ServiceDiscovery/SlowControlElement.cpp b/src/ServiceDiscovery/SlowControlElement.cpp index fad1e466..7d40bcf9 100644 --- a/src/ServiceDiscovery/SlowControlElement.cpp +++ b/src/ServiceDiscovery/SlowControlElement.cpp @@ -39,11 +39,17 @@ std::string SlowControlElement::Print(){ mtx.lock(); if(m_read_function!=0){ + std::string response=""; + bool ret = false; try{ - options.Set("value",m_read_function("")); + ret = m_read_function("", m_name.c_str(), response); + if(ret) options.Set("value", response); } catch(...){ - std::cerr<<"failed to call read fucntion"<>val; mtx.unlock(); - return SetValue(val); + return SetValue(val, response); } if(m_change_function!=0){ + bool ret = false; try{ - m_change_function(value.c_str()); + ret = m_change_function(value.c_str(), m_name.c_str(), response); } catch(...){ - std::cerr<<"failed to call change fucntion"< SCFunction; + typedef std::function SCFunction; enum SlowControlElementType { BUTTON, VARIABLE, OPTIONS, COMMAND, INFO }; @@ -31,9 +31,12 @@ namespace ToolFramework{ SlowControlElementType GetType(); bool AddCommand(std::string value); bool SetValue(const char value[]); + bool SetValue(const char value[], std::string& response); bool SetDefault(std::string value); bool SetValue(std::string value); + bool SetValue(std::string value, std::string& response); bool GetValue(std::string &value); + bool GetValue(std::string &value, std::string& response); bool Lockable(); bool Hidden(); @@ -90,6 +93,11 @@ namespace ToolFramework{ template bool SetValue(T value){ + std::string tmp =""; + return SetValue(value, tmp); + } + + template bool SetValue(T value, std::string& response){ mtx.lock(); if(m_type == SlowControlElementType(VARIABLE)){ T min; @@ -104,13 +112,17 @@ namespace ToolFramework{ if(m_change_function!=0){ std::stringstream tmp; tmp< bool GetValue(T &value){ + std::string tmp =""; + return GetValue(value, tmp); + } + + template bool GetValue(T &value, std::string& response){ mtx.lock(); if(m_read_function!=0){ + bool ret = false; try{ - options.Set("value",m_read_function("")); + ret = m_read_function("", m_name.c_str(), response); + if(ret) options.Set("value", response); } catch(...){ - std::cerr<<"failed to call read fucntion"<