fix: Switch to delay-based delivery — wantAck firmware retries cause duplicates

This commit is contained in:
K7ZVX 2026-05-07 21:50:09 +00:00
commit 914c21e167

View file

@ -24,12 +24,7 @@ class Responder:
destination: Optional[str] = None,
channel: int = 0,
) -> bool:
"""Send response messages with ACK-accelerated delivery.
DMs: Send -> wait for ACK -> if ACK, send next immediately.
If no ACK, retry once -> if still no ACK, abort.
Broadcasts: delay-based pacing (no ACK available).
"""
"""Send response messages with randomized delay pacing."""
if isinstance(messages, str):
messages = [messages]
@ -37,43 +32,8 @@ class Responder:
return True
success = True
is_dm = destination is not None
for i, msg in enumerate(messages):
if is_dm and hasattr(self.connector, 'send_and_wait_ack'):
# Send and wait for ACK
ack = await asyncio.get_event_loop().run_in_executor(
None,
self.connector.send_and_wait_ack,
msg, destination, channel, 30.0,
)
if ack:
# ACK received - next message sends immediately (no delay)
logger.debug(f"ACK msg {i+1}/{len(messages)}: {msg[:50]}...")
continue
# No ACK - retry same message once after short pause
logger.warning(f"No ACK for msg {i+1}/{len(messages)}, retrying...")
await asyncio.sleep(2.0)
ack = await asyncio.get_event_loop().run_in_executor(
None,
self.connector.send_and_wait_ack,
msg, destination, channel, 30.0,
)
if ack:
logger.debug(f"ACK on retry msg {i+1}/{len(messages)}")
continue
# Double failure - abort
logger.error(f"No ACK after retry msg {i+1}/{len(messages)}, aborting remaining")
success = False
break
else:
# Broadcasts or fallback: delay-based pacing
if i > 0:
delay = random.uniform(self.config.delay_min, self.config.delay_max)
await asyncio.sleep(delay)