在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_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设备句柄*
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);
作废图书馆(作废);
};
因此,我的问题是:
- 这是一个好的解决方案/课程设计吗?你认为呢
- 你的主张/建议是什么
- 我如何改进它?我应该改变什么
- 我应该创建/删除哪些类
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);
};