void execute_usb_command(uvc::device & device, std::timed_mutex & mutex, unsigned char handle_id, uint8_t *out, size_t outSize, uint32_t & op, uint8_t * in, size_t & inSize) { // write errno = 0; int outXfer; if (!mutex.try_lock_for(std::chrono::milliseconds(IVCAM_MONITOR_MUTEX_TIMEOUT))) throw std::runtime_error("timed_mutex::try_lock_for(...) timed out"); std::lock_guard<std::timed_mutex> guard(mutex, std::adopt_lock); bulk_transfer(device, handle_id, IVCAM_MONITOR_ENDPOINT_OUT, out, (int)outSize, &outXfer, 1000); // timeout in ms std::this_thread::sleep_for(std::chrono::milliseconds(20)); // read if (in && inSize) { uint8_t buf[IVCAM_MONITOR_MAX_BUFFER_SIZE]; errno = 0; bulk_transfer(device, handle_id, IVCAM_MONITOR_ENDPOINT_IN, buf, sizeof(buf), &outXfer, 1000); if (outXfer < (int)sizeof(uint32_t)) throw std::runtime_error("incomplete bulk usb transfer"); op = *(uint32_t *)buf; if (outXfer > (int)inSize) throw std::runtime_error("bulk transfer failed - user buffer too small"); inSize = outXfer; memcpy(in, buf, inSize); } }
void bulk_usb_command(uvc::device & device, std::timed_mutex & mutex, unsigned char out_ep, uint8_t *out, size_t outSize, uint32_t & op, unsigned char in_ep, uint8_t * in, size_t & inSize, int timeout) { // write errno = 0; int outXfer; if (!mutex.try_lock_for(std::chrono::milliseconds(timeout))) throw std::runtime_error("timed_mutex::try_lock_for(...) timed out"); std::lock_guard<std::timed_mutex> guard(mutex, std::adopt_lock); bulk_transfer(device, out_ep, out, (int)outSize, &outXfer, timeout); // timeout in ms // read if (in && inSize) { uint8_t buf[1024]; // TBD the size may vary errno = 0; bulk_transfer(device, in_ep, buf, sizeof(buf), &outXfer, timeout); if (outXfer < (int)sizeof(uint32_t)) throw std::runtime_error("incomplete bulk usb transfer"); op = *(uint32_t *)buf; if (outXfer > (int)inSize) throw std::runtime_error("bulk transfer failed - user buffer too small"); inSize = outXfer; memcpy(in, buf, inSize); } }
static status_t usb_write(status_t (*bulk_transfer)(), const pairs *cmd, unsigned int num) { size_t size = num * 2, offset = 0; unsigned char data[size]; unsigned int i; for (i = 0; i < num; i++) { data[offset++] = cmd[i].reg; data[offset++] = cmd[i].val; } return bulk_transfer(AES2501_OUT, data, size); }