otamesi
Dependencies: mbed
gps.cpp@0:a01fda36fde8, 2018-10-10 (annotated)
- Committer:
- seangshim
- Date:
- Wed Oct 10 14:10:51 2018 +0000
- Revision:
- 0:a01fda36fde8
- Child:
- 21:5fa04278ec78
GPS??????????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
seangshim | 0:a01fda36fde8 | 1 | #include "mbed.h" |
seangshim | 0:a01fda36fde8 | 2 | #include "gps.h" |
seangshim | 0:a01fda36fde8 | 3 | |
seangshim | 0:a01fda36fde8 | 4 | GPS::GPS(PinName gpstx,PinName gpsrx): _gps(gpstx,gpsrx) |
seangshim | 0:a01fda36fde8 | 5 | { |
seangshim | 0:a01fda36fde8 | 6 | latitude = 0; |
seangshim | 0:a01fda36fde8 | 7 | longitude = 0; |
seangshim | 0:a01fda36fde8 | 8 | _gps.baud(GPSBAUD); |
seangshim | 0:a01fda36fde8 | 9 | _gps.printf("$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"); |
seangshim | 0:a01fda36fde8 | 10 | } |
seangshim | 0:a01fda36fde8 | 11 | |
seangshim | 0:a01fda36fde8 | 12 | bool GPS::getgps() |
seangshim | 0:a01fda36fde8 | 13 | { |
seangshim | 0:a01fda36fde8 | 14 | |
seangshim | 0:a01fda36fde8 | 15 | |
seangshim | 0:a01fda36fde8 | 16 | char gps_data[256]; |
seangshim | 0:a01fda36fde8 | 17 | int i; |
seangshim | 0:a01fda36fde8 | 18 | |
seangshim | 0:a01fda36fde8 | 19 | do { |
seangshim | 0:a01fda36fde8 | 20 | while(_gps.getc() != '$'); //$マークまで読み飛ばし |
seangshim | 0:a01fda36fde8 | 21 | i = 0; |
seangshim | 0:a01fda36fde8 | 22 | |
seangshim | 0:a01fda36fde8 | 23 | /* gpa_data初期化 */ |
seangshim | 0:a01fda36fde8 | 24 | for(int j = 0; j < 256; j++) |
seangshim | 0:a01fda36fde8 | 25 | gps_data[j] = '\0'; |
seangshim | 0:a01fda36fde8 | 26 | |
seangshim | 0:a01fda36fde8 | 27 | /* NMEAから一行読み込み */ |
seangshim | 0:a01fda36fde8 | 28 | while((gps_data[i] = _gps.getc()) != '\r') { |
seangshim | 0:a01fda36fde8 | 29 | i++; |
seangshim | 0:a01fda36fde8 | 30 | if(i == 256) { |
seangshim | 0:a01fda36fde8 | 31 | i = 255; |
seangshim | 0:a01fda36fde8 | 32 | break; |
seangshim | 0:a01fda36fde8 | 33 | } |
seangshim | 0:a01fda36fde8 | 34 | } |
seangshim | 0:a01fda36fde8 | 35 | |
seangshim | 0:a01fda36fde8 | 36 | |
seangshim | 0:a01fda36fde8 | 37 | } while(strstr(gps_data, "GPGGA") == NULL); //GGAセンテンスまで一行ずつ読み込み続ける |
seangshim | 0:a01fda36fde8 | 38 | |
seangshim | 0:a01fda36fde8 | 39 | |
seangshim | 0:a01fda36fde8 | 40 | |
seangshim | 0:a01fda36fde8 | 41 | int rlock; |
seangshim | 0:a01fda36fde8 | 42 | char ns,ew; |
seangshim | 0:a01fda36fde8 | 43 | double w_time, raw_longitude, raw_latitude; |
seangshim | 0:a01fda36fde8 | 44 | int satnum; |
seangshim | 0:a01fda36fde8 | 45 | double hdop; |
seangshim | 0:a01fda36fde8 | 46 | |
seangshim | 0:a01fda36fde8 | 47 | 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) { |
seangshim | 0:a01fda36fde8 | 48 | /* 座標1(度部分) */ |
seangshim | 0:a01fda36fde8 | 49 | int latitude_dd = (int)(raw_latitude / 100); |
seangshim | 0:a01fda36fde8 | 50 | int longitude_dd = (int)(raw_longitude / 100); |
seangshim | 0:a01fda36fde8 | 51 | |
seangshim | 0:a01fda36fde8 | 52 | /* 座標2(分部分 → 度) */ |
seangshim | 0:a01fda36fde8 | 53 | int latitude_md = (raw_latitude - latitude_dd * 100) / 60; |
seangshim | 0:a01fda36fde8 | 54 | int longitude_md = (raw_longitude - longitude_dd * 100) / 60; |
seangshim | 0:a01fda36fde8 | 55 | |
seangshim | 0:a01fda36fde8 | 56 | /* 座標1 + 2 */ |
seangshim | 0:a01fda36fde8 | 57 | latitude = latitude_dd + latitude_md; |
seangshim | 0:a01fda36fde8 | 58 | longitude = longitude_dd + longitude_md; |
seangshim | 0:a01fda36fde8 | 59 | |
seangshim | 0:a01fda36fde8 | 60 | return true; |
seangshim | 0:a01fda36fde8 | 61 | } else |
seangshim | 0:a01fda36fde8 | 62 | return false; //GGAセンテンスの情報が欠けている時 |
seangshim | 0:a01fda36fde8 | 63 | } |