Rev 1 | Rev 3 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1 | Rev 2 | ||
---|---|---|---|
Line 15... | Line 15... | ||
15 | #include "libSerial/serial.h" |
15 | #include "libSerial/serial.h" |
16 | 16 | ||
17 | char linebuff[80]; |
17 | char linebuff[80]; |
18 | unsigned linePos = 0; |
18 | unsigned linePos = 0; |
19 | 19 | ||
- | 20 | nmeaCallback rmcCallback = NULL; |
|
- | 21 | ||
20 | typedef enum |
22 | typedef enum |
21 | { |
23 | { |
22 | SEARCH, READING |
24 | SEARCH, READING |
23 | } NmeaState_t; |
25 | } NmeaState_t; |
24 | 26 | ||
Line 37... | Line 39... | ||
37 | 39 | ||
38 | char c = GetCharSerial (uc); |
40 | char c = GetCharSerial (uc); |
39 | switch (lineState) |
41 | switch (lineState) |
40 | { |
42 | { |
41 | case SEARCH: |
43 | case SEARCH: |
42 | if (c == '$') |
44 | if (c != '$') |
43 | lineState = READING; |
- | |
44 | linePos = 0; |
- | |
45 | break; |
45 | break; |
- | 46 | lineState = READING; |
|
- | 47 | linePos = 0; |
|
46 | case READING: |
48 | case READING: |
47 | if (c == '\r') |
49 | if (c == '\r') |
48 | { |
50 | { |
49 | // handle the read code |
51 | // handle the read code |
50 | bool success = decodePacket (linebuff, linePos, loc); |
52 | bool success = decodePacket (linebuff, linePos, loc); |
Line 62... | Line 64... | ||
62 | int i; |
64 | int i; |
63 | 65 | ||
64 | for (i = 0; i < linePos; i++) |
66 | for (i = 0; i < linePos; i++) |
65 | if (linebuff[i] == '$') |
67 | if (linebuff[i] == '$') |
66 | { |
68 | { |
67 | int n = i + 1; |
- | |
68 | memcpy (linebuff, linebuff + n, linePos - i); |
69 | memcpy (linebuff, linebuff + i, linePos - i); |
69 | linePos = linePos - i; |
70 | linePos = 1; |
70 | linebuff[linePos++] = c; |
71 | linebuff[linePos++] = c; |
71 | lineState = READING; |
72 | lineState = READING; |
72 | } |
73 | } |
73 | 74 | ||
74 | if (lineState == SEARCH) |
75 | if (lineState == SEARCH) |
Line 154... | Line 155... | ||
154 | } |
155 | } |
155 | 156 | ||
156 | bool |
157 | bool |
157 | decodePacket (char *linebuff, int linePos, Location *loc) |
158 | decodePacket (char *linebuff, int linePos, Location *loc) |
158 | { |
159 | { |
- | 160 | ||
159 | uint8_t checksum = 0; |
161 | uint8_t checksum = 0; |
160 | for (int i = 0; i < linePos - 3; i++) |
162 | for (int i = 1; i < linePos - 3; i++) |
161 | checksum ^= linebuff[i]; |
163 | checksum ^= linebuff[i]; |
162 | uint8_t givenSum = (decodeHex (linebuff[linePos - 2]) << 4) |
164 | uint8_t givenSum = (decodeHex (linebuff[linePos - 2]) << 4) |
163 | + decodeHex (linebuff[linePos - 1]); |
165 | + decodeHex (linebuff[linePos - 1]); |
164 | if (givenSum != checksum) |
166 | if (givenSum != checksum) |
165 | return false; |
167 | return false; |
166 | 168 | ||
167 | char *fieldPos[20]; |
169 | char *fieldPos[20]; |
168 | int fieldCnt = 0; |
170 | int fieldCnt = 0; |
169 | // split fields |
171 | // split fields |
170 | for (int i = 5; i < linePos - 3; i++) |
172 | for (int i = 6; i < linePos - 3; i++) |
171 | { |
173 | { |
172 | if (linebuff[i] == ',') |
174 | if (linebuff[i] == ',') |
173 | { |
175 | { |
174 | fieldPos[fieldCnt++] = linebuff + i + 1; |
176 | fieldPos[fieldCnt++] = linebuff + i + 1; |
175 | } |
177 | } |
176 | 178 | ||
177 | } |
179 | } |
178 | 180 | ||
179 | // decode RMC |
181 | // decode RMC |
180 | if (linebuff[2] == 'R' && linebuff[3] == 'M' && linebuff[4] == 'C') |
182 | if (linebuff[3] == 'R' && linebuff[4] == 'M' && linebuff[5] == 'C') |
181 | 183 | ||
182 | { |
184 | { |
- | 185 | ||
- | 186 | ||
183 | // decode the fields |
187 | // decode the fields |
184 | loc->valid = *fieldPos[1]; |
188 | loc->valid = *fieldPos[1]; |
185 | if (loc->valid == 'A') |
189 | if (loc->valid == 'A') |
186 | { |
190 | { |
187 | memcpy (loc->time, fieldPos[0], 6); |
191 | memcpy (loc->time, fieldPos[0], 6); |
Line 204... | Line 208... | ||
204 | loc->tv.tm_isdst = 0; |
208 | loc->tv.tm_isdst = 0; |
205 | loc->utc = mktime (&loc->tv); |
209 | loc->utc = mktime (&loc->tv); |
206 | 210 | ||
207 | loc->good = true; |
211 | loc->good = true; |
208 | } |
212 | } |
- | 213 | if (rmcCallback) |
|
- | 214 | { |
|
- | 215 | linebuff[linePos++]='\r'; |
|
- | 216 | linebuff[linePos++]='\n'; |
|
- | 217 | rmcCallback ((uint8_t*) linebuff, linePos); |
|
- | 218 | } |
|
209 | } |
219 | } |
- | 220 | ||
210 | return true; |
221 | return true; |
211 | } |
222 | } |
- | 223 | ||
- | 224 | void |
|
- | 225 | setRmcCallback (nmeaCallback callback) |
|
- | 226 | { |
|
- | 227 | rmcCallback = callback; |
|
- | 228 | } |