GPS library.

Dependents:   B_test_gpsXbee

Committer:
odaa
Date:
Wed Oct 13 10:54:36 2021 +0000
Revision:
0:4c52e9f8484a
2nd test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
odaa 0:4c52e9f8484a 1 #include "mbed.h"
odaa 0:4c52e9f8484a 2 #include "getGPS.h"
odaa 0:4c52e9f8484a 3
odaa 0:4c52e9f8484a 4 GPS::GPS(PinName gpstx,PinName gpsrx): _gps(gpstx,gpsrx)
odaa 0:4c52e9f8484a 5 {
odaa 0:4c52e9f8484a 6 latitude = 0;
odaa 0:4c52e9f8484a 7 longitude = 0;
odaa 0:4c52e9f8484a 8 _gps.baud(GPSBAUD);
odaa 0:4c52e9f8484a 9 _gps.printf("$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29");
odaa 0:4c52e9f8484a 10 }
odaa 0:4c52e9f8484a 11
odaa 0:4c52e9f8484a 12 bool GPS::getgps()
odaa 0:4c52e9f8484a 13 {
odaa 0:4c52e9f8484a 14 char gps_data[256];
odaa 0:4c52e9f8484a 15 int i;
odaa 0:4c52e9f8484a 16
odaa 0:4c52e9f8484a 17 do {
odaa 0:4c52e9f8484a 18 while(_gps.getc() != '$'); //$マークまで読み飛ばし
odaa 0:4c52e9f8484a 19 i = 0;
odaa 0:4c52e9f8484a 20
odaa 0:4c52e9f8484a 21 /* gpa_data初期化 */
odaa 0:4c52e9f8484a 22 for(int j = 0; j < 256; j++)
odaa 0:4c52e9f8484a 23 gps_data[j] = '\0';
odaa 0:4c52e9f8484a 24
odaa 0:4c52e9f8484a 25 /* NMEAから一行読み込み */
odaa 0:4c52e9f8484a 26 while((gps_data[i] = _gps.getc()) != '\r') {
odaa 0:4c52e9f8484a 27 i++;
odaa 0:4c52e9f8484a 28 if(i == 256) {
odaa 0:4c52e9f8484a 29 i = 255;
odaa 0:4c52e9f8484a 30 break;
odaa 0:4c52e9f8484a 31 }
odaa 0:4c52e9f8484a 32 }
odaa 0:4c52e9f8484a 33 } while(strstr(gps_data, "GPGGA") == NULL); //GGAセンテンスまで一行ずつ読み込み続ける
odaa 0:4c52e9f8484a 34
odaa 0:4c52e9f8484a 35 int rlock;
odaa 0:4c52e9f8484a 36 char ns,ew;
odaa 0:4c52e9f8484a 37 double w_time, raw_longitude, raw_latitude;
odaa 0:4c52e9f8484a 38 int satnum;
odaa 0:4c52e9f8484a 39 double hdop;
odaa 0:4c52e9f8484a 40
odaa 0:4c52e9f8484a 41 if(sscanf(gps_data, "GPGGA, %lf, %lf, %c, %lf, %c, %d, %d, %lf", &w_time, &raw_latitude, &ns, &raw_longitude, &ew, &rlock, &satnum, &hdop) > 1) {
odaa 0:4c52e9f8484a 42 /* 座標1(度部分) */
odaa 0:4c52e9f8484a 43 int latitude_dd = (int)(raw_latitude / 100);
odaa 0:4c52e9f8484a 44 int longitude_dd = (int)(raw_longitude / 100);
odaa 0:4c52e9f8484a 45
odaa 0:4c52e9f8484a 46 /* 座標2(分部分 → 度) */
odaa 0:4c52e9f8484a 47 double latitude_md = (raw_latitude - latitude_dd * 100) / 60;
odaa 0:4c52e9f8484a 48 double longitude_md = (raw_longitude - longitude_dd * 100) / 60;
odaa 0:4c52e9f8484a 49
odaa 0:4c52e9f8484a 50 /* 座標1 + 2 */
odaa 0:4c52e9f8484a 51 latitude = latitude_dd + latitude_md;
odaa 0:4c52e9f8484a 52 longitude = longitude_dd + longitude_md;
odaa 0:4c52e9f8484a 53
odaa 0:4c52e9f8484a 54 return true;
odaa 0:4c52e9f8484a 55 } else
odaa 0:4c52e9f8484a 56 return false; //GGAセンテンスの情報が欠けている時
odaa 0:4c52e9f8484a 57 }