/
main.go
74 lines (67 loc) · 1.64 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
package main
import (
"fmt"
"machine"
"time"
"tinygo.org/x/drivers/p1am"
)
func main() {
for {
if err := loop(); err != nil {
fmt.Printf("loop failed, retrying: %v\n", err)
time.Sleep(500 * time.Millisecond)
}
}
}
func loop() error {
led := machine.LED
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
sw := machine.SWITCH
sw.Configure(machine.PinConfig{Mode: machine.PinInput})
if err := p1am.Controller.Initialize(); err != nil {
return fmt.Errorf("initializing controller: %w", err)
}
version, err := p1am.Controller.Version()
if err != nil {
return fmt.Errorf("fetching base controller version: %w", err)
}
fmt.Printf("Base controller version: %d.%d.%d\n", version[0], version[1], version[2])
for i := 1; i <= p1am.Controller.Slots; i++ {
slot := p1am.Controller.Slot(i)
fmt.Printf("Slot %d: ID 0x%08x, Props %+v\n", i, slot.ID, slot.Props)
}
slot1 := p1am.Controller.Slot(1)
var lastInput uint32
state := sw.Get()
for {
if active, err := p1am.Controller.Active(); err != nil || !active {
return fmt.Errorf("controller active %v: %v", active, err)
}
if state != sw.Get() {
state = sw.Get()
fmt.Printf("New switch state: %v\n", state)
if slot1.Props.DO > 0 {
if err := slot1.Channel(1).WriteDiscrete(state); err != nil {
return err
}
}
}
if slot1.Props.DI > 0 {
sstate, err := slot1.ReadDiscrete()
if err != nil {
return fmt.Errorf("reading slot: %w", err)
}
if sstate != lastInput {
lastInput = sstate
fmt.Printf("new DI state: %#b\n", sstate)
}
}
if state {
led.High()
} else {
led.Low()
}
time.Sleep(time.Millisecond * 10)
}
return nil
}