[PATCH 3/5] cinterion: setup GPS port only if GPS support detected

Aleksander Morgado aleksander at aleksander.es
Tue May 30 19:41:00 UTC 2017


On 17/05/17 15:24, Aleksander Morgado wrote:
> i.e. if AT^SGPSS not supported, we don't even add traces handler to
> the GPS data port.
> ---

This has been merged to git master.

>  plugins/cinterion/mm-broadband-modem-cinterion.c   |  14 ---
>  .../cinterion/mm-broadband-modem-qmi-cinterion.c   |  16 ----
>  plugins/cinterion/mm-common-cinterion.c            | 103 ++++++++++-----------
>  plugins/cinterion/mm-common-cinterion.h            |   2 -
>  4 files changed, 47 insertions(+), 88 deletions(-)
> 
> diff --git a/plugins/cinterion/mm-broadband-modem-cinterion.c b/plugins/cinterion/mm-broadband-modem-cinterion.c
> index 4a4e18bf..fc9a3356 100644
> --- a/plugins/cinterion/mm-broadband-modem-cinterion.c
> +++ b/plugins/cinterion/mm-broadband-modem-cinterion.c
> @@ -1586,18 +1586,6 @@ after_sim_unlock (MMIfaceModem *self,
>  }
>  
>  /*****************************************************************************/
> -/* Setup ports (Broadband modem class) */
> -
> -static void
> -setup_ports (MMBroadbandModem *self)
> -{
> -    /* Call parent's setup ports first always */
> -    MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_cinterion_parent_class)->setup_ports (self);
> -
> -    mm_common_cinterion_setup_gps_port (self);
> -}
> -
> -/*****************************************************************************/
>  /* Create Bearer (Modem interface) */
>  
>  typedef struct {
> @@ -1868,11 +1856,9 @@ static void
>  mm_broadband_modem_cinterion_class_init (MMBroadbandModemCinterionClass *klass)
>  {
>      GObjectClass *object_class = G_OBJECT_CLASS (klass);
> -    MMBroadbandModemClass *broadband_modem_class = MM_BROADBAND_MODEM_CLASS (klass);
>  
>      g_type_class_add_private (object_class, sizeof (MMBroadbandModemCinterionPrivate));
>  
>      /* Virtual methods */
>      object_class->finalize = finalize;
> -    broadband_modem_class->setup_ports = setup_ports;
>  }
> diff --git a/plugins/cinterion/mm-broadband-modem-qmi-cinterion.c b/plugins/cinterion/mm-broadband-modem-qmi-cinterion.c
> index 05f92e4f..2410d091 100644
> --- a/plugins/cinterion/mm-broadband-modem-qmi-cinterion.c
> +++ b/plugins/cinterion/mm-broadband-modem-qmi-cinterion.c
> @@ -35,18 +35,6 @@ G_DEFINE_TYPE_EXTENDED (MMBroadbandModemQmiCinterion, mm_broadband_modem_qmi_cin
>                          G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_LOCATION, iface_modem_location_init))
>  
>  /*****************************************************************************/
> -/* Setup ports (Broadband modem class) */
> -
> -static void
> -setup_ports (MMBroadbandModem *self)
> -{
> -    /* Call parent's setup ports first always */
> -    MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_qmi_cinterion_parent_class)->setup_ports (self);
> -
> -    mm_common_cinterion_setup_gps_port (self);
> -}
> -
> -/*****************************************************************************/
>  
>  MMBroadbandModemQmiCinterion *
>  mm_broadband_modem_qmi_cinterion_new (const gchar *device,
> @@ -85,8 +73,4 @@ iface_modem_location_init (MMIfaceModemLocation *iface)
>  static void
>  mm_broadband_modem_qmi_cinterion_class_init (MMBroadbandModemQmiCinterionClass *klass)
>  {
> -    MMBroadbandModemClass *broadband_modem_class = MM_BROADBAND_MODEM_CLASS (klass);
> -
> -    /* Virtual methods */
> -    broadband_modem_class->setup_ports = setup_ports;
>  }
> diff --git a/plugins/cinterion/mm-common-cinterion.c b/plugins/cinterion/mm-common-cinterion.c
> index 91af530f..ce337bd9 100644
> --- a/plugins/cinterion/mm-common-cinterion.c
> +++ b/plugins/cinterion/mm-common-cinterion.c
> @@ -16,6 +16,7 @@
>  
>  #include "mm-common-cinterion.h"
>  #include "mm-base-modem-at.h"
> +#include "mm-log.h"
>  
>  static MMIfaceModemLocation *iface_modem_location_parent;
>  
> @@ -70,6 +71,38 @@ get_location_context (MMBaseModem *self)
>  }
>  
>  /*****************************************************************************/
> +/* GPS trace received */
> +
> +static void
> +trace_received (MMPortSerialGps *port,
> +                const gchar *trace,
> +                MMIfaceModemLocation *self)
> +{
> +    /* Helper to debug GPS location related issues. Don't depend on a real GPS
> +     * fix for debugging, just use some random values to update */
> +#if 0
> +    if (g_str_has_prefix (trace, "$GPGGA")) {
> +        GString *str;
> +        GDateTime *now;
> +
> +        now = g_date_time_new_now_utc ();
> +        str = g_string_new ("");
> +        g_string_append_printf (str,
> +                                "$GPGGA,%02u%02u%02u,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47",
> +                                g_date_time_get_hour (now),
> +                                g_date_time_get_minute (now),
> +                                g_date_time_get_second (now));
> +        mm_iface_modem_location_gps_update (self, str->str);
> +        g_string_free (str, TRUE);
> +        g_date_time_unref (now);
> +        return;
> +    }
> +#endif
> +
> +    mm_iface_modem_location_gps_update (self, trace);
> +}
> +
> +/*****************************************************************************/
>  /* Location capabilities loading (Location interface) */
>  
>  typedef struct {
> @@ -107,8 +140,15 @@ sgpss_test_ready (MMBaseModem  *self,
>      location_ctx = get_location_context (self);
>      if (!mm_base_modem_at_command_finish (self, res, NULL))
>          location_ctx->sgpss_support = FEATURE_NOT_SUPPORTED;
> -    else
> +    else {
> +        /* ^SGPSS supported! */
>          location_ctx->sgpss_support = FEATURE_SUPPORTED;
> +        /* It may happen that the modem was started with GPS already enabled, or
> +         * maybe ModemManager got rebooted and it was left enabled before. We'll
> +         * make sure that it is disabled when we initialize the modem. */
> +        mm_base_modem_at_command (MM_BASE_MODEM (self), "AT^SGPSS=0", 3, FALSE, NULL, NULL);
> +    }
> +
>      probe_gps_features (task);
>  }
>  
> @@ -135,6 +175,12 @@ probe_gps_features (GTask *task)
>          ctx->sources |= (MM_MODEM_LOCATION_SOURCE_GPS_NMEA |
>                           MM_MODEM_LOCATION_SOURCE_GPS_RAW  |
>                           MM_MODEM_LOCATION_SOURCE_GPS_UNMANAGED);
> +
> +        /* Add handler for the NMEA traces in the GPS data port */
> +        mm_port_serial_gps_add_trace_handler (mm_base_modem_peek_port_gps (MM_BASE_MODEM (self)),
> +                                              (MMPortSerialGpsTraceFn)trace_received,
> +                                              self,
> +                                              NULL);
>      } else
>          mm_dbg ("No GPS command supported: no GPS capabilities");
>  
> @@ -569,61 +615,6 @@ mm_common_cinterion_enable_location_gathering (MMIfaceModemLocation *self,
>  }
>  
>  /*****************************************************************************/
> -/* Setup ports (Broadband modem class) */
> -
> -static void
> -trace_received (MMPortSerialGps *port,
> -                const gchar *trace,
> -                MMIfaceModemLocation *self)
> -{
> -    /* Helper to debug GPS location related issues. Don't depend on a real GPS
> -     * fix for debugging, just use some random values to update */
> -#if 0
> -    if (g_str_has_prefix (trace, "$GPGGA")) {
> -        GString *str;
> -        GDateTime *now;
> -
> -        now = g_date_time_new_now_utc ();
> -        str = g_string_new ("");
> -        g_string_append_printf (str,
> -                                "$GPGGA,%02u%02u%02u,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47",
> -                                g_date_time_get_hour (now),
> -                                g_date_time_get_minute (now),
> -                                g_date_time_get_second (now));
> -        mm_iface_modem_location_gps_update (self, str->str);
> -        g_string_free (str, TRUE);
> -        g_date_time_unref (now);
> -        return;
> -    }
> -#endif
> -
> -    mm_iface_modem_location_gps_update (self, trace);
> -}
> -
> -void
> -mm_common_cinterion_setup_gps_port (MMBroadbandModem *self)
> -{
> -    MMPortSerialGps *gps_data_port;
> -
> -    gps_data_port = mm_base_modem_peek_port_gps (MM_BASE_MODEM (self));
> -    if (gps_data_port) {
> -        /* It may happen that the modem was started with GPS already enabled, or
> -         * maybe ModemManager got rebooted and it was left enabled before. We'll make
> -         * sure that it is disabled when we initialize the modem */
> -        mm_base_modem_at_command_full (MM_BASE_MODEM (self),
> -                                       mm_base_modem_peek_best_at_port (MM_BASE_MODEM (self), NULL),
> -                                       "AT^SGPSS=0",
> -                                       3, FALSE, FALSE, NULL, NULL, NULL);
> -
> -        /* Add handler for the NMEA traces */
> -        mm_port_serial_gps_add_trace_handler (gps_data_port,
> -                                              (MMPortSerialGpsTraceFn)trace_received,
> -                                              self,
> -                                              NULL);
> -    }
> -}
> -
> -/*****************************************************************************/
>  
>  void
>  mm_common_cinterion_peek_parent_location_interface (MMIfaceModemLocation *iface)
> diff --git a/plugins/cinterion/mm-common-cinterion.h b/plugins/cinterion/mm-common-cinterion.h
> index 02b01751..47a4a97d 100644
> --- a/plugins/cinterion/mm-common-cinterion.h
> +++ b/plugins/cinterion/mm-common-cinterion.h
> @@ -44,8 +44,6 @@ gboolean              mm_common_cinterion_disable_location_gathering_finish (MMI
>                                                                               GAsyncResult *res,
>                                                                               GError **error);
>  
> -void                  mm_common_cinterion_setup_gps_port                    (MMBroadbandModem *self);
> -
>  void                  mm_common_cinterion_peek_parent_location_interface    (MMIfaceModemLocation *iface);
>  
>  #endif  /* MM_COMMON_CINTERION_H */
> 


-- 
Aleksander
https://aleksander.es


More information about the ModemManager-devel mailing list