getDetailedDeviceList method

List<UsbDeviceInfo> getDetailedDeviceList()

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;
}