TTY.icl 1.99 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

:: *TTY :== Int

instance zero TTYSettings where
	zero = {TTYSettings |
Mart Lubbers's avatar
Mart Lubbers committed
14
		devicePath = "/dev/ttyACM0",
Mart Lubbers's avatar
Mart Lubbers committed
15
16
17
		baudrate = B9600,
		bytesize = BytesizeEight,
		parity = ParityNone,
Mart Lubbers's avatar
Mart Lubbers committed
18
		stop2bits = False,
Mart Lubbers's avatar
Mart Lubbers committed
19
20
21
		xonxoff = False}

instance toInt BaudRate where
Mart Lubbers's avatar
Mart Lubbers committed
22
23
24
25
26
	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
27
28

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

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

37
38
39
40
makeTTYSettings :: String BaudRate ByteSize Parity Bool Bool -> TTYSettings
makeTTYSettings dp br bs pr sb xx = {TTYSettings | devicePath=dp, baudrate=br,
	bytesize=bs, parity=pr, stop2bits=sb, xonxoff=xx}

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

TTYclose :: !*TTY !*env -> (!Bool, !*env)
Mart Lubbers's avatar
Mart Lubbers committed
57
TTYclose _ _ = code {
Mart Lubbers's avatar
Mart Lubbers committed
58
59
60
		ccall ttyclose "I:I:A"
	}

Mart Lubbers's avatar
Mart Lubbers committed
61
62
63
TTYread :: !*TTY -> (!Int, !*TTY)
TTYread _ = code {
		ccall ttyread "I:VII"
64
	}
Mart Lubbers's avatar
Mart Lubbers committed
65

Mart Lubbers's avatar
Mart Lubbers committed
66
67
68
69
70
71
72
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
73
TTYwrite :: !String !*TTY -> *TTY
Mart Lubbers's avatar
Mart Lubbers committed
74
TTYwrite _ _ = code {
Mart Lubbers's avatar
Mart Lubbers committed
75
		ccall ttywrite "SI:I"
Mart Lubbers's avatar
Mart Lubbers committed
76
77
	}

Mart Lubbers's avatar
Mart Lubbers committed
78
79
80
81
82
TTYavailable :: !*TTY -> (!Bool, !*TTY)
TTYavailable _ = code {
		ccall ttyavailable "I:VII"
	}

Mart Lubbers's avatar
Mart Lubbers committed
83
TTYerror :: !*env -> (!String, !*env)
Mart Lubbers's avatar
Mart Lubbers committed
84
TTYerror _ = code {
85
		ccall ttyerror ":VS:A"
Mart Lubbers's avatar
Mart Lubbers committed
86
	}