File: MANJUST\MJ_OGUI.CPP

    1 //#############################################################################
    2 //                                                                           //
    3 // MJ_OGUI.CPP                                                               //
    4 //                                                                           //
    5 // Subsystem : alte Manuelle Justage / Oberfläche                            //
    6 // Benutung durch andere Subsysteme erforderlich: JA                         //
    7 //---------------------------------------------------------------------------//
    8 // Autoren: Thomas Kullmann, Günther Reinecker                               //
    9 // Stand  : 12.10.2002                                                       //
   10 //                                                                           //
   11 //#############################################################################
   12 
   13 #include "internls\evrythng.h" // GermanVersion
   14 #include "winresrc\rc_def.h"   // Ressourcen-IDs
   15 #include "help\help_def.h"     // Help-IDs
   16 
   17 #include "manjust\mj_ogui.h" // SCHNITTSTELLE für diese Datei
   18 
   19 #include "workflow\workflow.h" // extern Steering
   20 
   21 //--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--
   22 
   23 //##############################################################################
   24 // externe Abhängigkeiten
   25 //##############################################################################
   26 
   27 extern BOOL bManualMovesCorrected;
   28 
   29 //#############################################################################
   30 // sprachspezifische Konstanten
   31 //#############################################################################
   32 
   33 #ifdef GermanVersion
   34   static const char _NORMTITLE[]= "Manuelle Justage";   
   35   static const char _REFTITLE[]= "Manuelle Justage : Kein gültiger Referenzpunktlauf";   
   36 
   37   static const char szMsgLine500[]= "HWB= %.2f Sekunden";   
   38   static const char szMsgLine501[]= "&Messung abbrechen";   
   39   static const char szMsgLine502[]= "&Halbwertsbreite messen";   
