getDeviceDetails method
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);
}
}