Ticket #963: satellite-status.diff

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

This patch adds support for the osd item gps_status

  • 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;
    2833import android.util.Log;
    2934
     
    3237        public static Location lastLocation = null;
    3338
    3439        private static LocationManager sLocationManager = null;
    35         private int vehicle_callbackid;
     40        private int vehicle_location_callbackid;
     41        private int vehicle_status_callbackid;
    3642        private String preciseProvider;
    3743        private String fastProvider;
    3844
    3945        private static NavitLocationListener preciseLocationListener = null;
    4046        private static NavitLocationListener fastLocationListener = null;
     47       
     48        private static NavitGpsStatusListener mGpsStatusListener = null;
     49       
     50        private GpsStatus mGpsStatus = null;
    4151
    42         public native void VehicleCallback(int id, Location location);
     52        public native void VehicleLocationCallback(int id, Location location);
     53        public native void VehicleStatusCallback(int id, int fixType, int usedSatellites);
    4354
    4455        private class NavitLocationListener implements LocationListener {
    4556                public boolean precise = false;
     
    5162                                fastProvider = null;
    5263                        }
    5364                       
    54                         VehicleCallback(vehicle_callbackid, location);
     65                        VehicleLocationCallback(vehicle_location_callbackid, location);
    5566                }
    5667                public void onProviderDisabled(String provider){}
    5768                public void onProviderEnabled(String provider) {}
    5869                public void onStatusChanged(String provider, int status, Bundle extras) {}
    5970        }
     71       
     72        private class NavitGpsStatusListener implements GpsStatus.Listener {
     73                @Override
     74                public void onGpsStatusChanged(int event) {
     75                        sLocationManager.getGpsStatus(mGpsStatus);
     76                       
     77                        /* fixType needs to be 2 if GPS is available */
     78                        int fixType = 0;
     79                        if(event == GpsStatus.GPS_EVENT_SATELLITE_STATUS)
     80                                fixType = 2;
     81                       
     82                        /* Get the number of currently used Satellites */
     83                        Iterator<GpsSatellite> satI = mGpsStatus.getSatellites().iterator();
     84                        int usedSatellites = 0;
     85                        while(satI.hasNext()) {
     86                                GpsSatellite satellite = satI.next();
     87                               
     88                                if(satellite.usedInFix())
     89                                        usedSatellites++;
     90                        }
     91                       
     92                        VehicleStatusCallback(vehicle_status_callbackid, fixType, usedSatellites);
     93                }               
     94        }
    6095
    61         NavitVehicle (Context context, int callbackid) {
     96        NavitVehicle (Context context, int locationCallbackid, int statusCallbackid) {
    6297                sLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    6398                preciseLocationListener = new NavitLocationListener();
    6499                preciseLocationListener.precise = true;
     
    90125                Log.e("NavitVehicle", "Precise Provider " + preciseProvider);
    91126                fastProvider = sLocationManager.getBestProvider(lowCriteria, false);
    92127                Log.e("NavitVehicle", "Fast Provider " + fastProvider);
    93                 vehicle_callbackid=callbackid;
     128                vehicle_location_callbackid=locationCallbackid;
     129                vehicle_status_callbackid=statusCallbackid;
     130               
     131                mGpsStatusListener = new NavitGpsStatusListener();
     132                mGpsStatus = sLocationManager.getGpsStatus(null);
    94133
    95134                sLocationManager.requestLocationUpdates(preciseProvider, 0, 0, preciseLocationListener);
     135                sLocationManager.addGpsStatusListener(mGpsStatusListener);
    96136
    97137                // If the 2 providers are the same, only activate one listener
    98138                if (fastProvider == null || preciseProvider.compareTo(fastProvider) == 0) {
     
    106146                if (sLocationManager != null) {
    107147                        if (preciseLocationListener != null) sLocationManager.removeUpdates(preciseLocationListener);
    108148                        if (fastLocationListener != null) sLocationManager.removeUpdates(fastLocationListener);
     149                        if (mGpsStatusListener != null) sLocationManager.removeGpsStatusListener(mGpsStatusListener);
    109150                }
    110151
    111152        }
  • 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");