getDeviceEndpoints method

List<int> getDeviceEndpoints(
  1. Pointer<libusb_device> device
)

Implementation

List<int> getDeviceEndpoints(Pointer<libusb_device> device) {
  log("📌 Starting endpoint search...");

  final configDescriptor = calloc<Pointer<libusb_config_descriptor>>();
  //log("📌 Memoria asignada para configDescriptor");

  // 🔹 Cambiamos `nullptr` por el `device` correcto
  final result =
      _bindings.libusb_get_active_config_descriptor(device, configDescriptor);
  //log("📌 Resultado de get_active_config_descriptor: $result");

  if (result < 0) {
    //log("❌ Error al obtener configuración: ${_bindings.libusb_error_name(result).cast<Utf8>().toDartString()}");
    calloc.free(configDescriptor);
    return [];
  }

  final config = configDescriptor.value;
  //log("📌 Configuración obtenida con éxito");

  List<int> endpoints = [];

  //log("📌 Número de interfaces: ${config.ref.bNumInterfaces}");
  for (int i = 0; i < config.ref.bNumInterfaces; i++) {
    final interfacePointer = config.ref.interface1;

    if (interfacePointer.address == 0) {
      //log("❌ No se encontraron interfaces en la configuración.");
      _bindings.libusb_free_config_descriptor(config);
      return [];
    }

    final interface = (interfacePointer + i).ref;
    //log("📌 Interfaz $i: número de configuraciones ${interface.num_altsetting}");

    for (int j = 0; j < interface.num_altsetting; j++) {
      final altsetting = (interface.altsetting + j).ref;
      //log("📌 Configuración alternativa $j con ${altsetting.bNumEndpoints} endpoints");

      for (int k = 0; k < altsetting.bNumEndpoints; k++) {
        final endpoint = (altsetting.endpoint + k).ref;
        endpoints.add(endpoint.bEndpointAddress);
        //log("✔️ Endpoint encontrado: ${endpoint.bEndpointAddress.toRadixString(16)}");
      }
    }
  }

  _bindings.libusb_free_config_descriptor(config);
  log("📌 Configuration released successfully");

  return endpoints;
}