This repository was archived by the owner on Mar 4, 2022. It is now read-only.
forked from 256dpi/handlauf
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdevice.go
116 lines (97 loc) · 1.88 KB
/
device.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
package main
import (
"bufio"
"fmt"
"strconv"
"strings"
"sync"
"sync/atomic"
"time"
"go.bug.st/serial"
)
var devices sync.Map
var numDevices int64
var left atomic.Value
var right atomic.Value
func init() {
// initialize
left.Store(make(sample, 6))
right.Store(make(sample, 6))
}
func manage() {
for {
// get list
list, err := serial.GetPortsList()
if err != nil {
println("manage:", err.Error())
time.Sleep(time.Second)
continue
}
// check devices
for _, name := range list {
if strings.Contains(name, *usbPrefix) {
if _, ok := devices.Load(name); !ok {
// add device
devices.Store(name, true)
atomic.AddInt64(&numDevices, 1)
fmt.Printf("manage: added device %s\n", name)
// read
go read(name)
}
}
}
// sleep
time.Sleep(time.Second)
}
}
func read(name string) {
// ensure remove
defer func() {
devices.Delete(name)
atomic.AddInt64(&numDevices, -1)
fmt.Printf("read: removed device %s\n", name)
}()
// open device
device, err := serial.Open(name, &serial.Mode{
BaudRate: 115200,
DataBits: 7,
Parity: serial.NoParity,
StopBits: serial.OneStopBit,
})
if err != nil {
fmt.Printf("read: %s\n", err.Error())
return
}
// ensure close
defer device.Close()
// prepare reader
reader := bufio.NewReader(device)
// read data
for {
// read line
line, err := reader.ReadString('\n')
if err != nil {
fmt.Printf("read: %s\n", err.Error())
return
}
// remove space
line = strings.TrimSpace(line)
// split
parts := strings.Split(line, ",")
// get orientation
orientation := parts[0]
parts = parts[1:]
// decode sample
values := make(sample, 6)
for i := 0; i < len(values) && i < len(parts); i++ {
values[i], _ = strconv.ParseFloat(parts[i], 64)
}
// set sample
switch orientation {
case "L":
left.Store(values)
case "R":
right.Store(values)
}
}
}