
(* SerialSupport. Oberon-Modul zur Vereinfachung der Arbeit mit dem *)
(* serial.device. Written 1990 by Stefan Hellwig. Version 1.00      *)
(* Released to the Public Domain Pool. Use for non-profit only !    *)

MODULE SerialSupport;

IMPORT
     e*:Exec,
     es*:ExecSupport,
     s*:Serial,
     SYSTEM*;

CONST
     DevName* = "serial.device";
     UnitNr*  = 0;

PROCEDURE Open*(VAR SMsgPort:e.MsgPortPtr;VAR SIO:s.IOSerialPtr):BOOLEAN;
VAR
     status : LONGINT;
BEGIN
     SMsgPort := es.CreatePort(0,0);
     IF SMsgPort # NIL THEN
          SIO := es.CreateExtIO(SMsgPort,SYSTEM.SIZE(SIO^));
          IF SIO # NIL THEN
               SIO.serFlags := SHORTSET{s.shared};
               status := e.OpenDevice(DevName,UnitNr,SIO,LONGSET{0});
               IF status # 0 THEN
                    es.DeleteExtIO(SIO);
                    es.DeletePort(SMsgPort);
                    RETURN FALSE;
               ELSE
                    RETURN TRUE;
               END;
          ELSE
               es.DeletePort(SMsgPort);
               RETURN FALSE;
          END;
     ELSE
          RETURN FALSE;
     END;
END Open;

PROCEDURE Close*(VAR SMsgPort:e.MsgPortPtr;VAR SIO:s.IOSerialPtr):BOOLEAN;
BEGIN
     e.AbortIO(SIO);
     e.WaitIO(SIO);

     e.CloseDevice(SIO);

     IF SIO # NIL THEN
          es.DeleteExtIO(SIO);
     ELSE
          RETURN FALSE;
     END;

     IF SMsgPort # NIL THEN
          es.DeletePort(SMsgPort);
     ELSE
          RETURN FALSE;
     END;
     RETURN TRUE;
END Close;

PROCEDURE Read*(SIO:s.IOSerialPtr;VAR BufferPtr:e.ADDRESS);
BEGIN
     SIO.ioSer.command := e.read;
     SIO.ioSer.length  := -1;
     SIO.ioSer.data    := BufferPtr;
     e.SendIO(SIO);
END Read;

PROCEDURE ReadDo*(SIO:s.IOSerialPtr;VAR BufferPtr:e.ADDRESS);
BEGIN
     SIO.ioSer.command := e.read;
     SIO.ioSer.length  := -1;
     SIO.ioSer.data    := BufferPtr;
     e.DoIO(SIO);
END ReadDo;

PROCEDURE Write*(SIO:s.IOSerialPtr;VAR DataPtr:e.ADDRESS);
BEGIN
     SIO.ioSer.command := e.write;
     SIO.ioSer.length  := -1;
     SIO.ioSer.data    := DataPtr;
     e.SendIO(SIO);
END Write;

PROCEDURE WriteDo*(SIO:s.IOSerialPtr;VAR DataPtr:e.ADDRESS);
BEGIN
     SIO.ioSer.command := e.write;
     SIO.ioSer.length  := -1;
     SIO.ioSer.data    := DataPtr;
     e.DoIO(SIO);
END WriteDo;

PROCEDURE Abort*(SIO:s.IOSerialPtr);
BEGIN
     e.AbortIO(SIO);
     e.WaitIO(SIO);
END Abort;

PROCEDURE Prefs*(SIO : s.IOSerialPtr;Baudrate : LONGINT;StopBits : BYTE;
                 Par : SHORTSET);
BEGIN
     SIO.baud           := Baudrate;
     SIO.stopBits       := StopBits;
     SIO.serFlags       := Par;
     SIO.ioSer.command  := s.setParams;
     e.DoIO(SIO);
END Prefs;

PROCEDURE Reset*(SIO : s.IOSerialPtr);
VAR
     Status : BOOLEAN;
BEGIN
     Status := e.CheckIO(SIO);
     IF Status THEN
          e.WaitIO(SIO);
          SIO.ioSer.command  := e.reset;
          e.DoIO(SIO);
     END;
END Reset;

END SerialSupport.

