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 | } |
|