2018/06/18
GPS.cpp@2:578f518a6a05, 2018-06-08 (annotated)
- Committer:
- Tomo073
- Date:
- Fri Jun 08 13:08:05 2018 +0000
- Revision:
- 2:578f518a6a05
- Parent:
- 1:2f131675f872
- Child:
- 3:940fe222bab0
a;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Tomo073 | 0:2c0d50143d85 | 1 | #include "mbed.h" |
Tomo073 | 0:2c0d50143d85 | 2 | #include "GPS.h" |
Tomo073 | 0:2c0d50143d85 | 3 | |
Tomo073 | 0:2c0d50143d85 | 4 | GPS::GPS(PinName gpstx,PinName gpsrx): serial(gpstx,gpsrx){ |
Tomo073 | 0:2c0d50143d85 | 5 | |
Tomo073 | 0:2c0d50143d85 | 6 | gpscmd("314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"); |
Tomo073 | 0:2c0d50143d85 | 7 | int odr=ODR; |
Tomo073 | 0:2c0d50143d85 | 8 | odr=1000/odr; |
Tomo073 | 0:2c0d50143d85 | 9 | sprintf(buf,"300,%d,0,0,0,0",odr); |
Tomo073 | 0:2c0d50143d85 | 10 | gpscmd(buf); |
Tomo073 | 0:2c0d50143d85 | 11 | |
Tomo073 | 0:2c0d50143d85 | 12 | int baud=GPSBAUD; |
Tomo073 | 0:2c0d50143d85 | 13 | |
Tomo073 | 0:2c0d50143d85 | 14 | for(int i=0;i<100;i++){ |
Tomo073 | 0:2c0d50143d85 | 15 | buf[i]=0; |
Tomo073 | 0:2c0d50143d85 | 16 | } |
Tomo073 | 0:2c0d50143d85 | 17 | |
Tomo073 | 0:2c0d50143d85 | 18 | sprintf(buf,"251,%d",baud); |
Tomo073 | 0:2c0d50143d85 | 19 | |
Tomo073 | 0:2c0d50143d85 | 20 | gpscmd(buf); |
Tomo073 | 0:2c0d50143d85 | 21 | gpscmd(buf); |
Tomo073 | 0:2c0d50143d85 | 22 | |
Tomo073 | 0:2c0d50143d85 | 23 | |
Tomo073 | 0:2c0d50143d85 | 24 | serial.baud(GPSBAUD); |
Tomo073 | 0:2c0d50143d85 | 25 | |
Tomo073 | 2:578f518a6a05 | 26 | //NVIC_SetPriority(UART2_IRQn,0); |
Tomo073 | 0:2c0d50143d85 | 27 | //serial.attach(this,ExtractionData,Serial::RxIrq); |
Tomo073 | 0:2c0d50143d85 | 28 | |
Tomo073 | 0:2c0d50143d85 | 29 | } |
Tomo073 | 0:2c0d50143d85 | 30 | |
Tomo073 | 0:2c0d50143d85 | 31 | void GPS::gpscmd(char *command) |
Tomo073 | 0:2c0d50143d85 | 32 | { |
Tomo073 | 0:2c0d50143d85 | 33 | int len=strlen(command); |
Tomo073 | 0:2c0d50143d85 | 34 | char xordata[len+4]; |
Tomo073 | 0:2c0d50143d85 | 35 | sprintf(xordata,"PMTK%s",command); |
Tomo073 | 0:2c0d50143d85 | 36 | |
Tomo073 | 0:2c0d50143d85 | 37 | |
Tomo073 | 0:2c0d50143d85 | 38 | char xorbuf=0x00; |
Tomo073 | 0:2c0d50143d85 | 39 | for(int i=0;i<len+4;i++){ |
Tomo073 | 0:2c0d50143d85 | 40 | xorbuf=xorbuf^xordata[i]; |
Tomo073 | 0:2c0d50143d85 | 41 | } |
Tomo073 | 0:2c0d50143d85 | 42 | |
Tomo073 | 0:2c0d50143d85 | 43 | |
Tomo073 | 0:2c0d50143d85 | 44 | char packet[len+8]; |
Tomo073 | 0:2c0d50143d85 | 45 | if(xorbuf>0x0f){ |
Tomo073 | 0:2c0d50143d85 | 46 | sprintf(packet,"$%s*%x",xordata,xorbuf); |
Tomo073 | 0:2c0d50143d85 | 47 | } |
Tomo073 | 0:2c0d50143d85 | 48 | else { |
Tomo073 | 0:2c0d50143d85 | 49 | sprintf(packet,"$%s*0%x",xordata,xorbuf); |
Tomo073 | 0:2c0d50143d85 | 50 | } |
Tomo073 | 0:2c0d50143d85 | 51 | |
Tomo073 | 0:2c0d50143d85 | 52 | |
Tomo073 | 0:2c0d50143d85 | 53 | serial.printf(packet); |
Tomo073 | 0:2c0d50143d85 | 54 | serial.putc(0x0D); |
Tomo073 | 0:2c0d50143d85 | 55 | serial.putc(0x0A); |
Tomo073 | 0:2c0d50143d85 | 56 | } |
Tomo073 | 0:2c0d50143d85 | 57 | |
Tomo073 | 0:2c0d50143d85 | 58 | void GPS::attach(void(*fn)()){ |
Tomo073 | 0:2c0d50143d85 | 59 | serial.attach(fn, Serial::RxIrq); |
Tomo073 | 0:2c0d50143d85 | 60 | } |
Tomo073 | 0:2c0d50143d85 | 61 | |
Tomo073 | 0:2c0d50143d85 | 62 | void GPS::GetDefault(){ |
Tomo073 | 0:2c0d50143d85 | 63 | datadefault = serial.getc(); |
Tomo073 | 0:2c0d50143d85 | 64 | } |
Tomo073 | 0:2c0d50143d85 | 65 | |
Tomo073 | 2:578f518a6a05 | 66 | void GPS::GetData(){ |
Tomo073 | 0:2c0d50143d85 | 67 | |
Tomo073 | 0:2c0d50143d85 | 68 | Initialization(); |
Tomo073 | 0:2c0d50143d85 | 69 | |
Tomo073 | 0:2c0d50143d85 | 70 | datadefault = serial.getc(); |
Tomo073 | 0:2c0d50143d85 | 71 | |
Tomo073 | 0:2c0d50143d85 | 72 | if(datadefault == '$'){ |
Tomo073 | 0:2c0d50143d85 | 73 | |
Tomo073 | 2:578f518a6a05 | 74 | char DATA[20] = "\0"; |
Tomo073 | 2:578f518a6a05 | 75 | |
Tomo073 | 0:2c0d50143d85 | 76 | Initialization(); |
Tomo073 | 0:2c0d50143d85 | 77 | getstring(DATA); |
Tomo073 | 0:2c0d50143d85 | 78 | |
Tomo073 | 0:2c0d50143d85 | 79 | if(!strcmp(DATA, "GPGGA")){ |
Tomo073 | 2:578f518a6a05 | 80 | |
Tomo073 | 2:578f518a6a05 | 81 | int info; |
Tomo073 | 2:578f518a6a05 | 82 | |
Tomo073 | 2:578f518a6a05 | 83 | for(info=1;info<11;info++){ |
Tomo073 | 2:578f518a6a05 | 84 | |
Tomo073 | 0:2c0d50143d85 | 85 | getstring(DATA); |
Tomo073 | 2:578f518a6a05 | 86 | |
Tomo073 | 1:2f131675f872 | 87 | switch(info){ |
Tomo073 | 0:2c0d50143d85 | 88 | case 1: |
Tomo073 | 0:2c0d50143d85 | 89 | time = strtof(DATA, NULL) + 90000.0; |
Tomo073 | 0:2c0d50143d85 | 90 | break; |
Tomo073 | 0:2c0d50143d85 | 91 | case 2: |
Tomo073 | 0:2c0d50143d85 | 92 | fMinutes = modff(strtof(DATA, NULL), &latitude)*60.0; |
Tomo073 | 0:2c0d50143d85 | 93 | latitude = latitude*100.0 + fMinutes; |
Tomo073 | 0:2c0d50143d85 | 94 | break; |
Tomo073 | 0:2c0d50143d85 | 95 | case 3: |
Tomo073 | 0:2c0d50143d85 | 96 | if(!strcmp(DATA, "S")){ |
Tomo073 | 0:2c0d50143d85 | 97 | latitude = latitude*-1.0; |
Tomo073 | 0:2c0d50143d85 | 98 | } |
Tomo073 | 0:2c0d50143d85 | 99 | break; |
Tomo073 | 2:578f518a6a05 | 100 | case 4: |
Tomo073 | 0:2c0d50143d85 | 101 | fMinutes = modff(strtof(DATA, NULL), &longtitude)*60.0; |
Tomo073 | 0:2c0d50143d85 | 102 | longtitude = longtitude*100.0 + fMinutes; |
Tomo073 | 0:2c0d50143d85 | 103 | break; |
Tomo073 | 0:2c0d50143d85 | 104 | case 5: |
Tomo073 | 0:2c0d50143d85 | 105 | if(!strcmp(DATA, "W")){ |
Tomo073 | 0:2c0d50143d85 | 106 | longtitude = longtitude*-1.0; |
Tomo073 | 0:2c0d50143d85 | 107 | } |
Tomo073 | 0:2c0d50143d85 | 108 | break; |
Tomo073 | 0:2c0d50143d85 | 109 | case 9: |
Tomo073 | 0:2c0d50143d85 | 110 | altitude = strtof(DATA, NULL); |
Tomo073 | 0:2c0d50143d85 | 111 | break; |
Tomo073 | 0:2c0d50143d85 | 112 | case 10: |
Tomo073 | 0:2c0d50143d85 | 113 | if(strcmp(DATA, "M")){ |
Tomo073 | 0:2c0d50143d85 | 114 | altitude = altitude*-1.0; |
Tomo073 | 0:2c0d50143d85 | 115 | } |
Tomo073 | 0:2c0d50143d85 | 116 | readable = true; |
Tomo073 | 0:2c0d50143d85 | 117 | break; |
Tomo073 | 0:2c0d50143d85 | 118 | } |
Tomo073 | 2:578f518a6a05 | 119 | |
Tomo073 | 0:2c0d50143d85 | 120 | } |
Tomo073 | 0:2c0d50143d85 | 121 | } |
Tomo073 | 0:2c0d50143d85 | 122 | } |
Tomo073 | 0:2c0d50143d85 | 123 | } |
Tomo073 | 0:2c0d50143d85 | 124 | |
Tomo073 | 2:578f518a6a05 | 125 | /*void GPS::ExtractionData_FULL(){ |
Tomo073 | 2:578f518a6a05 | 126 | |
Tomo073 | 0:2c0d50143d85 | 127 | Initialization(); |
Tomo073 | 1:2f131675f872 | 128 | |
Tomo073 | 0:2c0d50143d85 | 129 | datadefault = serial.getc(); |
Tomo073 | 0:2c0d50143d85 | 130 | |
Tomo073 | 2:578f518a6a05 | 131 | if(datadefault == '$'){ |
Tomo073 | 1:2f131675f872 | 132 | |
Tomo073 | 2:578f518a6a05 | 133 | char DATA[20] = "\0"; |
Tomo073 | 0:2c0d50143d85 | 134 | Initialization(); |
Tomo073 | 0:2c0d50143d85 | 135 | getstring(DATA); |
Tomo073 | 0:2c0d50143d85 | 136 | |
Tomo073 | 2:578f518a6a05 | 137 | if(!strcmp(DATA, "GPGGA")){ |
Tomo073 | 2:578f518a6a05 | 138 | int info; |
Tomo073 | 2:578f518a6a05 | 139 | for(info=1;info<11;info++){ |
Tomo073 | 2:578f518a6a05 | 140 | getstring(DATA); |
Tomo073 | 2:578f518a6a05 | 141 | switch(info){ |
Tomo073 | 2:578f518a6a05 | 142 | case 1: |
Tomo073 | 0:2c0d50143d85 | 143 | Seconds = modff((strtof(DATA, NULL) + 90000.0)/100.0, &fHours)*100; |
Tomo073 | 0:2c0d50143d85 | 144 | fMinutes = modff(fHours/100.0, &fHours)*100; |
Tomo073 | 0:2c0d50143d85 | 145 | Hours = fHours; |
Tomo073 | 0:2c0d50143d85 | 146 | Minutes = fMinutes; |
Tomo073 | 0:2c0d50143d85 | 147 | sprintf(timeFULL, "%d:%d:%f", Hours, Minutes, Seconds); |
Tomo073 | 0:2c0d50143d85 | 148 | break; |
Tomo073 | 0:2c0d50143d85 | 149 | case 2: |
Tomo073 | 0:2c0d50143d85 | 150 | fMinutes = modff(strtof(DATA, NULL)/100.0, &fDegrees)*100.0; |
Tomo073 | 0:2c0d50143d85 | 151 | Seconds = modff(strtof(DATA, NULL), &fMinutes)*60.0; |
Tomo073 | 0:2c0d50143d85 | 152 | Degrees = fDegrees; |
Tomo073 | 0:2c0d50143d85 | 153 | Minutes = fMinutes; |
Tomo073 | 0:2c0d50143d85 | 154 | sprintf(latitudeFULL, "%d°%d\'%f\"", Degrees, Minutes, Seconds); |
Tomo073 | 0:2c0d50143d85 | 155 | break; |
Tomo073 | 0:2c0d50143d85 | 156 | case 3: |
Tomo073 | 0:2c0d50143d85 | 157 | sprintf(latitudeFULL, "%s%s", latitudeFULL, DATA); |
Tomo073 | 0:2c0d50143d85 | 158 | break; |
Tomo073 | 0:2c0d50143d85 | 159 | case 4: |
Tomo073 | 0:2c0d50143d85 | 160 | fMinutes = modff(strtof(DATA, NULL)/100.0, &fDegrees)*100.0; |
Tomo073 | 0:2c0d50143d85 | 161 | Seconds = modff(strtof(DATA, NULL), &fMinutes)*60.0; |
Tomo073 | 0:2c0d50143d85 | 162 | Degrees = fDegrees; |
Tomo073 | 0:2c0d50143d85 | 163 | Minutes = fMinutes; |
Tomo073 | 0:2c0d50143d85 | 164 | sprintf(longtitudeFULL, "%d°%d\'%f\"", Degrees, Minutes, Seconds); |
Tomo073 | 0:2c0d50143d85 | 165 | break; |
Tomo073 | 0:2c0d50143d85 | 166 | case 5: |
Tomo073 | 0:2c0d50143d85 | 167 | sprintf(longtitudeFULL, "%s%s", longtitudeFULL, DATA); |
Tomo073 | 0:2c0d50143d85 | 168 | break; |
Tomo073 | 0:2c0d50143d85 | 169 | case 9: |
Tomo073 | 0:2c0d50143d85 | 170 | strcpy(altitudeFULL, DATA); |
Tomo073 | 0:2c0d50143d85 | 171 | break; |
Tomo073 | 0:2c0d50143d85 | 172 | case 10: |
Tomo073 | 0:2c0d50143d85 | 173 | sprintf(altitudeFULL, "%s%s", altitudeFULL, DATA); |
Tomo073 | 0:2c0d50143d85 | 174 | reasonable = false; |
Tomo073 | 0:2c0d50143d85 | 175 | readable = true; |
Tomo073 | 0:2c0d50143d85 | 176 | break; |
Tomo073 | 2:578f518a6a05 | 177 | } |
Tomo073 | 2:578f518a6a05 | 178 | } |
Tomo073 | 2:578f518a6a05 | 179 | } |
Tomo073 | 2:578f518a6a05 | 180 | } |
Tomo073 | 2:578f518a6a05 | 181 | }*/ |
Tomo073 | 0:2c0d50143d85 | 182 | |
Tomo073 | 0:2c0d50143d85 | 183 | void GPS::getstring(char a[]){ |
Tomo073 | 0:2c0d50143d85 | 184 | int n; |
Tomo073 | 0:2c0d50143d85 | 185 | for(n = 0;;n++){ |
Tomo073 | 0:2c0d50143d85 | 186 | char ch = serial.getc(); |
Tomo073 | 0:2c0d50143d85 | 187 | if(ch == ',' ||ch == '\n'){ |
Tomo073 | 0:2c0d50143d85 | 188 | a[n] = '\0'; |
Tomo073 | 0:2c0d50143d85 | 189 | break; |
Tomo073 | 0:2c0d50143d85 | 190 | } |
Tomo073 | 0:2c0d50143d85 | 191 | a[n] = ch; |
Tomo073 | 0:2c0d50143d85 | 192 | } |
Tomo073 | 0:2c0d50143d85 | 193 | } |
Tomo073 | 0:2c0d50143d85 | 194 | |
Tomo073 | 0:2c0d50143d85 | 195 | void GPS::Initialization(){ |
Tomo073 | 0:2c0d50143d85 | 196 | readable = false; |
Tomo073 | 2:578f518a6a05 | 197 | /*Degrees = -1; |
Tomo073 | 0:2c0d50143d85 | 198 | Minutes = -1; |
Tomo073 | 2:578f518a6a05 | 199 | Hours = -1;*/ |
Tomo073 | 0:2c0d50143d85 | 200 | longtitude = -1.0; |
Tomo073 | 0:2c0d50143d85 | 201 | latitude = -1.0; |
Tomo073 | 0:2c0d50143d85 | 202 | altitude = -1.0; |
Tomo073 | 0:2c0d50143d85 | 203 | time = -1.0; |
Tomo073 | 2:578f518a6a05 | 204 | //fDegrees = -1.0; |
Tomo073 | 0:2c0d50143d85 | 205 | fMinutes = -1.0; |
Tomo073 | 2:578f518a6a05 | 206 | //Seconds = -1.0; |
Tomo073 | 2:578f518a6a05 | 207 | //fHours = -1.0; |
Tomo073 | 2:578f518a6a05 | 208 | /*longtitudeFULL = "\0"; |
Tomo073 | 0:2c0d50143d85 | 209 | latitudeFULL = "\0"; |
Tomo073 | 0:2c0d50143d85 | 210 | timeFULL = "\0"; |
Tomo073 | 2:578f518a6a05 | 211 | altitudeFULL = "\0";*/ |
Tomo073 | 1:2f131675f872 | 212 | } |
Tomo073 | 2:578f518a6a05 | 213 |