aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-04-13 16:17:55 +0200
committerAleksander Morgado <aleksander@lanedo.com>2013-04-17 15:19:40 +0200
commit916dc3466f10e706e0e73f0c9e8864f7571dacb7 (patch)
tree11e72daebda15d0f4096633de4e848bb8a9d76b7
parent10f2cdebcb23e608d41d4fceea0abe4e5b74b795 (diff)
broadband-modem-mbim: implement signal quality updates
-rw-r--r--src/mm-broadband-modem-mbim.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index cc55fc2c..f7d40b61 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -1473,6 +1473,148 @@ setup_unsolicited_events (MMIfaceModem3gpp *self,
}
/*****************************************************************************/
+/* Enable/Disable unsolicited events */
+
+static gboolean
+common_enable_disable_unsolicited_events_finish (MMIfaceModem3gpp *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error);
+}
+
+static void
+disable_signal_state_set_ready_cb (MbimDevice *device,
+ GAsyncResult *res,
+ GSimpleAsyncResult *simple)
+{
+ MbimMessage *response;
+ GError *error = NULL;
+
+ response = mbim_device_command_finish (device, res, &error);
+ if (response)
+ mbim_message_command_done_get_result (response, &error);
+
+ if (error)
+ g_simple_async_result_take_error (simple, error);
+ else
+ g_simple_async_result_set_op_res_gboolean (simple, TRUE);
+
+ if (response)
+ mbim_message_unref (response);
+ g_simple_async_result_complete (simple);
+ g_object_unref (simple);
+}
+
+static void
+enable_signal_state_set_ready_cb (MbimDevice *device,
+ GAsyncResult *res,
+ GSimpleAsyncResult *simple)
+{
+ MbimMessage *response;
+ GError *error = NULL;
+ guint32 rssi;
+
+ response = mbim_device_command_finish (device, res, &error);
+ if (response &&
+ mbim_message_command_done_get_result (response, &error) &&
+ mbim_message_signal_state_response_parse (
+ response,
+ &rssi,
+ NULL, /* error_rate */
+ NULL, /* signal_strength_interval */
+ NULL, /* rssi_threshold */
+ NULL, /* error_rate_threshold */
+ &error)) {
+ guint32 quality;
+ GObject *self;
+
+ /* Normalize the quality. 99 means unknown, we default it to 0 */
+ quality = CLAMP (rssi == 99 ? 0 : rssi, 0, 31) * 100 / 31;
+ mm_dbg ("Initial signal state: %u --> %u%%", rssi, quality);
+
+ self = g_async_result_get_source_object (G_ASYNC_RESULT (simple));
+ mm_iface_modem_update_signal_quality (MM_IFACE_MODEM (self), quality);
+ g_object_unref (self);
+
+ g_simple_async_result_set_op_res_gboolean (simple, TRUE);
+ } else
+ g_simple_async_result_take_error (simple, error);
+
+ if (response)
+ mbim_message_unref (response);
+ g_simple_async_result_complete (simple);
+ g_object_unref (simple);
+}
+
+static void
+common_enable_disable_unsolicited_events (MMIfaceModem3gpp *_self,
+ gboolean enable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ MMBroadbandModemMbim *self = MM_BROADBAND_MODEM_MBIM (_self);
+ MbimDevice *device;
+ GSimpleAsyncResult *result;
+ MbimMessage *message;
+ GAsyncReadyCallback ready_cb;
+
+ if (!peek_device (self, &device, callback, user_data))
+ return;
+
+ result = g_simple_async_result_new (G_OBJECT (self),
+ callback,
+ user_data,
+ common_enable_disable_unsolicited_events);
+
+#define DISABLE_FEATURE G_MAXUINT32
+#define AUTO_FEATURE 0
+
+ if (enable) {
+ ready_cb = (GAsyncReadyCallback)enable_signal_state_set_ready_cb;
+ message = (mbim_message_signal_state_set_new (
+ 30, /* signal_strength_interval */
+ DISABLE_FEATURE, /* rssi_threshold */
+ DISABLE_FEATURE, /* error_rate_threshold */
+ NULL));
+ } else {
+ ready_cb = (GAsyncReadyCallback)disable_signal_state_set_ready_cb;
+ message = (mbim_message_signal_state_set_new (
+ DISABLE_FEATURE, /* signal_strength_interval */
+ DISABLE_FEATURE, /* rssi_threshold */
+ DISABLE_FEATURE, /* error_rate_threshold */
+ NULL));
+ }
+
+#undef DISABLE_FEATURE
+#undef AUTO_FEATURE
+
+ mbim_device_command (device,
+ message,
+ 10,
+ NULL,
+ ready_cb,
+ result);
+ mbim_message_unref (message);
+}
+
+static void
+disable_unsolicited_events (MMIfaceModem3gpp *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ common_enable_disable_unsolicited_events (self, FALSE, callback, user_data);
+}
+
+static void
+enable_unsolicited_events (MMIfaceModem3gpp *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ common_enable_disable_unsolicited_events (self, TRUE, callback, user_data);
+}
+
+/*****************************************************************************/
MMBroadbandModemMbim *
mm_broadband_modem_mbim_new (const gchar *device,
@@ -1559,6 +1701,8 @@ iface_modem_init (MMIfaceModem *iface)
iface->setup_flow_control_finish = NULL;
iface->setup_charset = NULL;
iface->setup_charset_finish = NULL;
+ iface->load_signal_quality = NULL;
+ iface->load_signal_quality_finish = NULL;
/* Create MBIM-specific SIM */
iface->create_sim = create_sim;
@@ -1582,6 +1726,10 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface)
iface->setup_unsolicited_events_finish = common_setup_cleanup_unsolicited_events_finish;
iface->cleanup_unsolicited_events = cleanup_unsolicited_events;
iface->cleanup_unsolicited_events_finish = common_setup_cleanup_unsolicited_events_finish;
+ iface->enable_unsolicited_events = enable_unsolicited_events;
+ iface->enable_unsolicited_events_finish = common_enable_disable_unsolicited_events_finish;
+ iface->disable_unsolicited_events = disable_unsolicited_events;
+ iface->disable_unsolicited_events_finish = common_enable_disable_unsolicited_events_finish;
}
static void