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

Dependents:   Hybrid_interruptGPS Hybrid_main_FirstEdtion rocket_logger_sinkan2018_v1 HYBRYD2018_IZU_ROCKET ... more

Revision:
15:6b1ed321c1be
Parent:
14:23611bb30bc8
Child:
17:4b09630703c0
--- a/GPS_interrupt.cpp	Sun Feb 25 19:29:26 2018 +0000
+++ b/GPS_interrupt.cpp	Fri May 25 21:29:17 2018 +0000
@@ -43,6 +43,7 @@
     }
     return val;
 } 
+
 GPS_interrupt::GPS_interrupt(Serial *_gps){
 
     if(_gps == NULL){
@@ -50,14 +51,15 @@
     }
     debugFlag = false;
     initialize();
-    baudrate = 9600;//_baudrate;
-    frequency = 1;
+    //baudrate = 9600;//_baudrate;
+    //frequency = 1;
     gps_irq = this;
     gps = _gps;
-    gps->baud(baudrate);
+    //gps->baud(baudrate);
     gps->attach(gps_irq, &GPS_interrupt::gps_auto_receive, Serial::RxIrq);    
 }
 
+/*
 GPS_interrupt::GPS_interrupt(Serial *_gps, int _baudrate){
     
     if(_gps == NULL){
@@ -70,7 +72,8 @@
     gps_irq = this;
     gps = _gps;
     gps->baud(baudrate);
-    /*if(baudrate == 9600){
+    
+    if(baudrate == 9600){
          gps->printf("$PMTK251,9600*17\r\n");
     }
     else if(baudrate == 19200){
@@ -113,8 +116,243 @@
     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);
 }
+*/
+
+void GPS_interrupt::changeGPSBaud(int _baudrate){
+    baudrate = _baudrate;
+    switch(baudrate){
+        case 4800:
+        gps -> printf("$PMTK251,4800*14\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,4800*14\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,4800*14\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,4800*14\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,4800*14\r\n");
+        wait(0.2f);
+        gps->baud(4800);
+        break;
+        
+        case 9600:
+        gps->printf("$PMTK251,9600*17\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,9600*17\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,9600*17\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,9600*17\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,9600*17\r\n");
+        wait(0.2f);
+        gps->baud(9600);
+        break;
+        
+        case 14400:
+        gps->printf("$PMTK251,14400*29\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,14400*29\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,14400*29\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,14400*29\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,14400*29\r\n");
+        wait(0.2f);
+        gps->baud(14400);
+        break;
+        
+        case 19200:
+        gps->printf("$PMTK251,19200*22\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,19200*22\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,19200*22\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,19200*22\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,19200*22\r\n");
+        wait(0.2f);
+        gps->baud(19200);
+        break;
+        
+        case 38400:
+        gps->printf("$PMTK251,38400*27\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,38400*27\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,38400*27\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,38400*27\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,38400*27\r\n");
+        wait(0.2f);
+        gps->baud(38400);
+        break;
+        
+        case 57600:
+        gps->printf("$PMTK251,57600*2C\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,57600*2C\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,57600*2C\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,57600*2C\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,57600*2C\r\n");
+        wait(0.2f);
+        gps->baud(57600);
+        break;
+        
+        case 115200:
+        gps->printf("$PMTK251,115200*1F\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,115200*1F\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,115200*1F\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,115200*1F\r\n");
+        wait(0.2f);
+        gps->printf("$PMTK251,115200*1F\r\n");
+        wait(0.2f);
+        gps->baud(115200);
+        break;
+    }
+}
+
+bool GPS_interrupt::changeGPSFreq(int _frequency){
+    frequency = _frequency;
+    flag_change_freq = 0;
+    switch(frequency){
+        case 1:
+        gps->printf("$PMTK220,1000*1F\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,1000*1F\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,1000*1F\r\n");
+        wait(0.1f);
+        break;
+        
+        case 2:
+        gps->printf("$PMTK220,500*2B\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,500*2B\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,500*2B\r\n");
+        wait(0.1f);
+        break;
+        
+        case 3:
+        gps->printf("$PMTK220,333*2D\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,333*2D\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,333*2D\r\n");
+        wait(0.1f);
+        break;
+        
+        case 4:
+        gps->printf("$PMTK220,250*29\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,250*29\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,250*29\r\n");
+        wait(0.1f);
+        break;
+        
+        case 5:
+        gps->printf("$PMTK220,200*2C\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,200*2C\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,200*2C\r\n");
+        wait(0.1f);
+        break;
+        
+        case 6:
+        gps->printf("$PMTK220,167*2E\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,167*2E\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,167*2E\r\n");
+        wait(0.1f);
+        break;
+        
+        case 7:
+        gps->printf("$PMTK220,143*28\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,143*28\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,143*28\r\n");
+        wait(0.1f);
+        break;
+        
+        case 8:
+        gps->printf("$PMTK220,125*28\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,125*28\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,125*28\r\n");
+        wait(0.1f);
+        break;
+        
+        case 9:
+        gps->printf("$PMTK220,111*2F\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,111*2F\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,111*2F\r\n");
+        wait(0.1f);
+        break;
+        
+        case 10:
+        gps->printf("$PMTK220,100*2F\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,100*2F\r\n");
+        wait(0.1f);
+        gps->printf("$PMTK220,100*2F\r\n");
+        wait(0.1f);
+        break;
+    }
+    
+    for(wait_change = 0; wait_change < 10; wait_change ++){
+        if(flag_change_freq == 1){
+            return true;
+        }
+        else if(flag_change_freq == -1){
+            return false;
+        }
+        wait(0.1f);
+    }
+    return false;
+}
+
+bool GPS_interrupt::changeGPSData(int _GLL, int _RMC, int _VTG, int _GGA, int _GSA, int _GSV){
+    data_sum = _GLL + _RMC + _VTG + _GGA + _GSA + _GSV;
+    data_sum = data_sum % 2;
+    data_sum += 28;
+    gps->printf("$PMTK314,%d,%d,%d,%d,%d,%d,0,0,0,0,0,0,0,0,0,0,0,0,0*%d\r\n", _GLL, _RMC, _VTG, _GGA, _GSA, _GSV, data_sum);
+    wait(0.1f);
+    gps->printf("$PMTK314,%d,%d,%d,%d,%d,%d,0,0,0,0,0,0,0,0,0,0,0,0,0*%d\r\n", _GLL, _RMC, _VTG, _GGA, _GSA, _GSV, data_sum);
+    wait(0.1f);
+    gps->printf("$PMTK314,%d,%d,%d,%d,%d,%d,0,0,0,0,0,0,0,0,0,0,0,0,0*%d\r\n", _GLL, _RMC, _VTG, _GGA, _GSA, _GSV, data_sum);
+    wait(0.1f);
+    
+    for(wait_change = 0; wait_change < 10; wait_change ++){
+        if(flag_change_data == 1){
+            return true;
+        }
+        else if(flag_change_data == -1){
+            return false;
+        }
+        wait(0.1f);
+    }
+    return false;
+}
 
 void GPS_interrupt::initialize(){
     latitude = 0.0f;
@@ -244,6 +482,11 @@
             //else if(strncmp(gps_read_buffer, "$GPGSV", 6) == 0){
                 //printf("%s\r\n", gps_read_buffer);   
             //}
+            else if(strncmp(gps_read_buffer, "$PMTK001", 8) == 0){
+                memset(str_temp, '\0', 128);
+                strcpy(str_temp, gps_read_buffer);
+                processPMTK(str_temp);
+            }
         }
         else{
             save_buffer[current] = temp;
@@ -486,9 +729,68 @@
         else{
              return false;
         }
-    return false;
+    //return false;
 }
 
