Skip to content
This repository was archived by the owner on Mar 19, 2021. It is now read-only.

Commit f6087a9

Browse files
committed
add tick
1 parent 0646fe0 commit f6087a9

File tree

4 files changed

+93
-53
lines changed

4 files changed

+93
-53
lines changed

DataPack/DataPack.go

+9
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ const (
1414
ACT_WRITERETURN
1515
)
1616

17+
const (
18+
_ = iota
19+
BOARD_1
20+
BOARD_2
21+
BOARD_3
22+
)
23+
1724
var TypeLen = map[string]int{
1825
"uint8_t": 1,
1926
"uint16_t": 2,
@@ -34,6 +41,7 @@ type VariableT struct {
3441
Type string
3542
Addr uint32
3643
Data float64
44+
Tick uint32
3745
}
3846

3947
type jsonCurrentVariablesT struct {
@@ -47,6 +55,7 @@ type DataToChartT struct {
4755
Board uint8
4856
Name string
4957
Data float64
58+
Tick uint32
5059
}
5160

5261
type DataToChart struct {

SerialHandle/SerialHandle.go

+81-51
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func SerialSend(data []byte) error {
7373
}
7474

7575
func SerialReceive() ([]byte, error) {
76-
buff := make([]byte, 160)
76+
buff := make([]byte, 200)
7777
n, err := MySerialPort.Read(buff)
7878
if err != nil {
7979
return nil, err
@@ -103,62 +103,92 @@ func SerialSendCmd(act uint8, variable datapack.VariableT) error {
103103
return errors.New("No serial port")
104104
}
105105

106-
func SerialParse(jsonString chan string) {
107-
var b []byte
106+
func verifyBuff(buff []byte) (int, []byte) {
107+
log.Println(buff)
108+
if len(buff) < 19 {
109+
log.Println("Data pack too short")
110+
return 0, nil
111+
}
112+
if buff[0] == datapack.BOARD_1 && buff[1] == datapack.ACT_SUBSCRIBERETURN && len(buff)%20 == 0 {
113+
return len(buff) / 20, buff
114+
}
115+
b1 := buff[:]
116+
b2 := buff[:]
117+
for i, v := range buff {
118+
if v == datapack.BOARD_1 && len(buff[i:]) > 19 && buff[i+1] == datapack.ACT_SUBSCRIBERETURN {
119+
b1 = b1[i:]
120+
break
121+
}
122+
}
123+
for i := len(b1) - 1; i > 18; i-- {
124+
if b1[i] == 10 {
125+
b2 = b1[:i+1]
126+
if len(b2)%20 == 0 {
127+
log.Println("Get!")
128+
return len(b2) / 20, b2
129+
}
130+
b2 = b1[:]
131+
}
132+
}
133+
log.Println("Cannot verify data pack")
134+
return 0, nil
135+
}
136+
137+
func praseBuff(raw []byte) []byte {
138+
var chartPack datapack.DataToChart
139+
var chartData datapack.DataToChartT
140+
packNum, buff := verifyBuff(raw)
141+
for i := 0; i < packNum; i++ {
142+
chartData.Board = buff[i*20]
143+
chartData.Tick = datapack.BytesToUint32(buff[i*20+15 : i*20+19])
144+
addr := datapack.BytesToUint32(buff[i*20+3 : i*20+7])
145+
for _, v := range datapack.CurrentVariables.Variables {
146+
if v.Addr == addr {
147+
chartData.Name = v.Name
148+
switch v.Type {
149+
case "uint8_t":
150+
chartData.Data = float64(datapack.BytesToUint8(buff[i*20+7 : i*20+15]))
151+
case "uint20_t":
152+
chartData.Data = float64(datapack.BytesToUint16(buff[i*20+7 : i*20+15]))
153+
case "uint32_t":
154+
chartData.Data = float64(datapack.BytesToUint32(buff[i*20+7 : i*20+15]))
155+
case "uint64_t":
156+
chartData.Data = float64(datapack.BytesToUint64(buff[i*20+7 : i*20+15]))
157+
case "int8_t":
158+
chartData.Data = float64(datapack.BytesToInt8(buff[i*20+7 : i*20+15]))
159+
case "int20_t":
160+
chartData.Data = float64(datapack.BytesToInt16(buff[i*20+7 : i*20+15]))
161+
case "int32_t", "int":
162+
chartData.Data = float64(datapack.BytesToInt32(buff[i*20+7 : i*20+15]))
163+
case "int64_t":
164+
chartData.Data = float64(datapack.BytesToInt64(buff[i*20+7 : i*20+15]))
165+
case "float":
166+
chartData.Data = float64(datapack.BytesToFloat32(buff[i*20+7 : i*20+15]))
167+
case "double":
168+
chartData.Data = float64(datapack.BytesToFloat64(buff[i*20+7 : i*20+15]))
169+
default:
170+
chartData.Data = 0
171+
}
172+
}
173+
}
174+
chartPack.DataPack = append(chartPack.DataPack, chartData)
175+
b, err := json.Marshal(chartPack)
176+
if err != nil {
177+
log.Fatalln(err)
178+
}
179+
return b
180+
}
181+
return nil
182+
}
183+
184+
func SerialThread(jsonString chan string) {
108185
for {
109186
if MySerialPort != nil && CurrentSerialPort.Name != "" {
110-
var chartPack datapack.DataToChart
111-
var chartData datapack.DataToChartT
112187
buff, err := SerialReceive()
113188
if err != nil {
114189
log.Println("Fail: Can't receive serial data")
115190
}
116-
if len(buff)%16 != 0 {
117-
log.Println("Invalid data length")
118-
}
119-
packNum := len(buff) / 16
120-
for i := 0; i < packNum; i++ {
121-
if buff[i*16+1] == datapack.ACT_SUBSCRIBERETURN {
122-
chartData.Board = buff[i*16]
123-
addr := datapack.BytesToUint32(buff[i*16+3 : i*16+7])
124-
for _, v := range datapack.CurrentVariables.Variables {
125-
if v.Addr == addr {
126-
chartData.Name = v.Name
127-
switch v.Type {
128-
case "uint8_t":
129-
chartData.Data = float64(datapack.BytesToUint8(buff[i*16+7 : i*16+15]))
130-
case "uint16_t":
131-
chartData.Data = float64(datapack.BytesToUint16(buff[i*16+7 : i*16+15]))
132-
case "uint32_t":
133-
chartData.Data = float64(datapack.BytesToUint32(buff[i*16+7 : i*16+15]))
134-
case "uint64_t":
135-
chartData.Data = float64(datapack.BytesToUint64(buff[i*16+7 : i*16+15]))
136-
case "int8_t":
137-
chartData.Data = float64(datapack.BytesToInt8(buff[i*16+7 : i*16+15]))
138-
case "int16_t":
139-
chartData.Data = float64(datapack.BytesToInt16(buff[i*16+7 : i*16+15]))
140-
case "int32_t", "int":
141-
chartData.Data = float64(datapack.BytesToInt32(buff[i*16+7 : i*16+15]))
142-
case "int64_t":
143-
chartData.Data = float64(datapack.BytesToInt64(buff[i*16+7 : i*16+15]))
144-
case "float":
145-
chartData.Data = float64(datapack.BytesToFloat32(buff[i*16+7 : i*16+15]))
146-
case "double":
147-
chartData.Data = float64(datapack.BytesToFloat64(buff[i*16+7 : i*16+15]))
148-
default:
149-
chartData.Data = 0
150-
}
151-
}
152-
}
153-
chartPack.DataPack = append(chartPack.DataPack, chartData)
154-
b, err = json.Marshal(chartPack)
155-
if err != nil {
156-
log.Fatalln(err)
157-
}
158-
} else {
159-
log.Println("Invalid data pack")
160-
}
161-
}
191+
b := praseBuff(buff)
162192
jsonString <- string(b)
163193
}
164194
time.Sleep(9 * time.Millisecond)

WebHandle/HandleFunc.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ func fileVariablesWebHandler(w http.ResponseWriter, _ *http.Request) {
213213

214214
func Start() {
215215
jsonWS := make(chan string, 10)
216-
go serialhandle.SerialParse(jsonWS)
216+
go serialhandle.SerialThread(jsonWS)
217217
WebSocketHandler := makeWebSocketHandler(jsonWS)
218218
http.HandleFunc("/serial", currentSerialPortWebHandler)
219219
http.HandleFunc("/serial/list", listSerialPortsWebHandler)

WebPage/assets/js/websocket.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
window.addEventListener("load", function(evt) {
22
var ws;
3+
var tickoffset = 0;
34
$("#openWS").click (function(event){
45
if (ws) {
56
return false;
@@ -13,7 +14,7 @@ window.addEventListener("load", function(evt) {
1314
}
1415
ws.onmessage = function(evt) {
1516
var jsonWS = JSON.parse(evt.data);
16-
var l = chartData.length;
17+
l = tickoffset==0?jsonWS.DataPack[0].Tick:jsonWS.DataPack[0].Tick-tickoffset;
1718
var d = {'x':l,'y':jsonWS.DataPack[0].Data};
1819
chartData.push(d);
1920
chart.update();

0 commit comments

Comments
 (0)