[gnome-color-manager] cm: get the dial position async, not sync



commit 18f16e655b437e657b45c47151a8d412b036e185
Author: Richard Hughes <richard hughsie com>
Date:   Wed Jul 21 16:39:45 2010 +0100

    cm: get the dial position async, not sync

 src/gcm-sensor-colormunki.c |  144 ++++++++++++++++++++++++++++++-------------
 1 files changed, 102 insertions(+), 42 deletions(-)
---
diff --git a/src/gcm-sensor-colormunki.c b/src/gcm-sensor-colormunki.c
index 147ac95..3a7e907 100644
--- a/src/gcm-sensor-colormunki.c
+++ b/src/gcm-sensor-colormunki.c
@@ -48,6 +48,7 @@ static void     gcm_sensor_colormunki_finalize	(GObject     *object);
 struct _GcmSensorColormunkiPrivate
 {
 	struct libusb_transfer		*transfer_interrupt;
+	struct libusb_transfer		*transfer_state;
 	GcmUsb				*usb;
 };
 
@@ -56,6 +57,18 @@ G_DEFINE_TYPE (GcmSensorColormunki, gcm_sensor_colormunki, GCM_TYPE_SENSOR)
 #define COLORMUNKI_VENDOR_ID			0x0971
 #define COLORMUNKI_PRODUCT_ID			0x2007
 
+#define COLORMUNKI_COMMAND_DIAL_ROTATE		0x00
+#define COLORMUNKI_COMMAND_BUTTON_PRESSED	0x01
+#define COLORMUNKI_COMMAND_BUTTON_RELEASED	0x02
+
+#define	COLORMUNKI_BUTTON_STATE_RELEASED	0x00
+#define	COLORMUNKI_BUTTON_STATE_PRESSED		0x01
+
+#define	COLORMUNKI_DIAL_POSITION_PROJECTOR	0x00
+#define	COLORMUNKI_DIAL_POSITION_SPOT		0x01
+#define	COLORMUNKI_DIAL_POSITION_CALIBRATION	0x02
+#define	COLORMUNKI_DIAL_POSITION_AMBIENT	0x03
+
 /**
  * gcm_sensor_colormunki_print_data:
  **/
@@ -79,14 +92,88 @@ gcm_sensor_colormunki_print_data (const gchar *title, const guchar *data, gsize
 	g_print ("%c[%dm\n", 0x1B, 0);
 }
 
-#define COLORMUNKI_COMMAND_DIAL_ROTATE		0x00
-#define COLORMUNKI_COMMAND_BUTTON_PRESSED	0x01
-#define COLORMUNKI_COMMAND_BUTTON_RELEASED	0x02
-
 static void
 gcm_sensor_colormunki_submit_transfer (GcmSensorColormunki *sensor_colormunki);
 
 /**
+ * gcm_sensor_colormunki_refresh_state_transfer_cb:
+ **/
+static void
+gcm_sensor_colormunki_refresh_state_transfer_cb (struct libusb_transfer *transfer)
+{
+//	GcmSensorColormunki *sensor_colormunki = GCM_SENSOR_COLORMUNKI (transfer->user_data);
+	guint8 *reply = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE;
+
+	if (transfer->status != LIBUSB_TRANSFER_COMPLETED) {
+		egg_warning ("did not succeed");
+		return;
+	}
+
+	/*
+	 * Returns:  00 00
+	 *           |/ ||
+	 * dial pos -/  \--- button value
+	 * - 00 = projector
+	 * - 01 = spot
+	 * - 02 = calibration
+	 * - 03 = ambient
+	 */
+	if (reply[0] == COLORMUNKI_DIAL_POSITION_PROJECTOR)
+		egg_debug ("projector");
+	else if (reply[0] == COLORMUNKI_DIAL_POSITION_SPOT)
+		egg_debug ("spot");
+	else if (reply[0] == COLORMUNKI_DIAL_POSITION_CALIBRATION)
+		egg_debug ("calibration");
+	else if (reply[0] == COLORMUNKI_DIAL_POSITION_AMBIENT)
+		egg_debug ("ambient");
+	else
+		egg_warning ("dial position unknown: 0x%02x", reply[0]);
+
+	/* button state */
+	if (reply[1] == COLORMUNKI_BUTTON_STATE_RELEASED) {
+		egg_debug ("button released");
+	} else if (reply[1] == COLORMUNKI_BUTTON_STATE_PRESSED) {
+		egg_debug ("button pressed");
+	} else {
+		egg_warning ("switch state unknown: 0x%02x", reply[1]);
+	}
+
+	gcm_sensor_colormunki_print_data ("reply", reply, transfer->actual_length);
+}
+
+/**
+ * gcm_sensor_colormunki_refresh_state:
+ **/
+static gboolean
+gcm_sensor_colormunki_refresh_state (GcmSensorColormunki *sensor_colormunki, GError **error)
+{
+	gint retval;
+	gboolean ret = FALSE;
+	static guchar request[LIBUSB_CONTROL_SETUP_SIZE+2];
+	libusb_device_handle *handle;
+	GcmSensorColormunkiPrivate *priv = sensor_colormunki->priv;
+
+	/* do sync request */
+	handle = gcm_usb_get_device_handle (priv->usb);
+
+	/* request new button state */
+	libusb_fill_control_setup (request, LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, 0x87, 0x00, 0, 2);
+	libusb_fill_control_transfer (priv->transfer_state, handle, request, &gcm_sensor_colormunki_refresh_state_transfer_cb, sensor_colormunki, 2000);
+
+	/* submit transfer */
+	retval = libusb_submit_transfer (priv->transfer_state);
+	if (retval < 0) {
+		egg_warning ("failed to submit transfer: %s", libusb_strerror (retval));
+		goto out;
+	}
+
+	/* success */
+	ret = TRUE;
+out:
+	return ret;
+}
+
+/**
  * gcm_sensor_colormunki_transfer_cb:
  **/
 static void
