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); }
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); }
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); }
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; } }
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); }
// 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; }
// 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; }
// 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; }
// 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; }
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); }
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; }
// 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; }
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++; } } }
// 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; }