2018/06/18

Dependents:   library

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?

UserRevisionLine numberNew 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