LEcture GPS Xbee sous interruption

Committer:
pascalreygner
Date:
Thu Aug 09 09:30:22 2018 +0000
Revision:
3:9a24090ff482
Parent:
2:824735b4c3a3
BUG

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pascalreygner 0:0a05d691ce34 1 /* Gestion carte GPS au format XBEE
pascalreygner 0:0a05d691ce34 2 * Fournisseur : Embedded Artists - Réf : EA-ACC-023
pascalreygner 0:0a05d691ce34 3 * https://www.embeddedartists.com/products/acc/acc_gps.php
pascalreygner 0:0a05d691ce34 4 * Utilise Chipset MT3339 (Mediatek Labs)
pascalreygner 0:0a05d691ce34 5 * Décode et affiche trame $GPRMC ou $GPGGA - affiche les autres trames non décodées
pascalreygner 0:0a05d691ce34 6 * Caractères reçus sous interruption (UART1-RX)
pascalreygner 0:0a05d691ce34 7 *
pascalreygner 0:0a05d691ce34 8 * V2 14/3/2018 - ajout décodage trame GGA
pascalreygner 2:824735b4c3a3 9 * V3 7/8/2018 - DEBUG AFFICHAGE RMC + GGA / suppression librairies inutiles
pascalreygner 2:824735b4c3a3 10
pascalreygner 0:0a05d691ce34 11 * Exemple d'utilisation class GpsXbee (IRQ compatible) :
pascalreygner 0:0a05d691ce34 12 @code
pascalreygner 0:0a05d691ce34 13 #include "mbed.h"
pascalreygner 0:0a05d691ce34 14 #include <stdio.h>
pascalreygner 0:0a05d691ce34 15 #include "gps-ea-acc023.h"
pascalreygner 0:0a05d691ce34 16
pascalreygner 0:0a05d691ce34 17 using namespace gpsxbee_MT3339;
pascalreygner 0:0a05d691ce34 18 static GpsXbee gpsxbee;
pascalreygner 1:fba6b514d8d7 19 Serial pc2(USBTX, USBRX); // Port USB vers PC pour debug
pascalreygner 1:fba6b514d8d7 20 DigitalOut led4_GPSON(LED4); //clignote à chaque trame GPS (1 = allume)
pascalreygner 0:0a05d691ce34 21
pascalreygner 1:fba6b514d8d7 22 // affichage données GPS quand trame reçue complète au format NMEARMC ou NMEAGGA
pascalreygner 1:fba6b514d8d7 23 main()
pascalreygner 0:0a05d691ce34 24 {
pascalreygner 0:0a05d691ce34 25 pc2.baud(115200); // liaison vers PC DEBUG
pascalreygner 0:0a05d691ce34 26 gpsxbee.GpsXbeeInit();
pascalreygner 0:0a05d691ce34 27 while(1) {
pascalreygner 2:824735b4c3a3 28 if (gpsxbee.gpsTrameRMC == gpsxbee.TRAME_OK && gpsxbee.gpsTrameGGA == gpsxbee.TRAME_OK) {
pascalreygner 1:fba6b514d8d7 29 gpsxbee.gpsTrameRMC = gpsxbee.TRAME_WAIT;
pascalreygner 2:824735b4c3a3 30 printf(" RMC = %s\r\n",gpsxbee.gpsDataRMC);
pascalreygner 2:824735b4c3a3 31
pascalreygner 1:fba6b514d8d7 32 gpsxbee.gpsTrameGGA = gpsxbee.TRAME_WAIT;
pascalreygner 2:824735b4c3a3 33 printf(" GGA = %s\r\n",gpsxbee.gpsDataGGA);
pascalreygner 0:0a05d691ce34 34 led4_GPSON = !led4_GPSON;
pascalreygner 0:0a05d691ce34 35 }
pascalreygner 0:0a05d691ce34 36 }
pascalreygner 0:0a05d691ce34 37 }
pascalreygner 0:0a05d691ce34 38 @endcode
pascalreygner 0:0a05d691ce34 39
pascalreygner 0:0a05d691ce34 40 * Résultat = Affichage sur terminal PC (115200 bauds) : Trames décodées :
pascalreygner 2:824735b4c3a3 41 RMC : 08/06/18:10H34mn32s - Lat. = 44.957730N - Long. = -0.666333W
pascalreygner 2:824735b4c3a3 42 GGA : 08H34mn32s --- Latitude = 44.957730N --- Longitude = -0.666333W - Nb sat = 9
pascalreygner 2:824735b4c3a3 43
pascalreygner 0:0a05d691ce34 44 */
pascalreygner 0:0a05d691ce34 45
pascalreygner 0:0a05d691ce34 46 #ifndef GPSXBEE_H_
pascalreygner 0:0a05d691ce34 47 #define GPSXBEE_H_
pascalreygner 0:0a05d691ce34 48
pascalreygner 0:0a05d691ce34 49 namespace gpsxbee_MT3339 {
pascalreygner 0:0a05d691ce34 50
pascalreygner 0:0a05d691ce34 51 class GpsXbee {
pascalreygner 0:0a05d691ce34 52
pascalreygner 0:0a05d691ce34 53 public:
pascalreygner 0:0a05d691ce34 54 void GpsXbeeInit(void);
pascalreygner 0:0a05d691ce34 55 virtual ~GpsXbee();
pascalreygner 0:0a05d691ce34 56 void InitRMC(void);
pascalreygner 0:0a05d691ce34 57 void InitGGA(void);
pascalreygner 0:0a05d691ce34 58
pascalreygner 0:0a05d691ce34 59 void parseRMC(char* data, int dataLen); // analyse trame GPS
pascalreygner 0:0a05d691ce34 60 int parseData(char* data, int len);
pascalreygner 0:0a05d691ce34 61 void lecture(); // Remplissage gpsBuf
pascalreygner 0:0a05d691ce34 62 void parseGGA(char* data, int dataLen);
pascalreygner 0:0a05d691ce34 63
pascalreygner 0:0a05d691ce34 64
pascalreygner 0:0a05d691ce34 65 // Conversion format ddmm.mmmm en mode degrés
pascalreygner 0:0a05d691ce34 66 double getLatitudeAsDegrees(double l,char ns);
pascalreygner 0:0a05d691ce34 67 double getLongitudeAsDegrees(double l,char ns);
pascalreygner 0:0a05d691ce34 68
pascalreygner 0:0a05d691ce34 69 enum NmeaSentenceValue { // type de protocole de message reçu
pascalreygner 0:0a05d691ce34 70 NMEA_INVALID = 0,
pascalreygner 0:0a05d691ce34 71 NmeaGga = 0x01,
pascalreygner 0:0a05d691ce34 72 NmeaGsa = 0x02,
pascalreygner 0:0a05d691ce34 73 NmeaGsv = 0x04,
pascalreygner 0:0a05d691ce34 74 NmeaRmc = 0x08,
pascalreygner 0:0a05d691ce34 75 NmeaVtg = 0x10,
pascalreygner 0:0a05d691ce34 76 };
pascalreygner 0:0a05d691ce34 77 NmeaSentenceValue NmeaSentence;
pascalreygner 0:0a05d691ce34 78
pascalreygner 0:0a05d691ce34 79 enum gpsTrameValue {
pascalreygner 0:0a05d691ce34 80 TRAME_WAIT = 0, // Trame lue, attente nouvelle trame
pascalreygner 0:0a05d691ce34 81 TRAME_IN = 1, // Reception Trame en cours
pascalreygner 0:0a05d691ce34 82 TRAME_OK = 2, // Trame complète prête à lire
pascalreygner 0:0a05d691ce34 83 TRAME_ERR = -1, // Erreur Trame
pascalreygner 0:0a05d691ce34 84 };
pascalreygner 1:fba6b514d8d7 85 gpsTrameValue gpsTrameRMC,gpsTrameGGA;
pascalreygner 1:fba6b514d8d7 86
pascalreygner 0:0a05d691ce34 87 // Message reçu au format $GPRMC
pascalreygner 0:0a05d691ce34 88 int rmc_hours; /** UTC time - hours */
pascalreygner 0:0a05d691ce34 89 int rmc_minutes; /** UTC time - minutes */
pascalreygner 0:0a05d691ce34 90 int rmc_seconds; /** UTC time - seconds */
pascalreygner 0:0a05d691ce34 91 int rmc_milliseconds; /** UTC time - milliseconds */
pascalreygner 0:0a05d691ce34 92 char rmc_warning; /** A = données valides - V = invalides */
pascalreygner 0:0a05d691ce34 93 double rmc_latitude; /** The latitude in ddmm.mmmm format (d = degrees, m = minutes) */
pascalreygner 0:0a05d691ce34 94 double rmc_longitude; /** The longitude in dddmm.mmmm format */
pascalreygner 0:0a05d691ce34 95 char rmc_nsIndicator; /** North / South indicator */
pascalreygner 0:0a05d691ce34 96 char rmc_ewIndicator; /** East / West indicator */
pascalreygner 0:0a05d691ce34 97 double rmc_speedKnots; /** speed in Knots */
pascalreygner 0:0a05d691ce34 98 int rmc_jours ; /** date jjmmaa */
pascalreygner 0:0a05d691ce34 99 int rmc_mois ;
pascalreygner 0:0a05d691ce34 100 int rmc_ans ;
pascalreygner 0:0a05d691ce34 101
pascalreygner 0:0a05d691ce34 102 // Message reçu au format $GPGGA
pascalreygner 0:0a05d691ce34 103 int gga_hours;
pascalreygner 0:0a05d691ce34 104 int gga_minutes;
pascalreygner 0:0a05d691ce34 105 int gga_seconds;
pascalreygner 0:0a05d691ce34 106 int gga_milliseconds;
pascalreygner 0:0a05d691ce34 107 double gga_latitude;
pascalreygner 0:0a05d691ce34 108 double gga_longitude;
pascalreygner 0:0a05d691ce34 109 char gga_nsIndicator;
pascalreygner 0:0a05d691ce34 110 char gga_ewIndicator;
pascalreygner 0:0a05d691ce34 111 int gga_fix; // 0 = Fix not available 1 = GPS fix 2 = Differential GPS fix
pascalreygner 0:0a05d691ce34 112 int gga_satellites; /** Number of used satellites */
pascalreygner 0:0a05d691ce34 113 double gga_hdop; /** Horizontal Dilution of Precision */
pascalreygner 0:0a05d691ce34 114 double gga_altitude; /** antenna altitude above/below mean sea-level */
pascalreygner 0:0a05d691ce34 115 double gga_geoidal; /** geoidal separation */
pascalreygner 0:0a05d691ce34 116
pascalreygner 2:824735b4c3a3 117 char gpsDataRMC[200]; /** buffer pour affichage data RMC*/
pascalreygner 2:824735b4c3a3 118 char gpsDataGGA[200]; /** buffer pour affichage data GGA*/
pascalreygner 0:0a05d691ce34 119
pascalreygner 0:0a05d691ce34 120 private :
pascalreygner 0:0a05d691ce34 121 #define MTK3339_BUF_SZ 200 // Taille gpsBuf
pascalreygner 0:0a05d691ce34 122 char gpsBuf[MTK3339_BUF_SZ]; // buffer de réception trame GPS
pascalreygner 0:0a05d691ce34 123
pascalreygner 0:0a05d691ce34 124 enum gpsStateValue {
pascalreygner 0:0a05d691ce34 125 StateStartGps = 0x30,
pascalreygner 0:0a05d691ce34 126 StateDataGps = 0x31,
pascalreygner 0:0a05d691ce34 127 };
pascalreygner 0:0a05d691ce34 128 gpsStateValue gpsState; // état réception
pascalreygner 0:0a05d691ce34 129
pascalreygner 0:0a05d691ce34 130 int gpsBufPos; // position index lecture buffer
pascalreygner 0:0a05d691ce34 131
pascalreygner 0:0a05d691ce34 132 }; // end class
pascalreygner 0:0a05d691ce34 133 } // end namespace
pascalreygner 0:0a05d691ce34 134 #endif /* GPSXBEE_H_ */