Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

PIC18F GPS-COMPASS Ublox 7N
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2598
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#41 Message par paulfjujo » dim. 16 oct. 2016 20:37

bonsoir,

CORRECTIF HEURE UTC GPS -> HEURE LOCALE


Dans la version GPS (Sans GSM2), je recupere la trame RMC pour avoir la date
et j'ai trouvé sur le web une astuce : formule pour trouver les dates d''heure ete/hiver
voila comment je l'applique,
à partir de l'heure UTC delivree par la trame GGA et la date d ela trame RMC
(n'ayant plus, à disposition , le correctif GSM)

Code : Tout sélectionner


void Calcule_Heure_Locale
(char Heure_Utc)
{

         
int h,DNow,DMin,DMax;
         
int EF,An,Mars,Octobre;
         
unsigned char HH[4]; // 4 taille d'un byte en ascii 0 à +255
         
strConstRamCpy(HLocale,"  H  M  S ");
         
memcpy(HH,Heure_Utc,2);
         
An=2000+AA;
         
EF=(An+(An/4))%7;
         
Mars=31-((EF+5)%7);
         
Octobre=31-((EF+2)%7);
          
#ifdef Test_mode
         // pour debugging only
         
sprintf(txt,"\r\nAn=%d EF=%d  Mars=%d  Octobre=%d \r\n",An,EF,Mars,Octobre);
         
UART1_Write_Text(txt);
         
#endif
          //An=2016 EF=0  Mars=26  Octobre=29  test le 15/10/2016
          
DNow=( int) MM100 + (int) JJ;
          
DMin300+  Mars;
          
DMax1000Octobre;
          
DecalJ=0;
          if ((
DNow>DMin) && (DNow<DMax))
          {
            
Drapeaux.Heure_Ete=1;
             
hatoi(HH)+2;   // rajoute fuseau horaire +1H decalage ete
           
}
             else
            {  
Drapeaux.Heure_Ete=0;
              
hatoi(HH+1);   // rajoute fuseau horaire
          
}
          if (
h>23)
          {
            
h=0;DecalJ=1;
          }
          
k=strlen(Heure_Utc);
          
ByteToStr(h,HH);
          
memcpy(HLocale,HH+1,2);     // car sur 3 cars, on a besoin que de 2  cars
          
memcpy(HLocale+3,Heure_Utc+2,2);
          
memcpy(HLocale+6,Heure_Utc+4,2);
          
HLocale[11]=0;
 }
 


la formule donne
//An=2016 EF=0 Mars=26 Octobre=29 testé le 15/10/2016
Aide toi, le ciel ou FantasPic t'aidera

PIC18F GPS-COMPASS Ublox 7N
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2598
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#42 Message par paulfjujo » sam. 22 oct. 2016 14:44

bonjour,


GPS Ublox 7N -> stockage d'un parcours sur EEprom 1Mbits et envoi (optionel) sur terminal via Bluetooth HC06
le projet complet ICI.
mais je bute actuellement sur un probleme avec l'usage de strcat concatenation de string avec un const string (",")
je recupere 3 valeurs en flottant : Longitude,latitude et Altitude
je les mets à l'echelle en Degres decimaux et les retransforme en string avec un nombre de decimales figees
puis je veux les concatener en une seule chaine .. destinée à remplir un fichier KML (Google Earth)
avec donc ce format :
5.038765,45.845403,189.2
virgule en separateur et espace en fin de chaine => 1 point GPS


je constate que strcat ne se comporte pas correctement lorsque je l'utilise dans une fonction
alors que c'est OK, dans le main programme.

la fonction pour recuperer le point GPS au format KML

Code : Tout sélectionner


void Display_Trames_On_Terminal
()
{
     #ifdef  With_Option_BP12_EA1
    // Optional output on terminal
     strConstRamCpy( txt,"BP1=    ;BP2=     ; EA1= ");
     *(txt+4)=BP1+48;
     *(txt+13)=BP2+48;
     EA1=ADC_Read(1);
     WordToStr(EA1,CRam1);
     strcat(txt,CRam1);
     UART1_Write_Text(txt);
     CRLF1();
    #endif
            Calcule_Heure_Locale(Utc);
            UART1_Write_Text(HLocale);       // @ici
            UART1_Write_CText(" Lon : ");
            lon= atof(Longitude);
            f1=lon/100.0;
            f1=floor(lon/100.0);
            f2=(lon/100)-f1;
            lon=f1+f2*100/60;
            if(NSid=='S') lon=lon*-1.0;
            fltToa (lon,CRam1,6);
            // init avec 32
            for(i=0;i<32;i++) Trame_KML[i]=32;
            Trame_KML[0]=0;
            strcpy(Trame_KML,CRam1);
         //    k=strlen(Trame_KML);       //<- solution de rechange
          //  Trame_KML[k]=',';
          //  Trame_KML[k+1]=0;
            strcat(Trame_KML,",");     // <-- BAD avec cela
            UART1_Write_Text(CRam1);
            UART1_Write(' ');UART1_Write(NSid);
           // KML= 5.038666,45.845403191.0
            UART1_Write_CText("  Lat : ");
            lat= atof(Latitude);
            f1=lat/100.0;
            f1=floor(lat/100.0);
            f2=(lat/100)-f1;
            lat=f1+f2*100/60;
            if(EWid=='W') lat=lat*-1.0;
            fltToa (lat,CRam1,6);
             strcat(Trame_KML,",");
            UART1_Write_Text(CRam1);
            UART1_Write(' '); UART1_Write(EWid);
             UART1_Write_CText("     Alt : ");
            alt= atof(Altitude);
            fltToa (alt,CRam1,1);
            strcat(Trame_KML,CRam1);
            UART1_Write_Text(CRam1);
            k=strlen(Trame_KML);
            Trame_KML[k]=' ';   // space instead of   string terminator
           Trame_KML[31]=0; // rajout zero pour pouvoir afficher en string
            UART1_Write_CText("   Satel: ");
            UART1_Write_Text(Satellites);
            UART1_Write_CText("    HDOP : ");
            UART1_Write_Text(HDOP);
            UART1_Write_CText("    Fix: ");
            UART1_Write(GPSFIX);
            strConstRamCpy(CRam1," Tracking= \r\n");
            *(CRam1+10)=Tracking_Status+48;
            UART1_Write_Text(CRam1);
            CRLF1();
            UART1_Write_Text(Trame_KML);
            //       //5.038833,45.845437194.7     <--- BAD !!!
              CRLF1();
            //Trame_KML[31]=32;  // remet l'espace !
 


Pouratnt, l'impression , faite via cette fonction, donne des valeurs correctes sur le terminal
ex:
22/10/16 12H27M03S Lon : 5.038782 N Lat : 45.845403 E Alt : 191.7 Satel: 09 HDOP : 0.93 Fix: 1 Tracking=0



le test dans le main qui donne un resultat OK

Code : Tout sélectionner

/* test zone
     CRLF1();

            lon=5.038699;
            fltToa (lon,CRam1,6);
            for(i=0;i<32;i++) Trame_KML[i]=32;
            Trame_KML[0]=0;
            strcpy(Trame_KML,CRam1);
            strcat(Trame_KML,",");
           // KML= 5.038666,45.845403191.0
            lat=45.845403;
            fltToa (lat,CRam1,6);
            strcat(Trame_KML,CRam1);
            strcat(Trame_KML,",");
           //5.038833,45.845437194.7
            alt= 193.9;
            fltToa (alt,CRam1,1);
            strcat(Trame_KML,CRam1);
            k=strlen(Trame_KML);
            Trame_KML[k]=' ';   // space instead of   string terminator
            Trame_KML[31]=0; // rajout zero pour pouvoir afficher en string
            UART1_Write_Text(Trame_KML);
            CRLF1();
            while(1);
// resultat OK
 //5.038699,45.845398,193.9



si j'utilise une façon conventionelle pour rajouter une virgule au string

Code : Tout sélectionner


            strcat
(Trame_KML,CRam1);
            k=strlen(Trame_KML);
            Trame_KML[k]=',';
            Trame_KML[k+1]=0;
 


le resultat est OK
5.038782,45.845403,191.7
j'ai envoyé un TICKET à MikroE sur ce sujet .. attend une reponse.
Aide toi, le ciel ou FantasPic t'aidera

PIC18F GPS-COMPASS Ublox 7N
Jérémy
Administrateur du site
Administrateur du site
Messages : 2727
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#43 Message par Jérémy » sam. 22 oct. 2016 15:31

Hello,n

Ca me rappelle vaguement les problèmes étranges que j'avais mon GSM2 !

Bizarre vous avez dis bizarre !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

PIC18F GPS-COMPASS Ublox 7N
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2598
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#44 Message par paulfjujo » jeu. 27 oct. 2016 11:42

bonjour,

ticket ref #LEU-128-17545, sur MikroE

la reponse MikroE

Code : Tout sélectionner


You have defined in your code
:

static unsigned char Trame_KML[32];
char CRam1[40];

So, CRam1 has a length greater than Trame_KML,
and strcpy function will not work, please take a look at this link:

http://www.cplusplus.com/reference/cstring/strcpy/ 

This line: strcat(Trame_KML,CRam1); 
cannot work correctly
,you can take a look in the Help menu in the compiler for strcat function is written:
"to string must have enough space to store the result" and Trame_KML doesn't have enough space.

You can check my claims through debugger. I suggest you to change size of the array Trame_KML,
or you can try to use the pointer, please take a look in the Help menu there are given examples.



il va sans dire que je ne suis pas d'accord avec cette analyse

d'ou ma réponse:


Hello,

I am not agree with your diagnostic of this problem.

Except that the destination must have enough caractere (bytes Size) reserved to receive other string.
http://www.cplusplus.com/reference/cstring/strcpy/
To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same
C string as source (including the terminating null character), and should not overlap in memory with source.


Even i define a size of 40 bytes for each area ( CRam1 and Trame_KML)
it this the same bad behavior.
an when i use strcat , CRam1 size is never more than 19 bytes .. so less than area of Trame_KML
When we are talking about string, this string length is delimited by the last zero value.
If we have reserved a sufficient area to receive the string , we normally can’t get overwriting

I have many years of experience in C langage ..
TURBO C2.00, Borland C5 , Visual C++, MPLAB C18 ...
and MikroC is not the most ANSI compliant !

i did many other tests, and trace every step on my terminal
size of string, value of string...

and my own conclusion is:
string library can’t correctly manage constant string ...
to many edge effect when using outside main program.
and also, Interrupt can also affect strlen calculation !

i can go ahead ,over this problem with :
k=strlen(Trame_KML);
Trame_KML[k]=',';
Trame_KML[k+1]=0;

or using
strConstRamCpy(txt,",") ; // use of comma in RAM isnstead of ROM
strcat(Trame_KML,txt);


Results with the below solutions
Even with a size of 32 bytes for Trame_KML and 40 bytes for CRam1 , the results are OK !

27/10/16 10H39M47S Lon : 5.038833
0)Trame_KML len= 0 <- len=0 because init Trame_KLM[0]=0;

0)CRam1 len= 8
5.038833 N Lat : 45.845384 E
1)Trame_KML len= 9

1)CRam1 len= 9

2)Trame_KML len= 18
3)txt len= 1
3)Trame_KML len= 19
Alt : 208.3 Satel: 07 HDOP : 1.29 Fix: 1 Tracking=0
5.038833,45.845384,208.3
<- Now the coma appears in the correct places


MikroE propose too short example in MikroC libraries
wich are not representative whith a bigger context
more code , more data ..
so your example are not reliable !

same as in UART_Write_Text(“Some text”);
doesn’t work in all context !
must use
strConstRamCpy(txt,“Some text”);
UART_Write_Text(txt);
to cover all cases.

Best Regards
Paul




j'aurais aimé un son de cloche UTILISATEUR ..


Survivor_18F87J50_48MHz_GPS_UBLOX_7N_seul_LCD_EEprom1MB_BT_161022.zip
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

PIC18F GPS-COMPASS Ublox 7N
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2598
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#45 Message par paulfjujo » jeu. 3 nov. 2016 20:49

bonsoir à tous,



Apres multes echanges avec MikroE (TICKET ref: SUPPORT #LEU-128-17545)
il s'avere enfin que le bug avec strcat est reconnu ...si utilisé dans une fonction (sous programme)
Nota: pas de bug si strcat utilisé dans le main programme.

Code : Tout sélectionner


I
'm sorry for the inconvenience.
I was able to reproduce not correct behavior of strcat function when it is not in the main function.
Thank you for reporting this and for your patience.
I have reported it to our developers.
Kind regards,
Lana




En attendant l'utilisation de ceci, peut palier à ce bug
exemple: rajouter une virgule entre des donnees , concaténe dans Trame_KML
qui au depart est un tableau de char ayant une longuer suffisante pour tout contenir !

k=strlen(Trame_KML); // k pointe à la fin de Trame_KML
Trame_KML[k]=','; // je mets la virgule à la place du terminateur de string
Trame_KML[k+1]=0; // et je decale le terminateur de string d'une position

sinon , autre solution :
en passant le string "," en RAM , no problemo
strConstRamCpy(txt,",") ; // use of comma in RAM isnstead of ROM
strcat(Trame_KML,txt);
Aide toi, le ciel ou FantasPic t'aidera

PIC18F GPS-COMPASS Ublox 7N
Jérémy
Administrateur du site
Administrateur du site
Messages : 2727
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#46 Message par Jérémy » mar. 15 nov. 2016 19:10

Bonsoir à tous,

@Paul : arrives-tu as affiché en temps réel un point sur une carte de ta position ? genre sur une tablette ? Ou ne fais tu qu'enregistrer et traiter l'information ultérieurement ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

PIC18F GPS-COMPASS Ublox 7N
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2598
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#47 Message par paulfjujo » mer. 16 nov. 2016 15:28

Jérémy a écrit : arrives-tu as affiché en temps réel un point sur une carte de ta position ?

NON, pas encore..

Ou ne fais tu qu'enregistrer et traiter l'information ultérieurement ?

OUI

J'ai 2 versions:

une qui sert de tracker /enregistreur sur EEPROM 1Mb et qui au final
peut sortir un fichier au format KML
directement exploirable par Google Earth qui affichera le parcours effectué
(fichier recuperé sur un terminal quelconque par vidage du contenu de l'eeprom)

Une autre version, avec sortie simultanée sur Module BlueTooth HC06
pour recuperation dans un appli RFO basic Android tablette.
Je sais deja comment afficher un point sur une carte Googleearth.
cela se presente de cette façon

Code : Tout sélectionner






init starting zoom value
Z
=1
html
.close
pause 200
html
.open
pause 1000
a
$=right$(format$("%#",Z),2)
Zoom$="&zoom=" a$
Coordonnes$= format$("##%.#####"latitude) + ","format$("##%.#####"longitude)
 
Url$="http://maps.googleapis.com/maps/api/staticmap?"
  
Url$=Url$ +Zoom$
 ! 
Url$=Url$ + "&center="
 
Url$=Url$ + Coordonnes$
!  
Url$=Url$ + "&size=854x480&maptype=hybrid"
little problemo here center of what so false screen sizing to better re-center the location
  Url
$=Url$ + "&size=900x350&maptype=satellite" "&sensor=false""&markers="
  
Url$=Url$ + Coordonnes$
html.load.url Url$
 


.. appli android en cours ,pour du temps reel..

une option: liaison en version Bluetooth BLE et appli Appinventor2 .. Echange de datas qui tourne deja OK.

j'ai pas encore vu la partie geolocalistaion de appinventor 2
pour verifier si on peut faire un lien avec Google earth..
ou si on peut utilise un lien http comme avec RFO-basic.

et je n'ai pas encore trouvé une vraie documentation sur le protocole NMEA utilisé
en mode temps reel de Google Earth.. ce protocole semble etre proprietaire.
L'envoi de trame brute NMEA $GPPA..etc .. n'est pas capté.
Aide toi, le ciel ou FantasPic t'aidera

PIC18F GPS-COMPASS Ublox 7N
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2598
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#48 Message par paulfjujo » jeu. 24 nov. 2016 20:35

bonsoir à tous,

en réponse à Jeremy:

j'ai pu enfin compiler mon programme RFO basic -> appli APK
sur mon PC windows XP..
compliqué à cause des mises à jour SDK android et versions Java
pour afficher la position GPS Ublox 7N sur un smartphone Android : Startrail7
raffraichissement donné par l'appli PIC18F 4 secondes
ça marche ..
MAIS .. encore un petit souci ..
je n'ai pas la precision de positionnement voulue ??? ecart ~ 50m
differe de celle donnéee en directe par GoogleEarth , qui elle est à +-5M de la realité.

Est-ce que c'est parceque en ce moment , le temps est gris, couvert et que je ne capte que 4 ou 5 satellites seulement ?
GPS à l'interieur , fenetre fermé ..
il va falloir que je le teste dehors..

ou à cause des problemes de precision nombre flottants et transformations ...
à Eclaircir ...

des details ICI
source basic et APK

je peux eventuellement developper ces details si il y a demande ..

Startail7_Android_GPS7N_positionning.jpg
Aide toi, le ciel ou FantasPic t'aidera

PIC18F GPS-COMPASS Ublox 7N
Jérémy
Administrateur du site
Administrateur du site
Messages : 2727
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#49 Message par Jérémy » ven. 25 nov. 2016 09:24

C'est du trés trés lourd ! je ne pense pas avoir les connaissances nécessaires pour me lancer dans la fabrication d'un tracker avec transmission donnée en temps réel !
Certes cela m'aurait intéressé mais bon ..... il faut savoir ne pas visé trop haut !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

PIC18F GPS-COMPASS Ublox 7N
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1661
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#50 Message par Gérard » ven. 25 nov. 2016 11:15

Jérémy a écrit :C'est du trés trés lourd ! je ne pense pas avoir les connaissances nécessaires pour me lancer dans la fabrication d'un tracker avec transmission donnée en temps réel !
Certes cela m'aurait intéressé mais bon ..... il faut savoir ne pas visé trop haut !


Je suis bien d'accord avec toi Jérémy, Paul est d'un niveau que même avec des jumelles je ne vois pas. Du coup, ça rend modeste.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 119 invités