Skip to content

Commit

Permalink
Merge pull request #24 from MxMarx/main
Browse files Browse the repository at this point in the history
Support for auto transmission control
  • Loading branch information
jgillula committed Nov 13, 2022
2 parents 4956cb2 + 2ce6130 commit baa24fb
Showing 1 changed file with 19 additions and 6 deletions.
25 changes: 19 additions & 6 deletions RFM69/radio.py
Expand Up @@ -50,6 +50,9 @@ def __init__(self, freqBand, nodeID, networkID=100, **kwargs):
self.spiBus = kwargs.get('spiBus', 0)
self.spiDevice = kwargs.get('spiDevice', 0)
self.promiscuousMode = kwargs.get('promiscuousMode', 0)
self.enableATC = kwargs.get('enableATC', False)

self.lastRSSI = 0

# Thread-safe locks
self._spiLock = threading.Lock()
Expand Down Expand Up @@ -333,7 +336,7 @@ def get_packets(self):
return packets


def send_ack(self, toAddress, buff=""):
def send_ack(self, toAddress, buff=[]):
"""Send an acknowledgement packet
Args:
Expand All @@ -342,6 +345,14 @@ def send_ack(self, toAddress, buff=""):
"""
while not self._canSend():
pass #self.has_received_packet()

# Convert buff to list of int if it's a string so the RSSI can be inserted
if isinstance(buff, str):
buff = [int(ord(i)) for i in list(buff)]

# Insert absolute value of RSSI before any message
if self.enableATC:
buff = buff + [int(abs(self.lastRSSI))]
self._sendFrame(toAddress, buff, False, True)


Expand Down Expand Up @@ -459,13 +470,15 @@ def _sendFrame(self, toAddress, buff, requestACK, sendACK):
ack = 0
if sendACK:
ack = 0x80
if self.enableATC:
ack |= 0x20
elif requestACK:
ack = 0x40
with self._spiLock:
if isinstance(buff, str):
self.spi.xfer2([REG_FIFO | 0x80, len(buff) + 3, toAddress, self.address, ack] + [int(ord(i)) for i in list(buff)])
else:
self.spi.xfer2([REG_FIFO | 0x80, len(buff) + 3, toAddress, self.address, ack] + buff)
buff = [int(ord(i)) for i in list(buff)]

self.spi.xfer2([REG_FIFO | 0x80, len(buff) + 3, toAddress, self.address, ack] + buff)

with self._sendLock:
self._setMode(RF69_MODE_TX)
Expand Down Expand Up @@ -594,7 +607,7 @@ def _interruptHandler(self, pin): # pragma: no cover
ack_requested = bool(CTLbyte & 0x40) and target_id == self.address # Only send back an ack if we're the intended recipient
with self._spiLock:
data = self.spi.xfer2([REG_FIFO & 0x7f] + [0 for i in range(0, data_length)])[1:]
rssi = self._readRSSI()
self.lastRSSI = self._readRSSI()

if ack_received:
self._debug("Incoming ack from {}".format(sender_id))
Expand All @@ -615,7 +628,7 @@ def _interruptHandler(self, pin): # pragma: no cover
# )
with self._packetLock:
self._packets.append(
Packet(int(target_id), int(sender_id), int(rssi), list(data))
Packet(int(target_id), int(sender_id), int(self.lastRSSI), list(data))
)
self._packetLock.notify_all()

Expand Down

0 comments on commit baa24fb

Please sign in to comment.