diff --git a/include/villas/usb.hpp b/include/villas/usb.hpp index 0bbd4f67c..0cce265d1 100644 --- a/include/villas/usb.hpp +++ b/include/villas/usb.hpp @@ -24,6 +24,7 @@ #pragma once #include +#include #include @@ -87,11 +88,33 @@ protected: std::string getStringDescriptor(uint8_t desc_id) const; + Logger logger; + public: Device(struct libusb_device *dev) : device(dev), handle(nullptr) - { } + { + int ret = libusb_get_device_descriptor(dev, &desc); + if (ret != LIBUSB_SUCCESS) + throw Error((enum libusb_error) ret, "Failed to get device descriptor"); + + auto ln = fmt::format("usb:dev:{}:{}", libusb_get_bus_number(device), libusb_get_port_number(device)); + logger = logging.get(ln); + + ret = libusb_open(device, &handle); + if (ret < 0) + throw Error((enum libusb_error) ret, "Failed to open device"); + + libusb_ref_device(device); + } + + virtual ~Device() + { + libusb_close(handle); + + libusb_unref_device(device); + } const struct libusb_device_descriptor & getDescriptor() const { diff --git a/lib/nodes/temper.cpp b/lib/nodes/temper.cpp index 88103fc70..059511ea2 100644 --- a/lib/nodes/temper.cpp +++ b/lib/nodes/temper.cpp @@ -54,11 +54,7 @@ TEMPerDevice::TEMPerDevice(struct libusb_device *dev) : scale(1.0), offset(0.0), timeout(5000) -{ - int ret = libusb_get_device_descriptor(dev, &desc); - if (ret != LIBUSB_SUCCESS) - throw RuntimeError("Could not get USB device descriptor: {}", libusb_strerror((enum libusb_error) ret)); -} +{ } void TEMPerDevice::open(bool reset) { @@ -87,8 +83,6 @@ void TEMPerDevice::close() { libusb_release_interface(handle, 0x00); libusb_release_interface(handle, 0x01); - - libusb_close(handle); } void TEMPerDevice::read(struct sample *smp)