//---------------------------------------------------------------------- uvc_error_t uvc_get_pantilt_abs(uvc_device_handle_t *devh, int *pan, int *tilt, enum uvc_req_code req_code) { uint8_t data[8]; uvc_error_t ret; ret = libusb_control_transfer(devh->usb_devh, REQ_TYPE_GET, req_code, UVC_CT_PANTILT_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))) { *pan = DW_TO_INT(data); *tilt = DW_TO_INT(data + 4); return UVC_SUCCESS; } else { return ret; } }
template<class T> int get_pu(uvc_device_handle_t * devh, int subdevice, uint8_t unit, uint8_t control, int uvc_get_thing) { const int REQ_TYPE_GET = 0xa1; unsigned char buffer[4]; int status = libusb_control_transfer(devh->usb_devh, REQ_TYPE_GET, uvc_get_thing, 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 read from usb"); if(sizeof(T)==1) return buffer[0]; if(sizeof(T)==2) return SW_TO_SHORT(buffer); if(sizeof(T)==4) return DW_TO_INT(buffer); }
uvc_error_t uvc_get_pantilt_abs(uvc_device_handle_t *devh, int *pan, int *tilt, enum uvc_req_code req_code) { uint8_t data[8]; uvc_error_t ret; ret = libusb_control_transfer( devh->usb_devh, REQ_TYPE_GET, req_code, UVC_CT_PANTILT_ABSOLUTE_CONTROL << 8, 1 << 8, data, sizeof(data), 0); if (ret == sizeof(data)) { *pan = DW_TO_INT(data); *tilt = DW_TO_INT(data + 4); return UVC_SUCCESS; } else { return ret; } }
uvc_error_t uvc_get_wb_compo(uvc_device_handle_t *devh, uint32_t *wb_compo, enum uvc_req_code req_code) { uint8_t data[4]; uvc_error_t ret; ret = libusb_control_transfer(devh->usb_devh, REQ_TYPE_GET, req_code, UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL << 8, devh->info->ctrl_if.processing_unit_descs->request, data, sizeof(data), CTRL_TIMEOUT_MILLIS); if (LIKELY(ret == sizeof(data))) { *wb_compo = DW_TO_INT(data); return UVC_SUCCESS; } else { return ret; } RETURN(-1, uvc_error_t); }
uvc_error_t uvc_get_exposure_abs(uvc_device_handle_t *devh, int *time, enum uvc_req_code req_code) { uint8_t data[4]; uvc_error_t ret; ret = libusb_control_transfer( devh->usb_devh, REQ_TYPE_GET, req_code, UVC_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL << 8, 1 << 8, data, sizeof(data), 0); if (ret == sizeof(data)) { *time = DW_TO_INT(data); return UVC_SUCCESS; } else { return ret; } }