/** * cd_sensor_set_mode: **/ void cd_sensor_set_mode (CdSensor *sensor, CdSensorCap mode) { sensor->priv->mode = mode; cd_sensor_dbus_emit_property_changed (sensor, "Mode", g_variant_new_string (cd_sensor_cap_to_string (mode))); }
/** * cd_sensor_set_mode: **/ void cd_sensor_set_mode (CdSensor *sensor, CdSensorCap mode) { CdSensorPrivate *priv = GET_PRIVATE (sensor); priv->mode = mode; cd_sensor_dbus_emit_property_changed (sensor, "Mode", g_variant_new_string (cd_sensor_cap_to_string (mode))); }
/** * cd_sensor_get_variant_for_caps: **/ static GVariant * cd_sensor_get_variant_for_caps (guint64 caps) { guint i; GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); for (i = 0; i < CD_SENSOR_CAP_LAST; i++) { if (!cd_bitfield_contain (caps, i)) continue; g_variant_builder_add (&builder, "s", cd_sensor_cap_to_string (i)); } return g_variant_new ("as", &builder); }
/** * cd_sensor_dbus_get_property: **/ static GVariant * cd_sensor_dbus_get_property (GDBusConnection *connection_, const gchar *sender, const gchar *object_path, const gchar *interface_name, const gchar *property_name, GError **error, gpointer user_data) { CdSensor *sensor = CD_SENSOR (user_data); CdSensorPrivate *priv = GET_PRIVATE (sensor); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_ID) == 0) return g_variant_new_string (priv->id); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_KIND) == 0) return g_variant_new_string (cd_sensor_kind_to_string (priv->kind)); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_STATE) == 0) return g_variant_new_string (cd_sensor_state_to_string (priv->state)); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_MODE) == 0) return g_variant_new_string (cd_sensor_cap_to_string (priv->mode)); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_SERIAL) == 0) return cd_sensor_get_nullable_for_string (priv->serial); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_MODEL) == 0) return cd_sensor_get_nullable_for_string (priv->model); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_VENDOR) == 0) return cd_sensor_get_nullable_for_string (priv->vendor); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_NATIVE) == 0) return g_variant_new_boolean (priv->native); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_LOCKED) == 0) return g_variant_new_boolean (priv->locked); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_EMBEDDED) == 0) return g_variant_new_boolean (priv->embedded); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_CAPABILITIES) == 0) return cd_sensor_get_variant_for_caps (priv->caps); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_OPTIONS) == 0) return cd_sensor_get_options_as_variant (sensor); if (g_strcmp0 (property_name, CD_SENSOR_PROPERTY_METADATA) == 0) return cd_sensor_get_metadata_as_variant (sensor); /* return an error */ g_set_error (error, CD_SENSOR_ERROR, CD_SENSOR_ERROR_INTERNAL, "failed to get sensor property %s", property_name); return NULL; }
/** * cd_sensor_munki_refresh_state_transfer_cb: **/ static void cd_sensor_munki_refresh_state_transfer_cb (struct libusb_transfer *transfer) { CdSensor *sensor = CD_SENSOR (transfer->user_data); guint8 *reply = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { g_warning ("did not succeed"); goto out; } /* sensor position and button task */ switch (reply[0]) { case MUNKI_DIAL_POSITION_PROJECTOR: cd_sensor_set_mode (sensor, CD_SENSOR_CAP_PROJECTOR); break; case MUNKI_DIAL_POSITION_SURFACE: cd_sensor_set_mode (sensor, CD_SENSOR_CAP_PRINTER); break; case MUNKI_DIAL_POSITION_CALIBRATION: cd_sensor_set_mode (sensor, CD_SENSOR_CAP_CALIBRATION); break; case MUNKI_DIAL_POSITION_AMBIENT: cd_sensor_set_mode (sensor, CD_SENSOR_CAP_AMBIENT); break; case MUNKI_DIAL_POSITION_UNKNOWN: cd_sensor_set_mode (sensor, CD_SENSOR_CAP_UNKNOWN); break; default: break; } g_debug ("dial now %s, button now %s", cd_sensor_cap_to_string (cd_sensor_get_mode (sensor)), munki_button_state_to_string (reply[1])); cd_sensor_debug_data (CD_SENSOR_DEBUG_MODE_RESPONSE, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, transfer->actual_length); out: g_free (transfer->buffer); }
/** * dtp94_device_take_sample: * * Since: 0.1.29 **/ CdColorXYZ * dtp94_device_take_sample (GUsbDevice *device, CdSensorCap cap, GError **error) { CdColorXYZ *result = NULL; gboolean ret = FALSE; gchar *tmp; gsize reply_read; guint8 buffer[128]; g_return_val_if_fail (G_USB_IS_DEVICE (device), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); /* set hardware support */ switch (cap) { case CD_SENSOR_CAP_CRT: case CD_SENSOR_CAP_PLASMA: /* CRT = 01 */ ret = dtp94_device_send_cmd (device, "0116CF\r", error); break; case CD_SENSOR_CAP_LCD: /* LCD = 02 */ ret = dtp94_device_send_cmd (device, "0216CF\r", error); break; default: g_set_error (error, DTP94_DEVICE_ERROR, DTP94_DEVICE_ERROR_NO_SUPPORT, "DTP94 cannot measure in %s mode", cd_sensor_cap_to_string (cap)); break; } if (!ret) return NULL; /* get sample */ ret = dtp94_device_send_data (device, (const guint8 *) "RM\r", 3, buffer, sizeof (buffer), &reply_read, error); if (!ret) return NULL; tmp = g_strstr_len ((const gchar *) buffer, reply_read, "\r"); if (tmp == NULL || memcmp (tmp + 1, "<00>", 4) != 0) { buffer[reply_read] = '\0'; g_set_error (error, DTP94_DEVICE_ERROR, DTP94_DEVICE_ERROR_INTERNAL, "unexpected response from device: %s", (const gchar *) buffer); return NULL; } /* format is raw ASCII with fixed formatting: * 'X 10.29 Y 10.33 Z 4.65\u000d<00>' */ tmp = (gchar *) buffer; g_strdelimit (tmp, "\t\r", '\0'); /* success */ result = cd_color_xyz_new (); cd_color_xyz_set (result, g_ascii_strtod (tmp + 1, NULL), g_ascii_strtod (tmp + 13, NULL), g_ascii_strtod (tmp + 25, NULL)); return result; }