-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathmain.go
182 lines (161 loc) · 3.69 KB
/
main.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
//go:generate go run -tags generate gen.go
package main
import (
"encoding/hex"
"fmt"
"io"
"log"
"net"
"net/http"
"os"
"os/signal"
"strings"
"github.com/jacobsa/go-serial/serial"
"github.com/zserge/lorca"
// "golang.org/x/text/encoding/simplifiedchinese"
)
func dis() string {
return "hello world!"
}
var defaultCom io.ReadWriteCloser
var hexEnable string
func hexRecieveSet(b string) {
log.Println("get hex opt", b)
hexEnable = b
}
func New(opt serial.OpenOptions) bool {
var err error
log.Println(opt)
opt.MinimumReadSize = 4
defaultCom, err = serial.Open(opt)
if err != nil {
log.Println(err)
return false
}
log.Println("serila is opened")
return true
}
func closeSerial() bool {
if err := defaultCom.Close(); err != nil {
return false
} else {
return true
}
}
type sdata struct {
Type byte
Data string
}
func send(data sdata) {
log.Println(data)
var bdata []byte
if data.Type == 1 { //16进制
str := strings.Replace(data.Data, " ", "", -1)
var err error
bdata, err = hex.DecodeString(str)
if err != nil {
log.Println(err)
return
}
} else {
bdata = []byte(data.Data)
}
if _, err := defaultCom.Write(bdata); err != nil {
log.Println(err)
return
}
}
//字符串每隔N个字符用某个字符串分割
func SpliteN(src string, sep string, n int) (des string) {
if len(src) == 0 {
return ""
}
tempN := len(src) / n
tempN2 := len(src) % n
temp := make([]string, tempN+1)
if tempN == 0 {
return src
}
var temp2 = make([]string, 0)
for k, _ := range temp {
if k == tempN {
temp2 = append(temp2, src[n*k:(n*k+tempN2)])
temp2 = append(temp2, sep)
break
}
temp2 = append(temp2, src[n*k:(n*k+n)])
temp2 = append(temp2, sep)
}
for _, v := range temp2 {
des += v
}
return des
}
func recieve(ui lorca.UI) {
for {
data := make([]byte, 1024)
if defaultCom == nil {
continue
}
n, err := defaultCom.Read(data)
if err != nil {
log.Println(err)
continue
}
if n > 0 {
log.Println(data[:n])
// bs, _ := simplifiedchinese.GBK.NewDecoder().Bytes(data[:n])
tdata := string(data[:n])
log.Println(tdata)
if hexEnable == "true" {
tdata = hex.EncodeToString(data[:n])
tdata = SpliteN(tdata, " ", 2)
}
// ui.Eval(`document.getElementById('receiverText').value=isdhkj`)
log.Println(fmt.Sprintf(`document.getElementById('receiverText').value =%v`, tdata))
ui.Eval(fmt.Sprintf(`document.getElementById('receiverText').value =
document.getElementById('receiverText').value+'%s'`, tdata))
}
}
}
func main() {
ui, err := lorca.New("", "", 1000, 700)
if err != nil {
log.Fatal(err)
}
defer ui.Close()
// A simple way to know when UI is ready (uses body.onload even in JS)
ui.Bind("start", func() {
log.Println("UI is ready")
})
ui.Bind("testdis", dis)
ui.Bind("openSerial", New)
ui.Bind("closeSerial", closeSerial)
ui.Bind("send", send)
ui.Bind("hexRecieveSet", hexRecieveSet)
// Load HTML.
// You may also use `data:text/html,<base64>` approach to load initial HTML,
// e.g: ui.Load("data:text/html," + url.PathEscape(html))
ln, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
log.Fatal(err)
}
defer ln.Close()
go http.Serve(ln, http.FileServer(FS))
ui.Load(fmt.Sprintf("http://%s", ln.Addr()))
go recieve(ui)
// You may use console.log to debug your JS code, it will be printed via
// log.Println(). Also exceptions are printed in a similar manner.
// ui.Eval(`
// console.log("Hello, world!");
// console.log('Multiple values:', [1, false, {"x":5}]);
// `)
// Wait until the interrupt signal arrives or browser window is closed
sigc := make(chan os.Signal)
signal.Notify(sigc, os.Interrupt)
select {
case <-sigc:
case <-ui.Done():
}
log.Println("exiting...")
}