CmapGpsu/CmapGpsu.cpp

De Wiki EELL.

Version du 18 décembre 2010 à 16:32 par JPL (discuter | contributions)
(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)
/*O
 NOM DU FICHIER: CmapGpsu.cpp
 PROJET INITIAL: CmapGpsu Convertisseur de route CmapECS vers GPSUtility
 DOSSIER: CmapGpsu
 PROGRAMMEUR: ...
 DATE: 20 février 2004
 MODIFICATIONS:
 le:30/01/2010 par .............. 
 	objet de la modification: Compil pour Win32 Console UNICODE Windows 7
 le: ../../.. par

*/

/*D
        CmapGpsu
 -----------------------------------------------------------------------------
 ACTION:
	Lit le fichier Cmap ECS et crée un fichier texte pour GPS Utility

 SYNTAXE:
        #include <CmapGpsu.h>
        int CmapGpsu( int argc, char *argv[] )

 PORTABILITE:
        x86 Win32_Console UNICODE

 DESCRIPTION:
        int argc : Nombre de paramètres passés à la fonction CmapGpsu() 
	char *argv[] : Tableau des commandes ou fichiers (cmap) passés.

 VALEUR RETOURNEE:
        int 0 dans cette version (console)

 VOIR AUSSI:

 EXEMPLES:

*/

/*H  // CmapGpsu.c:
     extern int CmapGpsu( int argc, char *argv[] );
*/

// Validation du test unitaire
// #define TESTS_U

#ifdef TESTS_U
   #include "..\..\include\CmapGpsu.h"
   #include<stdlib.h>
#endif
#ifndef TESTS_U
   //#include <CmapGpsu.h>
   #include "..\include\CmapGpsu.h"
#endif
//#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>

     void LireLong(FILE *stream, long * Data)
     {
        //long int Data;
        *Data=(getc(stream)+256*getc(stream)+256*256*getc(stream)+256*256*256*getc(stream));
        //return Data;
     }

     char * LireChaine(FILE *stream, int Taille)
     {
        char *string;
        int i;
        string=(char*)calloc((Taille+1),sizeof(char));
        if(string==NULL)return NULL;
        else
        {
           if(Taille==0)string[0]='\0';
           else for(i=0;i<Taille;i++)string[i]=getc(stream);
              string[i]='\0';
        }
        return string;
     }

     struct WayPoint * LirePoint(FILE *stream)
     {
#ifdef TESTS_U
        static int i=0;
#endif
        struct WayPoint * point;
        point=(struct WayPoint*)malloc(sizeof(struct WayPoint));
#ifdef TESTS_U
        printf("Lecture du point %d\n",i++);
#endif
/*O    Lire le séparateur 0x02 puis le crochet '[' */
        if(getc(stream)==0x02); else return NULL;
        if(getc(stream)=='['); else return NULL;

/*O    Lire les champs de la structure WayPoint. */
        LireLong(stream, &point->TailleType);   // 6L
        if(point->TailleType>80L)return(NULL);
        point->Type=LireChaine(stream, point->TailleType);
        LireLong(stream, &point->crsss1);   // 1L
        LireLong(stream, &point->TailleLabel);
        if(point->TailleLabel>80L)return(NULL);
        point->Label=LireChaine(stream, point->TailleLabel);
        LireLong(stream, &point->TailleLatitude);
        if(point->TailleLatitude>10L)return(NULL);
        point->Latitude=LireChaine(stream, point->TailleLatitude);
        LireLong(stream, &point->TailleLongitude);
        if(point->TailleLongitude>10L)return(NULL);
        point->Longitude=LireChaine(stream, point->TailleLongitude);
        LireLong(stream, &point->Turn);
        LireLong(stream, &point->crsss2);   // 1L
        LireLong(stream, &point->TailleRemark);
        if(point->TailleRemark>80L)return(NULL);
        point->Remark=LireChaine(stream, point->TailleRemark);
        if(getc(stream)!=']')return(NULL);
#ifdef TESTS_U
        printf("Latitude : %s\nLongitude : %s\nRemarques : %s\n\n",
           point->Latitude,
           point->Longitude,
           point->Remark);
#endif

        return point;
     }

     struct Leg * LireLien(FILE *stream)
     {

#ifdef TETS_U
        static int i=0;
#endif
        struct Leg * lien;
        lien=(struct Leg*)malloc(sizeof(struct Leg));

#ifdef TETS_U
        printf("Lecture du lien %d\n",i++);exit(0);
#endif*/
/*O    Lire le séparateur 0x02 puis le crochet '[' */
        if(getc(stream)==0x02); else return NULL;
        if(getc(stream)=='['); else return NULL;
        LireLong(stream, &lien->TailleType);   // 4L
        if(lien->TailleType>80L)return(NULL);
        lien->Type=LireChaine(stream, lien->TailleType);
        LireLong(stream, &lien->crsss1);   // 1L
        LireLong(stream, &lien->TailleLabel);
        if(lien->TailleLabel>80L)return(NULL);
        lien->Label=LireChaine(stream, lien->TailleLabel);
        LireLong(stream, &lien->Deviation);
        LireLong(stream, &lien->Speed);
        LireLong(stream, &lien->TailleNoChar1);
        if(lien->TailleNoChar1>80L)return(NULL);
        lien->NoChar1=LireChaine(stream, lien->TailleNoChar1);
        LireLong(stream, &lien->crsss2);
        LireLong(stream, &lien->StartLegOnWpt);
        LireLong(stream, &lien->EndLegOnWpt);
        LireLong(stream, &lien->Num);
        LireLong(stream, &lien->TailleNoChar2);
        if(lien->TailleNoChar2>80L)return(NULL);
        lien->NoChar2=LireChaine(stream, lien->TailleNoChar2);
        LireLong(stream, (long*)&lien->Safety);

/*O    Lire les champs de la structure Leg. */
        if(getc(stream)!=']')return(NULL);
#ifdef TESTS_U
        printf("Label : %s\nDeviation : %ld\nSpeed : %ld\nStartWpt = %ld\nEndWpt = %ld\nSafety : %lx\n\n",
           lien->Label,
           lien->Deviation,
           lien->Speed,
           lien->StartLegOnWpt,
           lien->EndLegOnWpt,
           lien->Safety
           );
#endif

        return lien;
     }




