blob: d6e752d3ad613189de42606e4a877202e24467ab (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
package communication
const (
SLIP_END = 0xC0
SLIP_ESC = 0xDB
SLIP_ESC_END = 0xDC
SLIP_ESC_ESC = 0xDD
SLIP_MAX_PAYLOAD = 1500
)
type dataLink struct {
rx chan []byte
}
func newDataLink() dataLink {
dl := dataLink{}
dl.rx = make(chan []byte)
return dl
}
func (dl *dataLink) start(source chan byte) {
go dl.receive(source)
}
func (dl *dataLink) receive(source chan byte) {
for {
frame := unslip(source)
dl.rx <- frame
}
}
func unslip(source chan byte) []byte {
escaped := false
buffer := make([]byte, 0)
for {
octet := <-source
if escaped {
switch octet {
case SLIP_ESC_END:
buffer = append(buffer, SLIP_END)
case SLIP_ESC_ESC:
buffer = append(buffer, SLIP_ESC)
}
} else {
switch octet {
case SLIP_END:
break
case SLIP_ESC:
escaped = true
continue
default:
buffer = append(buffer, octet)
continue
}
break
}
}
return buffer
}
|