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.
Revision 0:2c0d50143d85, committed 2018-05-03
- Comitter:
- Tomo073
- Date:
- Thu May 03 14:19:36 2018 +0000
- Child:
- 1:2f131675f872
- Commit message:
- a
Changed in this revision
| GPS.cpp | Show annotated file Show diff for this revision Revisions of this file |
| GPS.h | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS.cpp Thu May 03 14:19:36 2018 +0000
@@ -0,0 +1,220 @@
+#include "mbed.h"
+#include "GPS.h"
+#include "math.h"
+#include "stdio.h"
+
+GPS::GPS(PinName gpstx,PinName gpsrx): serial(gpstx,gpsrx){
+
+ gpscmd("314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0");
+ int odr=ODR;
+ odr=1000/odr;
+ sprintf(buf,"300,%d,0,0,0,0",odr);
+ gpscmd(buf);
+
+ int baud=GPSBAUD;
+
+ for(int i=0;i<100;i++){
+ buf[i]=0;
+ }
+
+ sprintf(buf,"251,%d",baud);
+
+ gpscmd(buf);
+ gpscmd(buf);
+
+
+ serial.baud(GPSBAUD);
+
+ NVIC_SetPriority(UART2_IRQn,0);
+
+ //m = 1;
+ //reasonable = false;
+
+ //serial.attach(this,ExtractionData,Serial::RxIrq);
+
+}
+
+void GPS::gpscmd(char *command)
+{
+ int len=strlen(command);
+ char xordata[len+4];
+ sprintf(xordata,"PMTK%s",command);
+
+
+ char xorbuf=0x00;
+ for(int i=0;i<len+4;i++){
+ xorbuf=xorbuf^xordata[i];
+ }
+
+
+ char packet[len+8];
+ if(xorbuf>0x0f){
+ sprintf(packet,"$%s*%x",xordata,xorbuf);
+ }
+ else {
+ sprintf(packet,"$%s*0%x",xordata,xorbuf);
+ }
+
+
+ serial.printf(packet);
+ serial.putc(0x0D);
+ serial.putc(0x0A);
+}
+
+void GPS::attach(void(*fn)()){
+ serial.attach(fn, Serial::RxIrq);
+}
+
+void GPS::GetDefault(){
+ datadefault = serial.getc();
+}
+
+void GPS::ExtractionData(){
+
+ Initialization();
+
+ datadefault = serial.getc();
+
+ if(datadefault == '$'){
+
+ char DATA[20] = "\0";
+ Initialization();
+ getstring(DATA);
+
+ if(!strcmp(DATA, "GPGGA")){
+ //int m;
+ for(m = 1; m < 6;m++){
+ getstring(DATA);
+ switch(m){
+ case 1:
+ time = strtof(DATA, NULL) + 90000.0;
+ break;
+ case 2:
+ //latitude = strtof(DATA, NULL);
+ fMinutes = modff(strtof(DATA, NULL), &latitude)*60.0;
+ latitude = latitude*100.0 + fMinutes;
+ break;
+ case 3:
+ if(!strcmp(DATA, "S")){
+ latitude = latitude*-1.0;
+ }
+ break;
+ case 4:
+ //longtitude = strtof(DATA, NULL);
+ fMinutes = modff(strtof(DATA, NULL), &longtitude)*60.0;
+ longtitude = longtitude*100.0 + fMinutes;
+ break;
+ case 5:
+ if(!strcmp(DATA, "W")){
+ longtitude = longtitude*-1.0;
+ }
+ break;
+ case 9:
+ altitude = strtof(DATA, NULL);
+ break;
+ case 10:
+ if(strcmp(DATA, "M")){
+ altitude = altitude*-1.0;
+ }
+ //m = 1;
+ readable = true;
+ break;
+ }
+ }
+ }
+ }
+}
+
+void GPS::ExtractionData_FULL(){
+
+ char DATA[20] = "\0";
+
+ Initialization();
+ datadefault = serial.getc();
+
+ if(datadefault == '$'){
+ getstring(DATA);
+ if(!strcmp(DATA, "GPGGA")){
+ reasonable = true;
+ }
+ }
+
+ if(reasonable){
+
+ Initialization();
+ getstring(DATA);
+
+ switch(m){
+ case 1:
+ Seconds = modff((strtof(DATA, NULL) + 90000.0)/100.0, &fHours)*100;
+ fMinutes = modff(fHours/100.0, &fHours)*100;
+ Hours = fHours;
+ Minutes = fMinutes;
+ sprintf(timeFULL, "%d:%d:%f", Hours, Minutes, Seconds);
+ break;
+ case 2:
+ fMinutes = modff(strtof(DATA, NULL)/100.0, &fDegrees)*100.0;
+ Seconds = modff(strtof(DATA, NULL), &fMinutes)*60.0;
+ Degrees = fDegrees;
+ Minutes = fMinutes;
+ sprintf(latitudeFULL, "%d°%d\'%f\"", Degrees, Minutes, Seconds);
+ break;
+ case 3:
+ sprintf(latitudeFULL, "%s%s", latitudeFULL, DATA);
+ break;
+ case 4:
+ fMinutes = modff(strtof(DATA, NULL)/100.0, &fDegrees)*100.0;
+ Seconds = modff(strtof(DATA, NULL), &fMinutes)*60.0;
+ Degrees = fDegrees;
+ Minutes = fMinutes;
+ sprintf(longtitudeFULL, "%d°%d\'%f\"", Degrees, Minutes, Seconds);
+ break;
+ case 5:
+ sprintf(longtitudeFULL, "%s%s", longtitudeFULL, DATA);
+ break;
+ case 9:
+ strcpy(altitudeFULL, DATA);
+ break;
+ case 10:
+ sprintf(altitudeFULL, "%s%s", altitudeFULL, DATA);
+ m = 1;
+ reasonable = false;
+ readable = true;
+ break;
+ }
+
+ m++;
+ //sizeof
+ }
+}
+
+void GPS::getstring(char a[]){
+ int n;
+ for(n = 0;;n++){
+ char ch = serial.getc();
+ if(ch == ',' ||ch == '\n'){
+ a[n] = '\0';
+ break;
+ }
+ a[n] = ch;
+ }
+}
+
+void GPS::Initialization(){
+ readable = false;
+ Degrees = -1;
+ Minutes = -1;
+ Hours = -1;
+ longtitude = -1.0;
+ latitude = -1.0;
+ altitude = -1.0;
+ time = -1.0;
+ fDegrees = -1.0;
+ fMinutes = -1.0;
+ Seconds = -1.0;
+ fHours = -1.0;
+ longtitudeFULL = "\0";
+ latitudeFULL = "\0";
+ timeFULL = "\0";
+ altitudeFULL = "\0";
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/GPS.h Thu May 03 14:19:36 2018 +0000
@@ -0,0 +1,89 @@
+/*
+
+ GYSFDMAXB(GPS受信機1pps出力付きみちびき対応)用ライブラリ
+ written by ST
+ 他の処理と並行するなら割り込み処理を使用すべし
+ ex:NVIC_SetPriority(UART2_IRQn,0); //0の部分で優先順位を決定
+ readable == true のとき正しいデータが出力
+
+ ※経度、緯度、時間の読み方
+ lon,lat:ddmm.mmmm
+ dd:度
+ mm.mmmm:分(上一桁:10分、下一桁:1/10000分)
+
+ time:hhmmss.000000
+ hh.時
+ mm.分
+ ss.秒
+
+ ※機能
+ ・GPS(TX,RX); コンストラクタ、ピン宣言
+ ・GPS::attach(関数名); 割り込み処理設定
+ ・GPS::GetDefault(); 編集前データ出力(char)
+ ・gps.ExtractionData(); 編集データ出力(float gps.longtitude, float gps.latitude, float gps.timedefault)
+ ・gps.ExtractionData_FULL(); 編集データ出力(書式は下記のサンプルプログラム参照)
+
+ @code
+ //----------------------------------------------------------------------------------------------------------------------------------------------------------
+ //sample program(TERA TERMに出力)
+ //----------------------------------------------------------------------------------------------------------------------------------------------------------
+#include "mbed.h"
+#include "GPS.h"
+
+GPS gps(p28,p27); //(tx,rx)
+Serial pc(USBTX, USBRX);
+
+void getGPS(){
+ //NVIC_SetPriority(UART2_IRQn,0); //割り込み優先順位(必要に応じて)
+ gps.ExtractionData_FULL(); //データ抽出
+ if(gps.readable == true){
+ //pc.printf("longtitude:%f latitude:%f time:%f\r\n", gps.longtitude, gps.latitude, gps.time); //gps.ExtractionData(); 書き込み(経度、緯度、時間)
+ }
+}
+
+int main(){
+ gps.attach(getGPS); //割り込み(関数名)
+ while(1){
+ //gps.GetDefault(); //元のデータ
+ //pc.printf("%c",gps.datadefault); //書き込み
+ }
+}
+//-------------------------------------------------------------------------------------------------------------------------------------------------------------
+ @endcode
+
+*/
+
+#ifndef GPS_H
+#define GPS_H
+
+#include "mbed.h"
+
+#define GPSBAUD 9600//GPSのボーレート
+#define ODR 10//max 10Hz 更新周期
+
+class GPS {
+ public:
+ GPS(PinName gpstx,PinName gpsrx);
+
+ bool readable;
+ char datadefault;
+ char *longtitudeFULL, *latitudeFULL, *timeFULL, *altitudeFULL;
+ float longtitude, latitude, time, altitude, times;
+
+ void GPS::attach(void(*fn)());
+ void GetDefault();
+ void ExtractionData();
+ void ExtractionData_FULL();
+
+ private:
+ Serial serial;
+ bool reasonable;
+ char buf[100];
+ int Degrees, Minutes, Hours, m;
+ float fDegrees, fMinutes, Seconds, fHours;
+ void gpscmd(char *command);
+ void getstring(char DATA[]);
+ void Initialization();
+};
+
+#endif
\ No newline at end of file