Committer:
slisgrinder
Date:
Wed Mar 28 21:25:38 2012 +0000
Revision:
1:e143afe9a7ea
Parent:
0:01c9f535e512
Child:
2:6f49c74ab3b9

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
slisgrinder 1:e143afe9a7ea 1 #include <GPSParserCpp.h>
slisgrinder 1:e143afe9a7ea 2
slisgrinder 1:e143afe9a7ea 3 GPSParser::GPSParser (PinName tx, PinName rx, int baud, int num_sentence, MODSERIAL &pc)
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 1:e143afe9a7ea 23 pc (pc)
slisgrinder 1:e143afe9a7ea 24 {
slisgrinder 1:e143afe9a7ea 25 pc.printf ("Initializing GPS...\r\n");
slisgrinder 1:e143afe9a7ea 26 gps.baud (baudrate);
slisgrinder 1:e143afe9a7ea 27
slisgrinder 1:e143afe9a7ea 28 // BEGIN CONFIGURATION OF GPS use http://www.hhhh.org/wiml/proj/nmeaxor.html for checksum calculations...
slisgrinder 1:e143afe9a7ea 29 gps.printf ("$PMTK313,1*2E\r\n"); //enable SBAS satellite searching
slisgrinder 1:e143afe9a7ea 30 gps.printf ("$PMTK301,2*2E\r\n"); //set DGPS mode to WAAS
slisgrinder 1:e143afe9a7ea 31 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 32 // END CONFIGURATION OF GPS
slisgrinder 1:e143afe9a7ea 33 wait (0.1);
slisgrinder 1:e143afe9a7ea 34 gps.rxBufferFlush ();
slisgrinder 1:e143afe9a7ea 35 gps.attach (this, &GPSParser::ready_buffer);
slisgrinder 1:e143afe9a7ea 36 }
slisgrinder 1:e143afe9a7ea 37
slisgrinder 1:e143afe9a7ea 38 void GPSParser::process_readings ()
slisgrinder 1:e143afe9a7ea 39 {
slisgrinder 1:e143afe9a7ea 40 char buff [num_sentences][128];
slisgrinder 1:e143afe9a7ea 41 //gps.attach (this, &GPSParserCpp::ready_buffer);
slisgrinder 1:e143afe9a7ea 42
slisgrinder 1:e143afe9a7ea 43 for (int i = 0; i < num_sentences; i++)
slisgrinder 1:e143afe9a7ea 44 {
slisgrinder 1:e143afe9a7ea 45 for (int k = 0; k < 128; k++)
slisgrinder 1:e143afe9a7ea 46 {
slisgrinder 1:e143afe9a7ea 47 buff [i][k] = gps.getc();
slisgrinder 1:e143afe9a7ea 48 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 49 {
slisgrinder 1:e143afe9a7ea 50 buff [i][k + 1] = buff [i][k];
slisgrinder 1:e143afe9a7ea 51 buff [i][k] = '0';
slisgrinder 1:e143afe9a7ea 52 k++;
slisgrinder 1:e143afe9a7ea 53 }
slisgrinder 1:e143afe9a7ea 54 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 55 {
slisgrinder 1:e143afe9a7ea 56 buff [i][k + 1] = buff [i][k];
slisgrinder 1:e143afe9a7ea 57 buff [i][k] = '0';
slisgrinder 1:e143afe9a7ea 58 k++;
slisgrinder 1:e143afe9a7ea 59 }
slisgrinder 1:e143afe9a7ea 60 //pc.putc (buff [i][k]);
slisgrinder 1:e143afe9a7ea 61 if (buff [i][k] == '\n')
slisgrinder 1:e143afe9a7ea 62 {
slisgrinder 1:e143afe9a7ea 63 k++;
slisgrinder 1:e143afe9a7ea 64 buff [i][k] = '\0';
slisgrinder 1:e143afe9a7ea 65 break;
slisgrinder 1:e143afe9a7ea 66 }
slisgrinder 1:e143afe9a7ea 67 }
slisgrinder 1:e143afe9a7ea 68 }
slisgrinder 1:e143afe9a7ea 69
slisgrinder 1:e143afe9a7ea 70 for (int i = 0; i < num_sentences; i++)
slisgrinder 1:e143afe9a7ea 71 {
slisgrinder 1:e143afe9a7ea 72 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 73 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 74
slisgrinder 1:e143afe9a7ea 75 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 76 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 77
slisgrinder 1:e143afe9a7ea 78 pc.printf ("%s", buff [i]);
slisgrinder 1:e143afe9a7ea 79 }
slisgrinder 1:e143afe9a7ea 80 if (readings.ns == 'S')
slisgrinder 1:e143afe9a7ea 81 readings.latitude *= -1.0f;
slisgrinder 1:e143afe9a7ea 82
slisgrinder 1:e143afe9a7ea 83 if (readings.ew == 'W')
slisgrinder 1:e143afe9a7ea 84 readings.longitude *= -1.0f;
slisgrinder 1:e143afe9a7ea 85
slisgrinder 1:e143afe9a7ea 86 readings.lat_deg = (int)(readings.latitude / 100);
slisgrinder 1:e143afe9a7ea 87 readings.lat_min = readings.latitude - (readings.lat_deg * 100.0f);
slisgrinder 1:e143afe9a7ea 88 readings.deg_latitude = readings.lat_deg + readings.lat_min / 60.0f;
slisgrinder 1:e143afe9a7ea 89 readings.long_deg = (int)(readings.longitude /100);
slisgrinder 1:e143afe9a7ea 90 readings.long_min = readings.longitude - (readings.long_deg * 100.0f);
slisgrinder 1:e143afe9a7ea 91 readings.deg_longitude = readings.long_deg + readings.long_min / 60.0f;
slisgrinder 1:e143afe9a7ea 92
slisgrinder 1:e143afe9a7ea 93 gps.rxBufferFlush ();
slisgrinder 1:e143afe9a7ea 94 }
slisgrinder 1:e143afe9a7ea 95
slisgrinder 1:e143afe9a7ea 96 virtual void GPSParser::ready_buffer(MODSERIAL_IRQ_INFO *q);
slisgrinder 1:e143afe9a7ea 97 {
slisgrinder 1:e143afe9a7ea 98 MODSERIAL *serial = q->serial;
slisgrinder 1:e143afe9a7ea 99
slisgrinder 1:e143afe9a7ea 100 if (serial->rxGetLastChar() == '\n')
slisgrinder 1:e143afe9a7ea 101 ctr++;
slisgrinder 1:e143afe9a7ea 102
slisgrinder 1:e143afe9a7ea 103 if (ctr == num_sentences)
slisgrinder 1:e143afe9a7ea 104 {
slisgrinder 1:e143afe9a7ea 105 read_gps();
slisgrinder 1:e143afe9a7ea 106 ctr = 0;
slisgrinder 1:e143afe9a7ea 107 }
slisgrinder 1:e143afe9a7ea 108 };