Jamal

Dependencies:   GPS MODSERIAL mbed-src

Fork of GPS_U-blox_NEO-6M_Test_Code by Edoardo De Marchi

HdgDist.cpp

Committer:
jelalaoui
Date:
2015-04-02
Revision:
2:f10daa35eb51

File content as of revision 2:f10daa35eb51:

/*
 * Notes: Firmware for GPS U-Blox NEO-6M
*/

#include "main.h"


void Init()
{
    gps.baud(9600);
    pc.baud(115200);

    pc.printf("Init OK\n");
}



int main() 
{   
    Init();
    char c;
    float latitude;


    while(true) 
    {
        if(gps.readable())
        { 
            if(gps.getc() == '$');           // wait a $
            {
                for(int i=0; i<sizeof(cDataBuffer); i++)
                {
                    c = gps.getc();
                    if( c == '\r' )
                    {
                        //pc.printf("%s\n", cDataBuffer);
                        parse(cDataBuffer, i);
                        i = sizeof(cDataBuffer);
                        
                        
            
                    }
                    
                        
                    else
                    {
                        cDataBuffer[i] = c;
                    }                 
                }
            }
         } 
    }
}


void parse(char *cmd, int n)
{
    
    char ns, ew, tf, status;
    int fq, nst, fix, date;                                     // fix quality, Number of satellites being tracked, 3D fix
    float timefix, speed, altitude,Lat, Lon;
    float lat1,lat2,lon1,lon2,lats,lons,flat1, flon1,losx,losy,los,dist_calc;
    float latitude, longitude;
   
    
    
    // Global Positioning System Fix Data
    if(strncmp(cmd,"$GPGGA", 6) == 0) 
    {
        sscanf(cmd, "$GPGGA,%f,%f,%c,%f,%c,%d,%d,%*f,%f", &timefix, &latitude, &ns, &longitude, &ew, &fq, &nst, &altitude);
        //pc.printf("GPGGA Fix taken at: %f, Latitude: %f, %c, Longitude: %f %c, Fix quality: %d, Number of sat: %d, Altitude: %f M\n", timefix, latitude, ns, longitude, ew, fq, nst, altitude);
        //pc.printf("latitude: %f, longitude: %f", latitude, longitude);
        
        float value=latitude;
        
        //string decimalToDMS(double value) 
        //string result = null;
        double degValue = value / 100;
        int degrees = (int) degValue;
        double decMinutesSeconds = ((degValue - degrees)) / .60;
        //double minuteValue = decMinutesSeconds * 60;
        //int minutes = (int) minuteValue;
        //double secsValue = (minuteValue - minutes) * 60;
        
        flat1 = degrees + decMinutesSeconds ;
        char np=ew;
        if(np== 'E')
           {
            flat1*=-1;
            }
        
        //return result;
        value=longitude;
        //string decimalToDMS(double value) 
        //string result = null;
        degValue = value / 100;
        degrees = (int) degValue;
        decMinutesSeconds = ((degValue - degrees)) / .60;
        //minuteValue = decMinutesSeconds * 60;
        //minutes = (int) minuteValue;
        //secsValue = (minuteValue - minutes) * 60;
        flon1 = degrees + decMinutesSeconds ;
        char pn=ns;
        if(pn== 'N'){
            flon1*=-1;
            }
        pc.printf("Current Lat in Deg: %f       Current Lon in Deg: %f \r\n\n\n", flat1,flon1);
        
//Distance and bearing calculation


        //float flat1=flat;     // flat1 = our current latitude. flat is from the gps data. 
        //float flon1=flon;  // flon1 = our current longitude. flon is from the fps data.
        double dist_calc=0;
        double angle_calc=0;
        double dist_calc2=0;
        double diflat=0;
        double diflon=0;
        double heading=0;
        double flat1_rad;
        double x2lat_rad;
        double PiRad = 3.1415926535897931/0.180;
        double x2lat= -29.681411      ;  // latitude point of charging platform
        double x2lon= -95.251111    ;  //   longitude point of charging platform
       
        pc.printf("Charger Lat in Deg: %f       Charger Lon in Deg: %f \r\n\n\n\n\n", x2lat,x2lon);
  
  //- distance formula below. Calculates distance to charging platform (1 nautical mile = 1.85 km)
///Pythagorean error did not seem negligible to me
     //   losy = (x2lat - flat1);
       // losx = (x2lon - flon1);

  
  //if (EXTEND_RANGE)
   // if (losy > 320000 || losx > 320000) {
     // losy/=100;
      //losx/=100; 
     // los=sqrt((losy*losy)+(losx*losx))*100;
    //  losy*=100;
    //  losx*=100;
    //}
    
    //else {
    // los=sqrt((losy*losy)+(losx*losx)); 
       //  }
         
     // los*= 110567 ; //Converting to meters 
     //great circle distance
     
     //// function below. Calculates distance from current location to waypoint
     diflat= (x2lat-flat1)* PiRad/1000;  // in radians
     flat1_rad= flat1* PiRad/1000;    //current latitude to radians
     x2lat_rad= x2lat* PiRad/1000;  // waypoint latitude to radians
     diflon=(x2lon-flon1)* PiRad/1000;   //subtract and convert longitudes to radians
     dist_calc = (sin(diflat/2.0)*sin(diflat/2.0));
     dist_calc2= cos(flat1_rad);
     dist_calc2*=cos(x2lat_rad);
     dist_calc2*=sin(diflon/2.0);                                       
     dist_calc2*=sin(diflon/2.0);
     dist_calc +=dist_calc2;
     dist_calc=(2*atan2(sqrt(dist_calc),sqrt(1.0-dist_calc)));
     dist_calc*=6371000.0; //Converting to meters



    

        //dist_calc=sqrt((((flon1)-(x2lon))*((flon1)-(x2lon)))+(((x2lat-flat1)*(x2lat-flat1))));
        //dist_calc*=110567 ; //Converting to meters
      //  pc.printf("Dest Lat in Deg: %f,      Dest Lon in Deg: %f \r\n\n", x2lat,x2lon);        
        pc.printf("Distance to waypoint : %f  m\r\n\n",dist_calc);
  //=======================angle==========================================
   
heading = atan2((sin(diflon)*cos(x2lat_rad)),((cos(flat1_rad)*sin(x2lat_rad))-(sin(flat1_rad)*cos(x2lat_rad)*cos(diflon))));
heading = heading*180/3.1415926535897931;  // convert from radians to degrees
int head =heading; //make it a integer now
if(head<0){
 heading+=360;   //if the heading is negative then add 360 to make it positive
}

  //      angle_calc=atan2(diflon,diflat);
        
        

        //float declinationAngle2 = 57.29577951;
        //angle_calc*= declinationAngle2;
        //feedgps();
        //getDistance();

       // if(angle_calc < 0){
   // angle_calc = 360 + angle_calc;
    //feedgps();
    //getDistance();
  //}
  // Check for wrap due to addition of declination.
  //if(angle_calc >0){
    //angle_calc= angle_calc;
    //feedgps();
    //getDistance();
          
    pc.printf("Bearing angle between current and dest waypoint: %f deg\r\n\n", heading);
    pc.printf("\n\n\======================================================================\r\n\n");
        
    }


    }
      
