docs: private byte[] waitForResponse(int minASDULen, int maxASDULen, long timeout)
  		throws KNXInvalidResponseException, KNXTimeoutException
  	{
  		long remaining = timeout;
  		final long end = System.currentTimeMillis() + remaining;
  		synchronized (indications) {
  			while (remaining > 0) {
  				try {
  					while (indications.size() > 0) {
  						final CEMI frame =
  							((FrameEvent) indications.remove(0)).getFrame();
  						final byte[] apdu = frame.getPayload();
  						assert svcResponse == DataUnitBuilder.getAPDUService(apdu);
  						if (apdu.length < minASDULen + 2 || apdu.length > maxASDULen + 2) {
  							final String s = "invalid ASDU response length "
  								+ (apdu.length - 2) + " bytes, expected " + minASDULen
  								+ " to " + maxASDULen;
  							logger.error("received response with " + s);
  							throw new KNXInvalidResponseException(s);
  						}
  						if (svcResponse == IND_ADDR_RESPONSE
  							|| svcResponse == IND_ADDR_SN_RESPONSE)
  							return ((CEMILData) frame).getSource().toByteArray();
  						indications.clear();
  						return apdu;
  					}
  					indications.wait(remaining);
  				}
  				catch (final InterruptedException e) {}
  				remaining = end - System.currentTimeMillis();
  			}
  		}
  		throw new KNXTimeoutException("timeout occurred while waiting for data response");
  	}