/** * Execute poll on this device: create an array of messages, add them to the request queue, and * schedule the queue for processing. * * @param delay scheduling delay (in milliseconds) */ public void doPoll(long delay) { long now = System.currentTimeMillis(); ArrayList<QEntry> l = new ArrayList<QEntry>(); synchronized (m_features) { int spacing = 0; for (DeviceFeature i : m_features.values()) { if (i.hasListeners()) { Msg m = i.makePollMsg(); if (m != null) l.add(new QEntry(i, m, now + delay + spacing)); } spacing += TIME_BETWEEN_POLL_MESSAGES; } } if (l.isEmpty()) return; synchronized (m_requestQueue) { for (QEntry e : l) { m_requestQueue.add(e); } } RequestQueueManager.s_instance().addQueue(this, now + delay); if (!l.isEmpty()) { synchronized (m_lastTimePolled) { m_lastTimePolled = now; } } }
/** * Enqueues message to be sent after a delay * * @param m message to be sent * @param f device feature that sent this message (so we can associate the response message with * it) * @param d time (in milliseconds)to delay before enqueuing message */ public void enqueueDelayedMessage(Msg m, DeviceFeature f, long delay) { long now = System.currentTimeMillis(); synchronized (m_requestQueue) { m_requestQueue.add(new QEntry(f, m, now + delay)); } if (!m.isBroadcast()) { m.setQuietTime(QUIET_TIME_DIRECT_MESSAGE); } logger.trace("enqueing direct message with delay {}", delay); RequestQueueManager.s_instance().addQueue(this, now + delay); }