IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Calcul date en fonction de semaine et jour GPS


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut Calcul date en fonction de semaine et jour GPS
    Bonjour,
    Je programme un PIC (microchip) qui reçois des données d'un GPS. Celui ci fournit:
    - un GPS_Time qui me donne un nombre de seconde depuis le dernier dimanche minuit(d'ou j'en ai récupéré un nombre de jour)
    - un GPS_Week qui représente le nombre de semaine passé depuis le 6 janvier 1980. (C'est là que ce trouve mon problème)
    Je recherche désespérément un moyen de calculer la date (jour, mois, année), sous quelque forme que ce soit (fonction c toute fait dont je pourrais m'inspirer, algorythme, méthode ...)

    Est ce que quelqu'un aurait deja fait quelque chose du genre, ou aurait une idée de la marche à suivre pour en ressortir les informations que je cherche?

    Je vous remercie d'avance pour tout indice qui m'aiderait.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Si tu as accès aux fonctions déclarées dans time.h, tu peux :

    calculer le time_t correspondant au 6 janvier 1980 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        struct tm ge = {0, 0, 0, 6, 0, 80, 0, 0, 0};
        time_t GPS_epoch = mktime (&ge);
    puis d'y ajouter le décalage du aux semaines et aux secondes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        time_t now;
     
        now = GPS_epoch;
        /* conversion semaines --> secondes
             7 jours dans une semaine
            24 heures dans un jour
            60 minutes dans une heure
            60 secondes dans une minute*/
        now += GPS_week * 7 * 24 * 60 * 60;
        now += GPS_time;
    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include <stdio.h>
    #include <time.h>
     
    void display_date(int GPS_time, int GPS_week)
    {
        struct tm ge = {0, 0, 0, 6, 0, 80, 0, 0, 0};
        time_t GPS_epoch = mktime (&ge);
        time_t now;
     
        now = GPS_epoch;
        now += GPS_week * 7 * 24 * 60 * 60;
        now += GPS_time;
     
        printf("date is %s", ctime(&now));
    }
     
    int main(void)
    {
        display_date(0, 0);
        display_date(160000, 1600);
     
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    date is Sun Jan  6 00:00:00 1980
    date is Mon Sep  6 21:26:40 2010

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    les fonctions et structures de temps de C (time.h : mktime, gmtime, etc), se basent sur le nombre de secondes depis le 1er Janvier 1970 00h00.


    Tu dois avoir une définition de ton GPS_Week (sans doute 7 jours de 24h00), qui doit tenir compte, je suppose, des années bisextiles, puisque tu n'as plus après que le nombre de secondes de la semaine.


    Tu dois donc pouvoir trouver le nombre de secondes écoulées depuis le 6 Janvier 1980.

    Tu calcules l'équivalent avec les fonctions C.

    Et tu as ton calcul..


    tu utilises les fonctions pour décomposer en date..


    [Grilled ]

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    les fonctions et structures de temps de C (time.h : mktime, gmtime, etc), se basent sur le nombre de secondes depis le 1er Janvier 1970 00h00.
    Je n'ai malheureusement pas acces à ces fonctions dans mon compilateur (sdcc) et petit pic
    Citation Envoyé par souviron34 Voir le message
    Tu dois avoir une définition de ton GPS_Week (sans doute 7 jours de 24h00), qui doit tenir compte, je suppose, des années bisextiles, puisque tu n'as plus après que le nombre de secondes de la semaine.

    Tu dois donc pouvoir trouver le nombre de secondes écoulées depuis le 6 Janvier 1980.

    [Grilled ]
    Merci pour ces réponses, mais je souhaiterais ne pas avoir à travailler sur un float pour effectuer ces calculs (ce qui est générateur de opcodes énormes sur un composant tel que le pic).
    Théoriquement, je devais pouvoir calculer cette date qu'avec 3 char(YY mm dd) et 1 int contenant le nombre de jour (avec un int je peux couvrir 179 ans...A moi le bug de l'an 2179).

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut Réponse semi correcte
    Bon, j'ai fini par trouver quelque chose qui devrait marcher.
    Il reste à intégrer la gestion de la dernière annee bisextile. Mais j'ai pas encore trouvé l'astuce qui tue. En fait, ce sera vraiement dans le cas ou on est le 29 février, qu'il y aura un problème. Cela me laisse 3 ans pour y réfléchir

    J'ai mis le code ci-dessous si ça intéresse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
                    // Calcul de la date du jour
    		// Décallage au 1er mars 1996 : annee bisextile
    		day=week-842;         // 1 mars 1996
    		year=1996;
    		month=3;
    		day=(day*7)+Wday;   // 1 mars 1996 (et ajout du jour de la semaine)
                                                        // Il faudrait enlever 1 jour pour etre vraiement le 1mars
                                                        //Mais il faut aussi en ajouter 1 car le 1er jour de chaque mois est 1 et non 0 
     
    		while (day >=1461)   // 1461 = 4 ans
    			{
    			year=year+4;
    			day=day-1461;
    			}
    		bisextil=0;
    		while ((day >=365)&&(bisextil<4))   // 1 an
    			{
    			bisextil++;
    			year++;
    			day=day-365;			
    			}
    		while (day >=Len_month[month])    // 1 mois en cours
    			{
    			day =day-Len_month[month];
    			month++;
    			}
    note : - Wday est le jour de la semaine calculé avec la trame GPSTime (Nb de seconde depuis dimanche 0h00)
    - Len_month[12] est un tableau static en FLASH contenant le Nb de chaque mois, en commençant par mars

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 109
    Points : 168
    Points
    168
    Par défaut
    Comme ça peut-être...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #include <stdio.h>
     
    void gps2jma(int GPS_week, int GPS_time, int *j, int *m, int *a)
    {
      int t0, t1, t2, t3;
     
      t0 = (2444245 + GPS_week * 7 + GPS_time / 86400) + 68569;
      t1 = (4 * t0) / 146097;
      t0 = t0 - (146097 * t1 + 3) / 4;
      t2 = (4000 * (t0 + 1)) / 1461001;
      t0 = t0 - (1461 * t2) / 4 + 31;
      t3 = (80 * t0) / 2447;
      *j = t0 - (2447 * t3) / 80;
      *m = t3 + 2 - (12 * (t3 / 11));
      *a = 100 * (t1 - 49) + t2 + (t3 / 11);
    }
     
    int main(void)
    {
      int jour,
          mois,
          annee,
          GPS_week = 1524,
          GPS_time = 345600;
     
      gps2jma(GPS_week, GPS_time, &jour, &mois, &annee);
      printf("\nGPS_week: %d\nGPS_time: %d\nResultat: %02d/%02d/%d\n", GPS_week, GPS_time, jour, mois, annee);
      return 0;
    }
    Résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    GPS_week: 1524
    GPS_time: 345600
    Resultat: 26/03/2009

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tymop Voir le message
    Il reste à intégrer la gestion de la dernière annee bisextile. Mais j'ai pas encore trouvé l'astuce qui tue. En fait, ce sera vraiement dans le cas ou on est le 29 février, qu'il y aura un problème. Cela me laisse 3 ans pour y réfléchir
    Algorithme hyper-connu, et même donné plusieurs fois sur ce forum (en particulier section Algorithmes).


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recherche fonction retournant numero du jour de la semaine à partir d'une date
    Par Cogito.11 dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 22/06/2009, 11h10
  2. Liste dates en fonction du jour semaine
    Par alcabk dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 09/10/2007, 11h00
  3. Réponses: 10
    Dernier message: 09/01/2006, 18h39
  4. Réponses: 3
    Dernier message: 18/10/2005, 15h34
  5. Obtenir des dates en fonction du n° de la semaine
    Par coeur74 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/02/2005, 13h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo