TTY.icl 2.02 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
import code from library "msvcrt.txt"
Mart Lubbers's avatar
Mart Lubbers committed
10
11
12
13
14

:: *TTY :== Int

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

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

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

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

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

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

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

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

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

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