40 #else 41 static const char _NORMTITLE[]= "Manual Adjustment"; 42 static const char _REFTITLE[]= "Manual Adjustment : No valid Reference Point"; 43 44 static const char szMsgLine500[]= "HWB= %.2f arcsec"; 45 static const char szMsgLine501[]= "Skip &Measurement"; 46 static const char szMsgLine502[]= "Measure &Halfwidth";
47 #endif 48 49 //############################################################################# 50 // TAngleCtlDlg 51 //############################################################################# 52 53 //***************************************************************************** 54 // KONSTRUKTOR-DESTRUKTOR 55 //***************************************************************************** 56 57 TAngleCtlDlg::TAngleCtlDlg ( void ) : TModalDlg("ANGLECONTROL", GetMainInstance() ), m_lnkAngleCtl(0), m_lnkTimer(0) 58 { 59 m_lnkAngleCtl= new TAngleCtl(); 60 m_lnkTimer= new TInterfaceTimer( this, 100 ); //Observer, d.h. Timer benachrichtigt uns 61 m_Selected= m_lnkAngleCtl->GetActualMotor(); // derzeit ausgewählter Antrieb 62 m_StepMode= new BOOL [m_lnkAngleCtl->GetMotorCount()]; // Liste der Betriebsparameter: Länge=Anzahl der Motoren 63 for (UINT i= 0; i < m_lnkAngleCtl->GetMotorCount(); i++) 64 m_StepMode[i]= TRUE; // Schrittbetrieb "ein" und Fahrbetrieb "aus" 65 }; 66 //----------------------------------------------------------------------------- 67 68 TAngleCtlDlg::~TAngleCtlDlg ( void ) 69 { 70 _FREEOBJ( m_lnkAngleCtl ); 71 _FREEOBJ( m_lnkTimer ); 72 } 73 74 //***************************************************************************** 75 // EREIGNISSE DER BASISKLASSE 76 //***************************************************************************** 77 78 BOOL TAngleCtlDlg::Dlg_OnInit ( HWND, HWND, LPARAM ) 79 { 80 OnInit(); 81 82 // HotKey's Hilfe laden (nur Win32) 83 LoadHotKeys( LoadAccelerators(GetMainInstance(), MAKEINTRESOURCE(ACC_AngleControl)) ); // Accelerator aus Ressourcen laden 84 85 return TRUE; 86 }; 87 //----------------------------------------------------------------------------- 88 89 void TAngleCtlDlg::Dlg_OnCommand ( HWND hwnd, int id, HWND hwndCtl, UINT codeNotify ) 90 { 91 int idx; 92 if ( codeNotify == ONEXIT ) 93 { 94 if ( id == id_NewAngle ) 95 OnNewAngleEntered( FALSE ); 96 else if ( id == id_AngleWidth ) 97 OnAngleWidthEntered( FALSE ); 98 else if ( id == id_SpeedValue ) 99 OnSpeedEntered( FALSE ); 100 return; 101 } 102 switch (id) 103 { 104 case cm_Help: 105 WinHelp(GetHandle(), GetHelpFile(), HELP_CONTEXT, Help_AngleControlDlg); 106 break; 107 108 case cm_MotorInit: // wird nur intern verschickt um die aktuellen Bewegungsparameter anzuzeigen und den Antrieb für die Bewegung vorzubereiten 109 OnMotorInit(); 110 break; 111 112 case cm_ParamSet: // wird nur intern verschickt um den aktuellen Antrieb samt Position und Einheit anzuzeigen 113 OnParamSet(); 114 break; 115 116 case cm_MoveButton: // wird nur intern verschickt wenn sich der Antrieb in Bewegung gesetzt hat 117 OnMotionStarts(); 118 break; 119 120 case cm_SetAngleZero: // Relative Null setzen 121 OnSetAngleZero(); 122 break; 123 124 case cm_CancelRelativeZero: // Relative Null aufheben 125 OnCancelRelativeZero(); 126 break; 127 128 case cm_MeasureHWB: // Halbwertsbreite messen 129 if ( m_lnkAngleCtl->IsMeasuring() ) 130 OnStopMeasureHWB(); // Messung abbrechen (wenn aktiv) 131 else 132 OnStartMeasureHWB(); 133 break; 134 135 case cm_SteeringReady: // Botschaft wird durch das Steering-Objekt gesendet, wenn die Halbwertsbreitenmessung beendet ist 136 OnSteeringReady(); 137 break; 138 139 case cm_CounterSet: // Botschaft wird vom Detektor gesendet, wenn neue Messwerte vorliegen 140 OnCounterSet(); 141 break; 142 143 case id_StepMode: // Schrittbetrieb wurde ausgewählt 144 OnStepMode(); 145 break; 146 147 case id_LongMoveMode: // Fahrbetrieb wurde ausgewählt 148 OnLongMoveMode(); 149 break; 150 151 case id_ChooseMotor: // Antrieb wurde im Kombinationsfeld ausgewählt 152 if ( codeNotify != CBN_SELCHANGE ) 153 break; // wenn sich die Auswahl nicht geändert hat: Aufruf ignorieren 154 155 idx= CtrlGetSel(id_ChooseMotor); 156 if ( (m_Selected != idx) && (idx != CB_ERR) ) 157 OnChooseMotor(idx); 158 break; 159 160 case cm_SetFine: // "Beugung fein" wurde mittels Schnellauswahl-Schaltfläche ausgewählt 161 OnChooseMotor(Omega); 162 break; 163 164 case cm_SetTilt: // Tilt wurde mittels Schnellauswahl-Schaltfläche ausgewählt 165 OnChooseMotor(Psi); 166 break; 167 168 case cm_SetCollimator: // Kollimator in Schnellauswahl auswählen 169 OnChooseMotor(Collimator); 170 break; 171 172 case IDOK: // [ENTER] wurde gedrückt 173 OnIDOK(); 174 break; 175 176 default: 177 TModalDlg::Dlg_OnCommand(hwnd, id, hwndCtl, codeNotify); 178 } 179 }; 180 //----------------------------------------------------------------------------- 181 182 void TAngleCtlDlg::Dlg_OnHScrollBar ( HWND, HWND, UINT code, int ) 183 { 184 switch (code) 185 { 186 case SB_LINEUP: 187 case SB_LINEDOWN: 188 OnScrollbarLine( code == SB_LINEDOWN ); // wenn Bewegung im Direktbetrieb stattfindet: nichts machen 189 break; 190 191 case SB_ENDSCROLL: // Maustaste wurde losgelassen: Bewegung stoppen 192 OnScrollbarEndscroll(); 193 break; 194 } 195 }; 196 //----------------------------------------------------------------------------- 197 198 void TAngleCtlDlg::Interrupt ( void ) 199 { // [ESC] wurde gedrückt 200 OnInterrupt(); 201 }; 202 //----------------------------------------------------------------------------- 203 204 void TAngleCtlDlg::LeaveDialog ( void ) 205 { 206 OnLeave(); 207 }; 208 //----------------------------------------------------------------------------- 209 210 void TAngleCtlDlg::OnTimer ( TBasicTimer *const ) 211 { 212 m_lnkTimer->StopTimer(); 213 if ( OnSuperviseMove() ) 214 m_lnkTimer->StartTimer(); // weiter überwachen 215 }; 216 217 //***************************************************************************** 218 // Methoden für die Übernahme der Bewegungsparameter 219 //****************************************************************************** 220 221 void TAngleCtlDlg::OnNewAngleEntered ( const BOOL aStartMove ) 222 { 223 BOOL bValid; 224 UINT iDigits= m_lnkAngleCtl->GetDigits(m_Selected, bValid); 225 double angle= CtrlGetDouble(id_NewAngle, iDigits, _DECIMAL, bValid); 226 if ( !bValid ) 227 return; 228 229 BOOL moves= (m_lnkAngleCtl->IsMoving(m_Selected, bValid)) && (bValid); 230 if ( moves ) 231 angle= m_lnkAngleCtl->GetAngle(m_Selected, bValid); 232 CtrlSetDouble(id_NewAngle, angle, iDigits, _DECIMAL); 233 234 // Bewegung nur starten, wenn [ENTER] gedrückt wurde 235 if ( (aStartMove) && (m_lnkAngleCtl->DoDirect(m_Selected, angle)) ) 236 OnMotionStarts(); // wenn gestartet: Bewegung überwachen 237 } 238 //----------------------------------------------------------------------------- 239 240 void TAngleCtlDlg::OnSpeedEntered ( const BOOL aFocusCtrl ) 241 { 242 BOOL bValid; 243 UINT iDigits= m_lnkAngleCtl->GetDigits(m_Selected, bValid); 244 double speed= CtrlGetDouble(id_SpeedValue, iDigits, _DECIMAL, bValid); 245 if ( !bValid ) 246 return; 247 248 m_lnkAngleCtl->SetSpeed(m_Selected, speed); 249 CtrlSetDouble(id_SpeedValue, speed, iDigits, _DECIMAL); 250 if ( aFocusCtrl ) 251 SetFocus(m_BarHandle); // Antriebsbewegung nur per Bildlaufleiste möglich; siehe Dlg_OnHScrollBar 252 } 253 //----------------------------------------------------------------------------- 254 255 void TAngleCtlDlg::OnAngleWidthEntered ( const BOOL aFocusCtrl ) 256 { 257 BOOL bValid; 258 UINT iDigits= m_lnkAngleCtl->GetDigits(m_Selected, bValid); 259 double anglewidth= CtrlGetDouble(id_AngleWidth, iDigits + 1, _DECIMAL, bValid); // Schrittweite hat eine Nachkommastelle mehr als Winkel- und Geschwindigkeitsangaben 260 if ( !bValid ) 261 return; 262 263 m_lnkAngleCtl->SetAngleWidth(m_Selected, anglewidth); 264 CtrlSetDouble(id_AngleWidth, anglewidth, iDigits + 1, _DECIMAL); // Schrittweite hat eine Nachkommastelle mehr als Winkel- und Geschwindigkeitsangaben 265 if ( aFocusCtrl ) 266 SetFocus(m_BarHandle); // Antriebsbewegung nur per Bildlaufleiste möglich; siehe Dlg_OnHScrollBar 267 } 268 269 //***************************************************************************** 270 // potentielle Funktionalitätskandidaten 271 //***************************************************************************** 272 273 void TAngleCtlDlg::OnInit ( void ) 274 { 275 m_BarHandle= GetDlgItem(GetHandle(), id_Bar); // Handle auf die Scrollbar 276 BOOL bValid; 277 for (UINT cnt= 0; cnt < m_lnkAngleCtl->GetMotorCount(); cnt++) 278 CtrlAddString(id_ChooseMotor, m_lnkAngleCtl->GetMotorName(cnt, bValid)); // alle verfügbaren Achsen ins Kombinationsfeld eintragen 279 m_lnkAngleCtl->DoInit(m_Selected); 280 CtrlSetChecked(id_StepMode, m_StepMode[m_Selected]); // Kontrollfeld "Schritt" auswählen, wenn Schrittbetrieb ausgewählt ist 281 CtrlSetChecked(id_LongMoveMode, !m_StepMode[m_Selected]); // Kontrollfeld "Fahren" auswählen, wenn Fahrbetrieb ausgewählt ist 282 CtrlSetEnabled(id_AngleWidth, m_StepMode[m_Selected]); // Eingabefeld Schrittweite freigeben (wenn Schrittbetrieb ausgewählt) bzw. sperren und ausgegrauen (SONST) 283 //04.12.2002 Eingabe der Geschwindigkeit im Direktbetrieb ist nun möglich CtrlSetEnabled(id_SpeedValue, !m_StepMode[m_Selected]); // Eingabefeld Geschwindigkeit freigeben (wenn Fahrbetrieb ausgewählt) bzw. sperren und ausgegrauen (SONST) 284 if ( !m_lnkAngleCtl->CanDoStartMeasure() ) 285 CtrlSetEnabled(cm_MeasureHWB, FALSE); // wenn Omega nicht da oder Makro "InquireHWB" fehlt: "Halbwertsbreite messen" sperren und ausgrauen 286 if ( m_lnkAngleCtl->GetMotorIdx(Omega) == -1 ) 287 CtrlSetEnabled(cm_SetFine, FALSE); // wenn Omega nicht da: Schnellauswahl-Schaltfläche "Beugung fein" und Schaltfläche "Halbwertsbreite messen" sperren und ausgrauen 288 if ( m_lnkAngleCtl->GetMotorIdx(Psi) == -1 ) 289 CtrlSetEnabled(cm_SetTilt, FALSE); // wenn Psi nicht da: Schnellauswahl-Schaltfläche "Tilt" sperren und ausgrauen 290 if ( m_lnkAngleCtl->GetMotorIdx(Collimator) == -1 ) 291 CtrlSetEnabled(cm_SetCollimator, FALSE); // wenn Kollimator nicht da: Schnellauswahl-Schaltfläche "Kollimator" sperren und ausgrauen 292 OnMotorInit(); 293 OnParamSet(); 294 m_lnkTimer->StartTimer(); 295 }; 296 //----------------------------------------------------------------------------- 297 298 BOOL TAngleCtlDlg::OnSuperviseMove ( void ) 299 { 300 BOOL bValid; 301 if ( m_lnkAngleCtl->IsMeasuring() ) 302 return FALSE; // Positionierung nicht überwachen 303 304 if ( (m_lnkAngleCtl->IsMoving(m_Selected, bValid)) && (bValid) ) 305 { 306 OnMotionProgress(); 307 return TRUE; // Antrieb ist immernoch in Bewegung 308 } 309 else 310 { 311 OnMotionStops(); 312 return FALSE; // Antrieb steht jetzt 313 } 314 } 315 //----------------------------------------------------------------------------- 316 317 void TAngleCtlDlg::OnMotorInit ( void ) 318 { 319 m_lnkAngleCtl->DoInitMotor( m_Selected, m_StepMode[m_Selected] ); 320 // Eingabefelder "Schrittweite" und "Geschwindigkeit" freigeben bzw. sperren und ausgrauen (in Abhängikeit davon, ob Schritt- oder Fahrbetrieb ausgewählt sind) 321 CtrlSetEnabled(id_AngleWidth, m_StepMode[m_Selected]); 322 //04.12.2002 Eingabe der Geschwindigkeit im Direktbetrieb ist nun möglich CtrlSetEnabled(id_SpeedValue, !m_StepMode); 323 CtrlSetChecked(id_StepMode, m_StepMode[m_Selected]); // Kontrollfeld "Schritt" auswählen, wenn Schrittbetrieb ausgewählt ist 324 CtrlSetChecked(id_LongMoveMode, !m_StepMode[m_Selected]); // Kontrollfeld "Fahren" auswählen, wenn Fahrbetrieb ausgewählt ist 325 // aktuelle Schrittweite und Geschwindigkeit anzeigen 326 BOOL bValid; 327 UINT iDigits= m_lnkAngleCtl->GetDigits(m_Selected, bValid); 328 CtrlSetDouble(id_AngleWidth, m_lnkAngleCtl->GetAngleWidth(m_Selected, bValid), iDigits + 1, _DECIMAL); // Schrittweite hat eine Nachkommastelle mehr als Winkel- und Geschwindigkeitsangaben 329 CtrlSetDouble(id_SpeedValue, m_lnkAngleCtl->GetSpeed(m_Selected, bValid), iDigits, _DECIMAL); 330 if ( bManualMovesCorrected ) 331 m_lnkAngleCtl->SetCorrectionState(m_Selected); // Überprüfung der Kalibrierungskurven Correction aktivieren 332 // Titel des Dialogs anpassen, je nachdem ob aktueller Antrieb kalibiert ist 333 if ( m_lnkAngleCtl->IsCalibrated(m_Selected, bValid) ) 334 SetWindowText(GetHandle(), _NORMTITLE); 335 else 336 SetWindowText(GetHandle(), _REFTITLE); 337 CtrlSetEnabled(cm_CancelRelativeZero, m_lnkAngleCtl->CanResetRelativeZero(m_Selected)); // Schaltfläche "Relative Null aufheben" gdw. freigeben, wenn Relative Null gesetzt 338 OnSuperviseMove(); 339 } 340 //----------------------------------------------------------------------------- 341 342 void TAngleCtlDlg::OnParamSet ( void ) 343 { 344 BOOL bValid; 345 346 CtrlSetEnabled(cm_CancelRelativeZero, m_lnkAngleCtl->HasOffset(m_Selected, bValid)); // Schaltfläche "Relative Null aufheben" gdw. freigeben, wenn Relative Null gesetzt 347 UINT iDigits= m_lnkAngleCtl->GetDigits(m_Selected, bValid); 348 double dDistance= m_lnkAngleCtl->GetAngle(m_Selected, bValid); 349 CtrlSetDouble(id_NewAngle, dDistance, iDigits, _DECIMAL); 350 CtrlSetDouble(id_Angle, dDistance, iDigits, _DECIMAL); 351 CtrlSetSelString(id_ChooseMotor, m_lnkAngleCtl->GetMotorName(m_Selected, bValid)); // aktuellen Antrieb im Kombinationsfeld auswählen 352 CtrlSetText(id_Unit, m_lnkAngleCtl->GetUnit(m_Selected, bValid)); // Einheit vom aktuellen Antrieb hinter Eingabefeld "Neuer Winkel" anzeigen 353 CtrlSetText(id_StepUnit, m_lnkAngleCtl->GetUnit(m_Selected, bValid)); // Einheit vom aktuellen Antrieb hinter Eingabefeld "Schrittbetrieb" anzeigen 354 355 SCROLLINFO scrInfo; 356 scrInfo.cbSize= sizeof(SCROLLINFO); 357 scrInfo.fMask= SIF_RANGE; 358 scrInfo.nMin= GetBarEgde(TRUE); 359 scrInfo.nMax= GetBarEgde(FALSE); 360 SetScrollInfo(m_BarHandle,SB_CTL,&scrInfo,TRUE); 361 SetFocus(m_BarHandle); // Bildlaufleiste fokussieren 362 } 363 //----------------------------------------------------------------------------- 364 365 void TAngleCtlDlg::OnSetAngleZero ( void ) 366 { 367 if ( !m_lnkAngleCtl->SetRelativeZero(m_Selected) ) 368 return; 369 370 CtrlSetEnabled(cm_CancelRelativeZero, m_lnkAngleCtl->CanResetRelativeZero(m_Selected)); // Schaltfläche "Relative Null aufheben" gdw. freigeben, wenn Relative Null gesetzt 371 OnSuperviseMove(); 372 SetFocus(m_BarHandle); // Bildlaufleiste fokussieren 373 } 374 //----------------------------------------------------------------------------- 375 376 void TAngleCtlDlg::OnCancelRelativeZero ( void ) 377 { 378 if ( !m_lnkAngleCtl->ResetRelativeZero(m_Selected) ) 379 return; 380 381 OnMeasureStops(); 382 SetFocus(m_BarHandle); // Bildlaufleiste fokussieren 383 }; 384 //----------------------------------------------------------------------------- 385 386 void TAngleCtlDlg::OnStartMeasureHWB ( void ) 387 { 388 if ( !m_lnkAngleCtl->DoStartMeasure(GetHandle()) ) 389 return; 390 391 OnMeasureStarts(); 392 } 393 //----------------------------------------------------------------------------- 394 395 void TAngleCtlDlg::OnStopMeasureHWB ( void ) 396 { 397 if ( !m_lnkAngleCtl->DoStopMeasure(m_Selected) ) 398 return; 399 400 OnMeasureStops(); 401 return; 402 } 403 //----------------------------------------------------------------------------- 404 405 void TAngleCtlDlg::OnSteeringReady ( void ) 406 { 407 if ( !m_lnkAngleCtl->MeasureStopped(m_Selected) ) 408 return; 409 410 OnMeasureStops(); 411 MessageBeep(0); 412 } 413 //----------------------------------------------------------------------------- 414 415 void TAngleCtlDlg::OnCounterSet ( void ) 416 { 417 m_lnkAngleCtl->UpdateDetector(); 418 } 419 //----------------------------------------------------------------------------- 420 421 void TAngleCtlDlg::OnStepMode ( void ) 422 { 423 BOOL bValid; 424 if ( m_lnkAngleCtl->IsMoving(m_Selected, bValid) ) 425 { // solange Antrieb in Bewegung: nichts machen 426 CtrlSetChecked(id_StepMode, m_StepMode[m_Selected]); 427 CtrlSetChecked(id_LongMoveMode, !m_StepMode[m_Selected]); 428 return; 429 } 430 431 if ( !m_StepMode[m_Selected] ) 432 { // wenn noch nicht in Schrittbetrieb 433 m_StepMode[m_Selected]= TRUE; // Flag setzen 434 OnMotorInit(); 435 SetFocus(m_BarHandle); 436 // Schrittbetrieb war schon ausgewählt 437 } 438 else 439 CtrlSetFocus(id_AngleWidth); // Eingabefeld Schrittbetrieb fokussieren 440 } 441 //----------------------------------------------------------------------------- 442 443 void TAngleCtlDlg::OnLongMoveMode ( void ) 444 { 445 BOOL bValid; 446 if ( m_lnkAngleCtl->IsMoving(m_Selected, bValid) ) 447 { // solange Antrieb in Bewegung: nichts machen 448 CtrlSetChecked(id_StepMode, m_StepMode[m_Selected]); 449 CtrlSetChecked(id_LongMoveMode, !m_StepMode[m_Selected]); 450 return; 451 } 452 453 if ( m_StepMode[m_Selected] ) 454 { 455 m_StepMode[m_Selected]= FALSE; // Flag setzen 456 OnMotorInit(); 457 SetFocus(m_BarHandle); 458 // Fahrbetrieb war schon ausgewählt 459 } 460 else 461 CtrlSetFocus(id_SpeedValue); 462 } 463 //----------------------------------------------------------------------------- 464 465 void TAngleCtlDlg::OnChooseMotor ( const int aIdx ) 466 { 467 BOOL bValid; 468 if ( m_lnkAngleCtl->IsMeasuring() ) 469 { // zuvor gewähten Antrieb wieder im Kombinationsfeld auswählen 470 CtrlSetSelString(id_ChooseMotor, m_lnkAngleCtl->GetMotorName(m_Selected, bValid)); 471 return; 472 } 473 474 m_Selected= aIdx; 475 OnParamSet(); 476 OnMotorInit(); 477 m_lnkTimer->StartTimer(); //ggf. befindet sich der angegebene Antrieb noch in Bewegung 478 } 479 //----------------------------------------------------------------------------- 480 481 void TAngleCtlDlg::OnChooseMotor( const EAxisType aAxis ) 482 { 483 int temp= m_lnkAngleCtl->GetMotorIdx(aAxis); 484 if ( (temp == -1) || (m_lnkAngleCtl->IsMeasuring()) ) 485 return; 486 487 OnChooseMotor(temp); 488 } 489 //----------------------------------------------------------------------------- 490 491 void TAngleCtlDlg::OnIDOK ( void ) 492 { 493 if ( CtrlHasFocus(id_NewAngle) ) 494 { // zuletzt war Eingabefeld "neuer Winkel: " fokussiert 495 OnNewAngleEntered( TRUE ); 496 } 497 else if ( CtrlHasFocus(id_AngleWidth) ) 498 { // zuletzt war Eingabefeld "Schrittweire" fokussiert 499 OnAngleWidthEntered( TRUE ); 500 } 501 else if ( CtrlHasFocus(id_SpeedValue) ) 502 { // zuletzt war Eingabefeld "Geschwindigkeit" fokussiert 503 OnSpeedEntered( TRUE ); 504 }; 505 } 506 //----------------------------------------------------------------------------- 507 508 void TAngleCtlDlg::OnScrollbarLine ( const BOOL aUp ) 509 { 510 if ( m_StepMode[m_Selected] ) 511 { // Schrittbetrieb 512 if ( !m_lnkAngleCtl->DoStep( m_Selected, aUp ) ) 513 return; 514 } 515 else 516 { // Fahrbetrieb durch Bewegung zur Extremposition emulieren 517 if ( !m_lnkAngleCtl->DoDrive( m_Selected, aUp ) ) 518 return; 519 } 520 OnMotionStarts(); 521 } 522 //----------------------------------------------------------------------------- 523 524 void TAngleCtlDlg::OnScrollbarEndscroll ( void ) 525 { 526 if ( !m_StepMode[m_Selected] ) 527 m_lnkAngleCtl->DoStop(m_Selected); // nur wenn im Fahrbetrieb 528 } 529 //----------------------------------------------------------------------------- 530 531 void TAngleCtlDlg::OnInterrupt ( void ) 532 { 533 m_lnkAngleCtl->DoStop(m_Selected); 534 } 535 //----------------------------------------------------------------------------- 536 537 void TAngleCtlDlg::OnLeave ( void ) 538 { // Detektormessung und Antriebe stoppen 539 m_lnkTimer->StopTimer(); 540 m_lnkAngleCtl->DoStopEverything(m_Selected); 541 } 542 543 //***************************************************************************** 544 // Methoden zur Positionsumrechnung Scrollbar <-> Antriebsposition 545 //***************************************************************************** 546 547 double TAngleCtlDlg::GetBarScale ( void ) const 548 { 549 BOOL bValid; 550 double angleMin= m_lnkAngleCtl->GetAngleMin( m_Selected, bValid ); 551 double angleMax= m_lnkAngleCtl->GetAngleMax( m_Selected, bValid ); 552 double diff= angleMax - angleMin; 553 try 554 { 555 return 32000 / diff; 556 } 557 catch (...) 558 { 559 return 0; // sonst div 0 560 } 561 } 562 563 int TAngleCtlDlg::GetBarEgde ( BOOL aLeft ) const 564 { 565 if ( !aLeft ) 566 { 567 BOOL bValid; 568 double angleMin= m_lnkAngleCtl->GetAngleMin( m_Selected, bValid ); 569 double angleMax= m_lnkAngleCtl->GetAngleMax( m_Selected, bValid ); 570 return (int) ( (angleMax-angleMin)*GetBarScale() ); 571 } 572 else 573 return 0; 574 }; 575 //----------------------------------------------------------------------------- 576 577 int TAngleCtlDlg::GetBarPos ( void ) const 578 { 579 BOOL bValid; 580 double angle= m_lnkAngleCtl->GetAngle( m_Selected, bValid ); 581 double angleMin= m_lnkAngleCtl->GetAngleMin( m_Selected, bValid ); 582 return (int) ( (angle-angleMin)*GetBarScale()); 583 }; 584 585 //***************************************************************************** 586 // Methoden zur Positionsumrechnung Scrollbar <-> Antriebsposition 587 //***************************************************************************** 588 589 void TAngleCtlDlg::OnMotionStarts ( void ) 590 { 591 SetDefaultCursor( IDC_WAIT ); 592 m_lnkTimer->StartTimer(); 593 } 594 //----------------------------------------------------------------------------- 595 596 void TAngleCtlDlg::OnMotionProgress ( void ) 597 { 598 599 SCROLLINFO scrInfo; 600 scrInfo.cbSize= sizeof(SCROLLINFO); 601 scrInfo.fMask= SIF_POS; 602 603 BOOL bValid; 604 UINT iDigits= m_lnkAngleCtl->GetDigits(m_Selected, bValid); 605 double dDistance= m_lnkAngleCtl->GetAngle(m_Selected, bValid); 606 if ( !bValid ) 607 { // Antriebsposition konnte nicht ermittelt werden 608 SetDefaultCursor( IDC_WAIT ); 609 return; 610 } 611 CtrlSetDouble(id_Angle, dDistance, iDigits, _DECIMAL); 612 scrInfo.nPos= GetBarPos(); 613 SetScrollInfo(m_BarHandle,SB_CTL,&scrInfo,TRUE); 614 } 615 //----------------------------------------------------------------------------- 616 617 void TAngleCtlDlg::OnMotionStops ( void ) 618 { 619 SCROLLINFO scrInfo; 620 scrInfo.cbSize= sizeof(SCROLLINFO); 621 scrInfo.fMask= SIF_POS; 622 623 BOOL bValid; 624 UINT iDigits= m_lnkAngleCtl->GetDigits(m_Selected, bValid); 625 double dDistance= m_lnkAngleCtl->GetAngle(m_Selected, bValid); 626 CtrlSetDouble(id_NewAngle, dDistance, iDigits, _DECIMAL); 627 CtrlSetDouble(id_Angle, dDistance, iDigits, _DECIMAL); 628 scrInfo.nPos= GetBarPos(); 629 SetScrollInfo(m_BarHandle,SB_CTL,&scrInfo,TRUE); 630 SetDefaultCursor( IDC_ARROW ); 631 632 } 633 //----------------------------------------------------------------------------- 634 635 void TAngleCtlDlg::OnMeasureStarts ( void ) 636 { 637 CtrlSetText(cm_MeasureHWB, szMsgLine501); 638 CtrlSetEnabled(cm_SetAngleZero, m_lnkAngleCtl->CanSetOffset(m_Selected)); 639 CtrlSetEnabled(cm_CancelRelativeZero, m_lnkAngleCtl->CanResetRelativeZero(m_Selected)); // Schaltfläche "Relative Null aufheben" gdw. freigeben, wenn Relative Null gesetzt 640 } 641 //----------------------------------------------------------------------------- 642 643 void TAngleCtlDlg::OnMeasureStops ( void ) 644 { 645 OnMotorInit(); 646 OnParamSet(); 647 OnSuperviseMove(); 648 if ( !m_lnkAngleCtl->IsMeasureReset() ) 649 { // Makroverarbeitung und Messung erfolgreich beendet 650 double hwb= m_lnkAngleCtl->GetMeasureHwb(); 651 char buf[MaxString]; 652 sprintf(buf, szMsgLine500, hwb); 653 SetInfo(buf); 654 } 655 CtrlSetText(cm_MeasureHWB, szMsgLine502); 656 CtrlSetEnabled(cm_SetAngleZero, m_lnkAngleCtl->CanSetOffset(m_Selected)); 657 CtrlSetEnabled(cm_CancelRelativeZero, m_lnkAngleCtl->CanResetRelativeZero(m_Selected)); // Schaltfläche "Relative Null aufheben" gdw. freigeben, wenn Relative Null gesetzt 658 OnSuperviseMove(); 659 } 660 661 //############################################################################# 662 // LastLine 663 //############################################################################# 664