moved serial to io.serial
parent
b26c526b90
commit
5cc5d347ae
|
@ -0,0 +1 @@
|
||||||
|
Doug Coleman
|
|
@ -0,0 +1,23 @@
|
||||||
|
! Copyright (C) 2008 Doug Coleman.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: accessors alien.c-types assocs combinators destructors
|
||||||
|
kernel math math.bitfields math.parser sequences summary system
|
||||||
|
vocabs.loader ;
|
||||||
|
IN: io.serial
|
||||||
|
|
||||||
|
TUPLE: serial stream path baud
|
||||||
|
termios iflag oflag cflag lflag ;
|
||||||
|
|
||||||
|
ERROR: invalid-baud baud ;
|
||||||
|
M: invalid-baud summary ( invalid-baud -- string )
|
||||||
|
"Baud rate "
|
||||||
|
swap baud>> number>string
|
||||||
|
" not supported" 3append ;
|
||||||
|
|
||||||
|
HOOK: lookup-baud os ( m -- n )
|
||||||
|
HOOK: open-serial os ( serial -- serial' )
|
||||||
|
M: serial dispose ( serial -- ) stream>> dispose ;
|
||||||
|
|
||||||
|
{
|
||||||
|
{ [ os unix? ] [ "serial.unix" ] }
|
||||||
|
} cond require
|
|
@ -0,0 +1 @@
|
||||||
|
Serial port library
|
|
@ -0,0 +1 @@
|
||||||
|
unportable
|
|
@ -0,0 +1,86 @@
|
||||||
|
! Copyright (C) 2008 Doug Coleman.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: alien.syntax kernel math.bitfields sequences system serial ;
|
||||||
|
IN: io.serial.unix
|
||||||
|
|
||||||
|
M: bsd lookup-baud ( m -- n )
|
||||||
|
dup {
|
||||||
|
0 50 75 110 134 150 200 300 600 1200 1800 2400 4800
|
||||||
|
7200 9600 14400 19200 28800 38400 57600 76800 115200
|
||||||
|
230400 460800 921600
|
||||||
|
} member? [ invalid-baud ] unless ;
|
||||||
|
|
||||||
|
: TCSANOW 0 ; inline
|
||||||
|
: TCSADRAIN 1 ; inline
|
||||||
|
: TCSAFLUSH 2 ; inline
|
||||||
|
: TCSASOFT HEX: 10 ; inline
|
||||||
|
|
||||||
|
: TCIFLUSH 1 ; inline
|
||||||
|
: TCOFLUSH 2 ; inline
|
||||||
|
: TCIOFLUSH 3 ; inline
|
||||||
|
: TCOOFF 1 ; inline
|
||||||
|
: TCOON 2 ; inline
|
||||||
|
: TCIOFF 3 ; inline
|
||||||
|
: TCION 4 ; inline
|
||||||
|
|
||||||
|
! iflags
|
||||||
|
: IGNBRK HEX: 00000001 ; inline
|
||||||
|
: BRKINT HEX: 00000002 ; inline
|
||||||
|
: IGNPAR HEX: 00000004 ; inline
|
||||||
|
: PARMRK HEX: 00000008 ; inline
|
||||||
|
: INPCK HEX: 00000010 ; inline
|
||||||
|
: ISTRIP HEX: 00000020 ; inline
|
||||||
|
: INLCR HEX: 00000040 ; inline
|
||||||
|
: IGNCR HEX: 00000080 ; inline
|
||||||
|
: ICRNL HEX: 00000100 ; inline
|
||||||
|
: IXON HEX: 00000200 ; inline
|
||||||
|
: IXOFF HEX: 00000400 ; inline
|
||||||
|
: IXANY HEX: 00000800 ; inline
|
||||||
|
: IMAXBEL HEX: 00002000 ; inline
|
||||||
|
: IUTF8 HEX: 00004000 ; inline
|
||||||
|
|
||||||
|
! oflags
|
||||||
|
: OPOST HEX: 00000001 ; inline
|
||||||
|
: ONLCR HEX: 00000002 ; inline
|
||||||
|
: OXTABS HEX: 00000004 ; inline
|
||||||
|
: ONOEOT HEX: 00000008 ; inline
|
||||||
|
|
||||||
|
! cflags
|
||||||
|
: CIGNORE HEX: 00000001 ; inline
|
||||||
|
: CSIZE HEX: 00000300 ; inline
|
||||||
|
: CS5 HEX: 00000000 ; inline
|
||||||
|
: CS6 HEX: 00000100 ; inline
|
||||||
|
: CS7 HEX: 00000200 ; inline
|
||||||
|
: CS8 HEX: 00000300 ; inline
|
||||||
|
: CSTOPB HEX: 00000400 ; inline
|
||||||
|
: CREAD HEX: 00000800 ; inline
|
||||||
|
: PARENB HEX: 00001000 ; inline
|
||||||
|
: PARODD HEX: 00002000 ; inline
|
||||||
|
: HUPCL HEX: 00004000 ; inline
|
||||||
|
: CLOCAL HEX: 00008000 ; inline
|
||||||
|
: CCTS_OFLOW HEX: 00010000 ; inline
|
||||||
|
: CRTS_IFLOW HEX: 00020000 ; inline
|
||||||
|
: CRTSCTS { CCTS_OFLOW CRTS_IFLOW } flags ; inline
|
||||||
|
: CDTR_IFLOW HEX: 00040000 ; inline
|
||||||
|
: CDSR_OFLOW HEX: 00080000 ; inline
|
||||||
|
: CCAR_OFLOW HEX: 00100000 ; inline
|
||||||
|
: MDMBUF HEX: 00100000 ; inline
|
||||||
|
|
||||||
|
! lflags
|
||||||
|
: ECHOKE HEX: 00000001 ; inline
|
||||||
|
: ECHOE HEX: 00000002 ; inline
|
||||||
|
: ECHOK HEX: 00000004 ; inline
|
||||||
|
: ECHO HEX: 00000008 ; inline
|
||||||
|
: ECHONL HEX: 00000010 ; inline
|
||||||
|
: ECHOPRT HEX: 00000020 ; inline
|
||||||
|
: ECHOCTL HEX: 00000040 ; inline
|
||||||
|
: ISIG HEX: 00000080 ; inline
|
||||||
|
: ICANON HEX: 00000100 ; inline
|
||||||
|
: ALTWERASE HEX: 00000200 ; inline
|
||||||
|
: IEXTEN HEX: 00000400 ; inline
|
||||||
|
: EXTPROC HEX: 00000800 ; inline
|
||||||
|
: TOSTOP HEX: 00400000 ; inline
|
||||||
|
: FLUSHO HEX: 00800000 ; inline
|
||||||
|
: NOKERNINFO HEX: 02000000 ; inline
|
||||||
|
: PENDIN HEX: 20000000 ; inline
|
||||||
|
: NOFLSH HEX: 80000000 ; inline
|
|
@ -0,0 +1 @@
|
||||||
|
unportable
|
|
@ -0,0 +1,130 @@
|
||||||
|
! Copyright (C) 2008 Doug Coleman.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: assocs alien.syntax kernel serial system unix ;
|
||||||
|
IN: io.serial.unix
|
||||||
|
|
||||||
|
: TCSANOW 0 ; inline
|
||||||
|
: TCSADRAIN 1 ; inline
|
||||||
|
: TCSAFLUSH 2 ; inline
|
||||||
|
|
||||||
|
: TCIFLUSH 0 ; inline
|
||||||
|
: TCOFLUSH 1 ; inline
|
||||||
|
: TCIOFLUSH 2 ; inline
|
||||||
|
|
||||||
|
: TCOOFF 0 ; inline
|
||||||
|
: TCOON 1 ; inline
|
||||||
|
: TCIOFF 2 ; inline
|
||||||
|
: TCION 3 ; inline
|
||||||
|
|
||||||
|
! iflag
|
||||||
|
: IGNBRK OCT: 0000001 ; inline
|
||||||
|
: BRKINT OCT: 0000002 ; inline
|
||||||
|
: IGNPAR OCT: 0000004 ; inline
|
||||||
|
: PARMRK OCT: 0000010 ; inline
|
||||||
|
: INPCK OCT: 0000020 ; inline
|
||||||
|
: ISTRIP OCT: 0000040 ; inline
|
||||||
|
: INLCR OCT: 0000100 ; inline
|
||||||
|
: IGNCR OCT: 0000200 ; inline
|
||||||
|
: ICRNL OCT: 0000400 ; inline
|
||||||
|
: IUCLC OCT: 0001000 ; inline
|
||||||
|
: IXON OCT: 0002000 ; inline
|
||||||
|
: IXANY OCT: 0004000 ; inline
|
||||||
|
: IXOFF OCT: 0010000 ; inline
|
||||||
|
: IMAXBEL OCT: 0020000 ; inline
|
||||||
|
: IUTF8 OCT: 0040000 ; inline
|
||||||
|
|
||||||
|
! oflag
|
||||||
|
: OPOST OCT: 0000001 ; inline
|
||||||
|
: OLCUC OCT: 0000002 ; inline
|
||||||
|
: ONLCR OCT: 0000004 ; inline
|
||||||
|
: OCRNL OCT: 0000010 ; inline
|
||||||
|
: ONOCR OCT: 0000020 ; inline
|
||||||
|
: ONLRET OCT: 0000040 ; inline
|
||||||
|
: OFILL OCT: 0000100 ; inline
|
||||||
|
: OFDEL OCT: 0000200 ; inline
|
||||||
|
: NLDLY OCT: 0000400 ; inline
|
||||||
|
: NL0 OCT: 0000000 ; inline
|
||||||
|
: NL1 OCT: 0000400 ; inline
|
||||||
|
: CRDLY OCT: 0003000 ; inline
|
||||||
|
: CR0 OCT: 0000000 ; inline
|
||||||
|
: CR1 OCT: 0001000 ; inline
|
||||||
|
: CR2 OCT: 0002000 ; inline
|
||||||
|
: CR3 OCT: 0003000 ; inline
|
||||||
|
: TABDLY OCT: 0014000 ; inline
|
||||||
|
: TAB0 OCT: 0000000 ; inline
|
||||||
|
: TAB1 OCT: 0004000 ; inline
|
||||||
|
: TAB2 OCT: 0010000 ; inline
|
||||||
|
: TAB3 OCT: 0014000 ; inline
|
||||||
|
: BSDLY OCT: 0020000 ; inline
|
||||||
|
: BS0 OCT: 0000000 ; inline
|
||||||
|
: BS1 OCT: 0020000 ; inline
|
||||||
|
: FFDLY OCT: 0100000 ; inline
|
||||||
|
: FF0 OCT: 0000000 ; inline
|
||||||
|
: FF1 OCT: 0100000 ; inline
|
||||||
|
|
||||||
|
! cflags
|
||||||
|
: CSIZE OCT: 0000060 ; inline
|
||||||
|
: CS5 OCT: 0000000 ; inline
|
||||||
|
: CS6 OCT: 0000020 ; inline
|
||||||
|
: CS7 OCT: 0000040 ; inline
|
||||||
|
: CS8 OCT: 0000060 ; inline
|
||||||
|
: CSTOPB OCT: 0000100 ; inline
|
||||||
|
: CREAD OCT: 0000200 ; inline
|
||||||
|
: PARENB OCT: 0000400 ; inline
|
||||||
|
: PARODD OCT: 0001000 ; inline
|
||||||
|
: HUPCL OCT: 0002000 ; inline
|
||||||
|
: CLOCAL OCT: 0004000 ; inline
|
||||||
|
: CIBAUD OCT: 002003600000 ; inline
|
||||||
|
: CRTSCTS OCT: 020000000000 ; inline
|
||||||
|
|
||||||
|
! lflags
|
||||||
|
: ISIG OCT: 0000001 ; inline
|
||||||
|
: ICANON OCT: 0000002 ; inline
|
||||||
|
: XCASE OCT: 0000004 ; inline
|
||||||
|
: ECHO OCT: 0000010 ; inline
|
||||||
|
: ECHOE OCT: 0000020 ; inline
|
||||||
|
: ECHOK OCT: 0000040 ; inline
|
||||||
|
: ECHONL OCT: 0000100 ; inline
|
||||||
|
: NOFLSH OCT: 0000200 ; inline
|
||||||
|
: TOSTOP OCT: 0000400 ; inline
|
||||||
|
: ECHOCTL OCT: 0001000 ; inline
|
||||||
|
: ECHOPRT OCT: 0002000 ; inline
|
||||||
|
: ECHOKE OCT: 0004000 ; inline
|
||||||
|
: FLUSHO OCT: 0010000 ; inline
|
||||||
|
: PENDIN OCT: 0040000 ; inline
|
||||||
|
: IEXTEN OCT: 0100000 ; inline
|
||||||
|
|
||||||
|
M: linux lookup-baud ( n -- n )
|
||||||
|
dup H{
|
||||||
|
{ 0 OCT: 0000000 }
|
||||||
|
{ 50 OCT: 0000001 }
|
||||||
|
{ 75 OCT: 0000002 }
|
||||||
|
{ 110 OCT: 0000003 }
|
||||||
|
{ 134 OCT: 0000004 }
|
||||||
|
{ 150 OCT: 0000005 }
|
||||||
|
{ 200 OCT: 0000006 }
|
||||||
|
{ 300 OCT: 0000007 }
|
||||||
|
{ 600 OCT: 0000010 }
|
||||||
|
{ 1200 OCT: 0000011 }
|
||||||
|
{ 1800 OCT: 0000012 }
|
||||||
|
{ 2400 OCT: 0000013 }
|
||||||
|
{ 4800 OCT: 0000014 }
|
||||||
|
{ 9600 OCT: 0000015 }
|
||||||
|
{ 19200 OCT: 0000016 }
|
||||||
|
{ 38400 OCT: 0000017 }
|
||||||
|
{ 57600 OCT: 0010001 }
|
||||||
|
{ 115200 OCT: 0010002 }
|
||||||
|
{ 230400 OCT: 0010003 }
|
||||||
|
{ 460800 OCT: 0010004 }
|
||||||
|
{ 500000 OCT: 0010005 }
|
||||||
|
{ 576000 OCT: 0010006 }
|
||||||
|
{ 921600 OCT: 0010007 }
|
||||||
|
{ 1000000 OCT: 0010010 }
|
||||||
|
{ 1152000 OCT: 0010011 }
|
||||||
|
{ 1500000 OCT: 0010012 }
|
||||||
|
{ 2000000 OCT: 0010013 }
|
||||||
|
{ 2500000 OCT: 0010014 }
|
||||||
|
{ 3000000 OCT: 0010015 }
|
||||||
|
{ 3500000 OCT: 0010016 }
|
||||||
|
{ 4000000 OCT: 0010017 }
|
||||||
|
} at* [ nip ] [ drop invalid-baud ] if ;
|
|
@ -0,0 +1 @@
|
||||||
|
unportable
|
|
@ -0,0 +1 @@
|
||||||
|
unportable
|
|
@ -0,0 +1,19 @@
|
||||||
|
! Copyright (C) 2008 Doug Coleman.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: alien.syntax kernel sequences system ;
|
||||||
|
IN: io.serial.unix.termios
|
||||||
|
|
||||||
|
: NCCS 20 ; inline
|
||||||
|
|
||||||
|
TYPEDEF: uint tcflag_t
|
||||||
|
TYPEDEF: uchar cc_t
|
||||||
|
TYPEDEF: uint speed_t
|
||||||
|
|
||||||
|
C-STRUCT: termios
|
||||||
|
{ "tcflag_t" "iflag" } ! input mode flags
|
||||||
|
{ "tcflag_t" "oflag" } ! output mode flags
|
||||||
|
{ "tcflag_t" "cflag" } ! control mode flags
|
||||||
|
{ "tcflag_t" "lflag" } ! local mode flags
|
||||||
|
{ { "cc_t" NCCS } "cc" } ! control characters
|
||||||
|
{ "speed_t" "ispeed" } ! input speed
|
||||||
|
{ "speed_t" "ospeed" } ; ! output speed
|
|
@ -0,0 +1 @@
|
||||||
|
unportable
|
|
@ -0,0 +1,20 @@
|
||||||
|
! Copyright (C) 2008 Doug Coleman.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: alien.syntax kernel system unix ;
|
||||||
|
IN: io.serial.unix.termios
|
||||||
|
|
||||||
|
: NCCS 32 ; inline
|
||||||
|
|
||||||
|
TYPEDEF: uchar cc_t
|
||||||
|
TYPEDEF: uint speed_t
|
||||||
|
TYPEDEF: uint tcflag_t
|
||||||
|
|
||||||
|
C-STRUCT: termios
|
||||||
|
{ "tcflag_t" "iflag" } ! input mode flags
|
||||||
|
{ "tcflag_t" "oflag" } ! output mode flags
|
||||||
|
{ "tcflag_t" "cflag" } ! control mode flags
|
||||||
|
{ "tcflag_t" "lflag" } ! local mode flags
|
||||||
|
{ "cc_t" "line" } ! line discipline
|
||||||
|
{ { "cc_t" NCCS } "cc" } ! control characters
|
||||||
|
{ "speed_t" "ispeed" } ! input speed
|
||||||
|
{ "speed_t" "ospeed" } ; ! output speed
|
|
@ -0,0 +1 @@
|
||||||
|
unportable
|
|
@ -0,0 +1 @@
|
||||||
|
unportable
|
|
@ -0,0 +1,9 @@
|
||||||
|
! Copyright (C) 2008 Doug Coleman.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: combinators system vocabs.loader ;
|
||||||
|
IN: io.serial.unix.termios
|
||||||
|
|
||||||
|
{
|
||||||
|
{ [ os linux? ] [ "serial.unix.termios.linux" ] }
|
||||||
|
{ [ os bsd? ] [ "serial.unix.termios.bsd" ] }
|
||||||
|
} cond require
|
|
@ -0,0 +1,21 @@
|
||||||
|
! Copyright (C) 2008 Doug Coleman.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: accessors kernel math.bitfields serial serial.unix ;
|
||||||
|
IN: io.serial.unix
|
||||||
|
|
||||||
|
: serial-obj ( -- obj )
|
||||||
|
serial new
|
||||||
|
"/dev/ttyS0" >>path
|
||||||
|
19200 >>baud
|
||||||
|
{ IGNPAR ICRNL } flags >>iflag
|
||||||
|
{ } flags >>oflag
|
||||||
|
{ CS8 CLOCAL CREAD } flags >>cflag
|
||||||
|
{ ICANON } flags >>lflag ;
|
||||||
|
|
||||||
|
: serial-test ( -- serial )
|
||||||
|
serial-obj
|
||||||
|
open-serial
|
||||||
|
dup get-termios >>termios
|
||||||
|
dup configure-termios
|
||||||
|
dup tciflush
|
||||||
|
dup apply-termios ;
|
|
@ -0,0 +1,63 @@
|
||||||
|
! Copyright (C) 2008 Doug Coleman.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: accessors alien.c-types alien.syntax combinators io.ports
|
||||||
|
io.streams.duplex io.unix.backend system kernel math math.bitfields
|
||||||
|
vocabs.loader unix serial serial.unix.termios ;
|
||||||
|
IN: io.serial.unix
|
||||||
|
|
||||||
|
<< {
|
||||||
|
{ [ os linux? ] [ "serial.unix.linux" ] }
|
||||||
|
{ [ os bsd? ] [ "serial.unix.bsd" ] }
|
||||||
|
} cond require >>
|
||||||
|
|
||||||
|
FUNCTION: speed_t cfgetispeed ( termios* t ) ;
|
||||||
|
FUNCTION: speed_t cfgetospeed ( termios* t ) ;
|
||||||
|
FUNCTION: int cfsetispeed ( termios* t, speed_t s ) ;
|
||||||
|
FUNCTION: int cfsetospeed ( termios* t, speed_t s ) ;
|
||||||
|
FUNCTION: int tcgetattr ( int i1, termios* t ) ;
|
||||||
|
FUNCTION: int tcsetattr ( int i1, int i2, termios* t ) ;
|
||||||
|
FUNCTION: int tcdrain ( int i1 ) ;
|
||||||
|
FUNCTION: int tcflow ( int i1, int i2 ) ;
|
||||||
|
FUNCTION: int tcflush ( int i1, int i2 ) ;
|
||||||
|
FUNCTION: int tcsendbreak ( int i1, int i2 ) ;
|
||||||
|
FUNCTION: void cfmakeraw ( termios* t ) ;
|
||||||
|
FUNCTION: int cfsetspeed ( termios* t, speed_t s ) ;
|
||||||
|
|
||||||
|
: fd>duplex-stream ( fd -- duplex-stream )
|
||||||
|
<fd> init-fd
|
||||||
|
[ <input-port> ] [ <output-port> ] bi <duplex-stream> ;
|
||||||
|
|
||||||
|
: open-rw ( path -- fd ) O_RDWR file-mode open-file ;
|
||||||
|
: <file-rw> ( path -- stream ) open-rw fd>duplex-stream ;
|
||||||
|
|
||||||
|
M: unix open-serial ( serial -- serial' )
|
||||||
|
dup
|
||||||
|
path>> { O_RDWR O_NOCTTY O_NDELAY } flags file-mode open-file
|
||||||
|
fd>duplex-stream >>stream ;
|
||||||
|
|
||||||
|
: serial-fd ( serial -- fd )
|
||||||
|
stream>> in>> handle>> fd>> ;
|
||||||
|
|
||||||
|
: get-termios ( serial -- termios )
|
||||||
|
serial-fd
|
||||||
|
"termios" <c-object> [ tcgetattr io-error ] keep ;
|
||||||
|
|
||||||
|
: configure-termios ( serial -- )
|
||||||
|
dup termios>>
|
||||||
|
{
|
||||||
|
[ [ iflag>> ] dip over [ set-termios-iflag ] [ 2drop ] if ]
|
||||||
|
[ [ oflag>> ] dip over [ set-termios-oflag ] [ 2drop ] if ]
|
||||||
|
[
|
||||||
|
[
|
||||||
|
[ cflag>> 0 or ] [ baud>> lookup-baud ] bi bitor
|
||||||
|
] dip set-termios-cflag
|
||||||
|
]
|
||||||
|
[ [ lflag>> ] dip over [ set-termios-lflag ] [ 2drop ] if ]
|
||||||
|
} 2cleave ;
|
||||||
|
|
||||||
|
: tciflush ( serial -- )
|
||||||
|
serial-fd TCIFLUSH tcflush io-error ;
|
||||||
|
|
||||||
|
: apply-termios ( serial -- )
|
||||||
|
[ serial-fd TCSANOW ]
|
||||||
|
[ termios>> ] bi tcsetattr io-error ;
|
Loading…
Reference in New Issue