1+ package main
2+
3+ import (
4+ "github.com/pkg/term"
5+ "encoding/binary"
6+ "fmt"
7+ "time"
8+ )
9+
10+ var serial * term.Term
11+
12+ type packetStruct struct {
13+ Voltage uint16
14+ Current int16
15+ Power int32
16+ Amphour uint32
17+ Watthour uint32
18+ }
19+
20+ var average struct {
21+ voltage , current , power float64
22+ count uint16
23+ beginning time.Time
24+ }
25+
26+ var correctHeader = [... ]byte {170 , 28 , 1 , 42 }
27+ var buffer [4 ]byte
28+
29+ func main () {
30+ var err error
31+ serial , err := term .Open ("/dev/cuaU0" , term .Speed (57600 ), term .RawMode )
32+
33+ if err != nil {
34+ serial , err = term .Open ("/dev/cuaU1" , term .Speed (57600 ), term .RawMode )
35+ }
36+ if err != nil {
37+ panic (err )
38+ }
39+ serial .SetReadTimeout (time .Duration (time .Minute ))
40+ average .beginning = time .Now ()
41+
42+ var toRead byte
43+ for {
44+ err := binary .Read (serial , binary .BigEndian , & toRead )
45+ if err != nil {
46+ panic (err )
47+ }
48+
49+ buffer [3 ] = toRead
50+ if buffer == correctHeader {
51+ var packet packetStruct
52+ err := binary .Read (serial , binary .BigEndian , & packet )
53+ if err != nil {
54+ panic (err )
55+ }
56+ printPacket (& packet )
57+ buffer = [... ]byte {0 , 0 , 0 , 0 }
58+
59+ } else {
60+ buffer [0 ] = buffer [1 ]
61+ buffer [1 ] = buffer [2 ]
62+ buffer [2 ] = buffer [3 ]
63+ }
64+ }
65+ }
66+
67+ func printPacket (packet * packetStruct ) {
68+ if time .Now ().Sub (average .beginning ) <= time .Second { // Add to average
69+ average .voltage += float64 (packet .Voltage ) / 100
70+ average .current += float64 (packet .Current ) / 100
71+ average .power += float64 (packet .Power ) / 1000
72+ average .count ++
73+ } else {
74+ fmt .Printf ("%d %.3f %.2f %.2f\n " , time .Now ().Unix (), average .voltage / float64 (average .count ), average .current / float64 (average .count ), average .power / float64 (average .count ))
75+ average .voltage = 0
76+ average .current = 0
77+ average .power = 0
78+ average .count = 0
79+ average .beginning = time .Now ()
80+ }
81+ }
0 commit comments