From f4952d2ad63aa427625790665c93da69f10b16c9 Mon Sep 17 00:00:00 2001 From: Chris Jackson Date: Sun, 10 Nov 2024 20:19:22 +1300 Subject: [PATCH] Changes to support ASH window TX_K=5 Signed-off-by: Chris Jackson --- .../ember/internal/ash/AshFrameHandler.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/internal/ash/AshFrameHandler.java b/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/internal/ash/AshFrameHandler.java index e846bafae..e1b8feb0d 100644 --- a/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/internal/ash/AshFrameHandler.java +++ b/com.zsmartsystems.zigbee.dongle.ember/src/main/java/com/zsmartsystems/zigbee/dongle/ember/internal/ash/AshFrameHandler.java @@ -83,7 +83,7 @@ public class AshFrameHandler implements EzspProtocolHandler { /** * Maximum number of DATA frames we can transmit without an ACK */ - private final int TX_WINDOW = 1; + private final int TX_WINDOW = 5; private long sentTime; @@ -91,7 +91,7 @@ public class AshFrameHandler implements EzspProtocolHandler { private static final int ASH_FLAG_BYTE = 0x7E; private static final int ASH_SUBSTITUTE_BYTE = 0x18; private static final int ASH_XON_BYTE = 0x11; - private static final int ASH_OFF_BYTE = 0x13; + private static final int ASH_XOFF_BYTE = 0x13; private static final int ASH_TIMEOUT = -1; private static final int ASH_MAX_LENGTH = 220; @@ -218,7 +218,7 @@ private int[] getPacket() throws IOException { case ASH_XON_BYTE: // XON: Resume transmissionUsed in XON/XOFF flow control. Always ignored if received by the NCP. break; - case ASH_OFF_BYTE: + case ASH_XOFF_BYTE: // XOFF: Stop transmissionUsed in XON/XOFF flow control. Always ignored if received by the NCP. break; case ASH_TIMEOUT: @@ -300,7 +300,7 @@ public void run() { AshFrameData dataPacket = (AshFrameData) packet; - // Check for out of sequence frame number + // Check for correct sequence frame number if (packet.getFrmNum() == ackNum) { // Clear rejection condition rejectionCondition = false; @@ -555,19 +555,20 @@ private synchronized void sendFrame(AshFrame ashFrame) { private void sendRetry() { logger.debug("ASH: Retry Sent Queue Length {}", sentQueue.size()); - AshFrameData ashFrame = sentQueue.peek(); - if (ashFrame == null) { + if (sentQueue.isEmpty()) { logger.debug("ASH: Retry nothing to resend!"); return; } - ashFrame.setReTx(); - outputFrame(ashFrame); + for (AshFrameData ashFrame : sentQueue) { + ashFrame.setReTx(); + outputFrame(ashFrame); + } } // Synchronize this method to ensure a packet gets sent as a block private synchronized void outputFrame(AshFrame ashFrame) { - ashFrame.setAckNum(ackNum); + ashFrame.setAckNum((ackNum + sentQueue.size() - 1) & 0x07); logger.debug("--> TX ASH frame: {}", ashFrame); // Send the data