Parino control with VGAlib3

In the Parino section (you can find it via the main menu) are some programs that will control the Parino I/O card in text based windows. This is an attempt to make the Parino controllable via a real GUI: mouse only. The source is short and simple. See it as an example of how to use VGAlib3 functions.

Parino3: the source

MODULE Parino;

IMPORT  ASCII;

FROM    barith      IMPORT  MulDiv;
FROM    FileSystem  IMPORT  File, Lookup, Response, Close, ReadChar, WriteChar;
FROM    InOut       IMPORT  WriteString, WriteCard;
FROM    Keyboard    IMPORT  KeyPressed, GetKey;
FROM    Mouse       IMPORT  ShowMouse, MouseRecord, GetMouseStatus, InitMouse, SetMouseCursor, HideMouse,
                            ConfineMouse;
FROM    VgaLib3     IMPORT  WinData, COLOUR, SetVGA, ChrWid, Center, SetColour, MakeBox, EraseBox,
                            FillBox, PlotChar, WriteNumber, DrawH, PlotText;
FROM    SYSTEM      IMPORT  ADDRESS, ASSEMBLER;
FROM    System      IMPORT  GetArg;


VAR MainScreen, TopWin, BotLin, TopLin, MousWin                 : WinData;

    Inimini                     : MouseRecord;
    Number, StopCondition,
    OldMode                     : CARDINAL;
    Relays                      : ARRAY [1..12] OF BOOLEAN;
    Sensors                     : ARRAY  [1..5] OF BOOLEAN;
    RelayNames                  : ARRAY [0..24] OF CHAR;
    LptPort                     : CHAR;


PROCEDURE KeyW8 () : CHAR;             (* Wait for keypress    *)

VAR k   : CHAR;

BEGIN
    LOOP
        IF KeyPressed () THEN
            GetKey (k);
            RETURN k
        END
    END
END KeyW8;


PROCEDURE InitWins;

BEGIN
(*  MainScreen is a dummy for the all around framework.     *)

    MainScreen.TopX   :=   0;       MainScreen.TopY   :=   0;
    MainScreen.Width  := 640;       MainScreen.Height := 480;
    MainScreen.CurX   :=   0;       MainScreen.CurY   :=   0;
    MainScreen.DeltaX :=   0;       MainScreen.DeltaY :=   0;
    MainScreen.Indent :=   5;
    MainScreen.TexCol := GREEN;     MainScreen.BoxCol := YELLOW;
    MainScreen.BckCol := black;     MainScreen.MnuCol :=    red;

(*  TopLin describes the upper status bar for action keys.  *)

    TopLin.TopX     :=  60;         TopLin.TopY     :=  20;
    TopLin.Width    := 550;         TopLin.Height   :=  60;
    TopLin.CurX     :=   0;         TopLin.CurY     :=   0;
    TopLin.DeltaX   :=   0;         TopLin.DeltaY   :=   0;
    TopLin.Indent   :=   4;
    TopLin.TexCol   := RED;         TopLin.BoxCol   := green;
    TopLin.BckCol   := pink;        TopLin.MnuCol   :=   RED;

(*  MousWin describes the window for the mouse coordinates  *)

    MousWin.TopX    :=  10;         MousWin.TopY    :=  10;
    MousWin.Width   :=  50;         MousWin.Height  :=  60;
    MousWin.CurX    :=   0;         MousWin.CurY    :=   0;
    MousWin.DeltaX  :=   0;         MousWin.DeltaY  :=   0;
    MousWin.Indent  :=   4;
    MousWin.TexCol  :=  white;      MousWin.BoxCol  :=  white;
    MousWin.BckCol  :=   blue;      MousWin.MnuCol  := YELLOW;


(*  TopWin describes the uppermost window for the parameters.   *)

    TopWin.TopX     :=  10;         TopWin.TopY     :=  75;
    TopWin.Width    := 620;         TopWin.Height   := 375;
    TopWin.CurX     :=   0;         TopWin.CurY     :=   0;
    TopWin.DeltaX   :=   0;         TopWin.DeltaY   :=   0;
    TopWin.Indent   :=   4;
    TopWin.TexCol   := YELLOW;      TopWin.BoxCol   := cyan;
    TopWin.BckCol   :=  black;      TopWin.MnuCol   :=  red;

(*  BotLin describes the Copyright notice.                  *)

    BotLin.TopX     :=   5;         BotLin.TopY     := 460;
    BotLin.Width    := 620;         BotLin.Height   :=  20;
    BotLin.CurX     :=   0;         BotLin.CurY     :=   0;
    BotLin.DeltaX   :=   0;         BotLin.DeltaY   :=   0;
    BotLin.Indent   :=   4;
    BotLin.TexCol   := brown;       BotLin.BoxCol   := green;
    BotLin.BckCol   := black;       BotLin.MnuCol   := green;

END InitWins;


PROCEDURE FillScreen;

VAR Index       : CARDINAL;
    Token       : CHAR;

BEGIN
    SetColour (TopWin.TexCol, TopWin.BckCol);
    FOR Index := 1 TO 12 DO
        TopWin.CurX := 50;
        TopWin.CurY := 25 * Index + 5;
        PlotText (TopWin, "Relay ");
        IF Index < 9 THEN
            WriteNumber (TopWin, Index, 1);
        ELSE
            Token := CHR (Index + 56);
            PlotChar (TopWin, Token);
        END;
        PlotText (TopWin, " : ");
        IF Relays [Index] THEN
            PlotText (TopWin, "ON ");
        ELSE
            PlotText (TopWin, "OFF");
        END;
    END;
    FOR Index := 1 TO 5 DO
        TopWin.CurX := 400;
        TopWin.CurY := 25 * Index + 5;
        PlotText (TopWin, "Sensor ");
        Token := CHR (Index + 80);
        PlotChar (TopWin, Token);
        IF Sensors [Index] THEN
            PlotText (TopWin, " = ACTIVE ");
        ELSE
            PlotText (TopWin, " = PASSIVE");
        END;
    END;
