getDeviceDetails method

Map<String, dynamic> getDeviceDetails(
  1. int vendorId,
  2. int productId
)

Implementation

Map<String, dynamic> getDeviceDetails(int vendorId, int productId) {
  final handle = openDevice(vendorId, productId);
  if (handle == null) {
    return {'error': 'No se pudo abrir el dispositivo'};
  }

  try {
    final configDescriptor = calloc<Pointer<libusb_config_descriptor>>();

    // Obtener el descriptor de configuración activo
    final result = _bindings.libusb_get_active_config_descriptor(
        nullptr, configDescriptor);

    if (result < 0) {
      return {
        'error': 'No se pudo obtener el descriptor de configuración',
        'errorCode': result
      };
    }

    final config = configDescriptor.value;

    // Extraer información de interfaces y endpoints
    List<Map<String, dynamic>> interfaces = [];

    // Imprimir los campos disponibles para depuración
    log("Campos disponibles en config.ref: ${config.ref.toString()}");

    // Acceder a las interfaces de manera diferente
    // Necesitamos verificar qué campo contiene las interfaces
    // Posibles nombres: interface, interfaces, itf, etc.

    final numInterfaces = config.ref.bNumInterfaces;
    log("Número de interfaces: $numInterfaces");

    // Usar una aproximación diferente: obtener cada interfaz directamente
    for (int i = 0; i < numInterfaces; i++) {
      // Intenta obtener la interfaz a través de un método alternativo
      // Por ejemplo, podemos usar libusb_get_interface para obtener el número de interfaz actual
      final interfaceNumber = _bindings.libusb_claim_interface(handle, i);

      Map<String, dynamic> interfaceInfo = {
        'interfaceNumber': interfaceNumber,
        'endpoints': <Map<String, dynamic>>[]
      };

      interfaces.add(interfaceInfo);
    }

    // Liberar recursos
    _bindings.libusb_free_config_descriptor(config);

    return {
      'configValue': config.ref.bConfigurationValue,
      'maxPower': config.ref.MaxPower,
      'selfPowered': (config.ref.bmAttributes & 0x40) != 0,
      'remoteWakeup': (config.ref.bmAttributes & 0x20) != 0,
      'numInterfaces': numInterfaces,
      'interfaces': interfaces,
      'note':
          'Información de interfaces limitada debido a la estructura generada'
    };
  } catch (e) {
    return {
      'error': 'Error al obtener detalles del dispositivo',
      'message': e.toString()
    };
  } finally {
    closeDevice(handle);
  }
}