From acf69e243667a5d14970286c57ad85d24d0988dd Mon Sep 17 00:00:00 2001 From: Victor Toni Date: Thu, 23 Mar 2023 12:16:02 +0100 Subject: [PATCH] Replace anonymous Runnables by by lambda expressions / method references --- .../zigbee/console/main/ZigBeeConsole.java | 204 +++++++-------- .../zigbee/dongle/ember/ZigBeeDongleEzsp.java | 95 ++++--- .../ember/internal/EzspNeighborTable.java | 9 +- .../ember/internal/spi/SpiFrameHandler.java | 11 +- .../telegesis/ZigBeeDongleTelegesis.java | 71 +++--- .../internal/TelegesisFrameHandler.java | 33 ++- .../zigbee/dongle/xbee/ZigBeeDongleXBee.java | 33 ++- .../xbee/internal/XBeeFrameHandler.java | 17 +- .../zigbee/ZigBeeNetworkManager.java | 99 +++----- .../com/zsmartsystems/zigbee/ZigBeeNode.java | 21 +- .../discovery/ZigBeeDiscoveryExtension.java | 27 +- .../discovery/ZigBeeNetworkDiscoverer.java | 233 +++++++++--------- .../app/otaserver/ZclOtaUpgradeServer.java | 30 +-- .../app/seclient/SmartEnergyClient.java | 140 +++++------ .../seclient/ZclKeyEstablishmentClient.java | 17 +- .../seclient/ZclKeyEstablishmentServer.java | 17 +- .../internal/ZigBeeCommandNotifier.java | 7 +- .../zigbee/transaction/ZigBeeTransaction.java | 21 +- .../transaction/ZigBeeTransactionManager.java | 28 +-- .../zsmartsystems/zigbee/zcl/ZclCluster.java | 42 ++-- 20 files changed, 493 insertions(+), 662 deletions(-) diff --git a/com.zsmartsystems.zigbee.console.main/src/main/java/com/zsmartsystems/zigbee/console/main/ZigBeeConsole.java b/com.zsmartsystems.zigbee.console.main/src/main/java/com/zsmartsystems/zigbee/console/main/ZigBeeConsole.java index 3f6d2e0c5b..0901801e18 100644 --- a/com.zsmartsystems.zigbee.console.main/src/main/java/com/zsmartsystems/zigbee/console/main/ZigBeeConsole.java +++ b/com.zsmartsystems.zigbee.console.main/src/main/java/com/zsmartsystems/zigbee/console/main/ZigBeeConsole.java @@ -284,21 +284,18 @@ public void commandReceived(ZigBeeCommand command) { } }); - Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { - @Override - public void run() { - shutdown = true; - try { - System.in.close(); - } catch (IOException e) { - e.printStackTrace(); - } - try { - mainThread.interrupt(); - mainThread.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + shutdown = true; + try { + System.in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + mainThread.interrupt(); + mainThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); } })); } @@ -945,74 +942,62 @@ public boolean process(final ZigBeeApi zigbeeApi, final String[] args, final Pri return false; } - new Thread(new Runnable() { - @Override - public void run() { - int cnt = 0; - while (true) { - print("STRESSING 1 CNT: " + cnt++, out); - ZclOnOffCluster cluster = (ZclOnOffCluster) endpoint - .getInputCluster(ZclOnOffCluster.CLUSTER_ID); - cluster.onCommand(); - try { - Thread.sleep(167); - } catch (InterruptedException e) { - e.printStackTrace(); - } + new Thread(() -> { + int cnt = 0; + while (true) { + print("STRESSING 1 CNT: " + cnt++, out); + ZclOnOffCluster cluster = (ZclOnOffCluster) endpoint + .getInputCluster(ZclOnOffCluster.CLUSTER_ID); + cluster.onCommand(); + try { + Thread.sleep(167); + } catch (InterruptedException e) { + e.printStackTrace(); } } }).start(); - new Thread(new Runnable() { - @Override - public void run() { - int cnt = 0; - while (true) { - print("STRESSING 2 CNT: " + cnt++, out); - ZclOnOffCluster cluster = (ZclOnOffCluster) endpoint - .getInputCluster(ZclOnOffCluster.CLUSTER_ID); - cluster.onCommand(); - try { - Thread.sleep(107); - } catch (InterruptedException e) { - e.printStackTrace(); - } + new Thread(() -> { + int cnt = 0; + while (true) { + print("STRESSING 2 CNT: " + cnt++, out); + ZclOnOffCluster cluster = (ZclOnOffCluster) endpoint + .getInputCluster(ZclOnOffCluster.CLUSTER_ID); + cluster.onCommand(); + try { + Thread.sleep(107); + } catch (InterruptedException e) { + e.printStackTrace(); } } }).start(); - new Thread(new Runnable() { - @Override - public void run() { - int cnt = 0; - while (true) { - print("STRESSING 3 CNT: " + cnt++, out); - ZclOnOffCluster cluster = (ZclOnOffCluster) endpoint - .getInputCluster(ZclOnOffCluster.CLUSTER_ID); - cluster.onCommand(); - try { - Thread.sleep(131); - } catch (InterruptedException e) { - e.printStackTrace(); - } + new Thread(() -> { + int cnt = 0; + while (true) { + print("STRESSING 3 CNT: " + cnt++, out); + ZclOnOffCluster cluster = (ZclOnOffCluster) endpoint + .getInputCluster(ZclOnOffCluster.CLUSTER_ID); + cluster.onCommand(); + try { + Thread.sleep(131); + } catch (InterruptedException e) { + e.printStackTrace(); } } }).start(); - new Thread(new Runnable() { - @Override - public void run() { - int cnt = 0; - while (true) { - print("STRESSING 4 CNT: " + cnt++, out); - ZclOnOffCluster cluster = (ZclOnOffCluster) endpoint - .getInputCluster(ZclOnOffCluster.CLUSTER_ID); - cluster.onCommand(); - try { - Thread.sleep(187); - } catch (InterruptedException e) { - e.printStackTrace(); - } + new Thread(() -> { + int cnt = 0; + while (true) { + print("STRESSING 4 CNT: " + cnt++, out); + ZclOnOffCluster cluster = (ZclOnOffCluster) endpoint + .getInputCluster(ZclOnOffCluster.CLUSTER_ID); + cluster.onCommand(); + try { + Thread.sleep(187); + } catch (InterruptedException e) { + e.printStackTrace(); } } }).start(); @@ -1089,46 +1074,42 @@ public String getSyntax() { */ @Override public boolean process(final ZigBeeApi zigbeeApi, final String[] args, final PrintStream out) throws Exception { - new Thread(new Runnable() { - @Override - public void run() { - int cnts = 1000; - int errors = 0; - int cnt = 0; - List lqi = new ArrayList<>(); - while (cnt < cnts) { - print("LQI Poll CNT: " + cnt++, out); - final ManagementLqiRequest neighborRequest = new ManagementLqiRequest(0); - neighborRequest.setDestinationAddress(new ZigBeeEndpointAddress(0)); - - CommandResult response; - try { - response = networkManager.sendTransaction(neighborRequest, neighborRequest).get(); - final ManagementLqiResponse neighborResponse = response.getResponse(); - - if (neighborResponse == null || neighborResponse.getStatus() != ZdoStatus.SUCCESS) { - errors++; - continue; - } - if (neighborResponse.getNeighborTableList().isEmpty()) { - print("No neighbors", out); - continue; - } - lqi.add(neighborResponse.getNeighborTableList().get(0).getLqi()); - } catch (InterruptedException | ExecutionException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + new Thread(() -> { + int cnts = 1000; + int errors = 0; + int cnt = 0; + List lqi = new ArrayList<>(); + while (cnt < cnts) { + print("LQI Poll CNT: " + cnt++, out); + final ManagementLqiRequest neighborRequest = new ManagementLqiRequest(0); + neighborRequest.setDestinationAddress(new ZigBeeEndpointAddress(0)); + + CommandResult response; + try { + response = networkManager.sendTransaction(neighborRequest, neighborRequest).get(); + final ManagementLqiResponse neighborResponse = response.getResponse(); + + if (neighborResponse == null || neighborResponse.getStatus() != ZdoStatus.SUCCESS) { + errors++; + continue; } + if (neighborResponse.getNeighborTableList().isEmpty()) { + print("No neighbors", out); + continue; + } + lqi.add(neighborResponse.getNeighborTableList().get(0).getLqi()); + } catch (InterruptedException | ExecutionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); } - IntSummaryStatistics stats = lqi.stream().mapToInt((x) -> x).summaryStatistics(); - - print("LQI Polling Complete", out); - print("Errors: " + errors, out); - print("Min : " + stats.getMin(), out); - print("Max : " + stats.getMax(), out); - print("Avg : " + stats.getAverage(), out); - } + IntSummaryStatistics stats = lqi.stream().mapToInt((x) -> x).summaryStatistics(); + + print("LQI Polling Complete", out); + print("Errors: " + errors, out); + print("Min : " + stats.getMin(), out); + print("Max : " + stats.getMax(), out); + print("Avg : " + stats.getAverage(), out); }).start(); return true; @@ -1157,12 +1138,7 @@ public String getSyntax() { */ @Override public boolean process(final ZigBeeApi zigbeeApi, final String[] args, final PrintStream out) throws Exception { - new Thread(new Runnable() { - @Override - public void run() { - networkManager.reinitialize(); - } - }).start(); + new Thread(networkManager::reinitialize).start(); return true; } diff --git a/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/ZigBeeDongleEzsp.java b/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/ZigBeeDongleEzsp.java index 334e9a3f97..2bf2bfafd2 100644 --- a/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/ZigBeeDongleEzsp.java +++ b/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/ZigBeeDongleEzsp.java @@ -630,17 +630,14 @@ private void scheduleNetworkStatePolling() { return; } - pollingTimer = executorService.scheduleWithFixedDelay(new Runnable() { - @Override - public void run() { - // Don't poll the state if the network is down - // or we've sent a command to the dongle within the pollRate - if (!networkStateUp || (lastSendCommand + pollRate > System.currentTimeMillis())) { - return; - } - // Don't wait for the response. This is running in a single thread scheduler - frameHandler.queueFrame(new EzspNetworkStateRequest()); + pollingTimer = executorService.scheduleWithFixedDelay(() -> { + // Don't poll the state if the network is down + // or we've sent a command to the dongle within the pollRate + if (!networkStateUp || (lastSendCommand + pollRate > System.currentTimeMillis())) { + return; } + // Don't wait for the response. This is running in a single thread scheduler + frameHandler.queueFrame(new EzspNetworkStateRequest()); }, pollRate, pollRate, TimeUnit.MILLISECONDS); } @@ -808,40 +805,37 @@ public void sendCommand(final int msgTag, final ZigBeeApsFrame apsFrame) { // The response from the SendXxxcast messages returns the network layer sequence number // We need to correlate this with the messageTag - executorService.execute(new Runnable() { - @Override - public void run() { - synchronized (isConfiguredSync) { - if (!isConfigured) { - logger.debug("EZSP Dongle is not configured. Frame not sent: {}", apsFrame); - return; - } + executorService.execute(() -> { + synchronized (isConfiguredSync) { + if (!isConfigured) { + logger.debug("EZSP Dongle is not configured. Frame not sent: {}", apsFrame); + return; + } - lastSendCommand = System.currentTimeMillis(); - frameHandler.sendEzspTransaction(transaction); - - EmberStatus status = null; - if (transaction.getResponse() instanceof EzspSendUnicastResponse) { - fragmentationApsCounters.put(msgTag, - ((EzspSendUnicastResponse) transaction.getResponse()).getSequence()); - status = ((EzspSendUnicastResponse) transaction.getResponse()).getStatus(); - } else if (transaction.getResponse() instanceof EzspSendBroadcastResponse) { - status = ((EzspSendBroadcastResponse) transaction.getResponse()).getStatus(); - } else if (transaction.getResponse() instanceof EzspSendMulticastResponse) { - status = ((EzspSendMulticastResponse) transaction.getResponse()).getStatus(); - } else { - logger.debug("Unable to get response from {} :: {}", transaction.getRequest(), - transaction.getResponse()); - return; - } + lastSendCommand = System.currentTimeMillis(); + frameHandler.sendEzspTransaction(transaction); + + EmberStatus status = null; + if (transaction.getResponse() instanceof EzspSendUnicastResponse) { + fragmentationApsCounters.put(msgTag, + ((EzspSendUnicastResponse) transaction.getResponse()).getSequence()); + status = ((EzspSendUnicastResponse) transaction.getResponse()).getStatus(); + } else if (transaction.getResponse() instanceof EzspSendBroadcastResponse) { + status = ((EzspSendBroadcastResponse) transaction.getResponse()).getStatus(); + } else if (transaction.getResponse() instanceof EzspSendMulticastResponse) { + status = ((EzspSendMulticastResponse) transaction.getResponse()).getStatus(); + } else { + logger.debug("Unable to get response from {} :: {}", transaction.getRequest(), + transaction.getResponse()); + return; + } - // If this is EMBER_SUCCESS, then do nothing as the command is still not transmitted. - // If there was an error, then we let the system know we've failed already! - if (status == EmberStatus.EMBER_SUCCESS) { - return; - } - zigbeeTransportReceive.receiveCommandState(msgTag, ZigBeeTransportProgressState.TX_NAK); + // If this is EMBER_SUCCESS, then do nothing as the command is still not transmitted. + // If there was an error, then we let the system know we've failed already! + if (status == EmberStatus.EMBER_SUCCESS) { + return; } + zigbeeTransportReceive.receiveCommandState(msgTag, ZigBeeTransportProgressState.TX_NAK); } }); } @@ -941,18 +935,15 @@ public void handlePacket(EzspFrame response) { // Message has been completed by the NCP if (response instanceof EzspMessageSentHandler) { - executorService.execute(new Runnable() { - @Override - public void run() { - EzspMessageSentHandler sentHandler = (EzspMessageSentHandler) response; - ZigBeeTransportProgressState sentHandlerState; - if (sentHandler.getStatus() == EmberStatus.EMBER_SUCCESS) { - sentHandlerState = ZigBeeTransportProgressState.RX_ACK; - } else { - sentHandlerState = ZigBeeTransportProgressState.RX_NAK; - } - zigbeeTransportReceive.receiveCommandState(sentHandler.getMessageTag(), sentHandlerState); + executorService.execute(() -> { + EzspMessageSentHandler sentHandler = (EzspMessageSentHandler) response; + ZigBeeTransportProgressState sentHandlerState; + if (sentHandler.getStatus() == EmberStatus.EMBER_SUCCESS) { + sentHandlerState = ZigBeeTransportProgressState.RX_ACK; + } else { + sentHandlerState = ZigBeeTransportProgressState.RX_NAK; } + zigbeeTransportReceive.receiveCommandState(sentHandler.getMessageTag(), sentHandlerState); }); return; } diff --git a/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/internal/EzspNeighborTable.java b/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/internal/EzspNeighborTable.java index 74caceb97c..158abfd57f 100644 --- a/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/internal/EzspNeighborTable.java +++ b/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/internal/EzspNeighborTable.java @@ -55,16 +55,9 @@ public class EzspNeighborTable { public EzspNeighborTable(AshFrameHandler ashHandler, int updatePeriod) { this.ashHandler = ashHandler; - Runnable neighborUpdateThread = new Runnable() { - @Override - public void run() { - updateNeighbors(); - } - }; - routingEntries = getConfiguration(EzspConfigId.EZSP_CONFIG_SOURCE_ROUTE_TABLE_SIZE); - scheduler.scheduleAtFixedRate(neighborUpdateThread, updatePeriod, updatePeriod, TimeUnit.SECONDS); + scheduler.scheduleAtFixedRate(this::updateNeighbors, updatePeriod, updatePeriod, TimeUnit.SECONDS); } private void updateNeighbors() { diff --git a/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/internal/spi/SpiFrameHandler.java b/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/internal/spi/SpiFrameHandler.java index 0b362a1b6d..96483a9591 100644 --- a/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/internal/spi/SpiFrameHandler.java +++ b/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/internal/spi/SpiFrameHandler.java @@ -606,13 +606,10 @@ private synchronized void restartPolling() { return; } - pollingTimer = pollingScheduler.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - if (stateConnected && sendQueue.isEmpty()) { - doCallbackRequest.set(true); - sendNextFrame(); - } + pollingTimer = pollingScheduler.scheduleAtFixedRate(() -> { + if (stateConnected && sendQueue.isEmpty()) { + doCallbackRequest.set(true); + sendNextFrame(); } }, pollRate, pollRate, TimeUnit.MILLISECONDS); } diff --git a/com.zsmartsystems.zigbee.dongle.telegesis/src/main/java/com/zsmartsystems/zigbee/dongle/telegesis/ZigBeeDongleTelegesis.java b/com.zsmartsystems.zigbee.dongle.telegesis/src/main/java/com/zsmartsystems/zigbee/dongle/telegesis/ZigBeeDongleTelegesis.java index 4ecda560ff..e1b2318c7e 100644 --- a/com.zsmartsystems.zigbee.dongle.telegesis/src/main/java/com/zsmartsystems/zigbee/dongle/telegesis/ZigBeeDongleTelegesis.java +++ b/com.zsmartsystems.zigbee.dongle.telegesis/src/main/java/com/zsmartsystems/zigbee/dongle/telegesis/ZigBeeDongleTelegesis.java @@ -736,31 +736,28 @@ public void sendCommand(final int msgTag, final ZigBeeApsFrame apsFrame) { // We need to get the Telegesis SEQ number for the transaction so we can correlate the transaction ID // This is done in a separate thread that puts all the responses from the dongle in a pipeline - commandScheduler.execute(new Runnable() { - @Override - public void run() { - synchronized (isConfiguredSync) { - if (!isConfigured) { - logger.debug("Telegesis dongle is not configured. Frame not sent: {}", apsFrame); - return; - } - - lastSendCommand = System.currentTimeMillis(); - frameHandler.sendRequest(command); - - // Let the stack know the frame is sent - zigbeeTransportReceive.receiveCommandState(msgTag, - command.getStatus() == TelegesisStatusCode.SUCCESS ? ZigBeeTransportProgressState.TX_ACK - : ZigBeeTransportProgressState.TX_NAK); - - // Multicast doesn't have a sequence returned, so nothing more to do here - if (command instanceof TelegesisSendMulticastCommand) { - return; - } - - if (((TelegesisSendUnicastCommand) command).getMessageId() != null) { - messageIdMap.put(((TelegesisSendUnicastCommand) command).getMessageId(), msgTag); - } + commandScheduler.execute(() -> { + synchronized (isConfiguredSync) { + if (!isConfigured) { + logger.debug("Telegesis dongle is not configured. Frame not sent: {}", apsFrame); + return; + } + + lastSendCommand = System.currentTimeMillis(); + frameHandler.sendRequest(command); + + // Let the stack know the frame is sent + zigbeeTransportReceive.receiveCommandState(msgTag, + command.getStatus() == TelegesisStatusCode.SUCCESS ? ZigBeeTransportProgressState.TX_ACK + : ZigBeeTransportProgressState.TX_NAK); + + // Multicast doesn't have a sequence returned, so nothing more to do here + if (command instanceof TelegesisSendMulticastCommand) { + return; + } + + if (((TelegesisSendUnicastCommand) command).getMessageId() != null) { + messageIdMap.put(((TelegesisSendUnicastCommand) command).getMessageId(), msgTag); } } }); @@ -779,11 +776,8 @@ public void telegesisEventReceived(TelegesisEvent event) { } // This is done in a separate thread that puts all the responses from the dongle in a pipeline - commandScheduler.execute(new Runnable() { - @Override - public void run() { - telegesisEventReceivedRunnable(event); - } + commandScheduler.execute(() -> { + telegesisEventReceivedRunnable(event); }); } @@ -1211,17 +1205,14 @@ private void scheduleNetworkStatePolling() { pollingTimer.cancel(true); } - pollingTimer = executorService.scheduleWithFixedDelay(new Runnable() { - @Override - public void run() { - // Don't poll the state if the network is down - // or we've sent a command to the dongle within the pollRate - if (!networkStateUp || (lastSendCommand + pollRate > System.currentTimeMillis())) { - return; - } - // Don't wait for the response. This is running in a single thread scheduler - frameHandler.queueFrame(new TelegesisDisplayNetworkInformationCommand()); + pollingTimer = executorService.scheduleWithFixedDelay(() -> { + // Don't poll the state if the network is down + // or we've sent a command to the dongle within the pollRate + if (!networkStateUp || (lastSendCommand + pollRate > System.currentTimeMillis())) { + return; } + // Don't wait for the response. This is running in a single thread scheduler + frameHandler.queueFrame(new TelegesisDisplayNetworkInformationCommand()); }, pollRate, pollRate, TimeUnit.MILLISECONDS); } diff --git a/com.zsmartsystems.zigbee.dongle.telegesis/src/main/java/com/zsmartsystems/zigbee/dongle/telegesis/internal/TelegesisFrameHandler.java b/com.zsmartsystems.zigbee.dongle.telegesis/src/main/java/com/zsmartsystems/zigbee/dongle/telegesis/internal/TelegesisFrameHandler.java index 5b84eaf65e..a17a46813f 100644 --- a/com.zsmartsystems.zigbee.dongle.telegesis/src/main/java/com/zsmartsystems/zigbee/dongle/telegesis/internal/TelegesisFrameHandler.java +++ b/com.zsmartsystems.zigbee.dongle.telegesis/src/main/java/com/zsmartsystems/zigbee/dongle/telegesis/internal/TelegesisFrameHandler.java @@ -639,25 +639,22 @@ public TelegesisEvent eventWait(final Class eventClass) { private void startTimer() { stopTimer(); logger.trace("TELEGESIS Timer: Start"); - timeoutTimer = timeoutScheduler.schedule(new Runnable() { - @Override - public void run() { - timeoutTimer = null; - logger.debug("TELEGESIS Timer: Timeout {}", retries); - synchronized (commandLock) { - if (retries++ >= ACK_TIMEOUTS) { - // Too many retries. - // We should alert the upper layer so they can reset the link? - zigBeeDongleTelegesis.notifyStateUpdate(false); - - logger.debug("Error: number of retries exceeded [{}].", retries); - return; - } + timeoutTimer = timeoutScheduler.schedule(() -> { + timeoutTimer = null; + logger.debug("TELEGESIS Timer: Timeout {}", retries); + synchronized (commandLock) { + if (retries++ >= ACK_TIMEOUTS) { + // Too many retries. + // We should alert the upper layer so they can reset the link? + zigBeeDongleTelegesis.notifyStateUpdate(false); + + logger.debug("Error: number of retries exceeded [{}].", retries); + return; + } - if (sentCommand != null) { - sentCommand = null; - sendNextFrame(); - } + if (sentCommand != null) { + sentCommand = null; + sendNextFrame(); } } }, commandTimeout, TimeUnit.MILLISECONDS); diff --git a/com.zsmartsystems.zigbee.dongle.xbee/src/main/java/com/zsmartsystems/zigbee/dongle/xbee/ZigBeeDongleXBee.java b/com.zsmartsystems.zigbee.dongle.xbee/src/main/java/com/zsmartsystems/zigbee/dongle/xbee/ZigBeeDongleXBee.java index 4be4a0f644..bb6b97c859 100644 --- a/com.zsmartsystems.zigbee.dongle.xbee/src/main/java/com/zsmartsystems/zigbee/dongle/xbee/ZigBeeDongleXBee.java +++ b/com.zsmartsystems.zigbee.dongle.xbee/src/main/java/com/zsmartsystems/zigbee/dongle/xbee/ZigBeeDongleXBee.java @@ -372,27 +372,24 @@ public void sendCommand(final int msgTag, final ZigBeeApsFrame apsFrame) { logger.debug("XBee send: {}", command.toString()); Future responseFuture = frameHandler.sendRequestAsync(command); - executorService.execute(new Runnable() { - @Override - public void run() { - // Let the stack know the frame is sent. - // We don't really have confirmation of this from the XBee, but this is the best we can do - zigbeeTransportReceive.receiveCommandState(msgTag, ZigBeeTransportProgressState.TX_ACK); - - ZigBeeTransportProgressState sentHandlerState = ZigBeeTransportProgressState.RX_NAK; - try { - XBeeResponse response = responseFuture.get(RESPONSE_TIMEOUT, TimeUnit.MILLISECONDS); - if (response instanceof XBeeTransmitStatusResponse) { - XBeeTransmitStatusResponse sentHandler = (XBeeTransmitStatusResponse) response; - if (sentHandler.getDeliveryStatus() == DeliveryStatus.SUCCESS) { - sentHandlerState = ZigBeeTransportProgressState.RX_ACK; - } + executorService.execute(() -> { + // Let the stack know the frame is sent. + // We don't really have confirmation of this from the XBee, but this is the best we can do + zigbeeTransportReceive.receiveCommandState(msgTag, ZigBeeTransportProgressState.TX_ACK); + + ZigBeeTransportProgressState sentHandlerState = ZigBeeTransportProgressState.RX_NAK; + try { + XBeeResponse response = responseFuture.get(RESPONSE_TIMEOUT, TimeUnit.MILLISECONDS); + if (response instanceof XBeeTransmitStatusResponse) { + XBeeTransmitStatusResponse sentHandler = (XBeeTransmitStatusResponse) response; + if (sentHandler.getDeliveryStatus() == DeliveryStatus.SUCCESS) { + sentHandlerState = ZigBeeTransportProgressState.RX_ACK; } - } catch (InterruptedException | ExecutionException | TimeoutException e) { } - - zigbeeTransportReceive.receiveCommandState(msgTag, sentHandlerState); + } catch (InterruptedException | ExecutionException | TimeoutException e) { } + + zigbeeTransportReceive.receiveCommandState(msgTag, sentHandlerState); }); } diff --git a/com.zsmartsystems.zigbee.dongle.xbee/src/main/java/com/zsmartsystems/zigbee/dongle/xbee/internal/XBeeFrameHandler.java b/com.zsmartsystems.zigbee.dongle.xbee/src/main/java/com/zsmartsystems/zigbee/dongle/xbee/internal/XBeeFrameHandler.java index 2a739a2f1f..34332df4d3 100644 --- a/com.zsmartsystems.zigbee.dongle.xbee/src/main/java/com/zsmartsystems/zigbee/dongle/xbee/internal/XBeeFrameHandler.java +++ b/com.zsmartsystems.zigbee.dongle.xbee/src/main/java/com/zsmartsystems/zigbee/dongle/xbee/internal/XBeeFrameHandler.java @@ -660,16 +660,13 @@ public XBeeEvent eventWait(final Class eventClass) { private void startTimer() { stopTimer(); logger.trace("XBEE Timer: Start"); - timeoutTimer = timeoutScheduler.schedule(new Runnable() { - @Override - public void run() { - timeoutTimer = null; - logger.debug("XBEE Timer: Timeout"); - synchronized (commandLock) { - if (sentCommand != null) { - sentCommand = null; - sendNextFrame(); - } + timeoutTimer = timeoutScheduler.schedule(() -> { + timeoutTimer = null; + logger.debug("XBEE Timer: Timeout"); + synchronized (commandLock) { + if (sentCommand != null) { + sentCommand = null; + sendNextFrame(); } } }, commandTimeout, TimeUnit.MILLISECONDS); diff --git a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/ZigBeeNetworkManager.java b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/ZigBeeNetworkManager.java index 0213851b41..4512139d80 100644 --- a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/ZigBeeNetworkManager.java +++ b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/ZigBeeNetworkManager.java @@ -945,11 +945,8 @@ public void receiveCommand(final ZigBeeApsFrame incomingApsFrame) { // Notify the listeners that we have heard a command that was unknown to us for (final ZigBeeAnnounceListener announceListener : announceListeners) { - notificationService.execute(new Runnable() { - @Override - public void run() { - announceListener.announceUnknownDevice(apsFrame.getSourceAddress()); - } + notificationService.execute(() -> { + announceListener.announceUnknownDevice(apsFrame.getSourceAddress()); }); } } @@ -1021,11 +1018,8 @@ public void run() { // Directly distribute commands to nodes ZigBeeNode node = getNode(command.getSourceAddress().getAddress()); if (node != null) { - notificationService.execute(new Runnable() { - @Override - public void run() { - node.commandReceived(finalCommand, apsFrame.getReceivedRssi(), apsFrame.getReceivedLqi()); - } + notificationService.execute(() -> { + node.commandReceived(finalCommand, apsFrame.getReceivedRssi(), apsFrame.getReceivedLqi()); }); } @@ -1256,11 +1250,8 @@ public void nodeStatusUpdate(final ZigBeeNodeStatus deviceStatus, final Integer // Notify the announce listeners for (final ZigBeeAnnounceListener announceListener : announceListeners) { - notificationService.execute(new Runnable() { - @Override - public void run() { - announceListener.deviceStatusUpdate(deviceStatus, networkAddress, ieeeAddress); - } + notificationService.execute(() -> { + announceListener.deviceStatusUpdate(deviceStatus, networkAddress, ieeeAddress); }); } } @@ -1317,22 +1308,14 @@ private synchronized void setNetworkState(final ZigBeeNetworkState state) { // and ensure that the local node is added. // This is done in another thread which will then notify users. if (state == ZigBeeNetworkState.ONLINE) { - notificationService.execute(new Runnable() { - @Override - public void run() { - setNetworkStateOnline(); - } - }); + notificationService.execute(this::setNetworkStateOnline); return; } for (final ZigBeeNetworkStateListener stateListener : stateListeners) { - notificationService.execute(new Runnable() { - @Override - public void run() { - stateListener.networkStateUpdated(state); - } + notificationService.execute(() -> { + stateListener.networkStateUpdated(state); }); } } @@ -1364,31 +1347,22 @@ private void setNetworkStateOnline() { logger.debug("Network state ONLINE: Notifying node {} [{}]", node.getIeeeAddress(), String.format("%04X", node.getNetworkAddress())); if (node.getNodeDescriptor() != null) { - notificationService.execute(new Runnable() { - @Override - public void run() { - transport.setNodeDescriptor(node.getIeeeAddress(), node.getNodeDescriptor()); - } + notificationService.execute(() -> { + transport.setNodeDescriptor(node.getIeeeAddress(), node.getNodeDescriptor()); }); } for (final ZigBeeNetworkNodeListener listener : nodeListeners) { - notificationService.execute(new Runnable() { - @Override - public void run() { - listener.nodeAdded(node); - } + notificationService.execute(() -> { + listener.nodeAdded(node); }); } } // Now that everything is added and started, notify the listeners that the state has updated for (final ZigBeeNetworkStateListener stateListener : stateListeners) { - notificationService.execute(new Runnable() { - @Override - public void run() { - stateListener.networkStateUpdated(ZigBeeNetworkState.ONLINE); - } + notificationService.execute(() -> { + stateListener.networkStateUpdated(ZigBeeNetworkState.ONLINE); }); } } @@ -1676,11 +1650,8 @@ public void removeNode(final ZigBeeNode node) { } for (final ZigBeeNetworkNodeListener listener : nodeListeners) { - notificationService.execute(new Runnable() { - @Override - public void run() { - listener.nodeRemoved(node); - } + notificationService.execute(() -> { + listener.nodeRemoved(node); }); } } @@ -1718,20 +1689,14 @@ public void updateNode(final ZigBeeNode node) { } if (node.getNodeDescriptor() != null) { - notificationService.execute(new Runnable() { - @Override - public void run() { - transport.setNodeDescriptor(node.getIeeeAddress(), node.getNodeDescriptor()); - } + notificationService.execute(() -> { + transport.setNodeDescriptor(node.getIeeeAddress(), node.getNodeDescriptor()); }); } for (final ZigBeeNetworkNodeListener listener : nodeListeners) { - notificationService.execute(new Runnable() { - @Override - public void run() { - listener.nodeAdded(node); - } + notificationService.execute(() -> { + listener.nodeAdded(node); }); } } @@ -1771,11 +1736,8 @@ private Future refreshNode(final ZigBeeNode node) { } if (node.getNodeDescriptor() != null && currentNode.getNodeDescriptor() != null) { - notificationService.execute(new Runnable() { - @Override - public void run() { - transport.setNodeDescriptor(currentNode.getIeeeAddress(), currentNode.getNodeDescriptor()); - } + notificationService.execute(() -> { + transport.setNodeDescriptor(currentNode.getIeeeAddress(), currentNode.getNodeDescriptor()); }); } @@ -1803,16 +1765,13 @@ public void run() { synchronized (nodeListeners) { latch = new CountDownLatch(nodeListeners.size()); for (final ZigBeeNetworkNodeListener listener : nodeListeners) { - notificationService.execute(new Runnable() { - @Override - public void run() { - if (sendNodeAdded) { - listener.nodeAdded(currentNode); - } else { - listener.nodeUpdated(currentNode); - } - latch.countDown(); + notificationService.execute(() -> { + if (sendNodeAdded) { + listener.nodeAdded(currentNode); + } else { + listener.nodeUpdated(currentNode); } + latch.countDown(); }); } } diff --git a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/ZigBeeNode.java b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/ZigBeeNode.java index 9f506181f3..4592c3378d 100644 --- a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/ZigBeeNode.java +++ b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/ZigBeeNode.java @@ -617,11 +617,8 @@ public void addEndpoint(final ZigBeeEndpoint endpoint) { } synchronized (this) { for (final ZigBeeNetworkEndpointListener listener : endpointListeners) { - getNotificationService().execute(new Runnable() { - @Override - public void run() { - listener.deviceAdded(endpoint); - } + getNotificationService().execute(() -> { + listener.deviceAdded(endpoint); }); } } @@ -638,11 +635,8 @@ public void updateEndpoint(final ZigBeeEndpoint endpoint) { } synchronized (this) { for (final ZigBeeNetworkEndpointListener listener : endpointListeners) { - getNotificationService().execute(new Runnable() { - @Override - public void run() { - listener.deviceUpdated(endpoint); - } + getNotificationService().execute(() -> { + listener.deviceUpdated(endpoint); }); } } @@ -661,11 +655,8 @@ public void removeEndpoint(final int endpointId) { synchronized (this) { if (endpoint != null) { for (final ZigBeeNetworkEndpointListener listener : endpointListeners) { - getNotificationService().execute(new Runnable() { - @Override - public void run() { - listener.deviceRemoved(endpoint); - } + getNotificationService().execute(() -> { + listener.deviceRemoved(endpoint); }); } } diff --git a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/discovery/ZigBeeDiscoveryExtension.java b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/discovery/ZigBeeDiscoveryExtension.java index 3a84494b6d..2f90a34dee 100644 --- a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/discovery/ZigBeeDiscoveryExtension.java +++ b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/discovery/ZigBeeDiscoveryExtension.java @@ -339,24 +339,21 @@ protected void stopScheduler() { protected void startScheduler(int initialPeriod) { stopScheduler(); - Runnable meshUpdateThread = new Runnable() { - @Override - public void run() { - synchronized (nodeDiscovery) { - logger.debug("DISCOVERY Extension: Starting mesh update"); - for (ZigBeeNodeServiceDiscoverer node : nodeDiscovery.values()) { - logger.debug("{}: DISCOVERY Extension: Starting mesh update", node.getNode().getIeeeAddress()); - node.setUpdateMeshTasks(meshUpdateTasks); - node.updateMesh(); - } - } - } - }; - - futureTask = networkManager.scheduleTask(meshUpdateThread, initialPeriod, + futureTask = networkManager.scheduleTask(this::meshUpdateThread, initialPeriod, TimeUnit.SECONDS.toMillis(updatePeriod)); } + private void meshUpdateThread() { + synchronized (nodeDiscovery) { + logger.debug("DISCOVERY Extension: Starting mesh update"); + for (ZigBeeNodeServiceDiscoverer node : nodeDiscovery.values()) { + logger.debug("{}: DISCOVERY Extension: Starting mesh update", node.getNode().getIeeeAddress()); + node.setUpdateMeshTasks(meshUpdateTasks); + node.updateMesh(); + } + } + }; + /** * Gets the Collection of {@link ZigBeeNodeServiceDiscoverer}s for all nodes * diff --git a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/discovery/ZigBeeNetworkDiscoverer.java b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/discovery/ZigBeeNetworkDiscoverer.java index 63188f5f80..e5e3a66834 100644 --- a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/discovery/ZigBeeNetworkDiscoverer.java +++ b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/discovery/ZigBeeNetworkDiscoverer.java @@ -165,52 +165,49 @@ protected void rediscoverNode(final int networkAddress) { return; } - networkManager.executeTask(new Runnable() { - @Override - public void run() { - logger.debug("NWK Discovery starting node rediscovery {}", String.format("%04X", networkAddress)); - - try { - if (Thread.currentThread().isInterrupted()) { - return; - } - - IeeeAddressResponse ieeeAddressResponse = null; - logger.debug("NWK Discovery: Rediscovery of {} using unicast", + networkManager.executeTask(() -> { + logger.debug("NWK Discovery starting node rediscovery {}", String.format("%04X", networkAddress)); + + try { + if (Thread.currentThread().isInterrupted()) { + return; + } + + IeeeAddressResponse ieeeAddressResponse = null; + logger.debug("NWK Discovery: Rediscovery of {} using unicast", + String.format("%04X", networkAddress)); + IeeeAddressRequest request = new IeeeAddressRequest(networkAddress, 0, 0); + request.setDestinationAddress(new ZigBeeEndpointAddress(networkAddress)); + CommandResult response = networkManager.sendTransaction(request, request).get(); + ieeeAddressResponse = response.getResponse(); + + if (ieeeAddressResponse == null) { + logger.debug("NWK Discovery: Rediscovery of {} using broadcast", String.format("%04X", networkAddress)); - IeeeAddressRequest request = new IeeeAddressRequest(networkAddress, 0, 0); - request.setDestinationAddress(new ZigBeeEndpointAddress(networkAddress)); - CommandResult response = networkManager.sendTransaction(request, request).get(); + request = new IeeeAddressRequest(networkAddress, 0, 0); + request.setDestinationAddress( + new ZigBeeEndpointAddress(ZigBeeBroadcastDestination.BROADCAST_RX_ON.getKey())); + response = networkManager.sendTransaction(request, request).get(); ieeeAddressResponse = response.getResponse(); + } - if (ieeeAddressResponse == null) { - logger.debug("NWK Discovery: Rediscovery of {} using broadcast", - String.format("%04X", networkAddress)); - request = new IeeeAddressRequest(networkAddress, 0, 0); - request.setDestinationAddress( - new ZigBeeEndpointAddress(ZigBeeBroadcastDestination.BROADCAST_RX_ON.getKey())); - response = networkManager.sendTransaction(request, request).get(); - ieeeAddressResponse = response.getResponse(); - } - - logger.debug("{}: NWK Discovery IeeeAddressRequest returned from {}", ieeeAddressResponse, - String.format("%04X", networkAddress)); - if (ieeeAddressResponse != null && ieeeAddressResponse.getStatus() == ZdoStatus.SUCCESS) { - addNode(ieeeAddressResponse.getIeeeAddrRemoteDev(), - ieeeAddressResponse.getNwkAddrRemoteDev()); - startNodeDiscovery(ieeeAddressResponse.getNwkAddrRemoteDev()); - return; - } - - // We failed with the request - logger.debug("NWK Discovery node rediscovery for {} request failed.", - String.format("%04X", networkAddress)); - } catch (InterruptedException | ExecutionException e) { - logger.debug("NWK Discovery interrupted in checkIeeeAddressResponse"); + logger.debug("{}: NWK Discovery IeeeAddressRequest returned from {}", ieeeAddressResponse, + String.format("%04X", networkAddress)); + if (ieeeAddressResponse != null && ieeeAddressResponse.getStatus() == ZdoStatus.SUCCESS) { + addNode(ieeeAddressResponse.getIeeeAddrRemoteDev(), + ieeeAddressResponse.getNwkAddrRemoteDev()); + startNodeDiscovery(ieeeAddressResponse.getNwkAddrRemoteDev()); + return; } - logger.debug("NWK Discovery for {} finishing node rediscovery", + + // We failed with the request + logger.debug("NWK Discovery node rediscovery for {} request failed.", String.format("%04X", networkAddress)); + } catch (InterruptedException | ExecutionException e) { + logger.debug("NWK Discovery interrupted in checkIeeeAddressResponse"); } + logger.debug("NWK Discovery for {} finishing node rediscovery", + String.format("%04X", networkAddress)); }); } @@ -227,54 +224,51 @@ protected void rediscoverNode(final IeeeAddress ieeeAddress) { return; } - networkManager.executeTask(new Runnable() { - @Override - public void run() { - logger.debug("{}: NWK Discovery starting node rediscovery", ieeeAddress); - try { - if (Thread.currentThread().isInterrupted()) { - return; - } - - NetworkAddressResponse nwkAddressResponse = null; - ZigBeeNode node = networkManager.getNode(ieeeAddress); - if (node != null) { - logger.debug("{}: NWK Discovery: Rediscovery using unicast to {}", ieeeAddress, - String.format("%04X", node.getNetworkAddress())); - NetworkAddressRequest request = new NetworkAddressRequest(ieeeAddress, 0, 0); - request.setDestinationAddress(new ZigBeeEndpointAddress(node.getNetworkAddress())); - CommandResult response = networkManager.sendTransaction(request, request).get(); - nwkAddressResponse = response.getResponse(); - } - - if (nwkAddressResponse == null) { - logger.debug("{}: NWK Discovery: Rediscovery using broadcast", ieeeAddress); - NetworkAddressRequest request = new NetworkAddressRequest(ieeeAddress, 0, 0); - request.setDestinationAddress( - new ZigBeeEndpointAddress(ZigBeeBroadcastDestination.BROADCAST_RX_ON.getKey())); - CommandResult response = networkManager.sendTransaction(request, request).get(); - nwkAddressResponse = response.getResponse(); - } - - logger.debug("{}: NWK Discovery NetworkAddressRequest returned from {}", ieeeAddress, - nwkAddressResponse); - if (nwkAddressResponse != null && nwkAddressResponse.getStatus() == ZdoStatus.SUCCESS) { - logger.debug("{}: NWK Discovery: Rediscovery found network address to {}", ieeeAddress, - String.format("%04X", nwkAddressResponse.getNwkAddrRemoteDev())); - addNode(nwkAddressResponse.getIeeeAddrRemoteDev(), - nwkAddressResponse.getNwkAddrRemoteDev()); - startNodeDiscovery(nwkAddressResponse.getNwkAddrRemoteDev()); - return; - } - - // We failed with the request - logger.debug("{}: NWK Discovery node rediscovery request failed.", - ieeeAddress); - } catch (InterruptedException | ExecutionException e) { - logger.debug("NWK Discovery interrupt in rediscoverNode"); + networkManager.executeTask(() -> { + logger.debug("{}: NWK Discovery starting node rediscovery", ieeeAddress); + try { + if (Thread.currentThread().isInterrupted()) { + return; + } + + NetworkAddressResponse nwkAddressResponse = null; + ZigBeeNode node = networkManager.getNode(ieeeAddress); + if (node != null) { + logger.debug("{}: NWK Discovery: Rediscovery using unicast to {}", ieeeAddress, + String.format("%04X", node.getNetworkAddress())); + NetworkAddressRequest request = new NetworkAddressRequest(ieeeAddress, 0, 0); + request.setDestinationAddress(new ZigBeeEndpointAddress(node.getNetworkAddress())); + CommandResult response = networkManager.sendTransaction(request, request).get(); + nwkAddressResponse = response.getResponse(); } - logger.debug("{}: NWK Discovery finishing node rediscovery", ieeeAddress); + + if (nwkAddressResponse == null) { + logger.debug("{}: NWK Discovery: Rediscovery using broadcast", ieeeAddress); + NetworkAddressRequest request = new NetworkAddressRequest(ieeeAddress, 0, 0); + request.setDestinationAddress( + new ZigBeeEndpointAddress(ZigBeeBroadcastDestination.BROADCAST_RX_ON.getKey())); + CommandResult response = networkManager.sendTransaction(request, request).get(); + nwkAddressResponse = response.getResponse(); + } + + logger.debug("{}: NWK Discovery NetworkAddressRequest returned from {}", ieeeAddress, + nwkAddressResponse); + if (nwkAddressResponse != null && nwkAddressResponse.getStatus() == ZdoStatus.SUCCESS) { + logger.debug("{}: NWK Discovery: Rediscovery found network address to {}", ieeeAddress, + String.format("%04X", nwkAddressResponse.getNwkAddrRemoteDev())); + addNode(nwkAddressResponse.getIeeeAddrRemoteDev(), + nwkAddressResponse.getNwkAddrRemoteDev()); + startNodeDiscovery(nwkAddressResponse.getNwkAddrRemoteDev()); + return; + } + + // We failed with the request + logger.debug("{}: NWK Discovery node rediscovery request failed.", + ieeeAddress); + } catch (InterruptedException | ExecutionException e) { + logger.debug("NWK Discovery interrupt in rediscoverNode"); } + logger.debug("{}: NWK Discovery finishing node rediscovery", ieeeAddress); }); } @@ -298,42 +292,39 @@ private void startNodeDiscovery(final int nodeNetworkAddress) { } logger.debug("NWK Discovery for {} scheduling node discovery", String.format("%04X", nodeNetworkAddress)); - networkManager.executeTask(new Runnable() { - @Override - public void run() { - try { - logger.debug("NWK Discovery for {} starting node discovery", - String.format("%04X", nodeNetworkAddress)); - boolean success = true; - if (Thread.currentThread().isInterrupted()) { - return; - } - - if (!success) { - // We failed with the request. - return; - } - - // If we don't know the node yet, then try to find the IEEE address - // before requesting the associated nodes. - if (networkManager.getNode(nodeNetworkAddress) == null) { - success = getIeeeAddress(nodeNetworkAddress); - return; - } - - success = getAssociatedNodes(nodeNetworkAddress); - if (success) { - return; - } - - logger.debug("NWK Discovery for {} ending node discovery. Success={}.", - String.format("%04X", nodeNetworkAddress), success); - } catch (InterruptedException | ExecutionException e) { - logger.debug("NWK Discovery interrupted"); - } catch (Exception e) { - logger.error("NWK Discovery for {} error during node discovery: ", - String.format("%04X", nodeNetworkAddress), e); + networkManager.executeTask(() -> { + try { + logger.debug("NWK Discovery for {} starting node discovery", + String.format("%04X", nodeNetworkAddress)); + boolean success = true; + if (Thread.currentThread().isInterrupted()) { + return; } + + if (!success) { + // We failed with the request. + return; + } + + // If we don't know the node yet, then try to find the IEEE address + // before requesting the associated nodes. + if (networkManager.getNode(nodeNetworkAddress) == null) { + success = getIeeeAddress(nodeNetworkAddress); + return; + } + + success = getAssociatedNodes(nodeNetworkAddress); + if (success) { + return; + } + + logger.debug("NWK Discovery for {} ending node discovery. Success={}.", + String.format("%04X", nodeNetworkAddress), success); + } catch (InterruptedException | ExecutionException e) { + logger.debug("NWK Discovery interrupted"); + } catch (Exception e) { + logger.error("NWK Discovery for {} error during node discovery: ", + String.format("%04X", nodeNetworkAddress), e); } }); } diff --git a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/otaserver/ZclOtaUpgradeServer.java b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/otaserver/ZclOtaUpgradeServer.java index e128286a0d..1b3ef0ab3d 100644 --- a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/otaserver/ZclOtaUpgradeServer.java +++ b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/otaserver/ZclOtaUpgradeServer.java @@ -577,11 +577,8 @@ private void updateStatus(final ZigBeeOtaServerStatus updatedStatus) { synchronized (this) { // Notify the listeners for (final ZigBeeOtaStatusCallback statusListener : statusListeners) { - cluster.getNotificationService().execute(new Runnable() { - @Override - public void run() { - statusListener.otaStatusUpdate(updatedStatus, percentComplete); - } + cluster.getNotificationService().execute(() -> { + statusListener.otaStatusUpdate(updatedStatus, percentComplete); }); } } @@ -990,21 +987,18 @@ private ZigBeeOtaFile notifyUpdateRequestReceived(final QueryNextImageCommand co // Notify the listeners latch = new CountDownLatch(statusListeners.size()); for (final ZigBeeOtaStatusCallback statusListener : statusListeners) { - cluster.getNotificationService().execute(new Runnable() { - @Override - public void run() { - logger.trace("{}: ZigBeeOtaServer.notifyUpdateRequestReceived {} of {}", - cluster.getZigBeeAddress(), statusListener, command); - - ZigBeeOtaFile response = statusListener.otaIncomingRequest(command); - if (response != null) { - otaFiles.add(response); - while (latch.getCount() > 0) { - latch.countDown(); - } - } else { + cluster.getNotificationService().execute(() -> { + logger.trace("{}: ZigBeeOtaServer.notifyUpdateRequestReceived {} of {}", + cluster.getZigBeeAddress(), statusListener, command); + + ZigBeeOtaFile response = statusListener.otaIncomingRequest(command); + if (response != null) { + otaFiles.add(response); + while (latch.getCount() > 0) { latch.countDown(); } + } else { + latch.countDown(); } }); } diff --git a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/SmartEnergyClient.java b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/SmartEnergyClient.java index f187977b76..6c24ae9aa0 100644 --- a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/SmartEnergyClient.java +++ b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/SmartEnergyClient.java @@ -393,11 +393,8 @@ private void updateClientState(SmartEnergyClientState newState) { synchronized (this) { // Notify the listeners for (final SmartEnergyStatusCallback statusListener : statusListeners) { - networkManager.getNotificationService().execute(new Runnable() { - @Override - public void run() { - statusListener.sepStatusUpdate(updatedStatus); - } + networkManager.getNotificationService().execute(() -> { + statusListener.sepStatusUpdate(updatedStatus); }); } } @@ -465,78 +462,75 @@ private void discoveryStop() { private void timerStart(int milliseconds) { logger.debug("SEP Extension: SEP discovery timer start in {}ms at state {}", milliseconds, seState); timerCancel(); - timer = networkManager.scheduleTask(new Runnable() { - @Override - public void run() { - logger.debug("SEP Extension: SEP discovery running task {}, attempt {}", seState, retryCounter); - if (retryCounter++ > SEP_RETRIES) { - logger.debug("SEP Extension: SEP discovery terminated - too many retries"); - discoveryStop(); - return; - } - logger.debug("SEP Extension: SEP discovery running task {}, attempt {}", seState, retryCounter); - - switch (seState) { - case DISCOVER_TRUST_CENTRE: - if (networkManager.getNode(0) != null - && networkManager.getNode(0).getLogicalType() != LogicalType.UNKNOWN) { - logger.debug("SEP Extension: Trust centre already known"); - updateClientState(SmartEnergyClientState.DISCOVER_KEY_ESTABLISHMENT_CLUSTER); - timerStart(TIMER_IMMEDIATE); - break; - } - ZigBeeNode trustCentre = networkManager.getNode(0); - if (trustCentre == null) { - IeeeAddress ieeeAddress = requestIeeeAddress(0); - if (ieeeAddress == null) { - logger.debug("SEP Extension: SEP discovery did not find TC IEEE address"); - timerStart(SEP_RETRY_PERIOD); - break; - } - logger.debug("SEP Extension: SEP discovery found TC IEEE address - {}", ieeeAddress); - - trustCentre = new ZigBeeNode(networkManager, ieeeAddress); - trustCentre.setNetworkAddress(0); - } - try { - if (requestNodeDescriptor(trustCentre)) { - } - } catch (InterruptedException | ExecutionException e) { - logger.debug("SEP Extension: Exception getting node descriptor for address - {}", - trustCentre.getIeeeAddress()); - } - networkManager.updateNode(trustCentre); + timer = networkManager.scheduleTask(() -> { + logger.debug("SEP Extension: SEP discovery running task {}, attempt {}", seState, retryCounter); + if (retryCounter++ > SEP_RETRIES) { + logger.debug("SEP Extension: SEP discovery terminated - too many retries"); + discoveryStop(); + return; + } + logger.debug("SEP Extension: SEP discovery running task {}, attempt {}", seState, retryCounter); + switch (seState) { + case DISCOVER_TRUST_CENTRE: + if (networkManager.getNode(0) != null + && networkManager.getNode(0).getLogicalType() != LogicalType.UNKNOWN) { + logger.debug("SEP Extension: Trust centre already known"); updateClientState(SmartEnergyClientState.DISCOVER_KEY_ESTABLISHMENT_CLUSTER); timerStart(TIMER_IMMEDIATE); break; - case DISCOVER_KEY_ESTABLISHMENT_CLUSTER: - discoverKeyEstablishmentServer(); - // Timer restarted in discoverServices - break; - case PERFORM_KEY_ESTABLISHMENT: - performKeyEstablishment(); - // Timer restarted in keyEstablishmentCallback - break; - case DISCOVER_METERING_SERVERS: - discoverMeteringServers(); - // Timer restarted in discoverServices - break; - case DISCOVER_KEEP_ALIVE: - discoverKeepAlive(); - // Timer restarted in discoverServices - break; - case DISCOVER_KEEP_ALIVE_TIMEOUT: - discoverKeepAliveTimeout(); - // Timer restarted in updateClientState - break; - case KEEP_ALIVE: - keepalivePoll(); - timerStart(keepaliveTimeout); - break; - default: - break; - } + } + ZigBeeNode trustCentre = networkManager.getNode(0); + if (trustCentre == null) { + IeeeAddress ieeeAddress = requestIeeeAddress(0); + if (ieeeAddress == null) { + logger.debug("SEP Extension: SEP discovery did not find TC IEEE address"); + timerStart(SEP_RETRY_PERIOD); + break; + } + logger.debug("SEP Extension: SEP discovery found TC IEEE address - {}", ieeeAddress); + + trustCentre = new ZigBeeNode(networkManager, ieeeAddress); + trustCentre.setNetworkAddress(0); + } + try { + if (requestNodeDescriptor(trustCentre)) { + } + } catch (InterruptedException | ExecutionException e) { + logger.debug("SEP Extension: Exception getting node descriptor for address - {}", + trustCentre.getIeeeAddress()); + } + networkManager.updateNode(trustCentre); + + updateClientState(SmartEnergyClientState.DISCOVER_KEY_ESTABLISHMENT_CLUSTER); + timerStart(TIMER_IMMEDIATE); + break; + case DISCOVER_KEY_ESTABLISHMENT_CLUSTER: + discoverKeyEstablishmentServer(); + // Timer restarted in discoverServices + break; + case PERFORM_KEY_ESTABLISHMENT: + performKeyEstablishment(); + // Timer restarted in keyEstablishmentCallback + break; + case DISCOVER_METERING_SERVERS: + discoverMeteringServers(); + // Timer restarted in discoverServices + break; + case DISCOVER_KEEP_ALIVE: + discoverKeepAlive(); + // Timer restarted in discoverServices + break; + case DISCOVER_KEEP_ALIVE_TIMEOUT: + discoverKeepAliveTimeout(); + // Timer restarted in updateClientState + break; + case KEEP_ALIVE: + keepalivePoll(); + timerStart(keepaliveTimeout); + break; + default: + break; } }, milliseconds); } diff --git a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/ZclKeyEstablishmentClient.java b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/ZclKeyEstablishmentClient.java index baf54fbf50..ddd9878982 100644 --- a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/ZclKeyEstablishmentClient.java +++ b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/ZclKeyEstablishmentClient.java @@ -650,16 +650,13 @@ private void startTerminationTimer(int delay) { logger.debug("{}: CBKE Key Establishment Client: Timer started for {} seconds at {}", ieeeAddress, delay, state); - timer = timerService.schedule(new Runnable() { - @Override - public void run() { - timer = null; - logger.debug("{}: CBKE Key Establishment Client: Timeout waiting for message in state {}", ieeeAddress, - state); - // Note that no TerminateKeyEstablishment message should be sent. - setState(KeyEstablishmentState.FAILED); - stopCbke(0); - } + timer = timerService.schedule(() -> { + timer = null; + logger.debug("{}: CBKE Key Establishment Client: Timeout waiting for message in state {}", ieeeAddress, + state); + // Note that no TerminateKeyEstablishment message should be sent. + setState(KeyEstablishmentState.FAILED); + stopCbke(0); }, delay, TimeUnit.SECONDS); } diff --git a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/ZclKeyEstablishmentServer.java b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/ZclKeyEstablishmentServer.java index bc0bfd2df4..e569cf04d0 100644 --- a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/ZclKeyEstablishmentServer.java +++ b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/app/seclient/ZclKeyEstablishmentServer.java @@ -486,16 +486,13 @@ private void startTerminationTimer(int delay) { logger.debug("{}: CBKE Key Establishment Server: Timer started for {} seconds at {}", ieeeAddress, delay, keyEstablishmentState); - timer = timerService.schedule(new Runnable() { - @Override - public void run() { - timer = null; - logger.debug("{}: CBKE Key Establishment Server: Timeout waiting for message in state {}", ieeeAddress, - keyEstablishmentState); - // Note that no TerminateKeyEstablishment message should be sent. - setState(KeyEstablishmentState.FAILED); - stopCbke(); - } + timer = timerService.schedule(() -> { + timer = null; + logger.debug("{}: CBKE Key Establishment Server: Timeout waiting for message in state {}", ieeeAddress, + keyEstablishmentState); + // Note that no TerminateKeyEstablishment message should be sent. + setState(KeyEstablishmentState.FAILED); + stopCbke(); }, delay, TimeUnit.SECONDS); } diff --git a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/internal/ZigBeeCommandNotifier.java b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/internal/ZigBeeCommandNotifier.java index 1a7bb3500b..a92292199d 100644 --- a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/internal/ZigBeeCommandNotifier.java +++ b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/internal/ZigBeeCommandNotifier.java @@ -60,11 +60,8 @@ public synchronized void removeCommandListener(ZigBeeCommandListener commandList public synchronized void notifyCommandListeners(final ZigBeeCommand command) { // Notify the listeners for (final ZigBeeCommandListener commandListener : commandListeners) { - networkManager.getNotificationService().execute(new Runnable() { - @Override - public void run() { - commandListener.commandReceived(command); - } + networkManager.getNotificationService().execute(() -> { + commandListener.commandReceived(command); }); } } diff --git a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/transaction/ZigBeeTransaction.java b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/transaction/ZigBeeTransaction.java index a5e01e9d47..2a7f469d96 100644 --- a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/transaction/ZigBeeTransaction.java +++ b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/transaction/ZigBeeTransaction.java @@ -401,18 +401,15 @@ private void startTimer(int timeout) { stopTimer(); // Schedule a task to timeout the transaction - timeoutTask = transactionManager.scheduleTask(new Runnable() { - @Override - public void run() { - if (transactionFuture.isCancelled() || state == TransactionState.RESPONDED) { - // Even though this transaction has timed out waiting for the transport, - // we did receive a response that completed the transaction at application level - // Additionally, if the future was cancelled, we assume this was done by the application - // so it's treated as complete. - completeTransaction(completionCommand); - } else { - failTransaction(); - } + timeoutTask = transactionManager.scheduleTask(() -> { + if (transactionFuture.isCancelled() || state == TransactionState.RESPONDED) { + // Even though this transaction has timed out waiting for the transport, + // we did receive a response that completed the transaction at application level + // Additionally, if the future was cancelled, we assume this was done by the application + // so it's treated as complete. + completeTransaction(completionCommand); + } else { + failTransaction(); } }, timeout); } diff --git a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/transaction/ZigBeeTransactionManager.java b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/transaction/ZigBeeTransactionManager.java index 38e31d2f27..0cc0e9b804 100644 --- a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/transaction/ZigBeeTransactionManager.java +++ b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/transaction/ZigBeeTransactionManager.java @@ -208,12 +208,7 @@ public void shutdown() { synchronized (outstandingTransactions) { // Notify the listeners for (final ZigBeeTransaction transaction : outstandingTransactions) { - networkManager.getNotificationService().execute(new Runnable() { - @Override - public void run() { - transaction.cancel(); - } - }); + networkManager.getNotificationService().execute(transaction::cancel); } } executorService.shutdownNow(); @@ -552,11 +547,8 @@ private void notifyTransactionCommand(final ZigBeeCommand command) { // Notify the listeners for (final ZigBeeTransaction transaction : outstandingTransactions) { logger.trace("notifyTransactionCommand: {} {}", command, transaction); - networkManager.getNotificationService().execute(new Runnable() { - @Override - public void run() { - transaction.commandReceived(command); - } + networkManager.getNotificationService().execute(() -> { + transaction.commandReceived(command); }); } } @@ -574,11 +566,8 @@ private void notifyTransactionProgress(final int transactionId, ZigBeeTransportP synchronized (outstandingTransactions) { // Notify the listeners for (final ZigBeeTransaction transaction : outstandingTransactions) { - networkManager.getNotificationService().execute(new Runnable() { - @Override - public void run() { - transaction.transactionStatusReceived(state, transactionId); - } + networkManager.getNotificationService().execute(() -> { + transaction.transactionStatusReceived(state, transactionId); }); } } @@ -716,12 +705,7 @@ private void sendNextTransaction() { private void startRequeueTimer(final long timeout) { // Schedule a task to kick off the next transaction try { - timeoutTask = scheduleTask(new Runnable() { - @Override - public void run() { - sendNextTransaction(); - } - }, timeout); + timeoutTask = scheduleTask(this::sendNextTransaction, timeout); } catch (RejectedExecutionException e) { logger.debug("Unable to start requeue timer."); } diff --git a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/zcl/ZclCluster.java b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/zcl/ZclCluster.java index 13e15fd95f..0563675b48 100644 --- a/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/zcl/ZclCluster.java +++ b/com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/zcl/ZclCluster.java @@ -1286,18 +1286,15 @@ public void removeAttributeListener(final ZclAttributeListener listener) { */ private void notifyAttributeListener(final ZclAttribute attribute, final Object value) { for (final ZclAttributeListener listener : attributeListeners) { - getNotificationService().execute(new Runnable() { - @Override - public void run() { - logger.trace("{}: ZclCluster.notifyAttributeListener {} of {} with value {}", - zigbeeEndpoint.getEndpointAddress(), listener, attribute, value); - - try { - listener.attributeUpdated(attribute, value); - } catch (Exception e) { - logger.warn("{}: Exception when notifying attribute listener {} of {} with value {}", - zigbeeEndpoint.getEndpointAddress(), listener, attribute, value, e); - } + getNotificationService().execute(() -> { + logger.trace("{}: ZclCluster.notifyAttributeListener {} of {} with value {}", + zigbeeEndpoint.getEndpointAddress(), listener, attribute, value); + + try { + listener.attributeUpdated(attribute, value); + } catch (Exception e) { + logger.warn("{}: Exception when notifying attribute listener {} of {} with value {}", + zigbeeEndpoint.getEndpointAddress(), listener, attribute, value, e); } }); } @@ -1344,20 +1341,17 @@ private boolean notifyCommandListener(final ZclCommand command) { synchronized (commandListeners) { latch = new CountDownLatch(commandListeners.size()); for (final ZclCommandListener listener : commandListeners) { - getNotificationService().execute(new Runnable() { - @Override - public void run() { - logger.trace("{}: ZclCluster.notifyCommandListener {} of {}", - zigbeeEndpoint.getEndpointAddress(), listener, command); - - if (listener.commandReceived(command)) { - response.set(true); - while (latch.getCount() > 0) { - latch.countDown(); - } - } else { + getNotificationService().execute(() -> { + logger.trace("{}: ZclCluster.notifyCommandListener {} of {}", + zigbeeEndpoint.getEndpointAddress(), listener, command); + + if (listener.commandReceived(command)) { + response.set(true); + while (latch.getCount() > 0) { latch.countDown(); } + } else { + latch.countDown(); } }); }