-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathstatus.cpp
136 lines (114 loc) · 1.95 KB
/
status.cpp
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
#include "status.h"
#include "debug.h"
InverterStatus::InverterStatus() {
temp = 0;
vpv = 0;
iac = 0;
vac = 0;
fac = 0;
pac = 0;
zac = 0;
etoday = 0;
etotal = 0;
htotal = 0;
mode = 0;
error = 0;
err_gv = 0;
err_gf = 0;
err_gz = 0;
err_temp = 0;
err_pv1 = 0;
err_gfc1 = 0;
layoutLen = 0;
}
void interpretData(InverterStatus& status, uint8_t* data, uint8_t dataLen) {
uint8_t* le = status.layout + status.layoutLen;
uint8_t* de = data + dataLen;
uint8_t* l = status.layout;
while (l < le && data < de) {
uint16_t value = *data << 8 | *(data + 1);
uint16_t code = *l;
bool b = status.parseLayoutElement(code, value);
#if SUNEZY_DEBUG
if (!b) {
Serial.print("@");
Serial.print(__func__);
Serial.print("\t");
Serial.print("unknown code: 0x");
Serial.print(code, HEX);
Serial.print(" value: ");
Serial.println(value);
}
#endif
l += 1;
data += 2;
}
}
bool InverterStatus::parseLayoutElement(uint16_t code, uint16_t value) {
switch (code)
{
case 0x00:
temp = value;
break;
case 0x0d:
etoday = value;
break;
case 0x40:
vpv = value;
break;
case 0x41:
iac = value;
break;
case 0x42:
vac = value;
break;
case 0x43:
fac = value;
break;
case 0x44:
pac = value;
break;
case 0x45:
zac = value;
break;
case 0x47: //ETOTALH
etotal = value << 8;
break;
case 0x48: //ETOTALL
etotal += value;
break;
case 0x49: //HTOTALH
htotal = value << 8;
break;
case 0x4a: //HTOTALL
htotal += value;
break;
case 0x4c:
mode = value;
break;
case 0x78:
err_gv = value;
break;
case 0x79:
err_gf = value;
break;
case 0x7a:
err_gz = value;
break;
case 0x7b:
err_temp = value;
break;
case 0x7c:
err_pv1 = value;
break;
case 0x7d:
err_gfc1 = value;
break;
case 0x7e:
error = value;
break;
default:
return false;
}
return true;
}