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