static void cd_sensor_dtp94_lock_thread_cb (GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable) { CdSensor *sensor = CD_SENSOR (source_object); CdSensorDtp94Private *priv = cd_sensor_dtp94_get_private (sensor); g_autoptr(GError) error = NULL; g_autofree gchar *serial = NULL; /* try to find the USB device */ priv->device = cd_sensor_open_usb_device (sensor, 0x01, /* config */ 0x00, /* interface */ &error); if (priv->device == NULL) { g_task_return_new_error (task, CD_SENSOR_ERROR, CD_SENSOR_ERROR_INTERNAL, "%s", error->message); return; } /* set state */ cd_sensor_set_state_in_idle (sensor, CD_SENSOR_STATE_STARTING); /* do startup sequence */ if (!dtp94_device_setup (priv->device, &error)) { g_task_return_new_error (task, CD_SENSOR_ERROR, CD_SENSOR_ERROR_INTERNAL, "%s", error->message); return; } /* get serial */ serial = dtp94_device_get_serial (priv->device, &error); if (serial == NULL) { g_task_return_new_error (task, CD_SENSOR_ERROR, CD_SENSOR_ERROR_NO_DATA, "%s", error->message); return; } cd_sensor_set_serial (sensor, serial); /* success */ g_task_return_boolean (task, TRUE); }
/** * cd_sensor_set_property: **/ static void cd_sensor_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { CdSensor *sensor = CD_SENSOR (object); CdSensorPrivate *priv = sensor->priv; switch (prop_id) { case PROP_OBJECT_PATH: g_free (priv->object_path); priv->object_path = g_strdup (g_value_get_string (value)); break; case PROP_MODEL: g_free (priv->model); priv->model = g_strdup (g_value_get_string (value)); break; case PROP_VENDOR: g_free (priv->vendor); priv->vendor = g_strdup (g_value_get_string (value)); break; case PROP_ID: cd_sensor_set_id (sensor, g_value_get_string (value)); break; case PROP_NATIVE: priv->native = g_value_get_boolean (value); break; case PROP_LOCKED: priv->locked = g_value_get_boolean (value); break; case PROP_STATE: priv->state = g_value_get_uint (value); break; case PROP_MODE: priv->mode = g_value_get_uint (value); break; case PROP_KIND: cd_sensor_set_kind (sensor, g_value_get_uint (value)); break; case PROP_CAPS: priv->caps = g_value_get_uint64 (value); break; case PROP_SERIAL: cd_sensor_set_serial (sensor, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void cd_sensor_munki_lock_thread_cb (GSimpleAsyncResult *res, GObject *object, GCancellable *cancellable) { CdSensor *sensor = CD_SENSOR (object); CdSensorMunkiPrivate *priv = cd_sensor_munki_get_private (sensor); gboolean ret = FALSE; g_autoptr(GError) error = NULL; gint retval; guint8 buffer[36]; libusb_device_handle *handle; /* try to find the USB device */ priv->device = cd_sensor_open_usb_device (sensor, 0x01, /* config */ 0x00, /* interface */ &error); if (priv->device == NULL) { g_task_return_new_error (task, CD_SENSOR_ERROR, CD_SENSOR_ERROR_INTERNAL, "%s", error->message); goto out; } /* attach to the default mainloop */ ret = cd_usb_attach_to_context (priv->usb, NULL, &error); if (!ret) { g_task_return_new_error (task, CD_SENSOR_ERROR, CD_SENSOR_ERROR_NO_SUPPORT, "failed to attach to mainloop: %s", error->message); goto out; } /* get firmware parameters */ handle = cd_usb_get_device_handle (priv->usb); retval = libusb_control_transfer (handle, LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, MUNKI_REQUEST_FIRMWARE_PARAMS, 0, 0, buffer, 24, 2000); if (retval < 0) { g_task_return_new_error (task, CD_SENSOR_ERROR, CD_SENSOR_ERROR_NO_SUPPORT, "failed to get firmware parameters: %s", libusb_strerror (retval)); goto out; } priv->firmware_revision = g_strdup_printf ("%i.%i", cd_buffer_read_uint32_le (buffer), cd_buffer_read_uint32_le (buffer+4)); priv->tick_duration = cd_buffer_read_uint32_le (buffer+8); priv->min_int = cd_buffer_read_uint32_le (buffer+0x0c); priv->eeprom_blocks = cd_buffer_read_uint32_le (buffer+0x10); priv->eeprom_blocksize = cd_buffer_read_uint32_le (buffer+0x14); /* get chip ID */ retval = libusb_control_transfer (handle, LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, MUNKI_REQUEST_CHIP_ID, 0, 0, buffer, 8, 2000); if (retval < 0) { g_task_return_new_error (task, CD_SENSOR_ERROR, CD_SENSOR_ERROR_NO_SUPPORT, "failed to get chip id parameters: %s", libusb_strerror (retval)); goto out; } priv->chip_id = g_strdup_printf ("%02x-%02x%02x%02x%02x%02x%02x%02x", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7]); /* get version string */ priv->version_string = g_new0 (gchar, 36); retval = libusb_control_transfer (handle, LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, MUNKI_REQUEST_VERSION_STRING, 0, 0, (guint8*) priv->version_string, 36, 2000); if (retval < 0) { g_task_return_new_error (task, CD_SENSOR_ERROR, CD_SENSOR_ERROR_NO_SUPPORT, "failed to get version string: %s", libusb_strerror (retval)); goto out; } /* get serial number */ ret = cd_sensor_munki_get_eeprom_data (sensor, COLORMUNKI_EEPROM_OFFSET_SERIAL_NUMBER, buffer, 10, &error); if (!ret) { g_task_return_new_error (task, CD_SENSOR_ERROR, CD_SENSOR_ERROR_INTERNAL, "%s", error->message); goto out; } cd_sensor_set_serial (sensor, (const gchar*) buffer); /* print details */ g_debug ("Chip ID\t%s", priv->chip_id); g_debug ("Serial number\t%s", buffer); g_debug ("Version\t%s", priv->version_string); g_debug ("Firmware\tfirmware_revision=%s, tick_duration=%i, min_int=%i, eeprom_blocks=%i, eeprom_blocksize=%i", priv->firmware_revision, priv->tick_duration, priv->min_int, priv->eeprom_blocks, priv->eeprom_blocksize); /* do unknown cool stuff */ ret = cd_sensor_munki_random (sensor, &error); if (!ret) { g_assert (error != NULL); g_task_return_new_error (task, CD_SENSOR_ERROR, CD_SENSOR_ERROR_INTERNAL, "%s", error->message); goto out; } out: /* set state */ cd_sensor_set_state_in_idle (sensor, CD_SENSOR_STATE_IDLE); }