A GPS serial interrupt service routine that has an on the fly nmea parser. Works with a STM32F411RE and a Adafruit GPS logger.

Dependents:   Bicycl_Computer_NUCLEO-F411RE Bicycl_Computer_NUCLEO-L476RG

Fork of GPS by Simon Ford

main.cpp

#include "mbed.h"
#include "GPSISR.h"

#define PIN_RX_GPS      PA_12 //GPS Shield RX pin
#define PIN_TX_GPS      PA_11 //GPS Shield TX pin
Serial pc(USBTX, USBRX);

// Set up serial interrupe service handler for gps characters.
GPS MyGPS(PIN_TX_GPS,PIN_RX_GPS, 9600);
int main()
{
    while (1) {
	if (MyGPS.dataready()) {
					MyGPS.read();
					pc.printf("NMEA has valid data");
					pc.printf("Sats : %d \n", MyGPS.buffer.satellites);
					pc.printf("%d-%d-%d\n", MyGPS.buffer.month, MyGPS.buffer.day, MyGPS.buffer.year);
					pc.printf("%d:%d:%d\n", MyGPS.buffer.hours, MyGPS.buffer.minutes, MyGPS.buffer.seconds);
	}
	else {
                pc.printf("NMEA has no valid data");
	}   
   }  
} 

nav.h

Committer:
trevieze
Date:
2017-03-01
Revision:
5:c5f700c1e1af

File content as of revision 5:c5f700c1e1af:

/*
    File:       nav.h
    Version:    0.1.0
    Date:       Feb. 28, 2017
    License:    GPL v2
    
    Navigation class
    
    ****************************************************************************
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    ****************************************************************************
 */
class NAV {
    #define PI  3.14159265358979f
    #define point_proximity_radius 10
    #define NMEA_EARTH_FLATTENING       (1 / 298.257223563)             /**< Earth's flattening according WGS 84 */
    #define NMEA_EARTH_SEMIMAJORAXIS_M  (6378137.0)                     /**< Earth's semi-major axis in m according WGS84 */
    #define NMEA_EARTH_SEMIMAJORAXIS_KM (NMEA_EARTH_SEMIMAJORAXIS_M / 1000) /**< Earth's semi-major axis in km according WGS 84 */


    private:
    // Convert Degrees to Radians
    double DegreeToRadian(double angle);
    // Convert Radians to Degrees
    double RadianToDegree(double angle);
    
    public:
    // Calculate the heading
    double CalculateDistance (double latitude1, double longitude1, double latitude2, double longitude2);
    // Calculate bearing
    double CalculateBearing(double latitude1, double longitude1, double latitude2, double longitude2);
    /*
        This function takes as input the next gps coordinate that the boat is suppossed to achieve and calculates the compass
        heading to the waypoint
        Jeff Witten - 05/26/14 from Github VT-SailBOT/Navigation sailbot.c
    */
    int direction_to_next_point (double latitude, double longitude, double next_latitude, double next_longitude);
    /*
        This function takes as input the gps coordinates of the boat and the gps coordinates of a waypoint that the boat desires to approach
        The function then sets a flag based on whether or not the boat is within a predetermined perimeter of the waypoint
        Approach:
        1.) Latitude and Longitude of San Francisco = 37.7844 N, 122.4167 W
        2.) At 40 degrees North: 1 degree latitude = 111.03 km, 1 degree longitude = 85.39 km
        3.) 111.03 = 85.39 * (1.30027) - used to correct approximately rectangular lat/lon grid to approximately square
        4.) Through unit analysis, 1 meter = 0.0000111509 degrees longitude 
        Jeff Witten - 03/27/14 from Github VT-SailBOT/Navigation sailbot.c
        */
    int point_proximity(double boat_latitude, double boat_longitude, double next_latitude, double next_longitude);
    
    double distance_ellipsoid(double from_lat,  double from_lon, double from_azimuth, double to_lat, double to_lon, double to_azimuth);
    
    int distance;
    
   };