test ver (get more data from GPS)

Dependents:   sample_GPS_GYSFDMAXB_edite_by_asha GPSDRV8833CanSat

Committer:
asha_ndf
Date:
Mon Oct 11 13:24:58 2021 +0000
Revision:
3:0ad6cc87d7cd
Parent:
2:4a3a10bc7309
Child:
4:e1e7bfab1993
fix time bug

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は切り捨て)*/
asha_ndf 3:0ad6cc87d7cd 63 gpstime = w_time;
CanSat_C 0:030ffb18f36d 64 int latitude_dd = (int)(raw_latitude / 100);
CanSat_C 0:030ffb18f36d 65 int longitude_dd = (int)(raw_longitude / 100);
CanSat_C 0:030ffb18f36d 66 int latitude_md = (raw_latitude - latitude_dd * 100) / 60;
CanSat_C 0:030ffb18f36d 67 int longitude_md = (raw_longitude - longitude_dd * 100) / 60;
CanSat_C 0:030ffb18f36d 68 latitude = latitude_dd + latitude_md;
CanSat_C 0:030ffb18f36d 69 longitude = longitude_dd + longitude_md;
asha_ndf 2:4a3a10bc7309 70 flag1 = 1;
asha_ndf 2:4a3a10bc7309 71 }else{
asha_ndf 2:4a3a10bc7309 72 flag1 = 0; //GGAセンテンスの情報が欠けている時
asha_ndf 2:4a3a10bc7309 73 }
asha_ndf 2:4a3a10bc7309 74
asha_ndf 2:4a3a10bc7309 75 //For GPVTG================================================================
asha_ndf 2:4a3a10bc7309 76 char c1, c2,c3;
asha_ndf 2:4a3a10bc7309 77 double f1, f2, f3, f4;
asha_ndf 2:4a3a10bc7309 78 if(sscanf(gpvtg_data, "GPVTG, %lf, %c, %lf, %c, %lf, %c, %lf", &f1, &c1, &f2, &c2, &f3, &c3, &f4)>1){
asha_ndf 2:4a3a10bc7309 79 direction = f1;
asha_ndf 2:4a3a10bc7309 80 speed = f4;
asha_ndf 2:4a3a10bc7309 81 flag2 = 1;
asha_ndf 2:4a3a10bc7309 82 }else{
asha_ndf 2:4a3a10bc7309 83 flag2 = 0;
asha_ndf 2:4a3a10bc7309 84 }
asha_ndf 2:4a3a10bc7309 85 //return
asha_ndf 2:4a3a10bc7309 86 if (flag1*flag2 ==1){
CanSat_C 0:030ffb18f36d 87 return true;
asha_ndf 2:4a3a10bc7309 88 }else{
asha_ndf 2:4a3a10bc7309 89 return false;
asha_ndf 2:4a3a10bc7309 90 }
asha_ndf 2:4a3a10bc7309 91
asha_ndf 2:4a3a10bc7309 92
CanSat_C 0:030ffb18f36d 93 }