2017年伊豆大島共同打ち上げ実験用電装モジュール搭載GPS測位プログラム

Dependents:   Hybrid_interruptGPS Hybrid_main_FirstEdtion rocket_logger_sinkan2018_v1 HYBRYD2018_IZU_ROCKET ... more

Revision:
4:758f97bee95a
Parent:
3:8e66ec281888
Child:
6:2f91c71d64b1
--- a/GPS_interrupt.cpp	Tue Jan 03 09:22:54 2017 +0000
+++ b/GPS_interrupt.cpp	Sun Jan 15 20:01:46 2017 +0000
@@ -1,6 +1,7 @@
 #include "mbed.h"
 #include "GPS_interrupt.h"
-double GPS_interrupt::latitude;
+
+/*double GPS_interrupt::latitude;
 double GPS_interrupt::longitude;
 int GPS_interrupt::year;
 int GPS_interrupt::month;
@@ -17,14 +18,19 @@
 char GPS_interrupt::gps_buffer_A[128];
 char GPS_interrupt::gps_buffer_B[128];
 char* GPS_interrupt::gps_read_buffer = gps_buffer_B;
-bool GPS_interrupt::gps_readable = false;
+bool GPS_interrupt::gps_readable = false;*/
 
-GPS_interrupt* GPS_interrupt::gps_irq;
+//GPS_interrupt* GPS_interrupt::gps_irq;
 
 //Timeout timeout_clear;
 
-void GPS_interrupt::debug(char *str){
-    printf("%s\r\n", str);   
+void GPS_interrupt::debug(bool tf){
+    if(tf){
+        debugFlag = true;
+    }
+    else{
+        debugFlag = false;   
+    }
 }
 
 unsigned char GPS_interrupt::checkSum(char *str){
@@ -36,66 +42,56 @@
     return val;
 } 
 
-GPS_interrupt::GPS_interrupt(RawSerial *_gps, int _baudrate, int _frequency, int start_baudrate){
+GPS_interrupt::GPS_interrupt(RawSerial *_gps, int _frequency){
     
-    baudrate = _baudrate;
+    debugFlag = false;
+    initialize();
+    baudrate = 115200;//_baudrate;
     frequency = _frequency;
     gps_irq = this;
     gps = _gps;
-    gps->baud(start_baudrate);
+    gps->baud(9600);
+    if(baudrate == 9600){
+         gps->printf("$PMTK251,9600*17\r\n");
+    }
+    else if(baudrate == 19200){
+        gps->printf("$PMTK251,19200*22\r\n");   
+    }
+    else if( baudrate == 38400){
+        gps->printf("$PMTK251,38400*27\r\n");
+    }
+    else if(baudrate == 56700){
+        gps->printf("$PMTK251,57600*2C\r\n");
+    }
+    else if(baudrate == 115200){
+        gps->printf("$PMTK251,115200*1F\r\n");
+        wait(0.1);
+        gps->printf("$PMTK251,115200*1F\r\n");
+        wait(0.2);
+        gps->printf("$PMTK251,115200*1F\r\n");
+        wait(0.2);
+    }
+    gps->baud(115200);
+    baudrate = 115200;
     wait(0.1);
-    switch (_baudrate){
-        case 9600:
-            gps->printf("$PMTK251,9600*17\r\n");
-            break;
-        case 19200:
-            gps->printf("$PMTK251,19200*22\r\n");
-            break;
-        case 38400:
-            gps->printf("$PMTK251,38400*27\r\n");
-            break;
-        case 57600:
-            gps->printf("$PMTK251,57600*2C\r\n");
-            break;
-        case 115200:
-            gps->printf("$PMTK251,115200*1F\r\n");
-            break;
-        default:
-            gps->printf("$PMTK251,115200*1F\r\n");
-            break; 
-    }
-    gps->baud(_baudrate);
-    wait(0.1);
-    /*
-    gps->printf("$PMTK351,1*28\r\n");//$PMTK351,1*28<CR><LF> :Enable QZSS NMEA format 
+    
+    //gps->printf("$PMTK351,1*28\r\n");//$PMTK351,1*28<CR><LF> :Enable QZSS NMEA format 
     unsigned char checksum = 0;
-    checksum = checkSum("PMTK314,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1");
+    checksum = checkSum("PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0");
      //$PMTK314,GLL,RMC,VTG,GGA,GSA,GSV,0,0,0,0,0,0,0,0,0,0,0,ZDA,MCHN,チェックサム
-    gps->printf("$PMTK314,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1*%02X\r\n", checksum);*/
-    switch(_frequency){
-        case 1:
-            gps->printf("$PMTK220,1000*1F\r\n");
-            break;
-        case 2:
-            gps->printf("$PMTK220,500*2B\r\n");
-            break;
-        case 3:
-            gps->printf("$PMTK220,333*2D\r\n");
-            break;
-        case 4:
-            gps->printf("$PMTK220,250*29\r\n");
-            break;
-        case 5:
-            gps->printf("$PMTK220,200*2C\r\n");
-            break;
-        case 10:
-            gps->printf("$PMTK220,100*2F\r\n");
-            break;
-        default:
-            gps->printf("$PMTK220,1000*1F\r\n");
-            break;
-    }
-    wait(0.1);
+    gps->printf("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*%02X\r\n", checksum);
+    wait(0.2);
+    gps->printf("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*%02X\r\n", checksum);
+    wait(0.2);
+    gps->printf("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*%02X\r\n", checksum);
+    wait(0.2);
+    if(_frequency == 1) gps->printf("$PMTK220,1000*1F\r\n");
+    else if(_frequency == 2)  gps->printf("$PMTK220,500*2B\r\n");
+    else if(_frequency == 3)  gps->printf("$PMTK220,333*2D\r\n");
+    else if(_frequency == 4)  gps->printf("$PMTK220,250*29\r\n");     
+    else if(_frequency == 5)  gps->printf("$PMTK220,200*2C\r\n");
+    else if(_frequency == 10)   gps->printf("$PMTK220,100*2F\r\n");
+    wait(0.2);
     gps->attach(gps_irq, &GPS_interrupt::gps_auto_receive, Serial::RxIrq);
 }
 
@@ -180,11 +176,13 @@
                 save_buffer = gps_buffer_B;
                 classify_AB = ~classify_AB;
             }
+            
             if((strncmp(gps_read_buffer, "$GPRMC", 6) == 0) || (strncmp(gps_read_buffer, "$GNRMC", 6) == 0)){
                 memset(str_temp, '\0', 128);
                 strcpy(str_temp, gps_read_buffer);
                 if(processGPRMC(str_temp)){
                     gps_readable = true;
+                    return;//データが取得できればここで終了
                 }
             }
             else if(strncmp(gps_read_buffer, "$GPGGA", 6) == 0){
@@ -192,8 +190,12 @@
                 strcpy(str_temp, gps_read_buffer);
                 if(processGPGGA(str_temp)){
                     gps_readable = true;   
-                }   
+                    return;//データが取得できればここで終了
+                }
             }
