File: DETECUSE\DETECGUI.CPP
1 /*
2 $Header: /vol/baal-vol3/projekt98/quellen/XCTL_32/DETECUSE/DETECGUI.CPP,v 1.40 2004/07/30 04:21:55 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 : Code fuer die Oberflaechenklassen des Detektoren-Subsystems
10 */
11
12 #include "internls\evrythng.h" // GermanVersion
13 #include "winresrc\rc_def.h" // Ressourcen-IDs
14 #pragma hdrstop
15
16 #include "detecuse\detecgui.h"
17 #include "motrstrg\motrstrg.h"
18
19 //--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--
20
21 extern HINSTANCE hModuleInstance;
22
23 //##############################################################################
24 // TCommonDevParamDlg
25 //##############################################################################
26
27 TCommonDevParamDlg::TCommonDevParamDlg( TDetector* detectorParam ) : TModalDlg( "COMMONDEVPARAM", hModuleInstance )
28 {
29 if (detectorParam == 0)
30 Detector= TDetectorManager::DetectorManager().GetDetector();
31 else
32 Detector= detectorParam;
33 }
34 //-----------------------------------------------------------------------------
35
36 BOOL TCommonDevParamDlg::Dlg_OnInit( HWND hwnd, HWND hwndCtl, LPARAM lParam )
37 {
38 // Initialisieren des Detektorauswahl-Listenfeldes
39 hChooseDetector= GetDlgItem( hwnd, id_ChooseDetector );
40 TDetectorManager::DetectorManager().FillDetectorComboBox(hChooseDetector);
41
42 SetFocus( GetDlgItem( hwnd, id_Level ) );
43 FORWARD_WM_COMMAND( hwnd, cm_ParamSet, hwndCtl, 0, SendMessage );
44 return TRUE;
45 }
46 //-----------------------------------------------------------------------------
47
48 void TCommonDevParamDlg::Dlg_OnCommand( HWND hwnd, int id, HWND hwndCtl, UINT codeNotify )
49 {
50 switch ( id )
51 {
52 case cm_ParamSet:
53 OnParamSet();
54 break;
55
56 case id_ShowCounter:
57 OnShowCounter(hwnd);
58 break;
59
60 case cm_ActivateChanges:
61 OnActivateChanges();
62 break;
63
64 case id_SoundSwitch:
65 OnSoundSwitch();
66 break;
67
68 case cm_SpecificParameters:
69 OnSpecificParameters();
70 break;
71
72 case id_ChooseDetector:
73 OnChooseDetector(hwnd, codeNotify);
74 break;
75
76 default:
77 TModalDlg::Dlg_OnCommand( hwnd, id, hwndCtl, codeNotify );
78 }
79 }
80 //-----------------------------------------------------------------------------
81
82 void TCommonDevParamDlg::OnParamSet()
83 {
84 char buf[ MaxString ];
85
86 ComboBox_SelectString( hChooseDetector, 0, Detector->GetCharacteristic() );
87
88 CheckDlgButton( GetHandle( ), id_ShowCounter, ( Detector->GetCounterWnd() != 0 ) );
89
90 // Nur 0-dimensionale Detektoren
91 if (Detector->GetDimension() == 0)
92 {
93 TZeroDimDetector* ZD= dynamic_cast<TZeroDimDetector*>(Detector);
94 EnableWindow( GetDlgItem( GetHandle( ), id_SoundSwitch ), TRUE );
95 CheckDlgButton( GetHandle( ), id_SoundSwitch, ZD->GetSound() );
96 }
97 else
98 EnableWindow( GetDlgItem( GetHandle( ), id_SoundSwitch ), FALSE );
99
100 sprintf( buf, "%.2f", Detector->GetExposureSettings().GetExposureTime() );
101
102 SetDlgItemText( GetHandle( ), id_ExposureTime, ( LPSTR ) buf );
103
104 sprintf( buf, "%lu", Detector->GetExposureSettings().GetExposureCounts() );
105
106 SetDlgItemText( GetHandle( ), id_ExposureCounts, ( LPSTR ) buf );
107
108 CheckDlgButton( GetHandle( ), id_ShowCounter, ( Detector->GetCounterWnd() != 0 ) );
109
110 EnableWindow( GetDlgItem( GetHandle( ), cm_SpecificParameters ),
111 Detector->HasSpecificParametersDlg() );
112 }
113 //-----------------------------------------------------------------------------
114
115 void TCommonDevParamDlg::OnShowCounter(HWND hwnd)
116 {
117 if ( ! CanClose( ) )
118 {
119 PostMessage( GetHandle( ), WM_COMMAND, cm_ParamSet, 0 );
120 return;
121 }
122
123 if ( Detector->GetCounterWnd() == 0 )
124 FORWARD_WM_COMMAND( GetFrameHandle( ), cm_CallExecuteCounter, 0, Detector->GetId( ), SendMessage );
125 else
126 FORWARD_WM_MDIDESTROY( GetClientHandle( ), Detector->GetCounterWnd(), SendMessage );
127
128 FORWARD_WM_COMMAND( hwnd, cm_ParamSet, 0, 0, SendMessage );
129 }
130 //-----------------------------------------------------------------------------
131
132 void TCommonDevParamDlg::OnActivateChanges()
133 {
134 if (Detector->GetDimension() == 0)
135 {
136 BOOL bIsSound= IsDlgButtonChecked( GetHandle(), id_SoundSwitch );
137 (dynamic_cast<TZeroDimDetector*>(Detector))->SetSound( bIsSound );
138 }
139
140 Detector->SetParameters();
141 }
142 //-----------------------------------------------------------------------------
143
144 void TCommonDevParamDlg::OnSoundSwitch()
145 {
146 OnActivateChanges();
147 }
148 //-----------------------------------------------------------------------------
149
150 void TCommonDevParamDlg::OnSpecificParameters()
151 {
152 Detector->RunSpecificParametersDlg( GetFrameHandle() );
153 FORWARD_WM_COMMAND( GetHandle( ), cm_ActivateChanges, 0, 0, PostMessage );
154 }
155 //-----------------------------------------------------------------------------
156
157 void TCommonDevParamDlg::OnChooseDetector(HWND hwnd, UINT codeNotify)
158 {
159 if ( codeNotify != CBN_SELCHANGE )
160 return;
161
162 int idx= ComboBox_GetCurSel( hChooseDetector );
163
164 if ( idx == CB_ERR )
165 return;
166
167 TDetector* newDetector= TDetectorManager::DetectorManager().GetDetector(idx);
168
169 if ( Detector != newDetector )
170 {
171 // Neuer Detektor ausgewaehlt
172
173 // Wenn CounterWindow offen, dann schliessen
174 BOOL bCounterWindowWasOpen= ( Detector->GetCounterWnd() != 0 );
175 if ( bCounterWindowWasOpen == TRUE )
176 OnShowCounter(hwnd);
177
178 OnActivateChanges();
179 Detector= newDetector;
180 TDetectorManager::DetectorManager().SetDetector(idx);
181
182 OnParamSet();
183
184 if ( bCounterWindowWasOpen == TRUE )
185 OnShowCounter(hwnd);
186 }
187 }
188 //-----------------------------------------------------------------------------
189
190 BOOL TCommonDevParamDlg::CanClose( void )
191 {
192 char buf[ MaxString ];
193
194 if (Detector->GetDimension() == 0)
195 {
196 BOOL bIsSound= IsDlgButtonChecked( GetHandle(), id_SoundSwitch );
197 (dynamic_cast<TZeroDimDetector*>(Detector))->SetSound( bIsSound );
198 }
199
200 GetDlgItemText( GetHandle( ), id_ExposureCounts, ( LPSTR ) buf, 10 );
201 DWORD dwNewExposureCounts= atol(buf);
202
203 GetDlgItemText( GetHandle( ), id_ExposureTime, ( LPSTR ) buf, 10 );
204 float fNewExposureTime= atof(buf);
205
206 Detector->SetExposureSettings( TExposureSettings( fNewExposureTime, dwNewExposureCounts) );
207
208 Detector->PushSettings( );
209 return TRUE;
210 }
211 //-----------------------------------------------------------------------------
212
213 void TCommonDevParamDlg::LeaveDialog( void )
214 {
215 Detector->SetParameters( );
216 }
217
218 //##############################################################################
219 // TPsdParametersDlg
220 //##############################################################################
221
222 TPsdParametersDlg::TPsdParametersDlg( TModelessDlg **aRef ) : TModelessDlg("PsdParameter", aRef, hModuleInstance), m_Parent(0)
223 {
224 }
225 //-----------------------------------------------------------------------------
226
227 BOOL TPsdParametersDlg::Initialize ( HINSTANCE aInstance, HWND aParentWnd ) {
228 m_Parent= aParentWnd;
229 return TModelessDlg::Initialize( aInstance, aParentWnd );
230 }
231
232 BOOL TPsdParametersDlg::Dlg_OnInit(HWND hwnd, HWND hwndCtl, LPARAM lParam)
233 {
234 if (! TDetectorManager::DetectorManager().DimAvailable(1))
235 {
236 MessageBox("Kein Psd-Detektor gefunden!", "Fehler", MBFAILURE);
237 FORWARD_WM_COMMAND(hwnd, IDCANCEL, hwndCtl, 0, PostMessage);
238 return FALSE;
239 }
240
241 Detector= dynamic_cast<TOneDimDetector*>(
242 TDetectorManager::DetectorManager().GetDetector(0, 1));
243
244 // Initialisieren der Parameterfenster
245 CtrlSetEnabled( id_StepWidth, FALSE );
246 CtrlSetText( id_StepWidthUnit, Detector->GetUnitName() );
247 CtrlSetEnabled( id_AngleRange, FALSE );
248 CtrlSetText( id_AngleRangeUnit, Detector->GetUnitName() );
249
250 PSD2Screen( TRUE, TRUE, TRUE ); // alle Eingabefelder
251 SetFocus(hwnd);
252 return TRUE;
253 }
254 //-----------------------------------------------------------------------------
255
256 void TPsdParametersDlg::Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
257 {
258 switch (id)
259 {
260 case cm_InitializePsd:
261 OnInitializePsd(hwnd);
262 break;
263
264 case cm_SetEnergyRange:
265 Screen2PSD( TRUE, FALSE, FALSE );
266 break;
267
268 case cm_SetPositionRange:
269 Screen2PSD( FALSE, TRUE, FALSE );
270 break;
271
272 case IDOK: // 'OK' und [ENTER]
273 Screen2PSD( TRUE, TRUE, TRUE ); // alle Eingabefelder
274 TModelessDlg::Dlg_OnCommand(hwnd, id, hwndCtl, codeNotify); // Dialog verlassen
275 break;
276
277 default:
278 TModelessDlg::Dlg_OnCommand(hwnd, id, hwndCtl, codeNotify);
279 }
280 }
281 //-----------------------------------------------------------------------------
282
283 void TPsdParametersDlg::PSD2Screen(BOOL aEnergyRange, BOOL aPositionRange, BOOL aRest) {
284 if ( aEnergyRange || aPositionRange )
285 {
286 CtrlSetLong( id_PositionMin, Detector->GetFirstChannel() );
287 CtrlSetLong( id_PositionMax, Detector->GetLastChannel() );
288
289 CtrlSetDouble( id_StepWidth, CalcValueInUnit(Detector->GetUnit(), Detector->GetAngleStep()), Detector->GetAngleStepDigits(), _DECIMAL);
290 CtrlSetDouble( id_AngleRange, CalcValueInUnit(Detector->GetUnit(), Detector->GetAngleRange()), NKAUTO, _DECIMAL);
291 }
292
293 if ( aEnergyRange )
294 {
295 UINT her, ler;
296 Detector->GetEnergyRange(ler, her);
297 CtrlSetLong( id_UpperLevel, her );
298 CtrlSetLong( id_LowerLevel, ler );
299
300 CtrlSetFormat( id_EnergScale1, "max %d", Detector->GetScaledMaxChannels(0) );
301 CtrlSetFormat( id_EnergScale2, "max %d", Detector->GetScaledMaxChannels(1) );
302 CtrlSetFormat( id_EnergScale3, "max %d", Detector->GetScaledMaxChannels(2) );
303 CtrlSetFormat( id_EnergScale4, "max %d", Detector->GetScaledMaxChannels(3) );
304
305 CtrlSetChecked( id_EnergScale1, Detector->GetEnergyScale()!=1 && Detector->GetEnergyScale()!=2 && Detector->GetEnergyScale()!=3 );
306 CtrlSetChecked( id_EnergScale2, Detector->GetEnergyScale()==1 );
307 CtrlSetChecked( id_EnergScale3, Detector->GetEnergyScale()==2 );
308 CtrlSetChecked( id_EnergScale4, Detector->GetEnergyScale()==3 );
309 }
310 if ( aPositionRange )
311 {
312 CtrlSetFormat( id_PosScale1, "max %d", Detector->GetScaledMaxChannels(0) );
313 CtrlSetFormat( id_PosScale2, "max %d", Detector->GetScaledMaxChannels(1) );
314 CtrlSetFormat( id_PosScale3, "max %d", Detector->GetScaledMaxChannels(2) );
315 CtrlSetFormat( id_PosScale4, "max %d", Detector->GetScaledMaxChannels(3) );
316
317 CtrlSetChecked( id_PosScale1, Detector->GetPositionScale()!=1 && Detector->GetPositionScale()!=2 && Detector->GetPositionScale()!=3 );
318 CtrlSetChecked( id_PosScale2, Detector->GetPositionScale()==1 );
319 CtrlSetChecked( id_PosScale3, Detector->GetPositionScale()==2 );
320 CtrlSetChecked( id_PosScale4, Detector->GetPositionScale()==3 );
321 }
322 if ( aRest ) {
323 CtrlSetLong( id_AddedChannels, Detector->GetAddedChannels() );
324 CtrlSetChecked( id_EnergyControl, Detector->GetHVControl() );
325 CtrlSetChecked( id_LeftConnectedZero, Detector->GetReadLeftFirst() );
326 }
327 }
328 //-----------------------------------------------------------------------------
329
330 bool TPsdParametersDlg::Screen2PSD(BOOL aEnergyRange, BOOL aPositionRange, BOOL aRest) {
331 BOOL aValid= FALSE;
332 if ( aEnergyRange ) {
333 UINT scale= 0;
334 if ( CtrlIsChecked(id_EnergScale2) ) scale= 1;
335 if ( CtrlIsChecked(id_EnergScale3) ) scale= 2;
336 if ( CtrlIsChecked(id_EnergScale4) ) scale= 3;
337 Detector->SetEnergyScale(scale);
338
339 int ler= CtrlGetLong(id_LowerLevel, aValid);
340 if ( !aValid ) return false; // Eingabe ungültig
341 int her= CtrlGetLong(id_UpperLevel, aValid);
342 if ( !aValid ) return false; // Eingabe ungültig
343 Detector->SetEnergyRange(ler, her);
344 }
345
346 if ( aPositionRange ) {
347 UINT scale= 0;
348 if ( CtrlIsChecked(id_PosScale2) ) scale= 1;
349 if ( CtrlIsChecked(id_PosScale3) ) scale= 2;
350 if ( CtrlIsChecked(id_PosScale4) ) scale= 3;
351 Detector->SetPositionScale(scale);
352
353 int lpr= CtrlGetLong(id_PositionMin, aValid);
354 if ( !aValid ) return false; // Eingabe ungültig
355 int hpr= CtrlGetLong(id_PositionMax, aValid);
356 if ( !aValid ) return false; // Eingabe ungültig
357 Detector->SetChannelRange(lpr, hpr);
358 }
359 if ( aEnergyRange || aPositionRange )
360 if ( m_Parent ) SendMessage(m_Parent, cm_UpdateRanges, 0, 0);
361
362 if ( aRest ) {
363 int chan= CtrlGetLong(id_AddedChannels, aValid);
364 if ( !aValid ) return false; // Eingabe ungültig
365 Detector->SetAddedChannels( chan );
366 Detector->SetHVControl( CtrlIsChecked(id_EnergyControl) );
367 SetStatus(" "); // Letzte HV-Regelung - Ausgabe löschen.
368 Detector->SetReadLeftFirst( CtrlIsChecked(id_LeftConnectedZero) );
369 }
370
371 // wirklich gesetzte Werte anzeigen (nur die geänderten Werte aktualisieren)
372 PSD2Screen( aEnergyRange, aPositionRange, aRest );
373 return true;
374 }
375 //-----------------------------------------------------------------------------
376
377 void TPsdParametersDlg::OnInitializePsd(HWND hwnd)
378 {
379 if ( Screen2PSD(TRUE, TRUE, TRUE) )
380 if ( Detector->PsdInit() != R_OK )
381 SetInfo("Init Psd failed.");
382
383 PSD2Screen( TRUE, TRUE, TRUE );
384 }
385
386 //##############################################################################
387 // TScsParametersDlg
388 //##############################################################################
389
390 TScsParametersDlg::TScsParametersDlg( TDetector* detectorParam ) : TModalDlg( "SCSPARAMETER", hModuleInstance )
391 {
392 Radicon= static_cast<TRadicon*>(detectorParam);
393 }
394 //-----------------------------------------------------------------------------
395
396 BOOL TScsParametersDlg::Dlg_OnInit( HWND hwnd, HWND hwndCtl, LPARAM lParam )
397 {
398 FORWARD_WM_COMMAND( hwnd, cm_ParamSet, hwndCtl, 0, SendMessage );
399 SetFocus( GetDlgItem( GetHandle( ), id_AngleRange ) );
400 return TRUE;
401 }
402 //-----------------------------------------------------------------------------
403
404 void TScsParametersDlg::Dlg_OnCommand( HWND hwnd, int id, HWND hwndCtl, UINT codeNotify )
405 {
406 if ( id == cm_ParamSet )
407 OnParamSet();
408 else
409 TModalDlg::Dlg_OnCommand( hwnd, id, hwndCtl, codeNotify );
410 }
411 //-----------------------------------------------------------------------------
412
413 void TScsParametersDlg::OnParamSet()
414 {
415 char buf[ MaxString ];
416
417 sprintf( buf, "%d", Radicon->GetDacThresh().GetMin() );
418 SetDlgItemText( GetHandle( ), id_LowerLevel, ( LPSTR ) buf );
419
420 sprintf( buf, "%d", Radicon->GetDacThresh().GetMax() );
421 SetDlgItemText( GetHandle( ), id_UpperLevel, ( LPSTR ) buf );
422
423 sprintf( buf, "%d", Radicon->GetHighVoltage() );
424 SetDlgItemText( GetHandle( ), id_HighVoltage, ( LPSTR ) buf );
425 }
426 //-----------------------------------------------------------------------------
427
428 BOOL TScsParametersDlg::CanClose( void )
429 {
430 char buf[ MaxString ];
431
432 GetDlgItemText( GetHandle( ), id_UpperLevel, ( LPSTR ) buf, 10 );
433 WORD wUpperThresh= atoi(buf);
434
435 GetDlgItemText( GetHandle( ), id_LowerLevel, ( LPSTR ) buf, 10 );
436 WORD wLowerThresh= atoi(buf);
437
438 Radicon->SetDacThresh( wLowerThresh, wUpperThresh );
439
440 GetDlgItemText( GetHandle( ), id_HighVoltage, ( LPSTR ) buf, 10 );
441 Radicon->SetHighVoltage(atoi(buf));
442
443 return TRUE;
444 }
445
446 //##############################################################################
447 // TCalibratePsdDlg
448 //##############################################################################
449
450 TCalibratePsdDlg::TCalibratePsdDlg( TCurve &curve ) : TModalDlg( "CALIBRATEPSD", hModuleInstance ), m_lastfocused(NULL), m_OldControlWnd(0)
451 {
452 m_lnkTimer= new TInterfaceTimer( this, 80 ); //Observer, d.h. Timer benachrichtigt uns
453
454 Curve= &curve; // MainCurve vom Daten-Fenster
455 //! gibt an ob motor ueber groessere distanz faehrt
456 bLongMove= FALSE;
457
458 LeftPeak.Valid= FALSE;
459
460 RightPeak.Valid= FALSE;
461 //! gibt an ob rechter bzw. linker Peak schon erreicht ist
462 bGetRightPeak= FALSE;
463 bGetLeftPeak= FALSE;
464 // 21.04.2004 bCalibrationOk= FALSE;
465
466 //! Thetamotor setzen
467 nMotor= mlGetIdByName( Theta );
468 mlSetAxis( nMotor );
469
470 //! alte Schrittweite merken + neue auf 1800 winkelsekunden setzen
471 dOldMotorWidth= mGetValue( Width );
472 mSetValue( Width, CalcValueInUnit(mGetUnit(), 1800.0) ); //! FIX Fehler 48
473 mActivateDrive();
474 }
475 //-----------------------------------------------------------------------------
476
477 //! setzt Defaultwerte der Dialogbox bei Aufruf der Box
478 //! Rueckkehrcode immer true
479 BOOL TCalibratePsdDlg::Dlg_OnInit( HWND hwnd, HWND hwndCtl, LPARAM lParam )
480 {
481 if ( !mlIsAxisValid( Theta ) || !TDetectorManager::DetectorManager().DimAvailable(1))
482 {
483 MessageBox("Kein Psd-Detektor gefunden bzw. Theta-Achse nicht verfügbar!", "Fehler", MBFAILURE);
484 FORWARD_WM_COMMAND(GetHandle(), IDCANCEL, hwndCtl, 0, PostMessage);
485 return FALSE;
486 }
487
488 hBar= GetDlgItem( GetHandle(), id_Bar );
489
490 Psd= dynamic_cast<TOneDimDetector*>( TDetectorManager::DetectorManager().GetDetector(0, 1) );
491 //! Psd einstellen
492 Psd->MeasureStop();
493 // 12.06.2004 Psd->SetAddedChannels( 2 );
494 m_OldControlWnd= Psd->GetControlWnd();
495 Psd->SetControlWnd( GetHandle() );
496 Psd->SetExposureSettings( TExposureSettings(2.0, 10000) );
497 Psd->MeasureStart();
498
499 dStepWidth= Psd->GetAngleStep();
500 OnParamSet(); // benötigt dStepWidth
501 BOOL bValid;
502 double dDistance= DoRefreshPosition(bValid);
503 CtrlSetDouble(id_NewAngle, dDistance, mGetDigits(), _DECIMAL);
504 CtrlSetText( id_Unit, mGetUnitName() );
505
506 SetFocus( hBar );
507 Delay( 5000 );
508 return TRUE;
509 }
510 //-----------------------------------------------------------------------------
511
512 //! behandelt Timersignale zur aktualisierung der Winkelwerte in Dialogbox
513 void TCalibratePsdDlg::OnTimer ( TBasicTimer *const )
514 {
515 BOOL bValid;
516 //! Wait-mauszeiger setzen
517 SetDefaultCursor( IDC_WAIT );
518
519 //! test ob motor an Ziel angekommen
520 if ( mIsMoveFinish() ) // nicht mehr in Bewegung
521 {
522 //! Motorpos.bestimmung + test ob fehler
523 double dDistance= DoRefreshPosition(bValid);
524 if ( !bValid ) return;
525
526 CtrlSetDouble(id_NewAngle, dDistance, mGetDigits(), _DECIMAL);
527 SetDefaultCursor( IDC_ARROW );
528 m_lnkTimer->StopTimer();
529
530 } else
531 if ( bLongMove ) // Motor noch in Bewegung
532 //! bei bewegung ueber groessere distanz den akt. Winkel in Dialogbox + //! scrollbar aktualisieren
533 DoRefreshPosition(bValid);
534 }
535 //-----------------------------------------------------------------------------
536
537 //! behandelt Kommandos in der Dialogbox
538 void TCalibratePsdDlg::Dlg_OnCommand( HWND hwnd, int id, HWND hwndCtl,
539 UINT codeNotify )
540 {
541 switch ( id )
542 {
543 case cm_CounterSet://! wenn Psdmessung fertig
544 OnCounterSet();
545 break;
546
547 case id_NewAngle:
548 m_lastfocused= hwndCtl;
549 break;
550
551 case cm_RightPositionReached://! rechte Position erreicht-Button gedrueckt
552 m_lastfocused= hwndCtl;
553 OnRightPositionReached();
554 break;
555
556 case cm_LeftPositionReached://! linke Position erreicht-Button gedrueckt
557 m_lastfocused= hwndCtl;
558 OnLeftPositionReached();
559 break;
560
561 case ID_CANCEL: // //! behandelt Abbrechen-Button
562 m_lastfocused= hwndCtl;
563 OnCancel();
564 break;
565
566 case IDOK: // Enter
567 OnIDOK();
568 break;
569
570 default: //! beinhandelt auch Beenden-Button und Schließen-"x" (IDCANCEL)
571 TModalDlg::Dlg_OnCommand( hwnd, id, hwndCtl, codeNotify );
572 }
573 }
574 //-----------------------------------------------------------------------------
575
576 //! behandelt alle Scrollbarereignisse
577 void TCalibratePsdDlg::Dlg_OnHScrollBar( HWND hwnd, HWND hwndCtl, UINT code, int pos )
578 {
579 m_lastfocused= hBar;
580 switch ( code )
581 {
582 case SB_LINEDOWN: //! Scrollbar um eine einheit nach rechts
583 case SB_LINEUP: //! Scrollbar um eine einheit nach links
584 //! wenn Motor in Bewegung: abbrechen
585 if ( !mIsMoveFinish() ) return;
586 bLongMove= FALSE;
587 if ( code==SB_LINEUP ) mMoveByDistance( -fabs(mGetValue(Width)) );
588 else mMoveByDistance( fabs(mGetValue(Width)) ); // SB_LINEDOWN
589 m_lnkTimer->StartTimer();
590 break;
591 }
592 }
593 //-----------------------------------------------------------------------------
594
595 //! wird bei Verlassen der Dialogbox aufgerufen, Rueckkehrcode immer true
596 void TCalibratePsdDlg::LeaveDialog( void )
597 {
598 char buf[ MaxString ];
599 char format[ MaxString ];
600 char ident[ MaxString ];
601 //! FIX Fehler 48
602 Psd->SetAngleStep( dStepWidth );
603
604 //! speichert Kanal pro Winkel im Ini-File des Psd
605 sprintf( ident, "Device%d", Psd->GetId() );
606 sprintf(format, "%s%d%s", "%.", Psd->GetAngleStepDigits(), "f"); // Anzahl der Nachkommastellen beachten
607 sprintf( buf, format, Psd->GetAngleStep() );
608 if ( Psd->GetAngleStep() != 0.0 ) WritePrivateProfileString( ident, "AngleStep", buf, GetHWFile() );
609
610 //! loescht alle TimerIdInformation + stoppen der Messung
611 //! FIX Fehler 49
612 mStopDrive( FALSE );
613 mSetValue( Width, dOldMotorWidth );
614 m_lnkTimer->StopTimer();
615
616 Psd->MeasureStop();
617 Psd->SetControlWnd( m_OldControlWnd );
618 }
619 //-----------------------------------------------------------------------------
620
621 void TCalibratePsdDlg::OnIDOK()
622 {
623 // [ENTER] nicht im 'Neuer Winkel': Abbruch
624 if ( m_lastfocused!=Ctrl(id_NewAngle) ) return;
625
626 // Der Nutzer hat mit neue Position eingegeben und [ENTER] gedrückt
627 BOOL bValid= FALSE;
628 double dDistance= CtrlGetDouble(id_NewAngle, mGetDigits(), _DECIMAL, bValid);
629 CtrlSetDouble(id_NewAngle, dDistance, mGetDigits(), _DECIMAL);
630 if ( bValid ) {
631 mStopDrive(TRUE);
632 bLongMove= TRUE;
633 mMoveToDistance( dDistance );
634 m_lnkTimer->StartTimer();
635 }
636 SetFocus( hBar );
637 }
638 //-----------------------------------------------------------------------------
639
640 void TCalibratePsdDlg::OnCancel() {
641 mStopDrive( FALSE );
642 }
643 //-----------------------------------------------------------------------------
644
645 double TCalibratePsdDlg::DoRefreshPosition(BOOL &aValid) {
646 aValid= FALSE;
647 double dDistance;
648 if ( !mGetDistance( dDistance ) ) return 0;
649
650 //! Winkel 2Thetawerte in Dialogbox schreiben + scrollbar aktualisieren
651 CtrlSetDouble(id_Angle, dDistance, mGetDigits(), _DECIMAL);
652
653 SCROLLINFO scrInfo;
654 scrInfo.cbSize= sizeof(SCROLLINFO);
655 scrInfo.fMask= SIF_POS;
656 scrInfo.nPos= GetBarPos();
657 SetScrollInfo(hBar,SB_CTL,&scrInfo,TRUE);
658 aValid= TRUE;
659 return dDistance;
660 }
661 //-----------------------------------------------------------------------------
662
663 void TCalibratePsdDlg::OnParamSet()
664 {
665 // akt. Winkel je Kanal setzen und Scrollbar-Bereich aktualisieren
666 CtrlSetDouble(id_StepWidth, dStepWidth, Psd->GetAngleStepDigits(), _DECIMAL); //! FIX Fehler 48
667
668 // Initialisieren des Motor-Scroll-Bar's
669 SCROLLINFO scrInfo;
670 scrInfo.cbSize= sizeof(SCROLLINFO);
671 scrInfo.fMask= SIF_RANGE;
672 scrInfo.nMin= GetBarEgde(TRUE);
673 scrInfo.nMax= GetBarEgde(FALSE);
674 SetScrollInfo(hBar, SB_CTL, &scrInfo, TRUE);
675 }
676 //-----------------------------------------------------------------------------
677
678 void TCalibratePsdDlg::OnCounterSet()
679 {
680 float val_f, val_f1, channel, dd;
681
682 Psd->UpdateViews(TRUE);
683 if ( m_OldControlWnd ) PostMessage( m_OldControlWnd, WM_COMMAND, cm_CounterSet, 0 ); // AreaScan-Fenster auch neu zeichnen
684
685 //! test ob rechte Peakpos. schon eingestellt wurde
686 if ( bGetRightPeak )
687 {
688 //! ermitteln + speichern des Kanals der max. Intensitaet
689 Curve->GetGravityCenter( dd, dd, channel );
690 RightPeak.Pt[0]= channel;
691 RightPeak.Valid= TRUE;
692 bGetRightPeak= FALSE;
693 //! wenn linke Peakpos. schon ermittelt
694
695 if ( LeftPeak.Valid )
696 {
697 //! winkeldifferenz zwischen linken und rechten peak ermitteln
698 val_f= ( LeftPeak.Pt[ 1 ] - RightPeak.Pt[ 1 ] );
699 //! wenn linker peak == rechter peak dann rechte Peakpos. verwerfen
700 if ( val_f != 0.0 )
701 {
702 //! wenn gleicher kanal fuer linken und rechten peak dann
703 //! Fehlermeldung
704 val_f1= ( RightPeak.Pt[ 0 ] - LeftPeak.Pt[ 0 ] );
705 if ( val_f1 != 0 )
706 {
707 //! Winkel je kanal ausrechnen und an Psd uebergeben
708 dStepWidth= CalcValueFromUnit(mGetUnit(), val_f / val_f1); //! FIX Fehler 48
709 } else {
710 MessageBox( "Vorgang bitte wiederholen !", "Fehler", MBINFO );
711 //! FIX Fehler 58
712 //! reset aller wichtigen Werte
713 LeftPeak.Valid= FALSE;
714 RightPeak.Valid= FALSE;
715 bGetRightPeak= FALSE;
716 bGetLeftPeak= FALSE;
717 CtrlSetEnabled( cm_LeftPositionReached, TRUE);
718 CtrlSetEnabled( cm_RightPositionReached, TRUE);
719 return;
720 }
721 } else {
722 RightPeak.Valid= FALSE;
723 bGetRightPeak= TRUE;
724 }
725 }
726
727 //! sperren bzw. freigeben des rechte-Position-erreicht-Button
728 CtrlSetEnabled(cm_RightPositionReached, bGetRightPeak );
729 }
730
731 //! test ob linke Peakpos. schon eingestellt wurde
732 if ( bGetLeftPeak )
733 {
734 //! ermitteln + speichern des Kanals der max. Intensitaet
735 Curve->GetGravityCenter( dd, dd, channel );
736 LeftPeak.Pt[0]= channel;
737 LeftPeak.Valid= TRUE;
738 bGetLeftPeak= FALSE;
739 //! wenn rechte Peakpos. schon ermittelt
740
741 if ( RightPeak.Valid )
742 {
743 //! winkeldifferenz zwischen linken und rechten peak ermitteln
744 val_f= ( LeftPeak.Pt[ 1 ] - RightPeak.Pt[ 1 ] );
745 //! wenn linker peak == rechter peak dann rechte Peakpos. verwerfen
746
747 if ( val_f != 0.0 )
748 {
749 //! wenn gleicher kanal fuer linken und rechten peak dann
750 //! Fehlermeldung
751 val_f1= ( RightPeak.Pt[ 0 ] - LeftPeak.Pt[ 0 ] );
752 if ( val_f1 != 0 )
753 {
754 //! Winkel je kanal ausrechnen und an Psd uebergeben
755 dStepWidth= CalcValueFromUnit(mGetUnit(), -val_f / val_f1); //! FIX Fehler 48
756 } else {
757 MessageBox( "Vorgang bitte wiederholen !", "Fehler", MBINFO );
758 //! FIX Fehler 58
759 //! reset aller wichtigen Werte
760 LeftPeak.Valid= FALSE;
761 RightPeak.Valid= FALSE;
762 bGetRightPeak= FALSE;
763 bGetLeftPeak= FALSE;
764 CtrlSetEnabled( cm_LeftPositionReached, TRUE );
765 CtrlSetEnabled( cm_RightPositionReached, TRUE );
766 return;
767 }
768 } else {
769 LeftPeak.Valid= FALSE;
770 bGetLeftPeak= TRUE;
771 }
772 }
773
774 //! sperren bzw. freigeben des linke-Position-erreicht-Button
775 CtrlSetEnabled( cm_LeftPositionReached, bGetLeftPeak );
776 }
777
778 OnParamSet(); //! Winkel je Kanal-Wert in Dialogbox
779
780 // 12.06.2004 Psd->SetAddedChannels( 2 );
781
782 Psd->MeasureStart();
783 }
784 //-----------------------------------------------------------------------------
785
786 void TCalibratePsdDlg::OnRightPositionReached()
787 {
788 //! wenn Motor in bewegung abbrechen
789 if ( !mIsMoveFinish() ) return;
790
791 Psd->MeasureStop();
792 bGetRightPeak= TRUE;
793 bGetLeftPeak= FALSE;
794 //! 2Theta winkel speichern
795 RightPeak.Pt[1]= mGetValue( Distance );
796 // 12.06.2004 Psd->SetAddedChannels( 1 );
797 Psd->MeasureStart();
798 SetFocus( hBar );
799 }
800 //-----------------------------------------------------------------------------
801
802 void TCalibratePsdDlg::OnLeftPositionReached()
803 {
804 //! wenn Motor in bewegung abbrechen
805 if ( !mIsMoveFinish() ) return;
806
807 Psd->MeasureStop();
808 bGetRightPeak= FALSE;
809 bGetLeftPeak= TRUE;
810 //! 2Theta winkel speichern
811 LeftPeak.Pt[1]= mGetValue( Distance );
812 // 12.06.2004 Psd->SetAddedChannels( 1 );
813 Psd->MeasureStart();
814 SetFocus( hBar );
815 }
816 //-----------------------------------------------------------------------------
817
818 double TCalibratePsdDlg::GetBarScale ( void ) const
819 {
820 double angleMin= min( mGetAngleRelativeMin(), mGetAngleRelativeMax() );
821 double angleMax= max( mGetAngleRelativeMin(), mGetAngleRelativeMax() );
822 double diff= angleMax - angleMin;
823 try
824 {
825 return 32000 / diff;
826 }
827 catch (...)
828 {
829 return 0; // sonst div 0
830 }
831 }
832 //-----------------------------------------------------------------------------
833
834 //! liefert die Position des Scrollbar anhand der akt. Motorposition im
835 //!Rueckkehrcode
836 int TCalibratePsdDlg::GetBarPos() const
837 {
838 double angle;
839 mGetDistance(angle);
840 double angleMin= min( mGetAngleRelativeMin(), mGetAngleRelativeMax() );
841 return (int) ( (angle-angleMin)*GetBarScale());
842 }
843 //-----------------------------------------------------------------------------
844
845 //! ermittelt Anzahl der Scrollbarschritte links bzw. rechts von der abs. Null
846 int TCalibratePsdDlg::GetBarEgde( BOOL aLeft ) const
847 {
848 if ( !aLeft )
849 {
850 double angleMin= min( mGetAngleRelativeMin(), mGetAngleRelativeMax() );
851 double angleMax= max( mGetAngleRelativeMin(), mGetAngleRelativeMax() );
852 return (int) ( (angleMax-angleMin)*GetBarScale() );
853 }
854 else
855 return 0;
856 }
857