projet en 1 main.cpp

Dependencies:   DHT11 HMC5883L

Committer:
jijou
Date:
Fri Jan 20 22:30:12 2017 +0000
Revision:
0:0e12a7930611
Child:
1:352fcb35e812
C'est boucl? je pense

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jijou 0:0e12a7930611 1 #include "mbed.h"
jijou 0:0e12a7930611 2
jijou 0:0e12a7930611 3 Serial pc(PA_0,PA_1); // tx, rx
jijou 0:0e12a7930611 4
jijou 0:0e12a7930611 5 char gpsString[1024];
jijou 0:0e12a7930611 6 char tmp[20] = {};
jijou 0:0e12a7930611 7 char tmp2[20] = {};
jijou 0:0e12a7930611 8 char gga1[1024];
jijou 0:0e12a7930611 9 char * gga2;
jijou 0:0e12a7930611 10 char * fix;
jijou 0:0e12a7930611 11 uint8_t sep;
jijou 0:0e12a7930611 12 uint8_t mode = 2; //mode=1 fix information; mode=2 normal
jijou 0:0e12a7930611 13
jijou 0:0e12a7930611 14 typedef struct {
jijou 0:0e12a7930611 15 uint8_t heure;
jijou 0:0e12a7930611 16 uint8_t minute;
jijou 0:0e12a7930611 17 uint8_t seconde;
jijou 0:0e12a7930611 18 } tim_t;
jijou 0:0e12a7930611 19
jijou 0:0e12a7930611 20 typedef struct {
jijou 0:0e12a7930611 21 uint8_t deg;
jijou 0:0e12a7930611 22 uint8_t min;
jijou 0:0e12a7930611 23 double sec;
jijou 0:0e12a7930611 24 char azimute;
jijou 0:0e12a7930611 25 } pos_t;
jijou 0:0e12a7930611 26
jijou 0:0e12a7930611 27 typedef struct {
jijou 0:0e12a7930611 28 tim_t tim;
jijou 0:0e12a7930611 29 pos_t lat;
jijou 0:0e12a7930611 30 pos_t lon;
jijou 0:0e12a7930611 31 uint8_t sat; // Nombre de satellites utilisés pour calculer les coordonnées
jijou 0:0e12a7930611 32 uint8_t fix; // Fix qualification : (0 = non valide, 1 = Fix GPS, 2 = Fix DGPS), Type de positionnement (le 1 est un positionnement GPS)
jijou 0:0e12a7930611 33 float prs; // Précision horizontale ou HDOP (Horizontal dilution of precision)
jijou 0:0e12a7930611 34 float alt; // Altitude, en Metres, au dessus du MSL (mean see level) niveau moyen des Océans.
jijou 0:0e12a7930611 35 char unitAlt; // Unité de l'altitude (en mètre dans la majorité des trames)
jijou 0:0e12a7930611 36 } gps_t;
jijou 0:0e12a7930611 37
jijou 0:0e12a7930611 38 // structure contenant les données de la trame GGA à envoyer
jijou 0:0e12a7930611 39 gps_t GPGGA;
jijou 0:0e12a7930611 40
jijou 0:0e12a7930611 41 char * convert(char* ch, pos_t* pos) {
jijou 0:0e12a7930611 42
jijou 0:0e12a7930611 43 double f = atof(ch);
jijou 0:0e12a7930611 44
jijou 0:0e12a7930611 45 pos->deg = (uint8_t)(f / 100.0);
jijou 0:0e12a7930611 46 pos->min = (uint8_t)(f - ((pos->deg) * 100.0));
jijou 0:0e12a7930611 47 pos->sec = 60.0*(f - ((pos->deg)*100.0) - (pos->min));
jijou 0:0e12a7930611 48
jijou 0:0e12a7930611 49 char *s = (char*)calloc(14,sizeof(char));
jijou 0:0e12a7930611 50
jijou 0:0e12a7930611 51 sprintf(s,"%3d°%2d'%5.3f\"",pos->deg,pos->min,pos->sec);
jijou 0:0e12a7930611 52
jijou 0:0e12a7930611 53 return s;
jijou 0:0e12a7930611 54 }
jijou 0:0e12a7930611 55
jijou 0:0e12a7930611 56 char * time(char* ch, tim_t* tim) {
jijou 0:0e12a7930611 57
jijou 0:0e12a7930611 58 char hh[3], mm[3], ss[7];
jijou 0:0e12a7930611 59 //hhmmss.nnn
jijou 0:0e12a7930611 60 memcpy(hh, &ch[0], 2);
jijou 0:0e12a7930611 61 memcpy(mm, &ch[2], 2);
jijou 0:0e12a7930611 62 memcpy(ss, &ch[4], 6);
jijou 0:0e12a7930611 63
jijou 0:0e12a7930611 64 tim->heure = atoi(hh);
jijou 0:0e12a7930611 65 tim->minute = atoi(mm);
jijou 0:0e12a7930611 66 tim->seconde = atoi(ss); //cast de double vers intteger, on perd la précision des millisecondes
jijou 0:0e12a7930611 67 tim->heure++; //convertion des heures de UTC vers UTC+1
jijou 0:0e12a7930611 68
jijou 0:0e12a7930611 69 char *s = (char*)calloc(14,sizeof(char));
jijou 0:0e12a7930611 70
jijou 0:0e12a7930611 71 sprintf(s,"%02d:%02d:%02d",tim->heure,tim->minute,tim->seconde);
jijou 0:0e12a7930611 72
jijou 0:0e12a7930611 73 return s;
jijou 0:0e12a7930611 74 }
jijou 0:0e12a7930611 75 /**************************************/
jijou 0:0e12a7930611 76
jijou 0:0e12a7930611 77 uint8_t parseGGA() {
jijou 0:0e12a7930611 78 gga2 = strtok(gga1, ",");
jijou 0:0e12a7930611 79 while (gga2 != NULL) {
jijou 0:0e12a7930611 80 sep++;
jijou 0:0e12a7930611 81 switch (sep) {
jijou 0:0e12a7930611 82 case 1: // heure d'envoi de la trame
jijou 0:0e12a7930611 83 if (mode == 2) {
jijou 0:0e12a7930611 84 strcpy(tmp2,time( gga2,&(GPGGA.tim) ));
jijou 0:0e12a7930611 85 pc.printf("\nTim: %s\n\r",tmp2);
jijou 0:0e12a7930611 86 }
jijou 0:0e12a7930611 87 break;
jijou 0:0e12a7930611 88 case 2 : // latitude
jijou 0:0e12a7930611 89 if (mode == 2) {
jijou 0:0e12a7930611 90 strcpy(tmp,convert( gga2,&(GPGGA.lat) ));
jijou 0:0e12a7930611 91 pc.printf("Lat:%s",tmp);
jijou 0:0e12a7930611 92 }
jijou 0:0e12a7930611 93 break;
jijou 0:0e12a7930611 94 case 3 : // N: Nord, S : Sud
jijou 0:0e12a7930611 95 if (mode == 2) {
jijou 0:0e12a7930611 96 GPGGA.lat.azimute = gga2[0];
jijou 0:0e12a7930611 97 //strcpy(GPGGA.lat.azimute,gga2);
jijou 0:0e12a7930611 98 pc.printf("%s\n\r",gga2);
jijou 0:0e12a7930611 99 wait(0.25);
jijou 0:0e12a7930611 100 }
jijou 0:0e12a7930611 101 break;
jijou 0:0e12a7930611 102 case 4 : // longitude
jijou 0:0e12a7930611 103 if (mode == 2) {
jijou 0:0e12a7930611 104 strcpy(tmp,convert( gga2,&(GPGGA.lat) ));
jijou 0:0e12a7930611 105 pc.printf("Lon:%s",tmp);
jijou 0:0e12a7930611 106 }
jijou 0:0e12a7930611 107 break;
jijou 0:0e12a7930611 108 case 5 : // E: Est, W: Ouest
jijou 0:0e12a7930611 109 if (mode == 2) {
jijou 0:0e12a7930611 110 GPGGA.lat.azimute = gga2[0];
jijou 0:0e12a7930611 111 //strcpy(GPGGA.lon.azimute,gga2);
jijou 0:0e12a7930611 112 pc.printf("%s\n\r",gga2);
jijou 0:0e12a7930611 113 wait(0.25);
jijou 0:0e12a7930611 114 }
jijou 0:0e12a7930611 115 break;
jijou 0:0e12a7930611 116 case 6:
jijou 0:0e12a7930611 117 if (mode == 1) {
jijou 0:0e12a7930611 118 if (gga2 == "0") {
jijou 0:0e12a7930611 119 fix = "Invalid";
jijou 0:0e12a7930611 120 }
jijou 0:0e12a7930611 121 if (gga2 == "1") {
jijou 0:0e12a7930611 122 fix = "GPS Fix (SPS)";
jijou 0:0e12a7930611 123 }
jijou 0:0e12a7930611 124 if (gga2 == "2") {
jijou 0:0e12a7930611 125 fix = "DGPS Fix";
jijou 0:0e12a7930611 126 }
jijou 0:0e12a7930611 127 if (gga2 == "3") {
jijou 0:0e12a7930611 128 fix = "PPS Fix";
jijou 0:0e12a7930611 129 }
jijou 0:0e12a7930611 130 if (gga2 == "4") {
jijou 0:0e12a7930611 131 fix = "Real Time Kinematic";
jijou 0:0e12a7930611 132 }
jijou 0:0e12a7930611 133 if (gga2 == "5") {
jijou 0:0e12a7930611 134 fix = "Float RTK";
jijou 0:0e12a7930611 135 }
jijou 0:0e12a7930611 136 if (gga2 == "6") {
jijou 0:0e12a7930611 137 fix = "Estimated (Dead Reckoning)";
jijou 0:0e12a7930611 138 }
jijou 0:0e12a7930611 139 if (gga2 == "7") {
jijou 0:0e12a7930611 140 fix = "Manual Input Mode";
jijou 0:0e12a7930611 141 }
jijou 0:0e12a7930611 142 if (gga2 == "8") {
jijou 0:0e12a7930611 143 fix = "Simulation Mode";
jijou 0:0e12a7930611 144 }
jijou 0:0e12a7930611 145 GPGGA.fix = atoi(gga2);
jijou 0:0e12a7930611 146 pc.printf("FIX: %s_%s",gga2,fix);
jijou 0:0e12a7930611 147 }
jijou 0:0e12a7930611 148 break;
jijou 0:0e12a7930611 149 case 7 : // Nombre de satellites
jijou 0:0e12a7930611 150 if (mode == 2) {
jijou 0:0e12a7930611 151 GPGGA.sat = atoi(gga2);
jijou 0:0e12a7930611 152 pc.printf("Inf: Sat:%s",gga2);
jijou 0:0e12a7930611 153 }
jijou 0:0e12a7930611 154 break;
jijou 0:0e12a7930611 155 case 8 : // Precision
jijou 0:0e12a7930611 156 if (mode == 2) {
jijou 0:0e12a7930611 157 GPGGA.prs = atof(gga2);
jijou 0:0e12a7930611 158 pc.printf(" Prs:%s",gga2);
jijou 0:0e12a7930611 159 }
jijou 0:0e12a7930611 160 break;
jijou 0:0e12a7930611 161 case 9 : // Altitude
jijou 0:0e12a7930611 162 if (mode == 2) {
jijou 0:0e12a7930611 163 GPGGA.alt = atof(gga2);
jijou 0:0e12a7930611 164 pc.printf(" Alt:%s",gga2);
jijou 0:0e12a7930611 165 }
jijou 0:0e12a7930611 166 break;
jijou 0:0e12a7930611 167 case 10 : // Unité altitude
jijou 0:0e12a7930611 168 if (mode == 2) {
jijou 0:0e12a7930611 169 GPGGA.unitAlt = gga2[0];
jijou 0:0e12a7930611 170 pc.printf("%s\n\r",gga2);
jijou 0:0e12a7930611 171 }
jijou 0:0e12a7930611 172 break;
jijou 0:0e12a7930611 173 }
jijou 0:0e12a7930611 174 gga2 = strtok(NULL, ",");
jijou 0:0e12a7930611 175 }
jijou 0:0e12a7930611 176 sep = 0;
jijou 0:0e12a7930611 177 return *gga2;
jijou 0:0e12a7930611 178 }
jijou 0:0e12a7930611 179
jijou 0:0e12a7930611 180 uint8_t getGPSstring(uint8_t str) { // str used to choose between GPS trame type, here we have only GPGGA wich is available
jijou 0:0e12a7930611 181 if (pc.scanf("%s", &gpsString) ==1) {
jijou 0:0e12a7930611 182 if(str==1) {
jijou 0:0e12a7930611 183 if (sscanf(gpsString, "$GPGGA,%s",gga1) >=1) {
jijou 0:0e12a7930611 184 sep = 0;
jijou 0:0e12a7930611 185 parseGGA();
jijou 0:0e12a7930611 186 }
jijou 0:0e12a7930611 187 return *gga2;
jijou 0:0e12a7930611 188 }
jijou 0:0e12a7930611 189 }
jijou 0:0e12a7930611 190 else
jijou 0:0e12a7930611 191 {
jijou 0:0e12a7930611 192 pc.printf("NO GPGGA DATA RECEIVED\n\r");
jijou 0:0e12a7930611 193 return 0;
jijou 0:0e12a7930611 194 }
jijou 0:0e12a7930611 195 }