2017年伊豆大島共同打ち上げ実験用電装モジュール搭載GPS測位プログラム
Dependents: Hybrid_interruptGPS Hybrid_main_FirstEdtion rocket_logger_sinkan2018_v1 HYBRYD2018_IZU_ROCKET ... more
Diff: GPS_interrupt.cpp
- 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; + } //} }