Ticket #963: satellite-status-v3.2.diff

File satellite-status-v3.2.diff, 9.0 KB (added by kamikaaze, 8 years ago)

If loosing gps signal the correct fixtype will now be send

  • navit/android/src/org/navitproject/navit/NavitVehicle.java

     
    1919
    2020package org.navitproject.navit;
    2121
     22import java.util.Iterator;
     23
    2224import android.content.Context;
    2325import android.location.Criteria;
     26import android.location.GpsSatellite;
     27import android.location.GpsStatus;
    2428import android.location.Location;
    2529import android.location.LocationListener;
    2630import android.location.LocationManager;
     31import android.location.LocationProvider;
    2732import android.os.Bundle;
     33import android.os.SystemClock;
    2834import android.util.Log;
     35import android.widget.Toast;
    2936
    3037public class NavitVehicle {
    3138
     39        public static final int GPSNOFIX = 0;
     40        public static final int GPSFIX2D = 1;
     41        public static final int GPSFIX3D = 2;
     42       
    3243        public static Location lastLocation = null;
    3344
    3445        private static LocationManager sLocationManager = null;
    35         private int vehicle_callbackid;
     46        private int vehicle_location_callbackid;
     47        private int vehicle_status_callbackid;
    3648        private String preciseProvider;
    3749        private String fastProvider;
    3850
    3951        private static NavitLocationListener preciseLocationListener = null;
    4052        private static NavitLocationListener fastLocationListener = null;
     53       
     54        private static NavitGpsStatusListener mGpsStatusListener = null;
     55       
     56        private GpsStatus mGpsStatus = null;
     57       
     58        private int mLastFixType = 0;
     59        private int mLastUsedSatellites = 0;
     60        private long mLastLocationMillis;
    4161
    42         public native void VehicleCallback(int id, Location location);
     62        public native void VehicleLocationCallback(int id, Location location);
     63        public native void VehicleStatusCallback(int id, int fixType, int usedSatellites);
    4364
    4465        private class NavitLocationListener implements LocationListener {
    4566                public boolean precise = false;
     
    5172                                fastProvider = null;
    5273                        }
    5374                       
    54                         VehicleCallback(vehicle_callbackid, location);
     75                        mLastLocationMillis = SystemClock.elapsedRealtime();
     76                       
     77                        VehicleLocationCallback(vehicle_location_callbackid, location);
    5578                }
    5679                public void onProviderDisabled(String provider){}
    5780                public void onProviderEnabled(String provider) {}
    5881                public void onStatusChanged(String provider, int status, Bundle extras) {}
    5982        }
     83       
     84        private class NavitGpsStatusListener implements GpsStatus.Listener {
     85                @Override
     86                public void onGpsStatusChanged(int event) {
     87                        int fixType = 0;
     88                       
     89                        /* Get the number of currently used Satellites */
     90                        sLocationManager.getGpsStatus(mGpsStatus);
     91                       
     92                        Iterator<GpsSatellite> satI = mGpsStatus.getSatellites().iterator();
     93                        int usedSatellites = 0;
     94                        while(satI.hasNext()) {
     95                                GpsSatellite satellite = satI.next();
     96                               
     97                                if(satellite.usedInFix())
     98                                        usedSatellites++;
     99                        }                       
    60100
    61         NavitVehicle (Context context, int callbackid) {
     101                        /* Determine if we have a GPS Fix
     102                         * 0 - No Fix
     103                         * 1 - Fix 2D (unused)
     104                         * 2 - Fix 3D */
     105                        switch(event) {
     106                                case GpsStatus.GPS_EVENT_STARTED:
     107                                        fixType = GPSNOFIX;
     108                                        break;
     109                               
     110                                case GpsStatus.GPS_EVENT_FIRST_FIX:
     111                                        /* We have our first fix */
     112                                        fixType = GPSFIX3D;
     113                                        break;
     114                                       
     115                                case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
     116                                        /* If we did not receive a new location recently we lost our fix */
     117                                        if(SystemClock.elapsedRealtime() - mLastLocationMillis < 10000)
     118                                                fixType = GPSFIX3D;
     119                                        break;
     120                                       
     121                                case GpsStatus.GPS_EVENT_STOPPED:
     122                                        fixType = GPSNOFIX;
     123                                        break;
     124                        }
     125                       
     126                        /* Callback only if any change */
     127                        if(mLastFixType != fixType || mLastUsedSatellites != usedSatellites)
     128                                VehicleStatusCallback(vehicle_status_callbackid, fixType, usedSatellites);
     129
     130                        mLastFixType = fixType;
     131                        mLastUsedSatellites = usedSatellites;
     132                }               
     133        }
     134       
     135        NavitVehicle (Context context, int locationCallbackid, int statusCallbackid) {
    62136                sLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    63137                preciseLocationListener = new NavitLocationListener();
    64138                preciseLocationListener.precise = true;
     
    90164                Log.e("NavitVehicle", "Precise Provider " + preciseProvider);
    91165                fastProvider = sLocationManager.getBestProvider(lowCriteria, false);
    92166                Log.e("NavitVehicle", "Fast Provider " + fastProvider);
    93                 vehicle_callbackid=callbackid;
     167                vehicle_location_callbackid=locationCallbackid;
     168                vehicle_status_callbackid=statusCallbackid;
     169               
     170                mGpsStatusListener = new NavitGpsStatusListener();
     171                mGpsStatus = sLocationManager.getGpsStatus(null);
    94172
    95173                sLocationManager.requestLocationUpdates(preciseProvider, 0, 0, preciseLocationListener);
     174                sLocationManager.addGpsStatusListener(mGpsStatusListener);
    96175
    97176                // If the 2 providers are the same, only activate one listener
    98177                if (fastProvider == null || preciseProvider.compareTo(fastProvider) == 0) {
     
    106185                if (sLocationManager != null) {
    107186                        if (preciseLocationListener != null) sLocationManager.removeUpdates(preciseLocationListener);
    108187                        if (fastLocationListener != null) sLocationManager.removeUpdates(fastLocationListener);
     188                        if (mGpsStatusListener != null) sLocationManager.removeGpsStatusListener(mGpsStatusListener);
    109189                }
    110190
    111191        }
  • navit/android.c

     
    148148}
    149149
    150150JNIEXPORT void JNICALL
    151 Java_org_navitproject_navit_NavitVehicle_VehicleCallback( JNIEnv * env, jobject thiz, int id, jobject location)
     151Java_org_navitproject_navit_NavitVehicle_VehicleLocationCallback( JNIEnv * env, jobject thiz, int id, jobject location)
    152152{
    153153        callback_call_1((struct callback *)id, (void *)location);
    154154}
    155155
    156156JNIEXPORT void JNICALL
     157Java_org_navitproject_navit_NavitVehicle_VehicleStatusCallback( JNIEnv * env, jobject thiz, int id, jint fixType, jint usedSatellites)
     158{
     159        callback_call_2((struct callback *)id, (int)fixType, (int)usedSatellites);
     160}
     161
     162JNIEXPORT void JNICALL
    157163Java_org_navitproject_navit_NavitIdle_IdleCallback( JNIEnv* env, jobject thiz, int id)
    158164{
    159165        dbg(1,"enter %p %p\n",thiz, (void *)id);
  • navit/vehicle/android/vehicle_android.c

     
    4949        int sats_used;
    5050        int have_coords;
    5151        struct attr ** attrs;
    52         struct callback *cb;
     52        struct callback *loc_cb;
     53        struct callback *status_cb;
    5354        jclass NavitVehicleClass;
    5455        jobject NavitVehicle;
    5556        jclass LocationClass;
     
    8384{
    8485        dbg(1,"enter %s\n",attr_to_name(type));
    8586        switch (type) {
    86 #if 0
    8787        case attr_position_fix_type:
    8888                attr->u.num = priv->fix_type;
    8989                break;
    90 #endif
    9190        case attr_position_height:
    9291                attr->u.numd = &priv->height;
    9392                break;
     
    10099        case attr_position_radius:
    101100                attr->u.numd = &priv->radius;
    102101                break;
    103 
    104102#if 0
    105103        case attr_position_qual:
    106104                attr->u.num = priv->sats;
    107105                break;
     106#endif
    108107        case attr_position_sats_used:
    109108                attr->u.num = priv->sats_used;
    110109                break;
    111 #endif
    112110        case attr_position_coord_geo:
    113111                attr->u.coord_geo = &priv->geo;
    114112                if (!priv->have_coords)
     
    131129};
    132130
    133131static void
    134 vehicle_android_callback(struct vehicle_priv *v, jobject location)
     132vehicle_android_location_callback(struct vehicle_priv *v, jobject location)
    135133{
    136134        time_t tnow;
    137135        struct tm *tm;
     
    151149        callback_list_call_attr_0(v->cbl, attr_position_coord_geo);
    152150}
    153151
     152static void
     153vehicle_android_status_callback(struct vehicle_priv *v, int fixType, int usedSatellites)
     154{
     155        v->fix_type = fixType;
     156        v->sats_used = usedSatellites;
     157       
     158        callback_list_call_attr_0(v->cbl, attr_position_coord_geo);
     159}
     160
    154161static int
    155162vehicle_android_init(struct vehicle_priv *ret)
    156163{
     
    175182        if (!android_find_class_global("org/navitproject/navit/NavitVehicle", &ret->NavitVehicleClass))
    176183                return 0;
    177184        dbg(0,"at 3\n");
    178         cid = (*jnienv)->GetMethodID(jnienv, ret->NavitVehicleClass, "<init>", "(Landroid/content/Context;I)V");
     185        cid = (*jnienv)->GetMethodID(jnienv, ret->NavitVehicleClass, "<init>", "(Landroid/content/Context;II)V");
    179186        if (cid == NULL) {
    180187                dbg(0,"no method found\n");
    181188                return 0; /* exception thrown */
    182189        }
    183190        dbg(0,"at 4 android_activity=%p\n",android_activity);
    184         ret->NavitVehicle=(*jnienv)->NewObject(jnienv, ret->NavitVehicleClass, cid, android_activity, (int) ret->cb);
     191        ret->NavitVehicle=(*jnienv)->NewObject(jnienv, ret->NavitVehicleClass, cid, android_activity, (int) ret->loc_cb, (int) ret->status_cb);
    185192        dbg(0,"result=%p\n",ret->NavitVehicle);
    186193        if (!ret->NavitVehicle)
    187194                return 0;
     
    209216        dbg(0, "enter\n");
    210217        ret = g_new0(struct vehicle_priv, 1);
    211218        ret->cbl = cbl;
    212         ret->cb=callback_new_1(callback_cast(vehicle_android_callback), ret);
     219        ret->loc_cb=callback_new_1(callback_cast(vehicle_android_location_callback), ret);
     220        ret->status_cb=callback_new_1(callback_cast(vehicle_android_status_callback), ret);
    213221        *meth = vehicle_android_methods;
    214222        vehicle_android_init(ret);
    215223        dbg(0, "return\n");