unsigned long Gps::parse_decimal() { char *p = _term; bool isneg = *p == '-'; if (isneg) { ++p; // skip heading '-' } unsigned long ret = 100UL * gpsatol(p); // gpsatol = generalPtrStrToLong => convert int-part to long: 90.239 => 100*90 while (gpsisdigit(*p)) { ++p; // skip converted digits '.' } if (*p == '.') { if (gpsisdigit(p[1])) // any number behind '.' ? { ret += 10 * (p[1] - '0'); // add first decimal if (gpsisdigit(p[2])) ret += p[2] - '0'; // add second decimal - note all meter values are converted to cm with the precision of 2 digits } } return isneg ? -ret : ret; // negate result if isneg is set }
unsigned long Gps::ParseDegrees() { char *p; unsigned long left_of_decimal = gpsatol(_term); unsigned long hundred1000ths_of_minute = (left_of_decimal % 100UL) * 100000UL; for (p=_term; gpsisdigit(*p); ++p); if (*p == '.') { unsigned long mult = 10000; while (gpsisdigit(*++p)) { hundred1000ths_of_minute += mult * (*p - '0'); mult /= 10; } } return (left_of_decimal / 100) * 1000000 + (hundred1000ths_of_minute + 3) / 6; }
long TinyGPS::gpsatol(const char *str) { long ret = 0; while (gpsisdigit(*str)) ret = 10 * ret + *str++ - '0'; return ret; }
long ParserNMEA::gpsatol(const char *str) { long ret = 0; while (gpsisdigit(*str)) ret = 10 * ret + *str++ - '0'; return ret; }
long GPS::gpsatol(const char *str) // convert string to long - does only work for unsigned ints! { long ret = 0; while (gpsisdigit(*str)) // process only digits ret = 10 * ret + *str++ - '0'; // inc str after assignment return ret; }
long gpsatol(const unsigned char *str) { long ret = 0; while (gpsisdigit(*str)) ret = 10 * ret + *str++ - '0'; return ret; }
unsigned long TinyGPS::parse_degrees() { char *p; unsigned long left = gpsatol(_term); unsigned long tenk_minutes = (left % 100UL) * 10000UL; for (p=_term; gpsisdigit(*p); ++p); if (*p == '.') { unsigned long mult = 1000; while (gpsisdigit(*++p)) { tenk_minutes += mult * (*p - '0'); mult /= 10; } } return (left / 100) * 100000 + tenk_minutes / 6; }
unsigned long GPS::parse_degrees() // term=5000.0095 (50° 00' 0.0095*60'') { // (D)DDMM.MMMM is the format char *p; unsigned long left = gpsatol(_term); // get (D)DDMM in left unsigned long tenk_minutes = (left % 100UL) * 10000UL; // get MM*10000 for (p=_term; gpsisdigit(*p); ++p); // advance to '.' if (*p == '.') { unsigned long mult = 1000; while (gpsisdigit(*++p)) { tenk_minutes += mult * (*p - '0'); mult /= 10; } } return (left / 100) * 100000 + tenk_minutes / 6; // DDD * 100000 + tenk_minutes/6=°*10*10000 }
unsigned long Gps::ParseDecimal() { char *p = _term; bool isneg = *p == '-'; if (isneg) ++p; unsigned long ret = 100UL * gpsatol(p); while (gpsisdigit(*p)) ++p; if (*p == '.') { if (gpsisdigit(p[1])) { ret += 10 * (p[1] - '0'); if (gpsisdigit(p[2])) ret += p[2] - '0'; } } return isneg ? -ret : ret; }