-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathactivity.go
148 lines (114 loc) · 2.77 KB
/
activity.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
package gpio
import (
"errors"
"fmt"
"strings"
"github.com/project-flogo/core/activity"
"github.com/project-flogo/core/data/coerce"
"github.com/project-flogo/core/data/metadata"
"github.com/stianeikeland/go-rpio/v4"
)
// log is the default package logger
const (
setState = "Set State"
readState = "Read State"
pull = "Pull"
in = "Input"
high = "High"
//low = "Low"
direction = "Direction"
up = "Up"
down = "Down"
//off = "off"
//ouput
result = "result"
)
func init() {
_ = activity.Register(&Activity{}, New)
}
type Activity struct {
settings *Settings
}
var activityMd = activity.ToMetadata(&Settings{}, &Input{}, &Output{})
func New(ctx activity.InitContext) (activity.Activity, error) {
s := &Settings{}
err := metadata.MapToStruct(ctx.Settings(), s, true)
if err != nil {
return nil, err
}
return &Activity{settings: s}, nil
}
func (a *Activity) Metadata() *activity.Metadata {
return activityMd
}
// Eval implements api.Activity.Eval - Invokes a REST Operation
func (a *Activity) Eval(ctx activity.Context) (done bool, err error) {
log := ctx.Logger()
//getmethod
log.Debug("Running gpio activity.")
input := &Input{}
err = ctx.GetInputObject(input)
if err != nil {
return true, err
}
if input == nil {
return true, errors.New("Input Not Set")
}
out := &Output{}
//Open pin
openErr := rpio.Open()
defer rpio.Close()
if openErr != nil {
log.Errorf("Open RPIO error: %+v", openErr.Error())
return true, errors.New("Open RPIO error: " + openErr.Error())
}
pin := rpio.Pin(a.settings.PinNumber)
switch a.settings.Method {
case direction:
if strings.EqualFold(in, input.Direction) {
log.Debugf("Set pin %d direction to input", pin)
pin.Input()
} else {
log.Debugf("Set pin %d direction to output", pin)
pin.Output()
}
case setState:
if strings.EqualFold(high, input.State) {
log.Debugf("Set pin %d state to High", pin)
pin.High()
} else {
log.Debugf("Set pin %d state to low", pin)
pin.Low()
}
case readState:
log.Debugf("Read pin %d state..", pin)
state := pin.Read()
log.Debugf("Read state and state: %s", state)
out.Result, err = coerce.ToInt(state)
if err != nil {
return false, err
}
err = ctx.SetOutputObject(out)
if err != nil {
return false, err
}
return true, nil
case pull:
if strings.EqualFold(up, input.Pull) {
log.Debugf("Pull pin %d to Up", pin)
pin.PullUp()
} else if strings.EqualFold(down, input.Pull) {
log.Debugf("Pull pin %d to Down", pin)
pin.PullDown()
} else {
log.Debugf("Pull pin %d to Up", pin)
pin.PullOff()
}
default:
log.Errorf("Cannot find method %s ", a.settings.Method)
return true, fmt.Errorf("Cannot find method %s", a.settings.Method)
}
out.Result = 0
err = ctx.SetOutputObject(out)
return true, nil
}