language-Modula2-0.1: examples/Modula-2_Libraries/PMOS/sources/tests/serialte.mod
MODULE SerialTest;
(********************************************************)
(* *)
(* Test of Serial I/O *)
(* *)
(* Programmer: P. Moylan *)
(* Last edited: 16 February 1994 *)
(* Status: Seems to be working. *)
(* Not fully tested. *)
(* *)
(********************************************************)
FROM TaskControl IMPORT
(* proc *) CreateTask;
FROM Semaphores IMPORT
(* type *) Semaphore,
(* proc *) CreateSemaphore, Wait, Signal;
FROM SerialIO IMPORT
(* type *) Parity,
(* proc *) InitSerialChannel, ReadSerial, WriteSerial;
FROM Windows IMPORT
(* type *) Window, Colour, FrameType, DividerType,
(* proc *) OpenWindow, ChangeScrollingRegion, CloseWindow,
WriteString, ReadChar, Write;
(************************************************************************)
VAR TaskDone: Semaphore;
(************************************************************************)
PROCEDURE COM1OutputTask;
CONST Esc = CHR(27);
VAR w1: Window; ch: CHAR;
BEGIN
OpenWindow (w1, blue, cyan, 8, 15, 0, 39, simpleframe, doubledivider);
WriteString (w1, "Output to COM1");
ChangeScrollingRegion (w1, 3, 6);
LOOP
ReadChar (w1, ch);
IF ch = Esc THEN EXIT(*LOOP*) END(*IF*);
WriteSerial (1, ch);
END (*LOOP*);
CloseWindow (w1);
Signal (TaskDone);
END COM1OutputTask;
(************************************************************************)
PROCEDURE COM2OutputTask;
CONST Esc = CHR(27);
VAR w1: Window; ch: CHAR;
BEGIN
OpenWindow (w1, white, magenta, 8, 15, 40, 79, simpleframe, doubledivider);
WriteString (w1, "Output to COM2");
ChangeScrollingRegion (w1, 3, 6);
LOOP
ReadChar (w1, ch);
IF ch = Esc THEN EXIT(*LOOP*) END(*IF*);
WriteSerial (2, ch);
END (*LOOP*);
CloseWindow (w1);
Signal (TaskDone);
END COM2OutputTask;
(************************************************************************)
PROCEDURE COM1InputTask;
VAR w2: Window; ch: CHAR;
BEGIN
OpenWindow (w2, white, magenta, 0, 7, 0, 39, simpleframe, doubledivider);
WriteString (w2, "Input from COM1");
ChangeScrollingRegion (w2, 3, 6);
LOOP
ReadSerial (1, ch);
Write (w2, ch);
END (*LOOP*);
END COM1InputTask;
(************************************************************************)
PROCEDURE COM2InputTask;
VAR w2: Window; ch: CHAR;
BEGIN
OpenWindow (w2, blue, cyan, 0, 7, 40, 79, simpleframe, doubledivider);
WriteString (w2, "Input from COM2");
ChangeScrollingRegion (w2, 3, 6);
LOOP
ReadSerial (2, ch);
Write (w2, ch);
END (*LOOP*);
END COM2InputTask;
(************************************************************************)
PROCEDURE RunTheTest;
BEGIN
CreateTask (COM1OutputTask, 1, "COM1 output");
CreateTask (COM1InputTask, 1, "COM1 input");
CreateTask (COM2OutputTask, 1, "COM2 output");
CreateTask (COM2InputTask, 1, "COM2 input");
Wait (TaskDone); Wait (TaskDone);
END RunTheTest;
(************************************************************************)
(* MAIN PROGRAM *)
(************************************************************************)
BEGIN
(* The following parameters seem to be appropriate for the mouse. *)
InitSerialChannel (1, 9600, 8, NoParity, 1);
InitSerialChannel (2, 2400, 8, OddParity, 2);
CreateSemaphore (TaskDone, 0);
RunTheTest;
END SerialTest.