Committer:
slisgrinder
Date:
Wed Mar 28 23:29:35 2012 +0000
Revision:
3:d01d7593384d
Parent:
2:6f49c74ab3b9

        

Who changed what in which revision?

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