Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@29:fbc5f53d8d0f, 2022-06-20 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |