Prototyping the Adaptable Emergency System on an C027 board.

Dependencies:   C027_Support mbed

Fork of c027_prototyping by Philémon Favrod

Committer:
aroulin
Date:
Wed Oct 01 08:47:54 2014 +0000
Revision:
16:2b2f2a3bde5a
Parent:
15:41e3e4613e34
Child:
17:726bbc1b73ee
Adds some timers to timeout GPS test and receive SMS test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aroulin 4:f1708f6ec905 1 #include "gps_locate.h"
aroulin 4:f1708f6ec905 2 #include "GPS.h"
aroulin 4:f1708f6ec905 3
aroulin 4:f1708f6ec905 4 int gps_on(void)
aroulin 4:f1708f6ec905 5 {
aroulin 4:f1708f6ec905 6 return 0;
aroulin 4:f1708f6ec905 7 }
aroulin 4:f1708f6ec905 8
aroulin 4:f1708f6ec905 9 int gps_off(void)
aroulin 4:f1708f6ec905 10 {
aroulin 4:f1708f6ec905 11 return 0;
aroulin 4:f1708f6ec905 12 }
aroulin 4:f1708f6ec905 13
aroulin 4:f1708f6ec905 14 int gps_locate(struct gps_data_t* gps_data)
aroulin 7:eeef6f9fa1db 15 {
aroulin 16:2b2f2a3bde5a 16 printf("GPS Location begins\r\n");
aroulin 16:2b2f2a3bde5a 17
aroulin 4:f1708f6ec905 18 // Power on gps
aroulin 4:f1708f6ec905 19 GPSI2C gps;
aroulin 16:2b2f2a3bde5a 20
aroulin 16:2b2f2a3bde5a 21 // Timeout timer
aroulin 16:2b2f2a3bde5a 22 Timer timer;
aroulin 16:2b2f2a3bde5a 23 timer.start();
aroulin 4:f1708f6ec905 24
aroulin 7:eeef6f9fa1db 25 bool coord_ok = false, altitude_ok = false, speed_ok = false;
aroulin 7:eeef6f9fa1db 26
aroulin 4:f1708f6ec905 27 int ret = 0;
aroulin 4:f1708f6ec905 28 char buf[512] = {0};
aroulin 16:2b2f2a3bde5a 29 while(!coord_ok || !altitude_ok || !speed_ok) {
aroulin 16:2b2f2a3bde5a 30
aroulin 16:2b2f2a3bde5a 31 if(timer.read() > 20) {
aroulin 16:2b2f2a3bde5a 32 printf("GPS Location TimeOut, abort...\r\n");
aroulin 16:2b2f2a3bde5a 33 timer.stop();
aroulin 16:2b2f2a3bde5a 34 return 0;
aroulin 16:2b2f2a3bde5a 35 }
aroulin 16:2b2f2a3bde5a 36
aroulin 7:eeef6f9fa1db 37 while ((ret = gps.getMessage(buf, sizeof(buf))) > 0) {
aroulin 7:eeef6f9fa1db 38 int len = LENGTH(ret);
aroulin 7:eeef6f9fa1db 39 if ((PROTOCOL(ret) == GPSParser::NMEA) && (len > 6)) {
aroulin 7:eeef6f9fa1db 40 if (!strncmp("$GPGLL", buf, 6)) {
aroulin 7:eeef6f9fa1db 41 double la = 0, lo = 0;
aroulin 7:eeef6f9fa1db 42 char ch;
aroulin 7:eeef6f9fa1db 43 if (gps.getNmeaAngle(1,buf,len,la) &&
aroulin 7:eeef6f9fa1db 44 gps.getNmeaAngle(3,buf,len,lo) &&
aroulin 7:eeef6f9fa1db 45 gps.getNmeaItem(6,buf,len,ch) && ch == 'A') {
aroulin 7:eeef6f9fa1db 46 gps_data->lo = lo;
aroulin 7:eeef6f9fa1db 47 gps_data->la = la;
aroulin 7:eeef6f9fa1db 48 coord_ok = true;
aroulin 7:eeef6f9fa1db 49 }
aroulin 7:eeef6f9fa1db 50 } else if (!strncmp("$GPGGA", buf, 6)) {
aroulin 7:eeef6f9fa1db 51 double a = 0;
aroulin 7:eeef6f9fa1db 52 if (gps.getNmeaItem(9,buf,len,a)) // altitude msl [m]
aroulin 7:eeef6f9fa1db 53 gps_data->altitude = a;
aroulin 7:eeef6f9fa1db 54 altitude_ok = true;
aroulin 7:eeef6f9fa1db 55 } else if (!strncmp("$GPVTG", buf, 6)) {
aroulin 7:eeef6f9fa1db 56 double s = 0;
aroulin 7:eeef6f9fa1db 57 if (gps.getNmeaItem(7,buf,len,s)) // speed [km/h]
aroulin 7:eeef6f9fa1db 58 gps_data->speed = s;
aroulin 7:eeef6f9fa1db 59 speed_ok = true;
aroulin 7:eeef6f9fa1db 60 }
aroulin 4:f1708f6ec905 61
aroulin 4:f1708f6ec905 62 }
aroulin 4:f1708f6ec905 63 }
aroulin 7:eeef6f9fa1db 64 }
aroulin 16:2b2f2a3bde5a 65
aroulin 16:2b2f2a3bde5a 66 timer.stop();
aroulin 16:2b2f2a3bde5a 67 return 1;
aroulin 4:f1708f6ec905 68 }