END FillScreen;


PROCEDURE UpdateScreen;

VAR Index       : CARDINAL;
    Token       : CHAR;

BEGIN
    SetColour (TopWin.TexCol, TopWin.BckCol);
    FOR Index := 1 TO 12 DO
        TopWin.CurX := 140;
        TopWin.CurY := 25 * Index + 5;
        IF Relays [Index] THEN
            PlotText (TopWin, "ON ");
        ELSE
            PlotText (TopWin, "OFF");
        END;
    END;
    FOR Index := 1 TO 5 DO
        TopWin.CurX := 400;
        TopWin.CurY := 25 * Index + 5;
        IF Sensors [Index] THEN
            PlotText (TopWin, "ACTIVE ");
        ELSE
            PlotText (TopWin, "PASSIVE");
        END;
    END;
END UpdateScreen;


PROCEDURE SetUpScreen;

BEGIN
    OldMode := SetVGA (18);
    InitMouse (Inimini);
    InitWins;
        MakeBox (MainScreen);
        MakeBox (TopWin);
        MakeBox (MousWin);
    TopLin.CurX := 10;
    TopLin.CurY :=  0;
    Center (TopLin, "Parino_debugger Use_the_mouse");
    BotLin.CurX := 10;
    BotLin.CurY :=  0;
    Center (BotLin, "Copyleft_2003: Jan_Verhoeven NL-5012_GH_272 fruttenboel@tomaatnet.nl");
END SetUpScreen;


PROCEDURE SetUpMouse;

BEGIN
    ShowMouse;
    IF Inimini.Buttons = 2 THEN
        StopCondition := 3;
    ELSE
        StopCondition := 7;
    END;
    SetMouseCursor (30, 30);
END SetUpMouse;


PROCEDURE ShowMouseXY;                      (*  Show current mouse data on screen.      *)

BEGIN
    SetColour (MousWin.TexCol, MousWin.BckCol);
    MousWin.CurX := MousWin.Indent;
    MousWin.CurY := 4;
    WriteNumber (MousWin, Inimini.MouseX, 4);
    MousWin.CurX := MousWin.Indent;
    MousWin.CurY := 23;
    WriteNumber (MousWin, Inimini.MouseY, 4);
    MousWin.CurX := MousWin.Indent;
    MousWin.CurY := 42;
    WriteNumber (MousWin, Inimini.Status, 4);
END ShowMouseXY;


PROCEDURE FindClick (Inimini : MouseRecord) : CARDINAL;

BEGIN
    RETURN 1;
END FindClick;


PROCEDURE CheckSensors (VAR Array : ARRAY OF BOOLEAN);

VAR Index       : CARDINAL;
    Token       : CHAR;

BEGIN
    Token := 'P';
    REPEAT
        CASE Token OF
         'P' :  Array [1] := TRUE;  |
         'Q' :  Array [2] := TRUE;  |
         'R' :  Array [3] := TRUE;  |
         'S' :  Array [4] := TRUE;  |
         'T' :  Array [5] := TRUE;
        END;
    UNTIL Token = ASCII.EOL
END CheckSensors;


PROCEDURE CheckRelays (VAR Array : ARRAY OF BOOLEAN);

VAR Index       : CARDINAL;
    Token       : CHAR;

BEGIN
    Token := '1';
    REPEAT
        CASE Token OF
         '1' :  Array [0] := TRUE;  |
         '2' :  Array [1] := TRUE;  |
         '3' :  Array [2] := TRUE;  |
         '4' :  Array [3] := TRUE;  |
         '5' :  Array [4] := TRUE;  |
         '6' :  Array [5] := TRUE;  |
         '7' :  Array [6] := TRUE;  |
         '8' :  Array [7] := TRUE;  |
         '9' :  Array [8] := TRUE;  |
         'A' :  Array [9] := TRUE;  |
         'B' :  Array [10] := TRUE; |
         'C' :  Array [11] := TRUE; |
         '0' :  FOR Index := 0 TO 11 DO
                    Array [Index] := FALSE;
                END;
        END;
        INC (Token)
    UNTIL Token = ASCII.EOL
END CheckRelays;


PROCEDURE InitVars;

VAR Index       : CARDINAL;
    Option      : ARRAY [0..11] OF CHAR;

BEGIN
    RelayNames := '123456789ABC';
    GetArg (Option, Index);
    IF Index = 0 THEN
        LptPort := '1'
    ELSE
        LptPort := Option [0]
    END;
    FOR Index := 1 TO 12 DO
        Relays [Index] := FALSE
    END;
    FOR Index := 1 TO 5 DO
        Sensors [Index] := FALSE
    END;
    SetMouseCursor (200, 200)
END InitVars;


BEGIN
    SetUpScreen;
    SetUpMouse;
    InitVars;
    FillScreen;

    REPEAT
        GetMouseStatus (Inimini);
        ShowMouseXY;
        IF Inimini.Status > 0 THEN
            Number := FindClick (Inimini)
        END;
(*        CheckSensors (Sensors);
        CheckRelays (Relays);       *)
        UpdateScreen;
    UNTIL Inimini.Status = StopCondition;

    OldMode := SetVGA (OldMode);
END Parino.
   

Page created on 28 October 2006 and

Page equipped with FroogleBuster technology