ウソッキー

Dependencies:   mbed

Committer:
naruu
Date:
Sat Dec 19 11:30:53 2020 +0000
Revision:
0:326c07d635d7
GPS;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
naruu 0:326c07d635d7 1 #include "mbed.h"
naruu 0:326c07d635d7 2 #include "getGPS.h"
naruu 0:326c07d635d7 3
naruu 0:326c07d635d7 4 GPS::GPS(PinName gpstx,PinName gpsrx): _gps(gpstx,gpsrx)
naruu 0:326c07d635d7 5 {
naruu 0:326c07d635d7 6 latitude = 0;
naruu 0:326c07d635d7 7 longitude = 0; //getGPS.hで宣言した値を初期化
naruu 0:326c07d635d7 8 _gps.baud(GPSBAUD);
naruu 0:326c07d635d7 9 _gps.printf("$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29");
naruu 0:326c07d635d7 10 }
naruu 0:326c07d635d7 11
naruu 0:326c07d635d7 12 bool GPS::getgps() //GPSのデータを取得する関数の中身
naruu 0:326c07d635d7 13 {
naruu 0:326c07d635d7 14 char gps_data[256];
naruu 0:326c07d635d7 15 int i;
naruu 0:326c07d635d7 16
naruu 0:326c07d635d7 17 do {
naruu 0:326c07d635d7 18 while(_gps.getc() != '$');//$マークまで読み飛ばし 
naruu 0:326c07d635d7 19 /*送ったリンクのサイトに『1つのセンテンスは、「$」で始まり、「(改行(\r\n))」で終わります。』
naruu 0:326c07d635d7 20 とあるので、_gps.getc()が取得する値が$以外の場合は無視して、$が始まったところを探すためにループしている。*/
naruu 0:326c07d635d7 21 i = 0;
naruu 0:326c07d635d7 22
naruu 0:326c07d635d7 23 /* gpa_data初期化 */
naruu 0:326c07d635d7 24 for(int j = 0; j < 256; j++)
naruu 0:326c07d635d7 25 gps_data[j] = '\0';
naruu 0:326c07d635d7 26
naruu 0:326c07d635d7 27 /* NMEAから一行読み込み */
naruu 0:326c07d635d7 28 while((gps_data[i] = _gps.getc()) != '\r') {//受信したデータを配列に格納し、'\r'でない場合ループ
naruu 0:326c07d635d7 29 i++;
naruu 0:326c07d635d7 30 if(i == 256) {
naruu 0:326c07d635d7 31 i = 255;
naruu 0:326c07d635d7 32 return 0;;
naruu 0:326c07d635d7 33 }
naruu 0:326c07d635d7 34 }
naruu 0:326c07d635d7 35 } while(strstr(gps_data, "GPGGA") == NULL); //GGAセンテンスまで一行ずつ読み込み続ける
naruu 0:326c07d635d7 36
naruu 0:326c07d635d7 37 int rlock;
naruu 0:326c07d635d7 38 char ns,ew;
naruu 0:326c07d635d7 39 double w_time, raw_longitude, raw_latitude;
naruu 0:326c07d635d7 40 int satnum;
naruu 0:326c07d635d7 41 double hdop;
naruu 0:326c07d635d7 42
naruu 0:326c07d635d7 43 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) {
naruu 0:326c07d635d7 44 //取得したデータを読み込んでいる 詳しくはリンクを送ります
naruu 0:326c07d635d7 45 /* 座標1(度部分) */
naruu 0:326c07d635d7 46 double latitude_dd = (double)(raw_latitude / 100);
naruu 0:326c07d635d7 47 double longitude_dd = (double)(raw_longitude / 100);
naruu 0:326c07d635d7 48
naruu 0:326c07d635d7 49 /* 座標2(分部分 → 度) */
naruu 0:326c07d635d7 50 double latitude_md = (raw_latitude - latitude_dd * 100) / 60;
naruu 0:326c07d635d7 51 double longitude_md = (raw_longitude - longitude_dd * 100) / 60;
naruu 0:326c07d635d7 52
naruu 0:326c07d635d7 53 /* 座標1 + 2 */
naruu 0:326c07d635d7 54 latitude = latitude_dd + latitude_md;
naruu 0:326c07d635d7 55 longitude = longitude_dd + longitude_md;
naruu 0:326c07d635d7 56
naruu 0:326c07d635d7 57 return true;
naruu 0:326c07d635d7 58 //ここまでgpsが受信する値は単位が度になっていないので、度に直している
naruu 0:326c07d635d7 59 } else
naruu 0:326c07d635d7 60 return false; //GGAセンテンスの情報が欠けている時
naruu 0:326c07d635d7 61 }