-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
140 lines (130 loc) · 2.93 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
package main
import (
"fmt"
"os"
"os/exec"
//"strings"
"bufio"
//"encoding/hex"
"myiot_hub/sensor"
"myiot_hub/sensor/recommendation"
"myiot_hub/web"
"time"
"strings"
)
var userstream DataStream
var Buffer *sensor.RotateBuffer
var steadystate bool
var cycle sensor.DryerCycle
var tag int
var Drying bool
var Max float64
type DataStream struct {
//s []Stats
username string
dryer string
}
//gatttool -b 20:91:48:4D:94:BC --char-write-req -a 0x0013 -n 0100 --listen
func main() {
for {
setup()
}
}
func setup() {
tag = 45
Max = 0
cmd := exec.Command("gatttool", "-b", "20:91:48:4D:94:BC", "--char-write-req", "-a", "0x0013", "-n", "0100", "--listen")
stdout, err := cmd.StdoutPipe()
if err != nil {
fmt.Println(err)
}
if err := cmd.Start(); err != nil {
fmt.Println(err)
}
fmt.Println("beginning setup")
/*file, _ := os.Open("sensor/large.txt")
defer file.Close()
*/
Reader := bufio.NewReader(stdout)
Buffer = sensor.NewRotateBuffer(10)
for {
s := make(chan bool, 1)
go func() {
Message, err := Reader.ReadString(10)
if err != nil {
if err.Error() == "EOF" {
fmt.Println("Please Check Sensor Connections")
web.FinishDryingCycle(fmt.Sprint(tag), "Please Check Dryer Connections")
os.Exit(1)
}
fmt.Println(err)
}
if !Drying {
Drying = true
web.CreateDryingCycle(fmt.Sprint(tag))
cycle = sensor.NewDryerCycle()
}
if ProcessReadings(Message) {
fmt.Println("Drying finished")
os.Exit(1)
}
s <- false
}()
go func() {
time.Sleep(20 * time.Second)
s <- true
}()
if <-s {
fmt.Println("Error communicating, retrying")
break
}
}
}
func ProcessReadings(data string) bool {
if strings.Contains(data, "characteristic"){
return false
}
data = sensor.TrimNonsense(data)
fmt.Println(data)
sensordata, new := sensor.ParseAdditionalData(data)
if new {
if sensordata.Temp() > 200 {
return false
}
if sensordata.Humidity() < 1 {
return false
}
fmt.Println(sensordata)
web.PostPoint(sensordata, fmt.Sprint(tag))
cycle.Data = append(cycle.Data, sensordata)
Buffer.Add(sensordata.Temp())
if Max < sensordata.Temp() {
Max = sensordata.Temp()
}
if Buffer.SlopeChange() {
if Buffer.Average() > 80 || steadystate {
steadystate = true
fmt.Println(Buffer.Average())
fmt.Println(Buffer.SampleNumber())
}
}
if steadystate && sensordata.Temp() < 55 {
Drying = false
message := recommendation.Recommend(cycle.Data, Max)
web.FinishDryingCycle(fmt.Sprint(tag), message)
time.Sleep(10*time.Second)
return true
}
}
/*
final_string := ""
s = strings.Replace(s, "\n","",-1)
s = strings.Replace(s, "Notification handle = 0x0012 value: ", "",-1)
s = strings.Replace(s, " " , "",-1)
s = strings.Replace(s, ";" , "",-1)
final_string = s
//fmt.Println(final_string)
decoded, _ := hex.DecodeString(final_string)
fmt.Println(string(decoded))*/
return false
}