ahmed ahmed / Mbed 2 deprecated Nadia_ComGPS_1

Dependencies:   C12832 mbed

Fork of ComGPS by SAADI Nadia

Files at this revision

API Documentation at this revision

Comitter:
pfe
Date:
Tue Mar 03 13:35:34 2015 +0000
Parent:
0:674a094baf00
Child:
2:4cf92185ed38
Commit message:
Decod Msg GPS

Changed in this revision

GPS_Decod_Function/DecMsgGPGGA.h Show annotated file Show diff for this revision Revisions of this file
GPS_Decod_Function/GPS_Init.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS_Decod_Function/DecMsgGPGGA.h	Tue Mar 03 13:35:34 2015 +0000
@@ -0,0 +1,187 @@
+unsigned short DecodageGPGGA(unsigned short *P_MsgGPS,unsigned short Ldata)  //-------------------------------------------------------
+{
+    unsigned short CommaNbr;
+    unsigned short ii,jj;
+    MSG_GPGGA_Valid = 0;
+    P0_Msg=P_MsgGPS;
+    P_Msg =P0_Msg;
+    ii = 0;
+    if(*P_Msg!='G')goto LabFin;
+    P_Msg++;
+    if(*P_Msg!='P')goto LabFin;
+    P_Msg++;
+    if(*P_Msg!='G')goto LabFin;
+    P_Msg++;
+    if(*P_Msg!='G')goto LabFin;
+    P_Msg++;
+    if(*P_Msg!='A')goto LabFin;
+
+    P_Msg      = P0_Msg;    
+    
+    CommaNbr = 0;
+    for(ii=0;ii<Ldata;ii++)
+    {
+     if(*P_Msg==',')
+      {
+        PosV[CommaNbr] = ii;
+        CommaNbr++;
+      }
+      P_Msg++;
+    }
+    if(CommaNbr<11)goto LabFin; //Vérification de la longueur du message GPGGA
+                                //par le nombre des vergules
+//UTC of position
+    //extraction du temps UTC
+    jj=0;//Identification de la position de la première virgule dans le MsgGPS
+    DL=Get_Length(jj);
+    if(DL!=9) goto LabFin;//Vérification de la longueur du message de temps
+    Set_Data(jj);
+    Validation_StrToFloat(DL);
+    if(Npt  !=1)    goto LabFin;
+    if(Pospt!=6)    goto LabFin;
+    //Vérification de Time "hhmmss"
+    hh=10*(Data[0]-48)+(Data[1]-48);//Extraction de l'heur
+    mm=10*(Data[2]-48)+(Data[3]-48);//Extraction des minutes
+    ss=10*(Data[4]-48)+(Data[5]-48);//Extraction des secondes
+    if((hh>24)||(mm>59)||(ss>59))goto LabFin;
+
+    // 03 byte
+//Latitude of position
+    //extraction du Lattitude
+    jj=1;//Identification de la position de la deuxième virgule dans le MsgGPS
+    DL=Get_Length(jj);
+    if(DL!=10) goto LabFin;//Vérification de la longueur du message de lattitude
+    Set_Data(jj);
+    Validation_StrToFloat(DL);
+    if(Npt  !=1)    goto LabFin;
+    if(Pospt!=4)    goto LabFin;
+    
+    //Vérification du Lattitude "LatDegLatMin,LatMin1LatMin2"
+    LatDeg =10*(Data[0]-48)+(Data[1]-48);//Extraction des degrés du lattitude
+    LatMin =10*(Data[2]-48)+(Data[3]-48);//Extraction des minutes du lattitude
+    LatMin1=10*(Data[5]-48)+(Data[6]-48);//Extraction des deux chiffres minutes après la virgule du lattitude
+    LatMin2=10*(Data[7]-48)+(Data[8]-48);//Extraction des deux chiffres minutes après la virgule du lattitude
+    if((LatDeg>90)||(LatMin>59)||(LatMin1>99)||(LatMin2>99))goto LabFin;
+    
+    // 04 byte
+    //Vérification de la direction du Lattitude LatDir(N ou S)
+    jj=2;//Identification de la position de la troisième virgule dans le MsgGPS
+    DL=Get_Length(jj);
+    if(DL!=1) goto LabFin;//Vérification de la longueur du message de direction de latittude
+    Set_Data(jj);
+    LatDir=Data[0];//Extraction de le direction du latitude
+    if((LatDir!='N')&&(LatDir!='S'))goto LabFin;
+
+    // 01 byte
+//Longitude of position
+    //extraction de la Longitude
+    jj=3;//Identification de la position de la quatrième virgule dans le MsgGPS
+    DL=Get_Length(jj);
+    if(DL!=11) goto LabFin;//Vérification de la longueur du message de la longitude
+    Set_Data(jj);
+    Validation_StrToFloat(DL);
+    if(Npt  !=1)    goto LabFin;
+    if(Pospt!=5)    goto LabFin;
+
+    //Vérification du La Longitude "LongDegLongMin,LongMin1LongMin2"
+    LongDeg =100*(Data[0]-48)+10*(Data[1]-48)+(Data[2]-48);//Extraction des degrés de la longitude
+    LongMin =10*(Data[3]-48)+(Data[4]-48);//Extraction des minutes de la longitude
+    LongMin1=10*(Data[6]-48)+(Data[7]-48);//Extraction des deux chiffres minutes après la virgule de la longitude
+    LongMin2=10*(Data[8]-48)+(Data[9]-48);//Extraction des deux chiffres minutes après la virgule de la longitude
+    if((LongDeg>180)||(LongMin>59)||(LongMin1>99)||(LongMin2>99))goto LabFin;
+
+    // 04 byte
+    //Vérification de la direction du Longitude LonDir(E ou W)
+    jj=4;//Identification de la position de la cinquième virgule dans le MsgGPS
+    DL=Get_Length(jj);
+    if(DL!=1) goto LabFin;//Vérification de la longueur du message de direction de la longitude
+    Set_Data(jj);
+    LongDir=Data[0];//Extraction de le direction de la longitude
+    if((LongDir!='E')&&(LongDir!='W'))goto LabFin;
+
+    // 01 byte
+//GPS Quality indicator
+    jj=5;//Identification de la position de la sixième virgule dans le MsgGPS
+    DL=Get_Length(jj);
+    if(DL!=1) goto LabFin;//Vérification de la longueur du message de l'ndicateur de qualité GPS
+    Set_Data(jj);
+    Validation_StrToFloat(DL);
+    if(Npt  !=0)    goto LabFin;
+    if(Pospt!=0)    goto LabFin;
+    Qual=Data[0]-48;//Extraction de l'information de la qualité du MsgGPs
+    if((Qual<1)||(Qual>2))goto LabFin;
+
+    // 01 byte
+//Antenna altitude above mean-sea-level "SignHMSLHMSL_HHMSL_L,HMSL_1HMSL_2"  .
+    jj=8;//Identification de la position de la neuvième virgule dans le MsgGPS
+    DL=Get_Length(jj);
+    if(DL<3) goto LabFin;//Vérification de la longueur du message de l'altitude
+    Set_Data(jj);
+    SignHMSL='+';
+    if(Data[0]=='-')
+    {
+      DL=DL-1;
+      SignHMSL='-';
+      for(ii=0;ii<DL;ii++) Data[ii]=Data[ii+1];
+    }
+    Validation_StrToFloat(DL);
+    if(Npt   !=1)  goto LabFin;
+    if(Pospt ==0)  goto LabFin;
+    
+    switch (Pospt)
+     {
+      case 1: {HMSL_L = (Data[0]-48)                ; HMSL_H = 0; break;}
+      case 2: {HMSL_L = (Data[1]-48)+10*(Data[0]-48); HMSL_H = 0; break;}
+      case 3: {HMSL_L = (Data[2]-48)+10*(Data[1]-48); HMSL_H = (Data[0]-48); break;}
+      case 4: {HMSL_L = (Data[3]-48)+10*(Data[2]-48); HMSL_H = (Data[1]-48)+10*(Data[0]-48); break;}
+      default : break;
+     }
+    DL=DL-Pospt-1; //La longure de chiffre après la virgule
+    switch (DL)
+     {
+      case 1: {HMSL_1 = (Data[Pospt+1]-48)                      ; HMSL_2 = 0; break;}
+      case 2: {HMSL_1 = (Data[Pospt+2]-48)+10*(Data[Pospt+1]-48); HMSL_2 = 0; break;}
+      case 3: {HMSL_1 = (Data[Pospt+2]-48)+10*(Data[Pospt+1]-48); HMSL_2 = Data[Pospt+3]-48; break;}
+      case 4: {HMSL_1 = (Data[Pospt+2]-48)+10*(Data[Pospt+1]-48); HMSL_2 = 10*(Data[Pospt+3]-48)+Data[Pospt+4]-48; break;}
+      default : break;
+     }
+    // 05 byte
+    //Antenna height unit
+    jj=9;//Identification de la position de la dixième virgule dans le MsgGPS
+    DL=Get_Length(jj);
+    if(DL!=1) goto LabFin;//Vérification de la longueur du message de l'unité de la hauteur
+    Set_Data(jj);
+    HUnite=Data[0];//Extraction de l'unité de la hauteur
+    if((HMSL_H>35)||(HUnite!='M'))goto LabFin;
+    MSG_GPGGA_Valid=1;
+ /*   UserWR_buffer[0]++;
+ //-----------------------------------------------------------------------------
+    UserWR_buffer[1] = hh;
+    UserWR_buffer[2] = mm;
+    UserWR_buffer[3] = ss;
+ //-----------------------------------------------------------------------------
+    UserWR_buffer[4] = LatDeg;
+    UserWR_buffer[5] = LatMin;
+    UserWR_buffer[6] = LatMin1;
+    UserWR_buffer[7] = LatMin2;
+    UserWR_buffer[8] = LatDir;
+ //-----------------------------------------------------------------------------
+    UserWR_buffer[9]  = LongDeg;
+    UserWR_buffer[10] = LongMin;
+    UserWR_buffer[11] = LongMin1;
+    UserWR_buffer[12] = LongMin2;
+    UserWR_buffer[13] = LongDir;
+ //-----------------------------------------------------------------------------
+    UserWR_buffer[14] = Qual;
+ //-----------------------------------------------------------------------------
+    UserWR_buffer[15] = HMSL_H;
+    UserWR_buffer[16] = HMSL_L;
+    UserWR_buffer[17] = HMSL_1;
+    UserWR_buffer[18] = HMSL_2;
+    UserWR_buffer[19] = SignHMSL;
+    UserWR_buffer[20] = HUnite;
+// -----------------------------------------------------------------------------
+*/
+LabFin:
+return MSG_GPGGA_Valid;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS_Decod_Function/GPS_Init.h	Tue Mar 03 13:35:34 2015 +0000
@@ -0,0 +1,57 @@
+unsigned short *P0_Msg,*P_Msg;
+unsigned short MSG_GPGGA_Valid;
+unsigned short MSG_GPRMC_Valid;
+unsigned short DL,Npt,Pospt;
+unsigned short Start,End;
+
+unsigned short hh,mm,ss;
+unsigned short LatDeg,LatMin,LatMin1,LatMin2,LatDir;
+unsigned short LongDeg,LongMin,LongMin1,LongMin2,LongDir;
+unsigned short Qual;
+unsigned short SignHMSL,HMSL_L,HMSL_H,HMSL_1,HMSL_2,HUnite;
+unsigned short dd,yy,mn,val;
+
+unsigned short Data[16],PosV[16];
+//------------------------------------------------------------------------------
+//Calcul de la longueur des sous message
+unsigned short Get_Length(unsigned short index)
+ {
+    unsigned short LongData;
+    LongData=PosV[index+1]-PosV[index]-1;
+    return LongData;
+ }
+//Décomposition du message en Sub message
+void Set_Data(unsigned short index)
+ {
+    unsigned short ii,jj;
+    ii=0;
+    Start = PosV[index]+1;
+    index++;
+    End   = PosV[index];
+    P_Msg = P0_Msg+Start;
+    for(jj=Start;jj<End;jj++)
+    {
+       Data[ii]=*P_Msg;
+       P_Msg++;
+       ii++;
+    }
+ }
+//Vérification des sub message
+void Validation_StrToFloat(unsigned short LongData)
+ {
+    unsigned short ii;
+    Npt=0;
+    Pospt=0;
+    for(ii=0;ii<LongData;ii++)
+     {
+       if(Data[ii]=='.')
+        {
+          Npt++;
+          Pospt=ii;
+        }
+        else if((Data[ii]<48)||(Data[ii]>57)) Npt=Npt+2;
+     }
+ }
+//------------------------------------------------------------------------------
+#include "DecMsgGPGGA.h"       // GPGGA
+//------------------------------------------------------------------------------
--- a/main.cpp	Sun Mar 01 11:39:40 2015 +0000
+++ b/main.cpp	Tue Mar 03 13:35:34 2015 +0000
@@ -1,24 +1,87 @@
 #include "mbed.h"
 #include "C12832.h"
-
- 
-Serial GPS(p13, p14); //Pin13 TX, pin14 RX. 
+#include "GPS_Init.h"
 C12832 lcd(p5, p7, p6, p8, p11);
 
+Serial pc(USBTX,USBRX); // communication PC à 9600 baud/sec par défaut
+Serial GPS(p9, p10); //Pin9 TX, pin10 RX. 
+
+unsigned short UserWR_buffer[32];
+unsigned short NbDataRec,En,Ldata;
+unsigned short MsgGPSRx[65]; // Déclaration d'un vecteur de 65 charactères
+
+
 int main() {
-  GPS.baud(9600);
-  unsigned char GPS_DATA;
+  GPS.baud(9600); // vérifier que votre GPS est à 9600, le plus souvent ils sont à 9600 !!!!!
+  char gps_mess;
   lcd.cls();
   lcd.locate(0,0);
   lcd.printf("GPS FIX");
+  
   while(1){
+//     
       if(GPS.readable()){
-        GPS_DATA=GPS.getc();
-        lcd.locate(0,15);
-        lcd.printf("%d",GPS_DATA);
-          }
+        gps_mess=GPS.getc();
+        if (gps_mess=='$'){
+             NbDataRec=0;//Initialisation de bbb à 0
+             En=1;
+             while(En){
+                    while(!GPS.readable());
+                    gps_mess = GPS.getc();    //Lecture du message GPS via USART
+                    MsgGPSRx[NbDataRec] = gps_mess;             //Stockage du message GPS dans un vecteur
+                    NbDataRec++;
+                    if((gps_mess==0x0D)||(NbDataRec==65)) En=0; // Vérification de la fin du message
+                 }
+             Ldata=NbDataRec;
+             DecodageGPGGA(MsgGPSRx,Ldata);       
+             
+             if (MSG_GPGGA_Valid){
+                lcd.locate(0,10);
+                lcd.printf("MSG GPS Valid"); 
+                UserWR_buffer[0]++;            
+ //-----------------------------------------------------------------------------
+                UserWR_buffer[1] = hh;
+                UserWR_buffer[2] = mm;
+                UserWR_buffer[3] = ss;
+ //-----------------------------------------------------------------------------
+                UserWR_buffer[4] = LatDeg;
+                UserWR_buffer[5] = LatMin;
+                UserWR_buffer[6] = LatMin1;
+                UserWR_buffer[7] = LatMin2;
+                UserWR_buffer[8] = LatDir;
+ //-----------------------------------------------------------------------------
+                UserWR_buffer[9]  = LongDeg;
+                UserWR_buffer[10] = LongMin;
+                UserWR_buffer[11] = LongMin1;
+                UserWR_buffer[12] = LongMin2;
+                UserWR_buffer[13] = LongDir;
+ //-----------------------------------------------------------------------------
+                UserWR_buffer[14] = Qual;
+ //-----------------------------------------------------------------------------
+                UserWR_buffer[15] = HMSL_H;
+                UserWR_buffer[16] = HMSL_L;
+                UserWR_buffer[17] = HMSL_1;
+                UserWR_buffer[18] = HMSL_2;
+                UserWR_buffer[19] = SignHMSL;
+                UserWR_buffer[20] = HUnite;
+                pc.printf("%d",hh); // afficher sur la console de PC.
+                MSG_GPGGA_Valid=0;
+               }    
+            }
+         }
+
+        // Vous ne pouvez pas afficher un message brut car il fait au moins 40 caractères et en plus le contenue
+        // est brut donc il faut le décoder !!!!! donc affichage à revoir.
+        // Contentez vous d'afficher cela sur le port USB du PC.
+        // il vous faidra pour cela installer le drivers Mbed je le mets en partage sir le compte google drive
+        //il suffit de le lancer 
+        
+        // afficher sur la console de PC.
+        // utiliser pour cela le programme Terminal.exe que je mets en partage aussi
+        // Vous trouverez le driver terminal + le logiciel Terminal dans le répértoir GPS dans google drive
+        
+        //lcd.locate(0,15);
+        //lcd.printf("%d",GPS_DATA);  Pas possible pour le moment
+        
       }
-  
- 
-  
-}
\ No newline at end of file
+  }