/** * Constructor. * @param context */ public ChannelSearchManager(CAJContext context) { this.context = context; // create and initialize send buffer sendBuffer = ByteBuffer.allocateDirect(CAConstants.MAX_UDP_SEND); initializeSendBuffer(); // TODO should be configurable long maxPeriod = MAX_SEARCH_PERIOD; maxPeriod = Math.min(maxPeriod, MAX_SEARCH_PERIOD_LOWER_LIMIT); // calculate number of timers to reach maxPeriod (each timer period is doubled) double powerOfTwo = Math.log(maxPeriod / (double)MIN_RTT) / Math.log(2); int numberOfTimers = (int)(powerOfTwo + 1); numberOfTimers = Math.min(numberOfTimers, MAX_TIMERS); // calculate beacon anomaly timer index powerOfTwo = Math.log(BEACON_ANOMALY_SEARCH_PERIOD / (double)MIN_RTT) / Math.log(2); beaconAnomalyTimerIndex = (int)(powerOfTwo + 1); beaconAnomalyTimerIndex = Math.min(beaconAnomalyTimerIndex, numberOfTimers - 1); // create timers timers = new SearchTimer[numberOfTimers]; for (int i = 0; i < numberOfTimers; i++) timers[i] = new SearchTimer(i, i > beaconAnomalyTimerIndex, i != (numberOfTimers-1)); }