Ejemplo n.º 1
0
static void parse_picture_gps(char *line, struct membuffer *str, void *_pic)
{
	struct picture *pic = _pic;

	pic->latitude = parse_degrees(line, &line);
	pic->longitude = parse_degrees(line, &line);
}
Ejemplo n.º 2
0
static void parse_site_gps(char *line, struct membuffer *str, void *_ds)
{
	struct dive_site *ds = _ds;

	ds->latitude = parse_degrees(line, &line);
	ds->longitude = parse_degrees(line, &line);
}
Ejemplo n.º 3
0
static void parse_dive_gps(char *line, struct membuffer *str, void *_dive)
{
	struct dive *dive = _dive;

	dive->latitude = parse_degrees(line, &line);
	dive->longitude = parse_degrees(line, &line);
}
Ejemplo n.º 4
0
static void parse_dive_gps(char *line, struct membuffer *str, void *_dive)
{
	uint32_t uuid;
	degrees_t latitude = parse_degrees(line, &line);
	degrees_t longitude = parse_degrees(line, &line);
	struct dive *dive = _dive;
	struct dive_site *ds = get_dive_site_for_dive(dive);
	if (!ds) {
		uuid = get_dive_site_uuid_by_gps(latitude, longitude, NULL);
		if (!uuid)
			uuid = create_dive_site_with_gps("", latitude, longitude, dive->when);
		dive->dive_site_uuid = uuid;
	} else {
		if (dive_site_has_gps_location(ds) &&
		    (ds->latitude.udeg != latitude.udeg || ds->longitude.udeg != longitude.udeg)) {
			const char *coords = printGPSCoords(latitude.udeg, longitude.udeg);
			// we have a dive site that already has GPS coordinates
			ds->notes = add_to_string(ds->notes, translate("gettextFromC", "multiple GPS locations for this dive site; also %s\n"), coords);
			free((void *)coords);
		}
		ds->latitude = latitude;
		ds->longitude = longitude;
	}

}
Ejemplo n.º 5
0
static void gps_location(char *buffer, void *_dive)
{
	char *end;
	struct dive *dive = _dive;

	dive->latitude = parse_degrees(buffer, &end);
	dive->longitude = parse_degrees(end, &end);
}
Ejemplo n.º 6
0
// Processes a just-completed term
// Returns true if new sentence has just passed checksum test and is validated
bool TinyGPS::term_complete()
{
  if (_is_checksum_term)
  {
    byte checksum = 16 * from_hex(_term[0]) + from_hex(_term[1]);
    if (checksum == _parity)
    {
      if (_gps_data_good)
      {
#ifndef _GPS_NO_STATS
        ++_good_sentences;
#endif
        _last_time_fix = _new_time_fix;
        _last_position_fix = _new_position_fix;

        switch(_sentence_type)
        {
        case _GPS_SENTENCE_GPRMC:
          _time      = _new_time;
          _date      = _new_date;
          _latitude  = _new_latitude;
          _longitude = _new_longitude;
          _speed     = _new_speed;
          _course    = _new_course;
          _rmc_ready = true;
          break;
        case _GPS_SENTENCE_GPGGA:
          _altitude  = _new_altitude;
          _time      = _new_time;
          _latitude  = _new_latitude;
          _longitude = _new_longitude;
          _gga_ready = true;
          _hdop      = _new_hdop;
          _sat_count = _new_sat_count;
        case _GPS_SENTENCE_GPGSV:
          _gsv_ready = true;
          break;
        }

        return true;
      }
    }

#ifndef _GPS_NO_STATS
    else
      ++_failed_checksum;
#endif
    return false;
  }

  // the first term determines the sentence type
  if (_term_number == 0)
  {
    if (!gpsstrcmp(_term, _GPRMC_TERM))
      _sentence_type = _GPS_SENTENCE_GPRMC;
    else if (!gpsstrcmp(_term, _GPGGA_TERM))
      _sentence_type = _GPS_SENTENCE_GPGGA;
    else if (!gpsstrcmp(_term, _GPGSV_TERM))
      _sentence_type = _GPS_SENTENCE_GPGSV;
    else
      _sentence_type = _GPS_SENTENCE_OTHER;
    return false;
  }

  if (_sentence_type != _GPS_SENTENCE_OTHER && _term[0])
  switch((_sentence_type == _GPS_SENTENCE_GPGGA ? 200 : 100) + _term_number)
  {
    case 101: // Time in both sentences
    case 201:
      _new_time = parse_decimal();
      _new_time_fix = millis();
      break;
    case 102: // GPRMC validity
      _gps_data_good = _term[0] == 'A';
      break;
    case 103: // Latitude
    case 202:
      _new_latitude = parse_degrees();
      _new_position_fix = millis();
      break;
    case 104: // N/S
    case 203:
      if (_term[0] == 'S')
        _new_latitude = -_new_latitude;
      break;
    case 105: // Longitude
    case 204:
      _new_longitude = parse_degrees();
      break;
    case 106: // E/W
    case 205:
      if (_term[0] == 'W')
        _new_longitude = -_new_longitude;
      break;
    case 107: // Speed (GPRMC)
      _new_speed = parse_decimal();
      break;
    case 108: // Course (GPRMC)
      _new_course = parse_decimal();
      break;
    case 109: // Date (GPRMC)
      _new_date = gpsatol(_term);
      break;
    case 206: // Fix data (GPGGA)
      _gps_data_good = _term[0] > '0';
      break;
    case 207: // Number of satelites tracked (GPGGA)
      _new_sat_count = parse_decimal();
      break;
    case 208: // Horizontal Dilution of Position (GPGGA)
      _new_hdop = parse_decimal();
      break;
    case 209: // Altitude (GPGGA)
      _new_altitude = parse_decimal();
      break;
  } /* switch */

  return false;
}
Ejemplo n.º 7
0
// Processes a just-completed term
// Returns true if new sentence has just passed checksum test and is validated
bool TinyGPS::term_complete()
{
  if (_is_checksum_term)
  {
    byte checksum = 16 * from_hex(_term[0]) + from_hex(_term[1]);
    if (checksum == _parity)
    {
      if (_gps_data_good)
      {
#ifndef _GPS_NO_STATS
        ++_good_sentences;
#endif
        _last_time_fix = _new_time_fix;
        _last_position_fix = _new_position_fix;

        switch(_sentence_type)
        {
        case _GPS_SENTENCE_GPRMC:
          _time      = _new_time;
          _date      = _new_date;
          _latitude  = _new_latitude;
          _longitude = _new_longitude;
          _speed     = _new_speed;
          _course    = _new_course;
          break;
        case _GPS_SENTENCE_GPGGA:
          _altitude  = _new_altitude;
          _time      = _new_time;
          _latitude  = _new_latitude;
          _longitude = _new_longitude;
          _numsats   = _new_numsats;
          _hdop      = _new_hdop;
          break;
        }

        return true;
      }
    }

#ifndef _GPS_NO_STATS
    else
      ++_failed_checksum;
#endif
    return false;
  }

  // the first term determines the sentence type
  if (_term_number == 0)
  {
    if (!gpsstrcmp(_term, _GPRMC_TERM))
      _sentence_type = _GPS_SENTENCE_GPRMC;
    else if (!gpsstrcmp(_term, _GPGGA_TERM))
      _sentence_type = _GPS_SENTENCE_GPGGA;
    else
      _sentence_type = _GPS_SENTENCE_OTHER;
    return false;
  }

  if (_sentence_type != _GPS_SENTENCE_OTHER && _term[0])
    switch(COMBINE(_sentence_type, _term_number))
  {
    case COMBINE(_GPS_SENTENCE_GPRMC, 1): // Time in both sentences
    case COMBINE(_GPS_SENTENCE_GPGGA, 1):
      _new_time = parse_decimal();
      _new_time_fix = millis();
      break;
    case COMBINE(_GPS_SENTENCE_GPRMC, 2): // GPRMC validity
      _gps_data_good = _term[0] == 'A';
      break;
    case COMBINE(_GPS_SENTENCE_GPRMC, 3): // Latitude
    case COMBINE(_GPS_SENTENCE_GPGGA, 2):
      _new_latitude = parse_degrees();
      _new_position_fix = millis();
      break;
    case COMBINE(_GPS_SENTENCE_GPRMC, 4): // N/S
    case COMBINE(_GPS_SENTENCE_GPGGA, 3):
      if (_term[0] == 'S')
        _new_latitude = -_new_latitude;
      break;
    case COMBINE(_GPS_SENTENCE_GPRMC, 5): // Longitude
    case COMBINE(_GPS_SENTENCE_GPGGA, 4):
      _new_longitude = parse_degrees();
      break;
    case COMBINE(_GPS_SENTENCE_GPRMC, 6): // E/W
    case COMBINE(_GPS_SENTENCE_GPGGA, 5):
      if (_term[0] == 'W')
        _new_longitude = -_new_longitude;
      break;
    case COMBINE(_GPS_SENTENCE_GPRMC, 7): // Speed (GPRMC)
      _new_speed = parse_decimal();
      break;
    case COMBINE(_GPS_SENTENCE_GPRMC, 8): // Course (GPRMC)
      _new_course = parse_decimal();
      break;
    case COMBINE(_GPS_SENTENCE_GPRMC, 9): // Date (GPRMC)
      _new_date = gpsatol(_term);
      break;
    case COMBINE(_GPS_SENTENCE_GPGGA, 6): // Fix data (GPGGA)
      _gps_data_good = _term[0] > '0';
      break;
    case COMBINE(_GPS_SENTENCE_GPGGA, 7): // Satellites used (GPGGA)
      _new_numsats = (unsigned char)atoi(_term);
      break;
    case COMBINE(_GPS_SENTENCE_GPGGA, 8): // HDOP
      _new_hdop = parse_decimal();
      break;
    case COMBINE(_GPS_SENTENCE_GPGGA, 9): // Altitude (GPGGA)
      _new_altitude = parse_decimal();
      break;
  }

  return false;
}
Ejemplo n.º 8
0
// Processes a just-completed term
// Returns true if new sentence has just passed checksum test and is validated
bool Gps::term_complete()
{
  //Console.println("compl");
  if (_is_checksum_term)
  {
    byte checksum = (byte)(16 * from_hex(_term[0]) + from_hex(_term[1]));
    //Console.print(checksum);
    //Console.print(",");
    //Console.println(_parity);
    if (checksum == _parity)
    {
      //if (1==1)
      if (_gps_data_good)
      {
#ifndef _GPS_NO_STATS
        ++_good_sentences;
#endif
        _last_time_fix = _new_time_fix;
        _last_position_fix = _new_position_fix;

        switch (_sentence_type)
        {
          case _GPS_SENTENCE_GPRMC:
            _time = _new_time;
            _date = _new_date;
            _latitude = _new_latitude;
            _longitude = _new_longitude;
            _speed = _new_speed;
            _course = _new_course;
            break;

          case _GPS_SENTENCE_GPGGA:
            _altitude = _new_altitude;
            _time = _new_time;
            _latitude = _new_latitude;
            _longitude = _new_longitude;
            _numsats = _new_numsats;
            _hdop = _new_hdop;
            break;

          default:
            break;
        }

        return true;
      }
    }

#ifndef _GPS_NO_STATS
    else
    {
      ++_failed_checksum;
    }
#endif
    return false;
  }

  // the first term determines the sentence type
  if (_term_number == 0)
  {
    if (!gpsstrcmp(_term, _GPRMC_TERM))
    {
      _sentence_type = _GPS_SENTENCE_GPRMC;
    }
    else if (!gpsstrcmp(_term, _GPGGA_TERM))
    {
      _sentence_type = _GPS_SENTENCE_GPGGA;
    }
    else
    {
      _sentence_type = _GPS_SENTENCE_OTHER;
    }
    return false;
  }

  if (_sentence_type != _GPS_SENTENCE_OTHER && _term[0])
  {
    switch (COMBINE(_sentence_type, _term_number))
    {
      case COMBINE(_GPS_SENTENCE_GPRMC, 1): // Time in both sentences
      case COMBINE(_GPS_SENTENCE_GPGGA, 1):
        _new_time = parse_decimal();
        _new_time_fix = millis();
        break;

      case COMBINE(_GPS_SENTENCE_GPRMC, 2): // GPRMC validity
        _gps_data_good = _term[0] == 'A';
        break;

      case COMBINE(_GPS_SENTENCE_GPRMC, 3): // Latitude
      case COMBINE(_GPS_SENTENCE_GPGGA, 2):
        _new_latitude = parse_degrees();
        _new_position_fix = millis();
        break;

      case COMBINE(_GPS_SENTENCE_GPRMC, 4): // N/S
      case COMBINE(_GPS_SENTENCE_GPGGA, 3):
        if (_term[0] == 'S')
          _new_latitude = -_new_latitude;
        break;

      case COMBINE(_GPS_SENTENCE_GPRMC, 5): // Longitude
      case COMBINE(_GPS_SENTENCE_GPGGA, 4):
        _new_longitude = parse_degrees();
        break;

      case COMBINE(_GPS_SENTENCE_GPRMC, 6): // E/W
      case COMBINE(_GPS_SENTENCE_GPGGA, 5):
        if (_term[0] == 'W')
          _new_longitude = -_new_longitude;
        break;

      case COMBINE(_GPS_SENTENCE_GPRMC, 7): // Speed (GPRMC)
        _new_speed = parse_decimal();
        break;

      case COMBINE(_GPS_SENTENCE_GPRMC, 8): // Course (GPRMC)
        _new_course = parse_decimal();
        break;

      case COMBINE(_GPS_SENTENCE_GPRMC, 9): // Date (GPRMC)
        _new_date = gpsatol(_term);
        break;

      case COMBINE(_GPS_SENTENCE_GPGGA, 6): // Fix data (GPGGA) ; 0=invalid, 1=GPS fix, 2=DGPS fix, 6=estimation
        _gps_data_good = _term[0] > '0';
        break;

      case COMBINE(_GPS_SENTENCE_GPGGA, 7): // NN-Satellites used (GPGGA): 00-12
        _new_numsats = (unsigned char)atoi(_term);
        break;

      case COMBINE(_GPS_SENTENCE_GPGGA, 8): // D.D - HDOP (GPGGA) - horizontal deviation
        _new_hdop = parse_decimal();
        break;

      case COMBINE(_GPS_SENTENCE_GPGGA, 9): // H.H - Altitude (GPGGA)
        _new_altitude = parse_decimal();
        break;

      default:
        break;
    }
  }
  return false;
}
Ejemplo n.º 9
0
// Processes a just-completed term
// Returns true if new sentence has just passed checksum test and is validated
bool ParserNMEA::term_complete()
{
	if (_is_checksum_term)
	{
		byte checksum = 16 * from_hex(_term[0]) + from_hex(_term[1]);
		if (checksum == _parity)
		{
			if (_gps_data_good)
			{
				#ifndef _GPS_NO_STATS
				++_good_sentences;
				#endif
				_last_time_fix = _new_time_fix;
				_last_position_fix = _new_position_fix;

				switch(_sentence_type)
				{
					case _GPS_SENTENCE_GPRMC:
					_time      = _new_time;
					_latitude  = _new_latitude;
					_longitude = _new_longitude;
					_speed     = _new_speed;
					break;
					case _GPS_SENTENCE_GPVTG:
					_speed     = _new_speed;
					break;
					case _GPS_SENTENCE_GPZDA:
				    _time      = _new_time;
					_day      = _new_day;
					_month    = _new_month;
					_year     = _new_year;
					break;
					case _GPS_SENTENCE_GPGGA:
					_time      = _new_time;
					_latitude  = _new_latitude;
					_longitude = _new_longitude;
					_hdop      = _new_hdop;
					break;
				}

				return true;
			}
		}

		#ifndef _GPS_NO_STATS
		else
		++_failed_checksum;
		#endif
		return false;
	}

	// the first term determines the sentence type
	if (_term_number == 0)
	{
		if (!gpsstrcmp(_term, _GPZDA_TERM))
		_sentence_type = _GPS_SENTENCE_GPZDA;
		else if (!gpsstrcmp(_term, _GPGGA_TERM))
		_sentence_type = _GPS_SENTENCE_GPGGA;
		else if (!gpsstrcmp(_term, _GPVTG_TERM))
		_sentence_type = _GPS_SENTENCE_GPVTG;
		else
		_sentence_type = _GPS_SENTENCE_OTHER;
		return false;
	}

	if (_sentence_type != _GPS_SENTENCE_OTHER && _term[0])
	switch(COMBINE(_sentence_type, _term_number))
	{
		case COMBINE(_GPS_SENTENCE_GPZDA, 1): // Time in ZDA
		_new_time = parse_decimal();
		_new_time_fix = millis();
		break;
		case COMBINE(_GPS_SENTENCE_GPRMC, 2): // GPRMC validity
		_gps_data_good = _term[0] == 'A';
		break;
		case COMBINE(_GPS_SENTENCE_GPRMC, 3): // Latitude
	    _new_latitude = parse_degrees();
		_new_position_fix = millis();
		break;
		case COMBINE(_GPS_SENTENCE_GPGGA, 2):
		_new_latitude = parse_degrees();
		_new_position_fix = millis();
		break;
		case COMBINE(_GPS_SENTENCE_GPRMC, 4): // N/S
		if (_term[0] == 'S')
		_new_latitude = -_new_latitude;
		break;
		case COMBINE(_GPS_SENTENCE_GPGGA, 3):
		if (_term[0] == 'S')
		_new_latitude = -_new_latitude;
		break;
		case COMBINE(_GPS_SENTENCE_GPGGA, 4):
		_new_longitude = parse_degrees();
		break;
		case COMBINE(_GPS_SENTENCE_GPGGA, 5):
		if (_term[0] == 'W')
		_new_longitude = -_new_longitude;
		break;
		case COMBINE(_GPS_SENTENCE_GPVTG, 5): // Speed (GPVTG)
		_new_speed = parse_decimal();
		break;
		case COMBINE(_GPS_SENTENCE_GPRMC, 8): // Course (GPRMC)
		_new_course = parse_decimal();
		break;
		case COMBINE(_GPS_SENTENCE_GPZDA, 2): // Date/day (GPZDA)
		_new_day = (unsigned char)atoi(_term);
		break;
		case COMBINE(_GPS_SENTENCE_GPZDA, 3): // Date/month (GPZDA)
		_new_month = (unsigned char)atoi(_term);
		break;
		case COMBINE(_GPS_SENTENCE_GPZDA, 4): // Date/year (GPZDA)
		 _new_year = parse_decimal() / 100;
		break;
		case COMBINE(_GPS_SENTENCE_GPGGA, 6): // Fix data (GPGGA)
		_gps_data_good = _term[0] > '0';
		break;
		case COMBINE(_GPS_SENTENCE_GPGGA, 8): // HDOP
		_new_hdop = parse_decimal();
		break;
	}

	return false;
}
Ejemplo n.º 10
0
void
update_poi(GtkWidget *dialog)
{

	GtkTextView *text_view;
	GtkTextBuffer *buffer;
	GtkTextIter start, end;
	GtkWidget *entry, *widget; 

	const char *keyword, *idmd5;
	char *desc;
	char *sql;
	char *db;


	double lat_deg, lon_deg;
	int res;


	widget = lookup_widget(dialog, "label126");
	idmd5 = gtk_label_get_text(GTK_LABEL(widget));
	
	entry = lookup_widget(dialog, "entry17");
	
	lat_deg = parse_degrees(gtk_entry_get_text(GTK_ENTRY(entry)));
	entry = lookup_widget(dialog, "entry18");
	
	lon_deg = parse_degrees(gtk_entry_get_text(GTK_ENTRY(entry)));



	



	entry = lookup_widget(dialog, "entry19");
	keyword = gtk_entry_get_text(GTK_ENTRY(entry));
	text_view = GTK_TEXT_VIEW(lookup_widget(dialog, "textview2"));
	buffer = gtk_text_view_get_buffer(text_view);
	gtk_text_buffer_get_start_iter (buffer, &start);
	gtk_text_buffer_get_end_iter (buffer, &end);
	desc = gtk_text_buffer_get_text(buffer, &start, &end, TRUE);


	db = g_strconcat(foxtrotgps_dir, "/", POI_DB, NULL);	
	


	sql = sqlite3_mprintf ( 	
			"UPDATE "
				"poi "
			"SET "
				"lat=%f,"
				"lon=%f,"
				"keywords=%Q,"
				"desc=%Q"
			"WHERE "
				"idmd5='%s'" 
			,
			lat_deg, lon_deg, 
			keyword, desc, idmd5);

	res = sql_execute(db, sql, NULL);
	
	if(res==1)
	{
		sql_execute(db, POI_DB_CREATE, NULL);
		sql_execute(db, sql, NULL);
	}

	g_free(desc);
	sqlite3_free (sql);
	
	gtk_widget_destroy(dialog);
	
	

}
Ejemplo n.º 11
0
void
set_poi(GtkWidget *dialog)
{
	GtkComboBox *combo_box;
	GtkTextView *text_view;
	GtkTextBuffer *buffer;
	GtkTextIter start, end;
	GtkWidget *entry, *radiobutton;

	const char *keyword;
	char *desc;
	char *sql;
	char *db;
	int visibility, price_range = 0, extended_open;
	int category, subcategory;
	double lat_deg, lon_deg;
	int res;
	double rand1, rand2;

	entry = lookup_widget(dialog, "entry14");
	
	lat_deg = parse_degrees(gtk_entry_get_text(GTK_ENTRY(entry)));
	entry = lookup_widget(dialog, "entry15");
	
	lon_deg = parse_degrees(gtk_entry_get_text(GTK_ENTRY(entry)));
	radiobutton = lookup_widget(dialog, "radiobutton11");
	visibility = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton))) ? 1 : 0;	
	combo_box = GTK_COMBO_BOX(lookup_widget(dialog, "combobox2"));
	category = gtk_combo_box_get_active(combo_box);
	subcategory = gtk_combo_box_get_active(GTK_COMBO_BOX(combobox_subcat));
	entry = lookup_widget(dialog, "entry13");
	keyword = gtk_entry_get_text(GTK_ENTRY(entry));
	text_view = GTK_TEXT_VIEW(lookup_widget(dialog, "textview1"));
	buffer = gtk_text_view_get_buffer(text_view);
	gtk_text_buffer_get_start_iter (buffer, &start);
	gtk_text_buffer_get_end_iter (buffer, &end);
	desc = gtk_text_buffer_get_text(buffer, &start, &end, TRUE);
	radiobutton = lookup_widget(dialog, "radiobutton8");
	price_range = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton))) ? 1 : price_range;
	radiobutton = lookup_widget(dialog, "radiobutton9");
	price_range = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton))) ? 3 : price_range;
	radiobutton = lookup_widget(dialog, "radiobutton10");
	price_range = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton))) ? 5 : price_range;
	radiobutton = lookup_widget(dialog, "checkbutton10");
	extended_open = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton))) ? 1 : 0;

	
	rand1 = g_random_double_range (100000000,1000000000);
	rand2 = g_random_double_range (100000000,1000000000);

	
	db = g_strconcat(foxtrotgps_dir, "/", POI_DB, NULL);	
	
	sql = sqlite3_mprintf ( 	
			"INSERT INTO poi "
			"(idmd5, lat, lon, visibility, cat, subcat, keywords, desc, price_range, extended_open) "
			"VALUES ('%.0f%.0f',%f,%f,%d,%d,%d,%Q,%Q,%d,%d)",
			rand1, rand2, lat_deg, lon_deg, visibility, category, subcategory, 
			keyword, desc, price_range, extended_open);

	res = sql_execute(db, sql, NULL);
	
	if(res==1)
	{
		sql_execute(db, POI_DB_CREATE, NULL);
		sql_execute(db, sql, NULL);
	}

	g_free(desc);
	sqlite3_free (sql);
	gtk_widget_destroy(dialog);
	
	
	global_poi_cat = category;
}
Ejemplo n.º 12
0
// Processes a just-completed term
// Returns true if new sentence has just passed checksum test and is validated
bool TinyGPS::term_complete()
{
  if (_is_checksum_term)
  {
    byte checksum = 16 * from_hex(_term[0]) + from_hex(_term[1]);
    if (checksum == _parity)
    {
        _last_time_fix = _new_time_fix;
        _last_position_fix = _new_position_fix;

        switch(_sentence_type)
        {
          case _GPS_SENTENCE_PUBX:
            _gps_fix_quality = _new_gps_fix_quality;
            _altitude = _new_altitude;
            _time = _new_time;
            _latitude  = _new_latitude;
            _longitude = _new_longitude;
            _sats = _new_sats;
            _course = _new_course;
            _vspeed = _new_vspeed;
            _speed = _new_speed;
            break;
        }
        return true;
    }
    return false;
  }

  // the first term determines the sentence type
  if (_term_number == 0)
  {
    if (!gpsstrcmp(_term, _PUBX_TERM))
      _sentence_type = _GPS_SENTENCE_PUBX;
    else
      _sentence_type = _GPS_SENTENCE_OTHER;
    return false;
  }

  if (_sentence_type != _GPS_SENTENCE_OTHER && _term[0]) {
    switch(400 + _term_number)
    {
      // Time
      case 402:
        _new_time = parse_decimal();
        _new_time_fix = millis();
        break;
      // Latitude
      case 403:
        _new_latitude = parse_degrees();
        _new_position_fix = millis();
        break;
      // N/S
      case 404:
        if (_term[0] == 'S')
          _new_latitude = -_new_latitude;
        break;
      // Longitude
      case 405:
        _new_longitude = parse_degrees();
        break;
      // E/W
      case 406:
        if (_term[0] == 'W')
          _new_longitude = -_new_longitude;
        break;
      // Speed (in km/h)
      case 411:
        _new_speed = parse_decimal();
        break;
      // Course
      case 412:
        _new_course = parse_decimal();
        break;
      // Altitude
      case 407:
        _new_altitude = parse_decimal();
        break;
      // Sat num
      case 418:
        _new_sats = parse_decimal()/100;
        break;
      // fix quality
      case 408:
        if (_term[0] == 'G' || _term[0] == 'D') {
          _gps_data_good = true;
          if (_term[1] == '2')
            _new_gps_fix_quality = 2;
          else if (_term[1] == '3')
            _new_gps_fix_quality = 3;
        } else {
          _new_gps_fix_quality = 1;
          _gps_data_good = false;
        }
        break;
      case 413:
        _new_vspeed = parse_decimal() * -1; // positive=downwards
        break;
    }
  }
  return false;
}
Ejemplo n.º 13
0
void
parse_param_list(token tag_name, param *param_list, token end_token)
{
	param *param_ptr;
	int param_index;
	char old_name[256];

	// Initialise the parameter list.

	init_param_list();

	// Parse the parameter list.

	while ((param_ptr = parse_next_param(param_list)) != NULL) {
		switch (param_ptr->value_type) {
		case VALUE_BLOCK_NAME:
			parse_string(old_name, 256);
			if (!parse_name(old_name, (char *)param_ptr->variable_ptr, false))
				file_error("Expected a valid block name rather than '%s'",
					old_name);
			break;
		case VALUE_BLOCK_TYPE:
			*(blocktype *)param_ptr->variable_ptr = parse_block_type();
			break;
		case VALUE_BOOL:
			*(bool *)param_ptr->variable_ptr = parse_bool();
			break;
		case VALUE_CHAR:
			*(char *)param_ptr->variable_ptr = parse_char();
			break;
		case VALUE_DEGREES:
			*(double *)param_ptr->variable_ptr = parse_degrees();
			break;
		case VALUE_DOUBLE:
			*(double *)param_ptr->variable_ptr = parse_double();
			break;
		case VALUE_INTEGER:
			*(int *)param_ptr->variable_ptr = parse_integer();
			break;
		case VALUE_PART_NAME:
			parse_string(old_name, 256);
			if (!parse_name(old_name, (char *)param_ptr->variable_ptr, false))
				file_error("Expected a valid part name rather than '%s'",
					old_name);
			break;
		case VALUE_PERCENTAGE:
			*(double *)param_ptr->variable_ptr = parse_percentage();
			break;
		case VALUE_REF_LIST:
			parse_ref_list((ref_list *)param_ptr->variable_ptr);
			break;
		case VALUE_RGB:
			*(RGBcolour *)param_ptr->variable_ptr = parse_RGB();
			break;
		case VALUE_STRING:
			parse_string((char *)param_ptr->variable_ptr, 256);
			break;
		case VALUE_TEXCOORDS_LIST:
			parse_texcoords_list((texcoords_list *)param_ptr->variable_ptr);
			break;
		case VALUE_TEXTURE_STYLE:
			*(texstyle *)param_ptr->variable_ptr = parse_texture_style();
			break;
		case VALUE_VERTEX_COORDS:
			*(vertex *)param_ptr->variable_ptr = parse_vertex_coordinates();
			break;
		default:
			file_error("internal error--unrecognised parameter value type");
		}
	}

	// If an end_token was specified, then verify that the end token parsed
	// matches it.

	if (end_token != TOKEN_NONE && file_token != end_token)
		expected_token(get_token_str(end_token));

	// If there was a parameter list, verify that all required parameters were
	// parsed.

	if (param_list) {
		param_index = 0;
		while (param_list[param_index].param_name != TOKEN_NONE) {
			if (param_list[param_index].required && 
				!matched_param[param_index])
				file_error("parameter '%s' is missing from tag '%s'", 
					get_token_str(param_list[param_index].param_name), 
					get_token_str(tag_name));
			param_index++;
		}
	}
}
Ejemplo n.º 14
0
// Processes a just-completed term
// Returns true if new sentence has just passed checksum test and is validated
bool TinyGPS::term_complete()
{
  if (_is_checksum_term)
  {
    byte checksum = 16 * from_hex(_term[0]) + from_hex(_term[1]);
    if (checksum == _parity)
    {
      if (_gps_data_good)
      {
#ifndef _GPS_NO_STATS
        ++_good_sentences;
#endif
        _last_time_fix = _new_time_fix;
        _last_position_fix = _new_position_fix;

        switch(_sentence_type)
        {
        case _GPS_SENTENCE_GPRMC:
          _time      = _new_time;
          _date      = _new_date;
          _latitude  = _new_latitude;
          _longitude = _new_longitude;
          _speed     = _new_speed;
          _course    = _new_course;
          break;
        case _GPS_SENTENCE_GPGGA:
          _altitude  = _new_altitude;
          _time      = _new_time;
          _latitude  = _new_latitude;
          _longitude = _new_longitude;
		  _sats		 = _new_sats;
          break;
		
		// terry
		case _GPS_SENTENCE_PUBX:
          _time      = _new_time;
          _latitude  = _new_latitude;
          _longitude = _new_longitude;
          _speed     = _new_speed;
          _course    = _new_course;
		  _altitude  = _new_altitude;
		  _sats		 = _new_sats; //nigey
          break;
		//
        }

        return true;
      }
    }

#ifndef _GPS_NO_STATS
    else
      ++_failed_checksum;
#endif
    return false;
  }

  // the first term determines the sentence type
  if (_term_number == 0)
  {
    if (!gpsstrcmp(_term, _GPRMC_TERM))
      _sentence_type = _GPS_SENTENCE_GPRMC;
    else if (!gpsstrcmp(_term, _GPGGA_TERM))
      _sentence_type = _GPS_SENTENCE_GPGGA;
	// terry
	else if (!gpsstrcmp(_term, _PUBX_TERM))
      _sentence_type = _GPS_SENTENCE_PUBX;
	//
    else
      _sentence_type = _GPS_SENTENCE_OTHER;
    return false;
  }

  if (_sentence_type != _GPS_SENTENCE_OTHER && _term[0])
  
  // terry
  switch(_sentence_type) {
	
	case _GPS_SENTENCE_GPRMC:
		_term_id = 100 + _term_number;
		break;
	
	case _GPS_SENTENCE_GPGGA:
		_term_id = 200 + _term_number;
		break;
		
	case _GPS_SENTENCE_PUBX:
		_term_id = 300 + _term_number;
		break;
  }
  //
  
  switch(_term_id) // terry
  {
    case 101: // Time in both sentences
    case 201:
	case 302: // terry (time PUBX 00)
      _new_time = parse_decimal();
      _new_time_fix = millis();
      break;
    case 102: // GPRMC validity
      _gps_data_good = _term[0] == 'A';
      break;
    case 103: // Latitude
    case 202:
	case 303: // terry (lat PUBX 00)
      _new_latitude = parse_degrees();
      _new_position_fix = millis();
      break;
    case 104: // N/S
    case 203:
	case 304: // terry (N/S PUBX 00)
      if (_term[0] == 'S')
        _new_latitude = -_new_latitude;
      break;
    case 105: // Longitude
    case 204:
	case 305: // terry (lon PUBX 00)
      _new_longitude = parse_degrees();
      break;
    case 106: // E/W
    case 205:
	case 306: // terry (E/W PUBX 00)
      if (_term[0] == 'W')
        _new_longitude = -_new_longitude;
      break;
    case 107: // Speed (GPRMC)
      _new_speed = parse_decimal();
      break;
    case 108: // Course (GPRMC)
	case 312: // terry (course PUBX 00)
      _new_course = parse_decimal();
      break;
    case 109: // Date (GPRMC)
      _new_date = gpsatol(_term);
      break;
    case 206: // Fix data (GPGGA)
      _gps_data_good = _term[0] > '0';
      break;
    case 209: // Altitude (GPGGA)
	case 307: // terry (altitude PUBX 00)
      _new_altitude = parse_decimal();
      break;
	  
	// terry
	case 301: // PUBX message ID (we want 0)
	  if (_term[0] == '0' && _term[1] == '0') _gps_data_good = 1;
	  break;
	case 311: // (km/h speed PUBX 00)
	  _new_speed = parse_decimal() / _GPS_KMPH_PER_KNOT;
	  break;
	case 207: // sats (GPGGA); // (nigey) sats
	  _new_sats = atoi(_term);
	  break;
	  
	//
  }

  return false;
}