OpenHantek
usbdevice.h
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0+
2 
3 #pragma once
4 
5 #include <QObject>
6 #include <QStringList>
7 #ifdef __FreeBSD__
8  #include <libusb.h>
9 #else
10  #include <libusb-1.0/libusb.h>
11 #endif
12 #include <memory>
13 
14 #include "usbdevicedefinitions.h"
15 
16 class DSOModel;
17 
18 typedef uint64_t UniqueUSBid;
19 
20 
24 QString libUsbErrorString(int error);
25 
28 class USBDevice : public QObject {
29  Q_OBJECT
30 
31  public:
32  explicit USBDevice(DSOModel* model, libusb_device *device, unsigned findIteration = 0);
33  USBDevice(const USBDevice&) = delete;
34  ~USBDevice();
35  bool connectDevice(QString &errorMessage);
36  void disconnectFromDevice();
37 
40  bool isConnected();
41 
45  bool needsFirmware();
46 
50  inline unsigned int getFwVersion() const { return this->descriptor.bcdDevice; }
51 
56  inline void setFindIteration(unsigned iteration) { findIteration = iteration; }
57  inline unsigned getFindIteration() const { return findIteration; }
58 
67  int bulkTransfer(unsigned char endpoint, const unsigned char *data, unsigned int length, int attempts = HANTEK_ATTEMPTS,
68  unsigned int timeout = HANTEK_TIMEOUT);
69 
75  inline int bulkWrite(const unsigned char *data, unsigned int length, int attempts = HANTEK_ATTEMPTS) {
76  return bulkTransfer(HANTEK_EP_OUT, data, length, attempts);
77  }
78 
84  template<class T>
85  inline int bulkRead(const T *command, int attempts = HANTEK_ATTEMPTS) {
86  return bulkTransfer(HANTEK_EP_IN, command->data(), command->size(), attempts);
87  }
88 
94  int bulkReadMulti(unsigned char *data, unsigned length, int attempts = HANTEK_ATTEMPTS_MULTI);
95 
105  int controlTransfer(unsigned char type, unsigned char request, unsigned char *data, unsigned int length, int value,
106  int index, int attempts = HANTEK_ATTEMPTS);
107 
111  template<class T>
112  inline int controlWrite(const T *command) {
113  return controlTransfer(LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT, uint8_t(command->code),
114  const_cast<unsigned char *>(command->data()), unsigned(command->size()), command->value, 0,
116  }
117 
121  template<class T>
122  inline int controlRead(const T *command) {
123  return controlTransfer(LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN, uint8_t(command->code),
124  const_cast<unsigned char *>(command->data()), unsigned(command->size()), command->value, 0,
126  }
127 
131  inline libusb_device *getRawDevice() const { return device; }
132 
140  static UniqueUSBid computeUSBdeviceID( libusb_device *device );
141 
144  inline const DSOModel *getModel() const { return model; }
151  inline void overwriteInPacketLength(unsigned len) { inPacketLength = len; }
152 
153  protected:
154 // int claimInterface(const libusb_interface_descriptor *interfaceDescriptor, int endpointOut, int endPointIn);
155 // int claimInterface(const libusb_interface_descriptor *interfaceDescriptor, int endPointIn);
156  int claimInterface( const libusb_interface_descriptor *interfaceDescriptor );
157 
158  // Device model data
160 
161  // Libusb specific variables
162  struct libusb_device_descriptor descriptor;
163  libusb_device *device;
164  libusb_device_handle *handle = nullptr;
165  unsigned findIteration;
168  unsigned outPacketLength;
169  unsigned inPacketLength;
170 
171  signals:
172  void deviceDisconnected();
173 };
unsigned outPacketLength
Packet length for the OUT endpoint.
Definition: usbdevice.h:168
const UniqueUSBid uniqueUSBdeviceID
Definition: usbdevice.h:166
#define HANTEK_EP_OUT
OUT Endpoint for bulk transfers.
Definition: usbdevicedefinitions.h:10
~USBDevice()
Definition: usbdevice.cpp:132
#define HANTEK_ATTEMPTS
The number of transfer attempts.
Definition: usbdevicedefinitions.h:7
unsigned getFindIteration() const
Definition: usbdevice.h:57
void disconnectFromDevice()
Definition: usbdevice.cpp:165
int nInterface
Definition: usbdevice.h:167
libusb_device * device
The USB handle for the oscilloscope.
Definition: usbdevice.h:163
libusb_device * getRawDevice() const
Definition: usbdevice.h:131
unsigned int getFwVersion() const
Definition: usbdevice.h:50
const DSOModel * getModel() const
Get the oscilloscope model.
Definition: usbdevice.h:144
struct libusb_device_descriptor descriptor
Definition: usbdevice.h:162
int bulkRead(const T *command, int attempts=HANTEK_ATTEMPTS)
Bulk read from the oscilloscope.
Definition: usbdevice.h:85
USBDevice(DSOModel *model, libusb_device *device, unsigned findIteration=0)
Definition: usbdevice.cpp:80
#define HANTEK_EP_IN
IN Endpoint for bulk transfers.
Definition: usbdevicedefinitions.h:11
int controlRead(const T *command)
Control read to the oscilloscope.
Definition: usbdevice.h:122
Describes a device This is the central class to describe a hantek compatible DSO. It contains all usb...
Definition: dsomodel.h:16
int claimInterface(const libusb_interface_descriptor *interfaceDescriptor)
Definition: usbdevice.cpp:142
int controlTransfer(unsigned char type, unsigned char request, unsigned char *data, unsigned int length, int value, int index, int attempts=HANTEK_ATTEMPTS)
Control transfer to the oscilloscope.
Definition: usbdevice.cpp:245
void overwriteInPacketLength(unsigned len)
Definition: usbdevice.h:151
unsigned inPacketLength
Packet length for the IN endpoint.
Definition: usbdevice.h:169
int controlWrite(const T *command)
Control write to the oscilloscope.
Definition: usbdevice.h:112
QString libUsbErrorString(int error)
Returns string representation for libusb errors.
Definition: usbdevice.cpp:15
void setFindIteration(unsigned iteration)
Definition: usbdevice.h:56
uint64_t UniqueUSBid
Definition: usbdevice.h:16
int bulkWrite(const unsigned char *data, unsigned int length, int attempts=HANTEK_ATTEMPTS)
Bulk write to the oscilloscope.
Definition: usbdevice.h:75
int bulkReadMulti(unsigned char *data, unsigned length, int attempts=HANTEK_ATTEMPTS_MULTI)
Multi packet bulk read from the oscilloscope.
Definition: usbdevice.cpp:218
#define HANTEK_TIMEOUT
Timeout for USB transfers in ms.
Definition: usbdevicedefinitions.h:5
bool needsFirmware()
Definition: usbdevice.cpp:190
int bulkTransfer(unsigned char endpoint, const unsigned char *data, unsigned int length, int attempts=HANTEK_ATTEMPTS, unsigned int timeout=HANTEK_TIMEOUT)
Bulk transfer to/from the oscilloscope.
Definition: usbdevice.cpp:197
#define HANTEK_ATTEMPTS_MULTI
The number of multi packet transfer attempts.
Definition: usbdevicedefinitions.h:8
This class handles the USB communication with an usb device that has one in and one out endpoint...
Definition: usbdevice.h:28
UniqueUSBid getUniqueUSBDeviceID() const
Definition: usbdevice.h:136
unsigned findIteration
Definition: usbdevice.h:165
bool connectDevice(QString &errorMessage)
Definition: usbdevice.cpp:87
DSOModel * model
Definition: usbdevice.h:159
static UniqueUSBid computeUSBdeviceID(libusb_device *device)
Definition: usbdevice.cpp:49
libusb_device_handle * handle
Definition: usbdevice.h:164
bool isConnected()
Check if the oscilloscope is connected.
Definition: usbdevice.cpp:187
void deviceDisconnected()
The device has been disconnected.