856 lines
24 KiB
C++
856 lines
24 KiB
C++
// -*- C++;indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*-
|
|
#ifndef __USBPP_HEADER__
|
|
#define __USBPP_HEADER__
|
|
|
|
#include <string>
|
|
#include <list>
|
|
|
|
#include <usb.h>
|
|
|
|
/*
|
|
* The following usb.h function is not wrapped yet:
|
|
* char *usb_strerror(void);
|
|
*/
|
|
|
|
|
|
/**
|
|
* \brief Classes to access Universal Serial Bus devices
|
|
*
|
|
* The USB Namespace provides a number of classes to work
|
|
* with Universal Serial Bus (USB) devices attached to the
|
|
* system.
|
|
*
|
|
* \author Brad Hards
|
|
*/
|
|
namespace USB {
|
|
|
|
class Device;
|
|
|
|
/**
|
|
* \brief Class representing a device endpoint
|
|
*
|
|
* This class represents a device endpoint. You need this class to
|
|
* perform bulk reads and writes.
|
|
*
|
|
*/
|
|
class Endpoint {
|
|
/**
|
|
* Busses is a friend because it fills in the descriptor type
|
|
* information on initialisation and rescan.
|
|
*/
|
|
friend class Busses;
|
|
public:
|
|
Endpoint() {};
|
|
|
|
#ifdef USE_UNTESTED_LIBUSBPP_METHODS
|
|
/**
|
|
* \brief Bulk write
|
|
*
|
|
* This method performs a bulk transfer to the endpoint.
|
|
*
|
|
* \param message is the message to be sent.
|
|
* \param timeout is the USB transaction timeout in milliseconds
|
|
*
|
|
* \returns the number of bytes sent, or a negative value on
|
|
* failure
|
|
*/
|
|
int bulkWrite(QByteArray message, int timeout = 100);
|
|
|
|
/**
|
|
* \brief Bulk read
|
|
*
|
|
* This method performs a bulk transfer from the endpoint.
|
|
*
|
|
* \param length is the maximum data transfer required.
|
|
* \param message is the message that was received.
|
|
* \param timeout is the USB transaction timeout in milliseconds
|
|
*
|
|
* \returns the number of bytes received, or a negative value on
|
|
* failure
|
|
*/
|
|
int bulkRead(int length, unsigned char *message, int timeout = 100);
|
|
|
|
/**
|
|
* \brief Reset endpoint
|
|
*
|
|
* This method resets the endpoint.
|
|
*/
|
|
int reset(void);
|
|
|
|
/**
|
|
* \brief Clear halt
|
|
*
|
|
* This method clears a halt (stall) on the endpoint.
|
|
*/
|
|
int clearHalt(void);
|
|
|
|
#endif /* USE_UNTESTED_LIBUSBPP_METHODS */
|
|
|
|
/**
|
|
* \brief Endpoint descriptor information output
|
|
*
|
|
* This method dumps out the various characteristics
|
|
* of the endpoint to standard output.
|
|
*
|
|
* It is mostly useful for debugging.
|
|
*/
|
|
void dumpDescriptor(void);
|
|
|
|
private:
|
|
void setDescriptor(struct usb_endpoint_descriptor);
|
|
void setParent(Device *parent);
|
|
u_int8_t m_Length;
|
|
u_int8_t m_DescriptorType;
|
|
u_int8_t m_EndpointAddress;
|
|
u_int8_t m_Attributes;
|
|
u_int16_t m_MaxPacketSize;
|
|
u_int8_t m_Interval;
|
|
u_int8_t m_Refresh;
|
|
u_int8_t m_SynchAddress;
|
|
Device *m_parent;
|
|
};
|
|
|
|
class AltSetting : public std::list<Endpoint *> {
|
|
/**
|
|
* Busses is a friend because it fills in the descriptor type
|
|
* information on initialisation and rescan.
|
|
*/
|
|
friend class Busses;
|
|
public:
|
|
AltSetting() {};
|
|
u_int8_t numEndpoints(void);
|
|
|
|
/**
|
|
* \brief AltSetting descriptor information output
|
|
*
|
|
* This method dumps out the various characteristics
|
|
* of the alternate setting to standard output.
|
|
*
|
|
* It is mostly useful for debugging.
|
|
*/
|
|
void dumpDescriptor(void);
|
|
|
|
Endpoint *firstEndpoint(void);
|
|
Endpoint *nextEndpoint(void);
|
|
Endpoint *lastEndpoint(void);
|
|
|
|
private:
|
|
std::list<Endpoint *>::const_iterator iter;
|
|
|
|
void setDescriptor(struct usb_interface_descriptor);
|
|
/* we don't use a normal usb_interface_descriptor */
|
|
/* because that would bring in the endpoint list */
|
|
u_int8_t m_Length;
|
|
u_int8_t m_DescriptorType;
|
|
u_int8_t m_InterfaceNumber;
|
|
u_int8_t m_AlternateSetting;
|
|
u_int8_t m_NumEndpoints;
|
|
u_int8_t m_InterfaceClass;
|
|
u_int8_t m_InterfaceSubClass;
|
|
u_int8_t m_InterfaceProtocol;
|
|
u_int8_t m_Interface;
|
|
};
|
|
|
|
/**
|
|
* \brief Class representing an interface of a Device
|
|
*
|
|
* The Interface class represents a USB interface
|
|
* for a device attached to a Universal Serial Bus.
|
|
*
|
|
* Interfaces are the main element of the USB class
|
|
* structure.
|
|
*
|
|
* \author Brad Hards
|
|
*/
|
|
class Interface : public std::list<AltSetting *> {
|
|
/**
|
|
* Busses is a friend because it fills in the descriptor type
|
|
* information on initialisation and rescan.
|
|
*/
|
|
friend class Busses;
|
|
public:
|
|
Interface() {};
|
|
|
|
#ifdef LIBUSB_HAS_GET_DRIVER_NP
|
|
/**
|
|
* \brief get the current driver for an interface
|
|
*
|
|
* \param driver a string containing the name of the current
|
|
* driver for the interface. You can typically pass in an empty
|
|
* string for this.
|
|
*
|
|
* \return length of string, or 0 on error.
|
|
*/
|
|
int driverName(std::string &driver);
|
|
#endif
|
|
|
|
#ifdef USE_UNTESTED_LIBUSBPP_METHODS
|
|
/**
|
|
* \brief Claim this interface
|
|
*
|
|
* This method claims the interface. You have to claim the
|
|
* interface before performing any operations on the interface (or
|
|
* on endpoints that are part of the interface).
|
|
*
|
|
* \return 0 on success or negative number on error.
|
|
*/
|
|
int claim(void);
|
|
|
|
/**
|
|
* \brief Release this interface
|
|
*
|
|
* This method releases the interface. You should release the
|
|
* interface after all operations on it (and any lower level
|
|
* endpoints) are completed.
|
|
*
|
|
* \return 0 on success or negative number on error.
|
|
*/
|
|
int release(void);
|
|
|
|
/**
|
|
* \brief Set interface alternate setting
|
|
*
|
|
* This method sets the interface to a particular AltSetting.
|
|
*
|
|
* \param altSettingNumber the AltSetting that the interface
|
|
* should be changed to.
|
|
*
|
|
* \return 0 on success, or a negative number in case of error.
|
|
*/
|
|
int setAltSetting(int altSettingNumber);
|
|
#endif /* USE_UNTESTED_LIBUSBPP_METHODS */
|
|
|
|
/**
|
|
* \brief Number of Alternative Settings that this interface has
|
|
*
|
|
* This is a simple accessor method that specifies the number
|
|
* alternative settings that this device interface has.
|
|
*/
|
|
u_int8_t numAltSettings(void);
|
|
|
|
/**
|
|
* \brief First AltSetting for the Interface
|
|
*
|
|
* This method returns a pointer to the first AltSetting
|
|
* for the Interface.
|
|
*
|
|
* See nextAltSetting() for an example of how it might be
|
|
* used.
|
|
*
|
|
* \see nextAltSetting(), lastAltSetting(), numAltSettings()
|
|
*/
|
|
AltSetting *firstAltSetting(void);
|
|
|
|
/**
|
|
* \brief Next AltSetting for the Interface
|
|
*
|
|
* This method returns a pointer to the next AltSetting
|
|
* for the Interface.
|
|
*
|
|
* If you want to iterate through each AltSetting on
|
|
* a device, you can use something like the following:
|
|
* \code
|
|
* USB::Configuration *this_Configuration;
|
|
* this_Configuration = device->firstConfiguration();
|
|
* for (i=0; i < device->numConfigurations(); i++) {
|
|
* this_Configuration->dumpDescriptor();
|
|
* USB::Interface *this_Interface;
|
|
* this_Interface = this_Configuration->firstInterface();
|
|
* for (j=0; j < this_Configuration->numInterfaces(); j++) {
|
|
* USB::AltSetting *this_AltSetting;
|
|
* this_AltSetting = this_Interface->firstAltSetting();
|
|
* for (k=0; k < this_Interface->numAltSettings(); k++) {
|
|
* // do something with this_AltSetting
|
|
* this_AltSetting = this_Interface->nextAltSetting();
|
|
* }
|
|
* this_Interface = this_Configuration->nextInterface();
|
|
* }
|
|
* this_Configuration = device->nextConfiguration();
|
|
* }
|
|
* \endcode
|
|
*
|
|
* \see firstAltSetting(), lastAltSetting(), numAltSettings()
|
|
*/
|
|
AltSetting *nextAltSetting(void);
|
|
|
|
/**
|
|
* \brief Last AltSetting for the Interface
|
|
*
|
|
* This method returns a pointer to the last AltSetting
|
|
* for the Interface.
|
|
*
|
|
* \see firstAltSetting(), nextAltSetting(), numAltSettings()
|
|
*/
|
|
|
|
AltSetting *lastAltSetting(void);
|
|
|
|
private:
|
|
std::list<AltSetting *>::const_iterator iter;
|
|
|
|
void setNumAltSettings(u_int8_t);
|
|
void setParent(Device *parent);
|
|
u_int8_t m_numAltSettings;
|
|
Device *m_parent;
|
|
|
|
/* index representing the interface, in this configuration */
|
|
int m_interfaceNumber;
|
|
void setInterfaceNumber(int interfaceNumber);
|
|
};
|
|
|
|
/**
|
|
* \brief Class representing a configuration of a Device
|
|
*
|
|
* The Configuration class represents a single configuration
|
|
* of a device attached to a Universal Serial Bus.
|
|
*
|
|
* \author Brad Hards
|
|
*/
|
|
class Configuration : public std::list<Interface *> {
|
|
/**
|
|
* Busses is a friend because it fills in the descriptor type
|
|
* information on initialisation and rescan.
|
|
*/
|
|
friend class Busses;
|
|
public:
|
|
Configuration() {};
|
|
|
|
/**
|
|
* \brief Configuration descriptor information output
|
|
*
|
|
* This method dumps out the various characteristics
|
|
* of the configuration to standard output.
|
|
*
|
|
* It is mostly useful for debugging.
|
|
*/
|
|
void dumpDescriptor(void);
|
|
|
|
/**
|
|
* \brief Number of Interfaces that this device has
|
|
*
|
|
* This is a simple accessor method that specifies the number
|
|
* Interfaces that this device configuration has.
|
|
*/
|
|
u_int8_t numInterfaces(void);
|
|
|
|
/**
|
|
* \brief First Interface for the Configuration
|
|
*
|
|
* This method returns a pointer to the first Interface
|
|
* for the Configuration.
|
|
*
|
|
* See nextInterface() for an example of how it might be
|
|
* used.
|
|
*
|
|
* \see nextInterface(), lastInterface(), numInterfaces()
|
|
*/
|
|
Interface *firstInterface(void);
|
|
|
|
/**
|
|
* \brief Next Interface for the Configuration
|
|
*
|
|
* This method returns a pointer to the next Interface
|
|
* for the Configuration.
|
|
*
|
|
* If you want to iterate through each Interface on
|
|
* a device, you can use something like the following:
|
|
* \code
|
|
* USB::Configuration *this_Configuration;
|
|
* this_Configuration = device->firstConfiguration();
|
|
* for (i=0; i < device->numConfigurations(); i++) {
|
|
* this_Interface = this_Configuration->firstInterface();
|
|
* for (j=0; j < this_Configuration->numInterfaces(); j++) {
|
|
* // do something with this_Interface
|
|
* this_Interface = this_Configuration->nextInterface();
|
|
* }
|
|
* this_Configuration->nextConfiguration();
|
|
* }
|
|
* \endcode
|
|
*
|
|
* \see firstInterface(), lastInterface(), numInterfaces()
|
|
*/
|
|
Interface *nextInterface(void);
|
|
|
|
/**
|
|
* \brief Last Interface for the Configuration
|
|
*
|
|
* This method returns a pointer to the last Interface
|
|
* for the Configuration.
|
|
*
|
|
* \see firstInterface(), nextInterface(), numInterfaces()
|
|
*/
|
|
Interface *lastInterface(void);
|
|
|
|
private:
|
|
std::list<Interface *>::const_iterator iter;
|
|
|
|
void setDescriptor(struct usb_config_descriptor);
|
|
/* we don't use a normal usb_config_descriptor */
|
|
/* because that would bring in the interface list */
|
|
u_int8_t m_Length;
|
|
u_int8_t m_DescriptorType;
|
|
u_int16_t m_TotalLength;
|
|
u_int8_t m_NumInterfaces;
|
|
u_int8_t m_ConfigurationValue;
|
|
u_int8_t m_Configuration;
|
|
u_int8_t m_Attributes;
|
|
u_int8_t m_MaxPower;
|
|
};
|
|
|
|
/**
|
|
* \brief Class representing a Device on the Bus
|
|
*
|
|
* The Device class represents a single device
|
|
* attached to a Universal Serial Bus.
|
|
*
|
|
* \author Brad Hards
|
|
*/
|
|
class Device : public std::list<Configuration *> {
|
|
/**
|
|
* Busses is a friend because it fills in the descriptor type
|
|
* information on initialisation and rescan.
|
|
*/
|
|
friend class Busses;
|
|
/**
|
|
* Interface is a friend because it needs the handle() function to
|
|
* perform claim(), release().
|
|
*/
|
|
friend class Interface;
|
|
/**
|
|
* Endpoint is a friend because it needs the handle() function to
|
|
* perform reads, writes, and other transactions.
|
|
*/
|
|
friend class Endpoint;
|
|
|
|
public:
|
|
Device() {};
|
|
~Device();
|
|
|
|
/**
|
|
* \brief OS representation of filename for this device
|
|
*
|
|
* libusb++ provides a uniform way of accessing USB
|
|
* devices irrespective of the underlying Operation System
|
|
* representation. If you want to map the libusb++ representation
|
|
* to the Operating System representation, you can do this
|
|
* with filename().
|
|
*
|
|
* On Linux, the filename is usually something like 002, which
|
|
* represents the second device (usually the first real device,
|
|
* after the root hub pseudo-device) on the bus.
|
|
*
|
|
* \see Bus::directoryName()
|
|
*/
|
|
std::string fileName(void);
|
|
|
|
/**
|
|
* \brief The vendor ID number, as provided by the device.
|
|
*
|
|
* This method returns a number containing the vendor
|
|
* (manufacturer) identification number. These are allocated
|
|
* by the USB Implementers Forum, and you can construct a
|
|
* lookup based on the number to get the manufacturer's name,
|
|
* even if the device does not contain a vendor string.
|
|
*
|
|
* \see Vendor()
|
|
*/
|
|
u_int16_t idVendor(void);
|
|
|
|
/**
|
|
* \brief The product ID number, as provided by the device.
|
|
*
|
|
* This method returns a number containing the product
|
|
* identification number. These are allocated
|
|
* by the manufacturer, and should be different on each device.
|
|
*
|
|
* \see Product()
|
|
*/
|
|
u_int16_t idProduct(void);
|
|
|
|
/**
|
|
* \brief The product's revision ID, as provided by the device.
|
|
*
|
|
* This method returns a number containing the product's revision.
|
|
* This revision level is nominally binary coded decimal, but
|
|
* hexadecimal revision levels are not uncommon. The binary coded
|
|
* decimal version nominally has a major version in the high byte,
|
|
* and a minor version in the low byte.
|
|
*/
|
|
u_int16_t idRevision(void);
|
|
|
|
/**
|
|
* \brief The device's USB class, as provided by the device.
|
|
*
|
|
* This method returns a number containing the device's class.
|
|
* These are defined by the USB Implementer's Forum.
|
|
*
|
|
* A code of Zero is special (and common) - it means that the
|
|
* class is found in the Interface descriptor, rather than in the
|
|
* Device descriptor.
|
|
*
|
|
* A code of 0xFF is also special (and far too common) - it means
|
|
* that the manufacturer didn't conform to one of the defined
|
|
* class specifications, and chose to implement a vendor specified
|
|
* protocol.
|
|
*
|
|
*/
|
|
u_int8_t devClass(void);
|
|
|
|
/**
|
|
* \brief The device's USB subclass, as provided by the device.
|
|
*
|
|
* This method returns a number containing the device's subclass.
|
|
* These subclasses are defined by the USB Implementer's Forum,
|
|
* and only have meaning in the context of a specified class.
|
|
*/
|
|
u_int8_t devSubClass(void);
|
|
|
|
/**
|
|
* \brief The device's USB protocol, as provided by the device.
|
|
*
|
|
* This method returns a number containing the device's protocol.
|
|
* These protocols are defined by the USB Implementer's Forum, and
|
|
* only have meaning in the context of a specified class and
|
|
* subclass.
|
|
*/
|
|
u_int8_t devProtocol(void);
|
|
|
|
|
|
/**
|
|
* \brief The vendor name string, as provided by the device.
|
|
*
|
|
* This method returns a string containing the name of the
|
|
* device's vendor (manufacturer), as encoded into the device.
|
|
*
|
|
* Note that not all devices contain a vendor name, and also
|
|
* that under some operating systems you may not be able to
|
|
* read the vendor name without elevated privledges (typically
|
|
* root privledges).
|
|
*
|
|
* \see idVendor()
|
|
**/
|
|
std::string Vendor(void);
|
|
|
|
/**
|
|
* \brief The product name string, as provided by the device.
|
|
*
|
|
* This method returns a string containing the name of the
|
|
* device's product name, as encoded into the device.
|
|
*
|
|
* Note that not all devices contain a product name, and also
|
|
* that under some operating systems you may not be able to
|
|
* read the vendor name without elevated privledges (typically
|
|
* root privledges).
|
|
*
|
|
* \see idProduct()
|
|
**/
|
|
std::string Product(void);
|
|
|
|
/**
|
|
* \brief The serial number string, as provided by the device.
|
|
*
|
|
* This method returns a string containing a serial number for
|
|
* the device, as encoded into the device.
|
|
*
|
|
* Note that few devices contain a serial number string, and also
|
|
* that under some operating systems you may not be able to
|
|
* read the serial number without elevated privledges (typically
|
|
* root privledges). The USB specification requires that serial
|
|
* numbers are unique if they are provided, but adherence to this
|
|
* requirement by manufacturers is not universal.
|
|
**/
|
|
std::string SerialNumber(void);
|
|
|
|
/**
|
|
* \brief Number of Configurations that this device has
|
|
*
|
|
* This is a simple accessor method that specifies the number
|
|
* configurations that this device has.
|
|
*/
|
|
u_int8_t numConfigurations(void);
|
|
|
|
/**
|
|
* \brief fetch an arbitrary string from the device
|
|
*
|
|
* \param string the string from the device. You can typically
|
|
* pass in an empty string for this.
|
|
* \param index the index of the string required
|
|
* \param lang the language ID to use. Defaults to using the
|
|
* first language ID.
|
|
*
|
|
* \return length of string, or 0 on error.
|
|
*/
|
|
int string(std::string &buf, int index, u_int16_t lang=0);
|
|
|
|
/**
|
|
* \brief First Configuration for the Device
|
|
*
|
|
* This method returns a pointer to the first Configuration
|
|
* for the Device.
|
|
*
|
|
* See nextConfiguration() for an example of how it might be
|
|
* used.
|
|
*/
|
|
Configuration *firstConfiguration(void);
|
|
|
|
/**
|
|
* \brief Next Configuration for the Device
|
|
*
|
|
* This method returns a pointer to the next Configuration
|
|
* for the Device.
|
|
*
|
|
* If you want to iterate through each Configuration on
|
|
* a device, you can use something like the following:
|
|
* \code
|
|
* USB::Configuration *this_Configuration;
|
|
* this_Configuration = device->firstConfiguration();
|
|
* for (i=0; i < device->numConfigurations(); i++) {
|
|
* // do something with this_Configuration
|
|
* this_Configuration->nextConfiguration();
|
|
* }
|
|
* \endcode
|
|
*/
|
|
Configuration *nextConfiguration(void);
|
|
|
|
/**
|
|
* \brief Last Configuration for the Device
|
|
*
|
|
* This method returns a pointer to the last Configuration
|
|
* for the Device.
|
|
*
|
|
*/
|
|
Configuration *lastConfiguration(void);
|
|
|
|
/**
|
|
* \brief USB control transfer
|
|
*
|
|
* This method performs a standard control transfer to the default
|
|
* endpoint. See the USB specification for more details on this.
|
|
*
|
|
* \param requestType corresponds to the bmRequestType field
|
|
* in the transfer
|
|
* \param request corresponds to the bRequest field in the
|
|
* transfer
|
|
* \param value corresponds to the wValue field in the transfer
|
|
* \param index corresponds to the wIndex field in the transfer
|
|
* \param length corresponds to the wLength field in the transfer
|
|
* \param payload corresponds to the data phase of a control
|
|
* transfer
|
|
* \param timeout is the timeout period for the control transfer,
|
|
* in milliseconds
|
|
*
|
|
* \return number of bytes sent or received, or a negative number
|
|
* in case of error.
|
|
*/
|
|
int controlTransfer(u_int8_t requestType, u_int8_t request,
|
|
u_int16_t value, u_int16_t index, u_int16_t length,
|
|
unsigned char *payload,
|
|
int timeout = 100);
|
|
|
|
#ifdef USE_UNTESTED_LIBUSBPP_METHODS
|
|
/**
|
|
* \brief USB device reset
|
|
*
|
|
* This method performs a device reset - see USB Specification
|
|
* 9.1 for how this changes the device state to the Default state.
|
|
*
|
|
* \return 0 on success, or a negative number in case of error.
|
|
*/
|
|
int reset(void);
|
|
|
|
/**
|
|
* \brief Set device configuration
|
|
*
|
|
* This method sets the device to a particular Configuration.
|
|
*
|
|
* \param configurationNumber the configuration that the device
|
|
* should be changed to.
|
|
*
|
|
* \return 0 on success, or a negative number in case of error.
|
|
*/
|
|
int setConfiguration(int configurationNumber);
|
|
#endif /* USE_UNTESTED_LIBUSBPP_METHODS */
|
|
|
|
private:
|
|
std::list<Configuration *>::const_iterator iter;
|
|
|
|
struct usb_dev_handle *handle();
|
|
void setFileName(std::string);
|
|
void setDescriptor(struct usb_device_descriptor);
|
|
void setVendor(std::string);
|
|
void setProduct(std::string);
|
|
void setSerialNumber(std::string);
|
|
void setDevHandle(struct usb_dev_handle *);
|
|
std::string m_fileName;
|
|
std::string m_Vendor;
|
|
std::string m_Product;
|
|
std::string m_SerialNumber;
|
|
struct usb_device *m_dev;
|
|
struct usb_dev_handle *m_handle;
|
|
struct usb_device_descriptor m_descriptor;
|
|
};
|
|
|
|
/**
|
|
* \brief Class representing a single bus on the machine
|
|
*
|
|
* This class is essentially a list of Device class instances
|
|
*/
|
|
class Bus : public std::list<Device *> {
|
|
/**
|
|
* Busses is a friend because it fills in the directory name
|
|
* information on initialisation and rescan.
|
|
*/
|
|
friend class Busses;
|
|
public:
|
|
Bus() {};
|
|
/**
|
|
* \brief OS representation of directory name for this Bus
|
|
*
|
|
* libusb++ provides a uniform way of accessing USB
|
|
* busses irrespective of the underlying Operation System
|
|
* representation. If you want to map the libusb++ representation
|
|
* to the Operating System representation, you can do this
|
|
* with directory name().
|
|
*
|
|
* On Linux, the directoryname is usually something like 003, which
|
|
* represents the third bus on the host.
|
|
*
|
|
* \see Directory::filename()
|
|
*/
|
|
std::string directoryName(void);
|
|
private:
|
|
std::list<Device *>::const_iterator iter;
|
|
|
|
void setDirectoryName(std::string);
|
|
std::string m_directoryName;
|
|
};
|
|
|
|
/**
|
|
* \brief A vendor/product ID pair
|
|
*
|
|
* DeviceID provides a list of (vendor, product) identification
|
|
* pairs. It is intended for use in a list of device numbers to
|
|
* search for, but there is no reason why it couldn't be used for a
|
|
* general purpose (vendor,product) tuple if you had some reason for
|
|
* this.
|
|
*
|
|
* The description for Busses::match() provides an example of how
|
|
* this class might be used.
|
|
*
|
|
* \see DeviceIDList, Busses::match()
|
|
*/
|
|
class DeviceID {
|
|
public:
|
|
DeviceID() {};
|
|
/**
|
|
* \brief Standard constructor
|
|
*
|
|
* This constructor takes (vendor, product) tuple, which are
|
|
* stored away.
|
|
*
|
|
* \param vendor the 16 bit vendor number for the device
|
|
* \param product the 16 bit product number for the device
|
|
*/
|
|
DeviceID(u_int16_t vendor, u_int16_t product);
|
|
|
|
/**
|
|
* \brief vendor number for the device
|
|
*
|
|
* This method returns the 16 bit vendor number.
|
|
*/
|
|
u_int16_t vendor(void);
|
|
|
|
/**
|
|
* \brief product number for the device
|
|
*
|
|
* This method returns the 16 bit product number.
|
|
*/
|
|
u_int16_t product(void);
|
|
|
|
private:
|
|
u_int16_t m_vendor;
|
|
u_int16_t m_product;
|
|
};
|
|
|
|
/**
|
|
* \brief A list of vendor/product pairs
|
|
*
|
|
* DeviceIDList provides a list of DeviceID classes, which is
|
|
* essentially a list of (vendor, product) identification pairs.
|
|
*
|
|
* \see DeviceID
|
|
*/
|
|
typedef std::list<DeviceID> DeviceIDList;
|
|
|
|
/**
|
|
* \brief Class representing all the busses on the machine
|
|
*
|
|
* This class is essentially a list of Bus class instances
|
|
*/
|
|
class Busses : public std::list<Bus *> {
|
|
public:
|
|
Busses();
|
|
|
|
/**
|
|
* \brief Update method
|
|
*
|
|
* This method can be called to rescan the various devices
|
|
* attached to the various busses. You should use it to
|
|
* update if things change. Unfortunately there is no
|
|
* way to automatically detect this change in a portable way,
|
|
* so worst case is that you need to call this using some
|
|
* kind of timer in the background.
|
|
*/
|
|
void rescan(void);
|
|
|
|
/**
|
|
* \brief find all devices with matching device class designator
|
|
*
|
|
* This method searches every device on every bus, and returns a
|
|
* list of pointers to the devices that have a matching device
|
|
* class code
|
|
*/
|
|
std::list<Device *> match(u_int8_t Class);
|
|
|
|
/**
|
|
* \brief find all devices with matching device IDs
|
|
*
|
|
* This method searches every device on every bus, and returns a
|
|
* list of pointers to the devices that have a matching device
|
|
* ID. That is, if the (vendor, product) tuple of a device matches
|
|
* one of the tuples on the list, then the device will be added to
|
|
* the list of matches.
|
|
*
|
|
* An example of usage is shown below:
|
|
* \code
|
|
* USB::Busses buslist;
|
|
* USB::Device *device;
|
|
* std::list<USB::Device> miceFound;
|
|
* USB::DeviceIDList mouseList;
|
|
*
|
|
* mouseList.append(USB::DeviceID(VENDOR_LOGITECH, 0xC00E)); // Wheel Mouse Optical
|
|
* mouseList.append(USB::DeviceID(VENDOR_LOGITECH, 0xC012)); // MouseMan Dual Optical
|
|
* mouseList.append(USB::DeviceID(VENDOR_LOGITECH, 0xC506)); // MX700 Optical Mouse
|
|
*
|
|
* miceFound = buslist.match(mouseList);
|
|
*
|
|
* for ( device = miceFound.first(); device; device = miceFound.next() ) {
|
|
* // do something with each mouse that matched
|
|
* }
|
|
* FIXME: This is incorrect now
|
|
* \endcode
|
|
*/
|
|
std::list<Device *> match(DeviceIDList);
|
|
|
|
private:
|
|
std::list<Bus *>::const_iterator iter;
|
|
};
|
|
|
|
class Error {
|
|
public:
|
|
private:
|
|
};
|
|
|
|
}
|
|
#endif /* __USBPP_HEADER__ */
|
|
|