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";
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