void perform_and_send_monitor_command(uvc::device & device, std::timed_mutex & mutex, HWMonitorCommand & newCommand) { uint32_t opCodeXmit = (uint32_t)newCommand.cmd; HWMonCommandDetails details; details.oneDirection = newCommand.oneDirection; details.TimeOut = newCommand.TimeOut; fill_usb_buffer(opCodeXmit, newCommand.Param1, newCommand.Param2, newCommand.Param3, newCommand.Param4, newCommand.data, newCommand.sizeOfSendCommandData, details.sendCommandData, details.sizeOfSendCommandData); send_hw_monitor_command(device, mutex, 0, details); // Error/exit conditions if (newCommand.oneDirection) return; memcpy(newCommand.receivedOpcode, details.receivedOpcode, 4); memcpy(newCommand.receivedCommandData, details.receivedCommandData, details.receivedCommandDataLength); newCommand.receivedCommandDataLength = details.receivedCommandDataLength; // endian? uint32_t opCodeAsUint32 = pack(details.receivedOpcode[3], details.receivedOpcode[2], details.receivedOpcode[1], details.receivedOpcode[0]); if (opCodeAsUint32 != opCodeXmit) { throw std::runtime_error("opcodes do not match"); } }
std::vector<uint8_t> hw_monitor::send(command cmd) const { hwmon_cmd newCommand(cmd); auto opCodeXmit = static_cast<uint32_t>(newCommand.cmd); hwmon_cmd_details details; details.oneDirection = newCommand.oneDirection; details.timeOut = newCommand.timeOut; fill_usb_buffer(opCodeXmit, newCommand.param1, newCommand.param2, newCommand.param3, newCommand.param4, newCommand.data, newCommand.sizeOfSendCommandData, details.sendCommandData.data(), details.sizeOfSendCommandData); send_hw_monitor_command(details); // Error/exit conditions if (newCommand.oneDirection) return std::vector<uint8_t>(); librealsense::copy(newCommand.receivedOpcode, details.receivedOpcode.data(), 4); librealsense::copy(newCommand.receivedCommandData, details.receivedCommandData.data(), details.receivedCommandDataLength); newCommand.receivedCommandDataLength = details.receivedCommandDataLength; // endian? auto opCodeAsUint32 = pack(details.receivedOpcode[3], details.receivedOpcode[2], details.receivedOpcode[1], details.receivedOpcode[0]); if (opCodeAsUint32 != opCodeXmit) { throw invalid_value_exception(to_string() << "OpCodes do not match! Sent " << opCodeXmit << " but received " << static_cast<int>(opCodeAsUint32) << "!"); } return std::vector<uint8_t>(newCommand.receivedCommandData, newCommand.receivedCommandData + newCommand.receivedCommandDataLength); }