diff --git a/src/DebugToolDrivers/USB/UsbDevice.cpp b/src/DebugToolDrivers/USB/UsbDevice.cpp index a1cd6996..7867711a 100644 --- a/src/DebugToolDrivers/USB/UsbDevice.cpp +++ b/src/DebugToolDrivers/USB/UsbDevice.cpp @@ -1,9 +1,11 @@ #include "UsbDevice.hpp" #include +#include #include "src/Logger/Logger.hpp" #include "src/TargetController/Exceptions/DeviceInitializationFailure.hpp" +#include "src/TargetController/Exceptions/DeviceCommunicationFailure.hpp" #include "src/TargetController/Exceptions/DeviceNotFound.hpp" namespace Usb @@ -56,6 +58,34 @@ namespace Usb this->libusbDeviceHandle.reset(deviceHandle); } + std::string UsbDevice::getSerialNumber() const { + assert(this->libusbDevice && this->libusbDeviceHandle); + struct ::libusb_device_descriptor desc = {}; + + auto statusCode = ::libusb_get_device_descriptor(this->libusbDevice.get(), &desc); + if (statusCode != 0) { + throw DeviceCommunicationFailure( + "Failed to retrieve USB device descriptor - status code: " + std::to_string(statusCode) + ); + } + + auto data = std::array(); + const auto transferredBytes = ::libusb_get_string_descriptor_ascii( + this->libusbDeviceHandle.get(), + desc.iSerialNumber, + data.data(), + data.size() + ); + + if (transferredBytes <= 0) { + throw DeviceCommunicationFailure( + "Failed to retrieve serial number from USB device - status code: " + std::to_string(transferredBytes) + ); + } + + return std::string(data.begin(), data.begin() + transferredBytes); + } + void UsbDevice::setConfiguration(std::uint8_t configurationIndex) { const auto configDescriptor = this->getConfigDescriptor(configurationIndex); diff --git a/src/DebugToolDrivers/USB/UsbDevice.hpp b/src/DebugToolDrivers/USB/UsbDevice.hpp index a7ce771b..1e0aed42 100644 --- a/src/DebugToolDrivers/USB/UsbDevice.hpp +++ b/src/DebugToolDrivers/USB/UsbDevice.hpp @@ -31,6 +31,13 @@ namespace Usb void init(); + /** + * Retrieves the device's serial number via the device descriptor. + * + * @return + */ + std::string getSerialNumber() const; + /** * Selects a specific configuration on the device, using the configuration index. *