home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / signals / ts / sigctrl.mod < prev    next >
Encoding:
Text File  |  1993-01-19  |  6.6 KB  |  238 lines

  1. (* # project( "#pragma link( iodll.dll)") *)
  2.  
  3. MODULE SigCtrl;
  4.  
  5. (*
  6.         Test- und Kontrollprogramm für das Modul PortSig.
  7. *)
  8.  
  9. IMPORT Win,Dos,Gpi;
  10. IMPORT Str,Lib;
  11. FROM OS2DEF IMPORT HAB,HWND,LSET,HMODULE,NULL,BOOL,HPS,RECTL,POINTL,NullVar,LPSTR;
  12. FROM Macro0 IMPORT SHORT1FROMMP,MPFROMSHORT;
  13. IMPORT MainWin0;
  14. FROM PortSig  IMPORT PortFLAG,PortSIGNAL,
  15.                      SignalInit,SignalDone,SendSignalTo,SignalIsSet;
  16.  
  17.  
  18. VAR     cxChar,cyChar  : INTEGER;
  19.         sig            : PortSIGNAL;
  20.         SigPortAdr     : CARDINAL;
  21.  
  22. PROCEDURE Resize( hwndFrame : HWND);
  23. VAR r : RECTL;
  24.     ok  : BOOLEAN;
  25. BEGIN
  26.   WITH r DO
  27.     xLeft   := LONGINT( 2 * cxChar);
  28.     yBottom := LONGINT( 1 * cyChar);
  29.     xRight  := LONGINT( 32 * cxChar);
  30.     yTop    := LONGINT( 19 * cyChar);
  31.   END;
  32.   ok := Win.CalcFrameRect( hwndFrame, r, B_FALSE);
  33.   ok := Win.SetWindowPos( hwndFrame,
  34.                           NULL,
  35.                           INTEGER( r.xLeft),
  36.                           INTEGER( r.yBottom),
  37.                           INTEGER( r.xRight - r.xLeft),
  38.                           INTEGER( r.yTop - r.yBottom),
  39.                           Win.SWP_SIZE + Win.SWP_MOVE);
  40. END Resize;
  41.  
  42.  
  43. PROCEDURE Error( title, text : ARRAY OF CHAR);
  44. VAR
  45.   mbid   : Win.MBID;
  46.   win    : HWND;
  47. BEGIN
  48.   win := Win.QueryActiveWindow( Win.HWND_DESKTOP, B_FALSE);
  49.   mbid := Win.MessageBox( Win.HWND_DESKTOP, win,
  50.                           text, title,
  51.                           40, Win.MB_ENTER);
  52. END Error;
  53.  
  54.  
  55.  
  56. TYPE    StrP = POINTER TO ARRAY [0..255] OF CHAR;
  57.         GT   = ARRAY [0..1] OF StrP;
  58.         CT   = ARRAY [0..15] OF StrP;
  59.         TT   = ARRAY [0..8] OF StrP;
  60.  
  61.  
  62. CONST   szGroupText    = "Signal to";
  63.         szTypeText     = TT(
  64.           ADR("P0"), ADR("P1"), ADR("P2"), ADR("P3"),
  65.           ADR("P4"), ADR("P5"), ADR("P6"), ADR("P7"), ADR("   update")
  66.         );
  67.  
  68.  
  69. VAR     hwndGroup       : HWND;
  70.         hwndRadioType   : ARRAY [0..8] OF HWND;
  71.         sCurrentType    : INTEGER;
  72.  
  73.  
  74. TYPE
  75.         ButtonSTATE     = CARDINAL;
  76. CONST
  77.         AUS     = ButtonSTATE( 0);
  78.         EIN     = ButtonSTATE( 1);
  79.  
  80.  
  81. PROCEDURE SetRadioButton( idx : CARDINAL; state : ButtonSTATE);
  82. VAR r : Win.MRESULT;
  83. BEGIN
  84.   r := Win.SendMsg( hwndRadioType[idx],
  85.                     Win.BM_SETCHECK,
  86.                     MPFROMSHORT( state),
  87.                     Win.MPARAM( NIL));
  88. END SetRadioButton;
  89.  
  90.  
  91. PROCEDURE Update;
  92. VAR  v : CARDINAL;
  93. BEGIN
  94.   FOR v := 0 TO 7 DO
  95.     IF SignalIsSet( sig, PortFLAG( v)) THEN
  96.       SetRadioButton( v, EIN);
  97.     ELSE
  98.       SetRadioButton( v, AUS);
  99.     END;
  100.   END;
  101.   SetRadioButton( 8, AUS);
  102. END Update;
  103.  
  104.  
  105. (*# save,
  106.     call(near_call=>off, reg_param=>(), reg_saved=>(di,si,ds,es,st1,st2)) *)
  107. PROCEDURE ClientWndProc( hwnd   : HWND;
  108.                           msg    : CARDINAL;
  109.                           mp1,
  110.                           mp2    : Win.MPARAM) : Win.MRESULT;
  111.  
  112. VAR fm : Gpi.FONTMETRICS;
  113.     hps : HPS;
  114.     xp,s,id : INTEGER;
  115.     rcl : RECTL;
  116.  
  117.     r : Win.MRESULT;
  118.     r1  : RECTL;
  119.     p1 : Gpi.GPIRET;
  120.  
  121. BEGIN
  122.   CASE msg OF
  123.  
  124.   | Win.WM_CREATE :
  125.     sCurrentType := 6;  (* solid   *)
  126.  
  127.     hps := Win.GetPS( hwnd);
  128.     Gpi.QueryFontMetrics( hps, LONGINT( SIZE( fm)), fm);
  129.     cxChar := INTEGER( fm.AveCharWidth);
  130.     cyChar := INTEGER( fm.MaxBaselineExt);
  131.     Win.ReleasePS( hps);
  132.  
  133.     hwndGroup := Win.CreateWindow( hwnd,
  134.                                         LPSTR( Win.WC_STATIC)^,
  135.                                         szGroupText,
  136.                                         Win.WS_VISIBLE + Win.SS_GROUPBOX,
  137.                                         2 * cxChar,
  138.                                         1(*4*) * cyChar,
  139.                                         26 * cxChar,
  140.                                         16 * cyChar,
  141.                                         hwnd,
  142.                                         Win.HWND_TOP,  (* placement *)
  143.                                         25,        (* id *)
  144.                                         NIL,
  145.                                         NIL);
  146.  
  147.     FOR s := 0 TO 8 DO
  148.       hwndRadioType[s] := Win.CreateWindow( hwnd,
  149.                                             LPSTR( Win.WC_BUTTON)^,
  150.                                             szTypeText[s]^,
  151.                                             Win.WS_VISIBLE + Win.BS_RADIOBUTTON,
  152.                                             4 * cxChar,
  153.                                             (28(*31*) - 3 * s) * cyChar DIV 2,
  154.                                             22 * cxChar,
  155.                                             3 * cyChar DIV 2,
  156.                                             hwnd,
  157.                                             Win.HWND_BOTTOM,  (* placement *)
  158.                                             s + 16,           (* id *)
  159.                                             NIL,
  160.                                             NIL);
  161.     END;
  162.  
  163.     Update;
  164.     RETURN 0;
  165.  
  166.   | Win.WM_CONTROL :
  167.     id := SHORT1FROMMP( mp1);
  168.     IF id < 16 THEN
  169.       Update;
  170.     ELSIF id < 25 THEN          (* Type  *)
  171.       sCurrentType := id - 16;
  172.       IF id = 24 THEN (* update *)
  173.         SetRadioButton( sCurrentType, EIN);
  174.       END;
  175.       SendSignalTo( sig, PortFLAG( sCurrentType));
  176.       Update;
  177.     END;
  178.     Win.InvalidateRect( hwnd, RECTL( NullVar), B_FALSE);
  179.     RETURN 0;
  180.  
  181.   | Win.WM_ERASEBACKGROUND :
  182.     RETURN 1;
  183.   END;
  184.   RETURN Win.DefWindowProc( hwnd, msg, mp1, mp2);
  185. END ClientWndProc;
  186. (*# restore *)
  187.  
  188. (*# save,
  189.     call(near_call=>off, reg_param=>(), reg_saved=>(di,si,ds,es,st1,st2)) *)
  190. PROCEDURE ErrWndProc( hwnd   : HWND;
  191.                       msg    : CARDINAL;
  192.                       mp1,
  193.                       mp2    : Win.MPARAM) : Win.MRESULT;
  194. BEGIN
  195.   CASE msg OF
  196.  
  197.   | Win.WM_CREATE :
  198.     Error("AUFRUF-Fehler", "AUFRUF: SIGCTRL Portadr (Portadr = 2F8 o. 3F8)");
  199.     RETURN 0;
  200.  
  201.   | Win.WM_ERASEBACKGROUND :
  202.     RETURN 1;
  203.   END;
  204.   RETURN Win.DefWindowProc( hwnd, msg, mp1, mp2);
  205. END ErrWndProc;
  206. (*# restore *)
  207.  
  208.  
  209. PROCEDURE ParamOk() : BOOLEAN;
  210. VAR para : ARRAY [0..127] OF CHAR;
  211.     ok   : BOOLEAN;
  212.     v    : LONGCARD;
  213. BEGIN
  214.   Lib.ParamStr( para, 1);
  215.   v := Str.StrToCard( para, 16, ok);
  216.   ok := ok AND (v > 100H) AND (v < 3FFH);
  217.   IF ok AND ((v = 2F8H) OR (v = 3F8H)) THEN
  218.     SigPortAdr := CARDINAL( v) + 3;
  219.   ELSE
  220.     SigPortAdr := 2F8H + 3;
  221.   END;
  222.   RETURN ok;
  223. END ParamOk;
  224.  
  225.  
  226. BEGIN
  227.   IF NOT ((Lib.ParamCount() = 1) AND ParamOk()) THEN
  228.     MainWin0.Create( ErrWndProc);
  229.     HALT;
  230.   END;
  231.  
  232.   sig := SignalInit( SigPortAdr, f_P0);
  233.   MainWin0.Create( ClientWndProc);
  234.   Resize( MainWin0.hwndFrame);
  235.   MainWin0.WorkLoop;
  236.   SignalDone( sig);
  237. END SigCtrl.
  238.