/** * cd_sensor_unlock_cb: **/ static void cd_sensor_unlock_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { CdSensor *sensor = CD_SENSOR (source_object); CdSensorPrivate *priv = GET_PRIVATE (sensor); GDBusMethodInvocation *invocation = (GDBusMethodInvocation *) user_data; gboolean ret; g_autoptr(GError) error = NULL; /* set here to avoid every sensor doing this */ cd_sensor_set_state (sensor, CD_SENSOR_STATE_IDLE); /* get the result */ if (priv->desc != NULL && priv->desc->unlock_finish != NULL) { ret = priv->desc->unlock_finish (sensor, res, &error); if (!ret) { g_dbus_method_invocation_return_error (invocation, CD_SENSOR_ERROR, CD_SENSOR_ERROR_NO_SUPPORT, "failed to unlock: %s", error->message); return; } } cd_sensor_set_locked (sensor, FALSE); g_dbus_method_invocation_return_value (invocation, NULL); }
/** * cd_sensor_unlock_quietly_cb: **/ static void cd_sensor_unlock_quietly_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { CdSensor *sensor = CD_SENSOR (source_object); CdSensorPrivate *priv = GET_PRIVATE (sensor); gboolean ret; g_autoptr(GError) error = NULL; /* set here to avoid every sensor doing this */ cd_sensor_set_state (sensor, CD_SENSOR_STATE_IDLE); /* get the result */ if (priv->desc != NULL && priv->desc->unlock_finish != NULL) { ret = priv->desc->unlock_finish (sensor, res, &error); if (!ret) { g_warning ("failed to unlock: %s", error->message); return; } } cd_sensor_set_locked (sensor, FALSE); }
/** * cd_sensor_get_sample_cb: **/ static void cd_sensor_get_sample_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { GVariant *result = NULL; g_autoptr(CdColorXYZ) sample = NULL; CdSensor *sensor = CD_SENSOR (source_object); CdSensorPrivate *priv = GET_PRIVATE (sensor); GDBusMethodInvocation *invocation = (GDBusMethodInvocation *) user_data; g_autoptr(GError) error = NULL; /* set here to avoid every sensor doing this */ cd_sensor_set_state (sensor, CD_SENSOR_STATE_IDLE); /* get the result */ sample = priv->desc->get_sample_finish (sensor, res, &error); if (sample == NULL) { g_dbus_method_invocation_return_gerror (invocation, error); return; } /* return value */ g_debug ("returning value %f, %f, %f", sample->X, sample->Y, sample->Z); result = g_variant_new ("(ddd)", sample->X, sample->Y, sample->Z); g_dbus_method_invocation_return_value (invocation, result); }
/** * cd_sensor_set_state_in_idle_cb: **/ static gboolean cd_sensor_set_state_in_idle_cb (gpointer user_data) { CdSensorIdleHelper *helper = (CdSensorIdleHelper *) user_data; CdSensorPrivate *priv = GET_PRIVATE (helper->sensor); /* this is us */ priv->set_state_id = 0; /* set state now */ cd_sensor_set_state (helper->sensor, helper->state); g_object_unref (helper->sensor); g_free (helper); return G_SOURCE_REMOVE; }
/** * cd_sensor_get_spectrum_cb: **/ static void cd_sensor_get_spectrum_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { CdSensor *sensor = CD_SENSOR (source_object); CdSensorPrivate *priv = GET_PRIVATE (sensor); GDBusMethodInvocation *invocation = (GDBusMethodInvocation *) user_data; GVariant *result = NULL; GVariantBuilder data; guint i; g_autoptr(CdSpectrum) sp = NULL; g_autoptr(GError) error = NULL; /* set here to avoid every sensor doing this */ cd_sensor_set_state (sensor, CD_SENSOR_STATE_IDLE); /* get the result */ sp = priv->desc->get_spectrum_finish (sensor, res, &error); if (sp == NULL) { g_dbus_method_invocation_return_gerror (invocation, error); return; } /* build data array */ g_variant_builder_init (&data, G_VARIANT_TYPE ("ad")); for (i = 0; i < cd_spectrum_get_size (sp); i++) { g_variant_builder_add (&data, "d", cd_spectrum_get_value (sp, i)); } /* return value */ g_debug ("returning value %f, %f, [%u]", cd_spectrum_get_start (sp), cd_spectrum_get_end (sp), cd_spectrum_get_size (sp)); result = g_variant_new ("(ddad)", cd_spectrum_get_start (sp), cd_spectrum_get_end (sp), &data); g_dbus_method_invocation_return_value (invocation, result); }
void cd_sensor_get_sample_async (CdSensor *sensor, CdSensorCap cap, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { g_autoptr(GTask) task = NULL; g_return_if_fail (CD_IS_SENSOR (sensor)); task = g_task_new (sensor, cancellable, callback, user_data); /* set state */ cd_sensor_set_state (sensor, CD_SENSOR_STATE_MEASURING); /* just complete in idle */ if (cap != CD_SENSOR_CAP_AMBIENT) g_timeout_add_seconds (2, (GSourceFunc) cd_sensor_get_sample_wait_cb, task); else g_timeout_add_seconds (2, (GSourceFunc) cd_sensor_get_ambient_wait_cb, task); }
void cd_sensor_get_sample_async (CdSensor *sensor, CdSensorCap cap, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { CdSensorArgyllPrivate *priv = cd_sensor_argyll_get_private (sensor); CdSensorTaskData *data; GTask *task = NULL; const gchar *envp[] = { "ARGYLL_NOT_INTERACTIVE=1", NULL }; gboolean ret; g_autoptr(GError) error = NULL; g_autoptr(GPtrArray) argv = NULL; g_return_if_fail (CD_IS_SENSOR (sensor)); task = g_task_new (sensor, cancellable, callback, user_data); /* set state */ data = g_new0 (CdSensorTaskData, 1); data->sensor = g_object_ref (sensor); g_task_set_task_data (task, data, (GDestroyNotify) cd_sensor_task_data_free); /* set state */ cd_sensor_set_state (sensor, CD_SENSOR_STATE_MEASURING); /* connect before spotread produces values */ data->exit_id = g_signal_connect (priv->spawn, "exit", G_CALLBACK (cd_sensor_get_sample_exit_cb), task); data->stdout_id = g_signal_connect (priv->spawn, "stdout", G_CALLBACK (cd_sensor_get_sample_stdout_cb), task); /* if spotread is not already running then execute */ if (!cd_spawn_is_running (priv->spawn)) { argv = g_ptr_array_new_with_free_func (g_free); g_ptr_array_add (argv, g_strdup ("/usr/bin/spotread")); g_ptr_array_add (argv, g_strdup ("-d")); g_ptr_array_add (argv, g_strdup_printf ("-c%i", priv->communication_port)); g_ptr_array_add (argv, g_strdup ("-N")); //no autocal g_ptr_array_add (argv, g_strdup (cd_sensor_get_y_arg_for_cap (cap))); g_ptr_array_add (argv, NULL); ret = cd_spawn_argv (priv->spawn, (gchar **) argv->pdata, (gchar **) envp, &error); if (!ret) { g_task_return_new_error (task, CD_SENSOR_ERROR, CD_SENSOR_ERROR_INTERNAL, "%s", error->message); return; } } else { cd_spawn_send_stdin (priv->spawn, ""); } /* cover the case where spotread crashes */ data->timeout_id = g_timeout_add (CD_SENSOR_ARGYLL_MAX_SAMPLE_TIME, (GSourceFunc) cd_sensor_get_sample_timeout_cb, task); }