File: INCLUDE\WORKFLOW\WORKFLOW.H
1 //---------------------------------------------------------------------------//
2 // WORKFLOW.H //
3 // //
4 // Subsystem : Ablaufsteuerung - Makroverarbeitung) //
5 // Benutung durch andere Subsysteme erforderlich: JA //
6 // Implementation: M_STEERG.CPP //
7 //---------------------------------------------------------------------------//
8
9 #ifndef _WORKFLOW_H_
10 #define _WORKFLOW_H_
11
12 #include "detecuse\detecuse.h" // TDetector
13 //#include "datavisa\datavisa.h" // TPlotWindow
14 #include "workflow\Enums.h"
15
16
17 /** @file WORKFLOW.h
18 * Steuerung der Makroverarbeitung.
19 */
20
21 /** Dient zur Steuerung der Makroverarbeitung.
22 *
23 * @author David Damm
24 * @date 05.07.2004
25 * @version 0.1
26 * Doxygen-Kommentare hinzugefügt.
27 */
28 class TSteering
29 {
30 friend class TCmd;
31 //Datum: 28.07.2002 friend class TMacroExecuteDlg;
32 //Datum: 28.07.2002 friend TIMECALLBACK RecallSteering;
33
34 // Konstruktoren und Destruktoren
35 public:
36
37 /** Konstruktor.
38 */
39 TSteering ( void );
40
41 /** Destruktor.
42 */
43 virtual ~TSteering ( void );
44
45 private:
46
47 /** Kein Copy-Konstruktor.
48 */
49 TSteering ( TSteering& ) {}
50
51 /** Kein Zuweisungsoperator.
52 */
53 TSteering& operator= ( const TSteering& ) { return *this; }
54
55
56
57 // Makros aus Dateien laden
58 public:
59
60 /** Lädt Makros aus der Datei 'STANDARD.MAK'.
61 * Außerdem wird das Ausgabefenster ausgewählt, der entsprechende Motor aktiviert und der Detektor ausgewählt.
62 * @param hwnd Das Ausgabefenster.
63 * @param mid ID des Antriebes.
64 * @param d Der Detektor.
65 * @return true, falls alle fünf Makros aus der Datei 'STANDARD.MAK' erfolgreich geladen werden konnten.
66 * Die Standardmakros lauten:
67 * - InquireHwb
68 * - SearchReflection
69 * - SetupTopography
70 * - AzimutalJustify
71 * - Test.
72 * @see StartUp
73 */
74 BOOL Initialize ( const HWND hwnd, const int mid, TDetector* d );
75
76 /** Lädt Makros aus der Datei 'SCAN.MAK'.
77 * @return true, falls alle Makros aus der Datei 'SCAN.MAK' erfolgreich geladen wurden.
78 * Zu diesen Makros zählen:
79 * - ScanJob
80 * - AreaScanJob.
81 */
82 BOOL LoadMacroByUser ( void );
83
84 // Kommando- und Makroverarbeitung vorbereiten
85 public:
86
87 /** Setzt das Fenster, das für die Aktualisierung des Detektors zuständig ist (cm_CounterSet).
88 * Zusätzlich muß der zu verwendende Antrieb und Detektor angegeben werden.
89 * @param hwnd Das Ausgabefenster.
90 * @param mid ID des Antriebes.
91 * @param d Der Detektor.
92 * @return Gibt immer true zurück.
93 */
94 BOOL StartUp ( const HWND hwnd, const int mid, TDetector* d );
95
96 /** Regelt, wie Fortschrittsanzeigen (während der Kommando-/Makroverarbeitung) auszugeben sind.
97 * @param a Falls true, so wird SendReport aktiviert.
98 * @param b Falls true, so wird die ReportList aktiviert.
99 */
100 void Visualising ( BOOL a, BOOL b );
101
102 // Kommando- und Makroverarbeitung starten
103 public:
104
105 /** Startet die Verarbeitung des angegebenen Makros.
106 * An das Fenster wird cm_SteeringReady geschickt, sobald die Makroverarbeitung beendet ist
107 * Tipp: stattdessen kann die POLLING-Methode IsActive() eingesetzt werden, um zu ermitteln, wann das Makro "fertig" ist.
108 * @param macro Das auszuführende Makro.
109 * @param hwnd Das Fenster (Host-Window).
110 * @return false, falls das angegebene Makro nicht ausgeführt werden kann.
111 * Dann existiert das Makro nicht, oder es wird schon ein Makro ausgeführt.
112 * Dieses muß dann vorher gestoppt werden, bevor ein neues Makro ausgeführt werden kann.
113 */
114 BOOL StartMacroExecution ( TMacroTag* macro, HWND hwnd );
115
116 /** Erzeugt und startet ein neues Kommando.
117 * @param id ID des auszuführenden Kommandos.
118 * @param p1 Der erste Programmparameter.
119 * @param p2 Der zweite Programmparameter.
120 * @param p3 Weitere Programmparameter in einem String.
121 * @param hwnd Das Fenster ist für die Aktualisierung des Detektors zuständig (cm_CounterSet).
122 * @return Gibt nur true/false zurück. Wenn das Kommando nicht existiert oder nicht ausgeführt werden kann, wird false zurückgegeben.
123 */
124 int StartCmdExecution ( ECmdId id, int p1, int p2, LPSTR p3, HWND );
125
126 // Kommando- und Makroverarbeitung pausieren/fortsetzen/stoppen
127 public:
128
129 /** Pausiert die Makroverarbeitung bzw. setzt diese wieder fort.
130 * @return Gibt true zurück, falls die Verarbeitung angehalten wurde.
131 * Wird die Verarbeitung wieder fortgesetzt, so liefert der Aufruf false zurück.
132 */
133 BOOL ToggleInterrupt ( void );
134
135 /** Stoppt die Makroverarbeitung endgültig.
136 * Das Makro kann dann nicht mehr fortgesetzt, sondern nur von neuem gestartet werden.
137 * @param a Falls true, so wird auf dem Host-Window eine Message ausgegeben.
138 * @return Gibt immer true zurück.
139 */
140 BOOL Reset ( BOOL=TRUE );
141
142 // Schnittstelle zu anderen Subsystemen
143 public:
144
145 /** Vom Fenster aufzurufen, das cm_CounterSet empfangen hat.
146 * @return Gibt immer true zurück.
147 */
148 BOOL DetectorRequest ( void );
149
150 /** Vom Fenster aufzurufen, das wm_WakeUpSteering empfangen hat.
151 */
152 void WakeUp ( void );
153
154 // Makroliste bearbeiten: Makros auslesen, löschen und Makroanzahl ermitteln
155 public:
156
157 /** Wählt ein Makro per ID aus.
158 * @param id Der Identifier des Makros.
159 * @return Das gesuchte Makro.
160 */
161 TMacroTag *GetMacroById ( EMacroId id );
162
163 /** Wählt ein Makro per Nummer aus.
164 * @param num Gibt die Nummer des Makros an, an der es in der Liste aMacroList steht.
165 * @return Das gesuchte Makro.
166 */
167 TMacroTag *GetMacroByNumber ( int );
168
169 /** Wählt ein Makro per Name aus.
170 * @param s Gibt den Namen des Makros an.
171 * @return Das gesuchte Makro.
172 */
173 TMacroTag *GetMacroByName ( LPSTR s );
174
175 /** Löscht ein Makro.
176 * @param macro Gibt das Makro an, das gelöscht werden soll.
177 * @return false, falls das Makro nicht existiert. Wurde das Makro erfolgreich gelöscht, wird true zurückgegeben.
178 */
179 BOOL DeleteMacro ( TMacroTag* macro );
180
181 /** Liefert die Anzahl der geladenen Makros.
182 * @return Anzahl der Makros.
183 */
184 int GetMacroCount ( void );
185
186 // POLLING zum Fortschritt der Makroverarbeitung
187 public:
188
189 /** Gibt Informationen über den derzeitigen Stand der Verarbeitung.
190 * @return true, gdw. Makro ODER Einzelkommando derzeit verarbeitet wird.
191 */
192 BOOL IsActive ( void );
193
194 /** Gibt an, ob ein Kommando oder Makro abgebrochen wurde.
195 * @return true, gdw. Makro- ODER Einzelkommandoverarbeitung abgebrochen wurde.
196 */
197 BOOL IsReset ( void );
198
199 /** NUR während der Makroverarbeitung werden Fortschrittsinfo's in den drei Parameterm zurückgegeben.
200 * @param[out] ind Index des aktuellen Kommandos im Intervall von [0...n].
201 * @param[out] s Gibt Statusinformationen aus. Wenn keine verfügbar sind, dann Bezeichnung des aktuellen Kommandos.
202 * @param[out] n Gibt die Anzahl der Kommandos während dieser Makro- oder Einzelkommandoverarbeitung an.
203 * @return false, falls gerade keine Verarbeitung stattfindet, sonst true.
204 * @warning Sprungkommandos beeinflussen den Kontrollfluss!
205 * D.h. der Index des aktuelles Kommdandos kann (auch um mehr als 1) erhöht ODER erniedrigt werden!
206 * Fortschrittsanzeige demnach nicht möglich.
207 */
208 BOOL GetProgress ( int& ind, LPSTR s, int& n);
209
210 // Accessor- und Mutator-Methoden
211 public:
212
213 /** Gibt Informationen über Positiionierung des Antriebes.
214 * @return true, gdw. Positionierung des ausgewählten Antriebs war erfolgreich.
215 */
216 BOOL IsPositionValid ( void );
217
218 /** Position ermitteln.
219 * @return Die aktuelle Absolutposition des ausgewählten Antriebs.
220 */
221 double GetDistance ( void );
222
223 /** Kann zum Zwischenspeichern der aktuellen Antriebsposition verwendet werden.
224 * @param p Die zu speichernde Position.
225 * @see GetStartPoint
226 */
227 void SetStartPoint ( double p );
228
229 /** Liefert den gespeicherten Wert zurück.
230 * @return Die gespeicherte Position.
231 * @see SetStartPoint
232 */
233 double GetStartPoint ( void );
234
235 /** Liefert die aktuelle Intensität des ausgewählten Detektors.
236 * @return Die Intensität des Detektors.
237 */
238 float GetIntensity ( void );
239
240 /** Faktor (fSigma) des ausgewählten Detektors.
241 * @return Faktor fSigma.
242 */
243 float GetSigma ( void );
244
245 /** Rauschlevel des ausgewählten Detektors setzen.
246 * @param nl Der neue Rauschlevel.
247 * @see GetNoiseLevel
248 */
249 void SetNoiseLevel ( float nl );
250
251 /** Rauschlevel des ausgewählten Detektors ermitteln.
252 * @return Der Rauschlevel.
253 * @see SetNoiseLevel
254 */
255 float GetNoiseLevel ( void );
256
257
258 /** Divisor, der zur Korrektur der aktuellen Intensität verwendet werden kann.
259 * @param norm Normierungsfaktor für die Korrektur.
260 * @see GetNorm
261 */
262 void SetNorm ( float norm );
263
264 /** Liefert die Norm zur Korrektur der aktuellen Intensität.
265 * @return Mormierungsfaktor.
266 * @see SetNorm
267 */
268 float GetNorm ( void );
269
270 /** Sollen Meldungen ausgegeben werden (Statuszeile oder Listenfeld - abhängig von Visualising).
271 * @param sr Gibt Meldung aus, falls true.
272 * @see IsResponding
273 */
274 void SetResponse ( BOOL sr );
275
276 /** Überprüfen, ob Meldungen ausgegeben werden.
277 * @return true, falls Meldungen ausgegeben werden.
278 * @see SetResponse
279 */
280 BOOL IsResponding ( void );
281
282 /** Setzt die Halbwertsbreite.
283 * @param hwb Die neue Halbwertsbreite.
284 * @warning Wenn die Halbwertsbreite bislang nicht berechnet wurde
285 * (CalculateCmd-Kommando NOCH nicht ausgeführt ODER bislang kein Makro verarbeitet). ist HWB == 0.
286 * @see GetHwb
287 */
288 void SetHwb ( double hwb );
289
290 /** Halbwertsbreite auslesen.
291 * @return Die Halbwertsbreite.
292 * @see SetHwb
293 */
294 double GetHwb ( void );
295
296
297 // private Methoden
298 private:
299
300 // bestimmtes Makro aus einer Datei laden
301 BOOL LoadMacro ( LPSTR, LPSTR );
302
303 // das angebene Einzelkommando ausführen; am Ende NotifyCmdReady() aufrufen
304 int StartCmdExecution ( TCmdTag );
305
306 // führt das nächste Kommando der Makroverarbeitung ODER ruft NotifyCmdReady() oder NotifyMacroReady()
307 BOOL ReadyReaction ( void );
308
309 // führt das nächste Kommando der Makroverarbeitung aus; ggf. wird NotifyMacroReady() aufgerufen
310 int ExecuteNextCmd ( void );
311
312 // cm_SteeringReady an hHostWindow senden
313 void NotifyCmdReady ( void ); // Einzelkommandoverarbeitung beendet
314 void NotifyMacroReady ( void ); // Makroverarbeitung beendet
315
316 // Kommandopausierung pausieren per Timer: Start, Stop
317 BOOL StartTimer ( void );
318 void StopTimer ( void );
319 static void CALLBACK RecallSteering ( UINT, UINT, DWORD, DWORD, DWORD );
320
321 // Meldung MessageBuffer in der Statuszeile oder einem Listenfeld (je nach Visualising-Aufruf) ausgeben
322 void SendReport ( void );
323
324 // parsen von Makrobezeichnung, Kommandobezeichnung und -parametern
325 BOOL ParsingMacroId ( TMacroTag&, LPSTR );
326 BOOL ParsingCmd ( TCmdTag&, LPSTR, LPSTR, LPSTR, LPSTR );
327 static ECmdParam ParsingCmdParam ( LPSTR param );
328
329 //Datum: 04.08.2002 BOOL GetFileLine( FILE*, LPSTR, int );
330 //Datum: 28.07.2002 HWND GetControlWnd ( void );
331 //Datum: 28.07.2002 int TimerRequest ( void );
332 //Datum: 28.07.2002 BOOL IsMacroCalled ( void );
333 //Datum: 28.07.2002 int ReturnMacroCall ( void );
334 //Datum: 28.07.2002 int CallMacro ( TMacroTag* );
335
336 //*****************************************************************************
337 // PUBLIC ATTRIBUTS NUR für die von TCmd abgeleiteten Kommandos
338 public:
339 // Info's über Antriebspositionen
340 double dGoalDistance;
341 double dPeakPoint;
342 double dStartPoint;
343
344 // Info's über Detektormessungen
345 float fGoalIntensity;
346 float fPeakIntensity;
347 float fStartIntensity; // nur ein Lesezugriff
348
349 // berechnete Werte
350 double dCalcResult;
351 double dCalcArg[nMaxArg];
352
353 public:
354 // Verknüpfung auf einen Detektor für TScanCmd, TAreaScanCmd und TGotoPeakCmd
355 TDetector *Monitor;
356
357 //*****************************************************************************
358 // PRIVATE ATTRIBUTS
359 private:
360 // Liste der Makros
361 TMacroTag aMacroList[_MAXMACROCOUNT]; //Datum: 28.07.2002 neu Kullmann+Reinecker
362 int nMacroNumber;
363
364 // derzeit bearbeitetes Makro mit der Liste der enthaltenen Kommandos und dem Index des aktuellen Kommandos
365 TMacroTag *TheMacro;
366 TCmdTag *TheCmdList;
367 int nCmdIdx;
368
369 // derzeit ausgeführtes [Einzel-]kommando
370 TCmd *TheCmd;
371
372 // Makro-/ Einzelkommandoverarbeitung pausiert oder beendet/ abgebrochen
373 BOOL bInterrupted;
374 BOOL bSteeringActive;
375 BOOL bReset;
376
377 // Handle zu dem Fenster mit dem Listenfeld (Ressourcen-Id id_Report), das bei cm_CounterSet DetectorRequest aufrufen muss
378 HWND hControlWnd;
379 // Handle zu dem Fenster, das über die Windowsbotschaft cm_SteeringReady benachrichtigt werden soll, wenn die Makroverarbeitung beendet ist
380 HWND hHostWindow;
381
382 // zur Meldungsausgabe
383 BOOL bSendReport;
384 char MessageBuffer[MaxString];
385 HWND hReportList;
386
387 // Handle auf den Timer, der die Kommandopausierung erlaubt; 0 <--> Timer ist inaktiv
388 // darf nicht static sein, weil RecallSteering sonst auf einem anderen nEvent arbeitet als StartTimer und StopTimer - Compiler-/Linkerfehler?!
389 UINT nEvent;
390
391 // gibt an, wie lange [in Millisekunden] die Kommandoverarbeitung dauern soll
392 static const UINT nAskTicks;
393
394 // Index des ausgewählten Antriebs und ausgewählter Detektor
395 int nMotor;
396 TDetector *Detector;
397
398 // Detektorinfo's die nur in TSteering benutzt werden
399 float fIncomingIntensity;
400 float fIntensityNorm;
401 float fNoiseLevel;
402
403 // berechnete(r) Wert(e)
404 float fHWB;
405 BOOL bInquireResult; // ! nur ein Lesezugriff
406
407 // speichert Detektorparameter vor Pausieren der Makroverarbeitung, um diese beim Fortsetzen wiederherstel-len zu können
408 TExposureSettings exposure;
409
410 //##die vier folgenden Varablen werden im Programmablauf zwar belegt, dann aber nicht weiter benutzt
411 //Datum: 28.07.2002 BOOL b_id_Angle;
412 //Datum: 28.07.2002 BOOL b_id_PeakIntensity;
413 //Datum: 28.07.2002 BOOL b_id_Intensity;
414 //Datum: 28.07.2002 BOOL b_id_HalfWidth;
415
416 //Datum: 28.07.2002 BOOL b_id_Report;
417 //Datum: 28.07.2002 BOOL bTimerActive;
418 //Datum: 28.07.2002 int nFailureId;
419 };
420
421 //#############################################################################
422 // TMacroExecuteDlg
423 //#############################################################################
424
425 class TMacroExecuteDlg : public TModelessDlg
426 {
427 public:
428 TMacroExecuteDlg( TModelessDlg** );
429 private:
430 TMacroTag *TheMacro;
431 TDetector *Detector;
432 HWND hMacroList;
433 BOOL Dlg_OnInit( HWND, HWND, LPARAM );
434 void Dlg_OnCommand( HWND, int, HWND, UINT );
435 BOOL CanClose( void );
436 void LeaveDialog( void );
437 int MessageLine;
438 BOOL bInterrupted;
439 BOOL bActionCaused;
440 int SetupTask;
441 BOOL bCheckMacro;
442 };
443
444 #endif //_WORKFLOW_H_
445
446 //#############################################################################
447 // LASTLINE
448 //#############################################################################
449