/*O Programme CmapGpsu pour shells ou windows */
     int CmapGpsu( int argc, char *argv[])
     {
        int Iret = 0;        // retour de fonction
        int Retf = 0;
        char ch = ' ';       // variable caractère de saisie
        int i;               // entier de comptage de boucle
        long int lPoint;      // entier numéro de point
        long int l;          // entier de comptage
        FILE *InFile;        // flux d'entrée
        FILE *OutGpsuFile;   // flux d'écriture GPSU
        char OutGpsu[100]="";// nom du fichier GPSU
        FILE *OutReviewFile; // flux d'écriture de vérification et modif
        char OutRev[100]=""; // nom du fichier de vérification
        struct VersionCmap VCmap; //={0L,0L,"-------"};
        struct HeaderData Header;
        struct WayPoint **Wpt;
        struct Leg **Lien;
        // Entête d'un fichier GPSU
        char *HeaderGPSU = "H  SOFTWARE NAME & VERSION\n\
I  GPSU 4.04  FREEWARE VERSION\n\
S DateFormat=dd/mm/yy\n\
S Timezone=2\n\
S Units=N,M\n\
S SymbolSet=1\n\
\n\
H R DATUM\n\
M E               WGS 84 100  0.0000000E+00  0.0000000E+00 0 0 0\n\
\n\
H  COORDINATE SYSTEM\n\
U  LAT LON DM\n\
\n\
F ID---- Latitude     Longitude     Symbol---- T Comment\n";

          
/*O    Si le deuxième argument est vide quitter le programme */
		if(argc==1)ExitError(-1);
/*O    Ouvrir le fichier source de Route Cmap */
#ifdef TESTS_U
        printf("Ouverture du fichier %s\n",argv[1]);
#endif
        //if(InFile=fopen(argv[1],"rb")) // Version déprécioée
		if(!fopen_s(&InFile,argv[1],"rb"))
        {
#ifdef TESTS_U
           printf("Fichier %s ouvert\n",argv[1]);
           //for (i=0;i<16;i++) printf("%x\n",fgetc(InFile)); exit(0);
#endif
        }
        else
        {
#ifdef TESTS_U
           printf("Erreur à l'ouverture du fichier %s\n",argv[1]);
#endif
           ExitError(1); // erreur à l'ouverture du fichier CmapRoute
        }


/*O    Lire La version du fichier et son type */
        if((ch=fgetc(InFile))!=0x3a) ExitError(2); //erreur de type de fichier
		puts("0x3a OK"); // Test après erreur
        LireLong(InFile,(long*)&VCmap.Version);
        LireLong(InFile,&VCmap.TailleType);
        if(VCmap.TailleType>80) ExitError(2);
		puts("TailleType OK"); // Test après erreur
        VCmap.Type=LireChaine(InFile, VCmap.TailleType);

#ifdef TESTS_U
        printf("\nVersion:0x%lx \nTailleType:0x%lx \nType:%s\n\n",
           VCmap.Version,
           VCmap.TailleType,
           VCmap.Type);
        //exit(0);
#endif

/*O    Si la version et le type sont corrects */
        if (VCmap.Version==0x0101L); else ExitError(2);  // erreur de type de fichier
        if (VCmap.TailleType==0x07L); else ExitError(2);
        if (strcmp(VCmap.Type,"CMROUTE")!=0) ExitError(2);
        
/*O    Alors : */
        else
        {
/*O       Lire le séparateur 0x02 puis le crochet '[' */
           if(fgetc(InFile)==0x02); else ExitError(3);
           if(getc(InFile)=='['); else ExitError(3);

/*O       Lire l'entête des données et les stocker dans la structure HeaderData */
           LireLong(InFile,&Header.TailleType);   // 6L
           if(Header.TailleType>80)ExitError(4);
           Header.Type=LireChaine(InFile, Header.TailleType);
           LireLong(InFile,&Header.crsss1);   // 1L
           LireLong(InFile,&Header.TailleRoute);
           if(Header.TailleRoute>80)ExitError(4);
           Header.Route=LireChaine(InFile, Header.TailleRoute);
           LireLong(InFile,&Header.Num);
           LireLong(InFile,&Header.StartWayPoint);
           LireLong(InFile,&Header.EndWayPoint);
           LireLong(InFile,&Header.NbWayPoint);
           Header.NbLeg=Header.NbWayPoint-1; // Vérifier + loin ...
#ifdef TESTS_U
           printf("TTyp: %ld , Typ: %s\nTRte: %ld , Rte: %s\nStart: %ld , End: %ld\nNbWayPts = %ld\nNbLegs = %ld\n\n",
              Header.TailleType,
              Header.Type,
              Header.TailleRoute,
              Header.Route,
              Header.StartWayPoint,
              Header.EndWayPoint,
              Header.NbWayPoint,
              Header.NbLeg
              );
           //exit(0);
#endif

/*O       Si le Nombre de WayPoint est suppérieur à 0: */
           if (Header.NbWayPoint > 0L)
           {
              l=0;
              Wpt=(struct WayPoint**)calloc(Header.NbWayPoint,sizeof(struct WayPoint*));
              
/*O          Tant qu'il y a des WayPoint: */
              while (l<Header.NbWayPoint)
              {
#ifdef TESTS_U
                 printf("NbPoint=%ld\nl=%ld\n",Header.NbWayPoint,l);
#endif
                 if((Wpt[l]=LirePoint(InFile))!=NULL);else ExitError(5);
                 l++;
              }
#ifdef TESTS_U
              for(l=0;l<Header.NbWayPoint;l++)
                 printf("Label:%s|Lat=%s|Lon=%s|Rem:%s\n",
                 Wpt[l]->Label,
                 Wpt[l]->Latitude,
                 Wpt[l]->Longitude,
                 Wpt[l]->Remark
                 );
#endif           //exit(0); 
           }

           
/*O       Lire le nombre de traits */
           LireLong(InFile,&Header.NbLeg);

/*O       Si le nombre de traits est suppérieur à 0: */
           if (l=Header.NbLeg>0L)
           {
              l=0;
              Lien=(struct Leg**)calloc(Header.NbLeg,sizeof(struct Leg*));
              
/*O          Tant qu'il y a des liens (des traits): */
              while (l<Header.NbLeg)
              {
#ifdef TESTS_U
                 printf("\nNbLeg=%ld\nl=%ld\n",Header.NbLeg,l);
#endif
                 //Lien[l]=LireLien(InFile);
                 if((Lien[l]=LireLien(InFile))!=NULL);else ExitError(6);
                 l++;
              }

/*O          Si le prochain caractère est ']' tout s'est passé correctement! */
              if (getc(InFile)==']');else ExitError(7);
              fclose (InFile);
           }

/*O       Réinitialiser le nombre de traits */
           i=(int)Header.NbLeg;

/*O       Ouvrir les fichiers texte Gpsu, et Modif de Route */
           strcpy_s(OutGpsu,Header.Route);
           strcat_s(OutGpsu,".txt");
           if(fopen_s(&OutGpsuFile,OutGpsu,"w+"))ExitError(8);
           // if(OutGpsuFile==NULL)ExitError(8); // ancienne version

/*O       Ecrire l'entête du fichier GPSU */
           fprintf(OutGpsuFile,"%s",HeaderGPSU);

/*O       Initialiser le Point qui a pour adresse HeaderData.StartWayPoint */
           lPoint=Header.StartWayPoint;

/*O       Tant qu'il y a des Points écrire dans les fichiers texte: */
           l=0L;
           while(l<Header.NbWayPoint)
           {
              static int n=10;
              long int li;
              int found = 0;
              char ch;
             // W 0010   N43°33.1700' E004°04.8700' Waypoint   - GM PORT
             // F ID---- Latitude     Longitude     Symbol---- T Comment
             // W WP0010 N43°33.1700' E004°04.8700' Waypoint   - GM PORT

                    //l=NextWpt;

/*O          Le numéro de ligne "W 0010  " sur 8 caractères, */
              fprintf(OutGpsuFile,"W WP%.4d N",n);
              n=n+10;

/*O          La Latitude sous la forme: " N43°33.1700'" sur 13 caractères */
              if((ch=Wpt[lPoint]->Latitude[1])==' ')ch='0';
              fputc(ch,OutGpsuFile);
              if((ch=Wpt[lPoint]->Latitude[2])==' ')ch='0';
              fputc(ch,OutGpsuFile);
              fputc('°',OutGpsuFile);
              if((ch=Wpt[lPoint]->Latitude[4])==' ')ch='0';
              fputc(ch,OutGpsuFile);
              if((ch=Wpt[lPoint]->Latitude[5])==' ')ch='0';
              fputc(ch,OutGpsuFile);
              fputc('.',OutGpsuFile);
              if((ch=Wpt[lPoint]->Latitude[7])==' ')ch='0';
              fputc(ch,OutGpsuFile);
              if((ch=Wpt[lPoint]->Latitude[8])==' ')ch='0';
              fputc(ch,OutGpsuFile);

/*O          La Longitude sous la forme: " E004°04.8700'" sur 14 caractères */
              fprintf(OutGpsuFile,"00' E");
              if((ch=Wpt[lPoint]->Longitude[0])==' ')ch='0';
              fputc(ch,OutGpsuFile);
              if((ch=Wpt[lPoint]->Longitude[1])==' ')ch='0';
              fputc(ch,OutGpsuFile);
              if((ch=Wpt[lPoint]->Longitude[2])==' ')ch='0';
              fputc(ch,OutGpsuFile);
              fputc('°',OutGpsuFile);
              if((ch=Wpt[lPoint]->Longitude[4])==' ')ch='0';
              fputc(ch,OutGpsuFile);
              if((ch=Wpt[lPoint]->Longitude[5])==' ')ch='0';
              fputc(ch,OutGpsuFile);
              fputc('.',OutGpsuFile);
              if((ch=Wpt[lPoint]->Longitude[7])==' ')ch='0';
              fputc(ch,OutGpsuFile);
              if((ch=Wpt[lPoint]->Longitude[8])==' ')ch='0';
              fputc(ch,OutGpsuFile);

/*O          L'étiquette sous la forme " GM PORT" non limité en taille */
              fprintf(OutGpsuFile,"00' Waypoint   - %s\n",Wpt[lPoint]->Remark);
               
/*O          Chercher le lien et l'adresse du point suivant */
              for(li=0L;li<Header.NbLeg&&found==0;li++)
              {
                 //printf("\n%ld %ld -> %ld\n",lPoint,Lien[li]->StartLegOnWpt,Lien[li]->EndLegOnWpt);
                 if(Lien[li]->StartLegOnWpt==lPoint)
                 {
                    lPoint=Lien[li]->EndLegOnWpt;
                    found=1;
                 }
              }
               l++;
           }
           fclose(OutGpsuFile);

/*O       Ecrire l'entête du fichier Route */
           strcpy_s(OutRev,Header.Route);
           strcat_s(OutRev,".cmv");
           if(fopen_s(&OutReviewFile,OutRev,"w+"))ExitError(9);
           // if(OutReviewFile==NULL)ExitError(9); ancienne version pour open()
           fprintf(OutReviewFile,"%s //Route\n",Header.Route);
           fprintf(OutReviewFile,"%.8ld //Num\n",Header.Num);
           fprintf(OutReviewFile,"%.8ld //Start Legs\n",Header.StartWayPoint);
           fprintf(OutReviewFile,"%.8ld //End Legs\n",Header.EndWayPoint);
           fprintf(OutReviewFile,"%.8ld //Nb WayPoints\n",Header.NbWayPoint);
           fprintf(OutReviewFile,"%.8ld //Nb Legs\n",Header.NbLeg);
#ifdef EN
           fprintf(OutReviewFile,"WayPoints\nLine|Latitude  |Longitude |Turn|Label|Remark|\n");
           fprintf(OutReviewFile,           " Num|Deg Min   |Deg Min   | (m)|     |      |\n"); 
#endif
#ifdef FR
           fprintf(OutReviewFile,"WayPoints\nLign|Latitude  |Longitude |Turn|Label    |Remark  |\n");
           fprintf(OutReviewFile,           " Num|Deg Min   |Deg Min   | (m)|Etiquette|Remarque|\n"); 
#endif
           for(l=0L;l<Header.NbWayPoint;l++)
           {
              fprintf(OutReviewFile,"%4ld|%s|%s|%4d|%s|%s\n",\
                 l,\
                 Wpt[l]->Latitude,\
                 Wpt[l]->Longitude,\
                 Wpt[l]->Turn,\
                 Wpt[l]->Label,\
                 Wpt[l]->Remark
                 );
           }

#ifdef EN
           fprintf(OutReviewFile,"Legs\nDeviat|Speed|StartL|EndLeg|    Safety|Label|\n");
           fprintf(OutReviewFile,"   (m)|   kN|LineWp|LineWp|      Code|     |\n");
#endif
#ifdef FR
           fprintf(OutReviewFile,"Traits\nDeviat|Speed|DebTr.|FinTr.|    Safety|Label|\n");
           fprintf(OutReviewFile,"   (m)|Noeud|LignWp|LignWp|      Code|     |\n");
#endif
           for(l=0L;l<Header.NbLeg;l++)
           {
              fprintf(OutReviewFile,"%6ld|%5ld|%6ld|%6ld|Ox%.8lX|%s|\n",\
                 Lien[l]->Deviation,\
                 Lien[l]->Speed,\
                 Lien[l]->StartLegOnWpt,\
                 Lien[l]->EndLegOnWpt,\
                 Lien[l]->Safety,\
                 Lien[l]->Label\
                 );
           }
           fclose(OutReviewFile);
        }
        return (Iret);
     }

#ifdef TESTS_U /*T pour DOS uniquement ou QWIN */
     int main(int argc, char *argv[]) /*T*/
     { /*T*/
        int Iret; /*T*/
        printf("VERSION_CmapGpsu: %s\n",VERSION_CmapGpsu); /*T*/
        printf("TEST UNITAIRE du module \'CmapGpsu\'\n"); /*T*/
        Iret=CmapGpsu(argc, argv); /*T*/
        printf("FIN DU TEST UNITAIRE du module \'CmapGpsu\'\n"); /*T*/
		return 0; /*T*/
     } /*T*/
#endif /*T*/
Outils personnels