Tomo Suzu / GPS

Dependents:   library

Files at this revision

API Documentation at this revision

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