PROGRAM SerialReadAndEcho

? F-Basic program by DNS, Inc. Uses the ROM Kernel and its library calls
? to echo characters received via the serial device. 

INCLUDE finclude/AmigaExecTypes
APPEND  finclude/AmigaExecSubs

TYPE IOTArray IS RECORD
  INTEGER TermArray0,TermArray1
ENDTYPE

TYPE IOExtSer IS RECORD
  IOStdReq  IOSer
  INTEGER   io_CtlChar,io_RBufLen,io_ExtFlags,io_Baud,io_BrkTime
  IOTArray  io_TermArray
  BYTE      io_ReadLen,io_WriteLen,io_StopBits,io_SerFlags
  WORD      io_Status
ENDTYPE

GLOBAL
   PTR_TO IOExtSer mySerReq                       ;? WRITE POINTERS
   PTR_TO MsgPort mySerPort
   PTR_TO Message myIO
   WORD error
   INTEGER ExecBase,HowMany,A,fault,S,M,J,L,K,T,M1,M2,M3,Continue
   TEXT*1 myReadData

DATA    (Continue,1)

SUBPROGRAM
   SUBROUTINE handle_messages
   INTEGER INITIALIZE,QueueReadSer
   INCLUDE finclude/AmigaSubNames
    
ExecBase=OPENLIB("exec.library",0)

&SYSLIB 1

fault = INITIALIZE()
IF fault<>0 THEN GOTO cleanup
fault=QueueReadSer()

INPUT "How Many Serial Port Characters Shall I Accept Before Quitting" HowMany
PRINT "Waiting For Serial Port Characters Which I Will Echo For You:"
PRINT 
WHILE Continue>0 DO
   Wait(ExecBase,1 LSL mySerPort.mp_SigBit)
   handle_messages()
ENDWHILE

{cleanup}
IF mySerReq THEN
   CloseDevice(ExecBase,mySerReq)
   DeleteExtIO(mySerReq,SIZEOF(IOExtSer))
ENDIF
IF mySerPort THEN DeletePort(mySerPort)
END


SUBROUTINE handle_messages
LOCAL
   INTEGER ASIZE,R,C

WHILE  CheckIO(ExecBase,mySerReq) DO
   WaitIO(ExecBase,mySerReq)
   ASIZE = mySerReq.IOSer.io_Actual
   INC(Continue)
   IF Continue>HowMany THEN Continue=-1000
   PRINT myReadData,
   R=QueueReadSer()
ENDWHILE

GRETURN
END

FUNCTION  INITIALIZE
? Returns 0 if all goes well in setting up structures for the
? serial port. 1,2,3 represent errors that occurred in this process
INITIALIZE = 0

mySerPort=CreatePort(0,0)
IF mySerPort=NIL THEN
   PRINT "CAN'T CREATE SERIAL READ PORT?"
   INITIALIZE = 1
   GOTO CUT
ENDIF

? Create A Request Block For The Serial Device
? Send PTR_TO An Already Initialized MsgPort To Use As ReplyBlock
? mySerReq is a PTR_TO IORequest Pointing To The New Block
mySerReq = CreateExtIO(mySerPort,SIZEOF(IOExtSer))
IF mySerReq = NIL THEN
   PRINT "not enough memory or sigBits to CreateExtIO for READ"
   INITIALIZE = 2
   GOTO CUT
ENDIF
mySerReq.io_SerFlags=0

? Now, ready to open the serial device
error=OpenDevice(ExecBase,@"serial.device",0,mySerReq,0)
IF error<>0 THEN
   PRINT "Error In Opening The SERIAL Device for READ"
   INITIALIZE=3
ENDIF

{CUT}
   GRETURN
END

FUNCTION QueueReadSer
mySerReq.IOSer.io_Data = @myReadData

mySerReq.IOSer.io_Length = 1
mySerReq.IOSer.io_Command = CMD_READ
SendIO(ExecBase,mySerReq)
QueueReadSer=1
END
