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