+void GPS_interrupt::processPMTK(char *line){
+    
+    char *tok; //strtokで帰ってくる文字列のポインター
+    int tok_count = 0;
+    
+    char status[2];
+    char mode_change_s[5] = "";
+    int mode_change = 0;
+
+    tok = strtok(line, ",");
+    tok_count = 0;
+
+    //$PMTK001, 334, 3*34
+    //   0    ,  1 ,  2
+
+    while (1){
+        switch (tok_count){
+            case 1: //変更内容
+            if(strcmp(tok, "220") == 0){
+                mode_change = 220;
+            }
+            else if(strcmp(tok, "314") == 0){
+                mode_change = 314;
+            }
+            break;
+            
+            case 2:
+            if(tok[0] = '3'){
+                switch(mode_change){
+                    case 220:
+                    flag_change_freq = 1;
+                    break;
+                    case 314:
+                    flag_change_data = 1;
+                    break;
+                }
+            }
+            else{
+                switch(mode_change){
+                    case 220:
+                    flag_change_freq = -1;
+                    break;
+                    case 314:
+                    flag_change_data = -1;
+                    break;
+                }
+            }
+            break;
+        }
+        tok = strtok(NULL, ",");
+        tok_count ++;
+        if(tok == NULL){
+            break;
+        }
+    }
+}
+
+
+
 float GPS_interrupt::Distance(double x, double y){
     
     double dLat = x - longitude;//相対経度