SSLM1 / 2_GPS_GMS6-CR6

Dependents:   2-1_GMS6-CR6 5_flightmode 5-2_thrustermode 5-3_thruster_depressmode ... more

Committer:
rary
Date:
Mon Jul 13 07:16:30 2020 +0000
Revision:
0:e504e33078a7
Child:
1:cefba0edfdd3
GPS Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rary 0:e504e33078a7 1 #include "mbed.h"
rary 0:e504e33078a7 2 #include "GMS6_CR6.h"
rary 0:e504e33078a7 3 #include "math.h"
rary 0:e504e33078a7 4
rary 0:e504e33078a7 5 GMS6_CR6::GMS6_CR6(PinName tx, PinName rx) : gps(tx, rx)
rary 0:e504e33078a7 6 {
rary 0:e504e33078a7 7 }
rary 0:e504e33078a7 8
rary 0:e504e33078a7 9 GMS6_CR6::~GMS6_CR6()
rary 0:e504e33078a7 10 {
rary 0:e504e33078a7 11 }
rary 0:e504e33078a7 12
rary 0:e504e33078a7 13 float GMS6_CR6::_DMS2DEG(float raw_data)
rary 0:e504e33078a7 14 {
rary 0:e504e33078a7 15 int d = (int)(raw_data/100);
rary 0:e504e33078a7 16 float m = (raw_data - (float)d * 100);
rary 0:e504e33078a7 17 return (float) d + m /60;
rary 0:e504e33078a7 18 }
rary 0:e504e33078a7 19
rary 0:e504e33078a7 20
rary 0:e504e33078a7 21 void GMS6_CR6::read(float *G)
rary 0:e504e33078a7 22 {
rary 0:e504e33078a7 23 char gps_data[256];
rary 0:e504e33078a7 24 memset(gps_data, '\0', 256);
rary 0:e504e33078a7 25
rary 0:e504e33078a7 26 int cnt_gps;
rary 0:e504e33078a7 27
rary 0:e504e33078a7 28 float world_time;
rary 0:e504e33078a7 29 int rlock, sat_num;
rary 0:e504e33078a7 30 char lat, lon;
rary 0:e504e33078a7 31
rary 0:e504e33078a7 32 float lon_east = 0;
rary 0:e504e33078a7 33 float lat_north = 0;
rary 0:e504e33078a7 34 int i = 0;
rary 0:e504e33078a7 35
rary 0:e504e33078a7 36 while(lat_north < 20 && i < 1000000) //緯度が20度以上と測定されるまたは一定回数ループが回ると抜ける
rary 0:e504e33078a7 37 {
rary 0:e504e33078a7 38 if(gps.readable())
rary 0:e504e33078a7 39 {
rary 0:e504e33078a7 40 gps_data[cnt_gps] = gps.getc();
rary 0:e504e33078a7 41
rary 0:e504e33078a7 42 if(gps_data[cnt_gps] == '$' || cnt_gps == 256)
rary 0:e504e33078a7 43 {
rary 0:e504e33078a7 44 cnt_gps = 0;
rary 0:e504e33078a7 45 memset(gps_data, '\0', 256); //この関数なんや
rary 0:e504e33078a7 46 }
rary 0:e504e33078a7 47 else if(gps_data[cnt_gps] == '\r')
rary 0:e504e33078a7 48 {
rary 0:e504e33078a7 49 if(sscanf(gps_data, "GPGGA,%f,%f,%c,%f,%c,%d,%d", &world_time, &lat_north, &lat, &lon_east, &lon, &rlock, &sat_num) >= 1)
rary 0:e504e33078a7 50 {
rary 0:e504e33078a7 51 if (rlock == 1)
rary 0:e504e33078a7 52 {
rary 0:e504e33078a7 53 lat_north = _DMS2DEG(lat_north);
rary 0:e504e33078a7 54 lon_east = _DMS2DEG(lon_east);
rary 0:e504e33078a7 55 }
rary 0:e504e33078a7 56 }
rary 0:e504e33078a7 57 }
rary 0:e504e33078a7 58 else
rary 0:e504e33078a7 59 {
rary 0:e504e33078a7 60 cnt_gps++;
rary 0:e504e33078a7 61 }
rary 0:e504e33078a7 62 }
rary 0:e504e33078a7 63 i++;
rary 0:e504e33078a7 64 }
rary 0:e504e33078a7 65
rary 0:e504e33078a7 66 if(lat_north > 20 && lon_east > 100) //緯度が正常な値のときのみ値を返す
rary 0:e504e33078a7 67 {
rary 0:e504e33078a7 68 *G = lat_north;
rary 0:e504e33078a7 69 *(G+1) = lon_east;
rary 0:e504e33078a7 70 }
rary 0:e504e33078a7 71 else
rary 0:e504e33078a7 72 {
rary 0:e504e33078a7 73 *G = 0;
rary 0:e504e33078a7 74 *(G+1) = 0;
rary 0:e504e33078a7 75 }
rary 0:e504e33078a7 76 }