iface-modem-location: implement handling the CDMA BS location source
This commit is contained in:
@@ -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,
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user