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 )
16 #define _COUNTERCLASS __declspec(dllexport)
17 #elif defined( Use_Counters )
18 #define _COUNTERCLASS __declspec(dllimport)
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