User | Revision | Line number | New contents of line |
slisgrinder |
2:6f49c74ab3b9
|
1
|
#include "GPSParser.h"
|
slisgrinder |
1:e143afe9a7ea
|
2
|
|
slisgrinder |
3:d01d7593384d
|
3
|
GPSParser::GPSParser (PinName tx, PinName rx, int baud, int num_sentence, MODSERIAL &pc, PwmOut &indicator)
|
slisgrinder |
1:e143afe9a7ea
|
4
|
:
|
slisgrinder |
1:e143afe9a7ea
|
5
|
GLL (0),
|
slisgrinder |
1:e143afe9a7ea
|
6
|
RMC (0),
|
slisgrinder |
1:e143afe9a7ea
|
7
|
VTG (1),
|
slisgrinder |
1:e143afe9a7ea
|
8
|
GGA (1),
|
slisgrinder |
1:e143afe9a7ea
|
9
|
GSA (0),
|
slisgrinder |
1:e143afe9a7ea
|
10
|
GSV (0),
|
slisgrinder |
1:e143afe9a7ea
|
11
|
GRS (0),
|
slisgrinder |
1:e143afe9a7ea
|
12
|
GST (0),
|
slisgrinder |
1:e143afe9a7ea
|
13
|
MALM (0),
|
slisgrinder |
1:e143afe9a7ea
|
14
|
MEPH (0),
|
slisgrinder |
1:e143afe9a7ea
|
15
|
MDGP (0),
|
slisgrinder |
1:e143afe9a7ea
|
16
|
MDBG (0),
|
slisgrinder |
1:e143afe9a7ea
|
17
|
ZDA (0),
|
slisgrinder |
1:e143afe9a7ea
|
18
|
MCHN (0),
|
slisgrinder |
1:e143afe9a7ea
|
19
|
num_sentences (num_sentence),
|
slisgrinder |
1:e143afe9a7ea
|
20
|
baudrate (baud),
|
slisgrinder |
1:e143afe9a7ea
|
21
|
ctr (0),
|
slisgrinder |
1:e143afe9a7ea
|
22
|
gps (tx, rx),
|
slisgrinder |
3:d01d7593384d
|
23
|
pc (pc),
|
slisgrinder |
3:d01d7593384d
|
24
|
indicator (indicator)
|
slisgrinder |
1:e143afe9a7ea
|
25
|
{
|
slisgrinder |
1:e143afe9a7ea
|
26
|
pc.printf ("Initializing GPS...\r\n");
|
slisgrinder |
1:e143afe9a7ea
|
27
|
gps.baud (baudrate);
|
slisgrinder |
1:e143afe9a7ea
|
28
|
|
slisgrinder |
1:e143afe9a7ea
|
29
|
// BEGIN CONFIGURATION OF GPS use http://www.hhhh.org/wiml/proj/nmeaxor.html for checksum calculations...
|
slisgrinder |
1:e143afe9a7ea
|
30
|
gps.printf ("$PMTK313,1*2E\r\n"); //enable SBAS satellite searching
|
slisgrinder |
1:e143afe9a7ea
|
31
|
gps.printf ("$PMTK301,2*2E\r\n"); //set DGPS mode to WAAS
|
slisgrinder |
1:e143afe9a7ea
|
32
|
gps.printf ("$PMTK314,%d,%d,%d,%d,%d,%d,%d,%d,0,0,0,0,0,%d,%d,%d,%d,%d,%d*28\r\n", GLL, RMC, VTG, GGA, GSA, GSV, GRS, GST, MALM, MEPH, MDGP, MDBG, ZDA, MCHN); //enable NMEA output sentences and frequencies
|
slisgrinder |
1:e143afe9a7ea
|
33
|
// END CONFIGURATION OF GPS
|
slisgrinder |
1:e143afe9a7ea
|
34
|
wait (0.1);
|
slisgrinder |
1:e143afe9a7ea
|
35
|
gps.rxBufferFlush ();
|
slisgrinder |
1:e143afe9a7ea
|
36
|
gps.attach (this, &GPSParser::ready_buffer);
|
slisgrinder |
1:e143afe9a7ea
|
37
|
}
|
slisgrinder |
1:e143afe9a7ea
|
38
|
|
slisgrinder |
1:e143afe9a7ea
|
39
|
void GPSParser::process_readings ()
|
slisgrinder |
1:e143afe9a7ea
|
40
|
{
|
slisgrinder |
1:e143afe9a7ea
|
41
|
char buff [num_sentences][128];
|
slisgrinder |
1:e143afe9a7ea
|
42
|
//gps.attach (this, &GPSParserCpp::ready_buffer);
|
slisgrinder |
1:e143afe9a7ea
|
43
|
|
slisgrinder |
1:e143afe9a7ea
|
44
|
for (int i = 0; i < num_sentences; i++)
|
slisgrinder |
1:e143afe9a7ea
|
45
|
{
|
slisgrinder |
1:e143afe9a7ea
|
46
|
for (int k = 0; k < 128; k++)
|
slisgrinder |
1:e143afe9a7ea
|
47
|
{
|
slisgrinder |
1:e143afe9a7ea
|
48
|
buff [i][k] = gps.getc();
|
slisgrinder |
1:e143afe9a7ea
|
49
|
if (buff [i][k] == ',' && buff [i][k - 1] == ',') // if the current and last character read were both ',' then assign the next buff position ',' and the current buff position a '0' and increment k by one.
|
slisgrinder |
1:e143afe9a7ea
|
50
|
{
|
slisgrinder |
1:e143afe9a7ea
|
51
|
buff [i][k + 1] = buff [i][k];
|
slisgrinder |
1:e143afe9a7ea
|
52
|
buff [i][k] = '0';
|
slisgrinder |
1:e143afe9a7ea
|
53
|
k++;
|
slisgrinder |
1:e143afe9a7ea
|
54
|
}
|
slisgrinder |
1:e143afe9a7ea
|
55
|
if (buff [i][k] == '*' && buff [i][k - 1] == ',') // if the current character is '*' and last character read were both ',' then assign the next buff position '*' and the current buff position a '0' and increment k by one.
|
slisgrinder |
1:e143afe9a7ea
|
56
|
{
|
slisgrinder |
1:e143afe9a7ea
|
57
|
buff [i][k + 1] = buff [i][k];
|
slisgrinder |
1:e143afe9a7ea
|
58
|
buff [i][k] = '0';
|
slisgrinder |
1:e143afe9a7ea
|
59
|
k++;
|
slisgrinder |
1:e143afe9a7ea
|
60
|
}
|
slisgrinder |
1:e143afe9a7ea
|
61
|
//pc.putc (buff [i][k]);
|
slisgrinder |
1:e143afe9a7ea
|
62
|
if (buff [i][k] == '\n')
|
slisgrinder |
1:e143afe9a7ea
|
63
|
{
|
slisgrinder |
1:e143afe9a7ea
|
64
|
k++;
|
slisgrinder |
1:e143afe9a7ea
|
65
|
buff [i][k] = '\0';
|
slisgrinder |
1:e143afe9a7ea
|
66
|
break;
|
slisgrinder |
1:e143afe9a7ea
|
67
|
}
|
slisgrinder |
1:e143afe9a7ea
|
68
|
}
|
slisgrinder |
1:e143afe9a7ea
|
69
|
}
|
slisgrinder |
1:e143afe9a7ea
|
70
|
|
slisgrinder |
1:e143afe9a7ea
|
71
|
for (int i = 0; i < num_sentences; i++)
|
slisgrinder |
1:e143afe9a7ea
|
72
|
{
|
slisgrinder |
1:e143afe9a7ea
|
73
|
if (!sscanf (buff [i], "$GPGGA,%2d%2d%2d.%3d,%f,%c,%f,%c,%d,%d,%f,%f,M,%f,M,%f,%X*%hX\r\n", &readings.hours, &readings.minutes, &readings.seconds, &readings.m_seconds, &readings.latitude, &readings.ns, &readings.longitude, &readings.ew, &readings.fix, &readings.sats_used, &readings.HDOP, &readings.altitude, &readings.geoidal_sep, &readings.AODC, &readings.DGPS_ID, &readings.checksum_gga))
|
slisgrinder |
1:e143afe9a7ea
|
74
|
sscanf (buff [i + 1], "$GPGGA,%2d%2d%2d.%3d,%f,%c,%f,%c,%d,%d,%f,%f,M,%f,M,%f,%X*%hX\r\n", &readings.hours, &readings.minutes, &readings.seconds, &readings.m_seconds, &readings.latitude, &readings.ns, &readings.longitude, &readings.ew, &readings.fix, &readings.sats_used, &readings.HDOP, &readings.altitude, &readings.geoidal_sep, &readings.AODC, &readings.DGPS_ID, &readings.checksum_gga);
|
slisgrinder |
1:e143afe9a7ea
|
75
|
|
slisgrinder |
1:e143afe9a7ea
|
76
|
if(!sscanf (buff [i], "$GPVTG,%f,T,%f,M,%f,N,%f,K,%c*%hX\r\n", &readings.heading, &readings.mag_heading, &readings.speed_knots, &readings.speed_kph, &readings.mode, &readings.checksum_vtg))
|
slisgrinder |
1:e143afe9a7ea
|
77
|
sscanf (buff [i + 1], "$GPVTG,%f,T,%f,M,%f,N,%f,K,%c*%hX\r\n", &readings.heading, &readings.mag_heading, &readings.speed_knots, &readings.speed_kph, &readings.mode, &readings.checksum_vtg);
|
slisgrinder |
1:e143afe9a7ea
|
78
|
|
slisgrinder |
1:e143afe9a7ea
|
79
|
pc.printf ("%s", buff [i]);
|
slisgrinder |
1:e143afe9a7ea
|
80
|
}
|
slisgrinder |
1:e143afe9a7ea
|
81
|
if (readings.ns == 'S')
|
slisgrinder |
1:e143afe9a7ea
|
82
|
readings.latitude *= -1.0f;
|
slisgrinder |
1:e143afe9a7ea
|
83
|
|
slisgrinder |
1:e143afe9a7ea
|
84
|
if (readings.ew == 'W')
|
slisgrinder |
1:e143afe9a7ea
|
85
|
readings.longitude *= -1.0f;
|
slisgrinder |
1:e143afe9a7ea
|
86
|
|
slisgrinder |
1:e143afe9a7ea
|
87
|
readings.lat_deg = (int)(readings.latitude / 100);
|
slisgrinder |
1:e143afe9a7ea
|
88
|
readings.lat_min = readings.latitude - (readings.lat_deg * 100.0f);
|
slisgrinder |
1:e143afe9a7ea
|
89
|
readings.deg_latitude = readings.lat_deg + readings.lat_min / 60.0f;
|
slisgrinder |
1:e143afe9a7ea
|
90
|
readings.long_deg = (int)(readings.longitude /100);
|
slisgrinder |
1:e143afe9a7ea
|
91
|
readings.long_min = readings.longitude - (readings.long_deg * 100.0f);
|
slisgrinder |
1:e143afe9a7ea
|
92
|
readings.deg_longitude = readings.long_deg + readings.long_min / 60.0f;
|
slisgrinder |
1:e143afe9a7ea
|
93
|
|
slisgrinder |
1:e143afe9a7ea
|
94
|
gps.rxBufferFlush ();
|
slisgrinder |
1:e143afe9a7ea
|
95
|
}
|
slisgrinder |
1:e143afe9a7ea
|
96
|
|
slisgrinder |
2:6f49c74ab3b9
|
97
|
void GPSParser::ready_buffer(MODSERIAL_IRQ_INFO *q)
|
slisgrinder |
1:e143afe9a7ea
|
98
|
{
|
slisgrinder |
3:d01d7593384d
|
99
|
indicator = 1;
|
slisgrinder |
1:e143afe9a7ea
|
100
|
MODSERIAL *serial = q->serial;
|
slisgrinder |
1:e143afe9a7ea
|
101
|
|
slisgrinder |
1:e143afe9a7ea
|
102
|
if (serial->rxGetLastChar() == '\n')
|
slisgrinder |
1:e143afe9a7ea
|
103
|
ctr++;
|
slisgrinder |
1:e143afe9a7ea
|
104
|
|
slisgrinder |
1:e143afe9a7ea
|
105
|
if (ctr == num_sentences)
|
slisgrinder |
1:e143afe9a7ea
|
106
|
{
|
slisgrinder |
2:6f49c74ab3b9
|
107
|
process_readings ();
|
slisgrinder |
1:e143afe9a7ea
|
108
|
ctr = 0;
|
slisgrinder |
1:e143afe9a7ea
|
109
|
}
|
slisgrinder |
3:d01d7593384d
|
110
|
indicator = 0;
|
slisgrinder |
2:6f49c74ab3b9
|
111
|
} |