Nikola Milenic / GPSM
Committer:
milenicnikola
Date:
Tue Dec 04 16:19:41 2018 +0000
Revision:
2:32c97cf5c676
Parent:
1:5e73e764616c
Child:
3:467dee159d16
Optimized GPS code, increased refresh rate to 5Hz

Who changed what in which revision?

UserRevisionLine numberNew contents of line
milenicnikola 1:5e73e764616c 1 #include "GPSM.h"
milenicnikola 2:32c97cf5c676 2 int GPSM::lock = 0;
milenicnikola 2:32c97cf5c676 3 int GPSM::date = 0;
milenicnikola 2:32c97cf5c676 4 int GPSM::msg_ind = -1;
milenicnikola 2:32c97cf5c676 5 float GPSM::dec_latitude = 0.0;
milenicnikola 2:32c97cf5c676 6 float GPSM::dec_longitude = 0.0;
milenicnikola 2:32c97cf5c676 7 float GPSM::nmea_latitude = 0.0;
milenicnikola 2:32c97cf5c676 8 float GPSM::nmea_longitude = 0.0;
milenicnikola 2:32c97cf5c676 9 float GPSM::speed_km = 0.0;
milenicnikola 2:32c97cf5c676 10 float GPSM::course_d = 0.0;
milenicnikola 2:32c97cf5c676 11 float GPSM::utc_time = 0.0;
milenicnikola 2:32c97cf5c676 12 char GPSM::msg[128] = {};
milenicnikola 2:32c97cf5c676 13 char GPSM::bfr[1030] = {};
milenicnikola 2:32c97cf5c676 14 char GPSM::rmc_status = 'V';
milenicnikola 2:32c97cf5c676 15 char GPSM::ns = ' ';
milenicnikola 2:32c97cf5c676 16 char GPSM::ew = ' ';
milenicnikola 2:32c97cf5c676 17 Serial* GPSM::_gps = 0;
milenicnikola 2:32c97cf5c676 18 bool GPSM::ready = false;
milenicnikola 1:5e73e764616c 19 #ifdef OPEN_LOG
milenicnikola 2:32c97cf5c676 20 bool GPSM::is_logging = false;
milenicnikola 2:32c97cf5c676 21 Logger* _openLog = 0;
milenicnikola 1:5e73e764616c 22 #endif
milenicnikola 2:32c97cf5c676 23 void GPSM::GPSM_Init(PinName tx, PinName rx)
milenicnikola 2:32c97cf5c676 24 {
milenicnikola 2:32c97cf5c676 25
milenicnikola 2:32c97cf5c676 26 _gps=new Serial(tx, rx, 9600);
milenicnikola 2:32c97cf5c676 27
milenicnikola 1:5e73e764616c 28 nmea_longitude = 0.0;
milenicnikola 1:5e73e764616c 29 nmea_latitude = 0.0;
milenicnikola 1:5e73e764616c 30 utc_time = 0;
milenicnikola 1:5e73e764616c 31 ns = ' ';
milenicnikola 1:5e73e764616c 32 ew = ' ';
milenicnikola 1:5e73e764616c 33 lock = 0;
milenicnikola 2:32c97cf5c676 34
milenicnikola 1:5e73e764616c 35 rmc_status = 'V';
milenicnikola 1:5e73e764616c 36 speed_km = 0.0;
milenicnikola 1:5e73e764616c 37 course_d = 0.0;
milenicnikola 1:5e73e764616c 38 date = 0;
milenicnikola 1:5e73e764616c 39
milenicnikola 1:5e73e764616c 40 dec_longitude = 0.0;
milenicnikola 1:5e73e764616c 41 dec_latitude = 0.0;
milenicnikola 1:5e73e764616c 42 #ifdef OPEN_LOG
milenicnikola 1:5e73e764616c 43 is_logging = false;
milenicnikola 1:5e73e764616c 44 _openLog=new Logger()
milenicnikola 1:5e73e764616c 45 #endif
milenicnikola 1:5e73e764616c 46 init_GPS();
milenicnikola 1:5e73e764616c 47 wait(1.0);
milenicnikola 2:32c97cf5c676 48 _gps->attach(callback(GPSM::rx_interrupt));
milenicnikola 1:5e73e764616c 49 }
milenicnikola 2:32c97cf5c676 50 void GPSM::rx_interrupt()
milenicnikola 2:32c97cf5c676 51 {
milenicnikola 2:32c97cf5c676 52 if(msg_ind < 0) {
milenicnikola 2:32c97cf5c676 53 if(_gps->getc() == '$') msg_ind = 0;
milenicnikola 1:5e73e764616c 54 return;
milenicnikola 1:5e73e764616c 55 }
milenicnikola 2:32c97cf5c676 56 msg[msg_ind] = _gps->getc();
milenicnikola 2:32c97cf5c676 57 if (msg[msg_ind] == '\r' || msg_ind==90) {
milenicnikola 2:32c97cf5c676 58 msg[msg_ind] = 0;
milenicnikola 2:32c97cf5c676 59 if (sscanf(msg, "GPRMC,%f,%c,%f,%c,%f,%c,%f,%f,%d", &utc_time, &rmc_status, &nmea_latitude, &ns, &nmea_longitude, &ew, &speed_km, &course_d, &date) >= 2) {
milenicnikola 2:32c97cf5c676 60 if(rmc_status == 'V') lock=0;
milenicnikola 2:32c97cf5c676 61 if(rmc_status == 'A') lock=1;
milenicnikola 2:32c97cf5c676 62 speed_km*=1.852;
milenicnikola 2:32c97cf5c676 63 dec_latitude = nmea_to_dec(nmea_latitude, ns);
milenicnikola 2:32c97cf5c676 64 dec_longitude = nmea_to_dec(nmea_longitude, ew);
milenicnikola 2:32c97cf5c676 65 ready=true;
milenicnikola 2:32c97cf5c676 66 }
milenicnikola 2:32c97cf5c676 67 msg_ind=-1;
milenicnikola 1:5e73e764616c 68 return;
milenicnikola 1:5e73e764616c 69 }
milenicnikola 2:32c97cf5c676 70 msg_ind++;
milenicnikola 1:5e73e764616c 71 }
milenicnikola 1:5e73e764616c 72
milenicnikola 2:32c97cf5c676 73 void GPSM::init_GPS()
milenicnikola 2:32c97cf5c676 74 {
milenicnikola 2:32c97cf5c676 75 //GGA OFF
milenicnikola 2:32c97cf5c676 76 _gps->putc(0xB5);
milenicnikola 2:32c97cf5c676 77 _gps->putc(0x62);
milenicnikola 2:32c97cf5c676 78 _gps->putc(0x06);
milenicnikola 2:32c97cf5c676 79 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 80 _gps->putc(0x08);
milenicnikola 2:32c97cf5c676 81 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 82 _gps->putc(0xF0);
milenicnikola 2:32c97cf5c676 83 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 84 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 85 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 86 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 87 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 88 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 89 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 90 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 91 _gps->putc(0x24);
milenicnikola 2:32c97cf5c676 92 //GLL OFF
milenicnikola 2:32c97cf5c676 93 _gps->putc(0xB5);
milenicnikola 2:32c97cf5c676 94 _gps->putc(0x62);
milenicnikola 2:32c97cf5c676 95 _gps->putc(0x06);
milenicnikola 2:32c97cf5c676 96 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 97 _gps->putc(0x08);
milenicnikola 2:32c97cf5c676 98 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 99 _gps->putc(0xF0);
milenicnikola 2:32c97cf5c676 100 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 101 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 102 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 103 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 104 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 105 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 106 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 107 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 108 _gps->putc(0x2B);
milenicnikola 2:32c97cf5c676 109 //GSA OFF
milenicnikola 2:32c97cf5c676 110 _gps->putc(0xB5);
milenicnikola 2:32c97cf5c676 111 _gps->putc(0x62);
milenicnikola 2:32c97cf5c676 112 _gps->putc(0x06);
milenicnikola 2:32c97cf5c676 113 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 114 _gps->putc(0x08);
milenicnikola 2:32c97cf5c676 115 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 116 _gps->putc(0xF0);
milenicnikola 2:32c97cf5c676 117 _gps->putc(0x02);
milenicnikola 2:32c97cf5c676 118 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 119 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 120 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 121 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 122 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 123 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 124 _gps->putc(0x02);
milenicnikola 2:32c97cf5c676 125 _gps->putc(0x32);
milenicnikola 2:32c97cf5c676 126 //GSV OFF
milenicnikola 2:32c97cf5c676 127 _gps->putc(0xB5);
milenicnikola 2:32c97cf5c676 128 _gps->putc(0x62);
milenicnikola 2:32c97cf5c676 129 _gps->putc(0x06);
milenicnikola 2:32c97cf5c676 130 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 131 _gps->putc(0x08);
milenicnikola 2:32c97cf5c676 132 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 133 _gps->putc(0xF0);
milenicnikola 2:32c97cf5c676 134 _gps->putc(0x03);
milenicnikola 2:32c97cf5c676 135 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 136 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 137 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 138 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 139 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 140 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 141 _gps->putc(0x03);
milenicnikola 2:32c97cf5c676 142 _gps->putc(0x39);
milenicnikola 2:32c97cf5c676 143 //VTG OFF
milenicnikola 2:32c97cf5c676 144 _gps->putc(0xB5);
milenicnikola 2:32c97cf5c676 145 _gps->putc(0x62);
milenicnikola 2:32c97cf5c676 146 _gps->putc(0x06);
milenicnikola 2:32c97cf5c676 147 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 148 _gps->putc(0x08);
milenicnikola 2:32c97cf5c676 149 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 150 _gps->putc(0xF0);
milenicnikola 2:32c97cf5c676 151 _gps->putc(0x05);
milenicnikola 2:32c97cf5c676 152 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 153 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 154 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 155 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 156 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 157 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 158 _gps->putc(0x05);
milenicnikola 2:32c97cf5c676 159 _gps->putc(0x47);
milenicnikola 2:32c97cf5c676 160 //RATE 5Hz
milenicnikola 2:32c97cf5c676 161 _gps->putc(0xB5);
milenicnikola 2:32c97cf5c676 162 _gps->putc(0x62);
milenicnikola 2:32c97cf5c676 163 _gps->putc(0x06);
milenicnikola 2:32c97cf5c676 164 _gps->putc(0x08);
milenicnikola 2:32c97cf5c676 165 _gps->putc(0x06);
milenicnikola 2:32c97cf5c676 166 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 167 _gps->putc(0xC8);
milenicnikola 2:32c97cf5c676 168 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 169 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 170 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 171 _gps->putc(0x01);
milenicnikola 2:32c97cf5c676 172 _gps->putc(0x00);
milenicnikola 2:32c97cf5c676 173 _gps->putc(0xDE);
milenicnikola 2:32c97cf5c676 174 _gps->putc(0x6A);
milenicnikola 1:5e73e764616c 175 }
milenicnikola 1:5e73e764616c 176
milenicnikola 1:5e73e764616c 177 #ifdef OPEN_LOG
milenicnikola 2:32c97cf5c676 178 void GPSM::start_log()
milenicnikola 2:32c97cf5c676 179 {
milenicnikola 1:5e73e764616c 180 is_logging = true;
milenicnikola 1:5e73e764616c 181 }
milenicnikola 1:5e73e764616c 182
milenicnikola 2:32c97cf5c676 183 void GPSM::new_file(void)
milenicnikola 2:32c97cf5c676 184 {
milenicnikola 1:5e73e764616c 185 _openLog->newFile();
milenicnikola 1:5e73e764616c 186 }
milenicnikola 1:5e73e764616c 187
milenicnikola 2:32c97cf5c676 188 void GPSM::stop_log(void)
milenicnikola 2:32c97cf5c676 189 {
milenicnikola 1:5e73e764616c 190 is_logging = false;
milenicnikola 1:5e73e764616c 191 }
milenicnikola 1:5e73e764616c 192 #endif
milenicnikola 1:5e73e764616c 193
milenicnikola 2:32c97cf5c676 194 float GPSM::nmea_to_dec(float deg_coord, char nsew)
milenicnikola 2:32c97cf5c676 195 {
milenicnikola 1:5e73e764616c 196 int degree = (int)(deg_coord/100);
milenicnikola 1:5e73e764616c 197 float minutes = deg_coord - degree*100;
milenicnikola 1:5e73e764616c 198 float dec_deg = minutes / 60;
milenicnikola 1:5e73e764616c 199 float decimal = degree + dec_deg;
milenicnikola 1:5e73e764616c 200 if (nsew == 'S' || nsew == 'W') { // return negative
milenicnikola 1:5e73e764616c 201 decimal *= -1;
milenicnikola 1:5e73e764616c 202 }
milenicnikola 1:5e73e764616c 203 return decimal;
milenicnikola 1:5e73e764616c 204 }
milenicnikola 1:5e73e764616c 205
milenicnikola 2:32c97cf5c676 206 int GPSM::poll()
milenicnikola 2:32c97cf5c676 207 {
milenicnikola 2:32c97cf5c676 208 if (!ready) return NOT_READY;
milenicnikola 1:5e73e764616c 209 #ifdef OPEN_LOG
milenicnikola 2:32c97cf5c676 210 if (is_logging && lock) {
milenicnikola 2:32c97cf5c676 211 format_for_log();
milenicnikola 2:32c97cf5c676 212 _openLog->write(bfr);
milenicnikola 2:32c97cf5c676 213 }
milenicnikola 1:5e73e764616c 214 #endif
milenicnikola 2:32c97cf5c676 215 ready=false;
milenicnikola 2:32c97cf5c676 216 if (lock) return GOOD;
milenicnikola 2:32c97cf5c676 217 else return NO_LOCK;
milenicnikola 1:5e73e764616c 218 }
milenicnikola 1:5e73e764616c 219
milenicnikola 1:5e73e764616c 220
milenicnikola 1:5e73e764616c 221 // INTERNAL FUNCTINS ////////////////////////////////////////////////////////////
milenicnikola 2:32c97cf5c676 222 float GPSM::trunc(float v)
milenicnikola 2:32c97cf5c676 223 {
milenicnikola 1:5e73e764616c 224 if (v < 0.0) {
milenicnikola 1:5e73e764616c 225 v*= -1.0;
milenicnikola 1:5e73e764616c 226 v = floor(v);
milenicnikola 1:5e73e764616c 227 v*=-1.0;
milenicnikola 1:5e73e764616c 228 } else {
milenicnikola 1:5e73e764616c 229 v = floor(v);
milenicnikola 1:5e73e764616c 230 }
milenicnikola 1:5e73e764616c 231 return v;
milenicnikola 1:5e73e764616c 232 }
milenicnikola 1:5e73e764616c 233
milenicnikola 2:32c97cf5c676 234 void GPSM::format_for_log()
milenicnikola 2:32c97cf5c676 235 {
milenicnikola 1:5e73e764616c 236 bfr[0] = '$';
milenicnikola 1:5e73e764616c 237 for (int i = 0; i < 1022; i++) {
milenicnikola 1:5e73e764616c 238 bfr[i+1] = msg[i];
milenicnikola 1:5e73e764616c 239 if (msg[i] == 0 || msg[i] =='$') {
milenicnikola 1:5e73e764616c 240 bfr[i+1] = '\r';
milenicnikola 1:5e73e764616c 241 bfr[i+2] = '\n';
milenicnikola 1:5e73e764616c 242 bfr[i+3] = 0;
milenicnikola 1:5e73e764616c 243 return;
milenicnikola 1:5e73e764616c 244 }
milenicnikola 1:5e73e764616c 245 }
milenicnikola 1:5e73e764616c 246 error("Overflow in format");
milenicnikola 1:5e73e764616c 247 }
milenicnikola 1:5e73e764616c 248
milenicnikola 1:5e73e764616c 249 // GET FUNCTIONS /////////////////////////////////////////////////////////////////
milenicnikola 2:32c97cf5c676 250 float GPSM::get_nmea_longitude()
milenicnikola 2:32c97cf5c676 251 {
milenicnikola 2:32c97cf5c676 252 return nmea_longitude;
milenicnikola 1:5e73e764616c 253 }
milenicnikola 1:5e73e764616c 254
milenicnikola 2:32c97cf5c676 255 float GPSM::get_dec_longitude()
milenicnikola 2:32c97cf5c676 256 {
milenicnikola 2:32c97cf5c676 257 return dec_longitude;
milenicnikola 1:5e73e764616c 258 }
milenicnikola 1:5e73e764616c 259
milenicnikola 2:32c97cf5c676 260 float GPSM::get_nmea_latitude()
milenicnikola 2:32c97cf5c676 261 {
milenicnikola 2:32c97cf5c676 262 return nmea_latitude;
milenicnikola 1:5e73e764616c 263 }
milenicnikola 1:5e73e764616c 264
milenicnikola 2:32c97cf5c676 265 float GPSM::get_dec_latitude()
milenicnikola 2:32c97cf5c676 266 {
milenicnikola 2:32c97cf5c676 267 return dec_latitude;
milenicnikola 1:5e73e764616c 268 }
milenicnikola 1:5e73e764616c 269
milenicnikola 2:32c97cf5c676 270 float GPSM::get_course_t()
milenicnikola 2:32c97cf5c676 271 {
milenicnikola 2:32c97cf5c676 272 return course_d;
milenicnikola 1:5e73e764616c 273 }
milenicnikola 1:5e73e764616c 274
milenicnikola 2:32c97cf5c676 275 float GPSM::get_speed_km()
milenicnikola 2:32c97cf5c676 276 {
milenicnikola 2:32c97cf5c676 277 return speed_km;
milenicnikola 1:5e73e764616c 278 }