template<class T> void set_pu(uvc_device_handle_t * devh, int subdevice, uint8_t unit, uint8_t control, int value) { const int REQ_TYPE_SET = 0x21; unsigned char buffer[4]; if(sizeof(T)==1) buffer[0] = value; if(sizeof(T)==2) SHORT_TO_SW(value, buffer); if(sizeof(T)==4) INT_TO_DW(value, buffer); int status = libusb_control_transfer(devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, control << 8, unit << 8 | (subdevice*2), buffer, sizeof(T), 0); if(status < 0) throw std::runtime_error(to_string() << "libusb_control_transfer(...) returned " << libusb_error_name(status)); if(status != sizeof(T)) throw std::runtime_error("insufficient data written to usb"); }
/** @ingroup ctrl * @brief Sets the WHITE_BALANCE_COMPONENT control. * @param devh UVC device handle * @param blue TODO * @param red TODO */ uvc_error_t uvc_set_white_balance_component(uvc_device_handle_t *devh, uint16_t blue, uint16_t red) { uint8_t data[4]; uvc_error_t ret; SHORT_TO_SW(blue, data + 0); SHORT_TO_SW(red, data + 2); ret = libusb_control_transfer( devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL << 8, 1 << 8, data, sizeof(data), 0); if (ret == sizeof(data)) return UVC_SUCCESS; else return ret; }
/** @ingroup ctrl * @brief Sets the DIGITAL_WINDOW control. * @param devh UVC device handle * @param window_top TODO * @param window_left TODO * @param window_bottom TODO * @param window_right TODO * @param num_steps TODO * @param num_steps_units TODO */ uvc_error_t uvc_set_digital_window(uvc_device_handle_t *devh, uint16_t window_top, uint16_t window_left, uint16_t window_bottom, uint16_t window_right, uint16_t num_steps, uint16_t num_steps_units) { uint8_t data[12]; uvc_error_t ret; SHORT_TO_SW(window_top, data + 0); SHORT_TO_SW(window_left, data + 2); SHORT_TO_SW(window_bottom, data + 4); SHORT_TO_SW(window_right, data + 6); SHORT_TO_SW(num_steps, data + 8); SHORT_TO_SW(num_steps_units, data + 10); ret = libusb_control_transfer( devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_CT_DIGITAL_WINDOW_CONTROL << 8, 1 << 8, data, sizeof(data), 0); if (ret == sizeof(data)) return UVC_SUCCESS; else return ret; }
/** @ingroup ctrl * @brief Sets the REGION_OF_INTEREST control. * @param devh UVC device handle * @param roi_top TODO * @param roi_left TODO * @param roi_bottom TODO * @param roi_right TODO * @param auto_controls TODO */ uvc_error_t uvc_set_digital_roi(uvc_device_handle_t *devh, uint16_t roi_top, uint16_t roi_left, uint16_t roi_bottom, uint16_t roi_right, uint16_t auto_controls) { uint8_t data[10]; uvc_error_t ret; SHORT_TO_SW(roi_top, data + 0); SHORT_TO_SW(roi_left, data + 2); SHORT_TO_SW(roi_bottom, data + 4); SHORT_TO_SW(roi_right, data + 6); SHORT_TO_SW(auto_controls, data + 8); ret = libusb_control_transfer( devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_CT_REGION_OF_INTEREST_CONTROL << 8, 1 << 8, data, sizeof(data), 0); if (ret == sizeof(data)) return UVC_SUCCESS; else return ret; }
uvc_error_t uvc_set_wb_temperature(uvc_device_handle_t *devh, uint16_t wb_temperature) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(wb_temperature, data); ret = libusb_control_transfer(devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_PU_WHITE_BALANCE_TEMPERATURE_CONTROL << 8, devh->info->ctrl_if.processing_unit_descs->request, data, sizeof(data), CTRL_TIMEOUT_MILLIS); if (LIKELY(ret == sizeof(data))) return UVC_SUCCESS; else return ret; }
uvc_error_t uvc_set_digital_mult_limit(uvc_device_handle_t *devh, uint16_t limit) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(limit, data); ret = libusb_control_transfer(devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL << 8, devh->info->ctrl_if.processing_unit_descs->request, data, sizeof(data), CTRL_TIMEOUT_MILLIS); if (LIKELY(ret == sizeof(data))) return UVC_SUCCESS; else return ret; }
uvc_error_t uvc_set_saturation(uvc_device_handle_t *devh, uint16_t saturation) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(saturation, data); ret = libusb_control_transfer(devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_PU_SATURATION_CONTROL << 8, devh->info->ctrl_if.processing_unit_descs->request, data, sizeof(data), CTRL_TIMEOUT_MILLIS); if (LIKELY(ret == sizeof(data))) return UVC_SUCCESS; else return ret; }
uvc_error_t uvc_set_brightness(uvc_device_handle_t *devh, short brightness) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(brightness, data); ret = libusb_control_transfer(devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_PU_BRIGHTNESS_CONTROL << 8, devh->info->ctrl_if.processing_unit_descs->request, data, sizeof(data), CTRL_TIMEOUT_MILLIS); if (LIKELY(ret == sizeof(data))) return UVC_SUCCESS; else return ret; }
uvc_error_t uvc_set_backlight_compensation(uvc_device_handle_t *devh, short comp) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(comp, data); ret = libusb_control_transfer(devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_PU_BACKLIGHT_COMPENSATION_CONTROL << 8, devh->info->ctrl_if.processing_unit_descs->request, data, sizeof(data), CTRL_TIMEOUT_MILLIS); if (LIKELY(ret == sizeof(data))) return UVC_SUCCESS; else return ret; }
uvc_error_t uvc_set_zoom_abs(uvc_device_handle_t *devh, uint16_t zoom) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(zoom, data); ret = libusb_control_transfer(devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_CT_ZOOM_ABSOLUTE_CONTROL << 8, devh->info->ctrl_if.input_term_descs->request, data, sizeof(data), CTRL_TIMEOUT_MILLIS); if (LIKELY(ret == sizeof(data))) return UVC_SUCCESS; else return ret; }
uvc_error_t uvc_set_iris_abs(uvc_device_handle_t *devh, uint16_t iris) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(iris, data); ret = libusb_control_transfer(devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_CT_FOCUS_ABSOLUTE_CONTROL << 8, // 1 << 8, /* = fixed ID(00) and wrong VideoControl interface descriptor subtype(UVC_VC_HEADER) on original libuvc */ devh->info->ctrl_if.input_term_descs->request, data, sizeof(data), CTRL_TIMEOUT_MILLIS); if (LIKELY(ret == sizeof(data))) return UVC_SUCCESS; else return ret; }
uvc_error_t uvc_set_focus_abs(uvc_device_handle_t *devh, short focus) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(focus, data); ret = libusb_control_transfer( devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_CT_FOCUS_ABSOLUTE_CONTROL << 8, 1 << 8, data, sizeof(data), 0); if (ret == sizeof(data)) return UVC_SUCCESS; else return ret; }
/** @ingroup ctrl * @brief Sets the ROLL_ABSOLUTE control. * @param devh UVC device handle * @param roll TODO */ uvc_error_t uvc_set_roll_abs(uvc_device_handle_t *devh, int16_t roll) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(roll, data + 0); ret = libusb_control_transfer( devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_CT_ROLL_ABSOLUTE_CONTROL << 8, 1 << 8, data, sizeof(data), 0); if (ret == sizeof(data)) return UVC_SUCCESS; else return ret; }
/** @ingroup ctrl * @brief Sets the DIGITAL_MULTIPLIER_LIMIT control. * @param devh UVC device handle * @param multiplier_step TODO */ uvc_error_t uvc_set_digital_multiplier_limit(uvc_device_handle_t *devh, uint16_t multiplier_step) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(multiplier_step, data + 0); ret = libusb_control_transfer( devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL << 8, 1 << 8, data, sizeof(data), 0); if (ret == sizeof(data)) return UVC_SUCCESS; else return ret; }
/** @ingroup ctrl * @brief Sets the WHITE_BALANCE_TEMPERATURE control. * @param devh UVC device handle * @param temperature TODO */ uvc_error_t uvc_set_white_balance_temperature(uvc_device_handle_t *devh, uint16_t temperature) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(temperature, data + 0); ret = libusb_control_transfer( devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_PU_WHITE_BALANCE_TEMPERATURE_CONTROL << 8, 1 << 8, data, sizeof(data), 0); if (ret == sizeof(data)) return UVC_SUCCESS; else return ret; }
/** @ingroup ctrl * @brief Sets the GAMMA control. * @param devh UVC device handle * @param gamma TODO */ uvc_error_t uvc_set_gamma(uvc_device_handle_t *devh, uint16_t gamma) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(gamma, data + 0); ret = libusb_control_transfer( devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_PU_GAMMA_CONTROL << 8, 1 << 8, data, sizeof(data), 0); if (ret == sizeof(data)) return UVC_SUCCESS; else return ret; }
/** @ingroup ctrl * @brief Sets the SHARPNESS control. * @param devh UVC device handle * @param sharpness TODO */ uvc_error_t uvc_set_sharpness(uvc_device_handle_t *devh, uint16_t sharpness) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(sharpness, data + 0); ret = libusb_control_transfer( devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_PU_SHARPNESS_CONTROL << 8, 1 << 8, data, sizeof(data), 0); if (ret == sizeof(data)) return UVC_SUCCESS; else return ret; }
/** @ingroup ctrl * @brief Sets the SATURATION control. * @param devh UVC device handle * @param saturation TODO */ uvc_error_t uvc_set_saturation(uvc_device_handle_t *devh, uint16_t saturation) { uint8_t data[2]; uvc_error_t ret; SHORT_TO_SW(saturation, data + 0); ret = libusb_control_transfer( devh->usb_devh, REQ_TYPE_SET, UVC_SET_CUR, UVC_PU_SATURATION_CONTROL << 8, 1 << 8, data, sizeof(data), 0); if (ret == sizeof(data)) return UVC_SUCCESS; else return ret; }