projet en 1 main.cpp

Dependencies:   DHT11 HMC5883L

Committer:
wallsow
Date:
Fri Jan 27 22:47:35 2017 +0000
Revision:
2:7e718a1be318
Parent:
1:352fcb35e812
Child:
3:d2c57ab99c8e
projet long + acto

Who changed what in which revision?

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