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