[gnome-color-manager] cm: get the dial position async, not sync
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-color-manager] cm: get the dial position async, not sync
- Date: Thu, 22 Jul 2010 11:43:34 +0000 (UTC)
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]