home *** CD-ROM | disk | FTP | other *** search
- (* # project( "#pragma link( iodll.dll)") *)
-
- MODULE SigCtrl;
-
- (*
- Test- und Kontrollprogramm für das Modul PortSig.
- *)
-
- IMPORT Win,Dos,Gpi;
- IMPORT Str,Lib;
- FROM OS2DEF IMPORT HAB,HWND,LSET,HMODULE,NULL,BOOL,HPS,RECTL,POINTL,NullVar,LPSTR;
- FROM Macro0 IMPORT SHORT1FROMMP,MPFROMSHORT;
- IMPORT MainWin0;
- FROM PortSig IMPORT PortFLAG,PortSIGNAL,
- SignalInit,SignalDone,SendSignalTo,SignalIsSet;
-
-
- VAR cxChar,cyChar : INTEGER;
- sig : PortSIGNAL;
- SigPortAdr : CARDINAL;
-
- PROCEDURE Resize( hwndFrame : HWND);
- VAR r : RECTL;
- ok : BOOLEAN;
- BEGIN
- WITH r DO
- xLeft := LONGINT( 2 * cxChar);
- yBottom := LONGINT( 1 * cyChar);
- xRight := LONGINT( 32 * cxChar);
- yTop := LONGINT( 19 * cyChar);
- END;
- ok := Win.CalcFrameRect( hwndFrame, r, B_FALSE);
- ok := Win.SetWindowPos( hwndFrame,
- NULL,
- INTEGER( r.xLeft),
- INTEGER( r.yBottom),
- INTEGER( r.xRight - r.xLeft),
- INTEGER( r.yTop - r.yBottom),
- Win.SWP_SIZE + Win.SWP_MOVE);
- END Resize;
-
-
- PROCEDURE Error( title, text : ARRAY OF CHAR);
- VAR
- mbid : Win.MBID;
- win : HWND;
- BEGIN
- win := Win.QueryActiveWindow( Win.HWND_DESKTOP, B_FALSE);
- mbid := Win.MessageBox( Win.HWND_DESKTOP, win,
- text, title,
- 40, Win.MB_ENTER);
- END Error;
-
-
-
- TYPE StrP = POINTER TO ARRAY [0..255] OF CHAR;
- GT = ARRAY [0..1] OF StrP;
- CT = ARRAY [0..15] OF StrP;
- TT = ARRAY [0..8] OF StrP;
-
-
- CONST szGroupText = "Signal to";
- szTypeText = TT(
- ADR("P0"), ADR("P1"), ADR("P2"), ADR("P3"),
- ADR("P4"), ADR("P5"), ADR("P6"), ADR("P7"), ADR(" update")
- );
-
-
- VAR hwndGroup : HWND;
- hwndRadioType : ARRAY [0..8] OF HWND;
- sCurrentType : INTEGER;
-
-
- TYPE
- ButtonSTATE = CARDINAL;
- CONST
- AUS = ButtonSTATE( 0);
- EIN = ButtonSTATE( 1);
-
-
- PROCEDURE SetRadioButton( idx : CARDINAL; state : ButtonSTATE);
- VAR r : Win.MRESULT;
- BEGIN
- r := Win.SendMsg( hwndRadioType[idx],
- Win.BM_SETCHECK,
- MPFROMSHORT( state),
- Win.MPARAM( NIL));
- END SetRadioButton;
-
-
- PROCEDURE Update;
- VAR v : CARDINAL;
- BEGIN
- FOR v := 0 TO 7 DO
- IF SignalIsSet( sig, PortFLAG( v)) THEN
- SetRadioButton( v, EIN);
- ELSE
- SetRadioButton( v, AUS);
- END;
- END;
- SetRadioButton( 8, AUS);
- END Update;
-
-
- (*# save,
- call(near_call=>off, reg_param=>(), reg_saved=>(di,si,ds,es,st1,st2)) *)
- PROCEDURE ClientWndProc( hwnd : HWND;
- msg : CARDINAL;
- mp1,
- mp2 : Win.MPARAM) : Win.MRESULT;
-
- VAR fm : Gpi.FONTMETRICS;
- hps : HPS;
- xp,s,id : INTEGER;
- rcl : RECTL;
-
- r : Win.MRESULT;
- r1 : RECTL;
- p1 : Gpi.GPIRET;
-
- BEGIN
- CASE msg OF
-
- | Win.WM_CREATE :
- sCurrentType := 6; (* solid *)
-
- hps := Win.GetPS( hwnd);
- Gpi.QueryFontMetrics( hps, LONGINT( SIZE( fm)), fm);
- cxChar := INTEGER( fm.AveCharWidth);
- cyChar := INTEGER( fm.MaxBaselineExt);
- Win.ReleasePS( hps);
-
- hwndGroup := Win.CreateWindow( hwnd,
- LPSTR( Win.WC_STATIC)^,
- szGroupText,
- Win.WS_VISIBLE + Win.SS_GROUPBOX,
- 2 * cxChar,
- 1(*4*) * cyChar,
- 26 * cxChar,
- 16 * cyChar,
- hwnd,
- Win.HWND_TOP, (* placement *)
- 25, (* id *)
- NIL,
- NIL);
-
- FOR s := 0 TO 8 DO
- hwndRadioType[s] := Win.CreateWindow( hwnd,
- LPSTR( Win.WC_BUTTON)^,
- szTypeText[s]^,
- Win.WS_VISIBLE + Win.BS_RADIOBUTTON,
- 4 * cxChar,
- (28(*31*) - 3 * s) * cyChar DIV 2,
- 22 * cxChar,
- 3 * cyChar DIV 2,
- hwnd,
- Win.HWND_BOTTOM, (* placement *)
- s + 16, (* id *)
- NIL,
- NIL);
- END;
-
- Update;
- RETURN 0;
-
- | Win.WM_CONTROL :
- id := SHORT1FROMMP( mp1);
- IF id < 16 THEN
- Update;
- ELSIF id < 25 THEN (* Type *)
- sCurrentType := id - 16;
- IF id = 24 THEN (* update *)
- SetRadioButton( sCurrentType, EIN);
- END;
- SendSignalTo( sig, PortFLAG( sCurrentType));
- Update;
- END;
- Win.InvalidateRect( hwnd, RECTL( NullVar), B_FALSE);
- RETURN 0;
-
- | Win.WM_ERASEBACKGROUND :
- RETURN 1;
- END;
- RETURN Win.DefWindowProc( hwnd, msg, mp1, mp2);
- END ClientWndProc;
- (*# restore *)
-
- (*# save,
- call(near_call=>off, reg_param=>(), reg_saved=>(di,si,ds,es,st1,st2)) *)
- PROCEDURE ErrWndProc( hwnd : HWND;
- msg : CARDINAL;
- mp1,
- mp2 : Win.MPARAM) : Win.MRESULT;
- BEGIN
- CASE msg OF
-
- | Win.WM_CREATE :
- Error("AUFRUF-Fehler", "AUFRUF: SIGCTRL Portadr (Portadr = 2F8 o. 3F8)");
- RETURN 0;
-
- | Win.WM_ERASEBACKGROUND :
- RETURN 1;
- END;
- RETURN Win.DefWindowProc( hwnd, msg, mp1, mp2);
- END ErrWndProc;
- (*# restore *)
-
-
- PROCEDURE ParamOk() : BOOLEAN;
- VAR para : ARRAY [0..127] OF CHAR;
- ok : BOOLEAN;
- v : LONGCARD;
- BEGIN
- Lib.ParamStr( para, 1);
- v := Str.StrToCard( para, 16, ok);
- ok := ok AND (v > 100H) AND (v < 3FFH);
- IF ok AND ((v = 2F8H) OR (v = 3F8H)) THEN
- SigPortAdr := CARDINAL( v) + 3;
- ELSE
- SigPortAdr := 2F8H + 3;
- END;
- RETURN ok;
- END ParamOk;
-
-
- BEGIN
- IF NOT ((Lib.ParamCount() = 1) AND ParamOk()) THEN
- MainWin0.Create( ErrWndProc);
- HALT;
- END;
-
- sig := SignalInit( SigPortAdr, f_P0);
- MainWin0.Create( ClientWndProc);
- Resize( MainWin0.hwndFrame);
- MainWin0.WorkLoop;
- SignalDone( sig);
- END SigCtrl.