Ticket #913: patch913-2.diff

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

Patch for WinCE (to be tested)

  • navit/vehicle/wince/vehicle_wince.c

    diff --git a/navit/vehicle/wince/vehicle_wince.c b/navit/vehicle/wince/vehicle_wince.c
    index d43c516..87e41f4 100644
    a b struct vehicle_priv { 
    8383        char *source;
    8484        struct callback_list *cbl;
    8585        struct callback_list *priv_cbl;
     86        struct callback *cb_fix_timeout;
     87        struct event_timeout *ev_fix_timeout;
    8688        int is_running;
    8789        int thread_up;
    8890        int fd;
    vehicle_wince_available_ports(void) 
    365367}
    366368
    367369
     370//***************************************************************************
     371/** @fn static void vehicle_wince_fix_timeout_cb( struct vehicle_priv *priv )
     372*****************************************************************************
     373* @b Description: This is a callback function, called when the fix timeout
     374*               is done. Set the position to invalid.
     375*****************************************************************************
     376* @param      priv : pointer on the private data of the plugin
     377*****************************************************************************
     378**/
     379static void
     380vehicle_wince_fix_timeout_cb(struct vehicle_priv *priv)
     381{
     382        priv->valid = attr_position_valid_invalid;
     383        priv->ev_fix_timeout = NULL;
     384        callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
     385}
     386
     387
     388//***************************************************************************
     389/** @fn static void vehicle_wince_restart_fix_timeout(
     390 *                                      struct vehicle_priv *priv)
     391*****************************************************************************
     392* @b Description: Cancel previous fix timeout event and add a new one
     393*****************************************************************************
     394* @param      priv : pointer on the private data of the plugin
     395*****************************************************************************
     396**/
     397static void
     398vehicle_wince_restart_fix_timeout(struct vehicle_priv *priv)
     399{
     400        if (priv->ev_fix_timeout != NULL)
     401                event_remove_timeout(priv->ev_fix_timeout);
     402        priv->ev_fix_timeout = event_add_timeout(10000, 0, priv->cb_fix_timeout);
     403}
     404
     405
     406
    368407static int
    369408vehicle_wince_open(struct vehicle_priv *priv)
    370409{
    vehicle_wince_parse(struct vehicle_priv *priv, char *buffer) 
    474513                   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],
    475514                   HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14]
    476515                 */
    477                 if (*item[2] && *item[3] && *item[4] && *item[5]) {
     516                if (*item[2] && *item[3] && *item[4] && *item[5] && *item[6] > 0) {
    478517                        lat = g_ascii_strtod(item[2], NULL);
    479518                        priv->geo.lat = floor(lat / 100);
    480519                        lat -= priv->geo.lat * 100;
    vehicle_wince_parse(struct vehicle_priv *priv, char *buffer) 
    490529
    491530                        if (!g_strcasecmp(item[5],"W"))
    492531                                priv->geo.lng=-priv->geo.lng;
    493                         priv->valid=attr_position_valid_valid;
     532
     533                        if (priv->valid == attr_position_valid_invalid)
     534                                ret = 1;
     535                        priv->valid = attr_position_valid_valid;
     536                        vehicle_wince_restart_fix_timeout(priv);
     537
     538                        if (*item[1] && strncmp(priv->fixtime, item[1], sizeof(priv->fixtime))) {
     539                                ret = 1;
     540                                strncpy(priv->fixtime, item[1], sizeof(priv->fixtime));
     541                        }
    494542
    495543                        dbg(lvl_info, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng);
    496544
    497                 } else
     545                } else {
     546                        if (priv->valid == attr_position_valid_valid)
     547                                ret = 1;
    498548                        priv->valid=attr_position_valid_invalid;
     549                }
     550
    499551                if (*item[6])
    500552                        sscanf(item[6], "%d", &priv->status);
    501553                if (*item[7])
    502                 sscanf(item[7], "%d", &priv->sats_used);
     554                        sscanf(item[7], "%d", &priv->sats_used);
    503555                if (*item[8])
    504556                        sscanf(item[8], "%lf", &priv->hdop);
    505                 if (*item[1])
    506                         strncpy(priv->fixtime, item[1], sizeof(priv->fixtime));
    507557                if (*item[9])
    508558                        sscanf(item[9], "%lf", &priv->height);
    509559
    vehicle_wince_parse(struct vehicle_priv *priv, char *buffer) 
    547597                                &priv->fixmonth,
    548598                                &priv->fixyear);
    549599                        priv->fixyear += 2000;
     600
     601                        lat = g_ascii_strtod(item[3], NULL);
     602                        priv->geo.lat = floor(lat / 100);
     603                        lat -= priv->geo.lat * 100;
     604                        priv->geo.lat += lat / 60;
     605
     606                        if (!g_ascii_strcasecmp(item[4],"S"))
     607                                priv->geo.lat=-priv->geo.lat;
     608
     609                        lng = g_ascii_strtod(item[5], NULL);
     610                        priv->geo.lng = floor(lng / 100);
     611                        lng -= priv->geo.lng * 100;
     612                        priv->geo.lng += lng / 60;
     613
     614                        if (!g_ascii_strcasecmp(item[6],"W"))
     615                                priv->geo.lng=-priv->geo.lng;
     616
     617                        if (priv->valid == attr_position_valid_invalid)
     618                                ret = 1;
     619                        priv->valid=attr_position_valid_valid;
     620                        vehicle_wince_restart_fix_timeout(priv);
     621
     622                        if (*item[1] && strncmp(priv->fixtime, item[1], sizeof(priv->fixtime))) {
     623                                ret = 1;
     624                                strncpy(priv->fixtime, item[1], sizeof(priv->fixtime));
     625                        }
     626
     627                        dbg(lvl_info, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng);
     628
     629                } else {
     630                        if (priv->valid == attr_position_valid_valid)
     631                                ret = 1;
     632                        priv->valid=attr_position_valid_invalid;
    550633                }
    551                 ret = 1;
    552634        }
    553635        if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) {
    554636        /*
    vehicle_wince_new(struct vehicle_methods 
    902984        ret->buffer = g_malloc(buffer_size);
    903985        ret->time=1000;
    904986        ret->baudrate=0;        // do not change the rate if not configured
     987        ret->fixtime[0] = '\0';
     988        ret->ev_fix_timeout = NULL;
    905989
    906990        time = attr_search(attrs, NULL, attr_time);
    907991        if (time)
    vehicle_wince_new(struct vehicle_methods 
    9231007        *meth = vehicle_wince_methods;
    9241008        ret->priv_cbl = callback_list_new();
    9251009        callback_list_add(ret->priv_cbl, callback_new_1(callback_cast(vehicle_wince_io), ret));
     1010        ret->cb_fix_timeout=callback_new_1(callback_cast(vehicle_wince_fix_timeout_cb), ret);
    9261011        ret->sat_item.type=type_position_sat;
    9271012        ret->sat_item.id_hi=ret->sat_item.id_lo=0;
    9281013        ret->sat_item.priv_data=ret;