Receive GPS by interrupt processing
Dependents: Sample_GPS_INT_lib GPS-SD
GPS_INT.cpp@0:4b6c377342d9, 2018-07-08 (annotated)
- Committer:
- j_rocket_boy
- Date:
- Sun Jul 08 02:30:46 2018 +0000
- Revision:
- 0:4b6c377342d9
- Child:
- 1:fbe835e114bb
??
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
j_rocket_boy | 0:4b6c377342d9 | 1 | #include "GPS_INT.h" |
j_rocket_boy | 0:4b6c377342d9 | 2 | #include "mbed.h" |
j_rocket_boy | 0:4b6c377342d9 | 3 | |
j_rocket_boy | 0:4b6c377342d9 | 4 | GPS_INT::GPS_INT(PinName tx, PinName rx, int baud) : gps(tx, rx, baud) { |
j_rocket_boy | 0:4b6c377342d9 | 5 | seconds = 0; //時刻(UTC1900年1月1日からの経過時間) |
j_rocket_boy | 0:4b6c377342d9 | 6 | lon = 0; //緯度, 度(北緯が正) |
j_rocket_boy | 0:4b6c377342d9 | 7 | lat = 0; //経度, 度(東経が正) |
j_rocket_boy | 0:4b6c377342d9 | 8 | lock = 0; //位置特定品質(0:位置特定できない, 1:SPS(標準測位サービス), 2:differencial GPS) |
j_rocket_boy | 0:4b6c377342d9 | 9 | n_sat = 0; //使用衛星数 |
j_rocket_boy | 0:4b6c377342d9 | 10 | HDOP = 0; //水平精度低下率 |
j_rocket_boy | 0:4b6c377342d9 | 11 | VDOP = 0; //垂直精度低下率 |
j_rocket_boy | 0:4b6c377342d9 | 12 | PDOP = 0; //位置精度低下率 |
j_rocket_boy | 0:4b6c377342d9 | 13 | h_see = 0; //アンテナ海抜高さ, m |
j_rocket_boy | 0:4b6c377342d9 | 14 | h_geo = 0; //ジオイド高さ, m |
j_rocket_boy | 0:4b6c377342d9 | 15 | location_update = false; |
j_rocket_boy | 0:4b6c377342d9 | 16 | info_update = false; |
j_rocket_boy | 0:4b6c377342d9 | 17 | this->gps.attach(this, &GPS_INT::get_char); |
j_rocket_boy | 0:4b6c377342d9 | 18 | } |
j_rocket_boy | 0:4b6c377342d9 | 19 | |
j_rocket_boy | 0:4b6c377342d9 | 20 | |
j_rocket_boy | 0:4b6c377342d9 | 21 | GPS_INT::~GPS_INT() |
j_rocket_boy | 0:4b6c377342d9 | 22 | { |
j_rocket_boy | 0:4b6c377342d9 | 23 | } |
j_rocket_boy | 0:4b6c377342d9 | 24 | |
j_rocket_boy | 0:4b6c377342d9 | 25 | bool GPS_INT::is_lock(void){ |
j_rocket_boy | 0:4b6c377342d9 | 26 | if(lock == 0){ |
j_rocket_boy | 0:4b6c377342d9 | 27 | return false; |
j_rocket_boy | 0:4b6c377342d9 | 28 | } |
j_rocket_boy | 0:4b6c377342d9 | 29 | return true; |
j_rocket_boy | 0:4b6c377342d9 | 30 | } |
j_rocket_boy | 0:4b6c377342d9 | 31 | |
j_rocket_boy | 0:4b6c377342d9 | 32 | bool GPS_INT::location_is_update(void){ |
j_rocket_boy | 0:4b6c377342d9 | 33 | if(location_update){ |
j_rocket_boy | 0:4b6c377342d9 | 34 | location_update = false; |
j_rocket_boy | 0:4b6c377342d9 | 35 | return true; |
j_rocket_boy | 0:4b6c377342d9 | 36 | } |
j_rocket_boy | 0:4b6c377342d9 | 37 | return false; |
j_rocket_boy | 0:4b6c377342d9 | 38 | } |
j_rocket_boy | 0:4b6c377342d9 | 39 | |
j_rocket_boy | 0:4b6c377342d9 | 40 | bool GPS_INT::info_is_update(void){ |
j_rocket_boy | 0:4b6c377342d9 | 41 | if(info_update){ |
j_rocket_boy | 0:4b6c377342d9 | 42 | info_update = false; |
j_rocket_boy | 0:4b6c377342d9 | 43 | return true; |
j_rocket_boy | 0:4b6c377342d9 | 44 | } |
j_rocket_boy | 0:4b6c377342d9 | 45 | return false; |
j_rocket_boy | 0:4b6c377342d9 | 46 | } |
j_rocket_boy | 0:4b6c377342d9 | 47 | |
j_rocket_boy | 0:4b6c377342d9 | 48 | void GPS_INT::gps_update(char* buffer){ |
j_rocket_boy | 0:4b6c377342d9 | 49 | |
j_rocket_boy | 0:4b6c377342d9 | 50 | //以下捨て変数 |
j_rocket_boy | 0:4b6c377342d9 | 51 | char mode; //モード(M:手動, A:自動) |
j_rocket_boy | 0:4b6c377342d9 | 52 | int type; //特定タイプ(1:存在しない, 2:2D特定, 3:3D特定) |
j_rocket_boy | 0:4b6c377342d9 | 53 | float v_sur; //地表における移動速度, km/h |
j_rocket_boy | 0:4b6c377342d9 | 54 | float ang_v_sur; //地方における移動速度の真方位, 度 |
j_rocket_boy | 0:4b6c377342d9 | 55 | char status; //ステータス(V:警告, A:有効) |
j_rocket_boy | 0:4b6c377342d9 | 56 | |
j_rocket_boy | 0:4b6c377342d9 | 57 | if(sscanf(buffer,"GPGGA,%f,%lf,%c,%lf,%c,%d,%d,%f,%f,M,%f,M", &time_raw, &lon_raw, &ns, &lat_raw, &ew, &lock, &n_sat, &HDOP, &h_see, &h_geo)){ |
j_rocket_boy | 0:4b6c377342d9 | 58 | } |
j_rocket_boy | 0:4b6c377342d9 | 59 | |
j_rocket_boy | 0:4b6c377342d9 | 60 | if(sscanf(buffer,"GPGSA,%c,%d", &mode, &type)){ |
j_rocket_boy | 0:4b6c377342d9 | 61 | |
j_rocket_boy | 0:4b6c377342d9 | 62 | char buffer2[256]; |
j_rocket_boy | 0:4b6c377342d9 | 63 | int i = 0; |
j_rocket_boy | 0:4b6c377342d9 | 64 | int j = 0; |
j_rocket_boy | 0:4b6c377342d9 | 65 | int n = 0; |
j_rocket_boy | 0:4b6c377342d9 | 66 | while(n != 15){ //コンマを15個探す(衛星番号の部分を飛ばす) |
j_rocket_boy | 0:4b6c377342d9 | 67 | if(buffer[i] == ','){ |
j_rocket_boy | 0:4b6c377342d9 | 68 | n++; |
j_rocket_boy | 0:4b6c377342d9 | 69 | } |
j_rocket_boy | 0:4b6c377342d9 | 70 | i++; |
j_rocket_boy | 0:4b6c377342d9 | 71 | } |
j_rocket_boy | 0:4b6c377342d9 | 72 | while(buffer[i+j] != '\0'){ //その後ろをコピー |
j_rocket_boy | 0:4b6c377342d9 | 73 | buffer2[j] = buffer[i+j]; |
j_rocket_boy | 0:4b6c377342d9 | 74 | j++; |
j_rocket_boy | 0:4b6c377342d9 | 75 | } |
j_rocket_boy | 0:4b6c377342d9 | 76 | buffer2[j] = '\0'; |
j_rocket_boy | 0:4b6c377342d9 | 77 | if(lock != 0){ |
j_rocket_boy | 0:4b6c377342d9 | 78 | //DOP取得 |
j_rocket_boy | 0:4b6c377342d9 | 79 | sscanf(buffer2,"%f,%f,%f", &PDOP, &HDOP, &VDOP); |
j_rocket_boy | 0:4b6c377342d9 | 80 | |
j_rocket_boy | 0:4b6c377342d9 | 81 | //緯度経度の計算 |
j_rocket_boy | 0:4b6c377342d9 | 82 | lon_int = (int)lon_raw/100; |
j_rocket_boy | 0:4b6c377342d9 | 83 | lon_minute = ( lon_raw - 100*lon_int ); |
j_rocket_boy | 0:4b6c377342d9 | 84 | lon = lon_int + lon_minute / 60; |
j_rocket_boy | 0:4b6c377342d9 | 85 | lat_int = (int)lat_raw/100; |
j_rocket_boy | 0:4b6c377342d9 | 86 | lat_minute = ( lat_raw - 100*lat_int ); |
j_rocket_boy | 0:4b6c377342d9 | 87 | lat = lat_int + lat_minute / 60; |
j_rocket_boy | 0:4b6c377342d9 | 88 | |
j_rocket_boy | 0:4b6c377342d9 | 89 | location_update = true; |
j_rocket_boy | 0:4b6c377342d9 | 90 | } |
j_rocket_boy | 0:4b6c377342d9 | 91 | } |
j_rocket_boy | 0:4b6c377342d9 | 92 | |
j_rocket_boy | 0:4b6c377342d9 | 93 | if(sscanf(buffer,"GPRMC,%f,%c,%lf,%c,%lf,%c,%f,%f,%d", &time_raw, &status, &lon_raw, &ns, &lat_raw, &ew, &v_sur, &ang_v_sur, &date_raw)){ |
j_rocket_boy | 0:4b6c377342d9 | 94 | |
j_rocket_boy | 0:4b6c377342d9 | 95 | if(lock != 0){ |
j_rocket_boy | 0:4b6c377342d9 | 96 | //緯度経度の計算 |
j_rocket_boy | 0:4b6c377342d9 | 97 | lon_int = (int)lon_raw/100; |
j_rocket_boy | 0:4b6c377342d9 | 98 | lon_minute = ( lon_raw - 100*lon_int ); |
j_rocket_boy | 0:4b6c377342d9 | 99 | lon = lon_int + lon_minute / 60; |
j_rocket_boy | 0:4b6c377342d9 | 100 | if(ns == 's'){ |
j_rocket_boy | 0:4b6c377342d9 | 101 | lon *= -1; |
j_rocket_boy | 0:4b6c377342d9 | 102 | } |
j_rocket_boy | 0:4b6c377342d9 | 103 | |
j_rocket_boy | 0:4b6c377342d9 | 104 | lat_int = (int)lat_raw/100; |
j_rocket_boy | 0:4b6c377342d9 | 105 | lat_minute = ( lat_raw - 100*lat_int ); |
j_rocket_boy | 0:4b6c377342d9 | 106 | lat = lat_int + lat_minute / 60; |
j_rocket_boy | 0:4b6c377342d9 | 107 | if(ew == 'w'){ |
j_rocket_boy | 0:4b6c377342d9 | 108 | lat *= -1; |
j_rocket_boy | 0:4b6c377342d9 | 109 | } |
j_rocket_boy | 0:4b6c377342d9 | 110 | |
j_rocket_boy | 0:4b6c377342d9 | 111 | v_sur = (float)1.852 * v_sur; //knotからkm/hへ |
j_rocket_boy | 0:4b6c377342d9 | 112 | |
j_rocket_boy | 0:4b6c377342d9 | 113 | t.tm_sec = ((int)(time_raw ))%100; // 0-59 |
j_rocket_boy | 0:4b6c377342d9 | 114 | t.tm_min = ((int)(time_raw/100 ))%100; // 0-59 |
j_rocket_boy | 0:4b6c377342d9 | 115 | t.tm_hour = ((int)(time_raw/10000))%100; // 0-23 |
j_rocket_boy | 0:4b6c377342d9 | 116 | t.tm_mday = ((int)(date_raw/10000))%100; // 1-31 |
j_rocket_boy | 0:4b6c377342d9 | 117 | t.tm_mon = ((int)(date_raw/100 ))%100; // 0-11 |
j_rocket_boy | 0:4b6c377342d9 | 118 | t.tm_year = ((int)(date_raw ))%100 + 100; // year since 1900(just use only 2000~) |
j_rocket_boy | 0:4b6c377342d9 | 119 | seconds = mktime(&t); |
j_rocket_boy | 0:4b6c377342d9 | 120 | |
j_rocket_boy | 0:4b6c377342d9 | 121 | info_update = true; |
j_rocket_boy | 0:4b6c377342d9 | 122 | } |
j_rocket_boy | 0:4b6c377342d9 | 123 | } |
j_rocket_boy | 0:4b6c377342d9 | 124 | |
j_rocket_boy | 0:4b6c377342d9 | 125 | } |
j_rocket_boy | 0:4b6c377342d9 | 126 | |
j_rocket_boy | 0:4b6c377342d9 | 127 | void GPS_INT::get_char(void){ |
j_rocket_boy | 0:4b6c377342d9 | 128 | static char gps_buffer[256]; |
j_rocket_boy | 0:4b6c377342d9 | 129 | static int gps_n = 0; |
j_rocket_boy | 0:4b6c377342d9 | 130 | char c; //受信文字 |
j_rocket_boy | 0:4b6c377342d9 | 131 | |
j_rocket_boy | 0:4b6c377342d9 | 132 | c = gps.getc(); |
j_rocket_boy | 0:4b6c377342d9 | 133 | |
j_rocket_boy | 0:4b6c377342d9 | 134 | if(c == '\r'){ |
j_rocket_boy | 0:4b6c377342d9 | 135 | gps_buffer[gps_n] = '\0'; |
j_rocket_boy | 0:4b6c377342d9 | 136 | gps_update(gps_buffer); |
j_rocket_boy | 0:4b6c377342d9 | 137 | gps_n = 0; |
j_rocket_boy | 0:4b6c377342d9 | 138 | return; |
j_rocket_boy | 0:4b6c377342d9 | 139 | } |
j_rocket_boy | 0:4b6c377342d9 | 140 | |
j_rocket_boy | 0:4b6c377342d9 | 141 | if(c == '$'){ |
j_rocket_boy | 0:4b6c377342d9 | 142 | gps_n = 0; |
j_rocket_boy | 0:4b6c377342d9 | 143 | return; |
j_rocket_boy | 0:4b6c377342d9 | 144 | } |
j_rocket_boy | 0:4b6c377342d9 | 145 | |
j_rocket_boy | 0:4b6c377342d9 | 146 | gps_buffer[gps_n] = c; |
j_rocket_boy | 0:4b6c377342d9 | 147 | gps_n++; |
j_rocket_boy | 0:4b6c377342d9 | 148 | if(gps_n == 256){ |
j_rocket_boy | 0:4b6c377342d9 | 149 | gps_n = 0; |
j_rocket_boy | 0:4b6c377342d9 | 150 | } |
j_rocket_boy | 0:4b6c377342d9 | 151 | } |