aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-base-modem.c66
-rw-r--r--src/mm-base-modem.h28
-rw-r--r--src/mm-port.h3
3 files changed, 79 insertions, 18 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c
index 8490651f..3aae6310 100644
--- a/src/mm-base-modem.c
+++ b/src/mm-base-modem.c
@@ -79,6 +79,11 @@ struct _MMBaseModemPrivate {
MMAtSerialPort *secondary;
MMQcdmSerialPort *qcdm;
MMPort *data;
+
+ /* GPS-enabled modems will have an AT port for control, and a raw serial
+ * port to receive all GPS traces */
+ MMAtSerialPort *gps_control;
+ MMSerialPort *gps;
};
static gchar *
@@ -197,6 +202,9 @@ mm_base_modem_grab_port (MMBaseModem *self,
mm_serial_parser_v1_destroy);
/* Store flags already */
mm_at_serial_port_set_flags (MM_AT_SERIAL_PORT (port), at_pflags);
+ } else if (ptype == MM_PORT_TYPE_GPS) {
+ /* Raw GPS port */
+ port = MM_PORT (mm_serial_port_new (name, MM_PORT_TYPE_GPS));
} else {
g_set_error (error,
MM_CORE_ERROR,
@@ -447,6 +455,38 @@ mm_base_modem_peek_port_qcdm (MMBaseModem *self)
return self->priv->qcdm;
}
+MMAtSerialPort *
+mm_base_modem_get_port_gps_control (MMBaseModem *self)
+{
+ g_return_val_if_fail (MM_IS_BASE_MODEM (self), NULL);
+
+ return (self->priv->gps_control ? g_object_ref (self->priv->gps_control) : NULL);
+}
+
+MMAtSerialPort *
+mm_base_modem_peek_port_gps_control (MMBaseModem *self)
+{
+ g_return_val_if_fail (MM_IS_BASE_MODEM (self), NULL);
+
+ return self->priv->gps_control;
+}
+
+MMSerialPort *
+mm_base_modem_get_port_gps (MMBaseModem *self)
+{
+ g_return_val_if_fail (MM_IS_BASE_MODEM (self), NULL);
+
+ return (self->priv->gps ? g_object_ref (self->priv->gps) : NULL);
+}
+
+MMSerialPort *
+mm_base_modem_peek_port_gps (MMBaseModem *self)
+{
+ g_return_val_if_fail (MM_IS_BASE_MODEM (self), NULL);
+
+ return self->priv->gps;
+}
+
MMPort *
mm_base_modem_get_best_data_port (MMBaseModem *self)
{
@@ -570,6 +610,8 @@ mm_base_modem_organize_ports (MMBaseModem *self,
MMAtSerialPort *secondary = NULL;
MMAtSerialPort *backup_secondary = NULL;
MMQcdmSerialPort *qcdm = NULL;
+ MMAtSerialPort *gps_control = NULL;
+ MMSerialPort *gps = NULL;
MMPort *data = NULL;
g_return_val_if_fail (MM_IS_BASE_MODEM (self), FALSE);
@@ -607,6 +649,11 @@ mm_base_modem_organize_ports (MMBaseModem *self,
secondary = MM_AT_SERIAL_PORT (candidate);
}
+ if (flags & MM_AT_PORT_FLAG_GPS_CONTROL) {
+ if (!gps_control)
+ gps_control = MM_AT_SERIAL_PORT (candidate);
+ }
+
/* Fallback secondary */
if (flags == MM_AT_PORT_FLAG_NONE) {
if (!secondary)
@@ -628,6 +675,11 @@ mm_base_modem_organize_ports (MMBaseModem *self,
data = candidate;
break;
+ case MM_PORT_TYPE_GPS:
+ if (!gps)
+ gps = MM_SERIAL_PORT (candidate);
+ break;
+
default:
/* Ignore port */
break;
@@ -674,16 +726,20 @@ mm_base_modem_organize_ports (MMBaseModem *self,
mm_at_serial_port_set_flags (MM_AT_SERIAL_PORT (data), flags | MM_AT_PORT_FLAG_PPP);
}
- log_port (self, MM_PORT (primary), "primary");
- log_port (self, MM_PORT (secondary), "secondary");
- log_port (self, MM_PORT (data), "data");
- log_port (self, MM_PORT (qcdm), "qcdm");
+ log_port (self, MM_PORT (primary), "primary");
+ log_port (self, MM_PORT (secondary), "secondary");
+ log_port (self, MM_PORT (data), "data");
+ log_port (self, MM_PORT (qcdm), "qcdm");
+ log_port (self, MM_PORT (gps_control), "gps control");
+ log_port (self, MM_PORT (gps), "gps");
/* We keep new refs to the objects here */
self->priv->primary = g_object_ref (primary);
self->priv->secondary = (secondary ? g_object_ref (secondary) : NULL);
self->priv->data = g_object_ref (data);
self->priv->qcdm = (qcdm ? g_object_ref (qcdm) : NULL);
+ self->priv->gps_control = (gps_control ? g_object_ref (gps_control) : NULL);
+ self->priv->gps = (gps ? g_object_ref (gps) : NULL);
/* As soon as we get the ports organized, we initialize the modem */
mm_base_modem_initialize (self,
@@ -951,6 +1007,8 @@ dispose (GObject *object)
g_clear_object (&self->priv->secondary);
g_clear_object (&self->priv->data);
g_clear_object (&self->priv->qcdm);
+ g_clear_object (&self->priv->gps_control);
+ g_clear_object (&self->priv->gps);
if (self->priv->ports) {
g_hash_table_destroy (self->priv->ports);
diff --git a/src/mm-base-modem.h b/src/mm-base-modem.h
index b4c5fb6f..415b8ab5 100644
--- a/src/mm-base-modem.h
+++ b/src/mm-base-modem.h
@@ -110,19 +110,21 @@ gboolean mm_base_modem_has_at_port (MMBaseModem *self);
gboolean mm_base_modem_organize_ports (MMBaseModem *self,
GError **error);
-MMAtSerialPort *mm_base_modem_peek_port_primary (MMBaseModem *self);
-MMAtSerialPort *mm_base_modem_peek_port_secondary (MMBaseModem *self);
-MMQcdmSerialPort *mm_base_modem_peek_port_qcdm (MMBaseModem *self);
-MMAtSerialPort *mm_base_modem_peek_best_at_port (MMBaseModem *self,
- GError **error);
-MMPort *mm_base_modem_peek_best_data_port (MMBaseModem *self);
-
-MMAtSerialPort *mm_base_modem_get_port_primary (MMBaseModem *self);
-MMAtSerialPort *mm_base_modem_get_port_secondary (MMBaseModem *self);
-MMQcdmSerialPort *mm_base_modem_get_port_qcdm (MMBaseModem *self);
-MMAtSerialPort *mm_base_modem_get_best_at_port (MMBaseModem *self,
- GError **error);
-MMPort *mm_base_modem_get_best_data_port (MMBaseModem *self);
+MMAtSerialPort *mm_base_modem_peek_port_primary (MMBaseModem *self);
+MMAtSerialPort *mm_base_modem_peek_port_secondary (MMBaseModem *self);
+MMQcdmSerialPort *mm_base_modem_peek_port_qcdm (MMBaseModem *self);
+MMAtSerialPort *mm_base_modem_peek_port_gps_control (MMBaseModem *self);
+MMSerialPort *mm_base_modem_peek_port_gps (MMBaseModem *self);
+MMAtSerialPort *mm_base_modem_peek_best_at_port (MMBaseModem *self, GError **error);
+MMPort *mm_base_modem_peek_best_data_port (MMBaseModem *self);
+
+MMAtSerialPort *mm_base_modem_get_port_primary (MMBaseModem *self);
+MMAtSerialPort *mm_base_modem_get_port_secondary (MMBaseModem *self);
+MMQcdmSerialPort *mm_base_modem_get_port_qcdm (MMBaseModem *self);
+MMAtSerialPort *mm_base_modem_get_port_gps_control (MMBaseModem *self);
+MMSerialPort *mm_base_modem_get_port_gps (MMBaseModem *self);
+MMAtSerialPort *mm_base_modem_get_best_at_port (MMBaseModem *self, GError **error);
+MMPort *mm_base_modem_get_best_data_port (MMBaseModem *self);
void mm_base_modem_set_valid (MMBaseModem *self,
gboolean valid);
diff --git a/src/mm-port.h b/src/mm-port.h
index 2edd7094..539f1a11 100644
--- a/src/mm-port.h
+++ b/src/mm-port.h
@@ -33,8 +33,9 @@ typedef enum { /*< underscore_name=mm_port_type >*/
MM_PORT_TYPE_NET,
MM_PORT_TYPE_AT,
MM_PORT_TYPE_QCDM,
+ MM_PORT_TYPE_GPS,
- MM_PORT_TYPE_LAST = MM_PORT_TYPE_QCDM /*< skip >*/
+ MM_PORT_TYPE_LAST = MM_PORT_TYPE_GPS /*< skip >*/
} MMPortType;
#define MM_TYPE_PORT (mm_port_get_type ())