Receive GPS by interrupt processing

Dependents:   Sample_GPS_INT_lib GPS-SD

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?

UserRevisionLine numberNew 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 }