1 #ifndef _ots_GatewaySupervisor_h
2 #define _ots_GatewaySupervisor_h
4 #include "otsdaq/CoreSupervisors/ConfigurationSupervisorBase.h"
5 #include "otsdaq/CoreSupervisors/CorePropertySupervisorBase.h"
6 #include "otsdaq/FiniteStateMachine/RunControlStateMachine.h"
7 #include "otsdaq/GatewaySupervisor/Iterator.h"
8 #include "otsdaq/SOAPUtilities/SOAPMessenger.h"
9 #include "otsdaq/SupervisorInfo/AllSupervisorInfo.h"
10 #include "otsdaq/SystemMessenger/SystemMessenger.h"
11 #include "otsdaq/TableCore/TableGroupKey.h"
12 #include "otsdaq/WebUsersUtilities/WebUsers.h"
13 #include "otsdaq/WorkLoopManager/WorkLoopManager.h"
15 #include "otsdaq/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/Macros/XDAQApplicationMacros.h"
23 #include <toolbox/task/WorkLoop.h>
24 #include <xdata/String.h>
25 #include <xgi/Method.h>
32 #define FSM_LAST_CONFIGURED_GROUP_ALIAS_FILE \
33 std::string("FSMLastConfiguredGroupAlias.hist")
34 #define FSM_LAST_STARTED_GROUP_ALIAS_FILE std::string("FSMLastStartedGroupAlias.hist")
38 class ConfigurationManager;
40 class WorkLoopManager;
65 void Default (xgi::Input* in, xgi::Output* out);
67 void loginRequest (xgi::Input* in, xgi::Output* out);
68 void request (xgi::Input* in, xgi::Output* out);
69 void tooltipRequest (xgi::Input* in, xgi::Output* out);
72 void stateMachineXgiHandler (xgi::Input* in, xgi::Output* out);
73 void stateMachineIterationBreakpoint (xgi::Input* in, xgi::Output* out);
75 static void handleAddDesktopIconRequest (
const std::string& author, cgicc::Cgicc& cgiIn,
HttpXmlDocument& xmlOut);
77 xoap::MessageReference stateMachineXoapHandler(xoap::MessageReference msg);
78 xoap::MessageReference stateMachineResultXoapHandler(xoap::MessageReference msg);
80 bool stateMachineThread(toolbox::task::WorkLoop* workLoop);
83 void statusRequest(xgi::Input* in, xgi::Output* out);
84 void infoRequestResultHandler(xgi::Input* in, xgi::Output* out);
85 bool infoRequestThread(toolbox::task::WorkLoop* workLoop);
88 xoap::MessageReference supervisorCookieCheck(xoap::MessageReference msg);
89 xoap::MessageReference supervisorGetActiveUsers(xoap::MessageReference msg);
90 xoap::MessageReference supervisorSystemMessage(xoap::MessageReference msg);
91 xoap::MessageReference supervisorGetUserInfo(xoap::MessageReference msg);
92 xoap::MessageReference supervisorSystemLogbookEntry(xoap::MessageReference msg);
93 xoap::MessageReference supervisorLastConfigGroupRequest(xoap::MessageReference msg);
96 void stateInitial(toolbox::fsm::FiniteStateMachine& fsm);
97 void statePaused(toolbox::fsm::FiniteStateMachine& fsm);
98 void stateRunning(toolbox::fsm::FiniteStateMachine& fsm);
99 void stateHalted(toolbox::fsm::FiniteStateMachine& fsm);
100 void stateConfigured(toolbox::fsm::FiniteStateMachine& fsm);
101 void inError(toolbox::fsm::FiniteStateMachine& fsm);
103 void transitionConfiguring(toolbox::Event::Reference e);
104 void transitionHalting(toolbox::Event::Reference e);
105 void transitionInitializing(toolbox::Event::Reference e);
106 void transitionPausing(toolbox::Event::Reference e);
107 void transitionResuming(toolbox::Event::Reference e);
108 void transitionStarting(toolbox::Event::Reference e);
109 void transitionStopping(toolbox::Event::Reference e);
110 void transitionShuttingDown(toolbox::Event::Reference e);
111 void transitionStartingUp(toolbox::Event::Reference e);
112 void enteringError(toolbox::Event::Reference e);
114 void makeSystemLogbookEntry(std::string entryText);
116 void checkForAsyncError(
void);
119 virtual void setSupervisorPropertyDefaults(
121 virtual void forceSupervisorPropertyValues(
void)
override;
127 unsigned int getNextRunNumber(
const std::string& fsmName =
"");
128 bool setNextRunNumber(
unsigned int runNumber,
const std::string& fsmName =
"");
129 static std::pair<std::string ,
TableGroupKey> loadGroupNameAndKey(
130 const std::string& fileName, std::string& returnedTimeString);
131 void saveGroupNameAndKey(
132 const std::pair<std::string /*group name*/, TableGroupKey>& theGroup,
133 const std::string& fileName);
134 static xoap::MessageReference lastConfigGroupRequestHandler(
136 static void launchStartOTSCommand(
const std::string& command,
144 std::ostringstream* out,
145 const std::string& command,
146 const std::string& fsmName,
147 const std::string& fsmWindowName,
148 const std::string& username,
149 const std::vector<std::string>& parameters);
150 void broadcastMessage(xoap::MessageReference msg);
152 struct BroadcastMessageIterationsDoneStruct
158 ~BroadcastMessageIterationsDoneStruct()
160 for(
auto& arr : iterationsDone_)
162 iterationsDone_.clear();
166 void push(
const unsigned int& size)
168 iterationsDone_.push_back(
new bool[size]);
169 arraySizes_.push_back(size);
172 for(
unsigned int i = 0; i < size; ++i)
173 iterationsDone_[iterationsDone_.size() - 1][i] =
false;
176 bool* operator[](
unsigned int i) {
return iterationsDone_[i]; }
177 const bool* operator[](
unsigned int i)
const {
return iterationsDone_[i]; }
178 unsigned int size(
unsigned int i = -1)
180 if(i == (
unsigned int)-1)
181 return iterationsDone_.size();
182 return arraySizes_[i];
186 std::vector<bool*> iterationsDone_;
187 std::vector<unsigned int> arraySizes_;
190 struct BroadcastThreadStruct
193 BroadcastThreadStruct()
206 xoap::MessageReference message,
207 const std::string& command,
208 const unsigned int& iteration,
209 bool& iterationsDone)
213 , iteration_(iteration)
214 , iterationsDone_(iterationsDone)
219 xoap::MessageReference message_;
220 const std::string& command_;
221 const unsigned int& iteration_;
222 bool& iterationsDone_;
229 xoap::MessageReference message,
230 const std::string& command,
231 const unsigned int& iteration,
232 bool& iterationsDone)
236 appInfo, message, command, iteration, iterationsDone));
240 const SupervisorInfo& getAppInfo() {
return messages_[0].appInfo_; }
241 xoap::MessageReference getMessage() {
return messages_[0].message_; }
242 const std::string& getCommand() {
return messages_[0].command_; }
243 const unsigned int& getIteration() {
return messages_[0].iteration_; }
244 std::string& getReply() {
return messages_[0].reply_; }
245 bool& getIterationsDone() {
return messages_[0].iterationsDone_; }
248 std::mutex threadMutex;
249 unsigned int threadIndex_;
250 volatile bool exitThread_, working_, workToDo_, error_;
252 std::vector<BroadcastThreadStruct::BroadcastMessageStruct> messages_;
255 static void broadcastMessageThread(
256 GatewaySupervisor* supervisorPtr,
257 GatewaySupervisor::BroadcastThreadStruct* threadStruct);
258 bool handleBroadcastMessageTarget(
const SupervisorInfo& appInfo,
259 xoap::MessageReference message,
260 const std::string& command,
261 const unsigned int& iteration,
263 unsigned int threadIndex = 0);
265 bool supervisorGuiHasBeenLoaded_;
270 WebUsers theWebUsers_;
271 SystemMessenger theSystemMessenger_;
273 WorkLoopManager stateMachineWorkLoopManager_;
274 toolbox::BSem stateMachineSemaphore_;
275 WorkLoopManager infoRequestWorkLoopManager_;
276 toolbox::BSem infoRequestSemaphore_;
278 std::string activeStateMachineName_;
281 std::string activeStateMachineWindowName_;
282 std::pair<std::string , TableGroupKey>
283 theConfigurationTableGroup_;
286 Iterator theIterator_;
287 std::mutex stateMachineAccessMutex_;
289 std::string stateMachineLastCommandInput_;
296 CodeEditor codeEditor_;
298 std::mutex broadcastCommandMessageIndexMutex_, broadcastIterationsDoneMutex_;
299 unsigned int broadcastCommandMessageIndex_;
300 bool broadcastIterationsDone_;
301 std::mutex broadcastIterationBreakpointMutex_;
302 unsigned int broadcastIterationBreakpoint_;
306 char tmpStringForConversions_[100];
309 void wait(
int milliseconds, std::string who =
"")
const;
310 unsigned long long counterTest_;
311 std::vector<int> vectorTest_;
312 std::string securityType_;