TTY.icl 1.75 KB
Newer Older
Mart Lubbers's avatar
Mart Lubbers committed
1
2
implementation module TTY

Mart Lubbers's avatar
Mart Lubbers committed
3
import _SystemArray
4
import StdClass
Mart Lubbers's avatar
Mart Lubbers committed
5
6
import StdString
import StdChar
Mart Lubbers's avatar
Mart Lubbers committed
7

8
import code from "ctty."
Mart Lubbers's avatar
Mart Lubbers committed
9
10
11
12
13
14
15
16

:: *TTY :== Int

instance zero TTYSettings where
	zero = {TTYSettings |
		baudrate = B9600,
		bytesize = BytesizeEight,
		parity = ParityNone,
Mart Lubbers's avatar
Mart Lubbers committed
17
		stop2bits = False,
Mart Lubbers's avatar
Mart Lubbers committed
18
19
20
		xonxoff = False}

instance toInt BaudRate where
Mart Lubbers's avatar
Mart Lubbers committed
21
22
23
24
25
	toInt b = case b of
		B0 = 0; B50 = 1; B75 = 2; B110 = 3; B134 = 4; B150 = 5; B200 = 6
		B300 = 7; B600 = 8; B1200 = 9; B1800 = 10; B2400 = 11; B4800 = 12
		B9600 = 13; B19200 = 14; B38400 = 15; B57600 = 16; B115200 = 17
		B230400 = 18
Mart Lubbers's avatar
Mart Lubbers committed
26
27

instance toInt ByteSize where
Mart Lubbers's avatar
Mart Lubbers committed
28
29
	toInt b = case b of
		BytesizeFive = 0; BytesizeSix = 1; BytesizeSeven = 2; BytesizeEight = 3
Mart Lubbers's avatar
Mart Lubbers committed
30
31

instance toInt Parity where
Mart Lubbers's avatar
Mart Lubbers committed
32
	toInt p = case p of
33
34
		ParityNone = 0; ParityOdd = 1; ParityEven = 2; ParitySpace = 3;
		ParityMark = 4
Mart Lubbers's avatar
Mart Lubbers committed
35
36
37
38
39
40
41

TTYopen :: !String !TTYSettings !*env -> (!Bool, !*TTY, !*env)
TTYopen fn ts w = TTYopen2
	fn
	(toInt ts.baudrate)
	(toInt ts.bytesize)
	(toInt ts.parity)
Mart Lubbers's avatar
Mart Lubbers committed
42
	ts.stop2bits
Mart Lubbers's avatar
Mart Lubbers committed
43
44
45
	ts.xonxoff
	w
	where
Mart Lubbers's avatar
Mart Lubbers committed
46
		TTYopen2 :: !String !Int !Int !Int !Bool !Bool !*env -> (!Bool, !*TTY, !*env)
Mart Lubbers's avatar
Mart Lubbers committed
47
48
49
50
51
		TTYopen2 _ _ _ _ _ _ _ = code {
				ccall ttyopen "SIIIII:VII:A"
			}

TTYclose :: !*TTY !*env -> (!Bool, !*env)
Mart Lubbers's avatar
Mart Lubbers committed
52
TTYclose _ _ = code {
Mart Lubbers's avatar
Mart Lubbers committed
53
54
55
		ccall ttyclose "I:I:A"
	}

Mart Lubbers's avatar
Mart Lubbers committed
56
57
58
TTYread :: !*TTY -> (!Int, !*TTY)
TTYread _ = code {
		ccall ttyread "I:VII"
59
	}
Mart Lubbers's avatar
Mart Lubbers committed
60

Mart Lubbers's avatar
Mart Lubbers committed
61
62
63
64
65
66
67
TTYreadline :: !*TTY -> (!String, !*TTY)
TTYreadline tty = case TTYread tty of
	(10, tty) = ("", tty)
	(c, tty)
	# (rest, tty) = TTYreadline tty
	= ({#toChar c} +++ rest, tty)

Mart Lubbers's avatar
Mart Lubbers committed
68
TTYwrite :: !String !*TTY -> *TTY
Mart Lubbers's avatar
Mart Lubbers committed
69
TTYwrite _ _ = code {
Mart Lubbers's avatar
Mart Lubbers committed
70
		ccall ttywrite "SI:I"
Mart Lubbers's avatar
Mart Lubbers committed
71
72
	}

Mart Lubbers's avatar
Mart Lubbers committed
73
74
75
76
77
TTYavailable :: !*TTY -> (!Bool, !*TTY)
TTYavailable _ = code {
		ccall ttyavailable "I:VII"
	}

Mart Lubbers's avatar
Mart Lubbers committed
78
TTYerror :: !*env -> (!String, !*env)
Mart Lubbers's avatar
Mart Lubbers committed
79
TTYerror _ = code {
80
		ccall ttyerror ":VS:A"
Mart Lubbers's avatar
Mart Lubbers committed
81
	}