tdaq-develop-2025-02-12
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 
82  std::vector<std::string> fsmCommandParameters_;
83  std::vector<bool> targetsDone_;
84 
85  }; // end declaration of iterator workloop members
86 
87  static void IteratorWorkLoop(Iterator* iterator);
88  static void startCommand(IteratorWorkLoopStruct* iteratorStruct);
89  static bool checkCommand(IteratorWorkLoopStruct* iteratorStruct);
90 
91  static void startCommandChooseFSM(IteratorWorkLoopStruct* iteratorStruct, const std::string& fsmName);
92 
93  static void startCommandConfigureActive(IteratorWorkLoopStruct* iteratorStruct);
94  static void startCommandConfigureAlias(IteratorWorkLoopStruct* iteratorStruct, const std::string& systemAlias);
95  static void startCommandConfigureGroup(IteratorWorkLoopStruct* iteratorStruct);
96  static bool checkCommandConfigure(IteratorWorkLoopStruct* iteratorStruct);
97 
98  static void startCommandModifyActive(IteratorWorkLoopStruct* iteratorStruct);
99 
100  static void startCommandMacro(IteratorWorkLoopStruct* iteratorStruct, bool isFEMacro);
101  static bool checkCommandMacro(IteratorWorkLoopStruct* iteratorStruct, bool isFEMacro);
102 
103  static void startCommandBeginLabel(IteratorWorkLoopStruct* iteratorStruct);
104  static void startCommandRepeatLabel(IteratorWorkLoopStruct* iteratorStruct);
105 
106  static void startCommandRun(IteratorWorkLoopStruct* iteratorStruct);
107  static bool checkCommandRun(IteratorWorkLoopStruct* iteratorStruct);
108 
109  static void startCommandFSMTransition(IteratorWorkLoopStruct* iteratorStruct, const std::string& transitionCommand);
110  static bool checkCommandFSMTransition(IteratorWorkLoopStruct* iteratorStruct, const std::string& finalState);
111 
112  static bool haltIterator(Iterator* iterator,
113  IteratorWorkLoopStruct* iteratorStruct = 0,
114  bool doNotHaltFSM = false);
115 
116  std::mutex accessMutex_;
117  volatile bool workloopRunning_;
118  volatile bool activePlanIsRunning_;
119  volatile bool iteratorBusy_;
120  volatile bool commandPlay_, commandPause_,
121  commandHalt_;
124  std::string activePlanName_, lastStartedPlanName_, lastFinishedPlanName_;
125  volatile unsigned int activeCommandIndex_, activeCommandIteration_, activeNumberOfCommands_;
126  std::string activeCommandType_;
127 
128  volatile uint64_t genPlanDurationSeconds_ = -1;
129  volatile unsigned int genPlanNumberOfRuns_ = 1;
130  std::string genFsmName_, genConfigAlias_, genLogEntry_;
131  bool genKeepConfiguration_ = false;
132 
133  std::vector<unsigned int> depthIterationStack_;
134  volatile time_t activeCommandStartTime_;
135  std::string lastFsmName_;
136  std::string errorMessage_;
137 
138  GatewaySupervisor* theSupervisor_;
139 
140  template<class T>
141  static void helpCommandModifyActive(IteratorWorkLoopStruct* iteratorStruct, const T& setValue, bool doTrackGroupChanges);
142 };
143 
144 #include "otsdaq/GatewaySupervisor/Iterator.icc" //for template definitions
145 
146 } // namespace ots
147 
148 // clang-format on
149 
150 #endif
void getIterationPlanStatus(HttpXmlDocument &xmldoc)
return state machine and iterator status
Definition: Iterator.cc:2442