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);
80 xoap::MessageReference stateMachineXoapHandler(xoap::MessageReference msg);
81 xoap::MessageReference stateMachineResultXoapHandler(xoap::MessageReference msg);
83 bool stateMachineThread(toolbox::task::WorkLoop* workLoop);
86 void infoRequestHandler(xgi::Input* in, xgi::Output* out);
87 void infoRequestResultHandler(xgi::Input* in, xgi::Output* out);
88 bool infoRequestThread(toolbox::task::WorkLoop* workLoop);
91 xoap::MessageReference supervisorCookieCheck(xoap::MessageReference msg);
92 xoap::MessageReference supervisorGetActiveUsers(xoap::MessageReference msg);
93 xoap::MessageReference supervisorSystemMessage(xoap::MessageReference msg);
94 xoap::MessageReference supervisorGetUserInfo(xoap::MessageReference msg);
95 xoap::MessageReference supervisorSystemLogbookEntry(xoap::MessageReference msg);
96 xoap::MessageReference supervisorLastConfigGroupRequest(xoap::MessageReference msg);
99 void stateInitial(toolbox::fsm::FiniteStateMachine& fsm);
100 void statePaused(toolbox::fsm::FiniteStateMachine& fsm);
101 void stateRunning(toolbox::fsm::FiniteStateMachine& fsm);
102 void stateHalted(toolbox::fsm::FiniteStateMachine& fsm);
103 void stateConfigured(toolbox::fsm::FiniteStateMachine& fsm);
104 void inError(toolbox::fsm::FiniteStateMachine& fsm);
106 void transitionConfiguring(toolbox::Event::Reference e);
107 void transitionHalting(toolbox::Event::Reference e);
108 void transitionInitializing(toolbox::Event::Reference e);
109 void transitionPausing(toolbox::Event::Reference e);
110 void transitionResuming(toolbox::Event::Reference e);
111 void transitionStarting(toolbox::Event::Reference e);
112 void transitionStopping(toolbox::Event::Reference e);
113 void transitionShuttingDown(toolbox::Event::Reference e);
114 void transitionStartingUp(toolbox::Event::Reference e);
115 void enteringError(toolbox::Event::Reference e);
117 void makeSystemLogbookEntry(std::string entryText);
119 void checkForAsyncError(
void);
122 virtual void setSupervisorPropertyDefaults(
124 virtual void forceSupervisorPropertyValues(
void)
override;
130 unsigned int getNextRunNumber(
const std::string& fsmName =
"");
131 bool setNextRunNumber(
unsigned int runNumber,
const std::string& fsmName =
"");
132 static std::pair<std::string ,
TableGroupKey> loadGroupNameAndKey(
133 const std::string& fileName, std::string& returnedTimeString);
134 void saveGroupNameAndKey(
135 const std::pair<std::string /*group name*/, TableGroupKey>& theGroup,
136 const std::string& fileName);
137 static xoap::MessageReference lastConfigGroupRequestHandler(
139 static void launchStartOTSCommand(
const std::string& command,
145 std::ostringstream* out,
146 const std::string& command,
147 const std::string& fsmName,
148 const std::string& fsmWindowName,
149 const std::string& username,
150 const std::vector<std::string>& parameters);
151 void broadcastMessage(xoap::MessageReference msg);
153 struct BroadcastMessageIterationsDoneStruct
159 ~BroadcastMessageIterationsDoneStruct()
161 for(
auto& arr : iterationsDone_)
163 iterationsDone_.clear();
167 void push(
const unsigned int& size)
169 iterationsDone_.push_back(
new bool[size]);
170 arraySizes_.push_back(size);
173 for(
unsigned int i = 0; i < size; ++i)
174 iterationsDone_[iterationsDone_.size() - 1][i] =
false;
177 bool* operator[](
unsigned int i) {
return iterationsDone_[i]; }
178 const bool* operator[](
unsigned int i)
const {
return iterationsDone_[i]; }
179 unsigned int size(
unsigned int i = -1)
181 if(i == (
unsigned int)-1)
182 return iterationsDone_.size();
183 return arraySizes_[i];
187 std::vector<bool*> iterationsDone_;
188 std::vector<unsigned int> arraySizes_;
191 struct BroadcastThreadStruct
194 BroadcastThreadStruct()
207 xoap::MessageReference message,
208 const std::string& command,
209 const unsigned int& iteration,
210 bool& iterationsDone)
214 , iteration_(iteration)
215 , iterationsDone_(iterationsDone)
220 xoap::MessageReference message_;
221 const std::string& command_;
222 const unsigned int& iteration_;
223 bool& iterationsDone_;
230 xoap::MessageReference message,
231 const std::string& command,
232 const unsigned int& iteration,
233 bool& iterationsDone)
237 appInfo, message, command, iteration, iterationsDone));
241 const SupervisorInfo& getAppInfo() {
return messages_[0].appInfo_; }
242 xoap::MessageReference getMessage() {
return messages_[0].message_; }
243 const std::string& getCommand() {
return messages_[0].command_; }
244 const unsigned int& getIteration() {
return messages_[0].iteration_; }
245 std::string& getReply() {
return messages_[0].reply_; }
246 bool& getIterationsDone() {
return messages_[0].iterationsDone_; }
249 std::mutex threadMutex;
250 unsigned int threadIndex_;
251 volatile bool exitThread_, working_, workToDo_, error_;
253 std::vector<BroadcastThreadStruct::BroadcastMessageStruct> messages_;
256 static void broadcastMessageThread(
257 GatewaySupervisor* supervisorPtr,
258 GatewaySupervisor::BroadcastThreadStruct* threadStruct);
259 bool handleBroadcastMessageTarget(
const SupervisorInfo& appInfo,
260 xoap::MessageReference message,
261 const std::string& command,
262 const unsigned int& iteration,
264 unsigned int threadIndex = 0);
266 bool supervisorGuiHasBeenLoaded_;
271 WebUsers theWebUsers_;
272 SystemMessenger theSystemMessenger_;
273 ARTDAQCommandable theArtdaqCommandable_;
275 WorkLoopManager stateMachineWorkLoopManager_;
276 toolbox::BSem stateMachineSemaphore_;
277 WorkLoopManager infoRequestWorkLoopManager_;
278 toolbox::BSem infoRequestSemaphore_;
280 std::string activeStateMachineName_;
283 std::string activeStateMachineWindowName_;
284 std::pair<std::string , TableGroupKey>
285 theConfigurationTableGroup_;
288 Iterator theIterator_;
289 std::mutex stateMachineAccessMutex_;
291 std::string stateMachineLastCommandInput_;
298 CodeEditor codeEditor_;
300 std::mutex broadcastCommandMessageIndexMutex_, broadcastIterationsDoneMutex_;
301 unsigned int broadcastCommandMessageIndex_;
302 bool broadcastIterationsDone_;
305 char tmpStringForConversions_[100];
308 void wait(
int milliseconds, std::string who =
"")
const;
309 unsigned long long counterTest_;
310 std::vector<int> vectorTest_;
311 std::string securityType_;