-
Notifications
You must be signed in to change notification settings - Fork 1
/
serialremote.go
118 lines (92 loc) · 1.97 KB
/
serialremote.go
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package main
import (
//"go.bug.st/serial.v1"
"github.com/tarm/serial"
"time"
)
type SerialRemote struct {
bufferPool *BufferPool
readChan chan []byte
devName string
baud int
port *serial.Port
running bool
writeChan chan []byte
ctrlChan chan bool
}
func NewSerialRemote(devName string, baud int) (sr *SerialRemote, err error) {
sr = &SerialRemote{
bufferPool: nil,
readChan: make(chan []byte, 10),
devName: devName,
baud: baud,
port: nil,
running: false,
writeChan: make(chan []byte, 100),
ctrlChan: make(chan bool)}
return sr, nil
}
func (this *SerialRemote) Init(bufferPool *BufferPool) (err error) {
this.bufferPool = bufferPool
return nil
}
func (this *SerialRemote) Open() (err error) {
/*config := &serial.Mode{
BaudRate: this.baud,
DataBits: 8,
Parity: serial.NoParity,
StopBits: serial.OneStopBit}
this.port, err = serial.Open(this.devName, config)
*/
config := &serial.Config{
Name: this.devName,
Baud: 19200,
Size: serial.DefaultSize,
Parity: serial.ParityNone,
StopBits: serial.Stop1}
this.port, err = serial.OpenPort(config)
if err != nil {
return err
}
this.port.Flush()
this.running = true
go this.reader()
go this.writer()
return nil
}
func (this *SerialRemote) Close() {
this.running = false
if this.port != nil {
this.port.Close()
this.port = nil
}
}
func (this *SerialRemote) GetReadChan() (readChan chan []byte) {
return this.readChan
}
func (this *SerialRemote) Write(data []byte) {
this.writeChan <- data
}
func (this *SerialRemote) writer() {
for {
select {
case <-this.ctrlChan:
return
case buf := <-this.writeChan:
this.port.Write(buf)
time.Sleep(10 * time.Millisecond)
}
}
}
func (this *SerialRemote) reader() {
for this.running {
buf := this.bufferPool.AllocBuffer()
bytesRead, err := this.port.Read(buf)
if err != nil {
break
}
if bytesRead > 0 {
this.readChan <- buf[0:bytesRead]
}
}
}