DJI NAZA-M controller (remote controller side) see: https://developer.mbed.org/users/okini3939/notebook/drone/
Dependencies: NECnfc SpiOLED USBHost mbed
Diff: gps.cpp
- Revision:
- 0:9f11e7a30865
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gps.cpp Thu May 19 09:03:44 2016 +0000 @@ -0,0 +1,120 @@ +#include "mbed.h" +#include "drone.h" + +RawSerial gps(p28, p27); + +static char buf_gps[80]; +static int count_gps = 0; + +extern struct Status stat_gnd; + +float gpsminsec2degree (float ms) { // dddmm.mmmm -> deg + float deg; + + deg = (int)ms / 100; + deg += (ms - (deg * 100)) / 60.0; + return deg; +} + +int dmy2ymd (int d) { + if (! d) return 0; + return ((2000 + (d % 100)) * 10000) + (((d / 100) % 100) * 100) + ((d / 10000) % 100); +} + +void parseGpsNmea () { + int i = 0; + float f; + char *buf = buf_gps; + + if (strncmp(buf, "$GPRMC", 6) == 0) { + for (;;) { + buf = strstr(buf, ","); + if (buf == NULL) break; + buf ++; + f = atof(buf); + i ++; + switch (i) { + case 1: + stat_gnd.gps_time = f; + break; + case 9: + stat_gnd.gps_date = dmy2ymd(f); + break; + } + } + } else + if (strncmp(buf, "$GPGGA", 6) == 0) { + for (;;) { + buf = strstr(buf, ","); + if (buf == NULL) break; + buf ++; + f = atof(buf); + i ++; + switch (i) { + case 2: + stat_gnd.gps_lat = gpsminsec2degree(f) * 10000000; + break; + case 3: + if (buf[0] == 'S') stat_gnd.gps_lat = - stat_gnd.gps_lat; + break; + case 4: + stat_gnd.gps_lng = gpsminsec2degree(f) * 10000000; + break; + case 5: + if (buf[0] == 'W') stat_gnd.gps_lng = - stat_gnd.gps_lng; + break; + case 6: + if (buf[0] != '0') { + stat_gnd.gps_flg = 1; + } else { + stat_gnd.gps_lat = 0; + stat_gnd.gps_lng = 0; + } + break; + case 7: +// gps_cnt = f; + break; + case 9: + stat_gnd.gps_h = f; + break; + } + } + } else + if (strncmp(buf, "$GPGSV", 6) == 0) { + for (;;) { + buf = strstr(buf, ","); + if (buf == NULL) break; + buf ++; + f = atof(buf); + i ++; + switch (i) { + case 3: + stat_gnd.gps_sat = f; + break; + } + } + } else + if (strncmp(buf, "$GPGLL", 6) == 0) { + } +} + +void isrGps () { + char c; + c = gps.getc(); + if (c == '\r' || c == '\n') { + buf_gps[count_gps] = 0; + if (count_gps) { + parseGpsNmea(); + count_gps = 0; + } + } else + if (count_gps < sizeof(buf_gps) - 1) { + buf_gps[count_gps] = c; + count_gps ++; + } +} + +void initGps () { + gps.baud(4800); + gps.attach(isrGps); +}