student_with_profs_snec / Mbed OS test_200WX
Committer:
snec_student
Date:
Mon Jun 20 14:38:44 2022 +0000
Revision:
29:fbc5f53d8d0f
Parent:
28:6f0009bce093
Child:
30:2457f9928392
v20/06/16h40 avec deux lecture paralleles

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dan 0:7dec7e9ac085 1 #include "mbed.h"
snec_student 28:6f0009bce093 2 /**************************************************************/
snec_student 28:6f0009bce093 3 /* Déclaration des Sous fonctions */
snec_student 28:6f0009bce093 4 /**************************************************************/
snec_student 28:6f0009bce093 5 void ISR_read(); // lecture liaison serie
snec_student 28:6f0009bce093 6 uint8_t gencrc2(uint8_t *data); // calcul crc NMEA
snec_student 28:6f0009bce093 7 DigitalOut myled(PTB22);
snec_student 29:fbc5f53d8d0f 8 DigitalOut CMD_200WX(PTA1,0);
snec_student 29:fbc5f53d8d0f 9 // initialisation de la liaison serie vers le capteur WX200
snec_student 28:6f0009bce093 10 static UnbufferedSerial capt(PTC4,PTC3,4800);
snec_student 28:6f0009bce093 11 char c;
snec_student 28:6f0009bce093 12 char Rx_buffer[100];
snec_student 28:6f0009bce093 13 char trame[100];
snec_student 28:6f0009bce093 14 char trame_cpy[100];
snec_student 28:6f0009bce093 15 volatile bool flag_ISR_read=0;
snec_student 28:6f0009bce093 16 volatile int index=0;
snec_student 29:fbc5f53d8d0f 17 // variables associees au capteur WX200
snec_student 29:fbc5f53d8d0f 18 static char type[20]; // type de la trame (GPGGA, RMC...)
snec_student 29:fbc5f53d8d0f 19 const char * separators = ","; // separateurs pour une trame NMEA
snec_student 29:fbc5f53d8d0f 20 char i;
snec_student 29:fbc5f53d8d0f 21 size_t len;
snec_student 29:fbc5f53d8d0f 22 uint8_t val_crc; // valeur du crc calcule a la reception de la trame
snec_student 29:fbc5f53d8d0f 23 // variables associees a une trame de type GPGGA
snec_student 29:fbc5f53d8d0f 24 bool flag_GPGGA=0;
snec_student 29:fbc5f53d8d0f 25 static char horaire[20]; // heure UTC (champ 1)
snec_student 29:fbc5f53d8d0f 26 static char lattitude[20]; // Lattitude (champ 2)
snec_student 29:fbc5f53d8d0f 27 static char hemisphere[2]; // Hemisphere (N/S) (champ 3)
snec_student 29:fbc5f53d8d0f 28 static char longitude[20]; // Longitude (champ 4)
snec_student 29:fbc5f53d8d0f 29 static char dir[2]; // direction (E/W) (champ 5)
snec_student 29:fbc5f53d8d0f 30 static char quality[2]; // GPS quality indicator (0 a 8) (champ 6)
snec_student 29:fbc5f53d8d0f 31 static char nb_satellites[10]; // Number of satellites in use, 0-12 (champ 7)
snec_student 29:fbc5f53d8d0f 32 static char HDOP[10]; // Horizontal dilution of precision (HDOP) (champ 8)
snec_student 29:fbc5f53d8d0f 33 static char altitude[10]; // Altitude relative to mean-sea-level (geoid), meters (to the nearest whole meter) (champ 9)
snec_student 29:fbc5f53d8d0f 34 static char M[2]; // M (champ 10)
snec_student 29:fbc5f53d8d0f 35 static char altitude_cor[10]; // Geoidal separation, meters (to the nearest whole meter). (champ 11)
snec_student 29:fbc5f53d8d0f 36 int n_sat; // nombre de satellites
snec_student 29:fbc5f53d8d0f 37
snec_student 29:fbc5f53d8d0f 38 // variables associees a une trame de type WIMDA
snec_student 29:fbc5f53d8d0f 39 bool flag_WIMDA=0;
snec_student 29:fbc5f53d8d0f 40 static char pres_inch[20]; // Barometric pressure, inches of mercury, to the nearest 0.01 inch (champ 1)
snec_student 29:fbc5f53d8d0f 41 static char I[2]; // inches of mercury (champ 2)
snec_student 29:fbc5f53d8d0f 42 static char pres_bar[20]; // Barometric pressure, bars, to the nearest .001 bar(champ 3)
snec_student 29:fbc5f53d8d0f 43 static char B[2]; // B = bars (champ 4)
snec_student 29:fbc5f53d8d0f 44 static char air_temp[10]; // Air temperature, degrees C, to the nearest 0.1 degree C (champ 5)
snec_student 29:fbc5f53d8d0f 45 static char C1[2]; // C = degrees C (champ 6)
snec_student 29:fbc5f53d8d0f 46 static char wat_temp[10]; // Water temperature, degrees C (champ 7) blank with WX200
snec_student 29:fbc5f53d8d0f 47 static char C2[2]; // C = degrees C (champ 8)
snec_student 29:fbc5f53d8d0f 48 static char rel_hum[10]; // Relative humidity, percent, to the nearest 0.1 percent (champ 9)
snec_student 29:fbc5f53d8d0f 49 static char abs_hum[10]; // Absolute humidity, percent (champ 10) blank with WX200
snec_student 29:fbc5f53d8d0f 50 static char dew_point[10]; // Dew point, degrees C, to the nearest 0.1 degree C (champ 11) blank with WX200
snec_student 29:fbc5f53d8d0f 51 static char C3[2]; // C = degrees C (champ 12)
snec_student 29:fbc5f53d8d0f 52 static char Wind_dir_T[10]; // Wind direction, degrees True, to the nearest 0.1 degree (champ 13)
snec_student 29:fbc5f53d8d0f 53 static char T[2]; // T = True (champ 14)
snec_student 29:fbc5f53d8d0f 54 static char Wind_dir_M[10]; // Wind direction, degrees Magnetic, to the nearest 0.1 degree (champ 15)
snec_student 29:fbc5f53d8d0f 55 static char M2[2]; // M = magnetic (champ 16)
snec_student 29:fbc5f53d8d0f 56 static char Wind_speed_knots[10]; // Wind speed, knots, to the nearest 0.1 knot (champ 17)
snec_student 29:fbc5f53d8d0f 57 static char N[2]; // N = knots (champ 18)
snec_student 29:fbc5f53d8d0f 58 static char Wind_speed_ms[10]; // Wind speed, meters per second, to the nearest 0.1 m/s (champ 19)
snec_student 29:fbc5f53d8d0f 59 static char M3[2]; // M = meters per second(champ 20)
snec_student 29:fbc5f53d8d0f 60 // variables associees a une trame de type GPRMC
snec_student 28:6f0009bce093 61 static char vitesse[20];
snec_student 28:6f0009bce093 62 static char cap[20];
snec_student 28:6f0009bce093 63 static char date[20];
snec_student 28:6f0009bce093 64 static char magn[20];
snec_student 28:6f0009bce093 65 static char crc[10];
snec_student 29:fbc5f53d8d0f 66
snec_student 29:fbc5f53d8d0f 67
snec_student 29:fbc5f53d8d0f 68
snec_student 29:fbc5f53d8d0f 69 static char alerte[3];
snec_student 29:fbc5f53d8d0f 70
snec_student 29:fbc5f53d8d0f 71
dan 0:7dec7e9ac085 72
snec_student 28:6f0009bce093 73 int main()
snec_student 28:6f0009bce093 74 {
snec_student 29:fbc5f53d8d0f 75 // autorise departs en interruption liaison serie
snec_student 28:6f0009bce093 76 capt.attach(&ISR_read,SerialBase::RxIrq);
snec_student 29:fbc5f53d8d0f 77 // attente 3 secondes puis alimentation du capteur
snec_student 29:fbc5f53d8d0f 78 thread_sleep_for (3000);
snec_student 29:fbc5f53d8d0f 79 CMD_200WX=1;
snec_student 29:fbc5f53d8d0f 80 thread_sleep_for (30000); // on laisse 30 s de mesures
snec_student 29:fbc5f53d8d0f 81 while((flag_GPGGA==0)||(flag_WIMDA==0)){ // afaire en boucle tant que l'on a pas recu les infos
snec_student 29:fbc5f53d8d0f 82 // si une trame est recue
snec_student 28:6f0009bce093 83 if (flag_ISR_read==1) {
snec_student 28:6f0009bce093 84 //printf("%s",trame); // ligne de test gps
snec_student 29:fbc5f53d8d0f 85 char* token = strtok(trame,"*"); //on met dans trame_cpy la trame sans crc
snec_student 28:6f0009bce093 86 strcpy(trame_cpy,token);
snec_student 29:fbc5f53d8d0f 87 token = strtok(NULL,"*"); // on copie la valeur du crc recu dans crc
snec_student 28:6f0009bce093 88 strcpy(crc,token);
snec_student 29:fbc5f53d8d0f 89 // on calcule la valeur du crc dans la trame recue
snec_student 29:fbc5f53d8d0f 90 val_crc=gencrc2((uint8_t *)trame_cpy);
snec_student 28:6f0009bce093 91 uint8_t val_crc2;
snec_student 28:6f0009bce093 92 sscanf(crc,"%x",&val_crc2);
snec_student 29:fbc5f53d8d0f 93 // on teste la validite du crc recu
snec_student 28:6f0009bce093 94 if (val_crc!=val_crc2) {
snec_student 29:fbc5f53d8d0f 95 // printf ("crc error\n");
snec_student 28:6f0009bce093 96 } else {
snec_student 29:fbc5f53d8d0f 97 // traitement de la trame en cas de crc correct
snec_student 29:fbc5f53d8d0f 98 //printf ("crc OK\n");
snec_student 29:fbc5f53d8d0f 99 //printf("trame :%s \n",trame_cpy);
snec_student 29:fbc5f53d8d0f 100 char* token = strtok((char*)trame_cpy,separators);
snec_student 29:fbc5f53d8d0f 101 strcpy(type,token);
snec_student 29:fbc5f53d8d0f 102
snec_student 29:fbc5f53d8d0f 103 if ((strcmp(type,"$GPGGA")==0)&&(flag_GPGGA==0)) { // traitement d'une trame GPGGA
snec_student 29:fbc5f53d8d0f 104 //printf("trame GPGGA : %s \n",trame);
snec_student 29:fbc5f53d8d0f 105 token = strtok(NULL,separators);
snec_student 29:fbc5f53d8d0f 106 if (strcmp(token,"")!=0) strcpy(horaire,token);
snec_student 29:fbc5f53d8d0f 107 token = strtok(NULL,separators);
snec_student 29:fbc5f53d8d0f 108 strcpy(lattitude,token);
snec_student 29:fbc5f53d8d0f 109 token = strtok(NULL,separators);
snec_student 29:fbc5f53d8d0f 110 strcpy(hemisphere,token);
snec_student 29:fbc5f53d8d0f 111 token = strtok(NULL,separators);
snec_student 29:fbc5f53d8d0f 112 strcpy(longitude,token);
snec_student 29:fbc5f53d8d0f 113 token = strtok(NULL,separators);
snec_student 29:fbc5f53d8d0f 114 strcpy(dir,token);
snec_student 29:fbc5f53d8d0f 115 token = strtok(NULL,separators);
snec_student 29:fbc5f53d8d0f 116 strcpy(quality,token);
snec_student 29:fbc5f53d8d0f 117 token = strtok(NULL,separators);
snec_student 29:fbc5f53d8d0f 118 strcpy(nb_satellites,token);
snec_student 29:fbc5f53d8d0f 119 token = strtok(NULL,separators);
snec_student 29:fbc5f53d8d0f 120 strcpy(HDOP,token);
snec_student 29:fbc5f53d8d0f 121 token = strtok(NULL,separators);
snec_student 29:fbc5f53d8d0f 122 strcpy(altitude,token);
snec_student 29:fbc5f53d8d0f 123 token = strtok(NULL,separators);
snec_student 29:fbc5f53d8d0f 124 strcpy(M,token);
snec_student 29:fbc5f53d8d0f 125 token = strtok(NULL,separators);
snec_student 29:fbc5f53d8d0f 126 strcpy(altitude_cor,token);
snec_student 29:fbc5f53d8d0f 127 token = strtok(NULL,separators);
snec_student 29:fbc5f53d8d0f 128 token = strtok(NULL,separators);
snec_student 29:fbc5f53d8d0f 129 if (strcmp(nb_satellites,"")!=0) n_sat=atoi(nb_satellites); // calcul du nombre de satellites
snec_student 29:fbc5f53d8d0f 130 if (n_sat>3)
snec_student 29:fbc5f53d8d0f 131 {
snec_student 29:fbc5f53d8d0f 132 flag_GPGGA=1; // on signale la fin d'une lecture correcte GPGGA
snec_student 29:fbc5f53d8d0f 133 }
snec_student 29:fbc5f53d8d0f 134 } // fin if GPGGA
snec_student 29:fbc5f53d8d0f 135
snec_student 29:fbc5f53d8d0f 136 else if ((strcmp(type,"$WIMDA")==0)&&(flag_WIMDA==0)) { // traitement d'une trame WIMDA
snec_student 29:fbc5f53d8d0f 137 //capt.detach();
snec_student 29:fbc5f53d8d0f 138 //printf("trame WIMDA : %s \n",trame);
snec_student 29:fbc5f53d8d0f 139 token = strtok(NULL,separators); // champ1
snec_student 29:fbc5f53d8d0f 140 if (strcmp(token,"")!=0)strcpy(pres_inch,token);
snec_student 29:fbc5f53d8d0f 141 token = strtok(NULL,separators); // champ2
snec_student 29:fbc5f53d8d0f 142 if (strcmp(token,"")!=0) strcpy(I,token);
snec_student 29:fbc5f53d8d0f 143 token = strtok(NULL,separators); // champ3
snec_student 29:fbc5f53d8d0f 144 if (strcmp(token,"")!=0)strcpy(pres_bar,token);
snec_student 29:fbc5f53d8d0f 145 token = strtok(NULL,separators); // champ4
snec_student 29:fbc5f53d8d0f 146 if (strcmp(token,"")!=0)strcpy(B,token);
snec_student 29:fbc5f53d8d0f 147 token = strtok(NULL,separators); // champ5
snec_student 29:fbc5f53d8d0f 148 if (strcmp(token,"")!=0)strcpy(air_temp,token);
snec_student 29:fbc5f53d8d0f 149 token = strtok(NULL,separators); // champ6
snec_student 29:fbc5f53d8d0f 150 strcpy(C1,token);
snec_student 29:fbc5f53d8d0f 151 token = strtok(NULL,separators); // champ7
snec_student 29:fbc5f53d8d0f 152 if (strcmp(token,"")!=0)strcpy(wat_temp,token);
snec_student 29:fbc5f53d8d0f 153 token = strtok(NULL,separators); // champ8
snec_student 29:fbc5f53d8d0f 154 if (strcmp(token,"")!=0)strcpy(C2,token);
snec_student 29:fbc5f53d8d0f 155 token = strtok(NULL,separators); // champ9
snec_student 29:fbc5f53d8d0f 156 if (strcmp(token,"")!=0)strcpy(rel_hum,token);
snec_student 29:fbc5f53d8d0f 157 token = strtok(NULL,separators); // champ10
snec_student 29:fbc5f53d8d0f 158 if (strcmp(token,"")!=0)strcpy(abs_hum,token);
snec_student 29:fbc5f53d8d0f 159 token = strtok(NULL,separators); // champ11
snec_student 29:fbc5f53d8d0f 160 if (strcmp(token,"")!=0)strcpy(dew_point,token);
snec_student 29:fbc5f53d8d0f 161 token = strtok(NULL,separators); // champ12
snec_student 29:fbc5f53d8d0f 162 if (strcmp(token,"")!=0)strcpy(C3,token);
snec_student 29:fbc5f53d8d0f 163 token = strtok(NULL,separators); // champ13
snec_student 29:fbc5f53d8d0f 164 if (strcmp(token,"")!=0)strcpy(Wind_dir_T,token);
snec_student 29:fbc5f53d8d0f 165 token = strtok(NULL,separators); // champ14
snec_student 29:fbc5f53d8d0f 166 if (strcmp(token,"")!=0)strcpy(T,token);
snec_student 29:fbc5f53d8d0f 167 token = strtok(NULL,separators); // champ15
snec_student 29:fbc5f53d8d0f 168 if (strcmp(token,"")!=0)strcpy(Wind_dir_M,token);
snec_student 29:fbc5f53d8d0f 169 token = strtok(NULL,separators); // champ16
snec_student 29:fbc5f53d8d0f 170 if (strcmp(token,"")!=0)strcpy(M2,token);
snec_student 29:fbc5f53d8d0f 171 token = strtok(NULL,separators); // champ17
snec_student 29:fbc5f53d8d0f 172 if (strcmp(token,"")!=0)strcpy(Wind_speed_knots,token);
snec_student 29:fbc5f53d8d0f 173 token = strtok(NULL,separators); // champ18
snec_student 29:fbc5f53d8d0f 174 if (strcmp(token,"")!=0)strcpy(N,token);
snec_student 29:fbc5f53d8d0f 175 token = strtok(NULL,separators); // champ19
snec_student 29:fbc5f53d8d0f 176 if (strcmp(token,"")!=0)strcpy(Wind_speed_ms,token);
snec_student 29:fbc5f53d8d0f 177 token = strtok(NULL,separators); // champ20
snec_student 29:fbc5f53d8d0f 178 if (strcmp(token,"")!=0)strcpy(M3,token);
snec_student 29:fbc5f53d8d0f 179 if (strcmp(air_temp,"")!=0) flag_WIMDA=1; // on signale la fin d'une lecture correcte WIMDA
snec_student 29:fbc5f53d8d0f 180 } // fin if WIMDA
snec_student 29:fbc5f53d8d0f 181
snec_student 29:fbc5f53d8d0f 182 } // fin else (traitement trame correcte)
snec_student 29:fbc5f53d8d0f 183 }//fin if read enable
snec_student 29:fbc5f53d8d0f 184 } // fin while flags ==0
snec_student 29:fbc5f53d8d0f 185 // On affiche les informations GPGGA
snec_student 29:fbc5f53d8d0f 186 printf("horaire UTC :%s \n", horaire); // heure UTC (champ 1)
snec_student 29:fbc5f53d8d0f 187 printf("lattitude :%s \n",lattitude); // Lattitude (champ 2)
snec_student 29:fbc5f53d8d0f 188 printf("hemisphere :%s \n",hemisphere); // Hemisphere (N/S) (champ 3)
snec_student 29:fbc5f53d8d0f 189 printf("longitude:%s \n",longitude); // Longitude (champ 4)
snec_student 29:fbc5f53d8d0f 190 printf("dir:%s \n",dir); // direction (E/W) (champ 5)
snec_student 29:fbc5f53d8d0f 191 printf("quality:%s \n",quality); // GPS quality indicator (0 a 8) (champ 6)
snec_student 29:fbc5f53d8d0f 192 printf("nb_satellites:%s \n",nb_satellites); // Number of satellites in use, 0-12 (champ 7)
snec_student 29:fbc5f53d8d0f 193 printf("HDOP:%s \n",HDOP); // Horizontal dilution of precision (HDOP) (champ 8)
snec_student 29:fbc5f53d8d0f 194 printf("altitude:%s \n",altitude); // Altitude relative to mean-sea-level (geoid), meters (to the nearest whole meter) (champ 9)
snec_student 29:fbc5f53d8d0f 195 printf("unit :%s \n",M);
snec_student 29:fbc5f53d8d0f 196 printf("altitude_cor:%s \n",altitude_cor); // Geoidal separation, meters (to the nearest whole meter). (champ 10)
snec_student 29:fbc5f53d8d0f 197 // On affiche les informations WIMDA
snec_student 29:fbc5f53d8d0f 198 printf("Barometric Pressure :%s %s \n", pres_inch,I); // pression inch + unite (champs 1 et 2)
snec_student 29:fbc5f53d8d0f 199 printf("Barometric Pressure :%s %s \n", pres_bar,B); // pression bars + unite (champs 3 et 4)
snec_student 29:fbc5f53d8d0f 200 printf("Air Temperature:%s %s\n", air_temp,C1); // temperature de l'air + unite (champs 5 et 6)
snec_student 29:fbc5f53d8d0f 201 printf("Water Temperature:%s %s\n", wat_temp,C2); // temperature de l'air + unite (champs 7 et 8)
snec_student 29:fbc5f53d8d0f 202 printf("Relative humidity :%s \n", rel_hum); // humidite relative (champs 9)
snec_student 29:fbc5f53d8d0f 203 printf("Absolute humidity :%s \n", abs_hum); // humidite relative (champs 10)
snec_student 29:fbc5f53d8d0f 204 printf("Dew Point :%s %s\n", dew_point,C3); // point de rosee + unite (champs 11 et 12)
snec_student 29:fbc5f53d8d0f 205 printf("Wind direction :%s %s\n", Wind_dir_T,T); // direction du vent en degres vrais + unite (champs 13 et 14)
snec_student 29:fbc5f53d8d0f 206 printf("Wind direction magne :%s %s\n", Wind_dir_M,M2); // direction du vent en degres vrais + unite (champs 15 et 16)
snec_student 29:fbc5f53d8d0f 207 printf("Wind speed :%s %s\n", Wind_speed_knots,N); // vitesse du vent en noeuds + unite (champs 17 et 18)
snec_student 29:fbc5f53d8d0f 208 printf("Wind speed :%s %s\n", Wind_speed_ms,M3); // vitesse du vent en m/s + unite (champs 17 et 18)
snec_student 29:fbc5f53d8d0f 209 } // fin programme
snec_student 28:6f0009bce093 210 /* char* token = strtok(trame,"*"); //on met dans trame cpy la trame sans crc
snec_student 28:6f0009bce093 211 strcpy(trame_cpy,token);
snec_student 28:6f0009bce093 212 token = strtok(NULL,"*"); // on copie le crc
snec_student 28:6f0009bce093 213 strcpy(crc,token);
snec_student 28:6f0009bce093 214 val_crc=gencrc2((uint8_t *)trame_cpy); //calcul du crc sur la trame
snec_student 28:6f0009bce093 215 uint8_t val_crc2;
snec_student 28:6f0009bce093 216 sscanf(crc,"%x",&val_crc2);
snec_student 28:6f0009bce093 217 if (val_crc!=val_crc2) {
snec_student 28:6f0009bce093 218 printf ("crc error\n");
snec_student 28:6f0009bce093 219 } else {
snec_student 28:6f0009bce093 220 printf ("crc OK\n");
snec_student 28:6f0009bce093 221 char* token = strtok((char*)trame_cpy,separators);
snec_student 28:6f0009bce093 222 strcpy(type,token);
snec_student 28:6f0009bce093 223 if (strcmp(type,"$GPRMC")==0) { // traitement d'une trame RMC
snec_student 28:6f0009bce093 224 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 225 strcpy(horaire,token);
snec_student 28:6f0009bce093 226 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 227 strcpy(alerte,token);
snec_student 28:6f0009bce093 228 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 229 strcpy(lattitude,token);
snec_student 28:6f0009bce093 230 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 231 strcpy(hemisphere,token);
snec_student 28:6f0009bce093 232 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 233 strcpy(longitude,token);
snec_student 28:6f0009bce093 234 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 235 strcpy(dir,token);
snec_student 28:6f0009bce093 236 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 237 strcpy(vitesse,token);
snec_student 28:6f0009bce093 238 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 239 strcpy(cap,token);
snec_student 28:6f0009bce093 240 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 241 strcpy(date,token);
snec_student 28:6f0009bce093 242 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 243 strcpy(magn,token);
snec_student 28:6f0009bce093 244 //printf ("%s : %s : %s : %s \n",date,horaire,lattitude, longitude);
snec_student 28:6f0009bce093 245 } // fin compare chaines RMC
snec_student 28:6f0009bce093 246 if (strcmp(type,"$GPGGA")==0) { // traitement d'une trame GGA
snec_student 28:6f0009bce093 247 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 248 strcpy(horaire,token);
snec_student 28:6f0009bce093 249 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 250 strcpy(lattitude,token);
snec_student 28:6f0009bce093 251 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 252 strcpy(hemisphere,token);
snec_student 28:6f0009bce093 253 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 254 strcpy(longitude,token);
snec_student 28:6f0009bce093 255 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 256 strcpy(dir,token);
snec_student 28:6f0009bce093 257 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 258 strcpy(qualif,token);
snec_student 28:6f0009bce093 259 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 260 strcpy(nb_satellites,token);
snec_student 28:6f0009bce093 261 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 262 strcpy(DOP,token);
snec_student 28:6f0009bce093 263 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 264 strcpy(altitude,token);
snec_student 28:6f0009bce093 265 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 266 strcpy(altitude_cor,token);
snec_student 28:6f0009bce093 267 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 268 token = strtok(NULL,separators);
snec_student 28:6f0009bce093 269 int n=atoi(nb_satellites); // calcul du nombre de satellites
snec_student 28:6f0009bce093 270 printf("n=%d date = %s \n",n,date);
snec_student 28:6f0009bce093 271 if (n>3&&(strcmp(date,"")!=0)) { // si precision correcte on envoie la trame et on éteint le GPS
snec_student 28:6f0009bce093 272 // enregistrement des donnees GPS dans la carte SD
snec_student 28:6f0009bce093 273 // serial_port.attach(0,SerialBase::RxIrq);
snec_student 28:6f0009bce093 274 Led_rouge=0;
snec_student 28:6f0009bce093 275 // Montage de la carte SD (Led rouge temoin allumee 1s)
snec_student 28:6f0009bce093 276 Led_rouge=0;
snec_student 28:6f0009bce093 277 thread_sleep_for (1000);
snec_student 28:6f0009bce093 278 // Montage du systeme de fichier
snec_student 28:6f0009bce093 279 BlockDevice *bd = BlockDevice::get_default_instance();
snec_student 28:6f0009bce093 280 FATFileSystem fs("fs");
snec_student 28:6f0009bce093 281 printf("Montage de la carte SD ... : ");
snec_student 28:6f0009bce093 282 int err = fs.mount(bd);
snec_student 28:6f0009bce093 283 if (err!=0) printf("ERREUR !!! \n"); // Message d'erreur
snec_student 28:6f0009bce093 284 else {
snec_student 28:6f0009bce093 285 printf("OK \n");
snec_student 28:6f0009bce093 286 Led_rouge=1;
snec_student 28:6f0009bce093 287 }
snec_student 28:6f0009bce093 288 //thread_sleep_for (1000);
snec_student 28:6f0009bce093 289 printf("Opening \"/fs/test1.txt\"... : ");
snec_student 28:6f0009bce093 290 FILE *fichier = fopen("/fs/test1.txt", "a");
snec_student 28:6f0009bce093 291 if (fichier==NULL) printf("ERREUR !!! \n"); // Message d'erreur
snec_student 28:6f0009bce093 292 else {
snec_student 28:6f0009bce093 293 printf(" OK \n");
snec_student 28:6f0009bce093 294 fprintf (fichier,"%s : %s : %s : %s : %s\n : %s \n ",date,horaire,lattitude, longitude,altitude,nb_satellites);
snec_student 28:6f0009bce093 295 fclose(fichier); // Fermeture du fichier test1.txt
snec_student 28:6f0009bce093 296 err = fs.unmount();
snec_student 28:6f0009bce093 297 Cmd_GPS=0; // on eteintle GPS lors d'une lecture correcte
snec_student 28:6f0009bce093 298 Led_rouge=1;
snec_student 28:6f0009bce093 299 // on charge la nouvelle alarme
snec_student 28:6f0009bce093 300 horloge.get_time(&time); // lecture heure courante sur htr
snec_student 28:6f0009bce093 301 printf ("Programme Lance a %d : %d : %d \n",time.hours,time.minutes,time.seconds);
snec_student 28:6f0009bce093 302 secondes=time.seconds;
snec_student 28:6f0009bce093 303 minutes=time.minutes+1;
snec_student 28:6f0009bce093 304 heures=time.hours;
snec_student 28:6f0009bce093 305 if (secondes>60) {
snec_student 28:6f0009bce093 306 secondes = secondes-60;
snec_student 28:6f0009bce093 307 minutes=minutes+1; // calcul temps alarme prochain
snec_student 28:6f0009bce093 308 if (minutes >59) {
snec_student 28:6f0009bce093 309 minutes=minutes-60;
snec_student 28:6f0009bce093 310 heures = heures+1;
snec_student 28:6f0009bce093 311 if (heures>23) heures=0;
snec_student 28:6f0009bce093 312 }//fin minutes
snec_student 28:6f0009bce093 313 }//fin secondes
snec_student 28:6f0009bce093 314 alarm.seconds=secondes;
snec_student 28:6f0009bce093 315 alarm.minutes=minutes;
snec_student 28:6f0009bce093 316 alarm.hours=heures;
snec_student 28:6f0009bce093 317 alarm.am1=0; // on declenche ici une alarme à l'heure reglee
snec_student 28:6f0009bce093 318 alarm.am2=0;
snec_student 28:6f0009bce093 319 alarm.am3=0;
snec_student 28:6f0009bce093 320 alarm.am4=1;
snec_student 28:6f0009bce093 321 test = horloge.set_alarm(alarm, 1);
snec_student 28:6f0009bce093 322 // on coupe l'alarme alim repart a l'alerme programmee
snec_student 28:6f0009bce093 323 DS_3231_cntl_stat_t data = {0x05, 0x00}; // configuration registres etat et controle
snec_student 28:6f0009bce093 324 horloge.set_cntl_stat_reg(data);
snec_student 28:6f0009bce093 325 }// fin else
snec_student 28:6f0009bce093 326 }// fin n>4
snec_student 28:6f0009bce093 327 } // fin compare chaines GGA
snec_student 28:6f0009bce093 328 } //fin traitement chaine sans erreur de crc
snec_student 28:6f0009bce093 329 flag_ISR_read=0; // raz ISR
snec_student 28:6f0009bce093 330 } //fin if (flag_ISR_read==1)
snec_student 28:6f0009bce093 331 }// fin while true
snec_student 28:6f0009bce093 332 }// fin programme principal
stevep 4:81cea7a352b0 333 }
snec_student 28:6f0009bce093 334 }
snec_student 28:6f0009bce093 335 */
snec_student 28:6f0009bce093 336
snec_student 28:6f0009bce093 337
snec_student 28:6f0009bce093 338 /******* Sous fonctions ***************/
snec_student 28:6f0009bce093 339 void ISR_read() { // lecture liaison serie
snec_student 28:6f0009bce093 340 char carac;
snec_student 28:6f0009bce093 341 capt.read(&carac, 1);
snec_student 28:6f0009bce093 342 if (index==100 || carac=='$') index=0;
snec_student 28:6f0009bce093 343 Rx_buffer[index]=carac;
snec_student 28:6f0009bce093 344 index++;
snec_student 28:6f0009bce093 345 if (carac==0x0a) {
snec_student 28:6f0009bce093 346 Rx_buffer[index]=0;
snec_student 28:6f0009bce093 347 for (char i=0; i<index+1; i++) trame[i] = Rx_buffer[i];
snec_student 28:6f0009bce093 348 index=0;
snec_student 28:6f0009bce093 349 flag_ISR_read=1;
snec_student 28:6f0009bce093 350 }
snec_student 28:6f0009bce093 351 }
snec_student 28:6f0009bce093 352
snec_student 28:6f0009bce093 353 uint8_t gencrc2(uint8_t *data) { // calcul crc NMEA
snec_student 28:6f0009bce093 354 uint8_t crc;
snec_student 28:6f0009bce093 355 crc=data[1];
snec_student 28:6f0009bce093 356 char i=2;
snec_student 28:6f0009bce093 357 while (data[i]!=0) {
snec_student 28:6f0009bce093 358 crc = crc^data[i];
snec_student 28:6f0009bce093 359 i++;
snec_student 28:6f0009bce093 360 }
snec_student 28:6f0009bce093 361 return crc;
snec_student 28:6f0009bce093 362 }