@@ -131,6 +218,9 @@ gcm_sensor_colormunki_transfer_cb (struct libusb_transfer *transfer)
 		gcm_sensor_button_pressed (GCM_SENSOR (sensor_colormunki));
 	}
 
+	/* get the device state */
+	gcm_sensor_colormunki_refresh_state (sensor_colormunki, NULL);
+
 out:
 	/* get the next bit of data */
 	gcm_sensor_colormunki_submit_transfer (sensor_colormunki);
@@ -165,47 +255,15 @@ gcm_sensor_colormunki_submit_transfer (GcmSensorColormunki *sensor_colormunki)
 static gboolean
 gcm_sensor_colormunki_playdo (GcmSensor *sensor, GError **error)
 {
-	gint retval;
-	static guchar request[2];
-	libusb_device_handle *handle;
-
+	gboolean ret = TRUE;
 	GcmSensorColormunki *sensor_colormunki = GCM_SENSOR_COLORMUNKI (sensor);
-	GcmSensorColormunkiPrivate *priv = sensor_colormunki->priv;
+//	GcmSensorColormunkiPrivate *priv = sensor_colormunki->priv;
 
 	egg_debug ("submit transfer");
 	gcm_sensor_colormunki_submit_transfer (sensor_colormunki);
+	//ret = gcm_sensor_colormunki_refresh_state (sensor_colormunki, error);
 
-	/* do sync request */
-	handle = gcm_usb_get_device_handle (priv->usb);
-	retval = libusb_control_transfer (handle,
-					  LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE,
-					  0x87, 0x00, 0,
-					  (guchar *) request, 2,
-					  2000);
-	if (retval < 0) {
-		g_set_error (error, GCM_SENSOR_ERROR,
-			     GCM_SENSOR_ERROR_INTERNAL,
-			     "failed to send request: %s", libusb_strerror (retval));
-		goto out;
-	}
-
-	if (request[0] == 0x00)
-		egg_warning ("PROJECTOR");
-	if (request[0] == 0x01)
-		egg_warning ("SPOT");
-	if (request[0] == 0x02)
-		egg_warning ("CAL");
-	if (request[0] == 0x03)
-		egg_warning ("AMBIENT");
-
-	if (request[1] == 0x00)
-		egg_warning ("BUTTON RELEASED");
-	if (request[1] == 0x01)
-		egg_warning ("BUTTON PRESSED");
-
-	gcm_sensor_colormunki_print_data ("reply", request, 2);
-out:
-	return TRUE;
+	return ret;
 }
 
 /**
@@ -264,6 +322,7 @@ gcm_sensor_colormunki_init (GcmSensorColormunki *sensor)
 	GcmSensorColormunkiPrivate *priv;
 	priv = sensor->priv = GCM_SENSOR_COLORMUNKI_GET_PRIVATE (sensor);
 	priv->transfer_interrupt = libusb_alloc_transfer (0);
+	priv->transfer_state = libusb_alloc_transfer (0);
 	priv->usb = gcm_usb_new ();
 }
 
@@ -276,13 +335,14 @@ gcm_sensor_colormunki_finalize (GObject *object)
 	GcmSensorColormunki *sensor = GCM_SENSOR_COLORMUNKI (object);
 	GcmSensorColormunkiPrivate *priv = sensor->priv;
 
-	/* FIXME: cancel transfer if it is in progress */
+	/* FIXME: cancel transfers if in progress */
 
 	/* detach from the main loop */
 	g_object_unref (priv->usb);
 
-	/* free transfer */
+	/* free transfers */
 	libusb_free_transfer (priv->transfer_interrupt);
+	libusb_free_transfer (priv->transfer_state);
 
 	G_OBJECT_CLASS (gcm_sensor_colormunki_parent_class)->finalize (object);
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]