File: TOPOGRFY\TP_FUNK.CPP

    1 //##############################################################################
    2 //                                                                            //
    3 // TP_FUNK.CPP                                                                //
    4 //                                                                            //
    5 // Subsystem : Topographie / Funktionalität                                   //
    6 // Benutzung durch andere Subsysteme erforderlich: NEIN                       //
    7 //----------------------------------------------------------------------------//
    8 // Autoren:  Thomas Kullmann, Günther Reinecker (2002)                        //
    9 //                                                                            //
   10 // Stand  : 05.12.2002                                                        //
   11 //                                                                            //
   12 //##############################################################################
   13 
   14 #include <assert.h> // ::assert()
   15 
   16 #include "topogrfy\tp_funk.h" // SCHNITTSTELLE für diese Datei
   17 
   18 //--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--
   19 
   20 //##############################################################################
   21 // externe Abhängigkeiten
   22 //##############################################################################
   23 
   24 __declspec(dllimport) LPMList lpMList; //Komposition aus TMotor-Objekten
   25 extern TSteering Steering;
   26 extern TMain Main; // in MAIN.CPP deklariertes Hauptprogramm
   27 
   28 //##############################################################################
   29 // TTopography
   30 //##############################################################################
   31 
   32 //------------------------------------------------------------------------------
   33 // die einzige Instanz der Klasse
   34 
   35 TTopography *TTopography::s_Instance= 0;
   36 //------------------------------------------------------------------------------
   37 // Erzeugung einer Singleton-Instanz
   38 
   39 TTopography *TTopography::GetInstance( void )
   40 {
   41         if ( s_Instance == 0 ) 
   42         {
   43                 s_Instance= new TTopography;
   44                 Main.AddToEventList(s_Instance); // neu! Kullmann+Reinecker (31.01.2004) Singleton-Objekt freigeben, wenn Hauptprogramm beendet wird            
   45         }
   46         return s_Instance;
   47 };
   48 //------------------------------------------------------------------------------
   49 // Konstruktor
   50 
   51 TTopography::TTopography( void ) : IMainEvents()  // neu! Kullmann+Reinecker (31.01.2004) Singleton-Objekt freigeben, wenn Hauptprogramm beendet wird
   52 {
   53         char Ident[]= "Topography";
   54 
   55         m_fMoveStep= 0.3f;
   56         m_fMaxAngleEscape= 50;    // in Winkelsekunden
   57         m_lMeasurementTime= 600;   // in Sekunden
   58         m_nNumberCycle= 1;     // Anzahl der Mehrfachbelichtungen muss != 0
   59         // sein, da sonst Topographie Einstellungsfenster
   60         // nicht mit OK zu schliessen ist
   61         m_dStartAngle= -20.0f; // in Winkelsekunden
   62         m_fAngleBetweenShots= 3.0f;
   63         m_lnkDetector= 0;
   64         m_lnkMonitor= 0;
   65         m_Motor= -1;
   66         m_dwCurrentTime= m_dwStartTime= 0;
   67 
   68         m_bMultipleShot= FALSE;  // Mehrfachbelichtung
   69         m_bMonitorUsed= FALSE;
   70         m_bControlActive= FALSE;
   71         m_bTimeRunning= FALSE;
   72         m_bExceptionOccured= FALSE;
   73         m_bAdditionalTime= FALSE;
   74 
   75         float temp= (float)IniReadDouble(GetCFile(), Ident, "WorkPoint", -60, 0);
   76         m_fWorkPoint= fabsf(temp / 100); // anstatt 100.0 müsste hier die Nachkommastellengenauigkeit des Antriebs berücksichtigt werden (100 == 2 Nachommastellen; 1000 == 3, usw.)
   77         m_bSmallAngleSide= (temp < 0);
   78 
   79         m_fControlRange= (float)IniReadDouble(GetCFile(), Ident, "ControlRange", 3.0, 0) / 100; // anstatt 100.0 müsste hier die Nachkommastellengenauigkeit des Antriebs berücksichtigt werden (100 == 2 Nachommastellen; 1000 == 3, usw.)
   80         m_fControlStep= (float)IniReadDouble(GetCFile(), Ident, "ControlStep", 0.2, GetMotorDigits(eSF)); // Nachkommastellengenauigkeit für Schrittweiten
   81         m_fMaxTime= (float)IniReadDouble(GetCFile(), Ident, "ExposureTime", 10.0, 10); // unbekannte Nachkommastellengeauigkeit
   82         m_dwMaxCounts= IniReadLong(GetCFile(), Ident, "ExposureCounts", 10000);
   83 };
   84 //------------------------------------------------------------------------------
   85 // SET-Methoden
   86 //------------------------------------------------------------------------------
   87 // setzt den lokalen und den aktiven Motor
   88 
   89 BOOL TTopography::SetMotor( EAxisType aAxis )
   90 {
   91         for ( int i= 0; i < lpMList->GetAxisNumber(); i++ )
   92         {
   93                 if ( aAxis == lpMList->ParsingAxis(lpMList->MP( i )->pCharacteristic()) )
   94                 {
   95                         if ( !lpMList->SetAxis( i ) )
   96                                 return FALSE; // setzt den aktiven Motor auf i
   97                         m_Motor= i; // Motorenachse lokal setzen
   98                         return TRUE;
   99                 };
  100         };
  101         return FALSE;
  102 };
  103 //------------------------------------------------------------------------------
  104 // setzt den lokalen und den aktiven Motor
  105 
  106 BOOL TTopography::SetMotor( int aIndex )
  107 {
  108         if ( !lpMList->SetAxis( aIndex ) )
  109                 return FALSE;
  110         m_Motor= aIndex;
  111         return TRUE;
  112 };
  113 //------------------------------------------------------------------------------
  114 // setzt die Schrittweite im aktiven Motor
  115 
  116 BOOL TTopography::SetAngleWidth( float aWidth )
  117 {
  118         if ( !lpMList->MP() )
  119                 return FALSE;
  120         lpMList->MP()->SetAngleWidth( aWidth );
  121         return TRUE;
  122 };
  123 //------------------------------------------------------------------------------
  124 // maximale Zaehlercounts
  125 
  126 BOOL TTopography::SetMaxCounts( LONG aCount )
  127 {
  128         if ( (aCount < 0) || (aCount > 999999l) )
  129                 return FALSE; // Werte sind positiv, ganzahlig
  130         m_dwMaxCounts= aCount;
  131         return TRUE;
  132 };
  133 //------------------------------------------------------------------------------
  134 // maximale Zaehlzeit des Detektors
  135 
  136 BOOL TTopography::SetMaxTime( float aTime )
  137 {
  138         // da Genauigkeit beim Lesen nur eine Nachkommastelle
  139         if ( (aTime < 0.1) || (aTime > 99999.0) )
  140                 return FALSE;
  141         m_fMaxTime= aTime;
  142         return TRUE;
  143 };
  144 //------------------------------------------------------------------------------
  145 // Lage des Arbeitspunktes relativ zur aktuellen Intensitaet
  146 
  147 BOOL TTopography::SetWorkPoint( float aPoint )
  148 {
  149         // da Genauigkeit beim Lesen nur eine Nachkommastelle
  150         if ( (aPoint < -9999.0) || ((aPoint < 0.1) && (aPoint > -0.1)) || (aPoint > 99999.0) )
  151                 return FALSE;
  152         m_fWorkPoint= fabsf(aPoint / 100);
  153         return TRUE;
  154 };
  155 //------------------------------------------------------------------------------
  156 // Anzahl der Belichtungszyklen, falls Mehrfachbelichtung angekreuzt ist
  157 
  158 BOOL TTopography::SetNumberCycle( WORD aNumber )
  159 {
  160         // Werte sind positiv, ganzahlig
  161         if ( (aNumber <= 0) || (aNumber > 65535l) )
  162                 return FALSE;
  163         m_nNumberCycle= aNumber;
  164         return TRUE;
  165 };
  166 //------------------------------------------------------------------------------
  167 // Belichtungszeit
  168 
  169 BOOL TTopography::SetMeasurementTime( LONG aTime )
  170 {
  171         // Werte sind positiv, ganzahlig
  172         if ( (aTime <= 0) || (aTime > 9999999l) )
  173                 return FALSE;
  174         m_lMeasurementTime= aTime;
  175         return TRUE;
  176 };
  177 //------------------------------------------------------------------------------
  178 // maximale Abweichung vom Arbeitspunkt
  179 
  180 BOOL TTopography::SetMaxAngleEscape( float aAngle )
  181 {
  182         // da Genauigkeit beim Lesen nur eine Nachkommastelle
  183         if ( (aAngle < 0.1) || (aAngle > 9999.0) )
  184                 return FALSE;
  185         m_fMaxAngleEscape= aAngle;
  186         return TRUE;
  187 };
  188 //------------------------------------------------------------------------------
  189 // Schrittweite zum Anfahren des Arbeitspunktes
  190 
  191 BOOL TTopography::SetMoveStep( float aStep )
  192 {
  193         // Anzahl der Nachkommastellen ist antriebsabhängig
  194         float min= 1 / (float)pow((float)10, (float)GetMotorDigits(eSF));
  195         if ( (aStep < min) || (aStep > 99999.0) )
  196                 return FALSE;
  197         m_fMoveStep= aStep;
  198         return TRUE;
  199 };
  200 //------------------------------------------------------------------------------
  201 // Regelschrittweite
  202 
  203 BOOL TTopography::SetControlStep( float aStep )
  204 {
  205         // Anzahl der Nachkommastellen ist antriebsabhängig
  206         float min= 1 / (float)pow((float)10, (float)GetMotorDigits(eSF));
  207         if ( (aStep < min) || (aStep > 9999999.0) )
  208                 return FALSE;
  209         m_fControlStep= aStep;
  210         return TRUE;
  211 };
  212 //------------------------------------------------------------------------------
  213 // Abstand bei Mehrfachbelichtungen
  214 
  215 BOOL TTopography::SetAngleBetweenShots( float aAngle )
  216 {
  217         // Anzahl der Nachkommastellen ist antriebsabhängig
  218         float min= 1 / (float)pow((float)10, (float)GetMotorDigits(eDF));
  219         if ( (aAngle < -9999.0) || ((aAngle < min) && (aAngle > (( -1)*min))) || (aAngle > 99999.0) )
  220                 return FALSE;
  221         m_fAngleBetweenShots= aAngle;
  222         return TRUE;
  223 };
  224 //------------------------------------------------------------------------------
  225 // ist bei Mehrfachbelichtung die relative Startposition zur aktuellen Motorposition
  226 
  227 BOOL TTopography::SetStartAngle( double aAngle )
  228 {
  229         if ( (aAngle < -9999.0) || (aAngle > 99999.0) )
  230                 return FALSE;
  231         m_dStartAngle= aAngle;
  232         return TRUE;
  233 };
  234 //------------------------------------------------------------------------------
  235 // Regelbereich nach Intensitaet in Prozent
  236 
  237 BOOL TTopography::SetControlRange( float aRange )
  238 {
  239         // da Genauigkeit beim Lesen nur zwei Nachkommastellen
  240         if ( (aRange < (float)0.01) || (aRange > 9999.0) )
  241                 return FALSE;
  242         m_fControlRange= aRange / 100.0f;
  243         return TRUE;
  244 };
  245 //------------------------------------------------------------------------------
  246 // GET-Methoden
  247 //------------------------------------------------------------------------------
  248 // gibt den Index des aktuellen Motors zurück
  249 
  250 int TTopography::GetActMotor( void )
  251 {
  252         int Index= lpMList->GetAxis(); // gibt den Index des aktiven Motor zurück
  253         if ( !lpMList->MP( Index ) )
  254                 return -1; // bei Fehler ungültigen Index zurückgeben
  255         return Index;
  256 };
  257 //------------------------------------------------------------------------------
  258 // gibt Zeiger auf den aktuellen Detektor zurück
  259 
  260 TDetector *TTopography::GetActDetector( void )
  261 {
  262         return TDetectorManager::DetectorManager().GetDetector();
  263 };
  264 //------------------------------------------------------------------------------
  265 // Rückgabe der standardisierter Antriebsbezeichnung für einen Motor
  266 
  267 LPCSTR TTopography::GetMotorName( int aIndex )
  268 {
  269         TMotor *Mtr= lpMList->MP( aIndex );
  270         if ( !Mtr )
  271                 return ""; // Motorliste muss stets gültiges Motorobjekt zurückgeben
  272         return Mtr->pCharacteristic();
  273 };
  274 //------------------------------------------------------------------------------
  275 // Rückgabe der Einheit des aktuellen Motors
  276 
  277 LPCSTR TTopography::GetMotorUnit( void )
  278 {
  279         return lpMList->MP()->GetUnitName();
  280 };
  281 //------------------------------------------------------------------------------
  282 // gibt die Anzahl der Motoren zurück
  283 
  284 int TTopography::GetMotorCount( void )
  285 {
  286         return lpMList->GetAxisNumber();
  287 };
  288 //------------------------------------------------------------------------------
  289 // gibt die Anzahl der Nachkommastellen des aktuellen Motors zurück
  290 
  291 UINT TTopography::GetMotorDigits( EFormat aFormat )
  292 {
  293         if ( aFormat == eSF )
  294                 return lpMList->MP()->GetDigits() + 1;
  295         else
  296                 return lpMList->MP()->GetDigits();
  297 };
  298 //------------------------------------------------------------------------------
  299 // gibt die Winkelposition des aktuellen Motors zurück
  300 
  301 double TTopography::GetAngle( void )
  302 {
  303         if ( !lpMList->MP() )
  304                 return 0.0;
  305         return lpMList->MP()->GetAngle();
  306 };
  307 //------------------------------------------------------------------------------
  308 // Rückgabe eines Zahlenformats mit Digits oder Digits+1 Nachkommastellen des aktuellen Motors
  309 
  310 LPCSTR TTopography::GetDigitFormat( EFormat aFormat)
  311 {
  312         if ( aFormat == eSF )
  313                 return lpMList->MP()->pSF( );
  314         return lpMList->MP()->pDF();
  315 };
  316 //------------------------------------------------------------------------------
  317 // Lesen und Setzen von Attributen der Ablaufsteuerung
  318 //------------------------------------------------------------------------------
  319 
  320 void TTopography::SetStrngStartPoint ( double aPoint )
  321 {
  322         Steering.dStartPoint= aPoint;
  323 };
  324 //------------------------------------------------------------------------------
  325 
  326 double TTopography::GetStrngStartPoint( void )
  327 {
  328         return Steering.dStartPoint;
  329 };
  330 //------------------------------------------------------------------------------
  331 
  332 double TTopography::GetStrngDistance( void )
  333 {
  334         return Steering.GetDistance();
  335 };
  336 //------------------------------------------------------------------------------
  337 
  338 BOOL TTopography::DetectorRequest( void )
  339 {
  340         return Steering.DetectorRequest();
  341 };
  342 //------------------------------------------------------------------------------
  343 
  344 float TTopography::GetStrngPeakIntensity( void )
  345 {
  346         return Steering.fPeakIntensity;
  347 };
  348 //------------------------------------------------------------------------------
  349 
  350 float TTopography::GetStrngStartIntensity( void )
  351 {
  352         return Steering.fStartIntensity;
  353 };
  354 //------------------------------------------------------------------------------
  355 
  356 float TTopography::GetStrngIntensity( void )
  357 {
  358         return Steering.GetIntensity();
  359 };
  360 //------------------------------------------------------------------------------
  361 
  362 double TTopography::GetStrngHwb( void )
  363 {
  364         return Steering.GetHwb();
  365 };
  366 //------------------------------------------------------------------------------
  367 // DO-Methoden
  368 //------------------------------------------------------------------------------
  369 // Initialisierung von Detektor und Monitor
  370 
  371 BOOL TTopography::DoInitDetectors( )
  372 {
  373         if ( !m_lnkDetector )
  374         {
  375                 SetDetector( GetActDetector() );
  376                 SetMonitor( m_lnkDetector );
  377                 SetMonitorUsed( FALSE );
  378         };
  379         if ( !m_lnkDetector )
  380                 return FALSE;
  381         return TRUE;
  382 };
  383 //------------------------------------------------------------------------------
  384 // Initialisierung des Motors (bevorzugt Omega)
  385 
  386 BOOL TTopography::DoInitMotor( void )
  387 {
  388         if ( (!DoInitMotor( Omega, TRUE )) && (!DoInitMotor( DF, TRUE )) )
  389         {
  390                 DoInitMotor( (EAxisType)GetActMotor(), TRUE );
  391                 return FALSE; // Omega ist nicht verfügbar
  392         }
  393         return TRUE;
  394 };
  395 //------------------------------------------------------------------------------
  396 // Initialisierung des Motors
  397 
  398 BOOL TTopography::DoInitMotor( EAxisType aType, BOOL aSetup )
  399 {
  400         if ( m_Motor > -1 )
  401                 return TRUE; // Motor bereits erfolgreich gesetzt
  402 
  403         if ( !SetMotor(aType) )
  404                 return FALSE;
  405         if ( aSetup )
  406                 DoSaveMotorSettings(); // Werte des aktuellen Motors in Settings Struktur eintragen
  407         return TRUE;
  408 };
  409 //------------------------------------------------------------------------------
  410 // Ablaufsteuerung initialisieren
  411 
  412 void TTopography::DoInitWorkPoint( void )
  413 {
  414         Steering.Visualising( TRUE, FALSE ); // Reportausgabe fuer Steering= true
  415         m_lnkMWorkPoint= Steering.GetMacroByName("SetupTopography"); // Arbeitspunkteinstellung holen und anpassen
  416         if ( m_bSmallAngleSide )
  417                 m_lnkMWorkPoint->CmdList[1].P1= SmallSide;
  418         else
  419                 m_lnkMWorkPoint->CmdList[1].P1= LargeSide;
  420         sprintf(m_lnkMWorkPoint->CmdList[1].P3, GetDigitFormat(eDF), fabs(m_fWorkPoint));
  421 };
  422 //------------------------------------------------------------------------------
  423 // Durchführung einer Messung mittels Kommandoverarbeitung
  424 
  425 BOOL TTopography::DoStartMeasure ( ECmdId aCmdId, int p1, int p2, LPSTR aStr, HWND aControlWnd )
  426 {
  427         Steering.Reset();
  428         Steering.StartUp(aControlWnd, m_Motor, m_lnkDetector);
  429         return Steering.StartCmdExecution( aCmdId, p1, p2, aStr, aControlWnd);
  430 };
  431 //------------------------------------------------------------------------------
  432 // Durchführung einer Messung mittels Macroverarbeitung
  433 
  434 BOOL TTopography::DoStartMeasure ( TMacroTag *aTag, HWND aControlWnd)
  435 {
  436         Steering.Reset();
  437         Steering.StartUp(aControlWnd, m_Motor, m_lnkDetector);
  438         return Steering.StartMacroExecution( aTag, aControlWnd);
  439 };
  440 //------------------------------------------------------------------------------
  441 // Unterbrechung einer Messung
  442 
  443 BOOL TTopography::DoStopMeasure()
  444 {
  445         return Steering.ToggleInterrupt();
  446 };
  447 //------------------------------------------------------------------------------
  448 
  449 BOOL TTopography::DoSaveMonitorSignal()
  450 {
  451         if ( !m_bMonitorUsed )
  452                 return FALSE;
  453 
  454         float norm;
  455         m_lnkMonitor->GetIntegral(norm); // Messsignal normieren
  456         Steering.SetNorm(norm); // Messwerte speichern
  457         return TRUE;
  458 };
  459 //------------------------------------------------------------------------------
  460 // Settings des aktuellen Motors sichern
  461 
  462 BOOL TTopography::DoSaveMotorSettings ( void )
  463 {
  464         return (lpMList->MP( GetActMotor() )->PushSettings());
  465 };
  466 //------------------------------------------------------------------------------
  467 // Settings des aktuellen Motors zurückschreiben
  468 
  469 BOOL TTopography::DoLoadMotorSettings( void )
  470 {
  471         return (lpMList->MP( GetActMotor() )->PopSettings( ThisPosition ));
  472 };
  473 //------------------------------------------------------------------------------
  474 // neu! Kullmann+Reinecker (31.01.2004) Singleton-Objekt freigeben, wenn Hauptprogramm beendet wird
  475 
  476 void  TTopography::OnLeave ( void ) 
  477 {
  478         if ( s_Instance ) {
  479                 Main.RemoveFromEventList(s_Instance);
  480                 _FREEOBJ(s_Instance);           
  481         }
  482 };
  483 
  484 //------------------------------------------------------------------------------
  485 // setzt Parameter für die Belichtung
  486 
  487 void TTopography::DoSetDetectorParams( float aTime, DWORD aCount, BOOL Start )
  488 {
  489         if ( (m_lnkDetector->IsActive()) || (Start) )
  490         {
  491                 m_lnkDetector->MeasureStop();
  492                 m_lnkDetector->SetExposureSettings( TExposureSettings( aTime, aCount ) );
  493                 m_lnkDetector->MeasureStart();
  494         }
  495         else
  496                 m_lnkDetector->SetExposureSettings( TExposureSettings( aTime, aCount ) );
  497 };
  498 //------------------------------------------------------------------------------
  499 // löschen die im Detektor gespeicherten Daten zur Topographie
  500 
  501 void TTopography::DoResetDetectorParams( void )
  502 {
  503         GetDetector()->MeasureStop();
  504         GetDetector()->PopSettings();
  505         GetDetector()->SetControlWnd( 0 );
  506         GetDetector()->MeasureStart();
  507         if ( IsSetupOk() )
  508                 SetDetector( 0 );
  509 };
  510 //------------------------------------------------------------------------------
  511 // __LastLine__
  512