iface-modem-location: implement handling the CDMA BS location source

This commit is contained in:
Aleksander Morgado
2012-10-31 12:50:13 +01:00
parent b508316a5a
commit 31ec55aea8
2 changed files with 107 additions and 11 deletions

View File

@@ -46,6 +46,8 @@ typedef struct {
MMLocationGpsNmea *location_gps_nmea; MMLocationGpsNmea *location_gps_nmea;
time_t location_gps_raw_last_time; time_t location_gps_raw_last_time;
MMLocationGpsRaw *location_gps_raw; MMLocationGpsRaw *location_gps_raw;
/* CDMA BS location */
MMLocationCdmaBs *location_cdma_bs;
} LocationContext; } LocationContext;
static void static void
@@ -57,6 +59,8 @@ location_context_free (LocationContext *ctx)
g_object_unref (ctx->location_gps_nmea); g_object_unref (ctx->location_gps_nmea);
if (ctx->location_gps_raw) if (ctx->location_gps_raw)
g_object_unref (ctx->location_gps_raw); g_object_unref (ctx->location_gps_raw);
if (ctx->location_cdma_bs)
g_object_unref (ctx->location_cdma_bs);
g_free (ctx); g_free (ctx);
} }
@@ -103,11 +107,13 @@ static GVariant *
build_location_dictionary (GVariant *previous, build_location_dictionary (GVariant *previous,
MMLocation3gpp *location_3gpp, MMLocation3gpp *location_3gpp,
MMLocationGpsNmea *location_gps_nmea, MMLocationGpsNmea *location_gps_nmea,
MMLocationGpsRaw *location_gps_raw) MMLocationGpsRaw *location_gps_raw,
MMLocationCdmaBs *location_cdma_bs)
{ {
GVariant *location_3gpp_value = NULL; GVariant *location_3gpp_value = NULL;
GVariant *location_gps_nmea_value = NULL; GVariant *location_gps_nmea_value = NULL;
GVariant *location_gps_raw_value = NULL; GVariant *location_gps_raw_value = NULL;
GVariant *location_cdma_bs_value = NULL;
GVariantBuilder builder; GVariantBuilder builder;
/* If a previous dictionary given, parse its values */ /* If a previous dictionary given, parse its values */
@@ -128,6 +134,9 @@ build_location_dictionary (GVariant *previous,
case MM_MODEM_LOCATION_SOURCE_GPS_RAW: case MM_MODEM_LOCATION_SOURCE_GPS_RAW:
location_gps_raw_value = value; location_gps_raw_value = value;
break; break;
case MM_MODEM_LOCATION_SOURCE_CDMA_BS:
location_cdma_bs_value = value;
break;
default: default:
g_warn_if_reached (); g_warn_if_reached ();
break; break;
@@ -178,6 +187,19 @@ build_location_dictionary (GVariant *previous,
MM_MODEM_LOCATION_SOURCE_GPS_RAW, MM_MODEM_LOCATION_SOURCE_GPS_RAW,
location_gps_raw_value); location_gps_raw_value);
/* If a new one given, use it */
if (location_cdma_bs) {
if (location_cdma_bs_value)
g_variant_unref (location_cdma_bs_value);
location_cdma_bs_value = mm_location_cdma_bs_get_dictionary (location_cdma_bs);
}
if (location_cdma_bs_value)
g_variant_builder_add (&builder,
"{uv}",
MM_MODEM_LOCATION_SOURCE_CDMA_BS,
location_cdma_bs_value);
return g_variant_builder_end (&builder); return g_variant_builder_end (&builder);
} }
@@ -203,7 +225,8 @@ notify_gps_location_update (MMIfaceModemLocation *self,
build_location_dictionary (mm_gdbus_modem_location_get_location (skeleton), build_location_dictionary (mm_gdbus_modem_location_get_location (skeleton),
NULL, NULL,
location_gps_nmea, location_gps_nmea,
location_gps_raw)); location_gps_raw,
NULL));
} }
void void
@@ -274,7 +297,8 @@ notify_3gpp_location_update (MMIfaceModemLocation *self,
skeleton, skeleton,
build_location_dictionary (mm_gdbus_modem_location_get_location (skeleton), build_location_dictionary (mm_gdbus_modem_location_get_location (skeleton),
location_3gpp, location_3gpp,
NULL, NULL)); NULL, NULL,
NULL));
} }
void void
@@ -367,6 +391,64 @@ mm_iface_modem_location_3gpp_clear (MMIfaceModemLocation *self)
/*****************************************************************************/ /*****************************************************************************/
static void
notify_cdma_bs_location_update (MMIfaceModemLocation *self,
MmGdbusModemLocation *skeleton,
MMLocationCdmaBs *location_cdma_bs)
{
const gchar *dbus_path;
dbus_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (self));
mm_info ("Modem %s: CDMA BS location updated "
"(Longitude: '%lf', Latitude: '%lf')",
dbus_path,
mm_location_cdma_bs_get_longitude (location_cdma_bs),
mm_location_cdma_bs_get_latitude (location_cdma_bs));
/* We only update the property if we are supposed to signal
* location */
if (mm_gdbus_modem_location_get_signals_location (skeleton))
mm_gdbus_modem_location_set_location (
skeleton,
build_location_dictionary (mm_gdbus_modem_location_get_location (skeleton),
NULL,
NULL, NULL,
location_cdma_bs));
}
void
mm_iface_modem_location_cdma_bs_update (MMIfaceModemLocation *self,
gdouble longitude,
gdouble latitude)
{
MmGdbusModemLocation *skeleton;
LocationContext *ctx;
ctx = get_location_context (self);
g_object_get (self,
MM_IFACE_MODEM_LOCATION_DBUS_SKELETON, &skeleton,
NULL);
if (!skeleton)
return;
if (mm_gdbus_modem_location_get_enabled (skeleton) & MM_MODEM_LOCATION_SOURCE_CDMA_BS) {
if (mm_location_cdma_bs_set (ctx->location_cdma_bs, longitude, latitude))
notify_cdma_bs_location_update (self, skeleton, ctx->location_cdma_bs);
}
g_object_unref (skeleton);
}
void
mm_iface_modem_location_cdma_bs_clear (MMIfaceModemLocation *self)
{
mm_iface_modem_location_cdma_bs_update (self,
MM_LOCATION_LONGITUDE_UNKNOWN,
MM_LOCATION_LATITUDE_UNKNOWN);
}
/*****************************************************************************/
static void static void
update_location_source_status (MMIfaceModemLocation *self, update_location_source_status (MMIfaceModemLocation *self,
MMModemLocationSource source, MMModemLocationSource source,
@@ -414,6 +496,13 @@ update_location_source_status (MMIfaceModemLocation *self,
} else } else
g_clear_object (&ctx->location_gps_raw); g_clear_object (&ctx->location_gps_raw);
break; break;
case MM_MODEM_LOCATION_SOURCE_CDMA_BS:
if (enabled) {
if (!ctx->location_cdma_bs)
ctx->location_cdma_bs = mm_location_cdma_bs_new ();
} else
g_clear_object (&ctx->location_cdma_bs);
break;
default: default:
break; break;
} }
@@ -521,7 +610,7 @@ setup_gathering_step (SetupGatheringContext *ctx)
return; return;
} }
while (ctx->current <= MM_MODEM_LOCATION_SOURCE_GPS_NMEA) { while (ctx->current <= MM_MODEM_LOCATION_SOURCE_CDMA_BS) {
gchar *source_str; gchar *source_str;
if (ctx->to_enable & ctx->current) { if (ctx->to_enable & ctx->current) {
@@ -618,7 +707,7 @@ setup_gathering (MMIfaceModemLocation *self,
/* Loop through all known bits in the bitmask to enable/disable specific location sources */ /* Loop through all known bits in the bitmask to enable/disable specific location sources */
for (source = MM_MODEM_LOCATION_SOURCE_3GPP_LAC_CI; for (source = MM_MODEM_LOCATION_SOURCE_3GPP_LAC_CI;
source <= MM_MODEM_LOCATION_SOURCE_GPS_NMEA; source <= MM_MODEM_LOCATION_SOURCE_CDMA_BS;
source = source << 1) { source = source << 1) {
/* skip unsupported sources */ /* skip unsupported sources */
if (!(mm_gdbus_modem_location_get_capabilities (ctx->skeleton) & source)) if (!(mm_gdbus_modem_location_get_capabilities (ctx->skeleton) & source))
@@ -752,11 +841,12 @@ handle_setup_auth_ready (MMBaseModem *self,
build_location_dictionary (mm_gdbus_modem_location_get_location (ctx->skeleton), build_location_dictionary (mm_gdbus_modem_location_get_location (ctx->skeleton),
location_ctx->location_3gpp, location_ctx->location_3gpp,
location_ctx->location_gps_nmea, location_ctx->location_gps_nmea,
location_ctx->location_gps_raw)); location_ctx->location_gps_raw,
location_ctx->location_cdma_bs));
else else
mm_gdbus_modem_location_set_location ( mm_gdbus_modem_location_set_location (
ctx->skeleton, ctx->skeleton,
build_location_dictionary (NULL, NULL, NULL, NULL)); build_location_dictionary (NULL, NULL, NULL, NULL, NULL));
} }
str = mm_modem_location_source_build_string_from_mask (ctx->sources); str = mm_modem_location_source_build_string_from_mask (ctx->sources);
@@ -847,7 +937,8 @@ handle_get_location_auth_ready (MMBaseModem *self,
build_location_dictionary (NULL, build_location_dictionary (NULL,
location_ctx->location_3gpp, location_ctx->location_3gpp,
location_ctx->location_gps_nmea, location_ctx->location_gps_nmea,
location_ctx->location_gps_raw)); location_ctx->location_gps_raw,
location_ctx->location_cdma_bs));
handle_get_location_context_free (ctx); handle_get_location_context_free (ctx);
} }
@@ -1067,8 +1158,7 @@ interface_enabling_step (EnablingContext *ctx)
case ENABLING_STEP_ENABLE_GATHERING: { case ENABLING_STEP_ENABLE_GATHERING: {
MMModemLocationSource default_sources; MMModemLocationSource default_sources;
/* By default, we'll enable all NON-GPS sources /* By default, we'll enable all NON-GPS sources */
* (so, only 3GPP-LAC-CI if available) */
default_sources = mm_gdbus_modem_location_get_capabilities (ctx->skeleton); default_sources = mm_gdbus_modem_location_get_capabilities (ctx->skeleton);
default_sources &= ~(MM_MODEM_LOCATION_SOURCE_GPS_RAW | MM_MODEM_LOCATION_SOURCE_GPS_NMEA); default_sources &= ~(MM_MODEM_LOCATION_SOURCE_GPS_RAW | MM_MODEM_LOCATION_SOURCE_GPS_NMEA);
@@ -1282,7 +1372,7 @@ mm_iface_modem_location_initialize (MMIfaceModemLocation *self,
mm_gdbus_modem_location_set_enabled (skeleton, MM_MODEM_LOCATION_SOURCE_NONE); mm_gdbus_modem_location_set_enabled (skeleton, MM_MODEM_LOCATION_SOURCE_NONE);
mm_gdbus_modem_location_set_signals_location (skeleton, FALSE); mm_gdbus_modem_location_set_signals_location (skeleton, FALSE);
mm_gdbus_modem_location_set_location (skeleton, mm_gdbus_modem_location_set_location (skeleton,
build_location_dictionary (NULL, NULL, NULL, NULL)); build_location_dictionary (NULL, NULL, NULL, NULL, NULL));
g_object_set (self, g_object_set (self,
MM_IFACE_MODEM_LOCATION_DBUS_SKELETON, skeleton, MM_IFACE_MODEM_LOCATION_DBUS_SKELETON, skeleton,

View File

@@ -104,6 +104,12 @@ void mm_iface_modem_location_3gpp_update_lac_ci (MMIfaceModemLocation *self,
void mm_iface_modem_location_gps_update (MMIfaceModemLocation *self, void mm_iface_modem_location_gps_update (MMIfaceModemLocation *self,
const gchar *nmea_trace); const gchar *nmea_trace);
/* Update CDMA BS location */
void mm_iface_modem_location_cdma_bs_update (MMIfaceModemLocation *self,
gdouble longitude,
gdouble latitude);
void mm_iface_modem_location_cdma_bs_clear (MMIfaceModemLocation *self);
/* Bind properties for simple GetStatus() */ /* Bind properties for simple GetStatus() */
void mm_iface_modem_location_bind_simple_status (MMIfaceModemLocation *self, void mm_iface_modem_location_bind_simple_status (MMIfaceModemLocation *self,
MMSimpleStatus *status); MMSimpleStatus *status);