GPS Library  0.1
GPS driver and NMEA parser
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros
NMEAInterpreter.cpp
Go to the documentation of this file.
1 #include "NMEAInterpreter.h"
2 #include <GPS/Interpreter/NMEA/I_NMEAMessage.h>
3 #include <GPS/I_GPSHandler.h>
4 
5 #include <ctype.h>
6 
7 static NMEAInterpreter NMEA_instance; // the interpreter itself
8 
9 bool NMEAInterpreter::GotData(char data, I_GPSDriver * driver)
10 {
11  NextState(data);
12 
13  if (state == Acknowledged) {
14  GotMessage(driver);
15  Seek();
16  }
17 
18  return true;
19 }
20 
22 {
23  I_NMEAMessage::GotMessage(parameters, param, Auton<I_GPSHandler>()->GetGPSData(), driver);
24 }
25 
27 {
28  NextState(data);
29 
30  switch (state) {
31  case Acknowledged:
32  return true;
33  break;
34  }
35 
36  return false;
37 }
38 
40 {
42  Seek();
43  return;
44  }
45 
46  switch (data) {
47  case '$':
48  // This is the possible start of a message:
50  param = 1;
51  checksum = 0;
52  state = InProgress;
53  break;
54  case '*':
55  if (state == InProgress) {
56  *write_data++ = '\0';
57  state = Checksum_1;
58  }
59  break;
60  case ',':
61  if (state == InProgress) {
62  *write_data++ = '\0';
64  checksum ^= data;
65  }
66  break;
67  default:
68  switch (state) {
69  case InProgress:
70  *write_data++ = data;
71  checksum ^= data;
72  break;
73  case Checksum_1:
74  {
75  int value = HexConvert(data);
76  if (value < 0) {
77  Seek();
78  } else {
79  sum_received = (value & 0x0f) << 4;
80  state = Checksum_2;
81  }
82  }
83  break;
84  case Checksum_2:
85  {
86  int value = HexConvert(data);
87  if (value >= 0) {
88  sum_received |= value & 0x0f;
89  if (sum_received == checksum) {
91  return;
92  }
93  }
94  Seek();
95  }
96  break;
97  }
98  break;
99  }
100 }
101 
103 {
104  if (isdigit(ch))
105  return ch & 0x0f;
106  if (islower(ch))
107  ch -= 'a'-'A';
108  if (ch >= 'A' && ch <= 'F')
109  return (ch & 0x0f) + 9;
110  return -1;
111 }
112 
113 /* * * * * * * * * * * * * End - of - File * * * * * * * * * * * * * * */