code: byte[] readNotificationResponse()
              throws DeviceDisconnectedException, DfuException, UploadAbortedException {
  		// do not clear the mReceiveData here. The response might already be obtained. Clear it in write request instead.
  		try {
  			synchronized (mLock) {
  				while ((mReceivedData == null && mConnected && mError == 0 && !mAborted) || mPaused)
  					mLock.wait();
  			}
  		} catch (final InterruptedException e) {
  			loge("Sleeping interrupted", e);
  		}
  		if (mAborted)
  			throw new UploadAbortedException();
  		if (!mConnected)
  			throw new DeviceDisconnectedException("Unable to write Op Code: device disconnected");
  		if (mError != 0)
  			throw new DfuException("Unable to write Op Code", mError);
  		return mReceivedData;
  	}
docs: Waits until the notification will arrive. Returns the data returned by the notification.
  This method will block the thread until response is not ready or the device gets disconnected.
  If connection state will change, or an error will occur, an exception will be thrown.
  
  @return the value returned by the Control Point notification
  @throws DeviceDisconnectedException Thrown when the device will disconnect in the middle of
  the transmission.
  @throws DfuException                Thrown if DFU error occur.
  @throws UploadAbortedException      Thrown if DFU operation was aborted by user.