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

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

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

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

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

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

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