From: martin-s Date: Mon, 6 Feb 2012 15:13:35 +0000 (+0000) Subject: Add:vehicle_file:Option to save current gps position on shutdown and resume from... X-Git-Tag: navit-0.5.0.5194svn~268 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0e4fe1e35af3ae7855cc77ce8003e33447ac8361;p=profile%2Fivi%2Fnavit.git Add:vehicle_file:Option to save current gps position on shutdown and resume from there on startup git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@4927 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- diff --git a/navit/navit/attr_def.h b/navit/navit/attr_def.h index 9eaf019..a01b30a 100644 --- a/navit/navit/attr_def.h +++ b/navit/navit/attr_def.h @@ -352,6 +352,7 @@ ATTR(osm_is_in) ATTR(event_loop_system) ATTR(map_name) ATTR(item_name) +ATTR(state_file) ATTR2(0x0003ffff,type_string_end) ATTR2(0x00040000,type_special_begin) ATTR(order) diff --git a/navit/navit/vehicle/file/vehicle_file.c b/navit/navit/vehicle/file/vehicle_file.c index aa5d6e8..5a4be46 100644 --- a/navit/navit/vehicle/file/vehicle_file.c +++ b/navit/navit/vehicle/file/vehicle_file.c @@ -125,6 +125,8 @@ struct vehicle_priv { struct gps_sat next[24]; struct item sat_item; int valid; + char *statefile; + int process_statefile; }; //*************************************************************************** @@ -619,7 +621,20 @@ vehicle_file_io(struct vehicle_priv *priv) char *str, *tok; dbg(1, "vehicle_file_io : enter\n"); - size = read(priv->fd, priv->buffer + priv->buffer_pos, buffer_size - priv->buffer_pos - 1); + if (priv->process_statefile) { + unsigned char *data; + priv->process_statefile=0; + if (file_get_contents(priv->statefile, &data, &size)) { + if (size > buffer_size) + size=buffer_size; + memcpy(priv->buffer, data, size); + priv->buffer_pos=0; + g_free(data); + } else + return; + } else { + size = read(priv->fd, priv->buffer + priv->buffer_pos, buffer_size - priv->buffer_pos - 1); + } if (size <= 0) { switch (priv->on_eof) { case 0: @@ -734,9 +749,24 @@ vehicle_file_disable_watch(struct vehicle_priv *priv) static void vehicle_file_destroy(struct vehicle_priv *priv) { + if (priv->statefile && priv->nmea_data) { + struct attr readwrite={attr_readwrite}; + struct attr create={attr_create}; + struct attr *attrs[]={&readwrite,&create,NULL}; + struct file *f; + readwrite.u.num=1; + create.u.num=1; + f=file_create(priv->statefile, attrs); + if (f) { + file_data_write(f, 0, strlen(priv->nmea_data), priv->nmea_data); + file_destroy(f); + } + } vehicle_file_close(priv); callback_destroy(priv->cb); callback_destroy(priv->cbt); + if (priv->statefile) + g_free(priv->statefile); if (priv->source) g_free(priv->source); if (priv->buffer) @@ -913,6 +943,7 @@ vehicle_file_new_file(struct vehicle_methods struct attr *on_eof; struct attr *baudrate; struct attr *checksum_ignore; + struct attr *state_file; dbg(1, "enter\n"); @@ -928,6 +959,9 @@ vehicle_file_new_file(struct vehicle_methods ret->buffer = g_malloc(buffer_size); ret->time=1000; ret->baudrate=B4800; + state_file=attr_search(attrs, NULL, attr_state_file); + if (state_file) + ret->statefile=g_strdup(state_file->u.str); time = attr_search(attrs, NULL, attr_time); if (time) ret->time=time->u.num; @@ -973,6 +1007,10 @@ vehicle_file_new_file(struct vehicle_methods *meth = vehicle_file_methods; ret->cb=callback_new_1(callback_cast(vehicle_file_io), ret); ret->cbt=callback_new_1(callback_cast(vehicle_file_enable_watch_timer), ret); + if (ret->statefile && file_exists(ret->statefile)) { + ret->process_statefile=1; + event_add_timeout(1000, 0, ret->cb); + } ret->sat_item.type=type_position_sat; ret->sat_item.id_hi=ret->sat_item.id_lo=0; ret->sat_item.priv_data=ret;