projet en 1 main.cpp

Dependencies:   DHT11 HMC5883L

Committer:
wallsow
Date:
Mon Feb 06 08:25:12 2017 +0000
Revision:
3:d2c57ab99c8e
Parent:
2:7e718a1be318
Child:
4:06944df56a2d
Instrctabl

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jijou 0:0e12a7930611 1 #include "mbed.h"
wallsow 3:d2c57ab99c8e 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
wallsow 3:d2c57ab99c8e 80
jijou 0:0e12a7930611 81 uint8_t parseGGA() {
jijou 0:0e12a7930611 82 gga2 = strtok(gga1, ",");
wallsow 3:d2c57ab99c8e 83 while (gga2 != NULL) {
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) ));
wallsow 3:d2c57ab99c8e 88 pc.printf("\r\n-----Donnees GPS-----\r\nTim: %s\r\n",tmp2);
wallsow 3:d2c57ab99c8e 89
jijou 0:0e12a7930611 90 }
jijou 0:0e12a7930611 91 break;
jijou 0:0e12a7930611 92 case 2 : // latitude
jijou 0:0e12a7930611 93 if (mode == 2) {
jijou 0:0e12a7930611 94 strcpy(tmp,convert( gga2,&(GPGGA.lat) ));
wallsow 2:7e718a1be318 95 sprintf(lati,"\r%s",tmp);
wallsow 2:7e718a1be318 96 pc.printf("\r%s",lati);
wallsow 3:d2c57ab99c8e 97
jijou 0:0e12a7930611 98 }
jijou 0:0e12a7930611 99 break;
jijou 0:0e12a7930611 100 case 3 : // N: Nord, S : Sud
jijou 0:0e12a7930611 101 if (mode == 2) {
jijou 0:0e12a7930611 102 GPGGA.lat.azimute = gga2[0];
jijou 0:0e12a7930611 103 //strcpy(GPGGA.lat.azimute,gga2);
jijou 0:0e12a7930611 104 pc.printf("%s\n\r",gga2);
jijou 0:0e12a7930611 105 wait(0.25);
jijou 0:0e12a7930611 106 }
jijou 0:0e12a7930611 107 break;
jijou 0:0e12a7930611 108 case 4 : // longitude
jijou 0:0e12a7930611 109 if (mode == 2) {
jijou 0:0e12a7930611 110 strcpy(tmp,convert( gga2,&(GPGGA.lat) ));
wallsow 2:7e718a1be318 111 sprintf(longi,"\r%s",tmp);
wallsow 2:7e718a1be318 112 pc.printf("\r%s",longi);
wallsow 2:7e718a1be318 113 // longi=tmp;
wallsow 2:7e718a1be318 114 // Ilongi=atoi(longi);
jijou 0:0e12a7930611 115 }
jijou 0:0e12a7930611 116 break;
jijou 0:0e12a7930611 117 case 5 : // E: Est, W: Ouest
jijou 0:0e12a7930611 118 if (mode == 2) {
jijou 0:0e12a7930611 119 GPGGA.lat.azimute = gga2[0];
jijou 0:0e12a7930611 120 //strcpy(GPGGA.lon.azimute,gga2);
jijou 1:352fcb35e812 121 pc.printf("%s\n\r-----Donnees GPS-----\r\n",gga2);
wallsow 3:d2c57ab99c8e 122
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;
wallsow 3:d2c57ab99c8e 183 }
jijou 0:0e12a7930611 184 gga2 = strtok(NULL, ",");
wallsow 3:d2c57ab99c8e 185 sep++;
jijou 0:0e12a7930611 186 }
wallsow 3:d2c57ab99c8e 187 sep = 1;
jijou 0:0e12a7930611 188 return *gga2;
wallsow 3:d2c57ab99c8e 189
jijou 0:0e12a7930611 190 }
jijou 0:0e12a7930611 191
wallsow 3:d2c57ab99c8e 192 uint8_t getGPSstring() { // str used to choose between GPS trame type, here we have only GPGGA wich is available
wallsow 3:d2c57ab99c8e 193 uint8_t str=1;
jijou 0:0e12a7930611 194 if (pc.scanf("%s", &gpsString) ==1) {
wallsow 3:d2c57ab99c8e 195 //pc.printf("Tentive");
wallsow 3:d2c57ab99c8e 196 if(str==1) {
wallsow 3:d2c57ab99c8e 197 if (sscanf(gpsString, "$GPGGA,%s",gga1) >=1)
wallsow 3:d2c57ab99c8e 198 {
wallsow 3:d2c57ab99c8e 199 sep = 1;
wallsow 3:d2c57ab99c8e 200 //pc.printf("recharge gga");
jijou 0:0e12a7930611 201 parseGGA();
wallsow 3:d2c57ab99c8e 202 //pc.printf("recharge gga fin");
jijou 0:0e12a7930611 203 }
jijou 0:0e12a7930611 204 return *gga2;
jijou 0:0e12a7930611 205 }
jijou 0:0e12a7930611 206 }
jijou 0:0e12a7930611 207 else
jijou 0:0e12a7930611 208 {
jijou 0:0e12a7930611 209 pc.printf("NO GPGGA DATA RECEIVED\n\r");
jijou 0:0e12a7930611 210 return 0;
jijou 0:0e12a7930611 211 }
jijou 0:0e12a7930611 212 }
wallsow 3:d2c57ab99c8e 213