LEcture GPS Xbee sous interruption
gps-ea-acc023.h@3:9a24090ff482, 2018-08-09 (annotated)
- Committer:
- pascalreygner
- Date:
- Thu Aug 09 09:30:22 2018 +0000
- Revision:
- 3:9a24090ff482
- Parent:
- 2:824735b4c3a3
BUG
Who changed what in which revision?
User | Revision | Line number | New 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_ */ |