+            
+            if(debugFlag)   printf("debug \"%s\"\r\n", gps_read_buffer);   
+                
             //else if(strncmp(gps_read_buffer, "$GPGSV", 6) == 0){
                 //printf("%s\r\n", gps_read_buffer);   
             //}
@@ -207,7 +209,6 @@
             }
         }
     }
-   
 }
 
 bool GPS_interrupt::processGPRMC(char *line){
@@ -229,7 +230,7 @@
     bool rmc_flag = false;
     char tok_count = 0;
     
-    rmc_initialize();
+    //rmc_initialize();
     
 //_____GPRMC___________________________________
     //データ文字列の先頭から6文字目までが$GPRMCなら0が返ってくる
@@ -313,12 +314,13 @@
             if (latSign)    latitude *= (-1);//南緯なら緯度を負に
             knot = atof(speed);
             degree = atof(angle);
-            //if(longitude > 129.0 && latitude > 29.0){
-                return true;
-            //}
-            //else return false;
+            
+            return true;
+            
         }
-        else return false;
+        else{
+             return false;
+        }
     //}
     //else return false;
 }
@@ -343,7 +345,7 @@
     //bool rmc_flag = false;
     char tok_count = 0;
     
-    gga_initialize();
+    //gga_initialize();
     
 //データ文字列の先頭から6文字目までが$GPGLLなら0が返ってくる
     //if (strncmp(data_GPS, "$GPGGA", 6) == 0){
@@ -428,7 +430,9 @@
                
                 return true;
         }
-        else return false;
+        else{
+             return false;
+        }
     //}
     
 }