getDetailedDeviceList method
Implementation
List<UsbDeviceInfo> getDetailedDeviceList() {
final deviceListPtr = calloc<Pointer<Pointer<libusb_device>>>();
final count = _bindings.libusb_get_device_list(nullptr, deviceListPtr);
List<UsbDeviceInfo> deviceInfoList = [];
if (count > 0) {
final deviceList = deviceListPtr.value;
for (int i = 0; i < count; i++) {
final device = deviceList[i];
// Obtener descriptor del dispositivo
final deviceDescriptor = calloc<libusb_device_descriptor>();
_bindings.libusb_get_device_descriptor(device, deviceDescriptor);
// Obtener número de bus y dirección del dispositivo
final busNumber = _bindings.libusb_get_bus_number(device);
final deviceAddress = _bindings.libusb_get_device_address(device);
// Intentar abrir el dispositivo para obtener información de strings
String? manufacturer;
String? product;
String? serialNumber;
// Crear un puntero para el handle del dispositivo
final handlePtr = calloc<Pointer<libusb_device_handle>>();
// Intentar abrir el dispositivo
final result = _bindings.libusb_open(device, handlePtr);
if (result != 0) {
log("Error al abrir el dispositivo: $result");
} else {
// Obtener el handle del dispositivo
final handle = handlePtr.value;
log("Dispositivo USB abierto con éxito. ProductId: ${deviceDescriptor.ref.idProduct} - VendorId: ${deviceDescriptor.ref.idVendor}");
// Leer strings si están disponibles
if (deviceDescriptor.ref.iManufacturer > 0) {
manufacturer = _getStringDescriptor(
handle, deviceDescriptor.ref.iManufacturer);
//log("Fabricante: $manufacturer");
} else {
//log("El dispositivo no proporciona un descriptor de fabricante.");
}
if (deviceDescriptor.ref.iProduct > 0) {
product =
_getStringDescriptor(handle, deviceDescriptor.ref.iProduct);
}
if (deviceDescriptor.ref.iSerialNumber > 0) {
serialNumber = _getStringDescriptor(
handle, deviceDescriptor.ref.iSerialNumber);
}
// Cerrar el dispositivo
_bindings.libusb_close(handle);
}
// Liberar el puntero del handle
calloc.free(handlePtr);
// Crear objeto con la información del dispositivo
final deviceInfo = UsbDeviceInfo(
busNumber: busNumber,
deviceAddress: deviceAddress,
vendorId: deviceDescriptor.ref.idVendor,
productId: deviceDescriptor.ref.idProduct,
deviceClass: deviceDescriptor.ref.bDeviceClass,
deviceSubClass: deviceDescriptor.ref.bDeviceSubClass,
deviceProtocol: deviceDescriptor.ref.bDeviceProtocol,
manufacturer: manufacturer,
product: product,
serialNumber: serialNumber,
);
log('Agregar dispositivo: $deviceInfo');
deviceInfoList.add(deviceInfo);
// Liberar el descriptor del dispositivo
calloc.free(deviceDescriptor);
}
// Liberamos la lista de dispositivos
_bindings.libusb_free_device_list(deviceList, 1);
}
// Liberar el puntero de la lista de dispositivos
calloc.free(deviceListPtr);
return deviceInfoList;
}