( serial sk )

variable SerLib# 
variable serErr
variable inbytes
create inbuf 64 allot

\ Iinit the serial library:
api: SysLibFind
: initserial s" Serial Library" drop >abs SerLib# >abs SysLibFind drop ;

\ open serial interface

api: serOpen \ Err SerOpen (UInt16 refNum, UInt16 port, UInt32 baud)
: openserial ( baud --> )
     SerLib# w@ swap 0 swap serOpen drop ; 

\ waiting until output buffer became empty

api: SerSendWait \ Err SerSendWait (UInt16 refNum, Int32 timeout)
: sendwait SerLib# w@ -1 SerSendWait drop ;

\ close serial interface

api: serClose \ Err SerClose (UInt16 refNum)
: closeserial sendwait SerLib# w@ serClose drop ; ( --> )

api: SerClearErr \ Err SerClearErr (UInt16 refNum)  
: clearerr SerLib# w@ SerClearErr drop ; ( --> )

\ receiving  bytes from interface 

api: SerReceiveCheck \ Err SerReceiveCheck (UInt16 refNum, UInt32*  numBytesP) 
: checkresive ( --> num_bytes ) 
           SerLib# w@ inbytes >abs SerReceiveCheck if 0 else inbytes @ then ;

api: SerReceive \ UInt32 SerReceive (UInt16 refNum, void*  bufP, UInt32 count,
Int32 timeout, Err* errP)
: serreceve ( adr , cnt --> )
           SerLib# w@ rot >abs rot -1 serErr >abs SerReceive drop ;
: lexpect   ( --> adr , cnt ) \ get all bytes from input queue
        inbuf checkresive dup if 2dup serreceve then ;

 
\ send bytes via interface

api: SerSend \ UInt32 SerSend (UInt16 refNum, void*  bufP, UInt32 count, Err*
errP)
: ltype ( adr , cnt --> )
        SerLib# w@ rot >abs rot serErr >abs SerSend drop ;

\eof
\ for testing

: pro s" priwet" ltype ;
: serinit initserial 19200 openserial pro closeserial ;
: ops initserial 19200 openserial ;
: intype lexpect type ; 