otsdaq  3.03.00
Iterator.h
1 #ifndef _ots_Iterator_h
2 #define _ots_Iterator_h
3 
4 #include <mutex> //for std::mutex
5 #include <string>
6 #include "otsdaq/TablePlugins/IterateTable.h"
7 #include "otsdaq/XmlUtilities/HttpXmlDocument.h"
8 
9 #include "otsdaq/ConfigurationInterface/ConfigurationManagerRW.h"
10 
11 // clang-format off
12 
13 namespace ots
14 {
15 class GatewaySupervisor;
16 class ConfigurationManagerRW;
17 
18 class Iterator
19 {
20  friend class GatewaySupervisor;
21 
22  public:
23  Iterator(GatewaySupervisor* supervisor);
24  ~Iterator(void);
25 
26  static const std::string RESERVED_GEN_PLAN_NAME;
27 
28  void playIterationPlan (HttpXmlDocument& xmldoc, const std::string& planName);
29  void playGeneratedIterationPlan (HttpXmlDocument& xmldoc, const std::string& parametersCSV);
30  void playGeneratedIterationPlan (HttpXmlDocument& xmldoc, const std::string& fsmName, const std::string& configAlias, uint64_t durationSeconds = -1, unsigned int numberOfRuns = 1, bool keepConfiguration = false, const std::string& logEntry = "");
31  void pauseIterationPlan (HttpXmlDocument& xmldoc);
32  void haltIterationPlan (HttpXmlDocument& xmldoc);
34 
35 
36  bool handleCommandRequest (HttpXmlDocument& xmldoc, const std::string& command, const std::string& parameter);
37 
38  private:
39 
40  void playIterationPlanPrivate (HttpXmlDocument& xmldoc, const std::string& planName);
41  static std::vector<
42  IterateTable::Command> generateIterationPlan (const std::string& fsmName, const std::string& configAlias, uint64_t durationSeconds = -1, unsigned int numberOfRuns = 1);
43 
45  struct IteratorWorkLoopStruct
46  {
47  IteratorWorkLoopStruct(Iterator* iterator, ConfigurationManagerRW* cfgMgr)
48  : theIterator_(iterator)
49  , cfgMgr_(cfgMgr)
50  , originalTrackChanges_(false)
51  , running_(false)
52  , commandBusy_(false)
53  , doPauseAction_(false)
54  , doHaltAction_(false)
55  , doResumeAction_(false)
56  , commandIndex_((unsigned int)-1)
57  {
58  }
59 
60  Iterator* theIterator_;
61  ConfigurationManagerRW* cfgMgr_;
62  bool originalTrackChanges_;
63  std::string originalConfigGroup_;
64  TableGroupKey originalConfigKey_;
65 
66  bool running_, commandBusy_;
67  bool doPauseAction_, doHaltAction_, doResumeAction_;
68  bool onlyConfigIfNotConfigured_ = false;
69 
70  std::string activePlan_;
71  std::vector<IterateTable::Command> commands_;
72  std::vector<unsigned int> commandIterations_;
73  unsigned int commandIndex_;
74  std::vector<unsigned int> stepIndexStack_;
75  time_t originalDurationInSeconds_;
76 
77  // associated with FSM
78  std::string fsmName_, fsmRunAlias_;
79  unsigned int fsmNextRunNumber_;
80  bool runIsDone_;
81  bool waitIsDone_;
82 
83  std::vector<std::string> fsmCommandParameters_;
84  std::vector<bool> targetsDone_;
85 
86 
87  }; // end declaration of iterator workloop members
88 
89  static void IteratorWorkLoop(Iterator* iterator);
90  static void startCommand(IteratorWorkLoopStruct* iteratorStruct);
91  static bool checkCommand(IteratorWorkLoopStruct* iteratorStruct);
92 
93  static void startCommandChooseFSM(IteratorWorkLoopStruct* iteratorStruct, const std::string& fsmName);
94 
95  static void startCommandConfigureActive(IteratorWorkLoopStruct* iteratorStruct);
96  static void startCommandConfigureAlias(IteratorWorkLoopStruct* iteratorStruct, const std::string& systemAlias);
97  static void startCommandConfigureGroup(IteratorWorkLoopStruct* iteratorStruct);
98  static bool checkCommandConfigure(IteratorWorkLoopStruct* iteratorStruct);
99 
100  static void startCommandModifyActive(IteratorWorkLoopStruct* iteratorStruct);
101 
102  static void startCommandMacro(IteratorWorkLoopStruct* iteratorStruct, bool isFEMacro);
103  static bool checkCommandMacro(IteratorWorkLoopStruct* iteratorStruct, bool isFEMacro);
104 
105  static void startCommandBeginLabel(IteratorWorkLoopStruct* iteratorStruct);
106  static void startCommandRepeatLabel(IteratorWorkLoopStruct* iteratorStruct);
107 
108  static void startCommandRun(IteratorWorkLoopStruct* iteratorStruct);
109  static bool checkCommandRun(IteratorWorkLoopStruct* iteratorStruct);
110 
111  static void startCommandWait(IteratorWorkLoopStruct* iteratorStruct);
112  static bool checkCommandWait(IteratorWorkLoopStruct* iteratorStruct);
113 
114  static void startCommandFSMTransition(IteratorWorkLoopStruct* iteratorStruct, const std::string& transitionCommand);
115  static bool checkCommandFSMTransition(IteratorWorkLoopStruct* iteratorStruct, const std::string& finalState);
116 
117  static bool haltIterator(Iterator* iterator,
118  IteratorWorkLoopStruct* iteratorStruct = 0,
119  bool doNotHaltFSM = false);
120 
121  std::mutex accessMutex_;
122  volatile bool workloopRunning_;
123  volatile bool activePlanIsRunning_;
124  volatile bool iteratorBusy_;
125  volatile bool commandPlay_, commandPause_,
126  commandHalt_;
129  std::string activePlanName_, lastStartedPlanName_, lastFinishedPlanName_;
130  volatile unsigned int activeCommandIndex_, activeCommandIteration_, activeNumberOfCommands_;
131  std::string activeCommandType_;
132 
133  volatile uint64_t genPlanDurationSeconds_ = -1;
134  volatile unsigned int genPlanNumberOfRuns_ = 1;
135  std::string genFsmName_, genConfigAlias_, genLogEntry_;
136  bool genKeepConfiguration_ = false;
137 
138  std::vector<unsigned int> depthIterationStack_;
139  volatile time_t activeCommandStartTime_;
140  std::string lastFsmName_;
141  std::string errorMessage_;
142 
143  GatewaySupervisor* theSupervisor_;
144 
145  template<class T>
146  static void helpCommandModifyActive(IteratorWorkLoopStruct* iteratorStruct, const T& setValue, bool doTrackGroupChanges);
147 };
148 
149 #include "otsdaq/GatewaySupervisor/Iterator.icc" //for template definitions
150 
151 } // namespace ots
152 
153 // clang-format on
154 
155 #endif
void getIterationPlanStatus(HttpXmlDocument &xmldoc)
return state machine and iterator status
Definition: Iterator.cc:2537