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.
Dependents: Hybrid_interruptGPS Hybrid_main_FirstEdtion rocket_logger_sinkan2018_v1 HYBRYD2018_IZU_ROCKET ... more
Revision 15:6b1ed321c1be, committed 2018-05-25
- Comitter:
- Sigma884
- Date:
- Fri May 25 21:29:17 2018 +0000
- Parent:
- 14:23611bb30bc8
- Child:
- 16:ded6e8e2850f
- Commit message:
- ???????????????????????????
Changed in this revision
| GPS_interrupt.cpp | Show annotated file Show diff for this revision Revisions of this file |
| GPS_interrupt.h | Show annotated file Show diff for this revision Revisions of this file |
--- 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;//相対経度
--- a/GPS_interrupt.h Sun Feb 25 19:29:26 2018 +0000
+++ b/GPS_interrupt.h Fri May 25 21:29:17 2018 +0000
@@ -1,5 +1,5 @@
/*=============================================================================
-* GPS_interrupt.lib ver 1.3.5
+* GPS_interrupt.lib ver 1.6
*
* Each palameters are not stable because they can be changed unexpectedly.
* Therefor, you should use the funtions which have return value.
@@ -10,8 +10,8 @@
/**
* @file GPS_interrupt.h
* @brief GPSから送られてくるデータをバックグラウンドで解析し、呼び出せるライブラリ
- * @author 松本岳
- * @note ver1.3.6
+ * @author 松本岳 and 林拓真
+ * @note ver1.6
*/
#ifndef GPS_INTERRUPT_H_
@@ -28,14 +28,38 @@
class GPS_interrupt{
public:
- GPS_interrupt(Serial *_gps);
-
/**
* @bref GPS_interrupt's constructer
* @param _gps GPSと通信したいSerialバスのポインタ
- * @param _frequency GPSから何Hzでデータを取得したいか
+ */
+ GPS_interrupt(Serial *_gps);
+
+ /**
+ * @bref GPSのボーレートを変更
+ * @param _baudrate GPSのボーレート(4800, 9600, 14400, 19200, 38400, 57600, 115200)
+ */
+ void changeGPSBaud(int _baudrate);
+
+ /**
+ * @bref GPSのデータレート(1秒に何回データを送信するか)を変更
+ * @param _frequency GPSのデータレート(1~10)
+ * @retval false 失敗
+ * @retval true 成功
*/
- GPS_interrupt(Serial *_gps, int _baudrate);
+ bool changeGPSFreq(int _frequency);
+
+ /**
+ * @bref GPSのデータ内容を変更
+ * @param _GLL GLLの送信頻度(0 or 1)
+ * @param _RMC RMCの送信頻度(1)
+ * @param _VTG VTGの送信頻度(0 or 1)
+ * @param _GGA GGAの送信頻度(1)
+ * @param _GSA GSAの送信頻度(0 or 1)
+ * @param _GSV GSVの送信頻度(0 or 1)
+ * @retval false 失敗
+ * @retval true 成功
+ */
+ bool changeGPSData(int _GLL, int _RMC, int _VTG, int _GGA, int _GSA, int _GSV);
void debug(bool tf);
@@ -44,6 +68,7 @@
void gps_auto_receive();
bool processGPRMC(char *line);
bool processGPGGA(char *line);
+ void processPMTK(char *line);
unsigned char checkSum(char *str);
void rmc_initialize();
@@ -57,6 +82,10 @@
char gps_buffer_B[128];
//static char gps_buffer_C[128];
bool debugFlag;
+ int data_sum; //for ChangeGPSData
+ int flag_change_freq; // for ChangeGPSFreq
+ int flag_change_data; // for ChangeGPSData
+ int wait_change;
public:
double latitude;