Ticket #913: patch913.diff

File patch913.diff, 6.8 KB (added by wiki.navit-project.org/index.php/user:naggety, 2 years ago)

Patch - only GGA or RMC required

  • navit/vehicle/file/vehicle_file.c

    diff --git a/navit/vehicle/file/vehicle_file.c b/navit/vehicle/file/vehicle_file.c
    index 10bce94..39ce11a 100644
    a b struct vehicle_priv { 
    8484        char *source;
    8585        struct callback_list *cbl;
    8686        int fd;
    87         struct callback *cb,*cbt;
     87        struct callback *cb,*cbt,*cb_fix_timeout;
    8888        char *buffer;
    8989        int buffer_pos;
    9090        char *nmea_data;
    struct vehicle_priv { 
    114114        enum file_type file_type;
    115115        FILE *file;
    116116        struct event_watch *watch;
     117        struct event_timeout *ev_fix_timeout;
    117118        speed_t baudrate;
    118119        struct attr ** attrs;
    119120        char fixiso8601[128];
    vehicle_file_enable_watch_timer(struct vehicle_priv *priv) 
    377378
    378379
    379380//***************************************************************************
     381/** @fn static void vehicle_file_fix_timeout_cb( struct vehicle_priv *priv )
     382*****************************************************************************
     383* @b Description: This is a callback function, called when the fix timeout
     384*               is done. Set the position to invalid.
     385*****************************************************************************
     386* @param      priv : pointer on the private data of the plugin
     387*****************************************************************************
     388**/
     389static void
     390vehicle_file_fix_timeout_cb(struct vehicle_priv *priv)
     391{
     392        priv->valid = attr_position_valid_invalid;
     393        priv->ev_fix_timeout = NULL;
     394        callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
     395}
     396
     397
     398//***************************************************************************
     399/** @fn static void vehicle_file_restart_fix_timeout(
     400 *                                      struct vehicle_priv *priv)
     401*****************************************************************************
     402* @b Description: Cancel previous fix timeout event and add a new one
     403*****************************************************************************
     404* @param      priv : pointer on the private data of the plugin
     405*****************************************************************************
     406**/
     407static void
     408vehicle_file_restart_fix_timeout(struct vehicle_priv *priv)
     409{
     410        if (priv->ev_fix_timeout != NULL)
     411                event_remove_timeout(priv->ev_fix_timeout);
     412        priv->ev_fix_timeout = event_add_timeout(10000, 0, priv->cb_fix_timeout);
     413}
     414
     415
     416//***************************************************************************
    380417/** @fn static int vehicle_file_parse( struct vehicle_priv *priv,
    381418*                                      char *buffer)
    382419*****************************************************************************
    vehicle_file_enable_watch_timer(struct vehicle_priv *priv) 
    385422* @param      priv : pointer on the private data of the plugin
    386423* @param      buffer : data buffer (null terminated)
    387424*****************************************************************************
    388 * @return     1 if The GPRMC Sentence is found
     425* @return     1 if new coords were received (fixtime changed) or change to
     426*               invalid
    389427*             0 if not found
    390428*****************************************************************************
    391429**/
    vehicle_file_parse(struct vehicle_priv *priv, char *buffer) 
    458496                   UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7],
    459497                   HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14]
    460498                 */
    461                 if (*item[2] && *item[3] && *item[4] && *item[5]) {
     499                if (*item[2] && *item[3] && *item[4] && *item[5] && *item[6] > 0) {
    462500                        lat = g_ascii_strtod(item[2], NULL);
    463501                        priv->geo.lat = floor(lat / 100);
    464502                        lat -= priv->geo.lat * 100;
    vehicle_file_parse(struct vehicle_priv *priv, char *buffer) 
    474512
    475513                        if (!g_ascii_strcasecmp(item[5],"W"))
    476514                                priv->geo.lng=-priv->geo.lng;
    477                         priv->valid=attr_position_valid_valid;
     515
     516                        if (priv->valid == attr_position_valid_invalid)
     517                                ret = 1;
     518                        priv->valid = attr_position_valid_valid;
     519                        vehicle_file_restart_fix_timeout(priv);
     520
     521                        if (*item[1] && strncmp(priv->fixtime, item[1], sizeof(priv->fixtime))) {
     522                                ret = 1;
     523                                strncpy(priv->fixtime, item[1], sizeof(priv->fixtime));
     524                        }
    478525
    479526                        dbg(lvl_info, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng);
    480527
    481                 } else
     528                } else {
     529                        if (priv->valid == attr_position_valid_valid)
     530                                ret = 1;
    482531                        priv->valid=attr_position_valid_invalid;
     532                }
     533
    483534                if (*item[6])
    484535                        sscanf(item[6], "%d", &priv->status);
    485536                if (*item[7])
    486537                        sscanf(item[7], "%d", &priv->sats_used);
    487538                if (*item[8])
    488539                        sscanf(item[8], "%lf", &priv->hdop);
    489                 if (*item[1])
    490                         strncpy(priv->fixtime, item[1], sizeof(priv->fixtime));
    491540                if (*item[9])
    492541                        sscanf(item[9], "%lf", &priv->height);
    493542
    vehicle_file_parse(struct vehicle_priv *priv, char *buffer) 
    537586                                &priv->fixmonth,
    538587                                &priv->fixyear);
    539588                        priv->fixyear += 2000;
     589
     590                        lat = g_ascii_strtod(item[3], NULL);
     591                        priv->geo.lat = floor(lat / 100);
     592                        lat -= priv->geo.lat * 100;
     593                        priv->geo.lat += lat / 60;
     594
     595                        if (!g_ascii_strcasecmp(item[4],"S"))
     596                                priv->geo.lat=-priv->geo.lat;
     597
     598                        lng = g_ascii_strtod(item[5], NULL);
     599                        priv->geo.lng = floor(lng / 100);
     600                        lng -= priv->geo.lng * 100;
     601                        priv->geo.lng += lng / 60;
     602
     603                        if (!g_ascii_strcasecmp(item[6],"W"))
     604                                priv->geo.lng=-priv->geo.lng;
     605
     606                        if (priv->valid == attr_position_valid_invalid)
     607                                ret = 1;
     608                        priv->valid=attr_position_valid_valid;
     609                        vehicle_file_restart_fix_timeout(priv);
     610
     611                        if (*item[1] && strncmp(priv->fixtime, item[1], sizeof(priv->fixtime))) {
     612                                ret = 1;
     613                                strncpy(priv->fixtime, item[1], sizeof(priv->fixtime));
     614                        }
     615
     616                        dbg(lvl_info, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng);
     617
     618                } else {
     619                        if (priv->valid == attr_position_valid_valid)
     620                                ret = 1;
     621                        priv->valid=attr_position_valid_invalid;
    540622                }
    541                 ret = 1;
    542623        }
    543624        if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) {
    544625        /*
    vehicle_file_new_file(struct vehicle_methods 
    9581039        if(source == NULL){
    9591040                 dbg(lvl_error,"Missing source attribute");
    9601041                 return NULL;
    961     }
     1042        }
    9621043        ret = g_new0(struct vehicle_priv, 1);   // allocate and initialize to 0
    9631044        ret->fd = -1;
    9641045        ret->cbl = cbl;
    vehicle_file_new_file(struct vehicle_methods 
    9661047        ret->buffer = g_malloc(buffer_size);
    9671048        ret->time=1000;
    9681049        ret->baudrate=B4800;
     1050        ret->fixtime[0] = '\0';
     1051        ret->ev_fix_timeout = NULL;
    9691052        state_file=attr_search(attrs, NULL, attr_state_file);
    9701053        if (state_file)
    9711054                ret->statefile=g_strdup(state_file->u.str);
    vehicle_file_new_file(struct vehicle_methods 
    10141097        *meth = vehicle_file_methods;
    10151098        ret->cb=callback_new_1(callback_cast(vehicle_file_io), ret);
    10161099        ret->cbt=callback_new_1(callback_cast(vehicle_file_enable_watch_timer), ret);
     1100        ret->cb_fix_timeout=callback_new_1(callback_cast(vehicle_file_fix_timeout_cb), ret);
    10171101        if (ret->statefile && file_exists(ret->statefile)) {
    10181102                ret->process_statefile=1;
    10191103                event_add_timeout(1000, 0, ret->cb);