-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtriggers.go
More file actions
91 lines (80 loc) · 2.4 KB
/
triggers.go
File metadata and controls
91 lines (80 loc) · 2.4 KB
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
package main
import (
"time"
"trigger-queue/sensors"
log "github.com/sirupsen/logrus"
)
type Trigger func(interface{}) (bool, error)
func compareValHelper(getVal func() (float64, error), compare func(float64, float64) bool) Trigger {
return func(val interface{}) (bool, error) {
sensorVal, err := getVal()
if err != nil {
log.Error("Error getting value from sensor")
log.Error(err)
return false, err
}
return compare(sensorVal, val.(float64)), nil
}
}
func compareSensorReading(t string, getVal func() (float64, error)) Trigger {
// May need to modify for IEEE 737 float issues
// https://floating-point-gui.de/errors/comparison/#look-out-for-edge-cases
switch t {
case ">":
return compareValHelper(getVal, func(f float64, f2 float64) bool {
return f > f2
})
case ">=":
return compareValHelper(getVal, func(f float64, f2 float64) bool {
return f >= f2
})
case "<":
return compareValHelper(getVal, func(f float64, f2 float64) bool {
return f < f2
})
case "<=":
return compareValHelper(getVal, func(f float64, f2 float64) bool {
return f <= f2
})
case "==":
return compareValHelper(getVal, func(f float64, f2 float64) bool {
return f == f2
})
default:
return func(val interface{}) (bool, error) {
return true, nil
}
}
}
func timer(val interface{}) (bool, error) {
t, err := time.Parse(time.RFC3339, val.(string))
if err != nil {
log.Error(err)
return false, err
}
loc, _ := time.LoadLocation("UTC")
return time.Now().In(loc).After(t), nil
}
func tempComparisonHelper(t string, thermometer *sensors.Thermometer) Trigger {
return compareSensorReading(t, thermometer.GetTemp)
}
func weightComparisonHelper(t string, scale *sensors.Scale) Trigger {
return compareSensorReading(t, scale.GetWeight)
}
func pass(interface{}) (bool, error) {
return false, nil
}
var Triggers = map[string]Trigger{
"pass": pass,
"timer": timer,
"temp_>": tempComparisonHelper(">", Thermometer),
"temp_>=": tempComparisonHelper(">=", Thermometer),
"temp_<": tempComparisonHelper("<", Thermometer),
"temp_<=": tempComparisonHelper("<=", Thermometer),
"temp_==": tempComparisonHelper("==", Thermometer),
"weight_>": weightComparisonHelper(">", Scale),
"weight_>=": weightComparisonHelper(">=", Scale),
"weight_<": weightComparisonHelper("<", Scale),
"weight_<=": weightComparisonHelper("<=", Scale),
"weight_==": weightComparisonHelper("==", Scale),
}