Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Hybrid_interruptGPS Hybrid_main_FirstEdtion rocket_logger_sinkan2018_v1 HYBRYD2018_IZU_ROCKET ... more
GPS_interrupt.h
- Committer:
- Gaku0606
- Date:
- 2017-06-26
- Revision:
- 8:3f32df2b66c0
- Parent:
- 6:2f91c71d64b1
- Child:
- 9:dab13bd20f43
File content as of revision 8:3f32df2b66c0:
/*=============================================================================
* GPS_interrupt.lib ver 1.3.5
*
* Each palameters are not stable because they can be changed unexpectedly.
* Therefor, you should use the funtions which have return value.
* Then, you must not substitute any value for those palameters.
* なんかコマンドの送信ミスがあるみたいで、確認して次に進めるようにすべきかも
* PCソフトで設定して、バックアップ電池付けるのが正確っぽい
*=============================================================================*/
/**
* @file GPS_interrupt.h
* @bref GPSから送られてくるデータをバックグラウンドで解析し、呼び出せるライブラリ
* @author 松本岳
* @note ver1.3.5
*/
#ifndef GPS_INTERRUPT_H_
#define GPS_INTERRUPT_H_
#include "mbed.h"//要る?
#define EARTH_EQUATOR_RADIUS 6378136.6//地球の赤道半径[m]
#define EARTH_POLAR_RADIUS 6356751.9//地球の極半径[m]
#define EIRTH_AspectRatioInverse 298.257223563//地球の扁平率の逆数、0に近づくにつれ真球になる
#define GPS_PI 3.1415926535897932384626433832795
#define GPS_2PI 6.283185307179586476925286766559
class GPS_interrupt{
public:
GPS_interrupt(Serial *_gps);
/**
* @bref GPS_interrupt's constructer
* @param _gps GPSと通信したいSerialバスのポインタ
* @param _frequency GPSから何Hzでデータを取得したいか
*/
GPS_interrupt(Serial *_gps, int _frequency);
void initialize();//初期化関数
void gps_auto_receive();
bool processGPRMC(char *line);
bool processGPGGA(char *line);
void debug(bool tf);
unsigned char checkSum(char *str);
void rmc_initialize();
void gga_initialize();
private://別にpublicにしても良かったけれど、unexpectedlyに変更されるので使えないようにしてやった
GPS_interrupt* gps_irq;
int baudrate;
int frequency;
char gps_buffer_A[128];
char gps_buffer_B[128];
//static char gps_buffer_C[128];
bool debugFlag;
public:
double latitude;
double longitude;
int year;
int month;
int day;
int hour;
int minutes;
double seconds;
double knot;
double degree;
double height;
double geoid;
int number;
public:
char *gps_read_buffer;
bool gps_readable;
private:
Serial *gps;
public:
/** 経度を返す関数
* @bref 経度を取得
* @return double型 経度
* @note inline展開したつもり
*/
inline double Longitude(){
return longitude;
}
/** 緯度を返す関数
* @bref 緯度を取得
* @return double型 緯度
* @note inline展開したつもり
*/
inline double Latitude(){
return latitude;
}
/** 年を返す関数
* @bref 年を取得
* @return int型 年
* @note inline展開したつもり
*/
inline int Year(){
return year;
}
/** 月を返す関数
* @bref 月を取得
* @return int型 月
* @note inline展開したつもり
*/
inline int Month(){
return month;
}
/** 日にちを返す関数
* @bref 日にちを取得
* @return int型 日にち
* @note inline展開したつもり
*/
inline int Day(){
return day;
}
/** 時間を返す関数
* @bref 時間を取得
* @return int型 時間
* @note inline展開したつもり
*/
inline int Hour(){
return hour;
}
/** 分を返す関数
* @bref 分を取得
* @return int型 分
* @note inline展開したつもり
*/
inline int Minutes(){
return minutes;
}
/** 秒を返す関数
* @bref 秒を取得
* @return double型 秒
*/
inline double Seconds(){
return seconds;
}
/** 経度・緯度を取得できる関数
* @bref 2つの変数に経度、緯度の順に値を代入する
* @param lon double型 経度 ポインタ
* @param lat double型 緯度 ポインタ
* @return データが有効かどうか 有効ならtrue, 無効ならfalse
* @note 2つ変数を作って、そのアドレスを引数に与えてください。
*/
inline bool getPosition(double *lon, double *lat){
*lon = longitude;
*lat = latitude;
if(gps_readable) return true;
else return false;
}
/** 経度・緯度を取得できる関数
* @bref 2つの配列に経度、緯度の順に値を代入する
* @param lonlat double型 要素2の配列
* @return データが有効かどうか 有効ならtrue, 無効ならfalse
* @note 要素2の配列を作って、そのアドレスを引数に与えてください。
*/
inline bool getPosition(double *lonlat){
lonlat[0] = longitude;
lonlat[1] = latitude;
if(gps_readable) return true;
else return false;
}
/** 日付・時刻を取得できる関数
* @bref 6つの変数に年、月、日、時間、分、秒の順に値を代入する
* @param _year int型 年 ポインタ
* @param _month int型 月 ポインタ
* @param _day int型 日 ポインタ
* @param _hour int型 時間 ポインタ
* @param _minutes int型 分 ポインタ
* @param _seconds double型 秒 ポインタ
* @return データが有効かどうか 有効ならtrue, 無効ならfalse
* @note 6つ変数を作って、そのアドレスを引数に与えてください。
*/
inline bool getUTC(int *_year, int *_month, int *_day, int *_hour, int *_minutes, double *_seconds){
*_year = year;
*_month = month;
*_day = day;
*_hour = hour;
*_minutes = minutes;
*_seconds = seconds;
if(gps_readable) return true;
else return false;
}
/** 世界協定時間の日付・時刻を取得できる関数
* @bref 要素数6の配列に年、月、日、時間、分、秒の順に値を代入する
* @param (*_utc) float型 秒 アドレス
* @return データが有効かどうか 有効ならtrue, 無効ならfalse
* @detail 要素6の配列を作って、そのアドレスを引数に与えてください。
*/
inline bool getUTC(float *_utc){
_utc[0] = (float)year;
_utc[1] = (float)month;
_utc[2] = (float)day;
_utc[3] = (float)hour;
_utc[4] = (float)minutes;
_utc[5] = seconds;
if(gps_readable) return true;
else return false;
}
/** 世界協定時間の日付・時刻を取得できる関数
* @bref 要素数6の配列に年、月、日、時間、分、秒の順に値を代入する
* @param _utc int型 秒 ポインタ
* @return データが有効かどうか 有効ならtrue, 無効ならfalse
* @note 要素6の配列を作って、そのアドレスを引数に与えてください。
*/
inline bool getUTC(int *_utc){
_utc[0] = year;
_utc[1] = month;
_utc[2] = day;
_utc[3] = hour;
_utc[4] = minutes;
_utc[5] = (int)seconds;
if(gps_readable) return true;
else return false;
}
/** 速度・進行方角を取得できる関数
* @bref 2つの変数に速度、進行方角の順に値を代入する
* @param _knot double型 経度 ポインタ [knot]
* @param _degree double型 緯度 ポインタ [degree] 北から右回り正です。
* @return データが有効かどうか 有効ならtrue, 無効ならfalse
* @detail 2つ変数を作って、そのアドレスを引数に与えてください。
*/
inline bool getSpeedVector(double *_knot, double *_degree){
*_knot = knot;
*_degree = degree;
if(gps_readable) return true;
else return false;
}
/** 捕捉衛星数を取得できる関数
* @bref 捕捉衛星数を返します。
* @return int型 捕捉衛星数 アドレス
*/
inline int Number(){
return number;
}
/** 標高を取得できる関数
* @bref 標高を返します。
* @return double型 標高 アドレス
*/
inline double Height(){
return height;
}
/** 速さを取得できる関数
* @bref 速さを返します。
* @return double型 速さ アドレス[knot]
*/
inline double Knot(){
return knot;
}
/** 進行方角を取得できる関数
* @bref 進行方角を返します。
* @return double型 進行方角 アドレス 北から右回り正です。
*/
inline double Degree(){
return degree;
}
/** 目標座標までの直線距離を計算
* @bref 距離を[m]で返します
* @param x 目標経度
* @param y 目標緯度
*/
double Distance(double x, double y);
};
/////////////////
/////sample//////
/////////////////
/*
@code
#include "mbed.h"
#include "GPS_interrupt.h"
Serial pc(USBTX, USBRX);
Serial mygps(p9, p10);
GPS_interrupt gps(&mygps, 115200, 10, 115200);
void bootFunction(){//do not need
pc.printf("\r\n");
pc.printf("start LPC1768 boot phase\r\n");
wait(0.5);
for(int i = 0;i < 100;i++){
pc.printf("Loading... : %3d [%%]\r", i);
wait(0.025);
}
pc.printf("Loading... : %3d [%%]\r\n", 100);
pc.printf("\t-> finished!!\r\n");
pc.printf("System : %d Hz\r\n", SystemCoreClock );
wait(0.5);
pc.printf("start main program\r\n");
wait(0.1);
pc.printf("initialize");
wait(0.75);
pc.printf(" -> OK\r\n");
wait(0.1);
pc.printf("GPS Connecting");
wait(0.5);
pc.printf(".");
wait(0.5);
pc.printf(".");
wait(0.5);
pc.printf(".");
wait(0.5);
pc.printf(".");
wait(0.5);
pc.printf(".");
wait(0.5);
pc.printf(".");
wait(0.5);
while(1){
if(gps.gps_readable) break;
}
pc.printf(" -> OK\r\n");
pc.printf("start!!\r\n\r\n");
wait(0.5);
}
int main() {
pc.baud(115200);
//mygps.baud(9600);
bootFunction();
while(1){
double xy[2] = {0};
float utc[6] = {0};
gps.getPosition(xy);
gps.getUTC(utc);
pc.printf("\033[K");
pc.printf("%d/%d/%d %d:%d:%02.2f ",(int)utc[0],(int)utc[1], (int)utc[2], (int)utc[3], (int)utc[4] ,utc[5]);
pc.printf("(%3.7fe,%3.7fn) ",xy[0], xy[1]);
pc.printf("%d satellites, %.2f[m], %.3f[m/s], %3.2f[degree]\r", gps.Number(), gps.Height(), gps.Knot()*1852/3600, gps.Degree());
wait(0.1);
}
}
@codeend
*/
#endif