packages feed

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.