TTY.icl 1.84 KB
Newer Older
Mart Lubbers's avatar
Mart Lubbers committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
implementation module TTY

import StdFunc
import StdFile
import StdMisc
import StdBool
import StdString

import code from "tty."

:: *TTY :== Int

instance zero TTYSettings where
	zero = {TTYSettings |
		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
34
35
	toInt p = case p of
		ParityNone = 0; ParityEven = 1; ParityOdd = 2; ParityMark = 3;
		ParitySpace = 4
Mart Lubbers's avatar
Mart Lubbers committed
36
37
38
39
40
41
42

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
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
		TTYopen2 _ _ _ _ _ _ _ = code {
				ccall ttyopen "SIIIII:VII:A"
			}

TTYclose :: !*TTY !*env -> (!Bool, !*env)
TTYclose f w = code {
		ccall ttyclose "I:I:A"
	}

TTYreadc :: !*TTY -> (!Char, !*TTY)
TTYreadc w = code {
		ccall ttyreadc "I:VII"
	}

TTYreadline :: !*TTY -> (!String, !*TTY)
TTYreadline t = code {
		ccall ttyreadline "I:VSI"
}

Mart Lubbers's avatar
Mart Lubbers committed
67
TTYwrite :: !*TTY !String -> *TTY
Mart Lubbers's avatar
Mart Lubbers committed
68
69
70
71
72
73
74
75
76
TTYwrite s e = code {
		ccall ttywrite "IS:I"
	}

TTYerror :: !*env -> (!String, !*env)
TTYerror w = code {
		ccall ttyerror ":S:A"
	}

Mart Lubbers's avatar
Mart Lubbers committed
77
78
79
80
Start :: *World -> (!String, *World)
Start w
#! (ok, tty, w) = TTYopen "/dev/ttyUSB0" zero w
| not ok = TTYerror w
Mart Lubbers's avatar
Mart Lubbers committed
81
#! tty = TTYwrite tty "echo123\n"
Mart Lubbers's avatar
Mart Lubbers committed
82
83
84
85
86
#! (c, tty) = TTYreadline tty
#! (ok, w) = TTYclose tty w
| not ok = TTYerror w
#! (s, w) = TTYerror w
= (c, w)