ICP_ErrorType ICP_Init(void) {

   Logging::print("ICP_Init()\n");

   ICP_ErrorType rc = bdm_usb_init();

   initialised = (rc == ICP_RC_OK);

   return rc;
}
//**********************************************************
//!
//! Find all USBDM devices attached to the computer
//!
//!  @param deviceCount Number of devices found.  This is set
//!                     to zero on any error.
//!
//!  @return\n
//!       ICP_RC_OK        - success - found at least 1 device \n
//!       ICP_RC_USB_ERROR - no device found or various errors
//!
ICP_ErrorType bdm_usb_findDevices(unsigned *devCount) {

//   print("bdm_usb_find_devices()\n");

   *devCount = 0; // Assume failure

   ICP_ErrorType rc = ICP_RC_OK;

   // Release any currently referenced devices
   bdm_usb_releaseDevices();

   if (!initialised) {
      print("bdm_usb_find_devices() - Not initialised! \n");
      rc = bdm_usb_init(); // try again
      if (rc != ICP_RC_OK) {
         return rc;
      }
   }
   // discover all USB devices
   libusb_device **list;

   ssize_t cnt = libusb_get_device_list(NULL, &list);
   if (cnt < 0) {
      print("bdm_usb_find_devices() - libusb_get_device_list() failed! \n");
      return ICP_RC_USB_ERROR;
   }

   // Copy the ones we are interested in to our own list
   deviceCount = 0;
   for (int deviceIndex=0; deviceIndex<cnt; deviceIndex++) {
      // Check each device and copy any devices to local list
//      print("bdm_usb_find_devices() ==> checking device #%d\n", deviceIndex);
      libusb_device *currentDevice = list[deviceIndex];
      libusb_device_descriptor deviceDescriptor;
      int rc = libusb_get_device_descriptor(currentDevice, &deviceDescriptor);
      if (rc != LIBUSB_SUCCESS) {
         continue; // Skip device
      }
//      print("bdm_usb_find_devices() ==> Checking device VID=%4.4X, PID=%4.4X\n",
//            deviceDescriptor.idVendor, deviceDescriptor.idProduct);
      if ((deviceDescriptor.idVendor==JS16_BOOT_VID)&&(deviceDescriptor.idProduct==JS16_BOOT_PID)) {
         // Found a device
//         print("bdm_usb_find_devices() ==> found USBDM device #%d\n", deviceIndex);
         bdmDevices[deviceCount++] = currentDevice; // Record found device
         libusb_ref_device(currentDevice);          // Reference so we don't lose it
         bdmDevices[deviceCount]=NULL;              // Terminate the list again
         if (deviceCount>MAX_BDM_DEVICES) {
            break;
         }
      }
   }
   // Free the original list (devices referenced above are still referenced)
   libusb_free_device_list(list, true);

   *devCount = deviceCount;

//   print("bdm_usb_find_devices() ==> %d\n", deviceCount);

   if(deviceCount>0) {
      return ICP_RC_OK;
   }
   else {
      return ICP_RC_NO_JS16_DEVICE;
   }
}