/*dist_calc=sqrt((((flon1)-(x2lon))*((flon1)-(x2lon)))+(((x2lat-flat1)*(x2lat-flat1))));
  dist_calc*=110567 ; //Converting to meters
  //=======================angle==========================================
  angle_calc=atan2((x2lon-flon1),(x2lat-flat1));

  float declinationAngle2 = 57.29577951;
  angle_calc*= declinationAngle2;
  feedgps();
  getDistance();

  if(angle_calc < 0){
    angle_calc = 360 + angle_calc;
    feedgps();
    getDistance();
  }
  // Check for wrap due to addition of declination.
  if(angle_calc >0){
    angle_calc= angle_calc;
    feedgps();
    getDistance();
  }

  float angleDegrees = angle_calc;
  feedgps();


    
    // Satellite status
    //if(strncmp(cmd,"$GPGSA", 6) == 0) 
    /*{
        sscanf(cmd, "$GPGSA,%c,%d,%d", &tf, &fix, &nst);
        pc.printf("GPGSA Type fix: %c, 3D fix: %d, number of sat: %d\r\n", tf, fix, nst);
    }
    
    // Geographic position, Latitude and Longitude
    if(strncmp(cmd,"$GPGLL", 6) == 0) 
    {
        sscanf(cmd, "$GPGLL,%f,%c,%f,%c,%f", &latitude, &ns, &longitude, &ew, &timefix);
        pc.printf("GPGLL Latitude: %f %c, Longitude: %f %c, Fix taken at: %f\n", latitude, ns, longitude, ew, timefix);
    }
    
    // Geographic position, Latitude and Longitude
    if(strncmp(cmd,"$GPRMC", 6) == 0) 
    {
        sscanf(cmd, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,,%d", &timefix, &status, &latitude, &ns, &longitude, &ew, &speed, &date);
        pc.printf("GPRMC Fix taken at: %f, Status: %c, Latitude: %f %c, Longitude: %f %c, Speed: %f, Date: %d\n", timefix, status, latitude, ns, longitude, ew, speed, date);
    }
*/