1 #ifndef _ots_GatewaySupervisor_h
2 #define _ots_GatewaySupervisor_h
4 #include "otsdaq-core/CoreSupervisors/CorePropertySupervisorBase.h"
5 #include "otsdaq-core/FiniteStateMachine/RunControlStateMachine.h"
6 #include "otsdaq-core/GatewaySupervisor/ARTDAQCommandable.h"
7 #include "otsdaq-core/GatewaySupervisor/Iterator.h"
8 #include "otsdaq-core/SOAPUtilities/SOAPMessenger.h"
9 #include "otsdaq-core/SupervisorInfo/AllSupervisorInfo.h"
10 #include "otsdaq-core/SystemMessenger/SystemMessenger.h"
11 #include "otsdaq-core/TableCore/TableGroupKey.h"
12 #include "otsdaq-core/WebUsersUtilities/WebUsers.h"
13 #include "otsdaq-core/WorkLoopManager/WorkLoopManager.h"
15 #include "otsdaq-core/CodeEditor/CodeEditor.h"
17 #pragma GCC diagnostic push
18 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
19 #include <xdaq/Application.h>
20 #pragma GCC diagnostic pop
21 #include "otsdaq-core/Macros/XDAQApplicationMacros.h"
23 #include <toolbox/task/WorkLoop.h>
24 #include <xdata/String.h>
25 #include <xgi/Method.h>
31 #define FSM_LAST_CONFIGURED_GROUP_ALIAS_FILE \
32 std::string("FSMLastConfiguredGroupAlias.hist")
33 #define FSM_LAST_STARTED_GROUP_ALIAS_FILE std::string("FSMLastStartedGroupAlias.hist")
37 class ConfigurationManager;
39 class WorkLoopManager;
62 void Default(xgi::Input* in, xgi::Output* out);
68 void loginRequest(xgi::Input* in, xgi::Output* out);
69 void request(xgi::Input* in, xgi::Output* out);
70 void tooltipRequest(xgi::Input* in, xgi::Output* out);
74 void stateMachineXgiHandler(xgi::Input* in, xgi::Output* out);
75 void stateMachineIterationBreakpoint(xgi::Input* in, xgi::Output* out);
81 xoap::MessageReference stateMachineXoapHandler(xoap::MessageReference msg);
82 xoap::MessageReference stateMachineResultXoapHandler(xoap::MessageReference msg);
84 bool stateMachineThread(toolbox::task::WorkLoop* workLoop);
87 void infoRequestHandler(xgi::Input* in, xgi::Output* out);
88 void infoRequestResultHandler(xgi::Input* in, xgi::Output* out);
89 bool infoRequestThread(toolbox::task::WorkLoop* workLoop);
92 xoap::MessageReference supervisorCookieCheck(xoap::MessageReference msg);
93 xoap::MessageReference supervisorGetActiveUsers(xoap::MessageReference msg);
94 xoap::MessageReference supervisorSystemMessage(xoap::MessageReference msg);
95 xoap::MessageReference supervisorGetUserInfo(xoap::MessageReference msg);
96 xoap::MessageReference supervisorSystemLogbookEntry(xoap::MessageReference msg);
97 xoap::MessageReference supervisorLastConfigGroupRequest(xoap::MessageReference msg);
100 void stateInitial(toolbox::fsm::FiniteStateMachine& fsm);
101 void statePaused(toolbox::fsm::FiniteStateMachine& fsm);
102 void stateRunning(toolbox::fsm::FiniteStateMachine& fsm);
103 void stateHalted(toolbox::fsm::FiniteStateMachine& fsm);
104 void stateConfigured(toolbox::fsm::FiniteStateMachine& fsm);
105 void inError(toolbox::fsm::FiniteStateMachine& fsm);
107 void transitionConfiguring(toolbox::Event::Reference e);
108 void transitionHalting(toolbox::Event::Reference e);
109 void transitionInitializing(toolbox::Event::Reference e);
110 void transitionPausing(toolbox::Event::Reference e);
111 void transitionResuming(toolbox::Event::Reference e);
112 void transitionStarting(toolbox::Event::Reference e);
113 void transitionStopping(toolbox::Event::Reference e);
114 void transitionShuttingDown(toolbox::Event::Reference e);
115 void transitionStartingUp(toolbox::Event::Reference e);
116 void enteringError(toolbox::Event::Reference e);
118 void makeSystemLogbookEntry(std::string entryText);
120 void checkForAsyncError(
void);
123 virtual void setSupervisorPropertyDefaults(
125 virtual void forceSupervisorPropertyValues(
void)
override;
131 unsigned int getNextRunNumber(
const std::string& fsmName =
"");
132 bool setNextRunNumber(
unsigned int runNumber,
const std::string& fsmName =
"");
133 static std::pair<std::string ,
TableGroupKey> loadGroupNameAndKey(
134 const std::string& fileName, std::string& returnedTimeString);
135 void saveGroupNameAndKey(
136 const std::pair<std::string /*group name*/, TableGroupKey>& theGroup,
137 const std::string& fileName);
138 static xoap::MessageReference lastConfigGroupRequestHandler(
140 static void launchStartOTSCommand(
const std::string& command,
146 std::ostringstream* out,
147 const std::string& command,
148 const std::string& fsmName,
149 const std::string& fsmWindowName,
150 const std::string& username,
151 const std::vector<std::string>& parameters);
152 void broadcastMessage(xoap::MessageReference msg);
154 struct BroadcastMessageIterationsDoneStruct
160 ~BroadcastMessageIterationsDoneStruct()
162 for(
auto& arr : iterationsDone_)
164 iterationsDone_.clear();
168 void push(
const unsigned int& size)
170 iterationsDone_.push_back(
new bool[size]);
171 arraySizes_.push_back(size);
174 for(
unsigned int i = 0; i < size; ++i)
175 iterationsDone_[iterationsDone_.size() - 1][i] =
false;
178 bool* operator[](
unsigned int i) {
return iterationsDone_[i]; }
179 const bool* operator[](
unsigned int i)
const {
return iterationsDone_[i]; }
180 unsigned int size(
unsigned int i = -1)
182 if(i == (
unsigned int)-1)
183 return iterationsDone_.size();
184 return arraySizes_[i];
188 std::vector<bool*> iterationsDone_;
189 std::vector<unsigned int> arraySizes_;
192 struct BroadcastThreadStruct
195 BroadcastThreadStruct()
208 xoap::MessageReference message,
209 const std::string& command,
210 const unsigned int& iteration,
211 bool& iterationsDone)
215 , iteration_(iteration)
216 , iterationsDone_(iterationsDone)
221 xoap::MessageReference message_;
222 const std::string& command_;
223 const unsigned int& iteration_;
224 bool& iterationsDone_;
231 xoap::MessageReference message,
232 const std::string& command,
233 const unsigned int& iteration,
234 bool& iterationsDone)
238 appInfo, message, command, iteration, iterationsDone));
242 const SupervisorInfo& getAppInfo() {
return messages_[0].appInfo_; }
243 xoap::MessageReference getMessage() {
return messages_[0].message_; }
244 const std::string& getCommand() {
return messages_[0].command_; }
245 const unsigned int& getIteration() {
return messages_[0].iteration_; }
246 std::string& getReply() {
return messages_[0].reply_; }
247 bool& getIterationsDone() {
return messages_[0].iterationsDone_; }
250 std::mutex threadMutex;
251 unsigned int threadIndex_;
252 volatile bool exitThread_, working_, workToDo_, error_;
254 std::vector<BroadcastThreadStruct::BroadcastMessageStruct> messages_;
257 static void broadcastMessageThread(
258 GatewaySupervisor* supervisorPtr,
259 GatewaySupervisor::BroadcastThreadStruct* threadStruct);
260 bool handleBroadcastMessageTarget(
const SupervisorInfo& appInfo,
261 xoap::MessageReference message,
262 const std::string& command,
263 const unsigned int& iteration,
265 unsigned int threadIndex = 0);
267 bool supervisorGuiHasBeenLoaded_;
272 WebUsers theWebUsers_;
273 SystemMessenger theSystemMessenger_;
274 ARTDAQCommandable theArtdaqCommandable_;
276 WorkLoopManager stateMachineWorkLoopManager_;
277 toolbox::BSem stateMachineSemaphore_;
278 WorkLoopManager infoRequestWorkLoopManager_;
279 toolbox::BSem infoRequestSemaphore_;
281 std::string activeStateMachineName_;
284 std::string activeStateMachineWindowName_;
285 std::pair<std::string , TableGroupKey>
286 theConfigurationTableGroup_;
289 Iterator theIterator_;
290 std::mutex stateMachineAccessMutex_;
292 std::string stateMachineLastCommandInput_;
299 CodeEditor codeEditor_;
301 std::mutex broadcastCommandMessageIndexMutex_, broadcastIterationsDoneMutex_;
302 unsigned int broadcastCommandMessageIndex_;
303 bool broadcastIterationsDone_;
304 std::mutex broadcastIterationBreakpointMutex_;
305 unsigned int broadcastIterationBreakpoint_;
309 char tmpStringForConversions_[100];
312 void wait(
int milliseconds, std::string who =
"")
const;
313 unsigned long long counterTest_;
314 std::vector<int> vectorTest_;
315 std::string securityType_;