1 #ifndef _ots_Iterator_h
2 #define _ots_Iterator_h
8 #include "otsdaq/TablePlugins/IterateTable.h"
9 #include "otsdaq/XmlUtilities/HttpXmlDocument.h"
11 #include "otsdaq/ConfigurationInterface/ConfigurationManagerRW.h"
17 class GatewaySupervisor;
18 class ConfigurationManagerRW;
28 static const std::string RESERVED_GEN_PLAN_NAME;
39 void playIterationPlan (
HttpXmlDocument& xmldoc,
const std::string& planName);
40 void playGeneratedIterationPlan (
HttpXmlDocument& xmldoc,
const std::string& parametersCSV);
41 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 =
"");
47 bool handleCommandRequest (
HttpXmlDocument& xmldoc,
const std::string& command,
const std::string& parameter);
49 bool isIteratorBusy (
void)
const {
return iteratorBusy_; }
52 void playIterationPlanPrivate (
HttpXmlDocument& xmldoc,
const std::string& planName);
54 IterateTable::Command> generateIterationPlan (
const std::string& fsmName,
const std::string& configAlias, uint64_t durationSeconds = -1,
unsigned int numberOfRuns = 1);
57 struct IteratorWorkLoopStruct
60 : theIterator_(iterator)
62 , originalTrackChanges_(false)
65 , doPauseAction_(false)
66 , doHaltAction_(false)
67 , doResumeAction_(false)
68 , commandIndex_((unsigned int)-1)
72 Iterator* theIterator_;
73 ConfigurationManagerRW* cfgMgr_;
74 bool originalTrackChanges_;
75 std::string originalConfigGroup_;
76 TableGroupKey originalConfigKey_;
78 bool running_, commandBusy_;
79 bool doPauseAction_, doHaltAction_, doResumeAction_;
80 bool onlyConfigIfNotConfigured_ =
false;
82 std::string activePlan_;
83 std::vector<IterateTable::Command> commands_;
84 std::vector<unsigned int> commandIterations_;
85 unsigned int commandIndex_;
86 std::vector<unsigned int> stepIndexStack_;
87 std::vector<std::string> stepLabelStack_;
88 time_t originalDurationInSeconds_;
91 std::string fsmName_, fsmRunAlias_;
92 unsigned int fsmNextRunNumber_;
96 std::vector<std::string> fsmCommandParameters_;
97 std::vector<bool> targetsDone_;
99 bool remoteConfigureQueued_ =
false;
101 std::vector<OutputFile> outputFiles_;
102 std::string macroArgsSummary_;
107 std::atomic<bool> done{
false}, abort{
false};
110 uint64_t iterationsDone = 0;
111 uint64_t iterationsTotal = 0;
113 std::vector<std::pair<std::string , std::string >>
116 std::shared_ptr<RemoteMacroRun> remoteMacroRun_;
120 static void IteratorWorkLoop(
Iterator* iterator);
121 static void startCommand(IteratorWorkLoopStruct* iteratorStruct);
122 static bool checkCommand(IteratorWorkLoopStruct* iteratorStruct);
124 static void startCommandChooseFSM(IteratorWorkLoopStruct* iteratorStruct,
const std::string& fsmName);
126 static bool commandSkipsIfConfigured(IteratorWorkLoopStruct* iteratorStruct);
127 static void startCommandConfigureActive(IteratorWorkLoopStruct* iteratorStruct);
128 static void startCommandConfigureAlias(IteratorWorkLoopStruct* iteratorStruct,
const std::string& systemAlias);
129 static void startCommandConfigureGroup(IteratorWorkLoopStruct* iteratorStruct);
130 static bool checkCommandConfigure(IteratorWorkLoopStruct* iteratorStruct);
132 static void startCommandModifyActive(IteratorWorkLoopStruct* iteratorStruct);
134 static void startCommandMacro(IteratorWorkLoopStruct* iteratorStruct,
bool isFEMacro);
135 static bool checkCommandMacro(IteratorWorkLoopStruct* iteratorStruct,
bool isFEMacro);
137 static void startCommandBeginLabel(IteratorWorkLoopStruct* iteratorStruct);
138 static void startCommandRepeatLabel(IteratorWorkLoopStruct* iteratorStruct);
140 static void startCommandRun(IteratorWorkLoopStruct* iteratorStruct);
141 static bool checkCommandRun(IteratorWorkLoopStruct* iteratorStruct);
142 static std::string buildIteratorLogEntry(IteratorWorkLoopStruct* iteratorStruct);
144 static void startCommandWait(IteratorWorkLoopStruct* iteratorStruct);
145 static bool checkCommandWait(IteratorWorkLoopStruct* iteratorStruct);
147 static void startCommandFSMTransition(IteratorWorkLoopStruct* iteratorStruct,
const std::string& transitionCommand);
148 static bool checkCommandFSMTransition(IteratorWorkLoopStruct* iteratorStruct,
const std::string& finalState);
150 static void startRemoteCommandFSMTransition(IteratorWorkLoopStruct* iteratorStruct,
const std::string& transitionCommand,
const std::string& targetSubsystem);
151 static bool checkRemoteCommandFSMTransition(IteratorWorkLoopStruct* iteratorStruct,
const std::string& finalState,
const std::string& targetSubsystem);
153 static void startRemoteCommandConfigure(IteratorWorkLoopStruct* iteratorStruct,
const std::string& systemAlias,
const std::string& targetSubsystem);
154 static bool checkRemoteCommandConfigure(IteratorWorkLoopStruct* iteratorStruct,
const std::string& targetSubsystem);
156 static void startRemoteCommandMacro(IteratorWorkLoopStruct* iteratorStruct,
bool isFEMacro);
158 static std::string feMacroArgBaseName(
const std::string& argName);
159 static bool checkRemoteCommandMacro(IteratorWorkLoopStruct* iteratorStruct,
bool isFEMacro);
169 enum { LONG, DOUBLE, STRING } type = LONG;
170 long lInit = 0, lStep = 0;
171 double dInit = 0, dStep = 0;
174 std::vector<unsigned long> dimIterations;
175 std::vector<std::vector<Arg>> dimArgs;
176 std::vector<std::string> argNames;
177 uint64_t totalIterations = 1;
180 static bool isConstantMacroStep(
const std::string& step);
181 static MacroLoopSpec parseMacroLoopSpec(
const std::string& inputArgs);
183 static std::vector<std::pair<std::string, std::string>> macroLoopIteration(
const MacroLoopSpec& spec, uint64_t index);
185 static std::string macroArgsSummary(
const std::string& inputArgs);
187 static std::string macroArgValueForLabel(
const std::string& value);
190 static unsigned int getStepIndexForLabel(IteratorWorkLoopStruct* iteratorStruct,
const std::string& label);
192 static std::string applyStepIndexToMacroArgs(IteratorWorkLoopStruct* iteratorStruct,
const std::string& inputArgs,
const std::string& labelsStr);
196 static size_t findRemoteGatewayApp(IteratorWorkLoopStruct* iteratorStruct,
const std::string& targetSubsystem);
197 static void queueRemoteGatewayCommand(IteratorWorkLoopStruct* iteratorStruct,
size_t remoteAppIndex,
const std::string& command,
const std::string& statusLabel);
198 static std::string buildRemoteConfigureCommand(IteratorWorkLoopStruct* iteratorStruct,
const std::string& systemAlias);
202 static std::string findRemoteCodeEditorIconName(
GatewaySupervisor* supervisor,
const std::string& targetSubsystem);
204 static bool haltIterator(
Iterator* iterator,
205 IteratorWorkLoopStruct* iteratorStruct = 0,
206 bool doNotHaltFSM =
false);
208 std::mutex accessMutex_;
209 volatile bool workloopRunning_;
210 volatile bool activePlanIsRunning_;
211 std::atomic<bool> iteratorBusy_;
212 volatile bool commandPlay_, commandPause_,
216 std::string activePlanName_, lastStartedPlanName_, lastFinishedPlanName_;
217 std::vector<OutputFile> lastPlanOutputFiles_;
218 volatile unsigned int activeCommandIndex_, activeCommandIteration_, activeNumberOfCommands_;
219 std::string activeCommandType_;
221 volatile uint64_t genPlanDurationSeconds_ = -1;
222 volatile unsigned int genPlanNumberOfRuns_ = 1;
223 std::string genFsmName_, genConfigAlias_, genLogEntry_;
224 bool genKeepConfiguration_ =
false;
226 std::vector<unsigned int> depthIterationStack_;
227 volatile time_t activeCommandStartTime_;
228 std::string lastFsmName_;
229 std::string errorMessage_;
234 static void helpCommandModifyActive(IteratorWorkLoopStruct* iteratorStruct,
const T& setValue,
bool doTrackGroupChanges);
237 #include "otsdaq/GatewaySupervisor/Iterator.icc"
void getIterationPlanStatus(HttpXmlDocument &xmldoc)
return state machine and iterator status
defines used also by OtsConfigurationWizardSupervisor
state shared with the background thread driving a remote FE macro over MacroMaker UDP
std::vector< std::pair< std::string, std::string > > outputFiles
"Filename" reported by the remote MacroMaker per iteration, with that iteration's inputs
int progress
percent of current iteration, from remote
std::mutex mutex
guards error, iterationsDone, progress, outputFiles
an output file written by a macro command during a plan (local FE or remote MacroMaker)
std::string iconName
desktop icon name of the subsystem's Code Editor (remote only), for open-by-name
std::string label
e.g. "DTC Read on Calo14_DTC0"
std::string subsystem
"" for Self, else remote subsystem name
std::string path
as reported by the writer (e.g. "$OTSDAQ_DATA//macroOutput_..txt" or absolute)