在C+中包装libusb库+; 我想在我的C++应用程序中使用LIUBB库。我创建了封装libusb函数的类。您可以看到,libusbapi分为八个部分:

在C+中包装libusb库+; 我想在我的C++应用程序中使用LIUBB库。我创建了封装libusb函数的类。您可以看到,libusbapi分为八个部分:,c++,c,libusb,word-wrap,C++,C,Libusb,Word Wrap,对我来说,最必要的部分是: 设备处理和枚举 同步设备I/O 库初始化/去初始化 杂 我还将“设备处理和枚举”部分分为“设备信息”和“设备处理”。要使用libusb函数,需要初始化libusb库(调用libusb_init函数),将其初始化的libusb_上下文*存储在某处,然后调用函数(libusb_get_device_list,libusb_open_device_with_vid_pid)以获取并存储在某处的“设备指针”(在libusb中称为libusb\u device*或libus

对我来说,最必要的部分是:

  • 设备处理和枚举
  • 同步设备I/O
  • 库初始化/去初始化
我还将“设备处理和枚举”部分分为“设备信息”和“设备处理”。要使用libusb函数,需要初始化libusb库(调用
libusb_init
函数),将其初始化的
libusb_上下文*
存储在某处,然后调用函数(
libusb_get_device_list
libusb_open_device_with_vid_pid
)以获取并存储在某处的“设备指针”(在libusb中称为
libusb\u device*
libusb\u device\u handle*
),然后最后调用用于获取设备信息或执行一些USB传输的函数(例如:
libusb\u set\u配置
libusb\u get\u bus\u number
)。注意,这些函数需要“设备指针”:
libusb\u设备\u句柄*
libusb\u设备*
作为第一个参数。您可以在这里看到初始化/打开/控制设备的整个过程:

目前,我的解决方案由以下类组成:

  • LibusbInfoAPI:提供获取设备信息的函数
  • LibusbControlAPI:提供控制设备的函数
  • LibusbHandlingAPI:创建、销毁、管理设备,并存储
    libusb\u上下文*
    libusb\u设备*
    libusb\u设备句柄*
LibusbControlAPI头:

class LibusbControlAPI
{
    public:
        int GetConfiguration(DevHandlePtr deviceHandle, int& activeConfiguration);
        int SetConfiguration(DevHandlePtr deviceHandle, int targetConfiguration);

        int ClaimInterface(DevHandlePtr deviceHandle, int interfaceNumber);
        int ReleaseInterface(DevHandlePtr deviceHandle, int interfaceNumber);
        int SetInterfaceAlternateSetting(DevHandlePtr deviceHandle, int interfaceNumber, int alternateSetting);

        int ClearHalt(DevHandlePtr deviceHandle, USBEndpoint endpoint);

        int SendControlTransfer(DevHandlePtr deviceHandle,
                uint8_t bmRequestType,
                uint8_t bRequest,
                uint16_t wValue,
                uint16_t wIndex,
                unsigned char * buffer,
                uint16_t wLength,
                unsigned int timeout);

        int SendInterruptTransfer(DevHandlePtr deviceHandle,
                USBEndpoint endpoint,
                unsigned char * buffer,
                int length,
                int & transferred,
                unsigned int timeout);

        int SendBlukTransfer(DevHandlePtr deviceHandle,
                USBEndpoint endpoint,
                unsigned char * buffer,
                int length,
                int & transferred,
                unsigned int timeout);
};
cpp文件的一部分:

int LibusbControlAPI::GetConfiguration(DevHandlePtr deviceHandle, int & activeConfiguration)
{
    int result;
    int * configuration = nullptr;

    if (!deviceHandle->m_opened)
        return 1;

    result = libusb_get_configuration(deviceHandle->m_libusbData->m_libusbDeviceHandle, configuration);
    if (result != 0)
        return 1;

    activeConfiguration = *configuration;
    return 0;
}
与LibusbInfoAPI头类似,我有:

class LibusbInfoAPI
{
    public:
        int GetBusNumber(DevHandlePtr deviceHandle, uint8_t& busNumber);
        int GetPortNumber(DevHandlePtr deviceHandle, uint8_t& portNumber);

        int GetDeviceAddress(DevHandlePtr deviceHandle, uint8_t& deviceAddress);
        int GetDeviceSpeed(DevHandlePtr deviceHandle, USBSpeed& usbSpeed);

        int GetMaxPacketSize(DevHandlePtr deviceHandle, USBEndpoint endpoint, int& maxPacketSize);
        int GetMaxIsoPacketSize(DevHandlePtr deviceHandle, USBEndpoint endpoint, int& isoMaxPacketSize);
};
…和LibusbHandlingAPI(在这个类中,我存储libusb结构,在
CreateDevice
函数中,我返回一个指针,用于
LibusbControlAPI
LibusbInfoAPI
):

LibusbHandlingAPI类
{
私人:
typedef std::vector DevHandlePtrVect;
设计和安装设备和仪表;
LibusbContextPtr m_libusbContext;
公众:
DevHandlePtr CreateDevice(uint16供应商ID、uint16产品ID);
DevHandlePtr CreateDevice(uint16\u t供应商ID、uint16\u t产品ID、uint8\u t总线号、uint8\u t*端口号、int端口号长度);
真空破坏装置(DevHandlePtr装置手柄);
int OpenDevice(DevHandlePtr deviceHandle);
内部关闭装置(DevHandlePtr装置手柄);
int InitializeLibrary(SystemLibraryLogLevel logLevel);
作废图书馆(作废);
};
因此,我的问题是:

  • 这是一个好的解决方案/课程设计吗?你认为呢
  • 你的主张/建议是什么
  • 我如何改进它?我应该改变什么
  • 我应该创建/删除哪些类

这看起来不错,我已将主题转移到codereview.stackexchange.com
class LibusbHandlingAPI
{
    private:
        typedef std::vector<DevHandlePtr> DevHandlePtrVect;

        DevHandlePtrVect m_deviceHandleVect;
        LibusbContextPtr m_libusbContext;

    public:
        DevHandlePtr CreateDevice(uint16_t vendorId, uint16_t productId);
        DevHandlePtr CreateDevice(uint16_t vendorId, uint16_t productId, uint8_t busNumber, uint8_t * portNumbers, int portNumbersLength);
        void DestroyDevice(DevHandlePtr deviceHandle);

        int OpenDevice(DevHandlePtr deviceHandle);
        int CloseDevice(DevHandlePtr deviceHandle);

        int InitializeLibrary(SystemLibraryLogLevel logLevel);
        void DestroyLibrary(void);
};