test ver (get more data from GPS)

Dependents:   sample_GPS_GYSFDMAXB_edite_by_asha GPSDRV8833CanSat

Committer:
asha_ndf
Date:
Sat Jun 12 21:16:25 2021 +0000
Revision:
2:4a3a10bc7309
Parent:
0:030ffb18f36d
Child:
3:0ad6cc87d7cd
get more data from GPS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
CanSat_C 0:030ffb18f36d 1 #include "mbed.h"
CanSat_C 0:030ffb18f36d 2 #include "getGPS.h"
CanSat_C 0:030ffb18f36d 3
CanSat_C 0:030ffb18f36d 4 GPS::GPS(PinName gpstx,PinName gpsrx): _gps(gpstx,gpsrx)
CanSat_C 0:030ffb18f36d 5 {
asha_ndf 2:4a3a10bc7309 6 gpstime =0; //GPSから取得した時刻。
asha_ndf 2:4a3a10bc7309 7 longitude =0;
asha_ndf 2:4a3a10bc7309 8 latitude =0;
asha_ndf 2:4a3a10bc7309 9 hdop =0; //位置情報精度
asha_ndf 2:4a3a10bc7309 10 hight =0; //海抜高度
asha_ndf 2:4a3a10bc7309 11 //GPVTG
asha_ndf 2:4a3a10bc7309 12 direction =0; //進行方向(真北基準)
asha_ndf 2:4a3a10bc7309 13 speed =0; //対地速度kmph
CanSat_C 0:030ffb18f36d 14 _gps.baud(GPSBAUD);
CanSat_C 0:030ffb18f36d 15 _gps.printf("$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29");
CanSat_C 0:030ffb18f36d 16 }
CanSat_C 0:030ffb18f36d 17
CanSat_C 0:030ffb18f36d 18 bool GPS::getgps()
CanSat_C 0:030ffb18f36d 19 {
CanSat_C 0:030ffb18f36d 20 char gps_data[256];
asha_ndf 2:4a3a10bc7309 21 char gpgga_data[256];
asha_ndf 2:4a3a10bc7309 22 char gpvtg_data[256];
CanSat_C 0:030ffb18f36d 23
asha_ndf 2:4a3a10bc7309 24 int i;
asha_ndf 2:4a3a10bc7309 25 int flag1 = 0; //GPGGA
asha_ndf 2:4a3a10bc7309 26 int flag2 = 0; //GPVTG
asha_ndf 2:4a3a10bc7309 27 for (int p=0; p<50; p++){
CanSat_C 0:030ffb18f36d 28 while(_gps.getc() != '$'); //$マークまで読み飛ばし
CanSat_C 0:030ffb18f36d 29 i = 0;
CanSat_C 0:030ffb18f36d 30
CanSat_C 0:030ffb18f36d 31 /* gpa_data初期化 */
CanSat_C 0:030ffb18f36d 32 for(int j = 0; j < 256; j++)
CanSat_C 0:030ffb18f36d 33 gps_data[j] = '\0';
CanSat_C 0:030ffb18f36d 34
CanSat_C 0:030ffb18f36d 35 /* NMEAから一行読み込み */
CanSat_C 0:030ffb18f36d 36 while((gps_data[i] = _gps.getc()) != '\r') {
CanSat_C 0:030ffb18f36d 37 i++;
CanSat_C 0:030ffb18f36d 38 if(i == 256) {
CanSat_C 0:030ffb18f36d 39 i = 255;
CanSat_C 0:030ffb18f36d 40 break;
CanSat_C 0:030ffb18f36d 41 }
CanSat_C 0:030ffb18f36d 42 }
asha_ndf 2:4a3a10bc7309 43 if (strstr(gps_data, "GPGGA") != NULL){
asha_ndf 2:4a3a10bc7309 44 strcpy(gpgga_data,gps_data);
asha_ndf 2:4a3a10bc7309 45 flag1=1;
asha_ndf 2:4a3a10bc7309 46 }
asha_ndf 2:4a3a10bc7309 47 if(strstr(gps_data, "GPVTG") != NULL){
asha_ndf 2:4a3a10bc7309 48 strcpy(gpvtg_data,gps_data);
asha_ndf 2:4a3a10bc7309 49 flag2=1;
asha_ndf 2:4a3a10bc7309 50 }
asha_ndf 2:4a3a10bc7309 51 if (flag1 * flag2== 0){
asha_ndf 2:4a3a10bc7309 52 break;
asha_ndf 2:4a3a10bc7309 53 }
asha_ndf 2:4a3a10bc7309 54 } //GPGGAとGPVTGが取得できるまで1行ずつ読む
asha_ndf 2:4a3a10bc7309 55 //For GPGGA================================================================
CanSat_C 0:030ffb18f36d 56 int rlock;
CanSat_C 0:030ffb18f36d 57 char ns,ew;
CanSat_C 0:030ffb18f36d 58 double w_time, raw_longitude, raw_latitude;
CanSat_C 0:030ffb18f36d 59 int satnum;
CanSat_C 0:030ffb18f36d 60
asha_ndf 2:4a3a10bc7309 61 if(sscanf(gpgga_data, "GPGGA,%lf,%lf,%c,%lf,%c,%d,%d,%lf,%lf", &w_time, &raw_latitude, &ns, &raw_longitude, &ew, &rlock, &satnum, &hdop, &hight) > 1) {
asha_ndf 2:4a3a10bc7309 62 /* 座標を求める (度と分で分割して度にする。intは切り捨て)*/
CanSat_C 0:030ffb18f36d 63 int latitude_dd = (int)(raw_latitude / 100);
CanSat_C 0:030ffb18f36d 64 int longitude_dd = (int)(raw_longitude / 100);
CanSat_C 0:030ffb18f36d 65 int latitude_md = (raw_latitude - latitude_dd * 100) / 60;
CanSat_C 0:030ffb18f36d 66 int longitude_md = (raw_longitude - longitude_dd * 100) / 60;
CanSat_C 0:030ffb18f36d 67 latitude = latitude_dd + latitude_md;
CanSat_C 0:030ffb18f36d 68 longitude = longitude_dd + longitude_md;
asha_ndf 2:4a3a10bc7309 69 flag1 = 1;
asha_ndf 2:4a3a10bc7309 70 }else{
asha_ndf 2:4a3a10bc7309 71 flag1 = 0; //GGAセンテンスの情報が欠けている時
asha_ndf 2:4a3a10bc7309 72 }
asha_ndf 2:4a3a10bc7309 73
asha_ndf 2:4a3a10bc7309 74 //For GPVTG================================================================
asha_ndf 2:4a3a10bc7309 75 char c1, c2,c3;
asha_ndf 2:4a3a10bc7309 76 double f1, f2, f3, f4;
asha_ndf 2:4a3a10bc7309 77 if(sscanf(gpvtg_data, "GPVTG, %lf, %c, %lf, %c, %lf, %c, %lf", &f1, &c1, &f2, &c2, &f3, &c3, &f4)>1){
asha_ndf 2:4a3a10bc7309 78 direction = f1;
asha_ndf 2:4a3a10bc7309 79 speed = f4;
asha_ndf 2:4a3a10bc7309 80 flag2 = 1;
asha_ndf 2:4a3a10bc7309 81 }else{
asha_ndf 2:4a3a10bc7309 82 flag2 = 0;
asha_ndf 2:4a3a10bc7309 83 }
asha_ndf 2:4a3a10bc7309 84 //return
asha_ndf 2:4a3a10bc7309 85 if (flag1*flag2 ==1){
CanSat_C 0:030ffb18f36d 86 return true;
asha_ndf 2:4a3a10bc7309 87 }else{
asha_ndf 2:4a3a10bc7309 88 return false;
asha_ndf 2:4a3a10bc7309 89 }
asha_ndf 2:4a3a10bc7309 90
asha_ndf 2:4a3a10bc7309 91
CanSat_C 0:030ffb18f36d 92 }