forked from adafruit/Adafruit_GP8403
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path03_nvm_persistence.ino
More file actions
154 lines (126 loc) · 3.96 KB
/
Copy path03_nvm_persistence.ino
File metadata and controls
154 lines (126 loc) · 3.96 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
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
149
150
151
152
153
154
/*
* GP8403 NVM Persistence Hardware Test
*
* Saves 1 V / 2 V, verifies restoration, saves zero, and verifies zero after
* a second complete power cycle.
*/
#include <Adafruit_GP8403.h>
Adafruit_GP8403 gp8403;
void setup() {
Serial.begin(115200);
Serial.println(F("GP8403 NVM persistence hardware test"));
// The 2:1 dividers map 0-1023 ADC counts to 0-10 V at the outputs.
float a0Volts = map(readADC(A0, 32), 0, 1023, 0, 10000) / 1000.0;
float a1Volts = map(readADC(A1, 32), 0, 1023, 0, 10000) / 1000.0;
Serial.print(F("POWER_UP A0="));
Serial.print(a0Volts, 3);
Serial.print(F(" V A1="));
Serial.print(a1Volts, 3);
Serial.println(F(" V"));
char command = waitForCommand();
if (command == 'S') {
Serial.println(F("Save command received"));
if (!gp8403.begin()) {
halt(F("SAVE FAIL: begin"));
}
Serial.println(F("Begin succeeded"));
if (!gp8403.setVoltages(1.0, 2.0)) {
clearOutputsAndHalt(F("SAVE FAIL: set 1 V / 2 V"));
}
Serial.println(F("Set 1 V / 2 V succeeded"));
delay(10);
a0Volts = map(readADC(A0, 32), 0, 1023, 0, 10000) / 1000.0;
a1Volts = map(readADC(A1, 32), 0, 1023, 0, 10000) / 1000.0;
Serial.print(F("A0="));
Serial.print(a0Volts, 3);
Serial.print(F(" V A1="));
Serial.print(a1Volts, 3);
Serial.println(F(" V"));
if (abs(a0Volts - 1.0) > 0.25 || abs(a1Volts - 2.0) > 0.25) {
clearOutputsAndHalt(F("SAVE FAIL: 1 V / 2 V readings"));
}
Serial.println(F("1 V / 2 V readings succeeded"));
if (!saveNVM()) {
clearOutputsAndHalt(F("SAVE FAIL: NVM write"));
}
Serial.println(F("NVM write succeeded"));
if (!gp8403.setVoltages(0.0, 0.0)) {
clearOutputsAndHalt(F("SAVE FAIL: clear outputs"));
}
Serial.println(F("Clear outputs succeeded"));
clearOutputsAndHalt(F("SAVE PASS - POWER CYCLE"));
} else if (command == 'Z') {
Serial.println(F("Restore command received"));
if (!gp8403.begin()) {
halt(F("RESTORE FAIL: begin"));
}
Serial.println(F("Begin succeeded"));
if (abs(a0Volts - 1.0) > 0.25 || abs(a1Volts - 2.0) > 0.25) {
clearOutputsAndHalt(F("RESTORE FAIL: 1 V / 2 V readings"));
}
Serial.println(F("1 V / 2 V readings succeeded"));
if (!saveNVM()) {
clearOutputsAndHalt(F("RESTORE FAIL: save zero"));
}
Serial.println(F("Save zero succeeded"));
if (!gp8403.setVoltages(1.0, 1.0)) {
clearOutputsAndHalt(F("RESTORE FAIL: set 1 V / 1 V"));
}
Serial.println(F("Set 1 V / 1 V succeeded"));
halt(F("RESTORE PASS - ZERO SAVED - POWER CYCLE"));
} else if (command == 'V') {
Serial.println(F("Verify zero command received"));
if (!gp8403.begin()) {
halt(F("ZERO RESTORE FAIL: begin"));
}
Serial.println(F("Begin succeeded"));
if (a0Volts > 0.2 || a1Volts > 0.2) {
clearOutputsAndHalt(F("ZERO RESTORE FAIL: readings"));
}
Serial.println(F("Zero readings succeeded"));
clearOutputsAndHalt(F("ZERO RESTORE PASS"));
} else {
if (!gp8403.begin()) {
halt(F("UNKNOWN COMMAND: could not reset outputs"));
}
Serial.println(F("Begin succeeded"));
clearOutputsAndHalt(F("UNKNOWN COMMAND"));
}
}
void loop() {}
uint16_t readADC(uint16_t pin, uint8_t samples) {
uint32_t total = 0;
for (uint8_t i = 0; i < samples; i++) {
total += analogRead(pin);
}
return total / samples;
}
char waitForCommand() {
Serial.println(F("S=save 1V/2V, Z=verify and save zero, V=verify zero"));
while (!Serial.available()) {
}
return Serial.read();
}
bool saveNVM() {
#ifndef ESP8266
Wire.end();
#endif
bool saved = gp8403.saveToNVM(SDA, SCL);
Wire.begin();
return saved;
}
void clearOutputsAndHalt(const __FlashStringHelper *message) {
Serial.println(message);
if (!gp8403.setVoltages(0.0, 0.0)) {
Serial.println(F("NVM FAIL: reset outputs"));
}
while (true) {
delay(1000);
}
}
void halt(const __FlashStringHelper *message) {
Serial.println(message);
while (true) {
delay(1000);
}
}