File: INCLUDE\DETECUSE\DETECUSE.H
1 /*
2 $Header: /vol/baal-vol3/projekt98/quellen/XCTL_32/INCLUDE/DETECUSE/DETECUSE.H,v 1.28 2004/07/30 04:21:56 kullmann Exp $
3
4 Projekt : XCTL
5 Subsystem : Detektoren
6 Autor : Jan Picard <picard@informatik.hu-berlin.de> 2001-2002
7 Institut fuer Informatik,
8 Humboldt-Universitaet Berlin
9 Inhalt : Deklaration des Interface des Detektoren-Subsystems
10 */
11
12 #ifndef __DETECUSE_H
13 #define __DETECUSE_H
14
15 #if defined ( Build_Counters )
17 #elif defined( Use_Counters )
19 #else
20 #define _COUNTERCLASS
21 #endif
22
23 #include "utils\u_utils.h"
24 #include "detecuse\range.h"
25 #include "motrstrg\motrstrg.h"
26
27 //--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--
28
29 enum EDetectorType
30 {
31 CounterDetector= 1, PsdDetector, GenericDetector, CCDDetector
32 };
33
34 enum EHowReadOutPsd
35 {
36 FinalRead= 1, FirstRead, AccumulationRead, IntermediateRead
37 };
38
39 enum EPsdDataType
40 {
41 PsdEnergyData= 3000, PsdPositionData= 3001, PsdUnknown= 0
42 };
43
44 //vormals in evrythng.h
45 #define R_MeasOk 206
46
47
48
49 //! TExposureSettings kapselt Einstellungen für die Belichtung
50 //! Alle Werte werden vor einer eventuellen Modifikation geprueft,
51 //! ob sie die entsprechenden Bereichsgrenzen einhalten.
52 //! Bei Verletzung der Bereichsgrenzen werden die neuen Werte in das
53 //! Intervall "gezwungen".
54 class _COUNTERCLASS TExposureSettings
55 {
56 public:
57 TExposureSettings( float exposureTime= 0, DWORD exposureCounts= 0);
58
59 float GetExposureTime() const
60 {
61 return fExposureTime;
62 };
63 DWORD GetExposureCounts() const
64 {
65 return dwExposureCounts;
66 };
67
68 void SetExposureTime(float exposureTime);
69 void SetExposureCounts( DWORD exposureCounts );
70
71 #pragma warning( push )
72 #pragma warning( disable : 4251 )
73 TRange<DWORD> CountBounds;
74 TRange<float> TimeBounds;
75 #pragma warning( pop )
76
77 private:
78 float fExposureTime; // Belichtungszeit
79 DWORD dwExposureCounts; // Anzahl der zulässigen Photonen
80 };
81
82 // Struktur, die einen Schnappschuss der aktuellen Einstellungen eines
83 // Detektors speichern kann
84 struct _COUNTERCLASS TDSettings
85 {
86 TExposureSettings exposure;
87 int nAddedChannels;
88 };
89
90 // forward declaration
91 class TDetector;
92
93 //###########################################################################
94
95 //! TDetectorManager verwaltet alle nutzbaren Detektoren, die in der Datei
96 //! hardware.ini deklariert sind. TDetectorManager ist als Singleton
97 //! implementiert, so dass genau eine Instanz davon existiert.
98 //! TDetectorManager legt die entsprechenden TDetector-Objekte an und zerstoert
99 //! sie auch wieder.
100 class _COUNTERCLASS TDetectorManager
101 {
102 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
103 // Konstruktoren und Destruktor
104 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
105 public:
106
107 //! Der Klassendestruktor wird automatisch beim Programmende aufgerufen.
108 //! Dazu muss er public deklariert sein.
109 //! Er DARF NICHT direkt aufgerufen werden.
110 virtual ~TDetectorManager();
111
112 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
113 // Methoden, die kontrollierten Zugriff auf Attribute bieten
114 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
115 public:
116
117 //! Liefert die Singleton-Instanz
118 static TDetectorManager& DetectorManager();
119
120 //! liefert den "aktiven" Detektor
121 TDetector* GetDetector( void ) const;
122
123 //! liefert den n-ten Detektor der Dimension nFilterDimension
124 TDetector* GetDetector( int n, int nFilterDimension= -1 ) const;
125
126 //! Setzt den "aktiven" Detektor auf den n-ten Detektor
127 //! der Dimension nFilterDimension
128 BOOL SetDetector( int n, int nFilterDimension= -1 );
129
130 //! Setzt den aktiven Detektor auf den Detektor, der als Parameter
131 //! angegeben ist, WENN er ein vom DetektorManager verwalteter Detektor
132 //! ist.
133 BOOL SetDetector( const TDetector* );
134
135 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
136 // Allgemeine Hifsmethoden
137 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
138 public:
139
140 //! GUI-Hilfsmethode, fuellt die "choose detector" ComboBox
141 void FillDetectorComboBox( HWND comboBox, int nFilterDimension= -1 ) const;
142
143 //! Ermittelt, ob mindestend ein Detektor der angegeben Dimension
144 //! nutzbar ist
145 BOOL DimAvailable(int dimension) const;
146
147 //! Fuer TSteering-Kommandos: Ermittelt eine ID fuer einen
148 //! Detektor aus seinem Namen
149 int GetIdByDescription( LPCSTR detectorname ) const;
150
151 //! Gibt dann TRUE zurueck, wenn n ein gueltiger Index eines nutzbaren
152 //! Detektors ist
153 BOOL IsValidId(int n) const;
154
155 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
156 // private Konstruktoren
157 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
158 private:
159
160 //! Singleton-Konstruktor
161 TDetectorManager();
162
163 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
164 // Verbotene Operationen
165 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
166 private:
167
168 TDetectorManager(const TDetectorManager&);
169 TDetectorManager& operator=(const TDetectorManager&);
170
171 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
172 // private-Methoden
173 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
174 private:
175
176 //! Erstellt das Detektorobjekt, das dem Parameter entspricht.
177 //! Wenn die Initialierung erfolgreich ist, wird es in den
178 //! DetectorContainer eingefuegt.
179 void CreateDetector(const char* type, int id);
180
181 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
182 // private-Attribute
183 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
184 private:
185
186 //! Zeigt auf den "aktiven" Detektor
187 TDetector* ActiveDetector;
188 };
189
190 //###########################################################################
191
192 //! TDetector ist das abstrakte Interface zu den Funktionen, die
193 //! von allen Detektoren unterstuetzt werden.
194 class _COUNTERCLASS TDetector
195 {
196
197 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
198 // Konstruktoren und Destruktor
199 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
200 public:
201
202 TDetector(int id);
203 virtual ~TDetector( void );
204
205 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
206 // Methoden, die kontrollierten Zugriff auf Attribute bieten
207 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
208 public:
209
210 //! Gibt eine Identifikationsschluessel fuer den Detektor zurueck.
211 //! Diese Methode stellt eine quasi-Serialisierung des Objektzeigers
212 //! dar. Ein Detektor kann ueber eine numerische ID angeprochen werden.
213 //! In erster Linie wird dazu die Nummer des ini-File-Abschittes benutzt,
214 //! in dem dieser Detektor deklariert ist ( das X in [deviceX] )
215 int GetId( void ) const
216 {
217 return nId;
218 };
219
220 //! Gibt zurueck, ob mit diesem Detektor gerade gemessen wird
221 //! ( MeasureStart() aufgerufen wurde )
222 BOOL IsActive( void ) const
223 {
224 return bActive;
225 };
226
227 //! Gibt den bei der letzten Messung fuer Sigma ermittelten Wert zurueck
228 float GetSigma( void ) const
229 {
230 return fSigma;
231 };
232
233 //! Legt die Belichtungseinstellungen fuer den Detektor fest
234 BOOL SetExposureSettings (const TExposureSettings& newExposureSettings);
235
236 //! Gibt die Belichtungseinstellungen fuer den Detektor zurueck
237 TExposureSettings& GetExposureSettings()
238 {
239 return exposure;
240 };
241
242 //! Gibt den im ini-File fuer diesen Detektor deklarierten Namen zurueck
243 const char* const GetCharacteristic() const
244 {
245 return szCharacteristic;
246 };
247
248 //! Gibt zurueck, ob im Moment gueltige Messwerte vorliegen
249 BOOL IsDataValid() const
250 {
251 return bDataValid;
252 };
253
254 //! Gibt die tatsaechlich zur Messung verwandte Zeit zurueck
255 double GetRealTime() const
256 {
257 return dRealTime;
258 };
259
260 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
261 // Interface-Methoden fuer alle Detektoren
262 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
263 public:
264
265 //! Initialisert den Detektor und prueft ( wenn vorhanden ), ob die
266 //! Hardwarekommunikation mit dem Detektor moeglich ist
267 virtual BOOL Initialize( void );
268
269 //! Startet die Messung mit diesem Detektor
270 virtual int MeasureStart( void )= 0;
271
272 //! Stoppt die Messung mit diesem Detektor
273 virtual int MeasureStop( void )= 0;
274
275 //! Veranlasst den Detektor, die im letzte Messzyklus ermittelten Werte
276 //! der Hardware zu lesen und als gueltigen Messwert bereitzustellen
277 virtual int PollDetector( void ) { return R_Failure; }; // GR
278
279 //! Gibt die im letzten Messzyklus ermittelten, integralen Messwerte zurueck
280 virtual int GetIntegral( float& )= 0; // ehemalig GetData
281
282 //! Veranlasst den Detektor, sich die aktuellen Einstellungen zu merken,
283 //! damit sie zu einem spaeteren Zeitpunkt wieder restauriert werden
284 //! koennen. Der Detektor kann sich genau einen Satz an Einstellungen
285 //! merken.
286 virtual BOOL PushSettings( void );
287
288 //! restauriert die vorher mit PushSettings() gespeicherten Einstellungen
289 virtual BOOL PopSettings( void );
290
291 //! Veranlasst den Detektor, neue Einstellungen zu uebernehmen
292 BOOL SetParameters( void );
293
294 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
295 // GUI-Methoden
296 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
297 public:
298
299 //! Gibt das Handle des Zaehlerfensters zurueck
300 HWND GetCounterWnd( void ) const
301 {
302 return hCounterWnd;
303 };
304
305 //! Wenn zu diesem Detektor das CounterWindow angezeigt wird, wird
306 //! das entsprechende Fensterhandle zurueckgegeben, sonst 0
307 void SetCounterWnd( HWND hwnd )
308 {
309 hCounterWnd= hwnd;
310 };
311
312 //! Wenn die Messdaten dieses Detektors von einem Scanfenster verarbeitet,
313 //! werden, wird das entsprechende Fensterhandle zurueckgegeben,
314 //! sonst 0
315 HWND GetControlWnd( void ) const
316 {
317 return hControlWnd;
318 };
319
320 //! Setzt das Handle des steuernden Fensters
321 void SetControlWnd( HWND hwnd )
322 {
323 hControlWnd= hwnd;
324 };
325
326 //! Startet den Dialog fuer detektorspezifische Einstellungen,
327 //! wenn ein solcher existiert
328 // Rückgabewert gibt an, ob der Dialog jetzt angezeigt wird
329 // FALSE -> modeless Dialog wurde versteckt oder es existiert kein Dialog
330 virtual BOOL RunSpecificParametersDlg( HWND )
331 {
332 return FALSE;
333 };
334
335 //! Gibt zurueck, ob ein Dialog fuer detektorspezifische Einstellungen
336 //! existiert
337 virtual BOOL HasSpecificParametersDlg( void ) const
338 {
339 return FALSE;
340 };
341
342 //! Benachrichtigt das CounterWindow und, wenn nicht ausdruecklich anders
343 //! gewuenscht, das ScanFenster, dass die Daten verarbeitet, ueber die
344 //! jetzt vorliegenden neuen Messdaten
345 void UpdateViews(BOOL bDisplayOnly= FALSE) const;
346
347 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
348 // Typ-Identifikation
349 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
350 public:
351
352 //! Gibt eine symbolische Konstante zurueck, die den Typ des Detektors
353 //! identifiziert
354 virtual EDetectorType GetDetectorType() const= 0;
355
356 //! Liefert die Dimension der Messwerte, die dieser Detektor ermittelt.
357 //! Kann als type identification genutzt werden
358 virtual int GetDimension() const= 0;
359
360 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
361 // Allgemeine Hifsmethoden fuer alle Detektoren
362 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
363 protected:
364
365 //! Rechnet Millisekunden in Sekunden um
366 static double MillisecondsToSeconds( DWORD milliseconds);
367
368 //! Berechnet Sigma aus der ermittelten Intensitaet
369 static float CalculateSigma(float intensity, float factor= 1.0);
370
371 //! Kapselung des gleichnamigen WINAPI-Rufs, bei dem einige Parameter,
372 //! die fuer alle Detektoren gleichbleiben wuerden, erst von dieser
373 //! Methode eingesetzt wird.
374 DWORD GetPrivateProfileString( LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, UINT iMaxLen= MaxString ) const;
375
376 //! Kapselung des gleichnamigen WINAPI-Rufs, bei dem einige Parameter,
377 //! die fuer alle Detektoren gleichbleiben wuerden, erst von dieser
378 //! Methode eingesetzt wird.
379 DWORD WritePrivateProfileString( LPCSTR lpKeyName, LPCSTR lpString) const;
380
381
382 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
383 // Hook-Methoden, die jeder Detektor spezifisch definieren kann
384 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
385 private:
386
387 //! Hook, mit dem Detektoren-Subklassen eigene Parameter einstellen
388 virtual BOOL _SetParameters(void)
389 {
390 return TRUE;
391 };
392
393 //! Laedt die zu diesem Detektor gehoerenden Einstellungen aus der
394 //! hardware.ini. Auf jeder Abstraktionsstufe werden die entsprechenden
395 //! Einstellungen geladen.
396 void LoadDetectorSettings();
397
398 //! Speichert die zu diesem Detektor gehoerenden Einstellungen in die
399 //! hardware.ini. Auf jeder Abstraktionsstufe werden die entsprechenden
400 //! Einstellungen gespeichert.
401 void SaveDetectorSettings() const;
402
403 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
404 // protected-Attribute
405 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
406 protected:
407
408 //! Speichert die Zeit, die tatsaechlich fuer die Messung aufgebracht
409 //! wurde
410 double dRealTime;
411
412 //! Zustandsvariable. Zeigt an, dass gerade ein Messvorgang laeuft.
413 //! Wird von MeasureStart auf TRUE und von MeasureStop auf FALSE gesetzt.
414 BOOL bActive;
415
416 //! Handle das Hauptfensters. Detektoren verwenden Timer, um die
417 //! Messintervalle zu begrenzen. Da Windows-Timer aber nur an Fenster
418 //! gesandt werden koennen, wird hier das Hauptfenster benachrichtigt.
419 HWND hWndFrame;
420
421 //! Zeigt an, ob der ini-File-Schluessel "Debug=" gesetzt ist
422 BOOL bDebug;
423
424 //! der im letzten Messzyklus ermittelte Messwert, bei mehrdimensionalen
425 //! Detektoren das Integral ueber alle Kanaele
426 float fIntensity;
427
428 //! JP?
429 float fSigma;
430
431 //! Zustandsvariable. Zeigt an, ob im Moment gültige Messwerte vorliegen
432 BOOL bDataValid;
433
434 //! Laenge des Windows-Timer-Intervalls, fix oder aus ExposureTime berechnet
435 UINT uAskTime;
436
437 //! Startzeitpunkt einer Messung
438 DWORD dwStartTime;
439
440 //! Zwischenspeicher fuer Einstellungen, Einstellungen werden mit
441 //! PushSettings() in den Zwischenspeicher geschrieben und mit
442 //! PopSettings() wieder herausgeholt.
443 TDSettings Settings;
444
445 //! Der "Name="-Wert aus der hardware.ini, textuelle Beschreibung des
446 //! Detektors, der auch in den Detektor-Auswahlboxen angezeigt wird.
447 char szCharacteristic[ MaxString ];
448
449 //! Einstellungen fuer die Belichtung
450 TExposureSettings exposure;
451
452 //! Der Detektor, der fuer den Event*-Mechanismus des ContinuousScans
453 //! benutzt wird
454 TDetector* EventDetector;
455
456 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
457 // Verbotene Operationen
458 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
459 private:
460
461 //! Das Kopieren von Detektor-Objekten ist verboten
462 TDetector(const TDetector&);
463
464 //! Die Zuweisung ist fuer Detektor-Objekte verboten
465 TDetector& operator=(const TDetector&);
466
467 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
468 // private-Attribute
469 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
470 private:
471
472 //! ID des Detektors, das in der hardware.ini als [DetektorX] fuer
473 //! diesen Detektor deklarierte X
474 int nId;
475
476 //! Wenn zu diesem Detektor das CounterWindow angezeigt wird, dann
477 //! enthaelt hDisplayWnd das entsprechende Fensterhandle, sonst 0
478 HWND hCounterWnd;
479
480 //! Wenn die Messdaten dieses Detektors von einem Scanfenster verarbeitet,
481 //! werden, dann enthaelt hControlWnd das entsprechende Fensterhandle,
482 //! sonst 0
483 HWND hControlWnd;
484 };
485
486 //! TZeroDimDetector ist das abstrakte Interface fuer alle nulldimensionalen
487 //! Detektoren.
488 class _COUNTERCLASS TZeroDimDetector : public TDetector
489 {
490
491 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
492 // Konstruktoren und Destruktor
493 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
494 public:
495
496 TZeroDimDetector(int id);
497 virtual ~TZeroDimDetector();
498
499 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
500 // Methoden, die kontrollierten Zugriff auf Attribute bieten
501 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
502 public:
503
504 //! Legt fest, ob die ermittelte Intensitaet auch akkustisch vermittelt
505 //! werden soll
506 void SetSound(BOOL);
507
508 //! Gibt zurueck, ob im Moment die ermittelte Intensitaet als akkustisches
509 //! Feedback geliefert wird
510 BOOL GetSound(void) const
511 {
512 return bSound;
513 };
514
515 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
516 // Interface-Methoden fuer alle Detektoren
517 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
518 public:
519
520 int MeasureStart( void );
521 int MeasureStop( void );
522 virtual int GetIntegral( float& ); // ehemalig GetData
523
524 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
525 // *Event*-Mechanismus, nur vom Continuous-Scan verwandt
526 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
527 public:
528
529 //! Methode, die von einem Windows-Timer periodisch aufgerufen wird
530 //! ermittelt eine aktuelle Intensitaet fuer den Detektor
531 static CALLBACK EventHandler( UINT, UINT, DWORD, DWORD, DWORD );
532
533 //! Initialisiert ein periodisches Aufrufen der Methode EventHandler
534 virtual BOOL InitializeEvent( HWND, int );
535
536 //! liefert die durch EventHandler gemessene Intensitaet zurueck
537 virtual BOOL GetEventIntensity( float& );
538
539 //! macht dem Detektor das Fenster bekannt, an das er innerhalb von
540 //! EventHandler seine Nachrichten schicken soll
541 void SetEventHost(HWND);
542
543 //! loescht Detektor-Event
544 void KillEvent( void );
545
546 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
547 // Typ-Identifikation
548 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
549 public:
550
551 EDetectorType GetDetectorType() const
552 {
553 return CounterDetector;
554 };
555
556 //! Liefert die Dimension der Messwerte, die dieser Detektor ermittelt.
557 //! Kann als type identification genutzt werden
558 int GetDimension() const
559 {
560 return 0;
561 };
562
563 BOOL Initialize( void );
564 virtual int PollDetector( void )= 0;
565
566 // nicht überschrieben, wenn auch gleiche Signatur (weil in Basisklasse nicht virtuell)
567 private:
568 void LoadDetectorSettings();
569 void SaveDetectorSettings() const;
570
571 // ATTRIBUT(E)
572 private:
573 //! Zustandsvariable. Gibt an, ob das Messergebnis auch akkustisch
574 //! repraesentiert werden soll
575 BOOL bSound;
576 };
577
578 // forward declaration
579 class TCurve;
580
581 //! TOneDimDetector ist das abstrakte Interface fuer alle eindimensionalen
582 //! Detektoren.
583 class _COUNTERCLASS TOneDimDetector : public TDetector
584 {
585
586 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
587 // Konstruktoren und Destruktor
588 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
589 public:
590 TOneDimDetector(int id);
591 virtual ~TOneDimDetector( void );
592
593 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
594 // Methoden, die kontrollierten Zugriff auf Attribute bieten
595 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
596 public:
597
598 //! Legt das zu verwendende Energiefenster fest
599 virtual BOOL SetEnergyRange( UINT, UINT )
600 {
601 return TRUE;
602 };
603
604 //! Gibt das verwendete Energiefenster zurueck
605 virtual void GetEnergyRange( UINT& low, UINT& high ) const
606 {
607 high= 1;
608 low= 0;
609 };
610
611 //! Legt fest, wieviele Kanaele zu einer Gruppe zusammengefasst werden sollen,
612 //! fuer die ein gemeinsamer Messwert ermittelt wird
613 void SetAddedChannels( int ach );
614
615 //! Gibt zurueck, wieviele Kanaele zu einer Gruppe zusammengefasst werden,
616 //! fuer die ein gemeinsamer Messwert ermittelt wird
617 int GetAddedChannels( void ) const
618 {
619 return nAddedChannels;
620 };
621
622 //! Gibt zurueck, ob die Hochspannungsregelung aktiv ist
623 BOOL GetHVControl() const
624 {
625 return bHVControl;
626 };
627
628 //! Legt fest, ob die Hochspannungsregelung aktiv sein soll
629 void SetHVControl(BOOL param)
630 {
631 bHVControl= param;
632 };
633
634 //! Gibt die Auslesereihenfolge zurueck,
635 //! TRUE= von links nach rechts, FALSE= von rechts nach links
636 BOOL GetReadLeftFirst() const
637 {
638 return bReadLeftFirst;
639 };
640
641 //! Legt die Kanal-Auslesereihenfolge fest,
642 //! TRUE= von links nach rechts, FALSE= von rechts nach links
643 void SetReadLeftFirst(BOOL param)
644 {
645 bReadLeftFirst= param;
646 };
647
648 //JP?
649 void SetAngleRange( float );
650
651 //! Legt fest, ob stufenweiser Signalaufbau stattfinden soll
652 void SetSignalGrowUp( BOOL gup )
653 {
654 bSignalGrowUp= gup;
655 };
656
657 //! Gibt an, ob ein vorgegebenes Messwertlimit ueberschritten wurde
658 BOOL IsSoftOverflow( void ) const
659 {
660 return bSoftOverflow;
661 };
662
663 //! Gibt an, ob in der Detektorhardware waehrend des Messvorgangs
664 //! ein Ueberlauf aufgetreten ist.
665 //! !!! Wird leider von keinem Subsystem abgefragt !!!
666 BOOL IsHardOverflow( void ) const
667 {
668 return bHardOverflow;
669 };
670
671 // Einheit des Detectors
672 EUnitType GetUnit ( void ) const
673 {
674 return eUnit;
675 };
676 LPCSTR GetUnitName ( void ) const
677 {
678 return szUnit;
679 };
680
681 //! Winkelbereich für einen Kanal
682 float GetAngleStep( void ) const;
683 void SetAngleStep( float stp );
684 //! Winkelbereich, der von einer Kanalgruppe abgedeckt wird
685 float GetWidth() const;
686 //! Winkelbereich, der von allen Kanaelen abgedeckt wird
687 float GetAngleRange( void ) const;
688
689 UINT GetAngleStepDigits( void ) const;
690 void SetAngleStepDigits( UINT );
691
692 //! Gibt eine "Kurve" mit den Messwerten der einzelnen Kanalgruppen zurueck
693 virtual int FillInCurve( TCurve&, EUnitType ); // ehemalig GetData
694
695 //! Gibt einen integralen/ aufsummierten Messwert über alle Kanäle zurueck
696 virtual int GetIntegral( float& ); // ehemalig GetData
697
698 int MeasureStart( void );
699 int MeasureStop( void );
700 int PollDetector( void );
701 BOOL Initialize( void );
702 BOOL PushSettings( void );
703 BOOL PopSettings( void );
704
705 BOOL RunSpecificParametersDlg( HWND );
706 BOOL HasSpecificParametersDlg( void ) const
707 {
708 return TRUE;
709 };
710
711 //! Gibt die Nummer des Kanals zurueck, bei dem der groesste Messwert
712 //! ermittelt wurde
713 UINT GetMaximumChannel( void ) const;
714
715 //! Gibt die groesste Einzelintensitaet zurueck, die bei einem Kanal
716 //! ermittelt wurde
717 float GetMaximumIntensity( void ) const
718 {
719 return float( dwMaxCounts );
720 };
721
722 //! Spezifische Init-Routine fuer eindimensionale Detektoren
723 virtual int PsdInit( void )
724 {
725 return R_OK;
726 };
727
728 // über welchen Antrieb wird Detektor bewegt (für Kanaloffset bei Manueller Justage)
729 EAxisType GetAxis() const
730 {
731 return m_Axis;
732 };
733
734 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
735 // Typ-Identifikation
736 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
737 public:
738
739 EDetectorType GetDetectorType() const
740 {
741 return PsdDetector;
742 };
743
744 //! Liefert die Dimension der Messwerte, die dieser Detektor ermittelt.
745 //! Kann als type identification genutzt werden
746 int GetDimension() const
747 {
748 return 1;
749 };
750
751 float CalculateValueInSecondsEx(EUnitType, float) const; // CalcValueInUnit, jedoch mit Hochrechnung auf <MaxChannels>-Kanäle
752
753 protected:
754
755 //! Prueft, ob am ein neuer Maximalwert fuer einen Kanal vorliegt
756 void CheckMaximumChannel(UINT channel, DWORD counts); // ehemalig CheckMaxChannel (wurde umbenannt, um Verwechselungen mit MaxChannel zu verhindert)
757
758 char szUnit[ _MAXLENUNIT + 1 ];
759
760 //! Einheit, in der Werte zurueckgegeben werden
761 //! wird nur einmal aus der hardware.ini initialisiert
762 EUnitType eUnit;
763
764 //JP?
765 //21.08.2004 MEMCORRECT HGLOBAL hCountBuf;
766 char *hCountBuf;
767
768 //JP?
769 int nCountBufItems;
770
771 //! Der höchste Einzelwert, der in einem Kanal ermittelt wurde
772 DWORD dwMaxCounts;
773
774 //! Skalarer Messwert, der durch Integration ueber alle Kanalgruppen
775 //! ermittelt wurde
776 DWORD dwIntegratedCounts;
777
778 //! Nummer des Kanals mit dem hoechsten Einzelmesswert
779 UINT uMaximumChannel;
780
781 //! Zustandsvariable. Ist auf TRUE gesetzt, wenn die Detektorhardware
782 //! einen Ueberlauf festgestellt hat.
783 BOOL bHardOverflow;
784
785 //! Legt die Auslesereihenfolge der Kanaele fest. TRUE= von links nach rechts
786 BOOL bReadLeftFirst;
787
788 //! Zustandsvariable. Gibt an, ob stufenweise Signalaufbau erfolgen soll.
789 BOOL bSignalGrowUp;
790
791 //! Zustandsvariable. Gibt an, ob ein Auslesevorgang der erste ist
792 //! Nur vom StoePsd richtig verwendet
793 BOOL bFirstReadOut;
794
795 //! Die tatsaechlich waehrend einer Messung verstrichene Zeit
796 //JP? Vielleicht als Parameter uebergeben?
797 DWORD dwElapsedTime;
798
799 // nicht überschrieben, wenn auch gleiche Signatur (weil in Basisklasse nicht virtuell)
800 private:
801 void LoadDetectorSettings();
802 void SaveDetectorSettings() const;
803
804 // ATTRIBUT(E)
805 private:
806 //JP?
807 float fAngleStep;
808 UINT nDigits;
809
810 //! Anzahl der Kanäle, die zu einer Kanalgruppe zusammenschlossen werden
811 int nAddedChannels;
812
813 //! Hook, um die PSD-Hardware zum Start der Messung zu veranlassen
814 virtual int PsdStart( void )
815 {
816 return R_OK;
817 };
818
819 //! Hook, um die PSD-Hardware zum Stop der Messung zu veranlassen
820 virtual int PsdStop( void )
821 {
822 return R_OK;
823 };
824
825 //! Hook, um die Messwerte aus der PSD-Hardware zu lesen
826 virtual int PsdReadOut( EHowReadOutPsd )= 0;
827
828 //JP?
829 virtual int PsdRead( int, LPWORD )
830 {
831 return R_OK;
832 };
833
834 //! Zustandsvariable. Gibt an, ob ein "weicher" Ueberlauf aufgetreten ist,
835 //! d.h. ob beim Ermitteln der Messwerte ein Wert >= OverflowIntensity
836 //! ermittelt wurde
837 BOOL bSoftOverflow;
838
839 //! Obergrenze eines Messwertes, wurde sie ueberschritten, ist ein
840 //! SoftOverflow aufgetreten.
841 //! Wird nur einmal aus dem ini-File initialisiert
842 float OverflowIntensity;
843
844 //! Zustandsvariable. Legt fest, ob die Hochspannungsregelung aktiv sein soll
845 BOOL bHVControl;
846
847 /// über welchen Antrieb wird Detektor bewegt
848 EAxisType m_Axis;
849
850 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
851 // NEU: EnergyScale, PositionScale jetzt auch hier
852 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
853 public:
854 //! legt fest, ob uEnergyScale oder uPositionScale (und ihre Wirkung auf First- und LastChannel, GetChannelNumber) verwendet werden soll
855 virtual void SetDataType( EPsdDataType typeParam )
856 {
857 eDataType= typeParam;
858 };
859
860
861 // gibt <EnergyScale> zurück
862 UINT GetEnergyScale() const {
863 return uEnergyScale;
864 };
865 // setzt <EnergyScale>
866 virtual UINT SetEnergyScale(UINT aEnergyScale);
867
868
869 // gibt <PositionScale> zurück
870 UINT GetPositionScale() const {
871 return uPositionScale;
872 };
873 // setzt <PositionScale>
874 virtual UINT SetPositionScale(UINT aPositionScale);
875
876
877 //! Gibt die Groesse des zu reservierenden Datenpuffers (fuer das Auslesen der Messwerte) zurück
878 // Muss unabhängig von gewähltem PositionScale und EnergyScale sein und stets den Maximalbedarf an Speicher decken können!
879 virtual int GetBufferSize( void ) const
880 {
881 return nMaxChannels; // GetChannelNumber() nicht verwenden, weil sich dieser Wert vergrößern könnte ... dann ist nicht genügend Speicher reserviert
882 };
883
884 // gibt die maximal mögliche Kanalanzahl bei angegebener Scale zurück
885 int GetScaledMaxChannels(UINT aScale) const {
886 return nMaxChannels >> aScale;
887 };
888
889 // folgende sind von uPositionScale bzw. uEnergyScale abhängig
890 public:
891 //! Ermitteln des ersten Kanals
892 virtual int GetFirstChannel() const;
893
894 //! Ermitteln des letzten Kanals
895 virtual int GetLastChannel() const;
896
897 //! Gibt die Anzahl der zu nutzenden Kanaele zurueck
898 int GetChannelNumber( void ) const
899 {
900 return max(0, GetLastChannel() - GetFirstChannel() + 1);
901 };
902
903 //! Festlegen des ersten/ letzten Kanals
904 void SetChannelRange(int first, int last);
905
906 protected:
907 // legt fest ob PsdEnergyData oder PsdPositionData
908 EPsdDataType eDataType;
909
910
911 // Kanaladdition direkt im Detektor
912 UINT uEnergyScale; // moeglich sind 00, 01, 02, 03 hex
913 UINT uPositionScale; // moeglich sind 00, 01, 02, 03 hex
914
915
916 // gibt die maximal mögliche Kanalanzahl bei PositionScale= 0 bzw. EnergieScale= 0 zurück
917 int nMaxChannels;
918
919
920 //! erster Kanal des PSDs, mit dem gemessen werden soll
921 int nFirstChannel; // hochgerechnet auf <MaxChannels>-Kanäle - siehe PsdReadOut
922 //! letzter Kanal des PSDs, mit dem gemessen werden soll
923 int nLastChannel; // hochgerechnet auf <MaxChannels>-Kanäle - siehe PsdReadOut
924 };
925
926 //! Methoden-Objekt, namespace fuer Arme
927 //! Laesst zu, dass Dialogfenster aus anderen Subsystemen gestartet werden
928 //! koennen
929 class _COUNTERCLASS TDetectorGUI
930 {
931 public:
932 //! Startet den Dialog fuer allgemeine Einstellungen fuer alle Detektoren
933 static void RunCommonDevParamDialog(HWND);
934
935 //! Startet den Dialog zum Kalibrieren von PSDs
936 static void RunPsdCalibrateDialog(HWND, TCurve&);
937 };
938
939 #ifdef __cplusplus
940 extern "C"
941 {
942 #endif
943 LPCSTR __declspec(dllexport) WINAPI dlGetVersion( void );
944 HINSTANCE __declspec(dllexport) WINAPI dlGetInstance( void );
945 #ifdef __cplusplus
946 }
947
948 #endif
949
950 #endif // __DETECUSE_H
951
952