Exemplo n.º 1
0
uint32_t GPS_coord_to_degrees(char* s) {
  char *p, *q;
  uint8_t deg = 0, min = 0;
  unsigned int frac_min = 0;
  uint8_t i;

  // scan for decimal point or end of field
  for (p = s; isdigit(*p); p++) ;
  q = s;

  // convert degrees
  while ((p - q) > 2) {
    if (deg)
      deg *= 10;
    deg += DIGIT_TO_VAL(*q++);
  }
  // convert minutes
  while (p > q) {
    if (min)
      min *= 10;
    min += DIGIT_TO_VAL(*q++);
  }
  // convert fractional minutes
  // expect up to four digits, result is in
  // ten-thousandths of a minute
  if (*p == '.') {
    q = p + 1;
    for (i = 0; i < 4; i++) {
      frac_min *= 10;
      if (isdigit(*q))
        frac_min += *q++ - '0';
    }
  }
  return deg * 10000000UL + (min * 1000000UL + frac_min*100UL) / 6;
}
Exemplo n.º 2
0
u32 GPS_Coord_to_Degrees(char *s)
{
	char *p,*q;
	u8 deg = 0,min = 0;
	u32 frac_min = 0;
	int i;
	for(p=s;isdigit(*p);p++);	//让p指向?ddmm.mmmmm字符串的点
	q = s;
	while((p - q) > 2)			//将度(即那个dd喽)提取出来,保存在deg
	{
		if(deg)
			deg*=10;
		deg += DIGIT_TO_VAL(*q++);
	}
	while(p > q)				//将那个点前面的分提取出来,即分的整数部分
	{
		if(min)
			min*=10;
		min += DIGIT_TO_VAL(*q++);
	}
	if(*p == '.')				//将分小数部分提取出来
	{
		q = p + 1;
		for(i = 0;i < 4; i++)
		{
			frac_min *= 10;
			if(isdigit(*q))
				frac_min += *q++ - '0';
		}
	}
	//ddmmmmmmm
	return deg * 10000000UL + (min * 1000000UL + frac_min * 100UL) / 6;//10000000表示1度,这样分辨率刚好是1cm,虽然这是不精确的
}
Exemplo n.º 3
0
static uint32_t GPS_coord_to_degrees(char* s)
{
    char *p, *q;
    uint32_t deg = 0, min = 0, frac_min = 0, i;
    for (p = s; isdigit((unsigned char)*p); p++);                                   // scan for decimal point or end of field
    q = s;
    while ((p - q) > 2)                                                             // convert degrees
    {
        if (deg) deg *= 10;
        deg += DIGIT_TO_VAL(*q++);
    }
    while (p > q)                                                                   // convert minutes
    {
        if (min) min *= 10;
        min += DIGIT_TO_VAL(*q++);
    }
    if (*p == '.')                                                                  // convert fractional minutes expect up to four digits, result is in ten-thousandths of a minute
    {
        q = p + 1;
        for (i = 0; i < 4; i++)
        {
            frac_min *= 10;
            if (isdigit((unsigned char)*q)) frac_min += DIGIT_TO_VAL(*q++);
        }
    }
    return deg * 10000000UL + (min * 1000000UL + frac_min * 100UL) / 6;
}
Exemplo n.º 4
0
uint32_t AP_GPS_NMEA::_parse_degrees()
{
    char *p, *q;
    uint8_t deg = 0, min = 0;
    unsigned int frac_min = 0;
	int32_t ret = 0;

    // scan for decimal point or end of field
    for (p = _term; isdigit(*p); p++)
        ;
    q = _term;

    // convert degrees
    while ((p - q) > 2) {
        if (deg)
            deg *= 10;
        deg += DIGIT_TO_VAL(*q++);
    }

    // convert minutes
    while (p > q) {
        if (min)
            min *= 10;
        min += DIGIT_TO_VAL(*q++);
    }

    // convert fractional minutes
    // expect up to four digits, result is in
    // ten-thousandths of a minute
    if (*p == '.') {
        q = p + 1;
        for (int i = 0; i < 5; i++) {
            frac_min = (int32_t)(frac_min * 10);
            if (isdigit(*q))
                frac_min += *q++ - '0';
        }
    }
	ret = (int32_t)deg * (int32_t)1000000UL + (int32_t)((min * 100000UL + frac_min) / 6UL);
    return ret;
}
Exemplo n.º 5
0
uint32_t GPS_coord_to_degrees(const char* coordinateString)
{
    const char *fieldSeparator, *remainingString;
    uint8_t degress = 0, minutes = 0;
    uint16_t fractionalMinutes = 0;
    uint8_t digitIndex;

    // scan for decimal point or end of field
    for (fieldSeparator = coordinateString; isdigit((unsigned char)*fieldSeparator); fieldSeparator++) {
        if (fieldSeparator >= coordinateString + 15)
            return 0; // stop potential fail
    }
    remainingString = coordinateString;

    // convert degrees
    while ((fieldSeparator - remainingString) > 2) {
        if (degress)
            degress *= 10;
        degress += DIGIT_TO_VAL(*remainingString++);
    }
    // convert minutes
    while (fieldSeparator > remainingString) {
        if (minutes)
            minutes *= 10;
        minutes += DIGIT_TO_VAL(*remainingString++);
    }
    // convert fractional minutes
    // expect up to four digits, result is in
    // ten-thousandths of a minute
    if (*fieldSeparator == '.') {
        remainingString = fieldSeparator + 1;
        for (digitIndex = 0; digitIndex < 4; digitIndex++) {
            fractionalMinutes *= 10;
            if (isdigit((unsigned char)*remainingString))
                fractionalMinutes += *remainingString++ - '0';
        }
    }
    return degress * 10000000UL + (minutes * 1000000UL + fractionalMinutes * 100UL) / 6;
}