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