History

discard initial garbage reads, reset properly on disconnect

Stephen Birarda committed 13 years ago

Commit 660630e1 parent d0203152 files · +24 −34Browse files

Showing the changes to interface/src/SerialInterface.cpp (1 of 2 files). Show all

Unified · Split

interface/src/SerialInterface.cpp+21−32
@@ -21,20 +21,14 @@ · 20 unmodified lines
2121 #include <regex.h>
2222 #endif
2323
24−
2524 int serial_fd;
2625 const int MAX_BUFFER = 255;
2726 char serial_buffer[MAX_BUFFER];
2827 int serial_buffer_pos = 0;
29−int samples_total = 0;
3028
3129 const int ZERO_OFFSET = 2048;
3230 const short NO_READ_MAXIMUM = 10;
33−
34−SerialInterface::SerialInterface() {
35− active = false;
36− noReadCount = 0;
37−}
31+const short SAMPLES_TO_DISCARD = 100;
3832
3933 void SerialInterface::pair() {
4034 // look for a matching gyro setup
@@ -99,20 +93,10 @@ int SerialInterface::init(char* portname, int baud) · 58 unmodified lines
9993 options.c_cflag &= ~CSIZE;
10094 options.c_cflag |= CS8;
10195 tcsetattr(serial_fd,TCSANOW,&options);
102−
103− // Clear the measured and average channel data
104− for (int i = 1; i < NUM_CHANNELS; i++)
105− {
106− lastMeasured[i] = 0;
107− trailingAverage[i] = 0.0;
108− }
109− // Clear serial input buffer
110− for (int i = 1; i < MAX_BUFFER; i++) {
111− serial_buffer[i] = ' ';
112− }
96+
11397
11498 printf("Serial interface opened!\n");
115−
99+ resetSerial();
116100 active = true;
117101
118102 return 0;
@@ -178,12 +162,10 @@ void SerialInterface::readData() { · 59 unmodified lines
178162 const float AVG_RATE[] = {0.01, 0.01, 0.01, 0.01, 0.01, 0.01};
179163 char bufchar[1];
180164
181− bool atLeastOneRead = false;
165+ int initialSamples = totalSamples;
182166
183167 while (read(serial_fd, &bufchar, 1) > 0)
184− {
185− atLeastOneRead = true;
186−
168+ {
187169 //std::cout << bufchar[0];
188170 serial_buffer[serial_buffer_pos] = bufchar[0];
189171 serial_buffer_pos++;
@@ -205,41 +187,48 @@ void SerialInterface::readData() { · 15 unmodified lines
205187 } else LED = atoi(serialLine.c_str());
206188 serialLine = serialLine.substr(spot+1, serialLine.length() - spot - 1);
207189 }
208− //std::cout << LED << "\n";
209190
210191 for (int i = 0; i < NUM_CHANNELS; i++) {
211− if (samples_total > 0)
192+ if (totalSamples > SAMPLES_TO_DISCARD) {
212193 trailingAverage[i] = (1.f - AVG_RATE[i])*trailingAverage[i] +
213− AVG_RATE[i]*(float)lastMeasured[i];
214− else trailingAverage[i] = (float)lastMeasured[i];
194+ AVG_RATE[i]*(float)lastMeasured[i];
195+ } else {
196+ trailingAverage[i] = (float)lastMeasured[i];
197+ }
215198
216199 }
217− samples_total++;
200+ totalSamples++;
218201 serial_buffer_pos = 0;
219202 }
220203 }
221204
222− if (!atLeastOneRead) {
205+ if (initialSamples == totalSamples) {
223206 noReadCount++;
224207 std::cout << "#" << noReadCount << " blank read from serial.\n";
208+
225209 if (noReadCount >= NO_READ_MAXIMUM) {
226− disconnectSerial();
210+ resetSerial();
227211 }
228212 }
229213 }
230214
231−void SerialInterface::disconnectSerial() {
215+void SerialInterface::resetSerial() {
232216 std::cout << "Reached maximum blank read count. Shutting down serial.\n";
233217
234218 active = false;
235219 noReadCount = 0;
220+ totalSamples = 0;
236221
237222 // Clear the measured and average channel data
238− for (int i = 1; i < NUM_CHANNELS; i++)
223+ for (int i = 0; i < NUM_CHANNELS; i++)
239224 {
240225 lastMeasured[i] = 0;
241226 trailingAverage[i] = 0.0;
242227 }
228+ // Clear serial input buffer
229+ for (int i = 1; i < MAX_BUFFER; i++) {
230+ serial_buffer[i] = ' ';
231+ }
243232 }
244233
245234