From 729d8f385ba2ec529677b9dc565ecac12081ee9f Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Thu, 8 Oct 2020 02:46:28 -0700 Subject: [PATCH 001/103] extremely rough draft --- recipes/wireless_hid_hub.py | 67 ++++++++++++++++++++++++++++++ recipes/wireless_hid_peripheral.py | 17 ++++++++ 2 files changed, 84 insertions(+) create mode 100644 recipes/wireless_hid_hub.py create mode 100644 recipes/wireless_hid_peripheral.py diff --git a/recipes/wireless_hid_hub.py b/recipes/wireless_hid_hub.py new file mode 100644 index 0000000..7d96469 --- /dev/null +++ b/recipes/wireless_hid_hub.py @@ -0,0 +1,67 @@ +""" +HID Hub Recipe +============== + +This module uses CircuitPython's builtin usb_hid library as a wireless +hub to extend USB HID interfaces via the nRF24L01 transceivers. + +Dependencies +------------ + +circuitpython firmware (namely the `usb_hid` module) + +.. warning:: This is not compatible with linux-based SoC computers + like the Raspberry Pi because the ``adafruit-blinka`` library + does not provide the same *exact* API that the CircuitPython + firmware does (concerning the usb_hid module). +""" +import board +from digitalio import DigitalInOut +import usb_hid +from circuitpython_nrf24l01.rf24 import RF24 +# from microcontroller import nvm + +# SETUP THE HID LIST +# index 0 for wireless cmds; indices 1-4 will relate to the pipe which +# received the HID data reports to pass on over the USB cable +hid = [b""] + [None] * 4 +for device in usb_hid.devices: + if device.usage == 6 and device.usage_page == 1: + hid[1] = device # mouse + elif device.usage == 2 and device.usage_page == 1: + hid[2] = device # keyboard + elif device.usage == 5 and device.usage_page == 1: + hid[3] = device # gamepad + elif device.usage == 1 and device.usage_page == 0x0C: + hid[4] = device # consumer + + +# SETUP THE TRANSCEIVER +ce_pin = DigitalInOut(board.D4) # the nRF24L01 CE pin +csn_pin = DigitalInOut(board.D5) # the nRF24L01 CSN pin +spi = board.SPI() # the SPI object for the SPI bus +nrf = RF24(spi, csn_pin, ce_pin) # the nRF24L01 object +nrf.address_length = 4 # we only need 4-byte addresses +nrf.open_rx_pipe(0, b"Pair") # pipe for pairing operations +nrf.open_rx_pipe(1, b"6HID") # pipe for mouse HID +nrf.open_rx_pipe(2, b"2HID") # pipe for keyboard HID +nrf.open_rx_pipe(3, b"5HID") # pipe for gamepad HID +nrf.open_rx_pipe(4, b"1HID") # pipe for Consumer HID +nrf.close_rx_pipe(5) # pipe 5 will not be used +nrf.ack = True # for returning data to peripherals in ACK payloads + +def host(): + """Run this function to enable the nRF24L01 as a wireless HID hub""" + nrf.listen = True # start listening + sleep_cmd = False # can be told to + while not sleep_cmd: + while not nrf.fifo(False, True): + if nrf.pipe: # if pipe number > 0 + # forward the data + hid[nrf.pipe].send_report(nrf.recv()) + else: # use pipe 0 as a cmd interface + hid[0] = nrf.recv() # grab cmd buffer + if hid[0][0] == 0: # if first cmd byte is 0 + sleep_cmd = True # put radio to sleep + nrf.listen = False + nrf.power = False # really; put it to sleep diff --git a/recipes/wireless_hid_peripheral.py b/recipes/wireless_hid_peripheral.py new file mode 100644 index 0000000..7a91969 --- /dev/null +++ b/recipes/wireless_hid_peripheral.py @@ -0,0 +1,17 @@ +""" +HID Peripheral Recipe +===================== + +This module uses Adafruit_CircuitPython_HID library to contruct +USB HID report data & transport them to a wireless HID hub via the +nRF24L01 transceivers. + +Dependencies +------------ + +`Adafruit_CircuitPython_HID +`_ + +..note:: The above dependency is primarily only used for + knowing the keyboard keycodes. +""" From 4e81319cec9f1b918071ba9fd8b4edd5d19d6a99 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 23 Oct 2020 23:33:53 -0700 Subject: [PATCH 002/103] exit blocking send/resend doesn't clear irq flags --- circuitpython_nrf24l01/rf24.py | 5 +---- circuitpython_nrf24l01/rf24_lite.py | 2 -- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 13d0b84..050e01b 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -298,7 +298,6 @@ def send(self, buf, ask_no_ack=False, force_retry=0, send_only=False): break if self._status & 0x60 == 0x60 and not send_only: result = self.recv() - self.clear_status_flags(False) return result @property @@ -503,8 +502,7 @@ def payload_length(self, length): elif not isinstance(length, (list, tuple)): raise ValueError("length {} is not a valid input".format(length)) for i, val in enumerate(length): - if i < 6: - if 0 < val <= 32: # don't throw exception, just skip pipe + if i < 6 and 0 < val <= 32: # don't throw exception; skip pipe self._pl_len[i] = val self._reg_write(RX_PL_LENG + i, val) @@ -710,7 +708,6 @@ def resend(self, send_only=False): result = self.irq_ds if self._status & 0x60 == 0x60 and not send_only: result = self.recv() - self.clear_status_flags(False) return result def write(self, buf, ask_no_ack=False, write_only=False): diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index 6934c63..a32c0a6 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -163,7 +163,6 @@ def send(self, buf, ask_no_ack=False, force_retry=0, send_only=False): break if self._status & 0x60 == 0x60 and not send_only: result = self.recv() - self.clear_status_flags(False) return result @property @@ -320,7 +319,6 @@ def resend(self, send_only=False): result = self.irq_ds if self._status & 0x60 == 0x60 and not send_only: result = self.recv() - self.clear_status_flags(False) return result def write(self, buf, ask_no_ack=False, write_only=False): From c9f45731494ee37d7a33d09cb39f84630e726dfe Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 23 Oct 2020 23:37:02 -0700 Subject: [PATCH 003/103] bad indent --- circuitpython_nrf24l01/rf24.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 050e01b..42bc6d4 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -503,8 +503,8 @@ def payload_length(self, length): raise ValueError("length {} is not a valid input".format(length)) for i, val in enumerate(length): if i < 6 and 0 < val <= 32: # don't throw exception; skip pipe - self._pl_len[i] = val - self._reg_write(RX_PL_LENG + i, val) + self._pl_len[i] = val + self._reg_write(RX_PL_LENG + i, val) @property def arc(self): From 2063059373d0b4ddf945666b4891ae4fa5fe3299 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 24 Oct 2020 15:50:37 -0700 Subject: [PATCH 004/103] multiceiver doesn't ack payloads; pack TX payloads --- examples/nrf24l01_multiceiver_test.py | 36 +++++++++++---------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/examples/nrf24l01_multiceiver_test.py b/examples/nrf24l01_multiceiver_test.py index 5a7e3ba..e74d01f 100644 --- a/examples/nrf24l01_multiceiver_test.py +++ b/examples/nrf24l01_multiceiver_test.py @@ -5,6 +5,7 @@ to the node-1 transmitter. """ import time +import struct import board import digitalio as dio @@ -31,38 +32,33 @@ # setup the addresses for all transmitting nRF24L01 nodes addresses = [ b"\x78" * 5, - b"\xF1\xB3\xB4\xB5\xB6", - b"\xCD\xB3\xB4\xB5\xB6", - b"\xA3\xB3\xB4\xB5\xB6", - b"\x0F\xB3\xB4\xB5\xB6", - b"\x05\xB3\xB4\xB5\xB6" + b"\xF1\xB6\xB5\xB4\xB3", + b"\xCD\xB6\xB5\xB4\xB3", + b"\xA3\xB6\xB5\xB4\xB3", + b"\x0F\xB6\xB5\xB4\xB3", + b"\x05\xB6\xB5\xB4\xB3" ] -# to use custom ACK payloads, we must enable that feature -nrf.ack = True -# let this be the ACK payload -ACK = b"Yak Back ACK" - def base(timeout=10): """Use the nRF24L01 as a base station for lisening to all nodes""" # write the addresses to all pipes. for pipe_n, addr in enumerate(addresses): nrf.open_rx_pipe(pipe_n, addr) - while nrf.fifo(True, False): # fill TX FIFO with ACK payloads - nrf.load_ack(ACK, 1) # only send ACK payload to node 1 nrf.listen = True # put base station into RX mode start_timer = time.monotonic() # start timer while time.monotonic() - start_timer < timeout: while not nrf.fifo(False, True): # keep RX FIFO empty for reception # show the pipe number that received the payload - print("node", nrf.pipe, "sent:", nrf.recv()) + print("pipe", nrf.pipe, end=" ") # recv() clears the pipe number + nodeID, payloadID = struct.unpack(" Date: Sat, 24 Oct 2020 15:51:57 -0700 Subject: [PATCH 005/103] update example docstring --- examples/nrf24l01_multiceiver_test.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/nrf24l01_multiceiver_test.py b/examples/nrf24l01_multiceiver_test.py index e74d01f..d63f9e2 100644 --- a/examples/nrf24l01_multiceiver_test.py +++ b/examples/nrf24l01_multiceiver_test.py @@ -1,8 +1,6 @@ """ Simple example of using 1 nRF24L01 to receive data from up to 6 other transceivers. This technique is called "multiceiver" in the datasheet. -For fun, this example also sends an ACK payload from the base station -to the node-1 transmitter. """ import time import struct From 9b11a8a6873897a2113b108fb1706af29e921cdd Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 28 Oct 2020 02:28:42 -0700 Subject: [PATCH 006/103] Update fake_ble.py --- circuitpython_nrf24l01/fake_ble.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/circuitpython_nrf24l01/fake_ble.py b/circuitpython_nrf24l01/fake_ble.py index e23dde2..9e510a5 100644 --- a/circuitpython_nrf24l01/fake_ble.py +++ b/circuitpython_nrf24l01/fake_ble.py @@ -136,7 +136,7 @@ def name(self, n): if n is not None: if not isinstance(n, (bytes, bytearray)): raise ValueError("name must be a bytearray or bytes object.") - if len(n) > (21 - self._show_dbm * 3): + if len(n) > (18 - self._show_dbm * 3): raise ValueError("name length exceeds maximum.") self._ble_name = n @@ -154,9 +154,7 @@ def show_pa_level(self, enable): def hop_channel(self): """Trigger an automatic change of BLE compliant channels.""" - self._chan += 1 - if self._chan > 2: - self._chan = 0 + self._chan += 1 if self._chan < 2 else -2 self._radio.channel = BLE_FREQ[self._chan] def whiten(self, data): From 6fde8885096f158dc4de658d0de86c87526a5adf Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sun, 1 Nov 2020 02:56:26 -0800 Subject: [PATCH 007/103] use 5 us for CSN_DELAY, not 5 ms --- circuitpython_nrf24l01/rf24.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 42bc6d4..38819de 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -41,7 +41,7 @@ RX_PL_LENG = const(0x11) # RX payload widths; pipes 0-5 = 0x11-0x16 DYN_PL_LEN = const(0x1C) # dynamic payloads status for all pipes TX_FEATURE = const(0x1D) # dynamic TX-payloads, TX-ACK payloads, TX-NO_ACK -CSN_DELAY = 0.005 +CSN_DELAY = 0.000005 """The delay time (in seconds) used to let the CSN pin settle, allowing a clean SPI transaction.""" From 43423341bb3b44a06f5dd5e44c087a8380c43f5b Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sun, 1 Nov 2020 16:22:17 -0800 Subject: [PATCH 008/103] 5us is too short; use 500 us --- circuitpython_nrf24l01/rf24.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 38819de..2c12a1f 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -41,7 +41,7 @@ RX_PL_LENG = const(0x11) # RX payload widths; pipes 0-5 = 0x11-0x16 DYN_PL_LEN = const(0x1C) # dynamic payloads status for all pipes TX_FEATURE = const(0x1D) # dynamic TX-payloads, TX-ACK payloads, TX-NO_ACK -CSN_DELAY = 0.000005 +CSN_DELAY = 0.000475 """The delay time (in seconds) used to let the CSN pin settle, allowing a clean SPI transaction.""" From d4f283a6e864120b4f55e2eeacd35c977cd75ba6 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Mon, 2 Nov 2020 04:20:12 -0800 Subject: [PATCH 009/103] better csn_delay access --- circuitpython_nrf24l01/rf24.py | 12 +++++------- circuitpython_nrf24l01/rf24_lite.py | 8 ++++---- docs/advanced_api.rst | 2 +- docs/configure_api.rst | 6 ++++-- docs/troubleshooting.rst | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 2c12a1f..5fcf12b 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -41,9 +41,6 @@ RX_PL_LENG = const(0x11) # RX payload widths; pipes 0-5 = 0x11-0x16 DYN_PL_LEN = const(0x1C) # dynamic payloads status for all pipes TX_FEATURE = const(0x1D) # dynamic TX-payloads, TX-ACK payloads, TX-NO_ACK -CSN_DELAY = 0.000475 -"""The delay time (in seconds) used to let the CSN pin settle, -allowing a clean SPI transaction.""" class RF24: @@ -57,6 +54,7 @@ def __init__(self, spi, csn, ce, spi_frequency=10000000): # pre-configure the CONFIGURE register: # 0x0E = IRQs are all enabled, CRC is enabled with 2 bytes, and # power up in TX mode + self.csn_delay = 0.000475 #: delay time to let the CSN pin settle self._config = 0x0E self._reg_write(CONFIGURE, self._config) if self._reg_read(CONFIGURE) & 3 != 2: @@ -139,7 +137,7 @@ def _reg_read(self, reg): out_buf = bytes([reg, 0]) in_buf = bytearray([0, 0]) with self._spi as spi: - time.sleep(CSN_DELAY) + time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] return in_buf[1] @@ -148,7 +146,7 @@ def _reg_read_bytes(self, reg, buf_len=5): in_buf = bytearray(buf_len + 1) out_buf = bytes([reg]) + b"\x00" * buf_len with self._spi as spi: - time.sleep(CSN_DELAY) + time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] return in_buf[1:] @@ -157,7 +155,7 @@ def _reg_write_bytes(self, reg, out_buf): out_buf = bytes([0x20 | reg]) + out_buf in_buf = bytearray(len(out_buf)) with self._spi as spi: - time.sleep(CSN_DELAY) + time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] @@ -167,7 +165,7 @@ def _reg_write(self, reg, value=None): out_buf = bytes([0x20 | reg, value]) in_buf = bytearray(len(out_buf)) with self._spi as spi: - time.sleep(CSN_DELAY) + time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index a32c0a6..cfb2d9a 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -35,7 +35,7 @@ def _reg_read(self, reg): out_buf = bytes([reg, 0]) in_buf = bytearray([0, 0]) with self._spi as spi: - time.sleep(0.005) + time.sleep(0.0005) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] return in_buf[1] @@ -44,7 +44,7 @@ def _reg_read_bytes(self, reg, buf_len=5): in_buf = bytearray(buf_len + 1) out_buf = bytes([reg]) + b"\x00" * buf_len with self._spi as spi: - time.sleep(0.005) + time.sleep(0.0005) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] return in_buf[1:] @@ -53,7 +53,7 @@ def _reg_write_bytes(self, reg, out_buf): out_buf = bytes([0x20 | reg]) + out_buf in_buf = bytearray(len(out_buf)) with self._spi as spi: - time.sleep(0.005) + time.sleep(0.0005) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] @@ -63,7 +63,7 @@ def _reg_write(self, reg, val=None): out_buf = bytes([0x20 | reg, val]) in_buf = bytearray(len(out_buf)) with self._spi as spi: - time.sleep(0.005) + time.sleep(0.0005) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index fad5d0b..965eedd 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -299,7 +299,7 @@ write() .. automethod:: circuitpython_nrf24l01.rf24.RF24.write - This function isn't completely non-blocking as we still need to wait 5 ms (`CSN_DELAY`) + This function isn't completely non-blocking as we still need to wait `csn_delay` for the CSN pin to settle (allowing an accurate SPI write transaction). Example usage of this function can be seen in the `IRQ pin example `_ and in the `Stream example's "master_fifo()" function `_ diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 059d07e..3a8fd47 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -6,10 +6,12 @@ Configuration API ----------------- -CSN_DELAY +csn_delay ****************************** -.. autodata:: circuitpython_nrf24l01.rf24.CSN_DELAY +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.csn_delay + + This time (specified in seconds) allows for a clean SPI transaction. dynamic_payloads ****************************** diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index 915add1..e6899de 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -113,7 +113,7 @@ version: accept a `list` or `tuple`. * `rpd`, `start_carrier_wave()`, & `stop_carrier_wave()` removed. These only perform a test of the nRF24L01's hardware. - * `CSN_DELAY` removed. This is hard-coded to 5 milliseconds + * `csn_delay` removed. This is hard-coded to 500 microseconds * All comments and docstrings removed, meaning ``help()`` will not provide any specific information. Exception prompts have also been reduced and adjusted accordingly. * Cannot switch between different radio configurations using context manager (the `with` From f999f834865d1655f0a6e273ac6506badc7c07c4 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Mon, 2 Nov 2020 14:03:16 -0800 Subject: [PATCH 010/103] let rf24_lite use custom csn_delay --- circuitpython_nrf24l01/rf24_lite.py | 9 +++++---- docs/troubleshooting.rst | 1 - 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index cfb2d9a..04dc070 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -12,6 +12,7 @@ def __init__(self, spi, csn, ce, spi_frequency=10000000): self.ce_pin = ce self.ce_pin.switch_to_output(value=False) self._status = 0 + self.csn_delay = 0.000475 self._reg_write(0, 0x0E) if self._reg_read(0) & 3 != 2: raise RuntimeError("nRF24L01 Hardware not responding") @@ -35,7 +36,7 @@ def _reg_read(self, reg): out_buf = bytes([reg, 0]) in_buf = bytearray([0, 0]) with self._spi as spi: - time.sleep(0.0005) + time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] return in_buf[1] @@ -44,7 +45,7 @@ def _reg_read_bytes(self, reg, buf_len=5): in_buf = bytearray(buf_len + 1) out_buf = bytes([reg]) + b"\x00" * buf_len with self._spi as spi: - time.sleep(0.0005) + time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] return in_buf[1:] @@ -53,7 +54,7 @@ def _reg_write_bytes(self, reg, out_buf): out_buf = bytes([0x20 | reg]) + out_buf in_buf = bytearray(len(out_buf)) with self._spi as spi: - time.sleep(0.0005) + time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] @@ -63,7 +64,7 @@ def _reg_write(self, reg, val=None): out_buf = bytes([0x20 | reg, val]) in_buf = bytearray(len(out_buf)) with self._spi as spi: - time.sleep(0.0005) + time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index e6899de..427b519 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -113,7 +113,6 @@ version: accept a `list` or `tuple`. * `rpd`, `start_carrier_wave()`, & `stop_carrier_wave()` removed. These only perform a test of the nRF24L01's hardware. - * `csn_delay` removed. This is hard-coded to 500 microseconds * All comments and docstrings removed, meaning ``help()`` will not provide any specific information. Exception prompts have also been reduced and adjusted accordingly. * Cannot switch between different radio configurations using context manager (the `with` From 004310d55c7fe2e3475d6f1edb9bc88284e8e80c Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Mon, 2 Nov 2020 14:39:55 -0800 Subject: [PATCH 011/103] (-) any delay < 100 us; examples require py v3.7 --- circuitpython_nrf24l01/rf24.py | 8 +------- circuitpython_nrf24l01/rf24_lite.py | 8 +------- docs/advanced_api.rst | 4 ++-- docs/configure_api.rst | 7 ------- docs/greetings.rst | 9 +++------ examples/nrf24l01_2arduino_handling_data.py | 6 +++--- examples/nrf24l01_ack_payload_test.py | 6 +++--- examples/nrf24l01_simple_test.py | 6 +++--- examples/nrf24l01_stream_test.py | 6 +++--- 9 files changed, 19 insertions(+), 41 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 5fcf12b..e039bc4 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -54,7 +54,6 @@ def __init__(self, spi, csn, ce, spi_frequency=10000000): # pre-configure the CONFIGURE register: # 0x0E = IRQs are all enabled, CRC is enabled with 2 bytes, and # power up in TX mode - self.csn_delay = 0.000475 #: delay time to let the CSN pin settle self._config = 0x0E self._reg_write(CONFIGURE, self._config) if self._reg_read(CONFIGURE) & 3 != 2: @@ -137,7 +136,6 @@ def _reg_read(self, reg): out_buf = bytes([reg, 0]) in_buf = bytearray([0, 0]) with self._spi as spi: - time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] return in_buf[1] @@ -146,7 +144,6 @@ def _reg_read_bytes(self, reg, buf_len=5): in_buf = bytearray(buf_len + 1) out_buf = bytes([reg]) + b"\x00" * buf_len with self._spi as spi: - time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] return in_buf[1:] @@ -155,7 +152,6 @@ def _reg_write_bytes(self, reg, out_buf): out_buf = bytes([0x20 | reg]) + out_buf in_buf = bytearray(len(out_buf)) with self._spi as spi: - time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] @@ -165,7 +161,6 @@ def _reg_write(self, reg, value=None): out_buf = bytes([0x20 | reg, value]) in_buf = bytearray(len(out_buf)) with self._spi as spi: - time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] @@ -281,10 +276,9 @@ def send(self, buf, ask_no_ack=False, force_retry=0, send_only=False): result.append(self.send(b, ask_no_ack, force_retry, send_only)) return result self.flush_tx() - if not send_only: + if not send_only and self.pipe is not None: self.flush_rx() self.write(buf, ask_no_ack) - time.sleep(0.00001) self.ce_pin.value = 0 while not self._status & 0x70: self.update() diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index 04dc070..338eb5a 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -12,7 +12,6 @@ def __init__(self, spi, csn, ce, spi_frequency=10000000): self.ce_pin = ce self.ce_pin.switch_to_output(value=False) self._status = 0 - self.csn_delay = 0.000475 self._reg_write(0, 0x0E) if self._reg_read(0) & 3 != 2: raise RuntimeError("nRF24L01 Hardware not responding") @@ -36,7 +35,6 @@ def _reg_read(self, reg): out_buf = bytes([reg, 0]) in_buf = bytearray([0, 0]) with self._spi as spi: - time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] return in_buf[1] @@ -45,7 +43,6 @@ def _reg_read_bytes(self, reg, buf_len=5): in_buf = bytearray(buf_len + 1) out_buf = bytes([reg]) + b"\x00" * buf_len with self._spi as spi: - time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] return in_buf[1:] @@ -54,7 +51,6 @@ def _reg_write_bytes(self, reg, out_buf): out_buf = bytes([0x20 | reg]) + out_buf in_buf = bytearray(len(out_buf)) with self._spi as spi: - time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] @@ -64,7 +60,6 @@ def _reg_write(self, reg, val=None): out_buf = bytes([0x20 | reg, val]) in_buf = bytearray(len(out_buf)) with self._spi as spi: - time.sleep(self.csn_delay) spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] @@ -149,10 +144,9 @@ def send(self, buf, ask_no_ack=False, force_retry=0, send_only=False): result.append(self.send(b, ask_no_ack, force_retry, send_only)) return result self.flush_tx() - if not send_only: + if not send_only and self.pipe is not None: self.flush_rx() self.write(buf, ask_no_ack) - time.sleep(0.00001) self.ce_pin.value = 0 while not self._status & 0x70: self.update() diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index 965eedd..5250539 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -299,8 +299,8 @@ write() .. automethod:: circuitpython_nrf24l01.rf24.RF24.write - This function isn't completely non-blocking as we still need to wait `csn_delay` - for the CSN pin to settle (allowing an accurate SPI write transaction). Example usage of + This function isn't completely non-blocking as we still need to wait + for the necessary SPI transactions to complete. Example usage of this function can be seen in the `IRQ pin example `_ and in the `Stream example's "master_fifo()" function `_ diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 3a8fd47..958d281 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -6,13 +6,6 @@ Configuration API ----------------- -csn_delay -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.csn_delay - - This time (specified in seconds) allows for a clean SPI transaction. - dynamic_payloads ****************************** diff --git a/docs/greetings.rst b/docs/greetings.rst index 5c13e58..f921153 100644 --- a/docs/greetings.rst +++ b/docs/greetings.rst @@ -57,14 +57,11 @@ Please ensure all dependencies are available on the CircuitPython filesystem. This is easily achieved by downloading `the Adafruit library and driver bundle `_. -.. note:: This library supports Python 3.4 or newer, but Python 3.7 introduced +.. note:: This library supports Python 3.7 or newer because the examples use the function `time.monotonic_ns() `_ which returns an arbitrary time "counter" - as an `int` of nanoseconds. However, this function is not used in the - example scripts for backward compatibility reasons. Instead, we used - :py:func:`~time.monotonic()` which returns an arbitrary time "counter" as - a `float` of seconds. CircuitPython firmware supports both functions as of - v4.0. + as an `int` of nanoseconds. CircuitPython firmware also supports + :py:func:`time.monotonic_ns()`. Installing from PyPI -------------------- diff --git a/examples/nrf24l01_2arduino_handling_data.py b/examples/nrf24l01_2arduino_handling_data.py index 99360b7..0998f35 100644 --- a/examples/nrf24l01_2arduino_handling_data.py +++ b/examples/nrf24l01_2arduino_handling_data.py @@ -61,7 +61,7 @@ def master(count=5): # count = 5 will only transmit 5 packets nrf.listen = False # ensures the nRF24L01 is in TX mode while count: print("Now Sending") - myData.time = int(time.monotonic() * 1000) # start timer + myData.time = int(time.monotonic_ns() / 1000) # start timer # use struct.pack to packetize your data into a usable payload # '<' means little endian byte order. # 'L' means a single 4 byte unsigned long value. @@ -78,7 +78,7 @@ def master(count=5): # count = 5 will only transmit 5 packets # the arbitrary 200 ms timeout value is also used in the # TMRh20 library's GettingStarted_HandlingData sketch if nrf.update() and nrf.pipe is not None: - end_timer = time.monotonic() * 1000 # end timer + end_timer = time.monotonic_ns() / 1000 # end timer rx = nrf.recv(32) # 32 mimics behavior in TMRh20 library rx = struct.unpack(" Date: Mon, 2 Nov 2020 15:02:07 -0800 Subject: [PATCH 012/103] make workflow use python 3.7 --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 872cab0..171b50b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,10 +26,10 @@ jobs: awk -F '\/' '{ print tolower($2) }' | tr '-' '_' ) - - name: Set up Python 3.6 + - name: Set up Python 3.7 uses: actions/setup-python@v1 with: - python-version: 3.6 + python-version: 3.7 - name: Versions run: | python3 --version From c38014198a08924d8d3cddbee3519fd21fd7ace6 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Mon, 9 Nov 2020 20:38:35 -0800 Subject: [PATCH 013/103] adjusted examples and SPIDevice extra_clocks param --- circuitpython_nrf24l01/rf24.py | 11 +++- circuitpython_nrf24l01/rf24_lite.py | 14 ++-- docs/conf.py | 2 +- docs/examples.rst | 2 +- examples/nrf24l01_ack_payload_test.py | 95 ++++++++++++++++++++------- examples/nrf24l01_interrupt_test.py | 53 +++++++++------ examples/nrf24l01_multiceiver_test.py | 27 +++++--- examples/nrf24l01_simple_test.py | 70 +++++++++++++------- examples/nrf24l01_stream_test.py | 40 +++++++---- setup.py | 5 +- 10 files changed, 219 insertions(+), 100 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index e039bc4..503c874 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -47,7 +47,12 @@ class RF24: """A driver class for the nRF24L01(+) transceiver radios.""" def __init__(self, spi, csn, ce, spi_frequency=10000000): - self._spi = SPIDevice(spi, chip_select=csn, baudrate=spi_frequency) + self._spi = SPIDevice( + spi, + chip_select=csn, + baudrate=spi_frequency, + extra_clocks=8 + ) self.ce_pin = ce self.ce_pin.switch_to_output(value=False) # pre-empt standby-I mode self._status = 0 # status byte returned on all SPI transactions @@ -182,7 +187,7 @@ def address_length(self, length): def open_tx_pipe(self, address): """This function is used to open a data pipe for OTA (over the air) TX transmissions.""" - if self.arc: + if self._aa & 1: for i, val in enumerate(address): self._pipes[0][i] = val self._reg_write_bytes(RX_ADDR_P0, address) @@ -231,7 +236,7 @@ def listen(self, is_rx): if self.listen != bool(is_rx): self.ce_pin.value = 0 if is_rx: - if self._pipe0_read_addr is not None: + if self._pipe0_read_addr is not None and self._aa & 1: for i, val in enumerate(self._pipe0_read_addr): self._pipes[0][i] = val self._reg_write_bytes(RX_ADDR_P0, self._pipe0_read_addr) diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index 338eb5a..026ad52 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -8,7 +8,12 @@ class RF24: def __init__(self, spi, csn, ce, spi_frequency=10000000): - self._spi = SPIDevice(spi, chip_select=csn, baudrate=spi_frequency) + self._spi = SPIDevice( + spi, + chip_select=csn, + baudrate=spi_frequency, + extra_clocks=8 + ) self.ce_pin = ce self.ce_pin.switch_to_output(value=False) self._status = 0 @@ -75,9 +80,8 @@ def address_length(self, length): self._reg_write(0x03, length - 2) def open_tx_pipe(self, addr): - if self.arc: - self._reg_write_bytes(0x0A, addr) - self._reg_write(2, self._reg_read(2) | 1) + self._reg_write_bytes(0x0A, addr) + self._reg_write(2, self._reg_read(2) | 1) self._reg_write_bytes(0x10, addr) def close_rx_pipe(self, pipe_num): @@ -108,6 +112,7 @@ def listen(self): def listen(self, is_rx): if self.listen != bool(is_rx): self.ce_pin.value = 0 + self._reg_read() if is_rx: if self._pipe0_read_addr is not None: self._reg_write_bytes(0x0A, self._pipe0_read_addr) @@ -119,6 +124,7 @@ def listen(self, is_rx): time.sleep(0.00013) else: self._reg_write(0, self._reg_read(0) & 0xFE) + time.sleep(0.00016) def any(self): diff --git a/docs/conf.py b/docs/conf.py index 4927412..de2d182 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -28,7 +28,7 @@ autodoc_member_order = "bysource" intersphinx_mapping = { - "python": ("https://docs.python.org/3.4", None), + "python": ("https://docs.python.org/3.7", None), "BusDevice": ( "https://circuitpython.readthedocs.io/projects/busdevice/en/latest/", None, diff --git a/docs/examples.rst b/docs/examples.rst index ae73951..a2b05ba 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -24,7 +24,7 @@ Multiceiver Example This example shows how use a group of 6 nRF24L01 transceivers to transmit to 1 nRF24L01 transceiver. `This technique is called "Multiceiver" in the nRF24L01 Specifications Sheet `_ -.. note:: This example follows the diagram illistrated in `figure 12 of section 7.7 of the nRF24L01 Specifications Sheet `_ Please note that if `auto_ack` (on the base station) and `arc` (on the trnasmitting nodes) are disabled, then `figure 10 of section 7.7 of the nRF24L01 Specifications Sheet `_ would be a better illustration. +.. note:: This example follows the diagram illistrated in `figure 12 of section 7.7 of the nRF24L01 Specifications Sheet `_ Please note that if `auto_ack` (on the base station) and `arc` (on the transmitting nodes) are disabled, then `figure 10 of section 7.7 of the nRF24L01 Specifications Sheet `_ would be a better illustration. .. hint:: A paraphrased note from the the nRF24L01 Specifications Sheet: diff --git a/examples/nrf24l01_ack_payload_test.py b/examples/nrf24l01_ack_payload_test.py index 7badf76..c2c0e0c 100644 --- a/examples/nrf24l01_ack_payload_test.py +++ b/examples/nrf24l01_ack_payload_test.py @@ -38,60 +38,109 @@ nrf.pa_level = -12 # addresses needs to be in a buffer protocol object (bytearray) -address = b"1Node" +address = [b"1Node", b"2Node"] + +# to use different addresses on a pair of radios, we need a variable to +# uniquely identify which address this radio will use to transmit +# 0 uses address[0] to transmit, 1 uses address[1] to transmit +radio_number = bool( + int( + input( + "Which radio is this? Enter '0' or '1'. Defaults to '0' " + ) or 0 + ) +) + +# set TX address of RX node into the TX pipe +nrf.open_tx_pipe(address[radio_number]) # always uses pipe 0 + +# set RX address of TX node into an RX pipe +nrf.open_rx_pipe(1, address[not radio_number]) # using pipe 1 -# NOTE ACK payloads (like regular payloads and addresses) -# need to be in a buffer protocol object (bytearray) -ACK = b"World " +# using the python keyword global is bad practice. Instead we'll use a 1 item +# list to store our integer number for the payloads' counter +counter = [0] def master(count=5): # count = 5 will only transmit 5 packets """Transmits a payload every second and prints the ACK payload""" nrf.listen = False # put radio in TX mode - nrf.open_tx_pipe(address) # set address of RX node into a TX pipe while count: - buffer = b"Hello " + bytes([count + 48]) # output buffer - print("Sent:", buffer, end=" ") + # construct a payload to send + # add b"\x00" as a c-string NULL terminating char + buffer = b"Hello \x00" + bytes([counter[0]]) start_timer = time.monotonic_ns() # start timer result = nrf.send(buffer) # save the response (ACK payload) end_timer = time.monotonic_ns() # stop timer - if not result: - print("send() failed or timed out") - else: + if result: # print the received ACK that was automatically # fetched and saved to "result" via send() - print("Received:", result) - # print timer results despite transmission success - print("Transmission took", (end_timer - start_timer) / 1000, "us") + # print timer results upon transmission success + print( + "Transmission successful! Time to transmit: " + "{} us. Sent: {}{}".format( + int((end_timer - start_timer) / 1000), + buffer[:6].decode("utf-8"), + counter[0] + ), + end=" " + ) + if isinstance(result, bool): + print(" Received an empty ACK packet") + else: + # result[:6] truncates c-string NULL termiating char + # received counter is a unsigned byte, thus result[7:8][0] + print( + " Received: {}{}".format( + bytes(result[:6]).decode("utf-8"), + result[7:8][0] + ) + ) + counter[0] += 1 # increment payload counter + elif not result: + print("send() failed or timed out") time.sleep(1) # let the RX node prepare a new ACK payload count -= 1 def slave(count=5): """Prints the received value and sends an ACK payload""" - # set address of TX node into an RX pipe. NOTE you MUST specify - # which pipe number to use for RX; we'll be using pipe 0 - nrf.open_rx_pipe(0, address) nrf.listen = True # put radio into RX mode, power it up # setup the first transmission's ACK payload - buffer = ACK + bytes([count + 48]) + # add b"\x00" as a c-string NULL terminating char + buffer = b"World \x00" + bytes([counter[0]]) # we must set the ACK payload data and corresponding - # pipe number [0,5] - nrf.load_ack(buffer, 0) # load ACK for first response + # pipe number [0, 5]. We'll be acknowledging pipe 1 + nrf.load_ack(buffer, 1) # load ACK for first response start = time.monotonic() # start timer while count and (time.monotonic() - start) < 6: # use 6 second timeout if nrf.update() and nrf.pipe is not None: count -= 1 + # grab information about the received payload + length, pipe_number = (nrf.any(), nrf.pipe) # retreive the received packet's payload - rx = nrf.recv() # clears flags & empties RX FIFO - print("Received: {} Sent: {}".format(rx, buffer)) + received = nrf.recv() + # increment counter from received payload + # received counter is a unsigned byte, thus result[7:8][0] + counter[0] = received[7:8][0] + 1 + # the [:6] truncates the c-string NULL termiating char + print( + "Received {} bytes on pipe {}: {}{} Sent: {}{}".format( + length, + pipe_number, + bytes(received[:6]).decode("utf-8"), + received[7:8][0], + bytes(buffer[:6]).decode("utf-8"), + counter[0] + ) + ) start = time.monotonic() # reset timer if count: # Going again? - buffer = ACK + bytes([count + 48]) # build a new ACK - nrf.load_ack(buffer, 0) # load ACK for next response + buffer = b"World \x00" + bytes([counter[0]]) # build new ACK + nrf.load_ack(buffer, 1) # load ACK for next response # recommended behavior is to keep in TX mode while idle nrf.listen = False # put radio in TX mode & flush unused ACK payloads diff --git a/examples/nrf24l01_interrupt_test.py b/examples/nrf24l01_interrupt_test.py index b703106..123efb4 100644 --- a/examples/nrf24l01_interrupt_test.py +++ b/examples/nrf24l01_interrupt_test.py @@ -12,7 +12,18 @@ from circuitpython_nrf24l01.rf24 import RF24 # address needs to be in a buffer protocol object (bytearray is preferred) -address = b"1Node" +address = [b"1Node", b"2Node"] + +# to use different addresses on a pair of radios, we need a variable to +# uniquely identify which address this radio will use to transmit +# 0 uses address[0] to transmit, 1 uses address[1] to transmit +radio_number = bool( + int( + input( + "Which radio is this? Enter '0' or '1'. Defaults to '0' " + ) or 0 + ) +) # select your digital input pin that's connected to the IRQ pin on the nRF4L01 irq_pin = dio.DigitalInOut(board.D12) @@ -37,6 +48,12 @@ # usually run with nRF24L01 transceivers in close proximity nrf.pa_level = -12 +# set TX address of RX node into the TX pipe +nrf.open_tx_pipe(address[radio_number]) # always uses pipe 0 + +# set RX address of TX node into an RX pipe +nrf.open_rx_pipe(1, address[not radio_number]) # using pipe 1 + def _ping_and_prompt(): """transmit 1 payload, wait till irq_pin goes active, print IRQ status @@ -57,11 +74,7 @@ def _ping_and_prompt(): def master(): """Transmits 3 times: successfully receive ACK payload first, successfully transmit on second, and intentionally fail transmit on the third""" - # set address of RX node into a TX pipe - nrf.open_tx_pipe(address) - # ensures the nRF24L01 is in TX mode - nrf.listen = False - # NOTE nrf.power is automatically set to True on first call to nrf.write() + nrf.listen = False # ensures the nRF24L01 is in TX mode # NOTE nrf.write() internally calls nrf.clear_status_flags() first # load 2 buffers into the TX FIFO; write_only=True leaves CE pin LOW @@ -73,20 +86,22 @@ def master(): nrf.interrupt_config(data_sent=False) print(" Pinging slave node for an ACK payload...", end=" ") _ping_and_prompt() # CE pin is managed by this function - if nrf.irq_dr: - print("\t'on data ready' event test successful") - else: - print("\t'on data ready' event test unsucessful") + print( + "\t'on data ready' event test{}successful".format( + ' ' if nrf.irq_dr else ' un' + ) + ) # on data sent test print("\nConfiguring IRQ pin to only ignore 'on data ready' event") nrf.interrupt_config(data_recv=False) print(" Pinging slave node again... ", end=" ") _ping_and_prompt() # CE pin is managed by this function - if nrf.irq_ds: - print("\t'on data sent' event test successful") - else: - print("\t'on data sent' event test unsucessful") + print( + "\t'on data sent' event test{}successful".format( + ' ' if nrf.irq_ds else ' un' + ) + ) # trigger slave node to exit by filling the slave node's RX FIFO print("\nSending one extra payload to fill RX FIFO on slave node.") @@ -103,10 +118,11 @@ def master(): nrf.flush_tx() # just in case any previous tests failed nrf.write(b"Dummy", write_only=True) # CE pin is left LOW _ping_and_prompt() # CE pin is managed by this function - if nrf.irq_df: - print("\t'on data failed' event test successful") - else: - print("\t'on data failed' event test unsucessful") + print( + "\t'on data failed' event test{}successful".format( + ' ' if nrf.irq_df else ' un' + ) + ) nrf.flush_tx() # flush artifact payload in TX FIFO from last test # all 3 ACK payloads received were 4 bytes each, and RX FIFO is full # so, fetching 12 bytes from the RX FIFO also flushes RX FIFO @@ -116,7 +132,6 @@ def master(): def slave(timeout=6): # will listen for 6 seconds before timing out """Only listen for 3 payload from the master node""" # setup radio to recieve pings, fill TX FIFO with ACK payloads - nrf.open_rx_pipe(0, address) nrf.load_ack(b"Yak ", 0) nrf.load_ack(b"Back", 0) nrf.load_ack(b" ACK", 0) diff --git a/examples/nrf24l01_multiceiver_test.py b/examples/nrf24l01_multiceiver_test.py index d63f9e2..659ca49 100644 --- a/examples/nrf24l01_multiceiver_test.py +++ b/examples/nrf24l01_multiceiver_test.py @@ -48,13 +48,10 @@ def base(timeout=10): while time.monotonic() - start_timer < timeout: while not nrf.fifo(False, True): # keep RX FIFO empty for reception # show the pipe number that received the payload - print("pipe", nrf.pipe, end=" ") # recv() clears the pipe number - nodeID, payloadID = struct.unpack("= (size - 1) / 2 + abs((size - 1) / 2 - i)) - char |= bool(j < (size - 1) / 2 - abs((size - 1) / 2 - i)) + char = j >= (size - 1) / 2 + abs((size - 1) / 2 - i) + char |= j < (size - 1) / 2 - abs((size - 1) / 2 - i) buff += bytes([char + 48]) buffers.append(buff) del buff @@ -49,7 +66,6 @@ def make_buffers(size=32): def master(count=1, size=32): # count = 5 will transmit the list 5 times """Transmits multiple payloads using `RF24.send()` and `RF24.resend()`.""" buffers = make_buffers(size) # make a list of payloads - nrf.open_tx_pipe(address) # set address of RX node into a TX pipe nrf.listen = False # ensures the nRF24L01 is in TX mode successful = 0 # keep track of success rate for _ in range(count): @@ -77,14 +93,13 @@ def master_fifo(count=1, size=32): print("setting size to 6;", size, "is not allowed for this test.") size = 6 buf = make_buffers(size) # make a list of payloads - nrf.open_tx_pipe(address) # set address of RX node into a TX pipe nrf.listen = False # ensures the nRF24L01 is in TX mode for c in range(count): # transmit the same payloads this many times nrf.flush_tx() # clear the TX FIFO so we can use all 3 levels # NOTE the write_only parameter does not initiate sending buf_iter = 0 # iterator of payloads for the while loop failures = 0 # keep track of manual retries - start_timer = time.monotonic() * 1000 # start timer + start_timer = time.monotonic_ns() # start timer while buf_iter < size: # cycle through all the payloads while buf_iter < size and nrf.write(buf[buf_iter], write_only=1): # NOTE write() returns False if TX FIFO is already full @@ -107,10 +122,10 @@ def master_fifo(count=1, size=32): nrf.clear_status_flags() # clear the irq_df flag ce.value = True # start re-transmitting ce.value = False - end_timer = time.monotonic() * 1000 # end timer + end_timer = time.monotonic_ns() # end timer print( - "Transmission took {} ms with {} failures detected.".format( - end_timer - start_timer, + "Transmission took {} us with {} failures detected.".format( + (end_timer - start_timer) / 1000, failures ), end=" " if failures < 100 else "\n" @@ -128,9 +143,6 @@ def master_fifo(count=1, size=32): def slave(timeout=5): """Stops listening after a `timeout` with no response""" - # set address of TX node into an RX pipe. NOTE you MUST specify - # which pipe number to use for RX, we'll be using pipe 0 - nrf.open_rx_pipe(0, address) # pipe number options range [0,5] nrf.listen = True # put radio into RX mode and power up count = 0 # keep track of the number of received payloads start_timer = time.monotonic() # start timer @@ -138,8 +150,8 @@ def slave(timeout=5): if nrf.update() and nrf.pipe is not None: count += 1 # retreive the received packet's payload - rx = nrf.recv() # clears flags & empties RX FIFO - print("Received: {} - {}".format(rx, count)) + buffer = nrf.recv() # clears flags & empties RX FIFO + print("Received: {} - {}".format(buffer, count)) start_timer = time.monotonic() # reset timer on every RX payload # recommended behavior is to keep in TX mode while idle diff --git a/setup.py b/setup.py index 5b8d2d4..d11809d 100644 --- a/setup.py +++ b/setup.py @@ -41,14 +41,13 @@ # See https://pypi.python.org/pypi?%3Aaction=list_classifiers classifiers=[ - 'Development Status :: 3 - Alpha', + 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'Topic :: Software Development :: Libraries', 'Topic :: System :: Hardware', 'License :: OSI Approved :: MIT License', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.7', ], # What does your project relate to? From 468f694214481ec07b9d2f10c89c4bff88395f5b Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Mon, 9 Nov 2020 22:08:35 -0800 Subject: [PATCH 014/103] oops remove useless artifact --- circuitpython_nrf24l01/rf24_lite.py | 1 - 1 file changed, 1 deletion(-) diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index 026ad52..7a7ce71 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -112,7 +112,6 @@ def listen(self): def listen(self, is_rx): if self.listen != bool(is_rx): self.ce_pin.value = 0 - self._reg_read() if is_rx: if self._pipe0_read_addr is not None: self._reg_write_bytes(0x0A, self._pipe0_read_addr) From fa3aa31da4319c1113f85f9344565af8f9d44426 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 10 Nov 2020 22:28:25 -0800 Subject: [PATCH 015/103] update release.yml --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a7652ca..75cfe60 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -82,8 +82,8 @@ jobs: - name: Build and publish if: contains(steps.need-pypi.outputs.setup-py, 'setup.py') env: - TWINE_USERNAME: ${{ secrets.pypi_username }} - TWINE_PASSWORD: ${{ secrets.pypi_password }} + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.pypi_token }} run: | python setup.py sdist twine upload dist/* From 0729d64e10f3e56346ed86fa253dcafab70a708d Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Mon, 16 Nov 2020 05:20:21 -0800 Subject: [PATCH 016/103] new example; listen augmented; updated pypi badge `listen = True` now closes pipe 0 if no RX address was written to pipe 0. This is born from dialogue with TMRh20 about startListening() algorithm --- README.rst | 6 +- circuitpython_nrf24l01/rf24.py | 5 + circuitpython_nrf24l01/rf24_lite.py | 2 + docs/examples.rst | 9 ++ examples/nrf24l01_manual_ack_test.py | 148 +++++++++++++++++++++++++++ 5 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 examples/nrf24l01_manual_ack_test.py diff --git a/README.rst b/README.rst index ab981b9..dfd7262 100644 --- a/README.rst +++ b/README.rst @@ -8,12 +8,12 @@ :alt: Build Status .. image:: https://img.shields.io/pypi/v/circuitpython-nrf24l01.svg - :alt: latest version on PyPI :target: https://pypi.python.org/pypi/circuitpython-nrf24l01 + :alt: latest version on PyPI -.. image:: https://pepy.tech/badge/circuitpython-nrf24l01?label=pypi%20downloads&logo=python - :alt: Total PyPI downloads +.. image:: https://static.pepy.tech/personalized-badge/circuitpython-nrf24l01?period=total&units=international_system&left_color=grey&right_color=blue&left_text=PyPi%20Downloads :target: https://pepy.tech/project/circuitpython-nrf24l01 + :alt: Total PyPI downloads Read The Docs ============= diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 503c874..e2098a4 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -240,6 +240,8 @@ def listen(self, is_rx): for i, val in enumerate(self._pipe0_read_addr): self._pipes[0][i] = val self._reg_write_bytes(RX_ADDR_P0, self._pipe0_read_addr) + elif self._pipe0_read_addr is None: + self.close_rx_pipe(0) self._config = (self._config & 0xFC) | 3 self._reg_write(CONFIGURE, self._config) time.sleep(0.00015) # mandatory wait to power up radio @@ -249,6 +251,9 @@ def listen(self, is_rx): else: if self.ack: self.flush_tx() + if self._aa & 1: + self._open_pipes |= 1 + self._reg_write(OPEN_PIPES, self._open_pipes) self._config = self._config & 0xFE self._reg_write(CONFIGURE, self._config) time.sleep(0.00016) diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index 7a7ce71..b525438 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -115,6 +115,8 @@ def listen(self, is_rx): if is_rx: if self._pipe0_read_addr is not None: self._reg_write_bytes(0x0A, self._pipe0_read_addr) + else: + self.close_rx_pipe(0) self._reg_write(0, (self._reg_read(0) & 0xFC) | 3) time.sleep(0.00015) self.flush_rx() diff --git a/docs/examples.rst b/docs/examples.rst index a2b05ba..d9c227f 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -70,6 +70,15 @@ This is a test to show how to use `with` blocks to manage multiple different nRF :caption: examples/nrf24l01_context_test.py :linenos: +Manual ACK Example +------------------ + +This is a test to show how to use the library for acknowledgement (ACK) responses without using the automatic ACK packets (like the `ACK Payloads Example `_ does). Beware, that this technique is not faster and can be more prone to communication failure. However, This technique has the advantage of using more updated information in the responding payload as information in ACK payloads are always outdated by 1 transmission. + +.. literalinclude:: ../examples/nrf24l01_manual_ack_test.py + :caption: examples/nrf24l01_manual_ack_test.py + :linenos: + OTA compatibility ================= diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py new file mode 100644 index 0000000..a0a7357 --- /dev/null +++ b/examples/nrf24l01_manual_ack_test.py @@ -0,0 +1,148 @@ +""" +Example of library driving the nRF24L01 to communicate with a nRF24L01 driven by +the TMRh20 Arduino library. The Arduino program/sketch that this example was +designed for is named GettingStarted_HandlingData.ino and can be found in the "RF24" +examples after the TMRh20 library is installed from the Arduino Library Manager. +""" +import time +import board +import digitalio as dio +# if running this on a ATSAMD21 M0 based board +# from circuitpython_nrf24l01.rf24_lite import RF24 +from circuitpython_nrf24l01.rf24 import RF24 + +# addresses needs to be in a buffer protocol object (bytearray) +address = [b"1Node", b"2Node"] + +# change these (digital output) pins accordingly +ce = dio.DigitalInOut(board.D4) +csn = dio.DigitalInOut(board.D5) + +# using board.SPI() automatically selects the MCU's +# available SPI pins, board.SCK, board.MOSI, board.MISO +spi = board.SPI() # init spi bus object + +# initialize the nRF24L01 on the spi bus object +nrf = RF24(spi, csn, ce) + +# set the Power Amplifier level to -12 dBm since this test example is +# usually run with nRF24L01 transceivers in close proximity +nrf.pa_level = -12 + +# to use different addresses on a pair of radios, we need a variable to +# uniquely identify which address this radio will use to transmit +# 0 uses address[0] to transmit, 1 uses address[1] to transmit +radio_number = bool( + int( + input( + "Which radio is this? Enter '0' or '1'. Defaults to '0' " + ) or 0 + ) +) + +# set TX address of RX node into the TX pipe +nrf.open_tx_pipe(address[radio_number]) # always uses pipe 0 + +# set RX address of TX node into an RX pipe +nrf.open_rx_pipe(1, address[not radio_number]) # using pipe 1 +# nrf.open_rx_pipe(2, address[radio_number]) # for getting responses on pipe 2 + +# using the python keyword global is bad practice. Instead we'll use a 1 item +# list to store our integer number for the payloads' counter +counter = [0] + +# uncomment the following 2 lines for compatibility with TMRh20 library +# nrf.dynamic_payloads = False +# nrf.payload_length = 8 + + +def master(count=5): # count = 5 will only transmit 5 packets + """Transmits an arbitrary unsigned long value every second""" + nrf.listen = False # ensures the nRF24L01 is in TX mode + while count: + # construct a payload to send + # add b"\x00" as a c-string NULL terminating char + buffer = b"Hello \x00" + bytes([counter[0]]) + start_timer = time.monotonic_ns() # start timer + result = nrf.send(buffer) # save the response (ACK payload) + if not result: + print("send() failed or timed out") + else: # sent successful; listen for a response + nrf.listen = True # get radio ready to receive a response + timeout = time.monotonic() + 0.2 # set sentinal for timeout + while time.monotonic() < timeout: + # this loop hangs for 200 ms or until response is received + if nrf.update() and nrf.pipe is not None: + break + nrf.listen = False # put the radio back in TX mode + end_timer = time.monotonic_ns() # stop timer + print( + "Transmission successful! Time to transmit: " + "{} us. Sent: {}{}".format( + int((end_timer - start_timer) / 1000), + buffer[:6].decode("utf-8"), + buffer[7:8][0] + ), + end=" " + ) + if nrf.pipe is None: # is there a payload? + # nrf.pipe is also updated using `nrf.listen = False` + print("Received no response.") + else: + received = nrf.recv() # grab the response + # save new counter from response + counter[0] = received[7:8][0] + print( + "Receieved {} bytes with pipe {}: {}{}".format( + nrf.any(), + nrf.pipe, + bytes(received[:6]).decode("utf-8"), # convert to str + counter[0] + ) + ) + count -= 1 + # make example readable in REPL by slowing down transmissions + time.sleep(1) + + +def slave(count=3): + """Polls the radio and prints the received value. This method expires + after 6 seconds of no received transmission""" + nrf.listen = True # put radio into RX mode and power up + start_timer = time.monotonic() # used as a timeout + while count and (time.monotonic() - start_timer) < 6: + # this loop waits for 6 seconds at most if nothing received + if nrf.update() and nrf.pipe is not None: + length = nrf.any() # grab payload length info + pipe = nrf.pipe # grab pipe number info + received = nrf.recv(length) # clears info from any() and nrf.pipe + # increment counter before sending it back in responding payload + counter[0] = received[7:8][0] + 1 + nrf.listen = False # put the radio in TX mode + result = nrf.send(b"World \x00" + bytes([counter[0]])) + nrf.listen = True # put the radio back in RX mode + print( + "Received {} on pipe {}: {}{} Sent:".format( + length, + pipe, + bytes(received[:6]).decode("utf-8"), # convert to str + received[7:8][0] + ), + end=" " + ) + if not result: + print("Response failed or timed out") + else: + print("World", counter[0]) + count -= 1 + start_timer = time.monotonic() # reset timeout + # recommended behavior is to keep in TX mode when in idle + nrf.listen = False # put the nRF24L01 in TX mode + Standby-I power state + + +print( + """\ + nRF24L01 manual ACK example.\n\ + Run slave() to receive\n\ + Run master() to transmit""" +) From 6938f55735f4d8a86ddc7f0abf1263414842c833 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 17 Nov 2020 23:17:41 -0800 Subject: [PATCH 017/103] adjust prompt about IRQ config in what_happened() --- circuitpython_nrf24l01/rf24.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index e2098a4..ed99704 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -384,18 +384,27 @@ def what_happened(self, dump_pipes=False): ) ) print( - "IRQ - Data Ready______{} Data Ready___________{}".format( - "_True" if not bool(self._config & 0x40) else "False", self.irq_dr + "IRQ on Data Ready__{} Data Ready___________{}".format( + "_Enabled" + if not bool(self._config & 0x40) + else "Disabled", + self.irq_dr ) ) print( - "IRQ - Data Fail_______{} Data Failed__________{}".format( - "_True" if not bool(self._config & 0x10) else "False", self.irq_df + "IRQ on Data Fail___{} Data Failed__________{}".format( + "_Enabled" + if not bool(self._config & 0x10) + else "Disabled", + self.irq_df ) ) print( - "IRQ - Data Sent_______{} Data Sent____________{}".format( - "_True" if not bool(self._config & 0x20) else "False", self.irq_ds + "IRQ on Data Sent___{} Data Sent____________{}".format( + "_Enabled" + if not bool(self._config & 0x20) + else "Disabled", + self.irq_ds ) ) print( From 55fd2824fab9cff4bfec05098c34e36c5666ab82 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 1 Dec 2020 23:28:47 -0800 Subject: [PATCH 018/103] use of pipe 0 & examples revised - pipe 0 is closed if not specified to open_rx_pipe() `before listen = false` - listen attr does not check current CONFIG register before making changes - open_tx_pipe() does not actually open pipe 0 for RX-ing ACKs in TX mode. Rather, setting listen attr does. - examples demo proper addressing using both pipes 0 & 1 (multiceiver_test remains the same) --- circuitpython_nrf24l01/rf24.py | 49 +++++++++++++-------------- circuitpython_nrf24l01/rf24_lite.py | 31 ++++++++--------- examples/nrf24l01_interrupt_test.py | 21 ++++++++---- examples/nrf24l01_manual_ack_test.py | 14 ++++---- examples/nrf24l01_multiceiver_test.py | 4 +++ examples/nrf24l01_simple_test.py | 4 +++ examples/nrf24l01_stream_test.py | 3 ++ 7 files changed, 70 insertions(+), 56 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index ed99704..308722b 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -191,8 +191,6 @@ def open_tx_pipe(self, address): for i, val in enumerate(address): self._pipes[0][i] = val self._reg_write_bytes(RX_ADDR_P0, address) - self._open_pipes = self._open_pipes | 1 - self._reg_write(OPEN_PIPES, self._open_pipes) for i, val in enumerate(address): self._tx_address[i] = val self._reg_write_bytes(TX_ADDRESS, address) @@ -233,30 +231,29 @@ def listen(self): @listen.setter def listen(self, is_rx): - if self.listen != bool(is_rx): - self.ce_pin.value = 0 - if is_rx: - if self._pipe0_read_addr is not None and self._aa & 1: - for i, val in enumerate(self._pipe0_read_addr): - self._pipes[0][i] = val - self._reg_write_bytes(RX_ADDR_P0, self._pipe0_read_addr) - elif self._pipe0_read_addr is None: - self.close_rx_pipe(0) - self._config = (self._config & 0xFC) | 3 - self._reg_write(CONFIGURE, self._config) - time.sleep(0.00015) # mandatory wait to power up radio - self.clear_status_flags() - self.ce_pin.value = 1 # mandatory pulse is > 130 µs - time.sleep(0.00013) - else: - if self.ack: - self.flush_tx() - if self._aa & 1: - self._open_pipes |= 1 - self._reg_write(OPEN_PIPES, self._open_pipes) - self._config = self._config & 0xFE - self._reg_write(CONFIGURE, self._config) - time.sleep(0.00016) + self.ce_pin.value = 0 + if is_rx: + if self._pipe0_read_addr is not None and self._aa & 1: + for i, val in enumerate(self._pipe0_read_addr): + self._pipes[0][i] = val + self._reg_write_bytes(RX_ADDR_P0, self._pipe0_read_addr) + elif self._pipe0_read_addr is None: + self.close_rx_pipe(0) + self._config = (self._config & 0xFC) | 3 + self._reg_write(CONFIGURE, self._config) + time.sleep(0.00015) # mandatory wait to power up radio + self.clear_status_flags() + self.ce_pin.value = 1 # mandatory pulse is > 130 µs + time.sleep(0.00013) + else: + if self.ack: + self.flush_tx() + if self._aa & 1: + self._open_pipes |= 1 + self._reg_write(OPEN_PIPES, self._open_pipes) + self._config = self._config & 0xFE | 2 + self._reg_write(CONFIGURE, self._config) + time.sleep(0.00016) def any(self): """This function checks if the nRF24L01 has received any data at all, diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index b525438..3854033 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -81,7 +81,6 @@ def address_length(self, length): def open_tx_pipe(self, addr): self._reg_write_bytes(0x0A, addr) - self._reg_write(2, self._reg_read(2) | 1) self._reg_write_bytes(0x10, addr) def close_rx_pipe(self, pipe_num): @@ -110,23 +109,21 @@ def listen(self): @listen.setter def listen(self, is_rx): - if self.listen != bool(is_rx): - self.ce_pin.value = 0 - if is_rx: - if self._pipe0_read_addr is not None: - self._reg_write_bytes(0x0A, self._pipe0_read_addr) - else: - self.close_rx_pipe(0) - self._reg_write(0, (self._reg_read(0) & 0xFC) | 3) - time.sleep(0.00015) - self.flush_rx() - self.clear_status_flags() - self.ce_pin.value = 1 - time.sleep(0.00013) + self.ce_pin.value = 0 + if is_rx: + if self._pipe0_read_addr is not None: + self._reg_write_bytes(0x0A, self._pipe0_read_addr) else: - self._reg_write(0, self._reg_read(0) & 0xFE) - - time.sleep(0.00016) + self.close_rx_pipe(0) + self._reg_write(0, (self._reg_read(0) & 0xFC) | 3) + time.sleep(0.00015) + self.clear_status_flags() + self.ce_pin.value = 1 + time.sleep(0.00013) + else: + self._reg_write(0, self._reg_read(0) & 0xFE | 2) + self._reg_write(2, self._reg_read(2) | 1) + time.sleep(0.00016) def any(self): if self._reg_read(0x1D) & 4 and self.pipe is not None: diff --git a/examples/nrf24l01_interrupt_test.py b/examples/nrf24l01_interrupt_test.py index 123efb4..aef7ed8 100644 --- a/examples/nrf24l01_interrupt_test.py +++ b/examples/nrf24l01_interrupt_test.py @@ -71,6 +71,7 @@ def _ping_and_prompt(): ) ) + def master(): """Transmits 3 times: successfully receive ACK payload first, successfully transmit on second, and intentionally fail transmit on the third""" @@ -88,7 +89,7 @@ def master(): _ping_and_prompt() # CE pin is managed by this function print( "\t'on data ready' event test{}successful".format( - ' ' if nrf.irq_dr else ' un' + " " if nrf.irq_dr else " un" ) ) @@ -99,7 +100,7 @@ def master(): _ping_and_prompt() # CE pin is managed by this function print( "\t'on data sent' event test{}successful".format( - ' ' if nrf.irq_ds else ' un' + " " if nrf.irq_ds else " un" ) ) @@ -107,7 +108,13 @@ def master(): print("\nSending one extra payload to fill RX FIFO on slave node.") if nrf.send(b"Radio", send_only=True): # when send_only parameter is True, send() ignores RX FIFO usage - print("Slave node should not be listening anymore.") + if nrf.fifo(False, False): # is RX FIFO full? + print("Slave node should not be listening anymore.") + else: + print( + "transmission succeeded, " + "but slave node might still be listening" + ) else: print("Slave node was unresponsive.") @@ -120,7 +127,7 @@ def master(): _ping_and_prompt() # CE pin is managed by this function print( "\t'on data failed' event test{}successful".format( - ' ' if nrf.irq_df else ' un' + " " if nrf.irq_df else " un" ) ) nrf.flush_tx() # flush artifact payload in TX FIFO from last test @@ -132,9 +139,9 @@ def master(): def slave(timeout=6): # will listen for 6 seconds before timing out """Only listen for 3 payload from the master node""" # setup radio to recieve pings, fill TX FIFO with ACK payloads - nrf.load_ack(b"Yak ", 0) - nrf.load_ack(b"Back", 0) - nrf.load_ack(b" ACK", 0) + nrf.load_ack(b"Yak ", 1) + nrf.load_ack(b"Back", 1) + nrf.load_ack(b" ACK", 1) nrf.listen = True # start listening & clear irq_dr flag start_timer = time.monotonic() # start timer now while not nrf.fifo(0, 0) and time.monotonic() - start_timer < timeout: diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py index a0a7357..dae1357 100644 --- a/examples/nrf24l01_manual_ack_test.py +++ b/examples/nrf24l01_manual_ack_test.py @@ -52,8 +52,8 @@ counter = [0] # uncomment the following 2 lines for compatibility with TMRh20 library -# nrf.dynamic_payloads = False -# nrf.payload_length = 8 +nrf.dynamic_payloads = False +nrf.payload_length = 8 def master(count=5): # count = 5 will only transmit 5 packets @@ -69,7 +69,7 @@ def master(count=5): # count = 5 will only transmit 5 packets print("send() failed or timed out") else: # sent successful; listen for a response nrf.listen = True # get radio ready to receive a response - timeout = time.monotonic() + 0.2 # set sentinal for timeout + timeout = time.monotonic() + 1 # set sentinal for timeout while time.monotonic() < timeout: # this loop hangs for 200 ms or until response is received if nrf.update() and nrf.pipe is not None: @@ -89,13 +89,15 @@ def master(count=5): # count = 5 will only transmit 5 packets # nrf.pipe is also updated using `nrf.listen = False` print("Received no response.") else: + length = nrf.any() # reset with recv() + pipe_number = nrf.pipe # reset with recv() received = nrf.recv() # grab the response # save new counter from response counter[0] = received[7:8][0] print( "Receieved {} bytes with pipe {}: {}{}".format( - nrf.any(), - nrf.pipe, + length, + pipe_number, bytes(received[:6]).decode("utf-8"), # convert to str counter[0] ) @@ -105,7 +107,7 @@ def master(count=5): # count = 5 will only transmit 5 packets time.sleep(1) -def slave(count=3): +def slave(count=5): """Polls the radio and prints the received value. This method expires after 6 seconds of no received transmission""" nrf.listen = True # put radio into RX mode and power up diff --git a/examples/nrf24l01_multiceiver_test.py b/examples/nrf24l01_multiceiver_test.py index 659ca49..759f433 100644 --- a/examples/nrf24l01_multiceiver_test.py +++ b/examples/nrf24l01_multiceiver_test.py @@ -37,6 +37,10 @@ b"\x05\xB6\xB5\xB4\xB3" ] +# uncomment the following 2 lines for compatibility with TMRh20 library +nrf.dynamic_payloads = False +nrf.payload_length = 8 + def base(timeout=10): """Use the nRF24L01 as a base station for lisening to all nodes""" diff --git a/examples/nrf24l01_simple_test.py b/examples/nrf24l01_simple_test.py index d53e62d..10caa97 100644 --- a/examples/nrf24l01_simple_test.py +++ b/examples/nrf24l01_simple_test.py @@ -49,6 +49,10 @@ # list to store our float number for the payloads sent payload = [0.0] +# uncomment the following 2 lines for compatibility with TMRh20 library +nrf.dynamic_payloads = False +nrf.payload_length = 4 + def master(count=5): # count = 5 will only transmit 5 packets """Transmits an incrementing integer every second""" diff --git a/examples/nrf24l01_stream_test.py b/examples/nrf24l01_stream_test.py index 268e477..b5dd076 100644 --- a/examples/nrf24l01_stream_test.py +++ b/examples/nrf24l01_stream_test.py @@ -44,6 +44,9 @@ # set RX address of TX node into an RX pipe nrf.open_rx_pipe(1, address[not radio_number]) # using pipe 1 +# uncomment the following 2 lines for compatibility with TMRh20 library +nrf.dynamic_payloads = False + def make_buffers(size=32): """return a list of payloads""" From f1a570dcf1c4f64977fcaba934f3ef8a7c6f162b Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 8 Dec 2020 02:00:36 -0800 Subject: [PATCH 019/103] doc updates --- circuitpython_nrf24l01/fake_ble.py | 34 +- docs/advanced_api.rst | 1052 ++++++++++++++-------------- docs/basic_api.rst | 74 +- docs/ble_api.rst | 19 +- docs/configure_api.rst | 35 +- docs/examples.rst | 31 + docs/troubleshooting.rst | 2 + 7 files changed, 665 insertions(+), 582 deletions(-) diff --git a/circuitpython_nrf24l01/fake_ble.py b/circuitpython_nrf24l01/fake_ble.py index 9e510a5..3413bea 100644 --- a/circuitpython_nrf24l01/fake_ble.py +++ b/circuitpython_nrf24l01/fake_ble.py @@ -214,8 +214,7 @@ def advertise(self, buf=b"", data_type=0xFF): @property def pa_level(self): - """See :py:attr:`~circuitpython_nrf24l01.rf24.RF24.pa_level` for - more details.""" + """See :py:attr:`circuitpython_nrf24l01.rf24.RF24.pa_level`""" return self._radio.pa_level @pa_level.setter @@ -248,8 +247,7 @@ def payload_length(self, value): @property def power(self): - """See :py:attr:`~circuitpython_nrf24l01.rf24.RF24.power` for more - details.""" + """See :py:attr:`circuitpython_nrf24l01.rf24.RF24.power`""" return self._radio.power @power.setter @@ -258,50 +256,38 @@ def power(self, is_on): @property def is_lna_enabled(self): - """See :py:attr:`~circuitpython_nrf24l01.rf24.RF24.is_lna_enabled` - for more details.""" + """See :py:attr:`circuitpython_nrf24l01.rf24.RF24.is_lna_enabled`""" return self._radio.is_lna_enabled @property def is_plus_variant(self): - """See :py:attr:`~circuitpython_nrf24l01.rf24.RF24.is_plus_variant` - for more details.""" + """See :py:attr:`circuitpython_nrf24l01.rf24.RF24.is_plus_variant`""" return self._radio.is_plus_variant def interrupt_config(self, data_recv=True, data_sent=True): - """See :py:func:`~circuitpython_nrf24l01.rf24.RF24.interrupt_config()` - for more details. - - .. warning:: The :py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_df` - attribute (and also this function's ``data_fail`` parameter) is - not implemented for BLE operations.""" + """See :py:func:`circuitpython_nrf24l01.rf24.RF24.interrupt_config()`""" self._radio.interrupt_config(data_recv=data_recv, data_sent=data_sent) @property def irq_ds(self): - """See :py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_ds` for - more details.""" + """See :py:attr:`circuitpython_nrf24l01.rf24.RF24.irq_ds`""" return self._radio.irq_ds @property def irq_dr(self): - """See :py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr` for - more details.""" + """See :py:attr:`circuitpython_nrf24l01.rf24.RF24.irq_dr`""" return self._radio.irq_dr def clear_status_flags(self): - """See :py:func:`~circuitpython_nrf24l01.rf24.RF24.clear_status_flags()` - for more details.""" + """See :py:func:`circuitpython_nrf24l01.rf24.RF24.clear_status_flags()`""" self._radio.clear_status_flags() def update(self): - """See :py:func:`~circuitpython_nrf24l01.rf24.RF24.update()` for more - details.""" + """See :py:func:`circuitpython_nrf24l01.rf24.RF24.update()`""" self._radio.update() def what_happened(self, dump_pipes=False): - """See :py:func:`~circuitpython_nrf24l01.rf24.RF24.what_happened()` - for more details.""" + """See :py:func:`circuitpython_nrf24l01.rf24.RF24.what_happened()`""" self._radio.what_happened(dump_pipes=dump_pipes) class ServiceData: diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index 5250539..a5c8491 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -1,514 +1,538 @@ - -.. |irq note| replace:: parameter as `True` to - :py:func:`~circuitpython_nrf24l01.rf24.RF24.clear_status_flags()` and reset this. - As this is a virtual representation of the interrupt event, this attribute will - always be updated despite what the actual IRQ pin is configured to do about this - event. - -.. |update manually| replace:: Calling this does not execute an SPI transaction. It only - exposes that latest data contained in the STATUS byte that's always returned from any - other SPI transactions. Use the :py:func:`~circuitpython_nrf24l01.rf24.RF24.update()` - function to manually refresh this data when needed - -Advanced API ------------- - -what_happened() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.what_happened - - Some information may be irrelevant depending on nRF24L01's state/condition. - - :prints: - - - ``Is a plus variant`` True means the transceiver is a nRF24L01+. False - means the transceiver is a nRF24L01 (not a plus variant). - - ``Channel`` The current setting of the `channel` attribute - - ``RF Data Rate`` The current setting of the RF `data_rate` attribute. - - ``RF Power Amplifier`` The current setting of the `pa_level` attribute. - - ``CRC bytes`` The current setting of the `crc` attribute - - ``Address length`` The current setting of the `address_length` attribute - - ``TX Payload lengths`` The current setting of the `payload_length` attribute for TX - operations (concerning data pipe 0) - - ``Auto retry delay`` The current setting of the `ard` attribute - - ``Auto retry attempts`` The current setting of the `arc` attribute - - ``Re-use TX FIFO`` Is the first payload in the TX FIFO to be re-used for subsequent - transmissions (this flag is set to `True` when entering `resend()` and reset to - `False` when `resend()` exits) - - ``Packets lost on current channel`` Total amount of packets lost (transmission - failures). This only resets when the `channel` is changed. This count will - only go up to 15. - - ``Retry attempts made for last transmission`` Amount of attempts to re-transmit - during last transmission (resets per payload) - - ``IRQ - Data Ready`` The current setting of the IRQ pin on "Data Ready" event - - ``IRQ - Data Sent`` The current setting of the IRQ pin on "Data Sent" event - - ``IRQ - Data Fail`` The current setting of the IRQ pin on "Data Fail" event - - ``Data Ready`` Is there RX data ready to be read? (state of the `irq_dr` flag) - - ``Data Sent`` Has the TX data been sent? (state of the `irq_ds` flag) - - ``Data Failed`` Has the maximum attempts to re-transmit been reached? - (state of the `irq_df` flag) - - ``TX FIFO full`` Is the TX FIFO buffer full? (state of the `tx_full` flag) - - ``TX FIFO empty`` Is the TX FIFO buffer empty? - - ``RX FIFO full`` Is the RX FIFO buffer full? - - ``RX FIFO empty`` Is the RX FIFO buffer empty? - - ``Custom ACK payload`` Is the nRF24L01 setup to use an extra (user defined) payload - attached to the acknowledgment packet? (state of the `ack` attribute) - - ``Ask no ACK`` Is the nRF24L01 setup to transmit individual packets that don't - require acknowledgment? - - ``Automatic Acknowledgment`` The status of the `auto_ack` feature. If this value is a - binary representation, then each bit represents the feature's status for each pipe. - - ``Dynamic Payloads`` The status of the `dynamic_payloads` feature. If this value is a - binary representation, then each bit represents the feature's status for each pipe. - - ``Primary Mode`` The current mode (RX or TX) of communication of the nRF24L01 device. - - ``Power Mode`` The power state can be Off, Standby-I, Standby-II, or On. - - :param bool dump_pipes: `True` appends the output and prints: - - - the current address used for TX transmissions. This value is the entire content of - the nRF24L01's register about the TX address (despite what `address_length` is set - to). - - ``Pipe [#] ([open/closed]) bound: [address]`` where ``#`` represent the pipe number, - the ``open/closed`` status is relative to the pipe's RX status, and ``address`` is - the full value stored in the nRF24L01's RX address registers (despite what - `address_length` is set to. - - if the pipe is open, then the output also prints ``expecting [X] byte static - payloads`` where ``X`` is the `payload_length` (in bytes) the pipe is setup to - receive when `dynamic_payloads` is disabled for that pipe. - - This parameter's default is `False` and skips this extra information. - -is_plus_variant -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.is_plus_variant - - This information is detirmined upon instantiation. - -load_ack() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.load_ack - - This payload will then be appended to the automatic acknowledgment - (ACK) packet that is sent when *new* data is received on the specified pipe. See - `recv()` on how to fetch a received custom ACK payloads. - - :param bytearray,bytes buf: This will be the data attached to an automatic ACK packet on the - incoming transmission about the specified ``pipe_number`` parameter. This must have a - length in range [1, 32] bytes, otherwise a `ValueError` exception is thrown. Any ACK - payloads will remain in the TX FIFO buffer until transmitted successfully or - `flush_tx()` is called. - :param int pipe_number: This will be the pipe number to use for deciding which - transmissions get a response with the specified ``buf`` parameter's data. This number - must be in range [0, 5], otherwise a `IndexError` exception is thrown. - - :returns: `True` if payload was successfully loaded onto the TX FIFO buffer. `False` if it - wasn't because TX FIFO buffer is full. - - .. note:: this function takes advantage of a special feature on the nRF24L01 and needs to - be called for every time a customized ACK payload is to be used (not for every - automatic ACK packet -- this just appends a payload to the ACK packet). The `ack`, - `auto_ack`, and `dynamic_payloads` attributes are also automatically enabled (with - respect to data pipe 0) by this function when necessary. - - .. tip:: The ACK payload must be set prior to receiving a transmission. It is also worth - noting that the nRF24L01 can hold up to 3 ACK payloads pending transmission. Using this - function does not over-write existing ACK payloads pending; it only adds to the queue - (TX FIFO buffer) if it can. Use `flush_tx()` to discard unused ACK payloads when done - listening. - -read_ack() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.read_ack - - This function is an alias of `recv()` and remains for backward compatibility with older - versions of this library. - - .. warning:: This function will be deprecated on next major release. Use `recv()` instead. - -irq_dr -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.irq_dr - - . - - :Returns: - - - `True` represents Data is in the RX FIFO buffer - - `False` represents anything depending on context (state/condition of FIFO buffers); - usually this means the flag's been reset. - - Pass ``data_recv`` |irq note| - - |update manually| (especially after calling - :py:func:`~circuitpython_nrf24l01.rf24.RF24.clear_status_flags()`). - -irq_df -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.irq_df - - . - - :Returns: - - - `True` signifies the nRF24L01 attemped all configured retries - - `False` represents anything depending on context (state/condition); usually this - means the flag's been reset. - - Pass ``data_fail`` |irq note| - - |update manually| (especially after calling - :py:func:`~circuitpython_nrf24l01.rf24.RF24.clear_status_flags()`). - -irq_ds -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.irq_ds - - . - - :Returns: - - - `True` represents a successful transmission - - `False` represents anything depending on context (state/condition of FIFO buffers); - usually this means the flag's been reset. - - Pass ``data_sent`` |irq note| - - |update manually| (especially after calling - :py:func:`~circuitpython_nrf24l01.rf24.RF24.clear_status_flags()`). - -clear_status_flags() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.clear_status_flags - - Internally, this is automatically called by `send()`, `write()`, `recv()`, and when - `listen` changes from `False` to `True`. - - :param bool data_recv: specifies wheather to clear the "RX Data Ready" - (:py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr`) flag. - :param bool data_sent: specifies wheather to clear the "TX Data Sent" - (:py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_ds`) flag. - :param bool data_fail: specifies wheather to clear the "Max Re-transmit reached" - (`irq_df`) flag. - - .. note:: Clearing the ``data_fail`` flag is necessary for continued transmissions from the - nRF24L01 (locks the TX FIFO buffer when `irq_df` is `True`) despite wheather or not the - MCU is taking advantage of the interrupt (IRQ) pin. Call this function only when there - is an antiquated status flag (after you've dealt with the specific payload related to - the staus flags that were set), otherwise it can cause payloads to be ignored and - occupy the RX/TX FIFO buffers. See `Appendix A of the nRF24L01+ Specifications Sheet - `_ for an outline of - proper behavior. - -power -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.power - - This is exposed for convenience. - - - `False` basically puts the nRF24L01 to sleep (AKA power down mode) with ultra-low - current consumption. No transmissions are executed when sleeping, but the nRF24L01 can - still be accessed through SPI. Upon instantiation, this driver class puts the nRF24L01 - to sleep until the MCU invokes RX/TX modes. This driver class will only power down - the nRF24L01 after exiting a `with` block. - - `True` powers up the nRF24L01. This is the first step towards entering RX/TX modes (see - also `listen` attribute). Powering up is automatically handled by the `listen` attribute - as well as the `send()` and `write()` functions. - - .. note:: This attribute needs to be `True` if you want to put radio on Standby-II (highest - current consumption) or Standby-I (moderate current consumption) modes. The state of - the CE pin determines which Standby mode is acheived. See `Chapter 6.1.2-7 of the - nRF24L01+ Specifications Sheet `_ for more details. - -tx_full -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.tx_full - - . - - |update manually| (especially after calling - :py:func:`~circuitpython_nrf24l01.rf24.RF24.flush_tx()`). - - :returns: - - - `True` for TX FIFO buffer is full - - `False` for TX FIFO buffer is not full. This doesn't mean the TX FIFO buffer is - empty. - -update() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.update - - Refreshing the status byte is vital to checking status of the interrupt flags, RX pipe - number related to current RX payload, and if the TX FIFO buffer is full. This function - returns nothing, but internally updates the `irq_dr`, `irq_ds`, `irq_df`, `pipe`, and - `tx_full` attributes. Internally this is a helper function to `send()`, and `resend()` - functions. - - :returns: `True` for every call. This value is meant to allow this function to be used - in ``if`` statements in conjunction with attributes related to the refreshed status - byte. - - .. code-block:: python - - # let ``nrf`` be the instantiated object of the RF24 class - - # the following if statement is faster than using ``if nrf.any():`` - if nrf.update() and nrf.pipe is not None: - rx_payload = nrf.recv() - -resend() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.resend - - This function is meant to be used for payloads that failed to transmit using the - `send()` function. If a payload failed to transmit using the `write()` function, - just call `clear_status_flags()` and re-start the pulse on the nRF24L01's CE pin. - - :returns: Data returned from this function follows the same pattern that `send()` - returns with the added condition that this function will return `False` if the TX - FIFO buffer is empty. - :param bool send_only: This parameter only applies when the `ack` attribute is set to - `True`. Pass this parameter as `True` if the RX FIFO is not to be manipulated. Many - other libraries' behave as though this parameter is `True` - (e.g. The popular TMRh20 Arduino RF24 library). This parameter defaults to `False`. - Use `recv()` to get the ACK payload (if there is any) from the RX FIFO. Remember that - the RX FIFO can only hold up to 3 payloads at once. - - .. note:: The nRF24L01 normally removes a payload from the TX FIFO buffer after successful - transmission, but not when this function is called. The payload (successfully - transmitted or not) will remain in the TX FIFO buffer until `flush_tx()` is called to - remove them. Alternatively, using this function also allows the failed payload to be - over-written by using `send()` or `write()` to load a new payload into the TX FIFO - buffer. - -write() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.write - - This function isn't completely non-blocking as we still need to wait - for the necessary SPI transactions to complete. Example usage of - this function can be seen in the `IRQ pin example `_ and - in the `Stream example's "master_fifo()" function `_ - - :returns: `True` if the payload was added to the TX FIFO buffer. `False` if the TX FIFO - buffer is already full, and no payload could be added to it. - :param bytearray buf: The payload to transmit. This bytearray must have a length greater - than 0 and less than 32 bytes, otherwise a `ValueError` exception is thrown. - - - If the `dynamic_payloads` attribute is disabled for data pipe 0 and this bytearray's - length is less than the `payload_length` attribute for data pipe 0, then this - bytearray is padded with zeros until its length is equal to the `payload_length` - attribute for data pipe 0. - - If the `dynamic_payloads` attribute is disabled for data pipe 0 and this bytearray's - length is greater than `payload_length` attribute for data pipe 0, then this - bytearray's length is truncated to equal the `payload_length` attribute for data - pipe 0. - :param bool ask_no_ack: Pass this parameter as `True` to tell the nRF24L01 not to wait for - an acknowledgment from the receiving nRF24L01. This parameter directly controls a - ``NO_ACK`` flag in the transmission's Packet Control Field (9 bits of information about - the payload). Therefore, it takes advantage of an nRF24L01 feature specific to - individual payloads, and its value is not saved anywhere. You do not need to specify - this for every payload if the `arc` attribute is disabled, however setting this - parameter to `True` will work despite the `arc` attribute's setting. - - .. note:: Each transmission is in the form of a packet. This packet contains sections - of data around and including the payload. `See Chapter 7.3 in the nRF24L01 - Specifications Sheet `_ for more - details. - :param bool write_only: This function will not manipulate the nRF24L01's CE pin if this - parameter is `True`. The default value of `False` will ensure that the CE pin is - HIGH upon exiting this function. This function does not set the CE pin LOW at - any time. Use this parameter as `True` to fill the TX FIFO buffer before beginning - transmissions. - - .. note:: The nRF24L01 doesn't initiate sending until a mandatory minimum 10 µs pulse - on the CE pin is acheived. If the ``write_only`` parameter is `False`, then that - pulse is initiated before this function exits. However, we have left that 10 µs - wait time to be managed by the MCU in cases of asychronous application, or it is - managed by using `send()` instead of this function. According to the - Specification sheet, if the CE pin remains HIGH for longer than 10 µs, then the - nRF24L01 will continue to transmit all payloads found in the TX FIFO buffer. - - .. warning:: - A note paraphrased from the `nRF24L01+ Specifications Sheet - `_: - - It is important to NEVER to keep the nRF24L01+ in TX mode for more than 4 ms at a time. - If the [`arc` attribute is] enabled, nRF24L01+ is never in TX mode longer than 4 - ms. - - .. tip:: Use this function at your own risk. Because of the underlying - `"Enhanced ShockBurst Protocol" `_, disobeying the 4 - ms rule is easily avoided if the `arc` attribute is greater than ``0``. Alternatively, - you MUST use nRF24L01's IRQ pin and/or user-defined timer(s) to AVOID breaking the - 4 ms rule. If the `nRF24L01+ Specifications Sheet explicitly states this - `_, we have to assume - radio damage or misbehavior as a result of disobeying the 4 ms rule. See also `table 18 - in the nRF24L01 specification sheet `_ for - calculating an adequate transmission timeout sentinal. - -flush_rx() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.flush_rx - - .. note:: The nRF24L01 RX FIFO is 3 level stack that holds payload data. This means that - there can be up to 3 received payloads (each of a maximum length equal to 32 bytes) - waiting to be read (and removed from the stack) by `recv()` or `read_ack()`. This - function clears all 3 levels. - -flush_tx() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.flush_tx - - .. note:: The nRF24L01 TX FIFO is 3 level stack that holds payload data. This means that - there can be up to 3 payloads (each of a maximum length equal to 32 bytes) waiting to - be transmit by `send()`, `resend()` or `write()`. This function clears all 3 levels. It - is worth noting that the payload data is only removed from the TX FIFO stack upon - successful transmission (see also `resend()` as the handling of failed transmissions - can be altered). - -fifo() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.fifo - - :param bool about_tx: - - `True` means the information returned is about the TX FIFO buffer. - - `False` means the information returned is about the RX FIFO buffer. This parameter - defaults to `False` when not specified. - :param bool check_empty: - - `True` tests if the specified FIFO buffer is empty. - - `False` tests if the specified FIFO buffer is full. - - `None` (when not specified) returns a 2 bit number representing both empty (bit 1) & - full (bit 0) tests related to the FIFO buffer specified using the ``about_tx`` - parameter. - :returns: - - A `bool` answer to the question: - - "Is the [TX/RX](``about_tx``) FIFO buffer [empty/full](``check_empty``)? - - If the ``check_empty`` parameter is not specified: an `int` in range [0,2] for which: - - - ``1`` means the specified FIFO buffer is empty - - ``2`` means the specified FIFO buffer is full - - ``0`` means the specified FIFO buffer is neither full nor empty - -pipe -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.pipe - - . - - |update manually| (especially after calling - :py:func:`~circuitpython_nrf24l01.rf24.RF24.flush_rx()`). - - :Returns: - - - `None` if there is no payload in RX FIFO. - - The `int` identifying pipe number [0,5] that received the next - available payload in the RX FIFO buffer. - -address_length -****************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.address_length - - A valid input value must be an `int` in range [3, 5]. Otherwise a `ValueError` exception is - thrown. Default is set to the nRF24L01's maximum of 5. - -address() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.address - - This function returns the full content of the nRF24L01's registers about RX/TX addresses - despite what `address_length` is set to. - - :param int index: the number of the data pipe whose address is to be returned. A valid - index ranges [0,5] for RX addresses or any negative number for the TX address. - Otherwise an `IndexError` is thown. This parameter defaults to ``-1``. - -rpd -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.rpd - - The RPD flag is triggered in the following cases: - - 1. During RX mode (when `listen` is `True`) and an arbitrary RF transmission with - a gain above -64 dBm threshold is/was present. - 2. When a packet is received (instigated by the nRF24L01 used to detect/"listen" for - incoming packets). - - .. note:: See also - `section 6.4 of the Specification Sheet concerning the RPD flag - `_. Ambient - temperature affects the -64 dBm threshold. The latching of this flag happens - differently under certain conditions. - -start_carrier_wave() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.start_carrier_wave - - This is a basic test of the nRF24L01's TX output. It is a commonly required - test for telecommunication regulations. Calling this function may introduce - interference with other transceivers that use frequencies in range [2.4, - 2.525] GHz. To verify that this test is working properly, use the following - code on a seperate nRF24L01 transceiver: - - .. code-block:: python - - # declare objects for SPI bus and CSN pin and CE pin - nrf. = RF24(spi, csn, ce) - # set nrf.pa_level, nrf.channel, & nrf.data_rate values to - # match the corresponding attributes on the device that is - # transmitting the carrier wave - nrf.listen = True - if nrf.rpd: - print("carrier wave detected") - - The `pa_level`, `channel` & `data_rate` attributes are vital factors to - the success of this test. Be sure these attributes are set to the desired test - conditions before calling this function. See also the `rpd` attribute. - - .. note:: To preserve backward compatibility with non-plus variants of the - nRF24L01, this function will also change certain settings if `is_plus_variant` - is `False`. These settings changes include disabling `crc`, disabling - `auto_ack`, disabling `arc`, setting `ard` to 250 microseconds, changing the - TX address to ``b"\xFF\xFF\xFF\xFF\xFF"``, and loading a 32-byte payload (each - byte is ``0xFF``) into the TX FIFO buffer while continuously behaving like - `resend()` to establish the constant carrier wave. If `is_plus_variant` is - `True`, then none of these changes are needed nor applied. - -stop_carrier_wave() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.stop_carrier_wave - - See `start_carrier_wave()` for more details. - - .. note:: - Calling this function puts the nRF24L01 to sleep (AKA power down mode). + +.. |irq note| replace:: parameter as `True` to + :py:func:`~circuitpython_nrf24l01.rf24.RF24.clear_status_flags()` and reset this. + As this is a virtual representation of the interrupt event, this attribute will + always be updated despite what the actual IRQ pin is configured to do about this + event. + +.. |update manually| replace:: Calling this does not execute an SPI transaction. It only + exposes that latest data contained in the STATUS byte that's always returned from any + other SPI transactions. Use the :py:func:`~circuitpython_nrf24l01.rf24.RF24.update()` + function to manually refresh this data when needed + +Advanced API +------------ + +what_happened() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.what_happened + + Some information may be irrelevant depending on nRF24L01's state/condition. + + :prints: + + - ``Is a plus variant`` True means the transceiver is a nRF24L01+. False + means the transceiver is a nRF24L01 (not a plus variant). + - ``Channel`` The current setting of the `channel` attribute + - ``RF Data Rate`` The current setting of the RF `data_rate` attribute. + - ``RF Power Amplifier`` The current setting of the `pa_level` attribute. + - ``CRC bytes`` The current setting of the `crc` attribute + - ``Address length`` The current setting of the `address_length` attribute + - ``TX Payload lengths`` The current setting of the `payload_length` attribute for TX + operations (concerning data pipe 0) + - ``Auto retry delay`` The current setting of the `ard` attribute + - ``Auto retry attempts`` The current setting of the `arc` attribute + - ``Re-use TX FIFO`` Is the first payload in the TX FIFO to be re-used for subsequent + transmissions (this flag is set to `True` when entering `resend()` and reset to + `False` when `resend()` exits) + - ``Packets lost on current channel`` Total amount of packets lost (transmission + failures). This only resets when the `channel` is changed. This count will + only go up to 15. + - ``Retry attempts made for last transmission`` Amount of attempts to re-transmit + during last transmission (resets per payload) + - ``IRQ - Data Ready`` The current setting of the IRQ pin on "Data Ready" event + - ``IRQ - Data Sent`` The current setting of the IRQ pin on "Data Sent" event + - ``IRQ - Data Fail`` The current setting of the IRQ pin on "Data Fail" event + - ``Data Ready`` Is there RX data ready to be read? (state of the `irq_dr` flag) + - ``Data Sent`` Has the TX data been sent? (state of the `irq_ds` flag) + - ``Data Failed`` Has the maximum attempts to re-transmit been reached? + (state of the `irq_df` flag) + - ``TX FIFO full`` Is the TX FIFO buffer full? (state of the `tx_full` flag) + - ``TX FIFO empty`` Is the TX FIFO buffer empty? + - ``RX FIFO full`` Is the RX FIFO buffer full? + - ``RX FIFO empty`` Is the RX FIFO buffer empty? + - ``Custom ACK payload`` Is the nRF24L01 setup to use an extra (user defined) payload + attached to the acknowledgment packet? (state of the `ack` attribute) + - ``Ask no ACK`` Is the nRF24L01 setup to transmit individual packets that don't + require acknowledgment? + - ``Automatic Acknowledgment`` The status of the `auto_ack` feature. If this value is a + binary representation, then each bit represents the feature's status for each pipe. + - ``Dynamic Payloads`` The status of the `dynamic_payloads` feature. If this value is a + binary representation, then each bit represents the feature's status for each pipe. + - ``Primary Mode`` The current mode (RX or TX) of communication of the nRF24L01 device. + - ``Power Mode`` The power state can be Off, Standby-I, Standby-II, or On. + + :param bool dump_pipes: `True` appends the output and prints: + + - the current address used for TX transmissions. This value is the entire content of + the nRF24L01's register about the TX address (despite what `address_length` is set + to). + - ``Pipe [#] ([open/closed]) bound: [address]`` where ``#`` represent the pipe number, + the ``open/closed`` status is relative to the pipe's RX status, and ``address`` is + the full value stored in the nRF24L01's RX address registers (despite what + `address_length` is set to. + - if the pipe is open, then the output also prints ``expecting [X] byte static + payloads`` where ``X`` is the `payload_length` (in bytes) the pipe is setup to + receive when `dynamic_payloads` is disabled for that pipe. + + This parameter's default is `False` and skips this extra information. + +is_plus_variant +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.is_plus_variant + + This information is detirmined upon instantiation. + + .. versionadded:: 1.2.0 + +load_ack() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.load_ack + + This payload will then be appended to the automatic acknowledgment + (ACK) packet that is sent when *new* data is received on the specified pipe. See + `recv()` on how to fetch a received custom ACK payloads. + + :param bytearray,bytes buf: This will be the data attached to an automatic ACK packet on the + incoming transmission about the specified ``pipe_number`` parameter. This must have a + length in range [1, 32] bytes, otherwise a `ValueError` exception is thrown. Any ACK + payloads will remain in the TX FIFO buffer until transmitted successfully or + `flush_tx()` is called. + :param int pipe_number: This will be the pipe number to use for deciding which + transmissions get a response with the specified ``buf`` parameter's data. This number + must be in range [0, 5], otherwise a `IndexError` exception is thrown. + + :returns: `True` if payload was successfully loaded onto the TX FIFO buffer. `False` if it + wasn't because TX FIFO buffer is full. + + .. note:: this function takes advantage of a special feature on the nRF24L01 and needs to + be called for every time a customized ACK payload is to be used (not for every + automatic ACK packet -- this just appends a payload to the ACK packet). The `ack`, + `auto_ack`, and `dynamic_payloads` attributes are also automatically enabled (with + respect to data pipe 0) by this function when necessary. + + .. tip:: The ACK payload must be set prior to receiving a transmission. It is also worth + noting that the nRF24L01 can hold up to 3 ACK payloads pending transmission. Using this + function does not over-write existing ACK payloads pending; it only adds to the queue + (TX FIFO buffer) if it can. Use `flush_tx()` to discard unused ACK payloads when done + listening. + +read_ack() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.read_ack + + This function is an alias of `recv()` and remains for backward compatibility with older + versions of this library. + + .. deprecated:: 1.2.0 + This function will be removed on next major release. Use `recv()` instead. + +irq_dr +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.irq_dr + + . + + :Returns: + + - `True` represents Data is in the RX FIFO buffer + - `False` represents anything depending on context (state/condition of FIFO buffers); + usually this means the flag's been reset. + + .. important:: It is recommended that this flag is only used when the IRQ pin is active. + To detirmine if there is a payload in the RX FIFO, use `fifo()`, `any()`, or `pipe`. + Notice that calling `recv()` also resets this status flag. + + Pass ``data_recv`` |irq note| + + |update manually| (especially after calling + :py:func:`~circuitpython_nrf24l01.rf24.RF24.clear_status_flags()`). + +irq_df +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.irq_df + + . + + :Returns: + + - `True` signifies the nRF24L01 attemped all configured retries + - `False` represents anything depending on context (state/condition); usually this + means the flag's been reset. + + .. important:: This can only return `True` if `auto_ack` is enabled, otherwise this will + always be `False`. + + Pass ``data_fail`` |irq note| + + |update manually| (especially after calling + :py:func:`~circuitpython_nrf24l01.rf24.RF24.clear_status_flags()`). + +irq_ds +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.irq_ds + + . + + :Returns: + + - `True` represents a successful transmission + - `False` represents anything depending on context (state/condition of FIFO buffers); + usually this means the flag's been reset. + + Pass ``data_sent`` |irq note| + + |update manually| (especially after calling + :py:func:`~circuitpython_nrf24l01.rf24.RF24.clear_status_flags()`). + +clear_status_flags() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.clear_status_flags + + Internally, this is automatically called by `send()`, `write()`, `recv()`, and when + `listen` changes from `False` to `True`. + + :param bool data_recv: specifies wheather to clear the "RX Data Ready" + (:py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr`) flag. + :param bool data_sent: specifies wheather to clear the "TX Data Sent" + (:py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_ds`) flag. + :param bool data_fail: specifies wheather to clear the "Max Re-transmit reached" + (`irq_df`) flag. + + .. note:: Clearing the ``data_fail`` flag is necessary for continued transmissions from the + nRF24L01 (locks the TX FIFO buffer when `irq_df` is `True`) despite wheather or not the + MCU is taking advantage of the interrupt (IRQ) pin. Call this function only when there + is an antiquated status flag (after you've dealt with the specific payload related to + the staus flags that were set), otherwise it can cause payloads to be ignored and + occupy the RX/TX FIFO buffers. See `Appendix A of the nRF24L01+ Specifications Sheet + `_ for an outline of + proper behavior. + +power +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.power + + This is exposed for convenience. + + - `False` basically puts the nRF24L01 to sleep (AKA power down mode) with ultra-low + current consumption. No transmissions are executed when sleeping, but the nRF24L01 can + still be accessed through SPI. Upon instantiation, this driver class puts the nRF24L01 + to sleep until the MCU invokes RX/TX modes. This driver class will only power down + the nRF24L01 after exiting a `with` block. + - `True` powers up the nRF24L01. This is the first step towards entering RX/TX modes (see + also `listen` attribute). Powering up is automatically handled by the `listen` attribute + as well as the `send()` and `write()` functions. + + .. note:: This attribute needs to be `True` if you want to put radio on Standby-II (highest + current consumption) or Standby-I (moderate current consumption) modes. The state of + the CE pin determines which Standby mode is acheived. See `Chapter 6.1.2-7 of the + nRF24L01+ Specifications Sheet `_ for more details. + +tx_full +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.tx_full + + . + + |update manually| (especially after calling + :py:func:`~circuitpython_nrf24l01.rf24.RF24.flush_tx()`). + + :returns: + + - `True` for TX FIFO buffer is full + - `False` for TX FIFO buffer is not full. This doesn't mean the TX FIFO buffer is + empty. + +update() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.update + + Refreshing the status byte is vital to checking status of the interrupt flags, RX pipe + number related to current RX payload, and if the TX FIFO buffer is full. This function + returns nothing, but internally updates the `irq_dr`, `irq_ds`, `irq_df`, `pipe`, and + `tx_full` attributes. Internally this is a helper function to `send()`, and `resend()` + functions. + + :returns: `True` for every call. This value is meant to allow this function to be used + in ``if`` statements in conjunction with attributes related to the refreshed status + byte. + + .. code-block:: python + + # let ``nrf`` be the instantiated object of the RF24 class + + # the following if statement is faster than using ``if nrf.any():`` + if nrf.update() and nrf.pipe is not None: + rx_payload = nrf.recv() + +resend() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.resend + + This function is meant to be used for payloads that failed to transmit using the + `send()` function. If a payload failed to transmit using the `write()` function, + just call `clear_status_flags()` and re-start the pulse on the nRF24L01's CE pin. + + :returns: Data returned from this function follows the same pattern that `send()` + returns with the added condition that this function will return `False` if the TX + FIFO buffer is empty. + :param bool send_only: This parameter only applies when the `ack` attribute is set to + `True`. Pass this parameter as `True` if the RX FIFO is not to be manipulated. Many + other libraries' behave as though this parameter is `True` + (e.g. The popular TMRh20 Arduino RF24 library). This parameter defaults to `False`. + Use `recv()` to get the ACK payload (if there is any) from the RX FIFO. Remember that + the RX FIFO can only hold up to 3 payloads at once. + + .. note:: The nRF24L01 normally removes a payload from the TX FIFO buffer after successful + transmission, but not when this function is called. The payload (successfully + transmitted or not) will remain in the TX FIFO buffer until `flush_tx()` is called to + remove them. Alternatively, using this function also allows the failed payload to be + over-written by using `send()` or `write()` to load a new payload into the TX FIFO + buffer. + +write() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.write + + This function isn't completely non-blocking as we still need to wait + for the necessary SPI transactions to complete. Example usage of + this function can be seen in the `IRQ pin example `_ and + in the `Stream example's "master_fifo()" function `_ + + :returns: `True` if the payload was added to the TX FIFO buffer. `False` if the TX FIFO + buffer is already full, and no payload could be added to it. + :param bytearray buf: The payload to transmit. This bytearray must have a length greater + than 0 and less than 32 bytes, otherwise a `ValueError` exception is thrown. + + - If the `dynamic_payloads` attribute is disabled for data pipe 0 and this bytearray's + length is less than the `payload_length` attribute for data pipe 0, then this + bytearray is padded with zeros until its length is equal to the `payload_length` + attribute for data pipe 0. + - If the `dynamic_payloads` attribute is disabled for data pipe 0 and this bytearray's + length is greater than `payload_length` attribute for data pipe 0, then this + bytearray's length is truncated to equal the `payload_length` attribute for data + pipe 0. + :param bool ask_no_ack: Pass this parameter as `True` to tell the nRF24L01 not to wait for + an acknowledgment from the receiving nRF24L01. This parameter directly controls a + ``NO_ACK`` flag in the transmission's Packet Control Field (9 bits of information about + the payload). Therefore, it takes advantage of an nRF24L01 feature specific to + individual payloads, and its value is not saved anywhere. You do not need to specify + this for every payload if the `auto_ack` attribute is disabled, however setting this + parameter to `True` will work despite the `auto_ack` attribute's setting. + + .. note:: Each transmission is in the form of a packet. This packet contains sections + of data around and including the payload. `See Chapter 7.3 in the nRF24L01 + Specifications Sheet `_ for more + details. + :param bool write_only: This function will not manipulate the nRF24L01's CE pin if this + parameter is `True`. The default value of `False` will ensure that the CE pin is + HIGH upon exiting this function. This function does not set the CE pin LOW at + any time. Use this parameter as `True` to fill the TX FIFO buffer before beginning + transmissions. + + .. note:: The nRF24L01 doesn't initiate sending until a mandatory minimum 10 µs pulse + on the CE pin is acheived. If the ``write_only`` parameter is `False`, then that + pulse is initiated before this function exits. However, we have left that 10 µs + wait time to be managed by the MCU in cases of asychronous application, or it is + managed by using `send()` instead of this function. According to the + Specification sheet, if the CE pin remains HIGH for longer than 10 µs, then the + nRF24L01 will continue to transmit all payloads found in the TX FIFO buffer. + + .. warning:: + A note paraphrased from the `nRF24L01+ Specifications Sheet + `_: + + It is important to NEVER to keep the nRF24L01+ in TX mode for more than 4 ms at a time. + If the [`auto_ack` attribute is] enabled, nRF24L01+ is never in TX mode longer than 4 + ms. + + .. tip:: Use this function at your own risk. Because of the underlying + `"Enhanced ShockBurst Protocol" `_, disobeying the 4 + ms rule is easily avoided if the `auto_ack` attribute is greater than ``0``. Alternatively, + you MUST use nRF24L01's IRQ pin and/or user-defined timer(s) to AVOID breaking the + 4 ms rule. If the `nRF24L01+ Specifications Sheet explicitly states this + `_, we have to assume + radio damage or misbehavior as a result of disobeying the 4 ms rule. See also `table 18 + in the nRF24L01 specification sheet `_ for + calculating an adequate transmission timeout sentinal. + .. versionadded:: 1.2.0 + ``write_only`` parameter + +flush_rx() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.flush_rx + + .. note:: The nRF24L01 RX FIFO is 3 level stack that holds payload data. This means that + there can be up to 3 received payloads (each of a maximum length equal to 32 bytes) + waiting to be read (and removed from the stack) by `recv()` or `read_ack()`. This + function clears all 3 levels. + +flush_tx() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.flush_tx + + .. note:: The nRF24L01 TX FIFO is 3 level stack that holds payload data. This means that + there can be up to 3 payloads (each of a maximum length equal to 32 bytes) waiting to + be transmit by `send()`, `resend()` or `write()`. This function clears all 3 levels. It + is worth noting that the payload data is only removed from the TX FIFO stack upon + successful transmission (see also `resend()` as the handling of failed transmissions + can be altered). + +fifo() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.fifo + + :param bool about_tx: + - `True` means the information returned is about the TX FIFO buffer. + - `False` means the information returned is about the RX FIFO buffer. This parameter + defaults to `False` when not specified. + :param bool check_empty: + - `True` tests if the specified FIFO buffer is empty. + - `False` tests if the specified FIFO buffer is full. + - `None` (when not specified) returns a 2 bit number representing both empty (bit 1) & + full (bit 0) tests related to the FIFO buffer specified using the ``about_tx`` + parameter. + :returns: + - A `bool` answer to the question: + + "Is the [TX/RX](``about_tx``) FIFO buffer [empty/full](``check_empty``)? + - If the ``check_empty`` parameter is not specified: an `int` in range [0,2] for which: + + - ``1`` means the specified FIFO buffer is empty + - ``2`` means the specified FIFO buffer is full + - ``0`` means the specified FIFO buffer is neither full nor empty + +pipe +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.pipe + + . + + .. versionchanged:: 1.2.0 + In previous versions of this library, this attribute was a read-only function + (``pipe()``). + + |update manually| (especially after calling + :py:func:`~circuitpython_nrf24l01.rf24.RF24.flush_rx()`). + + :Returns: + + - `None` if there is no payload in RX FIFO. + - The `int` identifying pipe number [0,5] that received the next + available payload in the RX FIFO buffer. + +address_length +****************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.address_length + + A valid input value must be an `int` in range [3, 5]. Otherwise a `ValueError` exception is + thrown. Default is set to the nRF24L01's maximum of 5. + +address() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.address + + This function returns the full content of the nRF24L01's registers about RX/TX addresses + despite what `address_length` is set to. + + :param int index: the number of the data pipe whose address is to be returned. A valid + index ranges [0,5] for RX addresses or any negative number for the TX address. + Otherwise an `IndexError` is thown. This parameter defaults to ``-1``. + + .. versionadded:: 1.2.0 + +rpd +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.rpd + + The RPD flag is triggered in the following cases: + + 1. During RX mode (when `listen` is `True`) and an arbitrary RF transmission with + a gain above -64 dBm threshold is/was present. + 2. When a packet is received (instigated by the nRF24L01 used to detect/"listen" for + incoming packets). + + .. note:: See also + `section 6.4 of the Specification Sheet concerning the RPD flag + `_. Ambient + temperature affects the -64 dBm threshold. The latching of this flag happens + differently under certain conditions. + + .. versionadded:: 1.2.0 + +start_carrier_wave() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.start_carrier_wave + + This is a basic test of the nRF24L01's TX output. It is a commonly required + test for telecommunication regulations. Calling this function may introduce + interference with other transceivers that use frequencies in range [2.4, + 2.525] GHz. To verify that this test is working properly, use the following + code on a seperate nRF24L01 transceiver: + + .. code-block:: python + + # declare objects for SPI bus and CSN pin and CE pin + nrf. = RF24(spi, csn, ce) + # set nrf.pa_level, nrf.channel, & nrf.data_rate values to + # match the corresponding attributes on the device that is + # transmitting the carrier wave + nrf.listen = True + if nrf.rpd: + print("carrier wave detected") + + The `pa_level`, `channel` & `data_rate` attributes are vital factors to + the success of this test. Be sure these attributes are set to the desired test + conditions before calling this function. See also the `rpd` attribute. + + .. note:: To preserve backward compatibility with non-plus variants of the + nRF24L01, this function will also change certain settings if `is_plus_variant` + is `False`. These settings changes include disabling `crc`, disabling + `auto_ack`, disabling `arc`, setting `ard` to 250 microseconds, changing the + TX address to ``b"\xFF\xFF\xFF\xFF\xFF"``, and loading a 32-byte payload (each + byte is ``0xFF``) into the TX FIFO buffer while continuously behaving like + `resend()` to establish the constant carrier wave. If `is_plus_variant` is + `True`, then none of these changes are needed nor applied. + + .. versionadded:: 1.2.0 + +stop_carrier_wave() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.stop_carrier_wave + + See `start_carrier_wave()` for more details. + + .. note:: + Calling this function puts the nRF24L01 to sleep (AKA power down mode). + + .. versionadded:: 1.2.0 diff --git a/docs/basic_api.rst b/docs/basic_api.rst index 4fe058c..c86879b 100644 --- a/docs/basic_api.rst +++ b/docs/basic_api.rst @@ -27,6 +27,12 @@ Constructor parameter only applies to the instantiated object and is made persistent via :py:class:`~adafruit_bus_device.spi_device.SPIDevice`. + .. versionadded:: 1.2.0 + ``spi_frequency`` parameter + .. versionchanged:: 1.2.0 + removed all keyword arguments in favor of using the provided corresponding + attributes. + open_tx_pipe() ****************** @@ -40,9 +46,9 @@ open_tx_pipe() .. note:: There is no option to specify which data pipe to use because the nRF24L01 only uses data pipe 0 in TX mode. Additionally, the nRF24L01 uses the same data pipe (pipe - 0) for receiving acknowledgement (ACK) packets in TX mode when the `auto_ack` attribute - is enabled for data pipe 0. Thus, RX pipe 0 is appropriated with the TX address - (specified here) when `auto_ack` is enabled for data pipe 0. + 0) for receiving acknowledgement (ACK) packets in TX mode when the `auto_ack` + attribute is enabled for data pipe 0. Thus, RX pipe 0 is appropriated with the TX + address (specified here) when `auto_ack` is enabled for data pipe 0. close_rx_pipe() ****************** @@ -52,6 +58,10 @@ close_rx_pipe() :param int pipe_number: The data pipe to use for RX transactions. This must be in range [0, 5]. Otherwise a `IndexError` exception is thrown. + .. versionchanged:: 1.2.0 + removed the ``reset`` parameter. Addresses assigned to pipes will persist until + changed or power to the nRF24L01 is discontinued. + open_rx_pipe() ****************** @@ -140,6 +150,9 @@ recv() When the ``length`` parameter is specified, this function strictly returns a `bytearray` of that length despite the contents of the RX FIFO. + .. versionadded:: 1.2.0 + ``length`` parameter + send() ****************** @@ -150,8 +163,8 @@ send() in the returned list will contain the returned status for each corresponding payload in the list/tuple that was passed. The return statuses will be in one of the following forms: - - `False` if transmission fails. Transmission failure can only be detected if `arc` - is greater than ``0``. + - `False` if transmission fails. Transmission failure can only be detected if + `auto_ack` is enabled for data pipe 0. - `True` if transmission succeeds. - `bytearray` or `True` when the `ack` attribute is `True`. Because the payload expects a responding custom ACK payload, the response is returned (upon successful @@ -163,20 +176,22 @@ send() also be a list or tuple of payloads (`bytearray`); in which case, all items in the list/tuple are processed for consecutive transmissions. - - If the `dynamic_payloads` attribute is disabled for data pipe 0 and this bytearray's - length is less than the `payload_length` attribute for pipe 0, then this bytearray - is padded with zeros until its length is equal to the `payload_length` attribute for - pipe 0. - - If the `dynamic_payloads` attribute is disabled for data pipe 0 and this bytearray's - length is greater than `payload_length` attribute for pipe 0, then this bytearray's - length is truncated to equal the `payload_length` attribute for pipe 0. - :param bool ask_no_ack: Pass this parameter as `True` to tell the nRF24L01 not to wait for - an acknowledgment from the receiving nRF24L01. This parameter directly controls a + - If the `dynamic_payloads` attribute is disabled for data pipe 0 and this + bytearray's length is less than the `payload_length` attribute for pipe 0, + then this bytearray is padded with zeros until its length is equal to the + `payload_length` attribute for pipe 0. + - If the `dynamic_payloads` attribute is disabled for data pipe 0 and this + bytearray's length is greater than `payload_length` attribute for pipe 0, + then this bytearray's length is truncated to equal the `payload_length` + attribute for pipe 0. + :param bool ask_no_ack: Pass this parameter as `True` to tell the nRF24L01 not to wait + for an acknowledgment from the receiving nRF24L01. This parameter directly controls a ``NO_ACK`` flag in the transmission's Packet Control Field (9 bits of information about the payload). Therefore, it takes advantage of an nRF24L01 feature specific to individual payloads, and its value is not saved anywhere. You do not need to specify - this for every payload if the `arc` attribute is disabled, however setting this - parameter to `True` will work despite the `arc` attribute's setting. + this for every payload if the `auto_ack` attribute is disabled (for data pipe 0), + however setting this parameter to `True` will work despite the `auto_ack` + attribute's setting. .. note:: Each transmission is in the form of a packet. This packet contains sections of data around and including the payload. `See Chapter 7.3 in the nRF24L01 @@ -184,11 +199,12 @@ send() nRF24L01Pluss_Preliminary_Product_Specification_v1_0.pdf#G1136318>`_ for more details. :param int force_retry: The number of brute-force attempts to `resend()` a failed - transmission. Default is 0. This parameter has no affect on transmissions if `arc` is - ``0`` or if ``ask_no_ack`` parameter is set to `True`. Each re-attempt still takes - advantage of `arc` & `ard` attributes. During multi-payload processing, this - parameter is meant to slow down CircuitPython devices just enough for the Raspberry - Pi to catch up (due to the Raspberry Pi's seemingly slower SPI speeds). + transmission. Default is 0. This parameter has no affect on transmissions if + `auto_ack` is disabled or if ``ask_no_ack`` parameter is set to `True`. Each + re-attempt still takes advantage of `arc` & `ard` attributes. During multi-payload + processing, this parameter is meant to slow down CircuitPython devices just enough + for the Raspberry Pi to catch up (due to the Raspberry Pi's seemingly slower SPI + speeds). :param bool send_only: This parameter only applies when the `ack` attribute is set to `True`. Pass this parameter as `True` if the RX FIFO is not to be manipulated. Many other libraries' behave as though this parameter is `True` @@ -196,12 +212,16 @@ send() Use `recv()` to get the ACK payload (if there is any) from the RX FIFO.Remember that the RX FIFO can only hold up to 3 payloads at once. - .. tip:: It is highly recommended that `arc` attribute is enabled (greater than ``0``) - when sending multiple payloads. Test results with the `arc` attribute disabled were - rather poor (less than 79% received by a Raspberry Pi). This same advice applies to - the ``ask_no_ack`` parameter (leave it as `False` for multiple payloads). + .. tip:: It is highly recommended that `auto_ack` attribute is enabled (greater than + ``0``) when sending multiple payloads. Test results with the `auto_ack` attribute + disabled were rather poor (less than 79% received by a Raspberry Pi). This same + advice applies to the ``ask_no_ack`` parameter (leave it as `False` for multiple + payloads). .. warning:: The nRF24L01 will block usage of the TX FIFO buffer upon failed transmissions. Failed transmission's payloads stay in TX FIFO buffer until the MCU calls `flush_tx()` and `clear_status_flags()`. Therefore, this function will discard - failed transmissions' payloads. - + any payloads in the TX FIFO when called, but failed transmissions' payloads will + remain in the TX FIFO until `send()` or `flush_tx()` is called after failed + transmissions. + .. versionadded:: 1.2.0 + ``send_only`` parameter diff --git a/docs/ble_api.rst b/docs/ble_api.rst index cfb9a03..bb0cf59 100644 --- a/docs/ble_api.rst +++ b/docs/ble_api.rst @@ -1,4 +1,7 @@ +.. versionadded:: 1.2.0 + BLE API added + BLE Limitations --------------- @@ -174,7 +177,10 @@ to_android this attribute to `False` still allows advertisements to be compatible with anything else except Android smartphones. Default Value is `True`. - .. warning:: This attribute will be deprecated on the next major release because it is not + .. versionchanged:: 1.2.2 + in versions 1.2.0 & 1.2.1, this attribute was named ``to_iphone`` due to a misconception on the developers' behalf. + .. deprecated:: 1.2.2 + This attribute will be deprecated on the next major release because it is not necessary to change this attribute. Changing this attribute to `False` only breaks compatibility with Android smartphones. @@ -337,6 +343,10 @@ interrupt_config() .. automethod:: circuitpython_nrf24l01.fake_ble.FakeBLE.interrupt_config() + .. warning:: The :py:attr:`circuitpython_nrf24l01.rf24.RF24.irq_df` + attribute (and also this function's ``data_fail`` parameter) is + not implemented for BLE operations. + irq_ds #################### @@ -352,6 +362,11 @@ clear_status_flags() .. automethod:: circuitpython_nrf24l01.fake_ble.FakeBLE.clear_status_flags() + .. note:: This function takes no parameters, rather it clears all status + flags on every call. Be aware that only the + :py:attr:`circuitpython_nrf24l01.fake_ble.FakeBLE.irq_ds` attribute is + useful for `FakeBLE` objects. + update() #################### @@ -393,7 +408,7 @@ derivitive children .. autoclass:: circuitpython_nrf24l01.fake_ble.BatteryServiceData :show-inheritance: - The class's `data` attribute accepts a `int` value as + The class's `data` attribute accepts a 1-byte unsigned `int` value as input and returns a `bytes` object that conforms to the Bluetooth Battery Level format as defined in the `GATT Specifications Supplement. `_ .. note:: This example follows the diagram illistrated in `figure 12 of section 7.7 of the nRF24L01 Specifications Sheet `_ Please note that if `auto_ack` (on the base station) and `arc` (on the transmitting nodes) are disabled, then `figure 10 of section 7.7 of the nRF24L01 Specifications Sheet `_ would be a better illustration. @@ -39,6 +55,9 @@ This example shows how use a group of 6 nRF24L01 transceivers to transmit to 1 n IRQ Pin Example --------------- +.. versionchanged:: 1.2.0 + uses ACK payloads to trigger all 3 IRQ events. + This is a test to show how to use nRF24L01's interrupt pin. Be aware that :py:func:`~circuitpython_nrf24l01.rf24.RF24.send()` clears all IRQ events on exit, so we use the non-blocking :py:func:`~circuitpython_nrf24l01.rf24.RF24.write()` instead. Also the `ack` attribute is enabled to trigger the :py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr` event when the master node receives ACK payloads. Simply put, this example is the most advanced example script (in this library), and it runs VERY quickly. .. literalinclude:: ../examples/nrf24l01_interrupt_test.py @@ -51,6 +70,9 @@ Library-Specific Features Stream Example --------------- +.. versionchanged:: 1.2.3 + added ``master_fifo()`` to demonstrate using full TX FIFO to stream data. + This is a test to show how to stream data. The ``master()`` uses the `send()` function to transmit multiple payloads with 1 function call. However ``master()`` only uses 1 level of the nRF24L01's TX FIFO. An alternate function, called ``master_fifo()`` @@ -64,6 +86,9 @@ uses all 3 levels of the nRF24L01's TX FIFO to stream data, but it uses the Context Example --------------- +.. versionchanged:: 1.2.0 + demonstrates switching between `FakeBLE` object & `RF24` object with the same nRF24L01 + This is a test to show how to use `with` blocks to manage multiple different nRF24L01 configurations on 1 transceiver. .. literalinclude:: ../examples/nrf24l01_context_test.py @@ -73,6 +98,8 @@ This is a test to show how to use `with` blocks to manage multiple different nRF Manual ACK Example ------------------ +.. versionadded:: 1.2.4 + This is a test to show how to use the library for acknowledgement (ACK) responses without using the automatic ACK packets (like the `ACK Payloads Example `_ does). Beware, that this technique is not faster and can be more prone to communication failure. However, This technique has the advantage of using more updated information in the responding payload as information in ACK payloads are always outdated by 1 transmission. .. literalinclude:: ../examples/nrf24l01_manual_ack_test.py @@ -85,6 +112,8 @@ OTA compatibility Fake BLE Example ---------------- +.. versionadded:: 1.2.0 + This is a test to show how to use the nRF24L01 as a BLE advertising beacon using the :py:class:`~circuitpython_nrf24l01.rf24.fake_ble.FakeBLE` class. .. literalinclude:: ../examples/nrf24l01_fake_ble_test.py @@ -94,6 +123,8 @@ This is a test to show how to use the nRF24L01 as a BLE advertising beacon using TMRh20's Arduino library ------------------------ +.. versionadded:: 1.1.2 + This test is meant to prove compatibility with the popular Arduino library for the nRF24L01 by TMRh20 (available for install via the Arduino IDE's Library Manager). The following code has been designed/tested with the TMRh20 library example named `GettingStarted_HandlingData.ino `_. If you changed the ``radioNumber`` variable in the TMRh20 sketch, you will have to adjust the ``radioNumber`` variable this script so that it is opposite the value in the TMRh20 library's example. .. literalinclude:: ../examples/nrf24l01_2arduino_handling_data.py diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index 427b519..227ad4c 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -75,6 +75,8 @@ With the `auto_ack` feature enabled, you get: About the lite version ====================== +.. versionadded:: 1.2.0 + This library contains a "lite" version of ``rf24.py`` titled ``rf24_lite.py``. It has been developed to save space on microcontrollers with limited amount of RAM and/or storage (like boards using the ATSAMD21 M0). The following functionality has been removed from the lite From 7938ecc1e6c7d7f0954c58e9502675a1040ba3ab Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 9 Dec 2020 08:10:59 -0800 Subject: [PATCH 020/103] dyn_pl & auto_ack return int; more doc changes --- circuitpython_nrf24l01/rf24.py | 25 +- circuitpython_nrf24l01/rf24_lite.py | 3 +- docs/configure_api.rst | 512 +++++++++++++++------------- docs/troubleshooting.rst | 8 +- 4 files changed, 297 insertions(+), 251 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 308722b..787a7ef 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -95,7 +95,7 @@ def __init__(self, spi, csn, ce, spi_frequency=10000000): self._retry_setup = 0x53 # ard = 1500; arc = 3 # pre-configure the RF_SETUP register self._rf_setup = 0x07 # 1 Mbps data_rate, and 0 dbm pa_level - # pre-configure dynamic_payloads & auto_ack for RX operations + # pre-configure dynamic_payloads & auto_ack self._dyn_pl = 0x3F # 0x3F = enable dynamic_payloads on all pipes self._aa = 0x3F # 0x3F = enable auto_ack on all pipes # pre-configure features for TX operations: @@ -471,17 +471,21 @@ def is_plus_variant(self): @property def dynamic_payloads(self): - """This `bool` attribute controls the nRF24L01's dynamic payload + """This `int` attribute controls the nRF24L01's dynamic payload length feature for each pipe.""" self._dyn_pl = self._reg_read(DYN_PL_LEN) self._features = self._reg_read(TX_FEATURE) - return bool(self._dyn_pl) and self._features & 4 == 4 + if self._features & 4 == 4: + return self._dyn_pl + return 0 @dynamic_payloads.setter def dynamic_payloads(self, enable): self._features = self._reg_read(TX_FEATURE) - if isinstance(enable, (bool, int)): + if isinstance(enable, bool): self._dyn_pl = 0x3F if enable else 0 + elif isinstance(enable, int): + self._dyn_pl = 0x3F & enable elif isinstance(enable, (list, tuple)): for i, val in enumerate(enable): if i < 6 and val >= 0: # skip pipe if val is negative @@ -499,8 +503,8 @@ def dynamic_payloads(self, enable): @property def payload_length(self): - """This `int` attribute specifies the length (in bytes) of static payloads for each - pipe.""" + """This attribute specifies the length (in bytes) of static payloads for each + pipe using a `list` of integers.""" return self._pl_len @payload_length.setter @@ -547,15 +551,17 @@ def ard(self, delta): @property def auto_ack(self): - """This `bool` attribute controls the nRF24L01's automatic + """This `int` attribute controls the nRF24L01's automatic acknowledgment feature during the process of receiving a packet.""" self._aa = self._reg_read(AUTO_ACK) - return bool(self._aa) + return self._aa @auto_ack.setter def auto_ack(self, enable): - if isinstance(enable, (bool, int)): + if isinstance(enable, bool): self._aa = 0x3F if enable else 0 + elif isinstance(enable, int): + self._aa = 0x3F & enable elif isinstance(enable, (list, tuple)): for i, val in enumerate(enable): if i < 6 and val >= 0: # skip pipe if val is negative @@ -709,7 +715,6 @@ def resend(self, send_only=False): self.clear_status_flags() self._reg_write(0xE3) self.ce_pin.value = 1 - time.sleep(0.00001) self.ce_pin.value = 0 while not self._status & 0x70: self.update() diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index 3854033..f110d48 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -305,13 +305,12 @@ def update(self): def resend(self, send_only=False): result = False if not self.fifo(True, True): + self.ce_pin.value = 0 if not send_only: self.flush_rx() self.clear_status_flags() self._reg_write(0xE3) - self.ce_pin.value = 0 self.ce_pin.value = 1 - time.sleep(0.00001) self.ce_pin.value = 0 while not self._status & 0x70: self.update() diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 1d7e4af..33a2699 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -1,236 +1,276 @@ - -.. |per_data_pipe_control| replace:: can be used control this feature per data pipe. Index 0 - controls this feature on data pipe 0. Indices greater than 5 will be - ignored since there are only 6 data pipes. - -Configuration API ------------------ - -dynamic_payloads -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.dynamic_payloads - - Default setting is enabled on all pipes. - - - `True` or ``1`` enables nRF24L01's dynamic payload length feature for all data pipes. The - `payload_length` attribute is ignored when this feature is enabled for all - respective data pipes. - - `False` or ``0`` disables nRF24L01's dynamic payload length feature for all data pipes. - Be sure to adjust the `payload_length` attribute accordingly when this feature is - disabled for any respective data pipes. - - A `list` or `tuple` containing booleans or integers |per_data_pipe_control| If any index's - value is less than 0 (a negative value), then the pipe corresponding to that index will - remain unaffected. - - .. note:: - This attribute mostly relates to RX operations, but data pipe 0 applies to TX - operations also. The `auto_ack` attribute is automatically enabled by this attribute - for any data pipes that have this feature enabled. Disabling this feature for any - data pipe will not affect the `auto_ack` feature for the corresponding data pipes. - -payload_length -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.payload_length - - If the `dynamic_payloads` attribute is *enabled* for a certain data pipe, this attribute has - no affect on that data pipe. When `dynamic_payloads` is *disabled* for a certain data pipe, - this attribute is used to specify the payload length on that data pipe. - - A valid input value must be: - - * an `int` in range [1, 32]. Otherwise a `ValueError` exception is thrown. - * A `list` or `tuple` containing integers |per_data_pipe_control| If any index's value - is ``0``, then the existing setting will persist (not be changed). - - Default is set to the nRF24L01's maximum of 32 (on all data pipes). - - .. note:: - This attribute mostly relates to RX operations, but data pipe 0 applies to TX - operations also. - -auto_ack -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.auto_ack - - Default setting is enabled on all data pipes. - - - `True` or ``1`` enables transmitting automatic acknowledgment packets for all data pipes. - The CRC (cyclic redundancy checking) is enabled (for all transmissions) automatically by - the nRF24L01 if this attribute is enabled for any data pipe (see also `crc` attribute). - - `False` or ``0`` disables transmitting automatic acknowledgment packets for all data - pipes. The `crc` attribute will remain unaffected when disabling this attribute for any - data pipes. - - A `list` or `tuple` containing booleans or integers |per_data_pipe_control| If any - index's value is less than 0 (a negative value), then the pipe corresponding to that - index will remain unaffected. - - .. note:: - This attribute mostly relates to RX operations, but data pipe 0 applies to TX - operations also. - -arc -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.arc - - The `auto_ack` attribute must be enabled on the receiving nRF24L01's pipe 0 & the - RX data pipe and the transmitting nRF24L01's pipe 0 to properly use this - attribute. If `auto_ack` is disabled on the transmitting nRF24L01's pipe 0, then this - attribute is ignored when calling `send()`. - - A valid input value must be in range [0, 15]. Otherwise a `ValueError` exception is - thrown. Default is set to 3. A value of ``0`` disables the automatic re-transmit feature, - but the sending nRF24L01 will still wait the number of microseconds specified by `ard` - for an Acknowledgement (ACK) packet response (assuming `auto_ack` is enabled). - -ard -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.ard - - During this time, the nRF24L01 is listening for the ACK packet. If the - `auto_ack` attribute is disabled for pipe 0, then this attribute is not applied. - - A valid input value must be in range [250, 4000]. Otherwise a `ValueError` exception is - thrown. Default is 1500 for reliability. If this is set to a value that is not multiple - of 250, then the highest multiple of 250 that is no greater than the input value is used. - - .. note:: Paraphrased from nRF24L01 specifications sheet: - - Please take care when setting this parameter. If the custom ACK payload is more than - 15 bytes in 2 Mbps data rate, the `ard` must be 500µS or more. If the custom ACK - payload is more than 5 bytes in 1 Mbps data rate, the `ard` must be 500µS or more. - In 250kbps data rate (even when there is no custom ACK payload) the `ard` must be - 500µS or more. - - See `data_rate` attribute on how to set the data rate of the nRF24L01's transmissions. - -ack -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.ack - - Use this attribute to set/check if the custom ACK payloads feature is enabled. Default - setting is `False`. - - - `True` enables the use of custom ACK payloads in the ACK packet when responding to - receiving transmissions. - - `False` disables the use of custom ACK payloads in the ACK packet when responding to - receiving transmissions. - - .. important:: - As `dynamic_payloads` and `auto_ack` attributes are required for this feature to work, - they are automatically enabled (on data pipe 0) as needed. However, it is required to - enable the `auto_ack` and `dynamic_payloads` features on all applicable pipes. - Disabling this feature does not disable the `auto_ack` and `dynamic_payloads` - attributes for any data pipe; they work just fine without this feature. - -interrupt_config() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.interrupt_config - - The digital signal from the nRF24L01's IRQ (Interrupt ReQuest) pin is active LOW. - - :param bool data_recv: If this is `True`, then IRQ pin goes active when new data is put - into the RX FIFO buffer. Default setting is `True` - :param bool data_sent: If this is `True`, then IRQ pin goes active when a payload from TX - buffer is successfully transmit. Default setting is `True` - :param bool data_fail: If this is `True`, then IRQ pin goes active when the maximum - number of attempts to re-transmit the packet have been reached. If `auto_ack` - attribute is disabled for pipe 0, then this IRQ event is not used. Default setting - is `True` - - .. note:: To fetch the status (not configuration) of these IRQ flags, use the `irq_df`, - `irq_ds`, `irq_dr` attributes respectively. - - .. tip:: Paraphrased from nRF24L01+ Specification Sheet: - - The procedure for handling :py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr` IRQ - should be: - - 1. retreive the payload from RX FIFO using `recv()` - 2. clear :py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr` status flag (taken care - of by using `recv()` in previous step) - 3. read FIFO_STATUS register to check if there are more payloads available in RX FIFO - buffer. A call to `pipe` (may require `update()` to be called beforehand), `any()` - or even ``(False, True)`` as parameters to `fifo()` will get this result. - 4. if there is more data in RX FIFO, repeat from step 1 - -data_rate -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.data_rate - - A valid input value is: - - - ``1`` sets the frequency data rate to 1 Mbps - - ``2`` sets the frequency data rate to 2 Mbps - - ``250`` sets the frequency data rate to 250 Kbps (see warning below) - - Any invalid input throws a `ValueError` exception. Default is 1 Mbps. - - .. warning:: 250 Kbps is not available for the non-plus variants of the - nRF24L01 transceivers. Trying to set the data rate to 250 kpbs when - `is_plus_variant` is `True` will throw a `NotImplementedError`. - -channel -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.channel - - A valid input value must be in range [0, 125] (that means [2.4, 2.525] GHz). Otherwise a - `ValueError` exception is thrown. Default is ``76`` (2.476 GHz). - -crc -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.crc - - CRC is a way of making sure that the transmission didn't get corrupted over the air. - - A valid input value must be: - - - ``0`` disables CRC (no anti-corruption of data) - - ``1`` enables CRC encoding scheme using 1 byte (weak anti-corruption of data) - - ``2`` enables CRC encoding scheme using 2 bytes (better anti-corruption of data) - - Any invalid input throws a `ValueError` exception. Default is enabled using 2 bytes. - - .. note:: The nRF24L01 automatically enables CRC if automatic acknowledgment feature is - enabled (see `auto_ack` attribute) for any data pipe. - -pa_level -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.pa_level - - Higher levels mean the transmission will cover a longer distance. Use this attribute to - tweak the nRF24L01 current consumption on projects that don't span large areas. - - A valid input value is: - - - ``-18`` sets the nRF24L01's power amplifier to -18 dBm (lowest) - - ``-12`` sets the nRF24L01's power amplifier to -12 dBm - - ``-6`` sets the nRF24L01's power amplifier to -6 dBm - - ``0`` sets the nRF24L01's power amplifier to 0 dBm (highest) - - If this attribute is set to a `list` or `tuple`, then the list/tuple must contain the - desired power amplifier level (from list above) at index 0 and a `bool` to control - the Low Noise Amplifier (LNA) feature at index 1. All other indices will be discarded. - - .. note:: The LNA feature setting only applies to the nRF24L01 (non-plus variant). - - Any invalid input will invoke the default of 0 dBm with LNA enabled. - -is_lna_enabled -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.is_lna_enabled - - See `pa_level` attribute about how to set this. Default is always enabled, but this - feature is specific to non-plus variants of nRF24L01 transceivers. If - `is_plus_variant` attribute is `True`, then setting feature in any way has no affect. + +.. |per_data_pipe_control| replace:: can be used control this feature per data pipe. Index 0 + controls this feature on data pipe 0. Indices greater than 5 will be + ignored since there are only 6 data pipes. + +Configuration API +----------------- + +dynamic_payloads +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.dynamic_payloads + + Default setting is enabled on all pipes. + + - `True` or ``1`` enables nRF24L01's dynamic payload length feature for all data pipes. The + `payload_length` attribute is ignored when this feature is enabled for all + respective data pipes. + - `False` or ``0`` disables nRF24L01's dynamic payload length feature for all data pipes. + Be sure to adjust the `payload_length` attribute accordingly when this feature is + disabled for any respective data pipes. + - A `list` or `tuple` containing booleans or integers |per_data_pipe_control| If any index's + value is less than 0 (a negative value), then the pipe corresponding to that index will + remain unaffected. + - An `int` where each bit in the integer represents the dynamic payload feature + per pipe. Bit position 0 controls this feature for data pipe 0, and bit position 5 + controls this feature for data pipe 0. All bits in positions greater than 5 are ignored. + + :returns: + An `int` (1 unsigned byte) where each bit in the integer represents the dynamic + payload feature per pipe. + + .. note:: + This attribute mostly relates to RX operations, but data pipe 0 applies to TX + operations also. The `auto_ack` attribute is automatically enabled by this attribute + for any data pipes that have this feature enabled. Disabling this feature for any + data pipe will not affect the `auto_ack` feature for the corresponding data pipes. + + .. versionchanged:: 1.2.0 + accepts a list or tuple for control of the dynamic payload feature per pipe. + .. versionchanged:: 1.2.4 + + - returns a integer instead of a boolean + - accepts an integer for binary control of feature per pipe + +payload_length +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.payload_length + + If the `dynamic_payloads` attribute is *enabled* for a certain data pipe, this attribute has + no affect on that data pipe. When `dynamic_payloads` is *disabled* for a certain data pipe, + this attribute is used to specify the payload length used on that data pipe. + + A valid input value must be: + + * an `int` in range [1, 32]. Otherwise a `ValueError` exception is thrown. + * A `list` or `tuple` containing integers |per_data_pipe_control| If any index's value + is ``0``, then the existing setting will persist (not be changed). + + Default is set to the nRF24L01's maximum of 32 (on all data pipes). + + .. note:: + This attribute mostly relates to RX operations, but data pipe 0 applies to TX + operations also. + + .. tip:: This attribute can be used as a list to set a certain pipe's static payload length + .. code_block:: python + + # let nrf be the instantiated RF24 object + nrf.payload_length[1] = 16 # set pipe 1 to expect static payload length of 16 bytes + nrf.payload_length[0] # get the currently expected payload length for pipe 0 + + .. versionchanged:: 1.2.0 + returns a list of all payload length settings for all pipes. Previously, this + attribute was a single `int` that controlled the configuration of static + payload lengths for all pipes. + +auto_ack +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.auto_ack + + Default setting is enabled on all data pipes. + + - `True` or ``1`` enables transmitting automatic acknowledgment packets for all data pipes. + The CRC (cyclic redundancy checking) is enabled (for all transmissions) automatically by + the nRF24L01 if this attribute is enabled for any data pipe (see also `crc` attribute). + - `False` or ``0`` disables transmitting automatic acknowledgment packets for all data + pipes. The `crc` attribute will remain unaffected when disabling this attribute for any + data pipes. + - A `list` or `tuple` containing booleans or integers |per_data_pipe_control| If any + index's value is less than 0 (a negative value), then the pipe corresponding to that + index will remain unaffected. + - An `int` where each bit in the integer represents the automatic acknowledgement feature + per pipe. Bit position 0 controls this feature for data pipe 0, and bit position 5 + controls this feature for data pipe 0. All bits in positions greater than 5 are ignored. + + :returns: + An `int` (1 unsigned byte) where each bit in the integer represents the automatic + acknowledgement feature per pipe. + + .. note:: + This attribute mostly relates to RX operations, but data pipe 0 applies to TX + operations also. + + .. versionchanged:: 1.2.0 + accepts a list or tuple for control of the automatic acknowledgement feature per pipe. + .. versionchanged:: 1.2.4 + + - returns a integer instead of a boolean + - accepts an integer for binary control of feature per pipe + +arc +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.arc + + The `auto_ack` attribute must be enabled on the receiving nRF24L01's pipe 0 & the + RX data pipe and the transmitting nRF24L01's pipe 0 to properly use this + attribute. If `auto_ack` is disabled on the transmitting nRF24L01's pipe 0, then this + attribute is ignored when calling `send()`. + + A valid input value must be in range [0, 15]. Otherwise a `ValueError` exception is + thrown. Default is set to 3. A value of ``0`` disables the automatic re-transmit feature, + but the sending nRF24L01 will still wait the number of microseconds specified by `ard` + for an Acknowledgement (ACK) packet response (assuming `auto_ack` is enabled). + +ard +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.ard + + During this time, the nRF24L01 is listening for the ACK packet. If the + `auto_ack` attribute is disabled for pipe 0, then this attribute is not applied. + + A valid input value must be in range [250, 4000]. Otherwise a `ValueError` exception is + thrown. Default is 1500 for reliability. If this is set to a value that is not multiple + of 250, then the highest multiple of 250 that is no greater than the input value is used. + + .. note:: Paraphrased from nRF24L01 specifications sheet: + + Please take care when setting this parameter. If the custom ACK payload is more than + 15 bytes in 2 Mbps data rate, the `ard` must be 500µS or more. If the custom ACK + payload is more than 5 bytes in 1 Mbps data rate, the `ard` must be 500µS or more. + In 250kbps data rate (even when there is no custom ACK payload) the `ard` must be + 500µS or more. + + See `data_rate` attribute on how to set the data rate of the nRF24L01's transmissions. + +ack +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.ack + + Use this attribute to set/check if the custom ACK payloads feature is enabled. Default + setting is `False`. + + - `True` enables the use of custom ACK payloads in the ACK packet when responding to + receiving transmissions. + - `False` disables the use of custom ACK payloads in the ACK packet when responding to + receiving transmissions. + + .. important:: + As `dynamic_payloads` and `auto_ack` attributes are required for this feature to work, + they are automatically enabled (on data pipe 0) as needed. However, it is required to + enable the `auto_ack` and `dynamic_payloads` features on all applicable pipes. + Disabling this feature does not disable the `auto_ack` and `dynamic_payloads` + attributes for any data pipe; they work just fine without this feature. + +interrupt_config() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.interrupt_config + + The digital signal from the nRF24L01's IRQ (Interrupt ReQuest) pin is active LOW. + + :param bool data_recv: If this is `True`, then IRQ pin goes active when new data is put + into the RX FIFO buffer. Default setting is `True` + :param bool data_sent: If this is `True`, then IRQ pin goes active when a payload from TX + buffer is successfully transmit. Default setting is `True` + :param bool data_fail: If this is `True`, then IRQ pin goes active when the maximum + number of attempts to re-transmit the packet have been reached. If `auto_ack` + attribute is disabled for pipe 0, then this IRQ event is not used. Default setting + is `True` + + .. note:: To fetch the status (not configuration) of these IRQ flags, use the `irq_df`, + `irq_ds`, `irq_dr` attributes respectively. + + .. tip:: Paraphrased from nRF24L01+ Specification Sheet: + + The procedure for handling :py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr` IRQ + should be: + + 1. retreive the payload from RX FIFO using `recv()` + 2. clear :py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr` status flag (taken care + of by using `recv()` in previous step) + 3. read FIFO_STATUS register to check if there are more payloads available in RX FIFO + buffer. A call to `pipe` (may require `update()` to be called beforehand), `any()` + or even ``(False, True)`` as parameters to `fifo()` will get this result. + 4. if there is more data in RX FIFO, repeat from step 1 + +data_rate +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.data_rate + + A valid input value is: + + - ``1`` sets the frequency data rate to 1 Mbps + - ``2`` sets the frequency data rate to 2 Mbps + - ``250`` sets the frequency data rate to 250 Kbps (see warning below) + + Any invalid input throws a `ValueError` exception. Default is 1 Mbps. + + .. warning:: 250 Kbps is not available for the non-plus variants of the + nRF24L01 transceivers. Trying to set the data rate to 250 kpbs when + `is_plus_variant` is `True` will throw a `NotImplementedError`. + +channel +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.channel + + A valid input value must be in range [0, 125] (that means [2.4, 2.525] GHz). Otherwise a + `ValueError` exception is thrown. Default is ``76`` (2.476 GHz). + +crc +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.crc + + CRC is a way of making sure that the transmission didn't get corrupted over the air. + + A valid input value must be: + + - ``0`` disables CRC (no anti-corruption of data) + - ``1`` enables CRC encoding scheme using 1 byte (weak anti-corruption of data) + - ``2`` enables CRC encoding scheme using 2 bytes (better anti-corruption of data) + + Any invalid input throws a `ValueError` exception. Default is enabled using 2 bytes. + + .. note:: The nRF24L01 automatically enables CRC if automatic acknowledgment feature is + enabled (see `auto_ack` attribute) for any data pipe. + +pa_level +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.pa_level + + Higher levels mean the transmission will cover a longer distance. Use this attribute to + tweak the nRF24L01 current consumption on projects that don't span large areas. + + A valid input value is: + + - ``-18`` sets the nRF24L01's power amplifier to -18 dBm (lowest) + - ``-12`` sets the nRF24L01's power amplifier to -12 dBm + - ``-6`` sets the nRF24L01's power amplifier to -6 dBm + - ``0`` sets the nRF24L01's power amplifier to 0 dBm (highest) + + If this attribute is set to a `list` or `tuple`, then the list/tuple must contain the + desired power amplifier level (from list above) at index 0 and a `bool` to control + the Low Noise Amplifier (LNA) feature at index 1. All other indices will be discarded. + + .. note:: The LNA feature setting only applies to the nRF24L01 (non-plus variant). + + Any invalid input will invoke the default of 0 dBm with LNA enabled. + +is_lna_enabled +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.is_lna_enabled + + See `pa_level` attribute about how to set this. Default is always enabled, but this + feature is specific to non-plus variants of nRF24L01 transceivers. If + `is_plus_variant` attribute is `True`, then setting feature in any way has no affect. diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index 227ad4c..d64c770 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -98,13 +98,15 @@ version: print(hex(i), "=", nrf._reg_read_bytes(i)) elif i not in (0x18, 0x19, 0x1a, 0x1b): print(hex(i), "=", hex(nrf._reg_read(i))) - * `dynamic_payloads` applies to all pipes, not individual pipes. + * `dynamic_payloads` applies to all pipes, not individual pipes. This attribute will return + a `bool` instead of an `int` * :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length` applies to all pipes, not - individual pipes. + individual pipes. This attribute will return a single `int` instead of a `list`. * `read_ack()` removed. This is deprecated on next major release anyway; use `recv()` instead. * `load_ack()` is available, but it will not throw exceptions for malformed ``buf`` or - invalid ``pipe_number`` parameters. + invalid ``pipe_number`` parameters. Rather any call to `load_ack()` with invalid + parameters will have no affect on the TX FIFO. * `crc` removed. 2-bytes encoding scheme (CRC16) is always enabled. * `auto_ack` removed. This is always enabled for all pipes. Pass ``ask_no_ack`` parameter as `True` to `send()` or `write()` to disable automatic acknowledgement for TX From b36393305ed7aca8fd9a09fe9d58200a8a7f7bf0 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 9 Dec 2020 08:36:27 -0800 Subject: [PATCH 021/103] try saving build artifacts in workflow --- .github/workflows/build.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 171b50b..28076ce 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,6 +57,11 @@ jobs: ([[ ! -d "examples" ]] || pylint --disable=invalid-name $( find . -path "./examples/*.py" )) - name: Build assets run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . --package_folder_prefix ${{ steps.pkg-name.outputs.pkg-name }} + - name: Upload bundles + uses: actions/upload-artifact@v2 + with: + name: bundles + path: ${{ github.workspace }}/bundles/ - name: Build docs working-directory: docs run: sphinx-build -E -W -b html . _build/html From 2caa5a4c6e69cf6fd1e29e57f4d40175afa0dfdd Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 9 Dec 2020 08:37:29 -0800 Subject: [PATCH 022/103] bad indent in workflow --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 28076ce..c1d5a17 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -58,10 +58,10 @@ jobs: - name: Build assets run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . --package_folder_prefix ${{ steps.pkg-name.outputs.pkg-name }} - name: Upload bundles - uses: actions/upload-artifact@v2 - with: - name: bundles - path: ${{ github.workspace }}/bundles/ + uses: actions/upload-artifact@v2 + with: + name: bundles + path: ${{ github.workspace }}/bundles/ - name: Build docs working-directory: docs run: sphinx-build -E -W -b html . _build/html From 802ea4e4e5c050f818309dcb609d46a4a6f9cf48 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 9 Dec 2020 12:41:08 -0800 Subject: [PATCH 023/103] tiny optimizations --- .github/workflows/build.yml | 2 +- circuitpython_nrf24l01/rf24.py | 15 +++++++-------- circuitpython_nrf24l01/rf24_lite.py | 12 ++++++------ examples/nrf24l01_ack_payload_test.py | 10 +++++----- examples/nrf24l01_manual_ack_test.py | 8 ++++---- 5 files changed, 23 insertions(+), 24 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c1d5a17..79fe429 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,7 +57,7 @@ jobs: ([[ ! -d "examples" ]] || pylint --disable=invalid-name $( find . -path "./examples/*.py" )) - name: Build assets run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location . --package_folder_prefix ${{ steps.pkg-name.outputs.pkg-name }} - - name: Upload bundles + - name: Archive bundles uses: actions/upload-artifact@v2 with: name: bundles diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 787a7ef..f1c67c9 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -147,7 +147,7 @@ def _reg_read(self, reg): def _reg_read_bytes(self, reg, buf_len=5): in_buf = bytearray(buf_len + 1) - out_buf = bytes([reg]) + b"\x00" * buf_len + out_buf = bytes([reg]) + b"\0" * buf_len with self._spi as spi: spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] @@ -710,7 +710,7 @@ def resend(self, send_only=False): result = False if not self.fifo(True, True): self.ce_pin.value = 0 - if not send_only: + if not send_only and self.pipe is not None: self.flush_rx() self.clear_status_flags() self._reg_write(0xE3) @@ -738,13 +738,12 @@ def write(self, buf, ask_no_ack=False, write_only=False): time.sleep(0.00016) if not bool((self._dyn_pl & 1) and (self._features & 4)): if len(buf) < self._pl_len[0]: - buf += b"\x00" * (self._pl_len[0] - len(buf)) + buf += b"\0" * (self._pl_len[0] - len(buf)) elif len(buf) > self._pl_len[0]: - buf = buf[: self._pl_len[0]] - if ask_no_ack: - if self._features & 1 == 0: - self._features = self._features & 0xFE | 1 - self._reg_write(TX_FEATURE, self._features) + buf = buf[:self._pl_len[0]] + if ask_no_ack and self._features & 1 == 0: + self._features = self._features & 0xFE | 1 + self._reg_write(TX_FEATURE, self._features) self._reg_write_bytes(0xA0 | (bool(ask_no_ack) << 4), buf) if not write_only: self.ce_pin.value = 1 diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index f110d48..703e772 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -46,7 +46,7 @@ def _reg_read(self, reg): def _reg_read_bytes(self, reg, buf_len=5): in_buf = bytearray(buf_len + 1) - out_buf = bytes([reg]) + b"\x00" * buf_len + out_buf = bytes([reg]) + b"\0" * buf_len with self._spi as spi: spi.write_readinto(out_buf, in_buf) self._status = in_buf[0] @@ -197,7 +197,7 @@ def interrupt_config(self, data_recv=True, data_sent=True, data_fail=True): @property def dynamic_payloads(self): - return bool(self._reg_read(0x1C)) and self._reg_read(0x1D) & 4 == 4 + return self._reg_read(0x1D) & 4 == 4 @dynamic_payloads.setter def dynamic_payloads(self, enable): @@ -306,13 +306,13 @@ def resend(self, send_only=False): result = False if not self.fifo(True, True): self.ce_pin.value = 0 - if not send_only: + if not send_only and self.pipe is not None: self.flush_rx() self.clear_status_flags() self._reg_write(0xE3) self.ce_pin.value = 1 self.ce_pin.value = 0 - while not self._status & 0x70: + while not self._status & 0x30: self.update() result = self.irq_ds if self._status & 0x60 == 0x60 and not send_only: @@ -332,10 +332,10 @@ def write(self, buf, ask_no_ack=False, write_only=False): if not self.dynamic_payloads: pl_width = self.payload_length if len(buf) < pl_width: - buf += b"\x00" * pl_width - len(buf) + buf += b"\0" * pl_width - len(buf) elif len(buf) > pl_width: buf = buf[:pl_width] - self._reg_write_bytes(0xA0 | (ask_no_ack << 4), buf) + self._reg_write_bytes(0xA0 | (bool(ask_no_ack) << 4), buf) if not write_only: self.ce_pin.value = 1 return True diff --git a/examples/nrf24l01_ack_payload_test.py b/examples/nrf24l01_ack_payload_test.py index c2c0e0c..cb178fe 100644 --- a/examples/nrf24l01_ack_payload_test.py +++ b/examples/nrf24l01_ack_payload_test.py @@ -68,8 +68,8 @@ def master(count=5): # count = 5 will only transmit 5 packets while count: # construct a payload to send - # add b"\x00" as a c-string NULL terminating char - buffer = b"Hello \x00" + bytes([counter[0]]) + # add b"\0" as a c-string NULL terminating char + buffer = b"Hello \0" + bytes([counter[0]]) start_timer = time.monotonic_ns() # start timer result = nrf.send(buffer) # save the response (ACK payload) end_timer = time.monotonic_ns() # stop timer @@ -109,8 +109,8 @@ def slave(count=5): nrf.listen = True # put radio into RX mode, power it up # setup the first transmission's ACK payload - # add b"\x00" as a c-string NULL terminating char - buffer = b"World \x00" + bytes([counter[0]]) + # add b"\0" as a c-string NULL terminating char + buffer = b"World \0" + bytes([counter[0]]) # we must set the ACK payload data and corresponding # pipe number [0, 5]. We'll be acknowledging pipe 1 nrf.load_ack(buffer, 1) # load ACK for first response @@ -139,7 +139,7 @@ def slave(count=5): ) start = time.monotonic() # reset timer if count: # Going again? - buffer = b"World \x00" + bytes([counter[0]]) # build new ACK + buffer = b"World \0" + bytes([counter[0]]) # build new ACK nrf.load_ack(buffer, 1) # load ACK for next response # recommended behavior is to keep in TX mode while idle diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py index dae1357..b9530d6 100644 --- a/examples/nrf24l01_manual_ack_test.py +++ b/examples/nrf24l01_manual_ack_test.py @@ -61,15 +61,15 @@ def master(count=5): # count = 5 will only transmit 5 packets nrf.listen = False # ensures the nRF24L01 is in TX mode while count: # construct a payload to send - # add b"\x00" as a c-string NULL terminating char - buffer = b"Hello \x00" + bytes([counter[0]]) + # add b"\0" as a c-string NULL terminating char + buffer = b"Hello \0" + bytes([counter[0]]) start_timer = time.monotonic_ns() # start timer result = nrf.send(buffer) # save the response (ACK payload) if not result: print("send() failed or timed out") else: # sent successful; listen for a response nrf.listen = True # get radio ready to receive a response - timeout = time.monotonic() + 1 # set sentinal for timeout + timeout = time.monotonic() + 0.2 # set sentinal for timeout while time.monotonic() < timeout: # this loop hangs for 200 ms or until response is received if nrf.update() and nrf.pipe is not None: @@ -121,7 +121,7 @@ def slave(count=5): # increment counter before sending it back in responding payload counter[0] = received[7:8][0] + 1 nrf.listen = False # put the radio in TX mode - result = nrf.send(b"World \x00" + bytes([counter[0]])) + result = nrf.send(b"World \0" + bytes([counter[0]])) nrf.listen = True # put the radio back in RX mode print( "Received {} on pipe {}: {}{} Sent:".format( From d50b1ed142947666d137533cd2bdc08e3fca8b79 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 9 Dec 2020 13:59:11 -0800 Subject: [PATCH 024/103] clarify in docs --- docs/configure_api.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 33a2699..8e42692 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -41,7 +41,7 @@ dynamic_payloads .. versionchanged:: 1.2.4 - returns a integer instead of a boolean - - accepts an integer for binary control of feature per pipe + - accepts an integer for binary control of the dynamic payload feature per pipe payload_length ****************************** @@ -109,7 +109,8 @@ auto_ack .. versionchanged:: 1.2.4 - returns a integer instead of a boolean - - accepts an integer for binary control of feature per pipe + - accepts an integer for binary control of the automatic acknowledgement feature + per pipe arc ****************************** From bb559bf7f97032abeb5a6f40dc83e235d5b5eac2 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Thu, 10 Dec 2020 02:09:35 -0800 Subject: [PATCH 025/103] found bug in pl_len; add RF24.available() - reverts payload_length behavior before v1.2.0 due to inadequate access to internal RF24._pl_len list via payload_length.getter() - replaced per pipe control of payload_length with new RF24.set_payload_length() & RF24.get_payload_length() - added RF24.available() for convenient alternative to ```RF24.update() and RF24.pipe is not None``` - renamed FakeBLE.available() to FakeBLE.len_available() and provided access to RF24.available() via newer FakeBLE.available() --- circuitpython_nrf24l01/fake_ble.py | 6 +- circuitpython_nrf24l01/rf24.py | 40 +++++++--- circuitpython_nrf24l01/rf24_lite.py | 3 + docs/advanced_api.rst | 15 ++-- docs/basic_api.rst | 20 +++++ docs/ble_api.rst | 20 ++++- docs/configure_api.rst | 84 ++++++++++++++------- docs/troubleshooting.rst | 2 +- examples/nrf24l01_2arduino_handling_data.py | 4 +- examples/nrf24l01_ack_payload_test.py | 2 +- examples/nrf24l01_fake_ble_test.py | 28 +++---- examples/nrf24l01_manual_ack_test.py | 4 +- examples/nrf24l01_simple_test.py | 2 +- examples/nrf24l01_stream_test.py | 2 +- 14 files changed, 160 insertions(+), 72 deletions(-) diff --git a/circuitpython_nrf24l01/fake_ble.py b/circuitpython_nrf24l01/fake_ble.py index 3413bea..8fb47b7 100644 --- a/circuitpython_nrf24l01/fake_ble.py +++ b/circuitpython_nrf24l01/fake_ble.py @@ -193,7 +193,7 @@ def _make_payload(self, payload): buf += crc24_ble(buf) return buf - def available(self, hypothetical=b""): + def len_available(self, hypothetical=b""): """This function will calculates how much length (in bytes) is available in the next payload.""" name_length = (len(self.name) + 2) if self.name is not None else 0 @@ -286,6 +286,10 @@ def update(self): """See :py:func:`circuitpython_nrf24l01.rf24.RF24.update()`""" self._radio.update() + def available(self): + """See :py:func:`circuitpython_nrf24l01.rf24.RF24.available()`""" + return self._radio.available() + def what_happened(self, dump_pipes=False): """See :py:func:`circuitpython_nrf24l01.rf24.RF24.what_happened()`""" self._radio.what_happened(dump_pipes=dump_pipes) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index f1c67c9..38d22b1 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -255,6 +255,10 @@ def listen(self, is_rx): self._reg_write(CONFIGURE, self._config) time.sleep(0.00016) + def available(self): + """Returns a bool describing if there is a payload in the RX FIFO""" + return self.update and self.pipe is not None + def any(self): """This function checks if the nRF24L01 has received any data at all, and then reports the next available payload's length (in bytes).""" @@ -461,7 +465,11 @@ def what_happened(self, dump_pipes=False): self.address(i), ) if is_open: - print("\t\texpecting", self._pl_len[i], "byte static payloads") + print( + "\t\texpecting {} byte static payloads".format( + self._reg_read(RX_PL_LENG + i) + ) + ) @property def is_plus_variant(self): @@ -503,20 +511,34 @@ def dynamic_payloads(self, enable): @property def payload_length(self): - """This attribute specifies the length (in bytes) of static payloads for each - pipe using a `list` of integers.""" - return self._pl_len + """This `int` attribute specifies the length (in bytes) of static + payloads for all pipes.""" + return self._pl_len[0] @payload_length.setter def payload_length(self, length): if isinstance(length, int): length = [length] * 6 - elif not isinstance(length, (list, tuple)): + for i, val in enumerate(length): + if 0 < val <= 32: # don't throw an exception; skip pipe + self._pl_len[i] = val + self._reg_write(RX_PL_LENG + i, val) + else: raise ValueError("length {} is not a valid input".format(length)) - for i, val in enumerate(length): - if i < 6 and 0 < val <= 32: # don't throw exception; skip pipe - self._pl_len[i] = val - self._reg_write(RX_PL_LENG + i, val) + + def set_payload_length(self, length, pipe_number=None): + """Sets the static payload length feature for each/all data pipes.""" + if pipe_number is None: + self.payload_length = length + elif 0 <= pipe_number <= 5: + self._pl_len[pipe_number] = max(1, min(32, length)) + self._reg_write(RX_PL_LENG + pipe_number, length) + raise IndexError("pipe {} does not exist".format(pipe_number)) + + def get_payload_length(self, pipe_number=0): + """Returns the current setting of a specified data pipe's expected + static payload length.""" + return self._pl_len[pipe_number] @property def arc(self): diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index 703e772..902fde9 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -132,6 +132,9 @@ def any(self): return self._reg_read(0x11 + self.pipe) return 0 + def available(self): + return self.update and self.pipe is not None + def recv(self, length=None): ret_size = length if length is not None else self.any() if not ret_size: diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index a5c8491..5e89041 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -263,20 +263,15 @@ update() Refreshing the status byte is vital to checking status of the interrupt flags, RX pipe number related to current RX payload, and if the TX FIFO buffer is full. This function returns nothing, but internally updates the `irq_dr`, `irq_ds`, `irq_df`, `pipe`, and - `tx_full` attributes. Internally this is a helper function to `send()`, and `resend()` + `tx_full` attributes. Internally this is a helper function to `available()`, `send()`, and `resend()` functions. :returns: `True` for every call. This value is meant to allow this function to be used - in ``if`` statements in conjunction with attributes related to the refreshed status - byte. + in `if` or `while` *in conjunction with* attributes related to the + refreshed status byte. - .. code-block:: python - - # let ``nrf`` be the instantiated object of the RF24 class - - # the following if statement is faster than using ``if nrf.any():`` - if nrf.update() and nrf.pipe is not None: - rx_payload = nrf.recv() + .. versionchanged:: 1.2.3 + arbitrarily returns `True` resend() ****************************** diff --git a/docs/basic_api.rst b/docs/basic_api.rst index c86879b..c6fe64e 100644 --- a/docs/basic_api.rst +++ b/docs/basic_api.rst @@ -111,6 +111,26 @@ any() - `int` of the size (in bytes) of an available RX payload (if any). - ``0`` if there is no payload in the RX FIFO buffer. +available() +****************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.available + + This function is provided for convenience and is synonomous with the following statement: + + .. code-block:: python + + # let `nrf` be the instantiated RF24 object + nrf.update() and nrf.pipe is not None + + .. versionadded:: 1.0.0-rc1 + .. versionchanged:: 1.0.0-rc3 + removed due to synonomous behavior with `any()`. + .. versionadded:: 1.2.4 + re-introduced as convenience to simplify using + ``nrf.update() and nrf.pipe is not None``. This seemed appropriate since the + underlying behavior of `any()` has changed since version 1.0.0 + recv() ****************** diff --git a/docs/ble_api.rst b/docs/ble_api.rst index bb0cf59..697323b 100644 --- a/docs/ble_api.rst +++ b/docs/ble_api.rst @@ -238,10 +238,10 @@ whiten() `advertise()` uses this function internally to prevent such improper usage. -available() -************* +len_available() +****************** -.. automethod:: circuitpython_nrf24l01.fake_ble.FakeBLE.available +.. automethod:: circuitpython_nrf24l01.fake_ble.FakeBLE.len_available This is detirmined from the current state of `name` and `show_pa_level` attributes. @@ -252,6 +252,13 @@ available() :returns: An `int` representing the length of available bytes for the a single payload. + .. versionchanged:: 1.2.4 + name changed from "available" to "len_available" to avoid confusion with + :py:func:`circuitpython_nrf24l01.rf24.RF24.available()`. This change also + allows providing the underlying `RF24` class' + :py:func:`~circuitpython_nrf24l01.rf24.RF24.available()` method in the + `FakeBLE` API. + advertise() ************* @@ -372,6 +379,13 @@ update() .. automethod:: circuitpython_nrf24l01.fake_ble.FakeBLE.update() +available() +#################### + +.. automethod:: circuitpython_nrf24l01.fake_ble.FakeBLE.available() + +.. versionadded:: 1.2.4 + what_happened() #################### diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 8e42692..033de92 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -13,18 +13,18 @@ dynamic_payloads Default setting is enabled on all pipes. - - `True` or ``1`` enables nRF24L01's dynamic payload length feature for all data pipes. The - `payload_length` attribute is ignored when this feature is enabled for all + - `True` or ``1`` enables nRF24L01's dynamic payload length feature for all data pipes. + The `payload_length` attribute is ignored when this feature is enabled for all respective data pipes. - `False` or ``0`` disables nRF24L01's dynamic payload length feature for all data pipes. Be sure to adjust the `payload_length` attribute accordingly when this feature is disabled for any respective data pipes. - - A `list` or `tuple` containing booleans or integers |per_data_pipe_control| If any index's - value is less than 0 (a negative value), then the pipe corresponding to that index will - remain unaffected. + - A `list` or `tuple` containing booleans or integers |per_data_pipe_control| If any + index's value is less than 0 (a negative value), then the pipe corresponding to that + index will remain unaffected. - An `int` where each bit in the integer represents the dynamic payload feature per pipe. Bit position 0 controls this feature for data pipe 0, and bit position 5 - controls this feature for data pipe 0. All bits in positions greater than 5 are ignored. + controls this feature for data pipe 5. All bits in positions greater than 5 are ignored. :returns: An `int` (1 unsigned byte) where each bit in the integer represents the dynamic @@ -35,7 +35,6 @@ dynamic_payloads operations also. The `auto_ack` attribute is automatically enabled by this attribute for any data pipes that have this feature enabled. Disabling this feature for any data pipe will not affect the `auto_ack` feature for the corresponding data pipes. - .. versionchanged:: 1.2.0 accepts a list or tuple for control of the dynamic payload feature per pipe. .. versionchanged:: 1.2.4 @@ -48,33 +47,65 @@ payload_length .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.payload_length - If the `dynamic_payloads` attribute is *enabled* for a certain data pipe, this attribute has - no affect on that data pipe. When `dynamic_payloads` is *disabled* for a certain data pipe, - this attribute is used to specify the payload length used on that data pipe. + This attribute can be used to specify the static payload length used for all data pipes + in which the `dynamic_payloads` attribute is *disabled* - A valid input value must be: + A valid input value must be an `int` in range [1, 32]. Otherwise a `ValueError` + exception is thrown. Setting this attribute to a single `int` configures all 6 data + pipes. Default is set to the nRF24L01's maximum of 32 (on all data pipes). - * an `int` in range [1, 32]. Otherwise a `ValueError` exception is thrown. - * A `list` or `tuple` containing integers |per_data_pipe_control| If any index's value - is ``0``, then the existing setting will persist (not be changed). + :returns: + The current setting of the expected static payload length feature for pipe 0 only. - Default is set to the nRF24L01's maximum of 32 (on all data pipes). + .. versionchanged:: 1.2.0 + return a list of all payload length settings for all pipes. This implementation + introduced a couple bugs: + + 1. The settings could be changed improperly in a way that was not written to the + nRF24L01 registers. + 2. There was no way to catch an invalid setting if configured improperly via the + first bug. This led to errors in using other functions that handle payloads. + + .. versionchanged:: 1.2.4 + reverted attribute behavior to original behavior that controls all pipes with one + setting. Specific control of the static payload length feature per pipe is now + provided with separate functions. (see `set_payload_length()` and + `get_payload_length()`) + +payload_length per pipe +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.set_payload_length() + + This function only affects data pipe(s) for which the `dynamic_payloads` attribute is + *disabled*. + + :param int length: The number of bytes in range [1, 32] for to be used for static + payload lengths. If this number is not in range [1, 32], then it will be clamped to + that range. + :param int pipe_number: The specific data pipe number in range [0, 5] to apply the + ``length`` parameter. If this parameter is not specified the ``length`` parameter is + applied to all data pipes. If this parameter is not in range [0, 5], then a + `IndexError` exception is thrown. .. note:: - This attribute mostly relates to RX operations, but data pipe 0 applies to TX + This function mostly relates to RX operations, but data pipe 0 applies to TX operations also. + .. versionadded:: 1.2.4 - .. tip:: This attribute can be used as a list to set a certain pipe's static payload length - .. code_block:: python +.. automethod:: circuitpython_nrf24l01.rf24.RF24.get_payload_length() - # let nrf be the instantiated RF24 object - nrf.payload_length[1] = 16 # set pipe 1 to expect static payload length of 16 bytes - nrf.payload_length[0] # get the currently expected payload length for pipe 0 + The data returned by this function is only relevant for data pipes in which the + `dynamic_payloads` attribute is *disabled*. - .. versionchanged:: 1.2.0 - returns a list of all payload length settings for all pipes. Previously, this - attribute was a single `int` that controlled the configuration of static - payload lengths for all pipes. + :param int pipe_number: The specific data pipe number in range [0, 5] to fetch. If this + parameter is not in range [0, 5], then a `IndexError` exception is thrown. If this + parameter is not specified, then the data returned is about data pipe 0. + + .. note:: + This function mostly relates to RX operations, but data pipe 0 applies to TX + operations also. + .. versionadded:: 1.2.4 auto_ack ****************************** @@ -94,7 +125,7 @@ auto_ack index will remain unaffected. - An `int` where each bit in the integer represents the automatic acknowledgement feature per pipe. Bit position 0 controls this feature for data pipe 0, and bit position 5 - controls this feature for data pipe 0. All bits in positions greater than 5 are ignored. + controls this feature for data pipe 5. All bits in positions greater than 5 are ignored. :returns: An `int` (1 unsigned byte) where each bit in the integer represents the automatic @@ -103,7 +134,6 @@ auto_ack .. note:: This attribute mostly relates to RX operations, but data pipe 0 applies to TX operations also. - .. versionchanged:: 1.2.0 accepts a list or tuple for control of the automatic acknowledgement feature per pipe. .. versionchanged:: 1.2.4 diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index d64c770..4989c84 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -101,7 +101,7 @@ version: * `dynamic_payloads` applies to all pipes, not individual pipes. This attribute will return a `bool` instead of an `int` * :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length` applies to all pipes, not - individual pipes. This attribute will return a single `int` instead of a `list`. + individual pipes. `set_payload_length()` and `get_payload_length()` have been removed. * `read_ack()` removed. This is deprecated on next major release anyway; use `recv()` instead. * `load_ack()` is available, but it will not throw exceptions for malformed ``buf`` or diff --git a/examples/nrf24l01_2arduino_handling_data.py b/examples/nrf24l01_2arduino_handling_data.py index 0998f35..89dcfaa 100644 --- a/examples/nrf24l01_2arduino_handling_data.py +++ b/examples/nrf24l01_2arduino_handling_data.py @@ -77,7 +77,7 @@ def master(count=5): # count = 5 will only transmit 5 packets while time.monotonic() * 1000 - myData.time < 200: # the arbitrary 200 ms timeout value is also used in the # TMRh20 library's GettingStarted_HandlingData sketch - if nrf.update() and nrf.pipe is not None: + if nrf.available(): end_timer = time.monotonic_ns() / 1000 # end timer rx = nrf.recv(32) # 32 mimics behavior in TMRh20 library rx = struct.unpack("= 0: - _prompt(count, i) # something to show that it isn't frozen + if ble.len_available(chunk(battery_service.buffer)) >= 0: + _prompt(count - i) # something to show that it isn't frozen # broadcast the device name, MAC address, & # battery charge info; 0x16 means service data ble.advertise(battery_service.buffer, data_type=0x16) @@ -92,11 +92,11 @@ def send_temp(count=50): ble.name = b"nRF24L01" print( "available bytes in next payload:", - ble.available(chunk(temperature_service.buffer)) + ble.len_available(chunk(temperature_service.buffer)) ) for i in range(count): - if ble.available(chunk(temperature_service.buffer)) >= 0: - _prompt(count, i) + if ble.len_available(chunk(temperature_service.buffer)) >= 0: + _prompt(count - i) # broadcast a temperature measurement; 0x16 means service data ble.advertise(temperature_service.buffer, data_type=0x16) ble.hop_channel() @@ -118,13 +118,13 @@ def send_url(count=50): with nrf as ble: print( "available bytes in next payload:", - ble.available(chunk(url_service.buffer)) + ble.len_available(chunk(url_service.buffer)) ) # NOTE we did NOT set a device name in this with block for i in range(count): # URLs easily exceed the nRF24L01's max payload length - if ble.available(chunk(url_service.buffer)) >= 0: - _prompt(count, i) + if ble.len_available(chunk(url_service.buffer)) >= 0: + _prompt(count - i) ble.advertise(url_service.buffer, 0x16) ble.hop_channel() time.sleep(0.2) diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py index b9530d6..40198ac 100644 --- a/examples/nrf24l01_manual_ack_test.py +++ b/examples/nrf24l01_manual_ack_test.py @@ -72,7 +72,7 @@ def master(count=5): # count = 5 will only transmit 5 packets timeout = time.monotonic() + 0.2 # set sentinal for timeout while time.monotonic() < timeout: # this loop hangs for 200 ms or until response is received - if nrf.update() and nrf.pipe is not None: + if nrf.available(): break nrf.listen = False # put the radio back in TX mode end_timer = time.monotonic_ns() # stop timer @@ -114,7 +114,7 @@ def slave(count=5): start_timer = time.monotonic() # used as a timeout while count and (time.monotonic() - start_timer) < 6: # this loop waits for 6 seconds at most if nothing received - if nrf.update() and nrf.pipe is not None: + if nrf.available(): length = nrf.any() # grab payload length info pipe = nrf.pipe # grab pipe number info received = nrf.recv(length) # clears info from any() and nrf.pipe diff --git a/examples/nrf24l01_simple_test.py b/examples/nrf24l01_simple_test.py index 10caa97..2a5244f 100644 --- a/examples/nrf24l01_simple_test.py +++ b/examples/nrf24l01_simple_test.py @@ -88,7 +88,7 @@ def slave(count=5): start = time.monotonic() while count and (time.monotonic() - start) < 6: - if nrf.update() and nrf.pipe is not None: + if nrf.available(): # grab information about the received payload payload_size, pipe_number = (nrf.any(), nrf.pipe) # fetch 1 payload from RX FIFO diff --git a/examples/nrf24l01_stream_test.py b/examples/nrf24l01_stream_test.py index b5dd076..c15b8cd 100644 --- a/examples/nrf24l01_stream_test.py +++ b/examples/nrf24l01_stream_test.py @@ -150,7 +150,7 @@ def slave(timeout=5): count = 0 # keep track of the number of received payloads start_timer = time.monotonic() # start timer while time.monotonic() < start_timer + timeout: - if nrf.update() and nrf.pipe is not None: + if nrf.available(): count += 1 # retreive the received packet's payload buffer = nrf.recv() # clears flags & empties RX FIFO From 9577188e6b4c9aa071520760f7b5d3597761e6c3 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Thu, 10 Dec 2020 02:29:00 -0800 Subject: [PATCH 026/103] missed renaming a couple FakeBLE.available() calls --- circuitpython_nrf24l01/fake_ble.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/circuitpython_nrf24l01/fake_ble.py b/circuitpython_nrf24l01/fake_ble.py index 8fb47b7..441faaf 100644 --- a/circuitpython_nrf24l01/fake_ble.py +++ b/circuitpython_nrf24l01/fake_ble.py @@ -174,10 +174,10 @@ def whiten(self, data): def _make_payload(self, payload): """Assemble the entire packet to be transmitted as a payload.""" - if self.available(payload) < 0: + if self.len_available(payload) < 0: raise ValueError( "Payload length exceeds maximum buffer size by " - "{} bytes".format(abs(self.available(payload))) + "{} bytes".format(abs(self.len_available(payload))) ) name_length = (len(self.name) + 2) if self.name is not None else 0 pl_size = 9 + len(payload) + name_length + self._show_dbm * 3 From 23af4265c30c4c0447e6642777f458a9fc793249 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Thu, 10 Dec 2020 03:41:30 -0800 Subject: [PATCH 027/103] fix ctx mgr about pl_len; rely on list IndexError --- circuitpython_nrf24l01/rf24.py | 19 ++++++++----------- circuitpython_nrf24l01/rf24_lite.py | 4 +--- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 38d22b1..bf4ad4f 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -128,7 +128,8 @@ def __enter__(self): self._reg_write_bytes(TX_ADDRESS, self._tx_address) self._reg_write(0x05, self._channel) self._reg_write(0x03, self._addr_len - 2) - self.payload_length = self._pl_len + for i, val in enumerate(self._pl_len): + self.set_payload_length(val, i) return self def __exit__(self, *exc): @@ -517,12 +518,10 @@ def payload_length(self): @payload_length.setter def payload_length(self, length): - if isinstance(length, int): - length = [length] * 6 - for i, val in enumerate(length): - if 0 < val <= 32: # don't throw an exception; skip pipe - self._pl_len[i] = val - self._reg_write(RX_PL_LENG + i, val) + if isinstance(length, int) and 0 < length <= 32: + for i in range(6): + self._pl_len[i] = length + self._reg_write(RX_PL_LENG + i, length) else: raise ValueError("length {} is not a valid input".format(length)) @@ -530,10 +529,8 @@ def set_payload_length(self, length, pipe_number=None): """Sets the static payload length feature for each/all data pipes.""" if pipe_number is None: self.payload_length = length - elif 0 <= pipe_number <= 5: - self._pl_len[pipe_number] = max(1, min(32, length)) - self._reg_write(RX_PL_LENG + pipe_number, length) - raise IndexError("pipe {} does not exist".format(pipe_number)) + self._pl_len[pipe_number] = max(1, min(32, length)) + self._reg_write(RX_PL_LENG + pipe_number, length) def get_payload_length(self, pipe_number=0): """Returns the current setting of a specified data pipe's expected diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index 902fde9..cf812f0 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -213,10 +213,8 @@ def payload_length(self): @payload_length.setter def payload_length(self, length): - if not length or length > 32: - raise ValueError("payload_length must be in range [1, 32]") for i in range(6): - self._reg_write(0x11 + i, length) + self._reg_write(0x11 + i, max(1, min(32, length))) @property def arc(self): From 59da7e87d4e0e3a07eae6ef5d17e791cdb716938 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Thu, 10 Dec 2020 03:52:54 -0800 Subject: [PATCH 028/103] use available() in any() --- circuitpython_nrf24l01/rf24.py | 4 ++-- circuitpython_nrf24l01/rf24_lite.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index bf4ad4f..0487913 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -263,7 +263,7 @@ def available(self): def any(self): """This function checks if the nRF24L01 has received any data at all, and then reports the next available payload's length (in bytes).""" - if self.update() and self.pipe is not None: + if self.available(): if self._features & 4: return self._reg_read(0x60) return self._pl_len[self.pipe] @@ -371,7 +371,7 @@ def what_happened(self, dump_pipes=False): ) print("CRC bytes_________________{}".format(self.crc)) print("Address length____________{} bytes".format(self.address_length)) - print("TX Payload lengths________{} bytes".format(self.payload_length[0])) + print("TX Payload lengths________{} bytes".format(self.payload_length)) print("Auto retry delay__________{} microseconds".format(self.ard)) print("Auto retry attempts_______{} maximum".format(self.arc)) print("Re-use TX FIFO____________{}".format(bool(self._reg_read(0x17) & 64))) diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index cf812f0..7cc3ca3 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -125,6 +125,9 @@ def listen(self, is_rx): self._reg_write(2, self._reg_read(2) | 1) time.sleep(0.00016) + def available(self): + return self.update and self.pipe is not None + def any(self): if self._reg_read(0x1D) & 4 and self.pipe is not None: return self._reg_read(0x60) @@ -132,9 +135,6 @@ def any(self): return self._reg_read(0x11 + self.pipe) return 0 - def available(self): - return self.update and self.pipe is not None - def recv(self, length=None): ret_size = length if length is not None else self.any() if not ret_size: From 35cce654a184987426fd69d553bc4716e3de1d69 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Thu, 10 Dec 2020 06:33:50 -0800 Subject: [PATCH 029/103] testing examples; found typo in available() --- circuitpython_nrf24l01/rf24.py | 2 +- circuitpython_nrf24l01/rf24_lite.py | 2 +- examples/nrf24l01_2arduino_handling_data.py | 7 +++---- examples/nrf24l01_ack_payload_test.py | 10 ++++------ examples/nrf24l01_manual_ack_test.py | 7 +++---- examples/nrf24l01_simple_test.py | 5 ++--- 6 files changed, 14 insertions(+), 19 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 0487913..35ca75d 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -258,7 +258,7 @@ def listen(self, is_rx): def available(self): """Returns a bool describing if there is a payload in the RX FIFO""" - return self.update and self.pipe is not None + return self.update() and self.pipe is not None def any(self): """This function checks if the nRF24L01 has received any data at all, diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index 7cc3ca3..9db0a12 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -126,7 +126,7 @@ def listen(self, is_rx): time.sleep(0.00016) def available(self): - return self.update and self.pipe is not None + return self.update() and self.pipe is not None def any(self): if self._reg_read(0x1D) & 4 and self.pipe is not None: diff --git a/examples/nrf24l01_2arduino_handling_data.py b/examples/nrf24l01_2arduino_handling_data.py index 89dcfaa..648a610 100644 --- a/examples/nrf24l01_2arduino_handling_data.py +++ b/examples/nrf24l01_2arduino_handling_data.py @@ -99,7 +99,7 @@ def master(count=5): # count = 5 will only transmit 5 packets time.sleep(1) -def slave(count=3): +def slave(timeout=6): """Polls the radio and prints the received value. This method expires after 6 seconds of no received transmission""" # set address of TX node into a RX pipe, and @@ -112,7 +112,7 @@ def slave(count=3): nrf.open_tx_pipe(address[0]) nrf.listen = True # put radio into RX mode and power up myData.time = time.monotonic() * 1000 # in milliseconds - while count and (time.monotonic() * 1000 - myData.time) < 6000: + while (time.monotonic() * 1000 - myData.time) < timeout * 1000: if nrf.available(): # clear flags & fetch 1 payload in RX FIFO buffer = nrf.recv(32) # 32 mimics behavior in TMRh20 library @@ -141,9 +141,8 @@ def slave(count=3): end_timer - myData.time ) ) - # this will listen indefinitely till counter == 0 - count -= 1 nrf.listen = True # put nRF24L01 back into RX mode + # recommended behavior is to keep in TX mode when in idle nrf.listen = False # put the nRF24L01 in TX mode + Standby-I power state diff --git a/examples/nrf24l01_ack_payload_test.py b/examples/nrf24l01_ack_payload_test.py index b120c99..a29f224 100644 --- a/examples/nrf24l01_ack_payload_test.py +++ b/examples/nrf24l01_ack_payload_test.py @@ -104,7 +104,7 @@ def master(count=5): # count = 5 will only transmit 5 packets count -= 1 -def slave(count=5): +def slave(timeout=6): """Prints the received value and sends an ACK payload""" nrf.listen = True # put radio into RX mode, power it up @@ -116,9 +116,8 @@ def slave(count=5): nrf.load_ack(buffer, 1) # load ACK for first response start = time.monotonic() # start timer - while count and (time.monotonic() - start) < 6: # use 6 second timeout + while (time.monotonic() - start) < timeout: if nrf.available(): - count -= 1 # grab information about the received payload length, pipe_number = (nrf.any(), nrf.pipe) # retreive the received packet's payload @@ -138,9 +137,8 @@ def slave(count=5): ) ) start = time.monotonic() # reset timer - if count: # Going again? - buffer = b"World \0" + bytes([counter[0]]) # build new ACK - nrf.load_ack(buffer, 1) # load ACK for next response + buffer = b"World \0" + bytes([counter[0]]) # build new ACK + nrf.load_ack(buffer, 1) # load ACK for next response # recommended behavior is to keep in TX mode while idle nrf.listen = False # put radio in TX mode & flush unused ACK payloads diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py index 40198ac..85ef87d 100644 --- a/examples/nrf24l01_manual_ack_test.py +++ b/examples/nrf24l01_manual_ack_test.py @@ -107,13 +107,12 @@ def master(count=5): # count = 5 will only transmit 5 packets time.sleep(1) -def slave(count=5): +def slave(timeout=6): """Polls the radio and prints the received value. This method expires after 6 seconds of no received transmission""" nrf.listen = True # put radio into RX mode and power up start_timer = time.monotonic() # used as a timeout - while count and (time.monotonic() - start_timer) < 6: - # this loop waits for 6 seconds at most if nothing received + while (time.monotonic() - start_timer) < timeout: if nrf.available(): length = nrf.any() # grab payload length info pipe = nrf.pipe # grab pipe number info @@ -136,8 +135,8 @@ def slave(count=5): print("Response failed or timed out") else: print("World", counter[0]) - count -= 1 start_timer = time.monotonic() # reset timeout + # recommended behavior is to keep in TX mode when in idle nrf.listen = False # put the nRF24L01 in TX mode + Standby-I power state diff --git a/examples/nrf24l01_simple_test.py b/examples/nrf24l01_simple_test.py index 2a5244f..209cc8c 100644 --- a/examples/nrf24l01_simple_test.py +++ b/examples/nrf24l01_simple_test.py @@ -81,13 +81,13 @@ def master(count=5): # count = 5 will only transmit 5 packets count -= 1 -def slave(count=5): +def slave(timeout=6): """Polls the radio and prints the received value. This method expires after 6 seconds of no received transmission""" nrf.listen = True # put radio into RX mode and power up start = time.monotonic() - while count and (time.monotonic() - start) < 6: + while (time.monotonic() - start) < timeout: if nrf.available(): # grab information about the received payload payload_size, pipe_number = (nrf.any(), nrf.pipe) @@ -105,7 +105,6 @@ def slave(count=5): ) ) start = time.monotonic() - count -= 1 # recommended behavior is to keep in TX mode while idle nrf.listen = False # put the nRF24L01 is in TX mode From 6ae4a59046aa07d57f16f3a75f739616fbc21720 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Thu, 10 Dec 2020 06:56:30 -0800 Subject: [PATCH 030/103] keep CE HIGH while STATUS flags reports nothing --- circuitpython_nrf24l01/rf24.py | 4 ++-- circuitpython_nrf24l01/rf24_lite.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 35ca75d..0e8729f 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -291,9 +291,9 @@ def send(self, buf, ask_no_ack=False, force_retry=0, send_only=False): if not send_only and self.pipe is not None: self.flush_rx() self.write(buf, ask_no_ack) - self.ce_pin.value = 0 while not self._status & 0x70: self.update() + self.ce_pin.value = 0 result = self.irq_ds if self.irq_df: for _ in range(force_retry): @@ -734,9 +734,9 @@ def resend(self, send_only=False): self.clear_status_flags() self._reg_write(0xE3) self.ce_pin.value = 1 - self.ce_pin.value = 0 while not self._status & 0x70: self.update() + self.ce_pin.value = 0 result = self.irq_ds if self._status & 0x60 == 0x60 and not send_only: result = self.recv() diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index 9db0a12..967f15d 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -154,9 +154,9 @@ def send(self, buf, ask_no_ack=False, force_retry=0, send_only=False): if not send_only and self.pipe is not None: self.flush_rx() self.write(buf, ask_no_ack) - self.ce_pin.value = 0 while not self._status & 0x70: self.update() + self.ce_pin.value = 0 result = self.irq_ds if self.irq_df: for _ in range(force_retry): @@ -312,9 +312,9 @@ def resend(self, send_only=False): self.clear_status_flags() self._reg_write(0xE3) self.ce_pin.value = 1 - self.ce_pin.value = 0 while not self._status & 0x30: self.update() + self.ce_pin.value = 0 result = self.irq_ds if self._status & 0x60 == 0x60 and not send_only: result = self.recv() From f7fe7dcba20a433d56695a1161ecc28d86902abd Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Thu, 10 Dec 2020 07:14:29 -0800 Subject: [PATCH 031/103] fix docs about auto_ack and dyn_pl attributes --- docs/configure_api.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 033de92..03751b9 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -13,10 +13,10 @@ dynamic_payloads Default setting is enabled on all pipes. - - `True` or ``1`` enables nRF24L01's dynamic payload length feature for all data pipes. + - `True` enables nRF24L01's dynamic payload length feature for all data pipes. The `payload_length` attribute is ignored when this feature is enabled for all respective data pipes. - - `False` or ``0`` disables nRF24L01's dynamic payload length feature for all data pipes. + - `False` disables nRF24L01's dynamic payload length feature for all data pipes. Be sure to adjust the `payload_length` attribute accordingly when this feature is disabled for any respective data pipes. - A `list` or `tuple` containing booleans or integers |per_data_pipe_control| If any @@ -114,10 +114,10 @@ auto_ack Default setting is enabled on all data pipes. - - `True` or ``1`` enables transmitting automatic acknowledgment packets for all data pipes. + - `True` enables transmitting automatic acknowledgment packets for all data pipes. The CRC (cyclic redundancy checking) is enabled (for all transmissions) automatically by the nRF24L01 if this attribute is enabled for any data pipe (see also `crc` attribute). - - `False` or ``0`` disables transmitting automatic acknowledgment packets for all data + - `False` disables transmitting automatic acknowledgment packets for all data pipes. The `crc` attribute will remain unaffected when disabling this attribute for any data pipes. - A `list` or `tuple` containing booleans or integers |per_data_pipe_control| If any From 173f913da4d849cf6947d06499abcee2e6cd9ba1 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 11 Dec 2020 05:13:40 -0800 Subject: [PATCH 032/103] revised auto_ack, dyn_pl, & ack attributes --- circuitpython_nrf24l01/rf24.py | 79 +++++++++++++++---- circuitpython_nrf24l01/rf24_lite.py | 2 +- docs/configure_api.rst | 117 ++++++++++++++++++++-------- 3 files changed, 149 insertions(+), 49 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 0e8729f..81c0453 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -483,10 +483,7 @@ def dynamic_payloads(self): """This `int` attribute controls the nRF24L01's dynamic payload length feature for each pipe.""" self._dyn_pl = self._reg_read(DYN_PL_LEN) - self._features = self._reg_read(TX_FEATURE) - if self._features & 4 == 4: - return self._dyn_pl - return 0 + return self._dyn_pl @dynamic_payloads.setter def dynamic_payloads(self, enable): @@ -510,6 +507,23 @@ def dynamic_payloads(self, enable): self._config = self._reg_read(CONFIGURE) self._reg_write(DYN_PL_LEN, self._dyn_pl) + def set_dynamic_payloads(self, enable, pipe_number=None): + """Control the dynamic payload feature for a specific data pipe.""" + if pipe_number is None: + self.dynamic_payloads = bool(enable) + elif 0 <= pipe_number <= 5: + self._dyn_pl &= ~(1 << pipe_number) + self.dynamic_payloads = self._dyn_pl | (bool(enable) << pipe_number) + else: + raise IndexError("pipe_number must be in range [0, 5]") + + def get_dynamic_payloads(self, pipe_number=0): + """Returns a `bool` describing the setting of the dynamic payload + feature about a specific data pipe.""" + if 0 <= pipe_number <= 5: + return bool(self.dynamic_payloads & (1 << pipe_number)) + raise IndexError("pipe_number must be in range [0, 5]") + @property def payload_length(self): """This `int` attribute specifies the length (in bytes) of static @@ -518,23 +532,26 @@ def payload_length(self): @payload_length.setter def payload_length(self, length): - if isinstance(length, int) and 0 < length <= 32: - for i in range(6): - self._pl_len[i] = length - self._reg_write(RX_PL_LENG + i, length) - else: + if isinstance(length, int): + length = [max(1, length)] * 6 + elif not isinstance(length, (list, tuple)): raise ValueError("length {} is not a valid input".format(length)) + for i, val in enumerate(length): + if i < 6 and val > 0: # don't throw exception, just skip pipe + self._pl_len[i] = min(32, val) + self._reg_write(RX_PL_LENG + i, self._pl_len[i]) def set_payload_length(self, length, pipe_number=None): """Sets the static payload length feature for each/all data pipes.""" if pipe_number is None: self.payload_length = length - self._pl_len[pipe_number] = max(1, min(32, length)) - self._reg_write(RX_PL_LENG + pipe_number, length) + else: + self._pl_len[pipe_number] = max(1, min(32, length)) + self._reg_write(RX_PL_LENG + pipe_number, length) def get_payload_length(self, pipe_number=0): - """Returns the current setting of a specified data pipe's expected - static payload length.""" + """Returns an `int` describing the current setting of a specified data + pipe's expected static payload length.""" return self._pl_len[pipe_number] @property @@ -587,10 +604,38 @@ def auto_ack(self, enable): self._aa = (self._aa & ~(1 << i)) | (bool(val) << i) else: raise ValueError("auto_ack: {} is not a valid input" % enable) + for i in range(6): + mask = 1 << i + if self._aa & mask != mask and self._dyn_pl & mask == mask: + self._dyn_pl &= ~mask + if not i and self._features & 4 != 4 and self._dyn_pl & mask: + self._features |= 4 + self._reg_write(TX_FEATURE, self._features) + if bool(self._aa & 1) != bool(self._aa & 0x3E): + self._aa &= 1 + self._reg_write(DYN_PL_LEN, self._dyn_pl) self._reg_write(AUTO_ACK, self._aa) if self._aa: # refresh crc data if enabled self._config = self._reg_read(CONFIGURE) + def set_auto_ack(self, enable, pipe_number=None): + """Control the automatic acknowledgement feature for a specific data + pipe.""" + if pipe_number is None: + self.auto_ack = bool(enable) + elif 0 <= pipe_number <= 5: + self._aa &= ~(1 << pipe_number) + self.auto_ack = self._aa | (bool(enable) << pipe_number) + else: + raise IndexError("pipe_number must be in range [0, 5]") + + def get_auto_ack(self, pipe_number=0): + """Returns a `bool` describing the automatic acknowledgement feature + setting about a specific data pipe.""" + if 0 <= pipe_number <= 5: + return bool(self._aa & (1 << pipe_number)) + raise IndexError("pipe_number must be in range [0, 5]") + @property def ack(self): """This `bool` attribute represents the status of the nRF24L01's @@ -603,11 +648,11 @@ def ack(self): @ack.setter def ack(self, enable): - if self.ack != bool(enable): - self.auto_ack = (1,) - self._dyn_pl = self._dyn_pl & ~1 | 1 + if bool(enable): + self.set_auto_ack(True, 0) + self._dyn_pl = self._dyn_pl & 0x3E | 1 self._reg_write(DYN_PL_LEN, self._dyn_pl) - self._features = self._features & 3 | 4 + self._features = self._features | 4 self._features = self._features & 5 | bool(enable) << 1 self._reg_write(TX_FEATURE, self._features) diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index 967f15d..d3687a2 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -245,7 +245,7 @@ def ack(self, enable): features = self._reg_read(0x1D) & 5 if enable: self._reg_write(0x1C, 0x3F) - features = (features & 3) | 4 + features = features | 4 features |= 2 if enable else 0 self._reg_write(0x1D, features) diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 03751b9..4125787 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -3,12 +3,20 @@ controls this feature on data pipe 0. Indices greater than 5 will be ignored since there are only 6 data pipes. +.. |mostly_rx_but_tx0| replace:: This attribute mostly relates to RX operations, but data + pipe 0 applies to TX operations also. + Configuration API ----------------- dynamic_payloads ****************************** +.. note:: + |mostly_rx_but_tx0| The `auto_ack` attribute is automatically enabled by this attribute + for any data pipes that have this feature enabled. Disabling this feature for any + data pipe will not affect the `auto_ack` feature for the corresponding data pipes. + .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.dynamic_payloads Default setting is enabled on all pipes. @@ -30,11 +38,9 @@ dynamic_payloads An `int` (1 unsigned byte) where each bit in the integer represents the dynamic payload feature per pipe. - .. note:: - This attribute mostly relates to RX operations, but data pipe 0 applies to TX - operations also. The `auto_ack` attribute is automatically enabled by this attribute - for any data pipes that have this feature enabled. Disabling this feature for any - data pipe will not affect the `auto_ack` feature for the corresponding data pipes. + :setter: `set_dynamic_payloads()` + :getter: `get_dynamic_payloads()` + .. versionchanged:: 1.2.0 accepts a list or tuple for control of the dynamic payload feature per pipe. .. versionchanged:: 1.2.4 @@ -42,21 +48,51 @@ dynamic_payloads - returns a integer instead of a boolean - accepts an integer for binary control of the dynamic payload feature per pipe +.. automethod:: circuitpython_nrf24l01.rf24.RF24.set_dynamic_payloads + + :param bool enable: The state of the dynamic payload feature about a specified + data pipe. + :param int pipe_number: The specific data pipe number in range [0, 5] to apply the + ``enable`` parameter. If this parameter is not specified the ``enable`` parameter is + applied to all data pipes. If this parameter is not in range [0, 5], then a + `IndexError` exception is thrown. + + .. versionadded:: 1.2.4 + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.get_dynamic_payloads + + :param int pipe_number: The specific data pipe number in range [0, 5] concerning the + dynamic payload length feature. If this parameter is not in range [0, 5], then a + `IndexError` exception is thrown. If this parameter is not specified, then the data + returned is about data pipe 0. + payload_length ****************************** +.. note:: + |mostly_rx_but_tx0| + .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.payload_length This attribute can be used to specify the static payload length used for all data pipes in which the `dynamic_payloads` attribute is *disabled* - A valid input value must be an `int` in range [1, 32]. Otherwise a `ValueError` - exception is thrown. Setting this attribute to a single `int` configures all 6 data - pipes. Default is set to the nRF24L01's maximum of 32 (on all data pipes). + A valid input value must be: + + * an `int` in range [1, 32]. Otherwise a `ValueError` exception is thrown. Setting + this attribute to a single `int` configures all 6 data pipes. + * A `list` or `tuple` containing integers |per_data_pipe_control| If any index's + value is ``0``, then the existing setting for the corresponding data pipe will + persist (not be changed). + + Default is set to the nRF24L01's maximum of 32 (on all data pipes). :returns: The current setting of the expected static payload length feature for pipe 0 only. + :setter: `set_payload_length()` + :getter: `get_payload_length()` + .. versionchanged:: 1.2.0 return a list of all payload length settings for all pipes. This implementation introduced a couple bugs: @@ -64,20 +100,17 @@ payload_length 1. The settings could be changed improperly in a way that was not written to the nRF24L01 registers. 2. There was no way to catch an invalid setting if configured improperly via the - first bug. This led to errors in using other functions that handle payloads. + first bug. This led to errors in using other functions that handle payloads or + the length of payloads. .. versionchanged:: 1.2.4 - reverted attribute behavior to original behavior that controls all pipes with one - setting. Specific control of the static payload length feature per pipe is now - provided with separate functions. (see `set_payload_length()` and - `get_payload_length()`) - -payload_length per pipe -****************************** + this attribute returns the configuration about static payload length for data pipe 0 + only. Use `get_payload_length()` to fetch the configuration of the static payload + length feature for any data pipe. -.. automethod:: circuitpython_nrf24l01.rf24.RF24.set_payload_length() +.. automethod:: circuitpython_nrf24l01.rf24.RF24.set_payload_length - This function only affects data pipe(s) for which the `dynamic_payloads` attribute is + This function only affects data pipes for which the `dynamic_payloads` attribute is *disabled*. :param int length: The number of bytes in range [1, 32] for to be used for static @@ -88,28 +121,30 @@ payload_length per pipe applied to all data pipes. If this parameter is not in range [0, 5], then a `IndexError` exception is thrown. - .. note:: - This function mostly relates to RX operations, but data pipe 0 applies to TX - operations also. .. versionadded:: 1.2.4 -.. automethod:: circuitpython_nrf24l01.rf24.RF24.get_payload_length() +.. automethod:: circuitpython_nrf24l01.rf24.RF24.get_payload_length The data returned by this function is only relevant for data pipes in which the `dynamic_payloads` attribute is *disabled*. - :param int pipe_number: The specific data pipe number in range [0, 5] to fetch. If this - parameter is not in range [0, 5], then a `IndexError` exception is thrown. If this - parameter is not specified, then the data returned is about data pipe 0. + :param int pipe_number: The specific data pipe number in range [0, 5] to concerning the + static payload length feature. If this parameter is not in range [0, 5], then a + `IndexError` exception is thrown. If this parameter is not specified, then the data + returned is about data pipe 0. - .. note:: - This function mostly relates to RX operations, but data pipe 0 applies to TX - operations also. .. versionadded:: 1.2.4 auto_ack ****************************** +.. note:: + |mostly_rx_but_tx0| This attribute will intuitively: + - enable the automatic acknowledgement feature for pipe 0 if any other data pipe + is configured to use the automatic acknowledgement feature. + - disable the `dynamic_payloads` feature for any data pipe that is configured to + disable the automatic acknowledgement feature. + .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.auto_ack Default setting is enabled on all data pipes. @@ -131,9 +166,9 @@ auto_ack An `int` (1 unsigned byte) where each bit in the integer represents the automatic acknowledgement feature per pipe. - .. note:: - This attribute mostly relates to RX operations, but data pipe 0 applies to TX - operations also. + :setter: `set_auto_ack()` + :getter: `get_auto_ack()` + .. versionchanged:: 1.2.0 accepts a list or tuple for control of the automatic acknowledgement feature per pipe. .. versionchanged:: 1.2.4 @@ -142,6 +177,26 @@ auto_ack - accepts an integer for binary control of the automatic acknowledgement feature per pipe +.. automethod:: circuitpython_nrf24l01.rf24.RF24.set_auto_ack + + :param bool enable: The state of the automatic acknowledgement feature about a specified + data pipe. + :param int pipe_number: The specific data pipe number in range [0, 5] to apply the + ``enable`` parameter. If this parameter is not specified the ``enable`` parameter is + applied to all data pipes. If this parameter is not in range [0, 5], then a + `IndexError` exception is thrown. + + .. versionadded:: 1.2.4 + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.get_auto_ack + + :param int pipe_number: The specific data pipe number in range [0, 5] concerning the + setting for the automatic acknowledgment feature. If this parameter is not in range + [0, 5], then a `IndexError` exception is thrown. If this parameter is not specified, + then the data returned is about data pipe 0. + + .. versionadded:: 1.2.4 + arc ****************************** From 5c7398eda3bbc3ce95eb342e5c2d4917da3ad4b5 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 11 Dec 2020 09:36:11 -0800 Subject: [PATCH 033/103] self-reviewed PR changes --- circuitpython_nrf24l01/rf24.py | 8 ++-- docs/ble_api.rst | 2 +- docs/configure_api.rst | 4 +- docs/troubleshooting.rst | 2 +- setup.py | 73 ++++++++++++++-------------------- 5 files changed, 38 insertions(+), 51 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 0757aa2..fb11860 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -292,7 +292,7 @@ def send(self, buf, ask_no_ack=False, force_retry=0, send_only=False): if not send_only and self.pipe is not None: self.flush_rx() self.write(buf, ask_no_ack) - while not self._status & 0x70: + while not self._status & 0x30: self.update() self.ce_pin.value = 0 result = self.irq_ds @@ -482,7 +482,7 @@ def is_plus_variant(self): @property def dynamic_payloads(self): """This `int` attribute controls the nRF24L01's dynamic payload - length feature for each pipe.""" + length feature for any or all pipes.""" self._dyn_pl = self._reg_read(DYN_PL_LEN) return self._dyn_pl @@ -528,7 +528,7 @@ def get_dynamic_payloads(self, pipe_number=0): @property def payload_length(self): """This `int` attribute specifies the length (in bytes) of static - payloads for all pipes.""" + payloads for any or all pipes.""" return self._pl_len[0] @payload_length.setter @@ -589,7 +589,7 @@ def ard(self, delta): @property def auto_ack(self): """This `int` attribute controls the nRF24L01's automatic - acknowledgment feature during the process of receiving a packet.""" + acknowledgment feature for any or all pipes.""" self._aa = self._reg_read(AUTO_ACK) return self._aa diff --git a/docs/ble_api.rst b/docs/ble_api.rst index 697323b..54c4ace 100644 --- a/docs/ble_api.rst +++ b/docs/ble_api.rst @@ -351,7 +351,7 @@ interrupt_config() .. automethod:: circuitpython_nrf24l01.fake_ble.FakeBLE.interrupt_config() .. warning:: The :py:attr:`circuitpython_nrf24l01.rf24.RF24.irq_df` - attribute (and also this function's ``data_fail`` parameter) is + attribute (and also this function's ``data_fail`` parameter) is not implemented for BLE operations. irq_ds diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 4125787..25530a5 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -79,8 +79,8 @@ payload_length A valid input value must be: - * an `int` in range [1, 32]. Otherwise a `ValueError` exception is thrown. Setting - this attribute to a single `int` configures all 6 data pipes. + * an `int` value that is clamped to the range [1, 32]. Setting this attribute to a + single `int` configures all 6 data pipes. * A `list` or `tuple` containing integers |per_data_pipe_control| If any index's value is ``0``, then the existing setting for the corresponding data pipe will persist (not be changed). diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index 4989c84..bbb95ed 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -99,7 +99,7 @@ version: elif i not in (0x18, 0x19, 0x1a, 0x1b): print(hex(i), "=", hex(nrf._reg_read(i))) * `dynamic_payloads` applies to all pipes, not individual pipes. This attribute will return - a `bool` instead of an `int` + a `bool` instead of an `int`. `set_dynamic_payloads()` and `get_dynamic_payloads()` have been removed. * :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length` applies to all pipes, not individual pipes. `set_payload_length()` and `get_payload_length()` have been removed. * `read_ack()` removed. This is deprecated on next major release anyway; use `recv()` diff --git a/setup.py b/setup.py index d11809d..d672e41 100644 --- a/setup.py +++ b/setup.py @@ -5,67 +5,54 @@ https://github.com/pypa/sampleproject """ -from setuptools import setup, find_packages -# To use a consistent encoding -from codecs import open from os import path +from codecs import open # To use a consistent encoding +from setuptools import setup #, find_packages -here = path.abspath(path.dirname(__file__)) -repo = 'https://github.com/2bndy5/CircuitPython_nRF24L01' + +ROOT_DIR = path.abspath(path.dirname(__file__)) +REPO = "https://github.com/2bndy5/CircuitPython_nRF24L01" # Get the long description from the README file -with open(path.join(here, 'README.rst'), encoding='utf-8') as f: +with open(path.join(ROOT_DIR, "README.rst"), encoding="utf-8") as f: long_description = f.read() setup( - name='circuitpython-nrf24l01', - + name="circuitpython-nrf24l01", use_scm_version=True, - setup_requires=['setuptools_scm'], - - description='Circuitpython driver library for the nRF24L01 transceiver', + setup_requires=["setuptools_scm"], + python_requires='>=3.7', + description="Circuitpython driver library for the nRF24L01 transceiver", long_description=long_description, - long_description_content_type='text/x-rst', - - # Author details - author='Brendan Doherty', - author_email='2bndy5@gmail.com', - - install_requires=[ - 'Adafruit-Blinka', - 'adafruit-circuitpython-busdevice' - ], - - # Choose your license - license='MIT', - + long_description_content_type="text/x-rst", + author="Brendan Doherty", + author_email="2bndy5@gmail.com", + install_requires=["Adafruit-Blinka", "adafruit-circuitpython-busdevice"], + license="MIT", # See https://pypi.python.org/pypi?%3Aaction=list_classifiers classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Intended Audience :: Developers', - 'Topic :: Software Development :: Libraries', - 'Topic :: System :: Hardware', - 'License :: OSI Approved :: MIT License', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "Topic :: Software Development :: Libraries", + "Topic :: System :: Hardware", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", ], - - # What does your project relate to? - keywords='adafruit blinka circuitpython micropython nrf24l01 nRF24L01+' - ' raspberry pi driver radio transceiver', - + keywords="adafruit blinka circuitpython micropython nrf24l01 nRF24L01+" + " raspberry pi driver radio transceiver", # You can just specify the packages manually here if your project is # simple. Or you can use find_packages(). # TODO: IF LIBRARY FILES ARE A PACKAGE FOLDER, # CHANGE `py_modules=['...']` TO `packages=['...']` - packages=['circuitpython_nrf24l01'], - + packages=["circuitpython_nrf24l01"], # Specifiy your homepage URL for your project here - url=repo, - + url=REPO, # Extra links for the sidebar on pypi project_urls={ - 'Documentation': 'http://circuitpython-nrf24l01.rtfd.io', + "Documentation": "http://circuitpython-nrf24l01.rtfd.io", }, - download_url='{}/releases'.format(repo), + download_url="{}/releases".format(REPO), ) From 11a3e3f8d6e9aed62595fb87f309a2021ec64bc0 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 11 Dec 2020 10:29:52 -0800 Subject: [PATCH 034/103] use internal attribute instead of self.ack call --- circuitpython_nrf24l01/rf24.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index fb11860..9020b7e 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -247,7 +247,7 @@ def listen(self, is_rx): self.ce_pin.value = 1 # mandatory pulse is > 130 µs time.sleep(0.00013) else: - if self.ack: + if self._features & 6 == 6 and ((self._aa & self._dyn_pl) & 1): self.flush_tx() if self._aa & 1: self._open_pipes |= 1 From c78bd08836fbe396e9e03294d7288d89bd75868c Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 11 Dec 2020 11:16:21 -0800 Subject: [PATCH 035/103] clamp bad inputs to ard, arc, crc; no exception --- circuitpython_nrf24l01/rf24.py | 21 +++++++-------------- circuitpython_nrf24l01/rf24_lite.py | 13 +++---------- docs/configure_api.rst | 26 ++++++++++++++++++-------- 3 files changed, 28 insertions(+), 32 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 9020b7e..109c8ae 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -48,10 +48,7 @@ class RF24: def __init__(self, spi, csn, ce, spi_frequency=10000000): self._spi = SPIDevice( - spi, - chip_select=csn, - baudrate=spi_frequency, - extra_clocks=8 + spi, chip_select=csn, baudrate=spi_frequency, extra_clocks=8 ) self.ce_pin = ce self.ce_pin.switch_to_output(value=False) # pre-empt standby-I mode @@ -565,8 +562,7 @@ def arc(self): @arc.setter def arc(self, count): - if not 0 <= count <= 15: - raise ValueError("automatic re-transmit count must in range [0, 15]") + count = max(0, min(int(count), 15)) self._retry_setup = (self._retry_setup & 0xF0) | count self._reg_write(SETUP_RETR, self._retry_setup) @@ -581,8 +577,7 @@ def ard(self): @ard.setter def ard(self, delta): - if not 250 <= delta <= 4000: - raise ValueError("automatic re-transmit delay must be in range [250, 4000]") + delta = max(250, min(delta, 4000)) self._retry_setup = (self._retry_setup & 15) | int((delta - 250) / 250) << 4 self._reg_write(SETUP_RETR, self._retry_setup) @@ -718,12 +713,10 @@ def crc(self): @crc.setter def crc(self, length): - if not 0 <= length <= 2: - raise ValueError("CRC byte length must be an int equal to 0 (off), 1, or 2") - if self.crc != length: - length = (length + 1) << 2 if length else 0 - self._config = self._config & 0x73 | length - self._reg_write(0, self._config) + length = min(2, abs(int(length))) + length = (length + 1) << 2 if length else 0 + self._config = self._config & 0x73 | length + self._reg_write(0, self._config) @property def power(self): diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index d3687a2..954070f 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -9,10 +9,7 @@ class RF24: def __init__(self, spi, csn, ce, spi_frequency=10000000): self._spi = SPIDevice( - spi, - chip_select=csn, - baudrate=spi_frequency, - extra_clocks=8 + spi, chip_select=csn, baudrate=spi_frequency, extra_clocks=8 ) self.ce_pin = ce self.ce_pin.switch_to_output(value=False) @@ -20,7 +17,6 @@ def __init__(self, spi, csn, ce, spi_frequency=10000000): self._reg_write(0, 0x0E) if self._reg_read(0) & 3 != 2: raise RuntimeError("nRF24L01 Hardware not responding") - self.power = False self._reg_write(3, 3) self._reg_write(6, 7) self._reg_write(2, 0) @@ -222,9 +218,7 @@ def arc(self): @arc.setter def arc(self, cnt): - if not 0 <= cnt <= 15: - raise ValueError("arc must be in range [0, 15]") - self._reg_write(4, (self._reg_read(4) & 0xF0) | cnt) + self._reg_write(4, (self._reg_read(4) & 0xF0) | max(0, min(int(cnt), 15))) @property def ard(self): @@ -232,8 +226,7 @@ def ard(self): @ard.setter def ard(self, delta): - if not 250 <= delta <= 4000: - raise ValueError("ard must be in range [250, 4000]") + delta = max(250, min(delta, 4000)) self._reg_write(4, (self._reg_read(4) & 0x0F) | int((delta - 250) / 250) << 4) @property diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 25530a5..57103b4 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -207,10 +207,14 @@ arc attribute. If `auto_ack` is disabled on the transmitting nRF24L01's pipe 0, then this attribute is ignored when calling `send()`. - A valid input value must be in range [0, 15]. Otherwise a `ValueError` exception is - thrown. Default is set to 3. A value of ``0`` disables the automatic re-transmit feature, - but the sending nRF24L01 will still wait the number of microseconds specified by `ard` - for an Acknowledgement (ACK) packet response (assuming `auto_ack` is enabled). + A valid input value will be clamped to range [0, 15]. Default is set to 3. A value of + ``0`` disables the automatic re-transmit feature, but the sending nRF24L01 will still + wait the number of microseconds specified by `ard` for an Acknowledgement (ACK) packet + response (assuming `auto_ack` is enabled). + + .. versionchanged:: 1.2.4 + invalid input values are clamped to proper range instead of throwing a `ValueError` + exception. ard ****************************** @@ -220,9 +224,9 @@ ard During this time, the nRF24L01 is listening for the ACK packet. If the `auto_ack` attribute is disabled for pipe 0, then this attribute is not applied. - A valid input value must be in range [250, 4000]. Otherwise a `ValueError` exception is - thrown. Default is 1500 for reliability. If this is set to a value that is not multiple - of 250, then the highest multiple of 250 that is no greater than the input value is used. + A valid input value will be clamped to range [250, 4000]. Default is 1500 for + reliability. If this is set to a value that is not multiple of 250, then the highest + multiple of 250 that is no greater than the input value is used. .. note:: Paraphrased from nRF24L01 specifications sheet: @@ -233,6 +237,9 @@ ard 500µS or more. See `data_rate` attribute on how to set the data rate of the nRF24L01's transmissions. + .. versionchanged:: 1.2.4 + invalid input values are clamped to proper range instead of throwing a `ValueError` + exception. ack ****************************** @@ -324,10 +331,13 @@ crc - ``1`` enables CRC encoding scheme using 1 byte (weak anti-corruption of data) - ``2`` enables CRC encoding scheme using 2 bytes (better anti-corruption of data) - Any invalid input throws a `ValueError` exception. Default is enabled using 2 bytes. + Any invalid input will be clamped to range [0, 2]. Default is enabled using 2 bytes. .. note:: The nRF24L01 automatically enables CRC if automatic acknowledgment feature is enabled (see `auto_ack` attribute) for any data pipe. + .. versionchanged:: 1.2.4 + invalid input values are clamped to proper range instead of throwing a `ValueError` + exception. pa_level ****************************** From 4f4900abf6e3ef9deac5fe5a57c1612038f712db Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 11 Dec 2020 11:55:38 -0800 Subject: [PATCH 036/103] rf24_lite listen flush_tx() upon entering TX mode --- circuitpython_nrf24l01/rf24_lite.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index 954070f..e2dbf21 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -117,6 +117,8 @@ def listen(self, is_rx): self.ce_pin.value = 1 time.sleep(0.00013) else: + if self._reg_read(0x1D) & 6 == 6: + self.flush_tx() self._reg_write(0, self._reg_read(0) & 0xFE | 2) self._reg_write(2, self._reg_read(2) | 1) time.sleep(0.00016) From 13c609b4e0976d6157baf15c9cb8f39a4a4ec88e Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 12 Dec 2020 07:54:05 -0800 Subject: [PATCH 037/103] prepare for 2.0 --- circuitpython_nrf24l01/fake_ble.py | 13 +- circuitpython_nrf24l01/rf24.py | 4 - docs/advanced_api.rst | 12 +- docs/basic_api.rst | 2 +- docs/ble_api.rst | 20 +-- docs/configure_api.rst | 22 +-- docs/examples.rst | 48 ++++-- docs/troubleshooting.rst | 1 - examples/nrf24l01_2arduino_handling_data.py | 159 -------------------- examples/nrf24l01_manual_ack_test.py | 4 +- examples/nrf24l01_multiceiver_test.py | 4 +- examples/nrf24l01_simple_test.py | 4 +- examples/nrf24l01_stream_test.py | 2 +- 13 files changed, 62 insertions(+), 233 deletions(-) delete mode 100644 examples/nrf24l01_2arduino_handling_data.py diff --git a/circuitpython_nrf24l01/fake_ble.py b/circuitpython_nrf24l01/fake_ble.py index 441faaf..a5f8b5f 100644 --- a/circuitpython_nrf24l01/fake_ble.py +++ b/circuitpython_nrf24l01/fake_ble.py @@ -74,7 +74,6 @@ class FakeBLE: def __init__(self, spi, csn, ce, spi_frequency=10000000): self._radio = RF24(spi, csn, ce, spi_frequency=spi_frequency) self._chan = 0 - self._to_android = 0x42 self._show_dbm = False self._ble_name = None self._mac = urandom(6) @@ -99,16 +98,6 @@ def __exit__(self, *exc): self._ble_name = None return self._radio.__exit__() - @property - def to_android(self): - """A `bool` attribute to specify if advertisements should be - compatible with Android smartphones.""" - return self._to_android == 0x42 - - @to_android.setter - def to_android(self, enable): - self._to_android = 0x42 if enable else 0x40 - @property def mac(self): """This attribute returns a 6-byte buffer that is used as the @@ -181,7 +170,7 @@ def _make_payload(self, payload): ) name_length = (len(self.name) + 2) if self.name is not None else 0 pl_size = 9 + len(payload) + name_length + self._show_dbm * 3 - buf = bytes([self._to_android, pl_size]) + self.mac + buf = bytes([0x42, pl_size]) + self.mac buf += chunk(b"\x05", 1) pa_level = b"" if self._show_dbm: diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 109c8ae..d069cbe 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -666,10 +666,6 @@ def load_ack(self, buf, pipe_number): return True return False - def read_ack(self): - """Allows user to read the automatic acknowledgement (ACK) payload (if any).""" - return self.recv() - @property def data_rate(self): """This `int` attribute specifies the nRF24L01's frequency data rate diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index 5e89041..16b0e91 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -120,16 +120,6 @@ load_ack() (TX FIFO buffer) if it can. Use `flush_tx()` to discard unused ACK payloads when done listening. -read_ack() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.read_ack - - This function is an alias of `recv()` and remains for backward compatibility with older - versions of this library. - - .. deprecated:: 1.2.0 - This function will be removed on next major release. Use `recv()` instead. irq_dr ****************************** @@ -380,7 +370,7 @@ flush_rx() .. note:: The nRF24L01 RX FIFO is 3 level stack that holds payload data. This means that there can be up to 3 received payloads (each of a maximum length equal to 32 bytes) - waiting to be read (and removed from the stack) by `recv()` or `read_ack()`. This + waiting to be read (and removed from the stack) by `recv()`. This function clears all 3 levels. flush_tx() diff --git a/docs/basic_api.rst b/docs/basic_api.rst index baba3d9..2ff3432 100644 --- a/docs/basic_api.rst +++ b/docs/basic_api.rst @@ -126,7 +126,7 @@ available() .. versionadded:: 1.0.0-rc1 .. versionchanged:: 1.0.0-rc3 removed due to synonomous behavior with `any()`. - .. versionadded:: 1.2.4 + .. versionadded:: 2.0.0 re-introduced as convenience to simplify using ``nrf.update() and nrf.pipe is not None``. This seemed appropriate since the underlying behavior of `any()` has changed since version 1.0.0 diff --git a/docs/ble_api.rst b/docs/ble_api.rst index 54c4ace..a69bac4 100644 --- a/docs/ble_api.rst +++ b/docs/ble_api.rst @@ -168,22 +168,6 @@ FakeBLE class parameter only applies to the instantiated object and is made persistent via :py:class:`~adafruit_bus_device.spi_device.SPIDevice`. -to_android -************ - -.. autoattribute:: circuitpython_nrf24l01.fake_ble.FakeBLE.to_android - - A value of `True` allows advertisements to be compatible with Android smartphones. Setting - this attribute to `False` still allows advertisements to be compatible with anything else - except Android smartphones. Default Value is `True`. - - .. versionchanged:: 1.2.2 - in versions 1.2.0 & 1.2.1, this attribute was named ``to_iphone`` due to a misconception on the developers' behalf. - .. deprecated:: 1.2.2 - This attribute will be deprecated on the next major release because it is not - necessary to change this attribute. Changing this attribute to `False` only breaks - compatibility with Android smartphones. - mac ************ @@ -252,7 +236,7 @@ len_available() :returns: An `int` representing the length of available bytes for the a single payload. - .. versionchanged:: 1.2.4 + .. versionchanged:: 2.0.0 name changed from "available" to "len_available" to avoid confusion with :py:func:`circuitpython_nrf24l01.rf24.RF24.available()`. This change also allows providing the underlying `RF24` class' @@ -384,7 +368,7 @@ available() .. automethod:: circuitpython_nrf24l01.fake_ble.FakeBLE.available() -.. versionadded:: 1.2.4 +.. versionadded:: 2.0.0 what_happened() #################### diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 57103b4..86050be 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -43,7 +43,7 @@ dynamic_payloads .. versionchanged:: 1.2.0 accepts a list or tuple for control of the dynamic payload feature per pipe. - .. versionchanged:: 1.2.4 + .. versionchanged:: 2.0.0 - returns a integer instead of a boolean - accepts an integer for binary control of the dynamic payload feature per pipe @@ -57,7 +57,7 @@ dynamic_payloads applied to all data pipes. If this parameter is not in range [0, 5], then a `IndexError` exception is thrown. - .. versionadded:: 1.2.4 + .. versionadded:: 2.0.0 .. automethod:: circuitpython_nrf24l01.rf24.RF24.get_dynamic_payloads @@ -103,7 +103,7 @@ payload_length first bug. This led to errors in using other functions that handle payloads or the length of payloads. - .. versionchanged:: 1.2.4 + .. versionchanged:: 2.0.0 this attribute returns the configuration about static payload length for data pipe 0 only. Use `get_payload_length()` to fetch the configuration of the static payload length feature for any data pipe. @@ -121,7 +121,7 @@ payload_length applied to all data pipes. If this parameter is not in range [0, 5], then a `IndexError` exception is thrown. - .. versionadded:: 1.2.4 + .. versionadded:: 2.0.0 .. automethod:: circuitpython_nrf24l01.rf24.RF24.get_payload_length @@ -133,7 +133,7 @@ payload_length `IndexError` exception is thrown. If this parameter is not specified, then the data returned is about data pipe 0. - .. versionadded:: 1.2.4 + .. versionadded:: 2.0.0 auto_ack ****************************** @@ -171,7 +171,7 @@ auto_ack .. versionchanged:: 1.2.0 accepts a list or tuple for control of the automatic acknowledgement feature per pipe. - .. versionchanged:: 1.2.4 + .. versionchanged:: 2.0.0 - returns a integer instead of a boolean - accepts an integer for binary control of the automatic acknowledgement feature @@ -186,7 +186,7 @@ auto_ack applied to all data pipes. If this parameter is not in range [0, 5], then a `IndexError` exception is thrown. - .. versionadded:: 1.2.4 + .. versionadded:: 2.0.0 .. automethod:: circuitpython_nrf24l01.rf24.RF24.get_auto_ack @@ -195,7 +195,7 @@ auto_ack [0, 5], then a `IndexError` exception is thrown. If this parameter is not specified, then the data returned is about data pipe 0. - .. versionadded:: 1.2.4 + .. versionadded:: 2.0.0 arc ****************************** @@ -212,7 +212,7 @@ arc wait the number of microseconds specified by `ard` for an Acknowledgement (ACK) packet response (assuming `auto_ack` is enabled). - .. versionchanged:: 1.2.4 + .. versionchanged:: 2.0.0 invalid input values are clamped to proper range instead of throwing a `ValueError` exception. @@ -237,7 +237,7 @@ ard 500µS or more. See `data_rate` attribute on how to set the data rate of the nRF24L01's transmissions. - .. versionchanged:: 1.2.4 + .. versionchanged:: 2.0.0 invalid input values are clamped to proper range instead of throwing a `ValueError` exception. @@ -335,7 +335,7 @@ crc .. note:: The nRF24L01 automatically enables CRC if automatic acknowledgment feature is enabled (see `auto_ack` attribute) for any data pipe. - .. versionchanged:: 1.2.4 + .. versionchanged:: 2.0.0 invalid input values are clamped to proper range instead of throwing a `ValueError` exception. diff --git a/docs/examples.rst b/docs/examples.rst index 3b7266e..e6909e4 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -4,7 +4,7 @@ nRF24L01 Features Simple test ------------ -.. versionchanged:: 1.2.4 +.. versionchanged:: 2.0.0 - uses 2 addresses on pipes 1 & 0 to demonstrate proper addressing convention. - transmits an incrementing `float` instead of an `int` @@ -18,7 +18,7 @@ Ensure your device works with this simple test. ACK Payloads Example -------------------- -.. versionchanged:: 1.2.4 +.. versionchanged:: 2.0.0 - uses 2 addresses on pipes 1 & 0 to demonstrate proper addressing convention. - changed payloads to show use of c-strings' NULL terminating character. @@ -34,7 +34,7 @@ Multiceiver Example .. versionadded:: 1.2.2 -.. versionchanged:: 1.2.4 +.. versionchanged:: 2.0.0 no longer uses ACK payloads for responding to node 1. @@ -98,7 +98,7 @@ This is a test to show how to use `with` blocks to manage multiple different nRF Manual ACK Example ------------------ -.. versionadded:: 1.2.4 +.. versionadded:: 2.0.0 This is a test to show how to use the library for acknowledgement (ACK) responses without using the automatic ACK packets (like the `ACK Payloads Example `_ does). Beware, that this technique is not faster and can be more prone to communication failure. However, This technique has the advantage of using more updated information in the responding payload as information in ACK payloads are always outdated by 1 transmission. @@ -123,10 +123,40 @@ This is a test to show how to use the nRF24L01 as a BLE advertising beacon using TMRh20's Arduino library ------------------------ -.. versionadded:: 1.1.2 +All examples are designed to work with TMRh20's RF24 library examples. +This Circuitpython library uses dynamic payloads enabled by default. +TMRh20's library uses static payload lengths by default. -This test is meant to prove compatibility with the popular Arduino library for the nRF24L01 by TMRh20 (available for install via the Arduino IDE's Library Manager). The following code has been designed/tested with the TMRh20 library example named `GettingStarted_HandlingData.ino `_. If you changed the ``radioNumber`` variable in the TMRh20 sketch, you will have to adjust the ``radioNumber`` variable this script so that it is opposite the value in the TMRh20 library's example. +To make this circuitpython library compatible with +`TMRh20's RF24 library `_: -.. literalinclude:: ../examples/nrf24l01_2arduino_handling_data.py - :caption: examples/nrf24l01_2arduino_handling_data.py - :linenos: + 1. `dynamic_payloads` to `False`. + 2. set :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length` to the value that + is passed to TMRh20's ``RF24::setPayloadSize()``. 32 is the default (& maximum) + payload length/size for both libraries. + +.. csv-table:: Corresponding examples + :header: circuitpython_nrf24l01, TMRh20 RF24 + + nrf24l01_simple_test, gettingStarted + nrf24l01_ack_payload_test, acknowledgementPayloads + nrf24l01_manual_ack_test, manualAcknowledgements + nrf24l01_multiceiver_test, multiceiverDemo + nrf24l01_stream_test, streamingData + nrf24l01_interrupt_test, interruptConfigure + nrf24l01_context_test, feature is not available in C++ + nrf24l01_fake_ble_test, feature is available via `floe's BTLE library `_ + +.. note:: Each of the Circuitpython examples that are compatible with TMRh20's examples + contain 2 lines of code that are commented out for easy modification. These lines + look like this in the examples' source code: + + .. code-block:: python + + # uncomment the following 2 lines for compatibility with TMRh20 library + # nrf.dynamic_payloads = False + # nrf.payload_length = 4 + + Make sure you understand the amount of memory that different datatypes occupy in C++. + This will help you understand how to configure + :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length`. \ No newline at end of file diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index bbb95ed..7778e60 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -102,7 +102,6 @@ version: a `bool` instead of an `int`. `set_dynamic_payloads()` and `get_dynamic_payloads()` have been removed. * :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length` applies to all pipes, not individual pipes. `set_payload_length()` and `get_payload_length()` have been removed. - * `read_ack()` removed. This is deprecated on next major release anyway; use `recv()` instead. * `load_ack()` is available, but it will not throw exceptions for malformed ``buf`` or invalid ``pipe_number`` parameters. Rather any call to `load_ack()` with invalid diff --git a/examples/nrf24l01_2arduino_handling_data.py b/examples/nrf24l01_2arduino_handling_data.py deleted file mode 100644 index 648a610..0000000 --- a/examples/nrf24l01_2arduino_handling_data.py +++ /dev/null @@ -1,159 +0,0 @@ -""" -Example of library driving the nRF24L01 to communicate with a nRF24L01 driven by -the TMRh20 Arduino library. The Arduino program/sketch that this example was -designed for is named GettingStarted_HandlingData.ino and can be found in the "RF24" -examples after the TMRh20 library is installed from the Arduino Library Manager. -""" -import time -import struct -import board -import digitalio as dio -# if running this on a ATSAMD21 M0 based board -# from circuitpython_nrf24l01.rf24_lite import RF24 -from circuitpython_nrf24l01.rf24 import RF24 - -# addresses needs to be in a buffer protocol object (bytearray) -address = [b"1Node", b"2Node"] - -# change these (digital output) pins accordingly -ce = dio.DigitalInOut(board.D4) -csn = dio.DigitalInOut(board.D5) - -# using board.SPI() automatically selects the MCU's -# available SPI pins, board.SCK, board.MOSI, board.MISO -spi = board.SPI() # init spi bus object - -# initialize the nRF24L01 on the spi bus object -nrf = RF24(spi, csn, ce) -nrf.dynamic_payloads = False # the default in the TMRh20 arduino library - -# set the Power Amplifier level to -12 dBm since this test example is -# usually run with nRF24L01 transceivers in close proximity -nrf.pa_level = -12 - -# change this variable to oppose the corresponding variable in the -# TMRh20 library's GettingStarted_HandlingData.ino example -radioNumber = True - - -# Create a data structure for transmitting and receiving data -# pylint: disable=too-few-public-methods -class DataStruct: - """A data structure to hold transmitted values as the - 'HandlingData' part of the TMRh20 library example""" - time = 0 # in milliseconds (used as start of timer) - value = 1.22 # incremented by 0.01 with every transmission -# pylint: enable=too-few-public-methods - -myData = DataStruct() - - -def master(count=5): # count = 5 will only transmit 5 packets - """Transmits an arbitrary unsigned long value every second""" - # set address of TX node into a RX pipe, and - # set address of RX node into a TX pipe - if radioNumber: - nrf.open_rx_pipe(1, address[0]) - nrf.open_tx_pipe(address[1]) - else: - nrf.open_rx_pipe(1, address[1]) - nrf.open_tx_pipe(address[0]) - nrf.listen = False # ensures the nRF24L01 is in TX mode - while count: - print("Now Sending") - myData.time = int(time.monotonic_ns() / 1000) # start timer - # use struct.pack to packetize your data into a usable payload - # '<' means little endian byte order. - # 'L' means a single 4 byte unsigned long value. - # 'f' means a single 4 byte float value. - buffer = struct.pack(" Date: Sat, 12 Dec 2020 07:57:49 -0800 Subject: [PATCH 038/103] rename recv() to read() --- circuitpython_nrf24l01/rf24.py | 6 +++--- circuitpython_nrf24l01/rf24_lite.py | 6 +++--- docs/advanced_api.rst | 10 +++++----- docs/basic_api.rst | 8 ++++---- docs/configure_api.rst | 4 ++-- docs/examples.rst | 2 +- examples/nrf24l01_ack_payload_test.py | 2 +- examples/nrf24l01_interrupt_test.py | 4 ++-- examples/nrf24l01_manual_ack_test.py | 8 ++++---- examples/nrf24l01_multiceiver_test.py | 4 ++-- examples/nrf24l01_simple_test.py | 2 +- examples/nrf24l01_stream_test.py | 2 +- 12 files changed, 29 insertions(+), 29 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index d069cbe..15c4606 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -267,7 +267,7 @@ def any(self): return self._pl_len[self.pipe] return 0 - def recv(self, length=None): + def read(self, length=None): """This function is used to retrieve the next available payload in the RX FIFO buffer, then clears the `irq_dr` status flag.""" return_size = length if length is not None else self.any() @@ -299,7 +299,7 @@ def send(self, buf, ask_no_ack=False, force_retry=0, send_only=False): if result is None or result: break if self._status & 0x60 == 0x60 and not send_only: - result = self.recv() + result = self.read() return result @property @@ -774,7 +774,7 @@ def resend(self, send_only=False): self.ce_pin.value = 0 result = self.irq_ds if self._status & 0x60 == 0x60 and not send_only: - result = self.recv() + result = self.read() return result def write(self, buf, ask_no_ack=False, write_only=False): diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index e2dbf21..b955e62 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -133,7 +133,7 @@ def any(self): return self._reg_read(0x11 + self.pipe) return 0 - def recv(self, length=None): + def read(self, length=None): ret_size = length if length is not None else self.any() if not ret_size: return None @@ -162,7 +162,7 @@ def send(self, buf, ask_no_ack=False, force_retry=0, send_only=False): if result is None or result: break if self._status & 0x60 == 0x60 and not send_only: - result = self.recv() + result = self.read() return result @property @@ -312,7 +312,7 @@ def resend(self, send_only=False): self.ce_pin.value = 0 result = self.irq_ds if self._status & 0x60 == 0x60 and not send_only: - result = self.recv() + result = self.read() return result def write(self, buf, ask_no_ack=False, write_only=False): diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index 16b0e91..806992b 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -94,7 +94,7 @@ load_ack() This payload will then be appended to the automatic acknowledgment (ACK) packet that is sent when *new* data is received on the specified pipe. See - `recv()` on how to fetch a received custom ACK payloads. + `read()` on how to fetch a received custom ACK payloads. :param bytearray,bytes buf: This will be the data attached to an automatic ACK packet on the incoming transmission about the specified ``pipe_number`` parameter. This must have a @@ -136,7 +136,7 @@ irq_dr .. important:: It is recommended that this flag is only used when the IRQ pin is active. To detirmine if there is a payload in the RX FIFO, use `fifo()`, `any()`, or `pipe`. - Notice that calling `recv()` also resets this status flag. + Notice that calling `read()` also resets this status flag. Pass ``data_recv`` |irq note| @@ -187,7 +187,7 @@ clear_status_flags() .. automethod:: circuitpython_nrf24l01.rf24.RF24.clear_status_flags - Internally, this is automatically called by `send()`, `write()`, `recv()`, and when + Internally, this is automatically called by `send()`, `write()`, `read()`, and when `listen` changes from `False` to `True`. :param bool data_recv: specifies wheather to clear the "RX Data Ready" @@ -279,7 +279,7 @@ resend() `True`. Pass this parameter as `True` if the RX FIFO is not to be manipulated. Many other libraries' behave as though this parameter is `True` (e.g. The popular TMRh20 Arduino RF24 library). This parameter defaults to `False`. - Use `recv()` to get the ACK payload (if there is any) from the RX FIFO. Remember that + Use `read()` to get the ACK payload (if there is any) from the RX FIFO. Remember that the RX FIFO can only hold up to 3 payloads at once. .. note:: The nRF24L01 normally removes a payload from the TX FIFO buffer after successful @@ -370,7 +370,7 @@ flush_rx() .. note:: The nRF24L01 RX FIFO is 3 level stack that holds payload data. This means that there can be up to 3 received payloads (each of a maximum length equal to 32 bytes) - waiting to be read (and removed from the stack) by `recv()`. This + waiting to be read (and removed from the stack) by `read()`. This function clears all 3 levels. flush_tx() diff --git a/docs/basic_api.rst b/docs/basic_api.rst index 2ff3432..036b1aa 100644 --- a/docs/basic_api.rst +++ b/docs/basic_api.rst @@ -100,7 +100,7 @@ listen Standby-I (CE pin is LOW meaning low current & no transmissions) mode which is ideal for post-reception work. Disabing RX mode doesn't flush the RX/TX FIFO buffers, so remember to flush your 3-level FIFO buffers when appropriate using `flush_tx()` or - `flush_rx()` (see also the `recv()` function). + `flush_rx()` (see also the `read()` function). any() ****************** @@ -131,10 +131,10 @@ available() ``nrf.update() and nrf.pipe is not None``. This seemed appropriate since the underlying behavior of `any()` has changed since version 1.0.0 -recv() +read() ****************** -.. automethod:: circuitpython_nrf24l01.rf24.RF24.recv +.. automethod:: circuitpython_nrf24l01.rf24.RF24.read This function can also be used to fetch the last ACK packet's payload if `ack` is enabled. @@ -229,7 +229,7 @@ send() `True`. Pass this parameter as `True` if the RX FIFO is not to be manipulated. Many other libraries' behave as though this parameter is `True` (e.g. The popular TMRh20 Arduino RF24 library). This parameter defaults to `False`. - Use `recv()` to get the ACK payload (if there is any) from the RX FIFO.Remember that + Use `read()` to get the ACK payload (if there is any) from the RX FIFO.Remember that the RX FIFO can only hold up to 3 payloads at once. .. tip:: It is highly recommended that `auto_ack` attribute is enabled (greater than diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 86050be..36b3529 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -285,9 +285,9 @@ interrupt_config() The procedure for handling :py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr` IRQ should be: - 1. retreive the payload from RX FIFO using `recv()` + 1. retreive the payload from RX FIFO using `read()` 2. clear :py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr` status flag (taken care - of by using `recv()` in previous step) + of by using `read()` in previous step) 3. read FIFO_STATUS register to check if there are more payloads available in RX FIFO buffer. A call to `pipe` (may require `update()` to be called beforehand), `any()` or even ``(False, True)`` as parameters to `fifo()` will get this result. diff --git a/docs/examples.rst b/docs/examples.rst index e6909e4..919447d 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -159,4 +159,4 @@ To make this circuitpython library compatible with Make sure you understand the amount of memory that different datatypes occupy in C++. This will help you understand how to configure - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length`. \ No newline at end of file + :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length`. diff --git a/examples/nrf24l01_ack_payload_test.py b/examples/nrf24l01_ack_payload_test.py index d640eac..770f58d 100644 --- a/examples/nrf24l01_ack_payload_test.py +++ b/examples/nrf24l01_ack_payload_test.py @@ -121,7 +121,7 @@ def slave(timeout=6): # grab information about the received payload length, pipe_number = (nrf.any(), nrf.pipe) # retreive the received packet's payload - received = nrf.recv() + received = nrf.read() # increment counter from received payload # received counter is a unsigned byte, thus result[7:8][0] counter[0] = received[7:8][0] + 1 diff --git a/examples/nrf24l01_interrupt_test.py b/examples/nrf24l01_interrupt_test.py index 9fc0aab..659b1bc 100644 --- a/examples/nrf24l01_interrupt_test.py +++ b/examples/nrf24l01_interrupt_test.py @@ -133,7 +133,7 @@ def master(): nrf.flush_tx() # flush artifact payload in TX FIFO from last test # all 3 ACK payloads received were 4 bytes each, and RX FIFO is full # so, fetching 12 bytes from the RX FIFO also flushes RX FIFO - print("\nComplete RX FIFO:", nrf.recv(12)) + print("\nComplete RX FIFO:", nrf.read(12)) def slave(timeout=6): # will listen for 6 seconds before timing out @@ -151,7 +151,7 @@ def slave(timeout=6): # will listen for 6 seconds before timing out if not nrf.fifo(False, True): # if RX FIFO is not empty # all 3 payloads received were 5 bytes each, and RX FIFO is full # so, fetching 15 bytes from the RX FIFO also flushes RX FIFO - print("Complete RX FIFO:", nrf.recv(15)) + print("Complete RX FIFO:", nrf.read(15)) nrf.flush_tx() # discard any pending ACK payloads diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py index f45119c..cf9e758 100644 --- a/examples/nrf24l01_manual_ack_test.py +++ b/examples/nrf24l01_manual_ack_test.py @@ -89,9 +89,9 @@ def master(count=5): # count = 5 will only transmit 5 packets # nrf.pipe is also updated using `nrf.listen = False` print("Received no response.") else: - length = nrf.any() # reset with recv() - pipe_number = nrf.pipe # reset with recv() - received = nrf.recv() # grab the response + length = nrf.any() # reset with read() + pipe_number = nrf.pipe # reset with read() + received = nrf.read() # grab the response # save new counter from response counter[0] = received[7:8][0] print( @@ -116,7 +116,7 @@ def slave(timeout=6): if nrf.available(): length = nrf.any() # grab payload length info pipe = nrf.pipe # grab pipe number info - received = nrf.recv(length) # clears info from any() and nrf.pipe + received = nrf.read(length) # clears info from any() and nrf.pipe # increment counter before sending it back in responding payload counter[0] = received[7:8][0] + 1 nrf.listen = False # put the radio in TX mode diff --git a/examples/nrf24l01_multiceiver_test.py b/examples/nrf24l01_multiceiver_test.py index 2918941..6b0ba27 100644 --- a/examples/nrf24l01_multiceiver_test.py +++ b/examples/nrf24l01_multiceiver_test.py @@ -52,9 +52,9 @@ def base(timeout=10): while time.monotonic() - start_timer < timeout: while not nrf.fifo(False, True): # keep RX FIFO empty for reception # show the pipe number that received the payload - # NOTE recv() clears the pipe number and payload length data + # NOTE read() clears the pipe number and payload length data print("Received", nrf.any(), "on pipe", nrf.pipe, end=" ") - node_id, payload_id = struct.unpack(" Date: Sat, 12 Dec 2020 08:07:59 -0800 Subject: [PATCH 039/103] add set_retries() function --- circuitpython_nrf24l01/rf24.py | 6 ++++++ docs/configure_api.rst | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 15c4606..2710def 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -581,6 +581,12 @@ def ard(self, delta): self._retry_setup = (self._retry_setup & 15) | int((delta - 250) / 250) << 4 self._reg_write(SETUP_RETR, self._retry_setup) + def set_retries(self, delay, count): + """set the `ard` & `arc` attributes with 1 function.""" + delay = int((max(250, min(delay, 4000)) - 250) / 250) << 4 + self._retry_setup = delay | max(0, min(int(count), 15)) + self._reg_write(SETUP_RETR, self._retry_setup) + @property def auto_ack(self): """This `int` attribute controls the nRF24L01's automatic diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 36b3529..b46502b 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -241,6 +241,14 @@ ard invalid input values are clamped to proper range instead of throwing a `ValueError` exception. +set_retries() +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.set_retries + + :param int delay: accepts the same input as the `ard` attribute. + :param int count: accepts the same input as the `arc` attribute. + ack ****************************** From 788beec1e834ca22b56f8d8a60a9c1c87133e5cb Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 12 Dec 2020 08:37:33 -0800 Subject: [PATCH 040/103] add allow_ask_no_ack attribute --- circuitpython_nrf24l01/rf24.py | 12 ++++++++++++ docs/configure_api.rst | 11 ++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 2710def..0ffb5ae 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -672,6 +672,18 @@ def load_ack(self, buf, pipe_number): return True return False + @property + def allow_ask_no_ack(self): + """Allow or disallow the use of ``ask_no_ack`` parameter to `send()` & + `write()`.""" + self._features = self._reg_read(TX_FEATURE) + return bool(self._features & 1) + + @allow_ask_no_ack.setter + def allow_ask_no_ack(self, enable): + self._features = self._features & 6 | bool(enable) + self._reg_write(TX_FEATURE, self._features) + @property def data_rate(self): """This `int` attribute specifies the nRF24L01's frequency data rate diff --git a/docs/configure_api.rst b/docs/configure_api.rst index b46502b..1ae271e 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -244,7 +244,7 @@ ard set_retries() ****************************** -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.set_retries +.. automethod:: circuitpython_nrf24l01.rf24.RF24.set_retries :param int delay: accepts the same input as the `ard` attribute. :param int count: accepts the same input as the `arc` attribute. @@ -269,6 +269,15 @@ ack Disabling this feature does not disable the `auto_ack` and `dynamic_payloads` attributes for any data pipe; they work just fine without this feature. +allow_ask_ack +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.allow_ask_no_ack + + This attribute is enabled by default, and it only exists to provide support for the + Si24R1. The designers of the Si24R1 (a cheap chinese clone of the nRF24L01) happened to + clone a typo from the first version of the nRF24L01 specification sheet. Disable this attribute for the Si24R1. + interrupt_config() ****************************** From 2a89271bf0eac83e94665b332cc4bf14f6988b0a Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 12 Dec 2020 09:56:06 -0800 Subject: [PATCH 041/103] add last_tx_arc attribute --- circuitpython_nrf24l01/rf24.py | 5 +++++ docs/advanced_api.rst | 9 +++++++++ docs/troubleshooting.rst | 5 ++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 0ffb5ae..a5deac2 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -587,6 +587,11 @@ def set_retries(self, delay, count): self._retry_setup = delay | max(0, min(int(count), 15)) self._reg_write(SETUP_RETR, self._retry_setup) + @property + def last_tx_arc(self): + """Return the number of attempts made for last transission (read-only).""" + return self._reg_read(8) & 0x0F + @property def auto_ack(self): """This `int` attribute controls the nRF24L01's automatic diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index 806992b..e0ac5d0 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -452,6 +452,15 @@ address() .. versionadded:: 1.2.0 +last_tx_arc +****************************** + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.last_tx_arc + + This attribute resets to 0 at the beginning of every transmission in TX mode. + Remember that the number of automatic retry attempts made for each transmission is + configured with the `arc` attribute or the `set_retries()` function. + rpd ****************************** diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index 7778e60..18a9a39 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -121,7 +121,10 @@ version: * Cannot switch between different radio configurations using context manager (the `with` blocks). It is advised that only one `RF24` object be instantiated when RAM is limited (less than or equal to 32KB). - + * `last_tx_arc` attribute removed because it is only meant for troubleshooting. + * `allow_ask_no_ack` attribute removed because it is only provided for the Si24R1 + chinese clone. + * `set_retries()` removed. Use `ard` & `arc` attributes instead. Testing nRF24L01+PA+LNA module ================================= From 60af06c52259c70ea1d4ec851a01a316495463ce Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 12 Dec 2020 11:34:55 -0800 Subject: [PATCH 042/103] doc updates + css rule for table captions --- docs/_static/darkness.css | 215 ++++++++++++++++++++++++++++---------- docs/examples.rst | 7 +- 2 files changed, 168 insertions(+), 54 deletions(-) diff --git a/docs/_static/darkness.css b/docs/_static/darkness.css index 6b6ab50..6debb26 100644 --- a/docs/_static/darkness.css +++ b/docs/_static/darkness.css @@ -1,6 +1,6 @@ /* -----------------------------code sections------------------------------ */ .highlight { - background: #202020; + background: #202020; } .highlight .s1 { @@ -56,7 +56,7 @@ } .highlight .o { - color: #fefefe; + color: #fefefe; } .highlight .sd { @@ -104,22 +104,28 @@ td.linenos pre { .wy-table thead, .rst-content table.docutils thead, .rst-content table.field-list thead { - color:#fcfcfc; - text-align:center; - background-color: #1a4228; + color: #fcfcfc; + text-align: center; + background-color: #1a4228; } .wy-table-odd td, .wy-table-striped tr:nth-child(2n-1) td, .rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td { - background-color:#3d3d3d; + background-color: #3d3d3d; } .wy-table-bordered-all td, .rst-content table.docutils td { - border-bottom:1px solid #e1e4e5; - border-left:1px solid #e1e4e5; - text-align: center; + border-bottom: 1px solid #e1e4e5; + border-left: 1px solid #e1e4e5; + text-align: center; +} + +.wy-table caption, +.rst-content table.docutils caption, +.rst-content table.field-list caption { + color: #fff; } /* ------------------------admonition sections------------------------------- */ @@ -150,7 +156,7 @@ td.linenos pre { .rst-content .wy-alert-success.seealso .admonition-title, .rst-content .wy-alert-success.admonition-todo .admonition-title, .rst-content .wy-alert-success.admonition .admonition-title { - background:#05886e; + background: #05886e; } .wy-alert.wy-alert-success, @@ -166,92 +172,171 @@ td.linenos pre { .rst-content .wy-alert-success.seealso, .rst-content .wy-alert-success.admonition-todo, .rst-content .wy-alert-success.admonition { - background: #28443e; -} - -.wy-alert.wy-alert-info .wy-alert-title, .rst-content .note .wy-alert-title, .rst-content .wy-alert-info.attention .wy-alert-title, .rst-content .wy-alert-info.caution .wy-alert-title, .rst-content .wy-alert-info.danger .wy-alert-title, .rst-content .wy-alert-info.error .wy-alert-title, .rst-content .wy-alert-info.hint .wy-alert-title, .rst-content .wy-alert-info.important .wy-alert-title, .rst-content .wy-alert-info.tip .wy-alert-title, .rst-content .wy-alert-info.warning .wy-alert-title, .rst-content .seealso .wy-alert-title, .rst-content .wy-alert-info.admonition-todo .wy-alert-title, .rst-content .wy-alert-info.admonition .wy-alert-title, .wy-alert.wy-alert-info .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-info .admonition-title, .rst-content .note .admonition-title, .rst-content .wy-alert-info.attention .admonition-title, .rst-content .wy-alert-info.caution .admonition-title, .rst-content .wy-alert-info.danger .admonition-title, .rst-content .wy-alert-info.error .admonition-title, .rst-content .wy-alert-info.hint .admonition-title, .rst-content .wy-alert-info.important .admonition-title, .rst-content .wy-alert-info.tip .admonition-title, .rst-content .wy-alert-info.warning .admonition-title, .rst-content .seealso .admonition-title, .rst-content .wy-alert-info.admonition-todo .admonition-title, .rst-content .wy-alert-info.admonition .admonition-title { + background: #28443e; +} + +.wy-alert.wy-alert-info .wy-alert-title, +.rst-content .note .wy-alert-title, +.rst-content .wy-alert-info.attention .wy-alert-title, +.rst-content .wy-alert-info.caution .wy-alert-title, +.rst-content .wy-alert-info.danger .wy-alert-title, +.rst-content .wy-alert-info.error .wy-alert-title, +.rst-content .wy-alert-info.hint .wy-alert-title, +.rst-content .wy-alert-info.important .wy-alert-title, +.rst-content .wy-alert-info.tip .wy-alert-title, +.rst-content .wy-alert-info.warning .wy-alert-title, +.rst-content .seealso .wy-alert-title, +.rst-content .wy-alert-info.admonition-todo .wy-alert-title, +.rst-content .wy-alert-info.admonition .wy-alert-title, +.wy-alert.wy-alert-info .rst-content .admonition-title, +.rst-content .wy-alert.wy-alert-info .admonition-title, +.rst-content .note .admonition-title, +.rst-content .wy-alert-info.attention .admonition-title, +.rst-content .wy-alert-info.caution .admonition-title, +.rst-content .wy-alert-info.danger .admonition-title, +.rst-content .wy-alert-info.error .admonition-title, +.rst-content .wy-alert-info.hint .admonition-title, +.rst-content .wy-alert-info.important .admonition-title, +.rst-content .wy-alert-info.tip .admonition-title, +.rst-content .wy-alert-info.warning .admonition-title, +.rst-content .seealso .admonition-title, +.rst-content .wy-alert-info.admonition-todo .admonition-title, +.rst-content .wy-alert-info.admonition .admonition-title { background: #064873; } -.wy-alert.wy-alert-info, .rst-content .note, .rst-content .wy-alert-info.attention, .rst-content .wy-alert-info.caution, .rst-content .wy-alert-info.danger, .rst-content .wy-alert-info.error, .rst-content .wy-alert-info.hint, .rst-content .wy-alert-info.important, .rst-content .wy-alert-info.tip, .rst-content .wy-alert-info.warning, .rst-content .seealso, .rst-content .wy-alert-info.admonition-todo, .rst-content .wy-alert-info.admonition { +.wy-alert.wy-alert-info, +.rst-content .note, +.rst-content .wy-alert-info.attention, +.rst-content .wy-alert-info.caution, +.rst-content .wy-alert-info.danger, +.rst-content .wy-alert-info.error, +.rst-content .wy-alert-info.hint, +.rst-content .wy-alert-info.important, +.rst-content .wy-alert-info.tip, +.rst-content .wy-alert-info.warning, +.rst-content .seealso, +.rst-content .wy-alert-info.admonition-todo, +.rst-content .wy-alert-info.admonition { background: #2d3d48; } -.wy-alert.wy-alert-warning .wy-alert-title, .rst-content .wy-alert-warning.note .wy-alert-title, .rst-content .attention .wy-alert-title, .rst-content .caution .wy-alert-title, .rst-content .wy-alert-warning.danger .wy-alert-title, .rst-content .wy-alert-warning.error .wy-alert-title, .rst-content .wy-alert-warning.hint .wy-alert-title, .rst-content .wy-alert-warning.important .wy-alert-title, .rst-content .wy-alert-warning.tip .wy-alert-title, .rst-content .warning .wy-alert-title, .rst-content .wy-alert-warning.seealso .wy-alert-title, .rst-content .admonition-todo .wy-alert-title, .rst-content .wy-alert-warning.admonition .wy-alert-title, .wy-alert.wy-alert-warning .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-warning .admonition-title, .rst-content .wy-alert-warning.note .admonition-title, .rst-content .attention .admonition-title, .rst-content .caution .admonition-title, .rst-content .wy-alert-warning.danger .admonition-title, .rst-content .wy-alert-warning.error .admonition-title, .rst-content .wy-alert-warning.hint .admonition-title, .rst-content .wy-alert-warning.important .admonition-title, .rst-content .wy-alert-warning.tip .admonition-title, .rst-content .warning .admonition-title, .rst-content .wy-alert-warning.seealso .admonition-title, .rst-content .admonition-todo .admonition-title, .rst-content .wy-alert-warning.admonition .admonition-title { +.wy-alert.wy-alert-warning .wy-alert-title, +.rst-content .wy-alert-warning.note .wy-alert-title, +.rst-content .attention .wy-alert-title, +.rst-content .caution .wy-alert-title, +.rst-content .wy-alert-warning.danger .wy-alert-title, +.rst-content .wy-alert-warning.error .wy-alert-title, +.rst-content .wy-alert-warning.hint .wy-alert-title, +.rst-content .wy-alert-warning.important .wy-alert-title, +.rst-content .wy-alert-warning.tip .wy-alert-title, +.rst-content .warning .wy-alert-title, +.rst-content .wy-alert-warning.seealso .wy-alert-title, +.rst-content .admonition-todo .wy-alert-title, +.rst-content .wy-alert-warning.admonition .wy-alert-title, +.wy-alert.wy-alert-warning .rst-content .admonition-title, +.rst-content .wy-alert.wy-alert-warning .admonition-title, +.rst-content .wy-alert-warning.note .admonition-title, +.rst-content .attention .admonition-title, +.rst-content .caution .admonition-title, +.rst-content .wy-alert-warning.danger .admonition-title, +.rst-content .wy-alert-warning.error .admonition-title, +.rst-content .wy-alert-warning.hint .admonition-title, +.rst-content .wy-alert-warning.important .admonition-title, +.rst-content .wy-alert-warning.tip .admonition-title, +.rst-content .warning .admonition-title, +.rst-content .wy-alert-warning.seealso .admonition-title, +.rst-content .admonition-todo .admonition-title, +.rst-content .wy-alert-warning.admonition .admonition-title { background: #ed2222; } -.wy-alert.wy-alert-warning, .rst-content .wy-alert-warning.note, .rst-content .attention, .rst-content .caution, .rst-content .wy-alert-warning.danger, .rst-content .wy-alert-warning.error, .rst-content .wy-alert-warning.hint, .rst-content .wy-alert-warning.important, .rst-content .wy-alert-warning.tip, .rst-content .warning, .rst-content .wy-alert-warning.seealso, .rst-content .admonition-todo, .rst-content .wy-alert-warning.admonition { +.wy-alert.wy-alert-warning, +.rst-content .wy-alert-warning.note, +.rst-content .attention, +.rst-content .caution, +.rst-content .wy-alert-warning.danger, +.rst-content .wy-alert-warning.error, +.rst-content .wy-alert-warning.hint, +.rst-content .wy-alert-warning.important, +.rst-content .wy-alert-warning.tip, +.rst-content .warning, +.rst-content .wy-alert-warning.seealso, +.rst-content .admonition-todo, +.rst-content .wy-alert-warning.admonition { background: #490707; } /* -------------------------------------general page styling-------------------------------------------- */ body { - color:#fcfcfc; + color: #fcfcfc; } -.wy-nav-content-wrap, .wy-nav-content { - background:#242424; +.wy-nav-content-wrap, +.wy-nav-content { + background: #242424; } + .btn-neutral { - background-color:#275325 !important; - color:#fff !important; + background-color: #275325 !important; + color: #fff !important; } .btn-neutral:hover { - background-color:#006060 !important; - color:#fffafa + background-color: #006060 !important; + color: #fffafa } .btn-neutral:visited { - color:#fff !important; + color: #fff !important; } /* -------------------------------------sidebar sections------------------------------------------------ */ .wy-side-nav-search { - background-color:#006B09; - color:#fcfcfc; + background-color: #006B09; + color: #fcfcfc; } .wy-side-nav-search input[type=text] { - background: #3e3e3e; - color: #fcfcfc; + background: #3e3e3e; + color: #fcfcfc; } .wy-menu-vertical li.on a, .wy-menu-vertical li.current>a { - color:#fcfcfc; - background:#242424; + color: #fcfcfc; + background: #242424; } .wy-nav-side { - background:#172353; + background: #172353; } .wy-menu-vertical li.on a:hover, .wy-menu-vertical li.current>a:hover { - background:#395c62; + background: #395c62; } .wy-menu-vertical li.on a:hover, .wy-menu-vertical li.current>a:hover { - background:#395c62; + background: #395c62; } .wy-side-nav-search>div.version { - color:rgba(255, 255, 255, 0.69); + color: rgba(255, 255, 255, 0.69); } .wy-menu-vertical header, .wy-menu-vertical p.caption { - color:#43df96; + color: #43df96; } .wy-nav-top { - background:#006B09; + background: #006B09; } -.wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand { +.wy-menu-vertical li.on a span.toctree-expand, +.wy-menu-vertical li.current>a span.toctree-expand { color: #f2f2f2; } @@ -266,27 +351,30 @@ body { .wy-menu-vertical li.toctree-l2 a, .wy-menu-vertical li.toctree-l3 a, .wy-menu-vertical li.toctree-l4 a { - color:#f2f2f2; + color: #f2f2f2; } .wy-menu-vertical li.current a:hover { - background:#3e3e3ecf; + background: #3e3e3ecf; } .wy-menu-vertical li.toctree-l2.current>a { - background:#242424; + background: #242424; } + .wy-menu-vertical li.toctree-l2.current li.toctree-l3>a { - background:#033969; + background: #033969; } /* -----------------------------------------API sections-------------------------------------- */ -.wy-table-bordered-all td, .rst-content table.docutils td { +.wy-table-bordered-all td, +.rst-content table.docutils td { text-align: left; } -.rst-content table.docutils.citation, .rst-content table.docutils.footnote { +.rst-content table.docutils.citation, +.rst-content table.docutils.footnote { color: white; } @@ -295,7 +383,9 @@ body { color: #e5df8e; } -.rst-content tt, .rst-content tt, .rst-content code { +.rst-content tt, +.rst-content tt, +.rst-content code { color: #f3f3f3; } @@ -303,16 +393,25 @@ body { background: #2e363c; } -.rst-content tt.literal, .rst-content tt.literal, .rst-content code.literal { +.rst-content tt.literal, +.rst-content tt.literal, +.rst-content code.literal { color: #16FF00; border-color: #303030; } -code, .rst-content tt, .rst-content code { +code, +.rst-content tt, +.rst-content code { background: #000; } -.rst-content tt.xref, a .rst-content tt, .rst-content tt.xref, .rst-content code.xref, a .rst-content tt, a .rst-content code { +.rst-content tt.xref, +a .rst-content tt, +.rst-content tt.xref, +.rst-content code.xref, +a .rst-content tt, +a .rst-content code { color: #fff; } @@ -333,17 +432,27 @@ code, .rst-content tt, .rst-content code { visibility: visible; } -.rst-content h1:hover .headerlink::after, .rst-content h2:hover .headerlink::after, .rst-content .toctree-wrapper p.caption:hover .headerlink::after, .rst-content h3:hover .headerlink::after, .rst-content h4:hover .headerlink::after, .rst-content h5:hover .headerlink::after, .rst-content h6:hover .headerlink::after, .rst-content dl dt:hover .headerlink::after, .rst-content p.caption:hover .headerlink::after, .rst-content table > caption:hover .headerlink::after, .rst-content .code-block-caption:hover .headerlink::after { +.rst-content h1:hover .headerlink::after, +.rst-content h2:hover .headerlink::after, +.rst-content .toctree-wrapper p.caption:hover .headerlink::after, +.rst-content h3:hover .headerlink::after, +.rst-content h4:hover .headerlink::after, +.rst-content h5:hover .headerlink::after, +.rst-content h6:hover .headerlink::after, +.rst-content dl dt:hover .headerlink::after, +.rst-content p.caption:hover .headerlink::after, +.rst-content table>caption:hover .headerlink::after, +.rst-content .code-block-caption:hover .headerlink::after { color: #29ae5b !important; } html.writer-html4 .rst-content dl:not(.docutils)>dt, html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt { - background: #2e363c; + background: #2e363c; } html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt, html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt { - background:#2e363c; - color:#2980b1; -} + background: #2e363c; + color: #2980b1; +} \ No newline at end of file diff --git a/docs/examples.rst b/docs/examples.rst index 919447d..d275d84 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -130,10 +130,14 @@ TMRh20's library uses static payload lengths by default. To make this circuitpython library compatible with `TMRh20's RF24 library `_: - 1. `dynamic_payloads` to `False`. + 1. set `dynamic_payloads` to `False`. 2. set :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length` to the value that is passed to TMRh20's ``RF24::setPayloadSize()``. 32 is the default (& maximum) payload length/size for both libraries. + 3. set `allow_ask_no_ack` to `False`. + +For completness, TMRh20's RF24 library uses a default value of 15 for the `ard` attribute, +but this Circuitpython library uses a default value of 3. .. csv-table:: Corresponding examples :header: circuitpython_nrf24l01, TMRh20 RF24 @@ -154,6 +158,7 @@ To make this circuitpython library compatible with .. code-block:: python # uncomment the following 2 lines for compatibility with TMRh20 library + # nrf.allow_ask_no_ack = False # nrf.dynamic_payloads = False # nrf.payload_length = 4 From 18a3476d40f73c61bc6c80764f557c9558f10ea6 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 12 Dec 2020 11:41:03 -0800 Subject: [PATCH 043/103] + notes on allow_ask_no_ack for ask_no_ack params --- docs/advanced_api.rst | 4 ++++ docs/basic_api.rst | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index e0ac5d0..3b271af 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -320,6 +320,10 @@ write() this for every payload if the `auto_ack` attribute is disabled, however setting this parameter to `True` will work despite the `auto_ack` attribute's setting. + .. important:: If the `allow_ask_no_ack` attribute is disabled (set to `False`), + then this parameter will have no affect at all. By default the + `allow_ask_no_ack` attribute is enabled. + .. note:: Each transmission is in the form of a packet. This packet contains sections of data around and including the payload. `See Chapter 7.3 in the nRF24L01 Specifications Sheet Date: Sat, 12 Dec 2020 12:24:22 -0800 Subject: [PATCH 044/103] explicit rule for caption text --- docs/_static/darkness.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/_static/darkness.css b/docs/_static/darkness.css index 6debb26..9b872da 100644 --- a/docs/_static/darkness.css +++ b/docs/_static/darkness.css @@ -124,7 +124,8 @@ td.linenos pre { .wy-table caption, .rst-content table.docutils caption, -.rst-content table.field-list caption { +.rst-content table.field-list caption, +.caption-text { color: #fff; } From 335d862b58d74410c488f89388136f091a5fc321 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 12 Dec 2020 12:26:08 -0800 Subject: [PATCH 045/103] oops rf24network seems to be in this branch now --- circuitpython_nrf24l01/rf24_network.py | 250 +++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 circuitpython_nrf24l01/rf24_network.py diff --git a/circuitpython_nrf24l01/rf24_network.py b/circuitpython_nrf24l01/rf24_network.py new file mode 100644 index 0000000..284af70 --- /dev/null +++ b/circuitpython_nrf24l01/rf24_network.py @@ -0,0 +1,250 @@ +# The MIT License (MIT) +# +# Copyright (c) 2020 Brendan Doherty +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +"""rf24 module containing the base class RF24""" +__version__ = "0.0.0-auto.0" +__repo__ = "https://github.com/2bndy5/CircuitPython_nRF24L01.git" +import struct +from micropython import const +from .rf24 import RF24 + +# contraints on user-defined header types +MIN_USER_DEFINED_HEADER_TYPE = const(0) +MAX_USER_DEFINED_HEADER_TYPE = const(127) + + +def _is_address_valid(address): + """Test is a given address is a valid RF24Network node address.""" + byte_count = 0 + while address: + if (not 0 <= (address & 7) < 8) or (byte_count > 5): + return False + address >>= 3 + byte_count += 1 + return True + + +def _pipe_address(node_address, pipe_number): + """translate node address for use on all pipes""" + address_translation = [0xC3, 0x3C, 0x33, 0xCE, 0x3E, 0xE3, 0xEC] + result, count, dec = ([0xCC] * 5, 1, node_address) + while dec: + if pipe_number or not node_address: + result[count] = address_translation[dec % 8] + dec = int(dec / 8) + count += 1 + if pipe_number or not node_address: + result[0] = address_translation[pipe_number] + result[1] = address_translation[count - 1] + return bytearray(result) + + +def _level_to_address(level): + """translate octal tree ``level`` into a node_address""" + level_addr = 0 + if level: + level_addr = 1 << ((level - 1) * 3) + return level_addr + + +# pylint: disable=too-few-public-methods +class NetworkTypes: + """ A collection of constants used to define + `RF24NetworkHeader.message_type` """ + + PING = const(130) + """used for network pings""" + + ADDR_REQUEST = const(195) + """used for requesting data from network base node""" + + ADDR_RESPONSE = const(128) + """used for routing messages and their responses throughout the network""" + + FRAG_FIRST = const(148) + """used to indicate the first frame of fragmented payloads""" + + FRAG_MORE = const(149) + """used to indicate a frame (not first or last) of fragmented payloads""" + + FRAG_LAST = const(150) + """used to indicate the last frame of fragmented payloads""" + + ACK = const(193) + """used internally to forward acknowledgments from payload + target/recipient to payload origin/sender""" + + EXT_DATA = const(131) + """used for bridging different network protocols between an RF24Network + and LAN/WLAN networks (unsupported at this time as this operation requires + a gateway implementation)""" + + +# pylint: enable=too-few-public-methods +class RF24NetworkHeader: + """message header used for routing network messages""" + + def __init__(self, to_node=None, from_node=None, frame_id=0, message_type=None): + self.from_node = from_node #: describe the message origin + self.to_node = to_node #: describe the message destination + self.message_type = message_type #: describe the message type + self.frame_id = frame_id #: describes the unique id for the frame + self.next_id = 0 #: points to the next sequential frame of fragments + + def decode(self, buffer): + """decode frame header for first 9 bytes of the payload.""" + unpacked = struct.unpack("hhhbbh", buffer[:9]) + self.from_node = unpacked[0] + self.to_node = unpacked[1] + self.frame_id = unpacked[2] + self.message_type = unpacked[3] + self.next_id = unpacked[5] + + @property + def buffer(self): + """Return the entire header as a `bytes` object""" + return struct.pack( + "hhhbbh", + self.from_node, + self.to_node, + self.frame_id, + self.message_type, + 0, # reserved for sytem uses + self.next_id, + ) + + +class RF24NetworkFrame: + """contructs a single frame from either a fragmented message of payloads + or a single payload of less than 28 bytes. + + :param RF24NetworkHeader header: The header describing the message's frame + :param bytes,bytearray message: The actual message containing the payload + or a fragment of a payload. + """ + + def __init__(self, header, message): + self._header = header + self._msg = message + + @property + def header(self): + """the RF24NetworkHeader of the message""" + return self._header + + @property + def message(self): + """the entire message or a fragment of the message allocated to this + frame""" + return self._msg + + +class RF24Network: + """ The object used to instantiate the nRF24L01 as a network node. + + :param int node_address: The octal `int` for this node's address + :param int channel: The RF channel used by the RF24Network + """ + + # pylint: disable=too-many-arguments + def __init__(self, spi, csn_pin, ce_pin, node_address, channel=76): + self._radio = RF24(spi, csn_pin, ce_pin) + if not _is_address_valid(node_address): + raise ValueError("node_address argument is invalid or malformed") + # setup node_address + self._node_address = node_address + self._node_mask = 0xFFFF + self._multicast_level = 0 + while self._node_address & self._node_mask: + self._node_mask <<= 3 + self._multicast_level += 1 + self._node_mask = ~self._node_mask + for i in range(6): + self._radio.open_rx_pipe(i, _pipe_address(node_address, i)) + self._radio.channel = channel + self._radio.ack = True + self._radio.arc = 5 + self._radio.ard = (((int(node_address, 8) % 6) + 1) * 2) + 3 + self._radio.listen = True + self._queue = [] # each item is a 2-tuple containing header & message + + # pylint: enable=too-many-arguments + def update(self): + """keep the network layer current; returns the next header""" + while self._radio.pipe: + self._queue.append(self._radio.read()) + self._radio.update() + + def available(self): + """ is there a message for this node """ + pass + + def peek_header(self): + """ return the next payload's header from internal queue + without popping it from the queue """ + return self._queue[0][0] + + def peek_payload(self): + """ return the next payload from internal queue + without popping it from the queue """ + return self._queue[0][1] + + def read(self): + """ return the next payload from internal queue; this differs + from `peek()` as it also pops the payload from the internal + queue. """ + ret = self._queue[0] + del self._queue[0] + return ret + + def write(self, header, message): + """ deliver a message according to the header's information """ + pass + + def _is_descendant(self, node_address): + """is the given node_address a descendant of self._node_address""" + return node_address & self._node_mask == self._node_address + + def _is_direct_child(self, node_address): + """is the given node_address a direct child of self._node_address""" + if self._is_descendant(node_address): + return not node_address & ((~self._node_mask) << 3) + return False + + def _address_of_pipe(self, node_address, pipe_number): + """return the node_address on a specified pipe""" + temp_mask = self._node_mask >> 3 + count_bits = 0 + while temp_mask: + temp_mask >>= 1 + count_bits += 1 + return node_address | (pipe_number << count_bits) + + def _direct_child_route_to(self, node_address): + """return address for a direct child""" + # this pressumes that node_address is a direct child + return node_address & ((self._node_mask << 3) | 0x07) + + def _set_multicast_level(self, level): + """Set the pipe 0 address to according to octal tree level""" + self._multicast_level = level + self._radio.listen = False + self._radio.open_rx_pipe(0, _pipe_address(_level_to_address(level), 0)) From 207bb352ae0f941dcf5acd7e3deb6f32ac8cf32f Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 15 Dec 2020 03:55:42 -0800 Subject: [PATCH 046/103] FakeBLE inherits; new logo; index troubleshooting --- circuitpython_nrf24l01/fake_ble.py | 197 +++++++++++-------- circuitpython_nrf24l01/rf24.py | 69 +++---- circuitpython_nrf24l01/rf24_network.py | 250 ------------------------- docs/_static/Logo.png | Bin 0 -> 10803 bytes docs/_static/Logo.xcf | Bin 0 -> 121426 bytes docs/_static/favicon.ico | Bin 4414 -> 4286 bytes docs/basic_api.rst | 2 +- docs/ble_api.rst | 93 +++------ docs/conf.py | 3 + docs/examples.rst | 3 +- docs/greetings.rst | 10 +- docs/index.rst | 5 + docs/troubleshooting.rst | 193 +++++++++++-------- 13 files changed, 294 insertions(+), 531 deletions(-) delete mode 100644 circuitpython_nrf24l01/rf24_network.py create mode 100644 docs/_static/Logo.png create mode 100644 docs/_static/Logo.xcf diff --git a/circuitpython_nrf24l01/fake_ble.py b/circuitpython_nrf24l01/fake_ble.py index a5f8b5f..ede3410 100644 --- a/circuitpython_nrf24l01/fake_ble.py +++ b/circuitpython_nrf24l01/fake_ble.py @@ -25,6 +25,7 @@ import struct from .rf24 import RF24 + def swap_bits(original): """This function reverses the bit order for a single byte.""" original &= 0xFF @@ -65,38 +66,36 @@ def crc24_ble(data, deg_poly=0x65B, init_val=0x555555): return reverse_bits((crc).to_bytes(3, "big")) -BLE_FREQ = (2, 26, 80) #: The BLE channel number is different from the nRF channel number. +BLE_FREQ = ( + 2, + 26, + 80, +) #: The BLE channel number is different from the nRF channel number. -class FakeBLE: +class FakeBLE(RF24): """A class to implement BLE advertisements using the nRF24L01.""" - def __init__(self, spi, csn, ce, spi_frequency=10000000): - self._radio = RF24(spi, csn, ce, spi_frequency=spi_frequency) - self._chan = 0 + def __init__(self, spi, csn, ce_pin, spi_frequency=10000000): + super().__init__(spi, csn, ce_pin, spi_frequency=spi_frequency) + self._curr_freq = 0 self._show_dbm = False self._ble_name = None self._mac = urandom(6) + self._config = self._config & 3 | 0x10 # disable CRC + # disable auto_ack, dynamic payloads, all TX features, & auto-retry + self._aa, self._dyn_pl, self._features, self._retry_setup = (0,) * 4 + self._addr_len = 4 # use only 4 byte address length + self._tx_address = b"\x71\x91\x7D\x6B" + self._pipe0_read_addr = b"\x71\x91\x7D\x6B" + self._open_pipes = 1 with self: - self._radio.dynamic_payloads = False - self._radio.payload_length = 32 - self._radio.data_rate = 1 - self._radio.arc = 0 - self._radio.address_length = 4 - self._radio.open_rx_pipe(0, b"\x71\x91\x7D\x6B") - self._radio.open_tx_pipe(b"\x71\x91\x7D\x6B") - self._radio.auto_ack = False - self._radio.crc = 0 - self._radio.flush_rx() - - def __enter__(self): - self._radio = self._radio.__enter__() - return self + self.payload_length = 32 def __exit__(self, *exc): self._show_dbm = False self._ble_name = None - return self._radio.__exit__() + return super().__exit__() @property def mac(self): @@ -143,13 +142,13 @@ def show_pa_level(self, enable): def hop_channel(self): """Trigger an automatic change of BLE compliant channels.""" - self._chan += 1 if self._chan < 2 else -2 - self._radio.channel = BLE_FREQ[self._chan] + self._curr_freq += 1 if self._curr_freq < 2 else -2 + self.channel = BLE_FREQ[self._curr_freq] def whiten(self, data): """Whitening the BLE packet data ensures there's no long repeatition of bits.""" - data, coef = (bytearray(data), (self._chan + 37) | 0x40) + data, coef = (bytearray(data), (self._curr_freq + 37) | 0x40) for i, byte in enumerate(data): res, mask = (0, 1) for _ in range(8): @@ -174,7 +173,7 @@ def _make_payload(self, payload): buf += chunk(b"\x05", 1) pa_level = b"" if self._show_dbm: - pa_level = chunk(struct.pack(">b", self._radio.pa_level), 0x0A) + pa_level = chunk(struct.pack(">b", self.pa_level), 0x0A) buf += pa_level if name_length: buf += chunk(self.name, 0x08) @@ -199,89 +198,127 @@ def advertise(self, buf=b"", data_type=0xFF): else: payload = chunk(buf, data_type) if buf else b"" payload = self._make_payload(payload) - self._radio.send(reverse_bits(self.whiten(payload))) - - @property - def pa_level(self): - """See :py:attr:`circuitpython_nrf24l01.rf24.RF24.pa_level`""" - return self._radio.pa_level - - @pa_level.setter - def pa_level(self, value): - self._radio.pa_level = value + self.send(reverse_bits(self.whiten(payload))) @property def channel(self): """The only allowed channels are those contained in the `BLE_FREQ` tuple.""" - return self._radio.channel + return self._channel @channel.setter def channel(self, value): if value not in BLE_FREQ: - raise ValueError( - "nrf channel {} is not a valid BLE frequency".format(value) - ) - self._radio.channel = value + raise ValueError("channel {} is not a valid BLE frequency".format(value)) + self._channel = value + self._reg_write(0x05, value) + # pylint: disable=missing-function-docstring @property - def payload_length(self): - """This attribute is best left at 32 bytes for all BLE - operations.""" - return self._radio.payload_length + def dynamic_payloads(self): + raise NotImplementedError( + "adjusting dynamic_payloads breaks BLE specifications" + ) - @payload_length.setter - def payload_length(self, value): - self._radio.payload_length = value + def set_dynamic_payloads(self, enable, pipe_number=None): + raise NotImplementedError( + "adjusting dynamic_payloads breaks BLE specifications" + ) @property - def power(self): - """See :py:attr:`circuitpython_nrf24l01.rf24.RF24.power`""" - return self._radio.power - - @power.setter - def power(self, is_on): - self._radio.power = is_on + def data_rate(self): + raise NotImplementedError("adjusting data_rate breaks BLE specifications") @property - def is_lna_enabled(self): - """See :py:attr:`circuitpython_nrf24l01.rf24.RF24.is_lna_enabled`""" - return self._radio.is_lna_enabled + def address_length(self): + raise NotImplementedError("adjusting address_length breaks BLE specifications") @property - def is_plus_variant(self): - """See :py:attr:`circuitpython_nrf24l01.rf24.RF24.is_plus_variant`""" - return self._radio.is_plus_variant + def auto_ack(self): + raise NotImplementedError("adjusting auto_ack breaks BLE specifications") - def interrupt_config(self, data_recv=True, data_sent=True): - """See :py:func:`circuitpython_nrf24l01.rf24.RF24.interrupt_config()`""" - self._radio.interrupt_config(data_recv=data_recv, data_sent=data_sent) + def set_auto_ack(self, enable, pipe_number=None): + raise NotImplementedError("adjusting auto_ack breaks BLE specifications") @property - def irq_ds(self): - """See :py:attr:`circuitpython_nrf24l01.rf24.RF24.irq_ds`""" - return self._radio.irq_ds + def ack(self): + raise NotImplementedError("adjusting ack breaks BLE specifications") @property - def irq_dr(self): - """See :py:attr:`circuitpython_nrf24l01.rf24.RF24.irq_dr`""" - return self._radio.irq_dr + def crc(self): + raise NotImplementedError("adjusting crc breaks BLE specifications") - def clear_status_flags(self): - """See :py:func:`circuitpython_nrf24l01.rf24.RF24.clear_status_flags()`""" - self._radio.clear_status_flags() + def open_rx_pipe(self, pipe_number, address): + raise NotImplementedError("BLE implementation only uses 1 address on pipe 0") - def update(self): - """See :py:func:`circuitpython_nrf24l01.rf24.RF24.update()`""" - self._radio.update() - - def available(self): - """See :py:func:`circuitpython_nrf24l01.rf24.RF24.available()`""" - return self._radio.available() + def open_tx_pipe(self, address): + raise NotImplementedError("BLE implentation only uses 1 address") + # pylint: enable=missing-function-docstring def what_happened(self, dump_pipes=False): - """See :py:func:`circuitpython_nrf24l01.rf24.RF24.what_happened()`""" - self._radio.what_happened(dump_pipes=dump_pipes) + """This debuggung function aggregates and outputs all status/condition + related information from the nRF24L01.""" + print("Is a plus variant_________{}".format(self.is_plus_variant)) + print( + "Channel___________________{} ~ {} GHz".format( + self.channel, (self.channel + 2400) / 1000 + ) + ) + print("RF Data Rate______________1 Mbps") + print("RF Power Amplifier________{} dbm".format(self.pa_level)) + print( + "RF Low Noise Amplifier____{}".format( + "Enabled" if self.is_lna_enabled else "Disabled" + ) + ) + print("CRC bytes_________________3") + print("Address length____________4 bytes") + print("TX Payload lengths________{} bytes".format(self.payload_length)) + print("Auto retry delay__________250 microseconds") + print("Auto retry attempts_______0 maximum") + print("Re-use TX FIFO____________{}".format(bool(self._reg_read(0x17) & 64))) + print( + "IRQ on Data Ready__{} Data Ready___________{}".format( + "_Enabled" if not self._config & 0x40 else "Disabled", self.irq_dr + ) + ) + print( + "IRQ on Data Fail___{} Data Failed__________{}".format( + "_Enabled" if not self._config & 0x10 else "Disabled", self.irq_df + ) + ) + print( + "IRQ on Data Sent___{} Data Sent____________{}".format( + "_Enabled" if not self._config & 0x20 else "Disabled", self.irq_ds + ) + ) + print( + "TX FIFO full__________{} TX FIFO empty________{}".format( + "_True" if self.tx_full else "False", self.fifo(True, True) + ) + ) + print( + "RX FIFO full__________{} RX FIFO empty________{}".format( + "_True" if self.fifo(False, False) else "False", self.fifo(False, True) + ) + ) + print( + "Ask no ACK_________{} Custom ACK Payload___Disabled".format( + "_Allowed" if self.allow_ask_no_ack else "Disabled", + ) + ) + print("Dynamic Payloads___Disabled Auto Acknowledgment__Disabled") + print( + "Primary Mode_____________{} Power Mode___________{}".format( + "RX" if self.listen else "TX", + ("Standby-II" if self.ce_pin.value else "Standby-I") + if self._config & 2 + else "Off", + ) + ) + if dump_pipes: + self._dump_pipes() + class ServiceData: """An abstract helper class to package specific service data using diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index a5deac2..6cd681a 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -46,11 +46,11 @@ class RF24: """A driver class for the nRF24L01(+) transceiver radios.""" - def __init__(self, spi, csn, ce, spi_frequency=10000000): + def __init__(self, spi, csn, ce_pin, spi_frequency=10000000): self._spi = SPIDevice( spi, chip_select=csn, baudrate=spi_frequency, extra_clocks=8 ) - self.ce_pin = ce + self.ce_pin = ce_pin self.ce_pin.switch_to_output(value=False) # pre-empt standby-I mode self._status = 0 # status byte returned on all SPI transactions # pre-configure the CONFIGURE register: @@ -84,8 +84,6 @@ def __init__(self, spi, csn, ce, spi_frequency=10000000): # init shadow copy of last RX_ADDR_P0 written to pipe 0 needed as # open_tx_pipe() appropriates pipe 0 for ACK packet self._pipe0_read_addr = None - # init shadow copy of register about FIFO info - self._fifo = 0 # shadow copy of the TX_ADDRESS self._tx_address = self._reg_read_bytes(TX_ADDRESS) # pre-configure the SETUP_RETR register @@ -257,7 +255,6 @@ def available(self): """Returns a bool describing if there is a payload in the RX FIFO""" return self.update() and self.pipe is not None - def any(self): """This function checks if the nRF24L01 has received any data at all, and then reports the next available payload's length (in bytes).""" @@ -385,41 +382,32 @@ def what_happened(self, dump_pipes=False): ) print( "IRQ on Data Ready__{} Data Ready___________{}".format( - "_Enabled" - if not bool(self._config & 0x40) - else "Disabled", - self.irq_dr + "_Enabled" if not self._config & 0x40 else "Disabled", self.irq_dr ) ) print( "IRQ on Data Fail___{} Data Failed__________{}".format( - "_Enabled" - if not bool(self._config & 0x10) - else "Disabled", - self.irq_df + "_Enabled" if not self._config & 0x10 else "Disabled", self.irq_df ) ) print( "IRQ on Data Sent___{} Data Sent____________{}".format( - "_Enabled" - if not bool(self._config & 0x20) - else "Disabled", - self.irq_ds + "_Enabled" if not self._config & 0x20 else "Disabled", self.irq_ds ) ) print( "TX FIFO full__________{} TX FIFO empty________{}".format( - "_True" if bool(self.tx_full) else "False", bool(self.fifo(True, True)) + "_True" if self.tx_full else "False", self.fifo(True, True) ) ) print( "RX FIFO full__________{} RX FIFO empty________{}".format( - "_True" if bool(self._fifo & 2) else "False", bool(self._fifo & 1) + "_True" if self.fifo(False, False) else "False", self.fifo(False, True) ) ) print( "Ask no ACK_________{} Custom ACK Payload___{}".format( - "_Allowed" if bool(self._features & 1) else "Disabled", + "_Allowed" if self._features & 1 else "Disabled", "Enabled" if self.ack else "Disabled", ) ) @@ -429,7 +417,7 @@ def what_happened(self, dump_pipes=False): if self._dyn_pl == 0x3F else ( bin(self._dyn_pl).replace( - "0b", "0b" + "0" * (8 - len(bin(self._dyn_pl))) + "b", "b" + "0" * (8 - len(bin(self._dyn_pl))) ) if self._dyn_pl else "Disabled" @@ -437,7 +425,7 @@ def what_happened(self, dump_pipes=False): "Enabled" if self._aa == 0x3F else ( - bin(self._aa).replace("0b", "0b" + "0" * (8 - len(bin(self._aa)))) + bin(self._aa).replace("b", "b" + "0" * (8 - len(bin(self._aa)))) if self._aa else "Disabled" ), @@ -452,23 +440,20 @@ def what_happened(self, dump_pipes=False): ) ) if dump_pipes: - print("TX address____________", self.address()) - self._open_pipes = self._reg_read(OPEN_PIPES) - for i in range(6): - is_open = self._open_pipes & (1 << i) - print( - "Pipe", - i, - "( open )" if is_open else "(closed)", - "bound:", - self.address(i), + self._dump_pipes() + + def _dump_pipes(self): + print("TX address____________", self.address()) + self._open_pipes = self._reg_read(OPEN_PIPES) + for i in range(6): + is_open = self._open_pipes & (1 << i) + print( + "Pipe {} ({}) bound: {}".format( + i, " open " if is_open else "closed", self.address(i) ) - if is_open: - print( - "\t\texpecting {} byte static payloads".format( - self._reg_read(RX_PL_LENG + i) - ) - ) + ) + if is_open: + print("\t\texpecting", self._pl_len[i], "byte static payloads") @property def is_plus_variant(self): @@ -817,7 +802,7 @@ def write(self, buf, ask_no_ack=False, write_only=False): if len(buf) < self._pl_len[0]: buf += b"\0" * (self._pl_len[0] - len(buf)) elif len(buf) > self._pl_len[0]: - buf = buf[:self._pl_len[0]] + buf = buf[: self._pl_len[0]] if ask_no_ack and self._features & 1 == 0: self._features = self._features & 0xFE | 1 self._reg_write(TX_FEATURE, self._features) @@ -837,10 +822,10 @@ def flush_tx(self): def fifo(self, about_tx=False, check_empty=None): """This provides *some* precision determining the status of the TX/RX FIFO buffers. (read-only)""" - self._fifo, about_tx = (self._reg_read(0x17), bool(about_tx)) + _fifo, about_tx = (self._reg_read(0x17), bool(about_tx)) if check_empty is None: - return (self._fifo & (0x30 if about_tx else 0x03)) >> (4 * about_tx) - return bool(self._fifo & ((2 - bool(check_empty)) << (4 * about_tx))) + return (_fifo & (0x30 if about_tx else 0x03)) >> (4 * about_tx) + return bool(_fifo & ((2 - bool(check_empty)) << (4 * about_tx))) def address(self, index=-1): """Returns the current address set to a specified data pipe or the TX diff --git a/circuitpython_nrf24l01/rf24_network.py b/circuitpython_nrf24l01/rf24_network.py deleted file mode 100644 index 284af70..0000000 --- a/circuitpython_nrf24l01/rf24_network.py +++ /dev/null @@ -1,250 +0,0 @@ -# The MIT License (MIT) -# -# Copyright (c) 2020 Brendan Doherty -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -"""rf24 module containing the base class RF24""" -__version__ = "0.0.0-auto.0" -__repo__ = "https://github.com/2bndy5/CircuitPython_nRF24L01.git" -import struct -from micropython import const -from .rf24 import RF24 - -# contraints on user-defined header types -MIN_USER_DEFINED_HEADER_TYPE = const(0) -MAX_USER_DEFINED_HEADER_TYPE = const(127) - - -def _is_address_valid(address): - """Test is a given address is a valid RF24Network node address.""" - byte_count = 0 - while address: - if (not 0 <= (address & 7) < 8) or (byte_count > 5): - return False - address >>= 3 - byte_count += 1 - return True - - -def _pipe_address(node_address, pipe_number): - """translate node address for use on all pipes""" - address_translation = [0xC3, 0x3C, 0x33, 0xCE, 0x3E, 0xE3, 0xEC] - result, count, dec = ([0xCC] * 5, 1, node_address) - while dec: - if pipe_number or not node_address: - result[count] = address_translation[dec % 8] - dec = int(dec / 8) - count += 1 - if pipe_number or not node_address: - result[0] = address_translation[pipe_number] - result[1] = address_translation[count - 1] - return bytearray(result) - - -def _level_to_address(level): - """translate octal tree ``level`` into a node_address""" - level_addr = 0 - if level: - level_addr = 1 << ((level - 1) * 3) - return level_addr - - -# pylint: disable=too-few-public-methods -class NetworkTypes: - """ A collection of constants used to define - `RF24NetworkHeader.message_type` """ - - PING = const(130) - """used for network pings""" - - ADDR_REQUEST = const(195) - """used for requesting data from network base node""" - - ADDR_RESPONSE = const(128) - """used for routing messages and their responses throughout the network""" - - FRAG_FIRST = const(148) - """used to indicate the first frame of fragmented payloads""" - - FRAG_MORE = const(149) - """used to indicate a frame (not first or last) of fragmented payloads""" - - FRAG_LAST = const(150) - """used to indicate the last frame of fragmented payloads""" - - ACK = const(193) - """used internally to forward acknowledgments from payload - target/recipient to payload origin/sender""" - - EXT_DATA = const(131) - """used for bridging different network protocols between an RF24Network - and LAN/WLAN networks (unsupported at this time as this operation requires - a gateway implementation)""" - - -# pylint: enable=too-few-public-methods -class RF24NetworkHeader: - """message header used for routing network messages""" - - def __init__(self, to_node=None, from_node=None, frame_id=0, message_type=None): - self.from_node = from_node #: describe the message origin - self.to_node = to_node #: describe the message destination - self.message_type = message_type #: describe the message type - self.frame_id = frame_id #: describes the unique id for the frame - self.next_id = 0 #: points to the next sequential frame of fragments - - def decode(self, buffer): - """decode frame header for first 9 bytes of the payload.""" - unpacked = struct.unpack("hhhbbh", buffer[:9]) - self.from_node = unpacked[0] - self.to_node = unpacked[1] - self.frame_id = unpacked[2] - self.message_type = unpacked[3] - self.next_id = unpacked[5] - - @property - def buffer(self): - """Return the entire header as a `bytes` object""" - return struct.pack( - "hhhbbh", - self.from_node, - self.to_node, - self.frame_id, - self.message_type, - 0, # reserved for sytem uses - self.next_id, - ) - - -class RF24NetworkFrame: - """contructs a single frame from either a fragmented message of payloads - or a single payload of less than 28 bytes. - - :param RF24NetworkHeader header: The header describing the message's frame - :param bytes,bytearray message: The actual message containing the payload - or a fragment of a payload. - """ - - def __init__(self, header, message): - self._header = header - self._msg = message - - @property - def header(self): - """the RF24NetworkHeader of the message""" - return self._header - - @property - def message(self): - """the entire message or a fragment of the message allocated to this - frame""" - return self._msg - - -class RF24Network: - """ The object used to instantiate the nRF24L01 as a network node. - - :param int node_address: The octal `int` for this node's address - :param int channel: The RF channel used by the RF24Network - """ - - # pylint: disable=too-many-arguments - def __init__(self, spi, csn_pin, ce_pin, node_address, channel=76): - self._radio = RF24(spi, csn_pin, ce_pin) - if not _is_address_valid(node_address): - raise ValueError("node_address argument is invalid or malformed") - # setup node_address - self._node_address = node_address - self._node_mask = 0xFFFF - self._multicast_level = 0 - while self._node_address & self._node_mask: - self._node_mask <<= 3 - self._multicast_level += 1 - self._node_mask = ~self._node_mask - for i in range(6): - self._radio.open_rx_pipe(i, _pipe_address(node_address, i)) - self._radio.channel = channel - self._radio.ack = True - self._radio.arc = 5 - self._radio.ard = (((int(node_address, 8) % 6) + 1) * 2) + 3 - self._radio.listen = True - self._queue = [] # each item is a 2-tuple containing header & message - - # pylint: enable=too-many-arguments - def update(self): - """keep the network layer current; returns the next header""" - while self._radio.pipe: - self._queue.append(self._radio.read()) - self._radio.update() - - def available(self): - """ is there a message for this node """ - pass - - def peek_header(self): - """ return the next payload's header from internal queue - without popping it from the queue """ - return self._queue[0][0] - - def peek_payload(self): - """ return the next payload from internal queue - without popping it from the queue """ - return self._queue[0][1] - - def read(self): - """ return the next payload from internal queue; this differs - from `peek()` as it also pops the payload from the internal - queue. """ - ret = self._queue[0] - del self._queue[0] - return ret - - def write(self, header, message): - """ deliver a message according to the header's information """ - pass - - def _is_descendant(self, node_address): - """is the given node_address a descendant of self._node_address""" - return node_address & self._node_mask == self._node_address - - def _is_direct_child(self, node_address): - """is the given node_address a direct child of self._node_address""" - if self._is_descendant(node_address): - return not node_address & ((~self._node_mask) << 3) - return False - - def _address_of_pipe(self, node_address, pipe_number): - """return the node_address on a specified pipe""" - temp_mask = self._node_mask >> 3 - count_bits = 0 - while temp_mask: - temp_mask >>= 1 - count_bits += 1 - return node_address | (pipe_number << count_bits) - - def _direct_child_route_to(self, node_address): - """return address for a direct child""" - # this pressumes that node_address is a direct child - return node_address & ((self._node_mask << 3) | 0x07) - - def _set_multicast_level(self, level): - """Set the pipe 0 address to according to octal tree level""" - self._multicast_level = level - self._radio.listen = False - self._radio.open_rx_pipe(0, _pipe_address(_level_to_address(level), 0)) diff --git a/docs/_static/Logo.png b/docs/_static/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b20f4b60f0ae25ffd3b5bb421fa9d16ae4792ead GIT binary patch literal 10803 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 literal 0 HcmV?d00001 diff --git a/docs/_static/Logo.xcf b/docs/_static/Logo.xcf new file mode 100644 index 0000000000000000000000000000000000000000..8fcd2a0542bc8b08575c0c5a6dab31ccb5fe00f5 GIT binary patch literal 121426 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 O|NCWOvu_IlWdA>V4k_&b literal 0 HcmV?d00001 diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico index 5aca98376a1f7e593ebd9cf41a808512c2135635..c15a1650af557d6ec815ebd7c0b5dbf5cc080676 100644 GIT binary patch literal 4286 zcmc(iTT@%t8HTmbTLO|^B{RuQF8dF1+sS`u|3GnV5NCurSYW$$;sBD+2}$S-;$VR> z*!ajn#&(=Z-R9)9?o6jMz3hMR?3p+3S{oE}NPB1FS+=ab*Lv3Xt?zxmg~y}t&nKUF z#NVEqzwvlJ@OV7G<=|JI-*JfVf9*%_oqePG=NxOG=-7*E4&Qs5*y0{Sc65_ zxlNG&Hiskmy>qbo^6(~C-zHnIT>f|pwm%O$@s9XCv#@)!u;VN5EPkUm0$=F}T^rw^ ztNIsoZoNdu_Fv(<{|df4-@&){J-iQofcMdlu=iiVKKcpP@jqZae+~1+KVf~%!O!A5 z@ytGW<-WVeIh-rj=-By|YyM5H-Bo=lSZ@9qKkEQ`ZwR`70s5r^^noa}p%}E`IJD6O zw6P@AiyYU=P^VH*gJ~!;87Nmct}Q{ip5@57|DQ?A=kmRYMLACka1F7}bP?KMOs=o@ zM;+=_PX@TIokOW%Sw zvkmXkHtg(e>T(BmVHb9B7gqTWtd+a4Dtj>3?!nyPsNRRU^}rqC^G%NRd$3mdPLc15 zIVH{)Yvj3B?l#xv$ZR{pdzb@w&o9CE4(d;vNQ)ehpM^JGdF%DB`R85!g*N;TKZNI_ zkN)@g_+xlfwQ=A7Z_ep+`j6H(?=T0jdvXo&E1!Of_iO*6MqZ+mTItxL79YQcZ@#%bpF{=GSp2O#yGWf zeG{tOLlpYlohJS?w5=EPfkpDk{E|AIt3r$3fp%q?{20{HD6H_~6Mo3iE-t$Lr-}bw z_9^`+Og~tHcc%tBwGK0}0c-s(%=n&MOaF2gdh~4kA#YnIhK68uM8{R#LpfxpY+Dh z+wj+(F@EwlUo`T=cxif5P|rOD%lw68WPs7}svM z#ILWCe}(+DC$0R%BbT2zkms)sh9%z|DuMT}Mt+*}d&2PcH1W@M!^>yd2>DmHTlp(b zpNB>59b*6g9nA0mG+#9l*2tQ|iD?}cJx{DPl4;a_gUFCRu zWD*AX+T^sOlFuB#94*WGKE3~)p1*M+1mAh`WBGb+RPud`HTppm=FF{@_>JNd>Ym!; zeWJPkv<&NSiu}xx8~-r*!K~D_&{qSWXDs=DDzx&GNAxA~gVa`2{Tq4mZ?IPv4qN%z z1E`l4VPtDAe2Ja_E zj$T0jQ)jY{Ivjy#wjQqg`n3Lou8uf21kx#$XmfG-(hw^NU!U=zr z@sE%{u|obvL;kyj|I&Ya=jaX1@kdYi4MCCGTBh4PRd*G;oA7EbCm-WjP*UV5e){wX-s{!`du_%ma8@`Btwsg{)*Btd)N$i0=nYm#ds>5Oa%ew~qyEe{! z_VI2q%(F?A>v2dH{UK;m8F@bt9!f8B=ZhX6Ab+6^zarvKLJ7v9d{JLbCpQx%!9SJ6*+RygSpod4H6581`|My-fOPFvIm? ij#+u`=)qupp7^Zoy>yf-DMy)(JIbZl8`j1<{rMRY83?oh literal 4414 zcmd^BX;4#F6n=SG-XmlONeGrD5E6J{RVh+e928U#MG!$jWvO+UsvWh`x&VqGNx*en zx=qox7Dqv{kPwo%fZC$dDwVpRtz{HzTkSs8QhG0)%Y=-3@Kt!4ag|JcIo?$-F|?bXVS9UDUyev>MVZQ(H8K4#;BQW-t2CPorj8^KJrMX}QK zp+e<;4ldpXz~=)2GxNy811&)gt-}Q*yVQpsxr@VMoA##{)$1~=bZ1MmjeFw?uT(`8 z^g=09<=zW%r%buwN%iHtuKSg|+r7HkT0PYN*_u9k1;^Ss-Z!RBfJ?Un4w(awqp2b3 z%+myoFis_lTlCrGx2z$0BQdh+7?!JK#9K9@Z!VrG zNj6gK5r(b4?YDOLw|DPRoN7bdP{(>GEG41YcN~4r_SUHU2hgVtUwZG@s%edC;k7Sn zC)RvEnlq~raE2mY2ko64^m1KQL}3riixh?#J{o)IT+K-RdHae2eRX91-+g!y`8^># z-zI0ir>P%Xon)!@xp-BK2bDYUB9k613NRrY6%lVjbFcQc*pRqiK~8xtkNPLxt}e?&QsTB}^!39t_%Qb)~Ukn0O%iC;zt z<&A-y;3h++)>c1br`5VFM~5(83!HKx$L+my8sW_c#@x*|*vB1yU)_dt3vH;2hqPWx zAl^6@?ipx&U7pf`a*>Yq6C85nb+B=Fnn+(id$W#WB^uHAcZVG`qg;rWB}ubvi(Y>D z$ei>REw$#xp0SHAd^|1hq&9HJ=jKK8^zTH~nk)G?yUcmTh9vUM6Y0LMw4(gYVY$D$ zGl&WY&H<)BbJ&3sYbKjx1j^=3-0Q#f^}(aP1?8^`&FUWMp|rmtpK)bLQ1Zo?^s4jqK=Lfg*9&geMGVQ z#^-*!V`fG@;H&{M9S8%+;|h&Qrxym0Ar>WT4BCVLR8cGXF=JmEYN(sNT(9vl+S|%g z8r7nXQ(95i^`=+XHo|){$vf2$?=`F$^&wFlYXyXg$B{a>$-Fp+V}+D;9k=~Xl~?C4 zAB-;RKXdUzBJE{V&d&%R>aEfFe;vxqI$0@hwVM}gFeQR@j}a>DDxR+n+-*6|_)k%% z*mSpDV|=5I9!&VC&9tD%fcVygWZV!iIo2qFtm#!*(s|@ZT33*Ad;+<|3^+yrp*;oH zBSYLV(H1zTU?2WjrCQoQW)Z>J2a=dTriuvezBmu16`tM2fm7Q@d4^iqII-xFpwHGI zn9CL}QE*1vdj2PX{PIuqOe5dracsciH6OlAZATvE8rj6ykqdIjal2 z0S0S~PwHb-5?OQ-tU-^KTG@XNrEVSvo|HIP?H;7ZhYeZkhSqh-{reE!5di;1zk$#Y zCe7rOnlzFYJ6Z#Hm$GoidKB=2HBCwm`BbZVeZY4ukmG%1uz7p2URs6c9j-Gjj^oQV zsdDb3@k2e`C$1I5ML5U0Qs0C1GAp^?!*`=|Nm(vWz3j*j*8ucum2;r0^-6Aca=Gv) zc%}&;!+_*S2tlnnJnz0EKeRmw-Y!@9ob!XQBwiv}^u9MkaXHvM=!<3YX;+2#5Cj5pp?FEK750S3BgeSDtaE^ zXUM@xoV6yBFKfzvY20V&Lr0yC`_) + :py:meth:`~circuitpython_nrf24l01.rf24.RF24.send()` function and try out the + `Stream example `_) * Context manager compatible for easily switching between different radio configurations using `with` blocks (not available in ``rf24_lite.py`` version) * Configure the interrupt (IRQ) pin to trigger (active low) on received, sent, and/or failed transmissions (these 3 events control 1 IRQ pin). There's also virtual - representations of these interrupt events available (see - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr`, - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_ds`, & `irq_df` attributes) + representations of these interrupt events available (see `irq_dr`, `irq_ds`, & `irq_df` attributes) * Invoke sleep mode (AKA power down mode) for ultra-low current consumption * cyclic redundancy checking (CRC) up to 2 bytes long * Adjust the nRF24L01's builtin automatic re-transmit feature's parameters (`arc`: number diff --git a/docs/index.rst b/docs/index.rst index 6b9304a..c792e4f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -38,6 +38,11 @@ Table of Contents ble_api +.. toctree:: + :caption: Network API Reference + + network_api + .. toctree:: :caption: Store Links diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index 18a9a39..e42ecf9 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -2,27 +2,25 @@ Troubleshooting info ==================== -.. important:: The nRF24L01 has 3 key features that can be interdependent of each other. Their - priority of dependence is as follows: - - 1. `auto_ack` feature provides transmission verification by using the RX nRF24L01 to - automatically and imediatedly send an acknowledgment (ACK) packet in response to - received payloads. `auto_ack` does not require `dynamic_payloads` to be enabled. - 2. `dynamic_payloads` feature allows either TX/RX nRF24L01 to be able to send/receive - payloads with their size written into the payloads' packet. With this disabled, both - RX/TX nRF24L01 must use matching - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length` attributes. For - `dynamic_payloads` to be enabled, the `auto_ack` feature must be enabled. Although, - the `auto_ack` feature can be used when the `dynamic_payloads` feature is disabled. - 3. `ack` feature allows the MCU to append a payload to the ACK packet, thus instant - bi-directional communication. A transmitting ACK payload must be loaded into the - nRF24L01's TX FIFO buffer (done using `load_ack()`) BEFORE receiving the payload that - is to be acknowledged. Once transmitted, the payload is released from the TX FIFO - buffer. This feature requires the `auto_ack` and `dynamic_payloads` features enabled. - -Remeber that the nRF24L01's FIFO (first-in,first-out) buffer has 3 levels. This means that -there can be up to 3 payloads waiting to be read (RX) and up to 3 payloads waiting to be -transmit (TX). +Attribute dependency +******************** + +The nRF24L01 has 3 key features that can be interdependent of each other. Their +priority of dependence is as follows: + +1. `auto_ack` feature provides transmission verification by using the RX nRF24L01 to + automatically and imediatedly send an acknowledgment (ACK) packet in response to + received payloads. `auto_ack` does not require `dynamic_payloads` to be enabled. +2. `dynamic_payloads` feature allows either TX/RX nRF24L01 to be able to send/receive + payloads with their size written into the payloads' packet. With this disabled, both + RX/TX nRF24L01 must use matching `payload_length` attributes. For `dynamic_payloads` + to be enabled, the `auto_ack` feature must be enabled. Although, the `auto_ack` + feature can be used when the `dynamic_payloads` feature is disabled. +3. `ack` feature allows the MCU to append a payload to the ACK packet, thus instant + bi-directional communication. A transmitting ACK payload must be loaded into the + nRF24L01's TX FIFO buffer (done using `load_ack()`) BEFORE receiving the payload that + is to be acknowledged. Once transmitted, the payload is released from the TX FIFO + buffer. This feature requires the `auto_ack` and `dynamic_payloads` features enabled. With the `auto_ack` feature enabled, you get: @@ -30,47 +28,79 @@ With the `auto_ack` feature enabled, you get: * to change amount of automatic re-transmit attempts and the delay time between them. See the `arc` and `ard` attributes. -.. note:: A word on pipes vs addresses vs channels. - - You should think of the data pipes as a "parking spot" for your payload. There are only six - data pipes on the nRF24L01, thus it can simultaneously "listen" to a maximum of 6 other - nRF24L01 radios. However, it can only "talk" to 1 other nRF24L01 at a time). - - The specified address is not the address of an nRF24L01 radio, rather it is more like a - path that connects the endpoints. When assigning addresses to a data pipe, you can use any - 5 byte long address you can think of (as long as the first byte is unique among - simultaneously broadcasting addresses), so you're not limited to communicating with only - the same 6 nRF24L01 radios. - - Finnaly, the radio's channel is not be confused with the radio's pipes. Channel selection - is a way of specifying a certain radio frequency (frequency = [2400 + channel] MHz). - Channel defaults to 76 (like the arduino library), but options range from 0 to 125 -- - that's 2.4 GHz to 2.525 GHz. The channel can be tweaked to find a less occupied frequency - amongst Bluetooth, WiFi, or other ambient signals that use the same spectrum of - frequencies. - -.. warning:: - For successful transmissions, most of the endpoint trasceivers' settings/features must - match. These settings/features include: - - * The RX pipe's address on the receiving nRF24L01 (passed to `open_rx_pipe()`) MUST match - the TX pipe's address on the transmitting nRF24L01 (passed to `open_tx_pipe()`) - * `address_length` - * :py:attr:`~circuitpython_nrf24l01.rf24.RF24.channel` - * :py:attr:`~circuitpython_nrf24l01.rf24.RF24.data_rate` - * `dynamic_payloads` - * :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length` only when `dynamic_payloads` - is disabled - * `auto_ack` on the recieving nRF24L01 must be enabled if `arc` is greater than 0 on the - transmitting nRF24L01 - * custom `ack` payloads - * `crc` - - In fact the only attributes that aren't required to match on both endpoint transceivers - would be the identifying data pipe number (passed to `open_rx_pipe()` or `load_ack()`), - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.pa_level`, `arc`, & `ard` attributes. The - ``ask_no_ack`` feature can be used despite the settings/features configuration (see - `send()` & `write()` function parameters for more details). +FIFO Capacity +************* + +Remeber that the nRF24L01's FIFO (First-In, First-Out) buffers have 3 levels. This means that +there can be up to 3 payloads waiting to be read (RX) and up to 3 payloads waiting to be +transmit (TX). Notice there are seperate FIFO buffers sending & receiving (respectively mentioned +in this documentation as TX FIFO & RX FIFO). + +Pipes vs Addresses vs Channels +****************************** + +.. hint:: Please review the `Multiceiver example `_ as a + demonstration of proper addressing using all pipes (on the same channel). + +Pipes +----- + +You should think of the data pipes as a "parking spot" for your payload. There are only six +data pipes on the nRF24L01, thus it can simultaneously "listen" to a maximum of 6 other +nRF24L01 radios. However, it can only "talk" to 1 other nRF24L01 at a time). + +Addresses +--------- + +The specified address is not the address of an nRF24L01 radio, rather it is more like a +path that connects the endpoints. When assigning addresses to a data pipe, you can use any +5 byte long address you can think of (as long as the first byte is unique among +simultaneously broadcasting addresses), so you're not limited to communicating with only +the same 6 nRF24L01 radios. + +Channels +-------- + +Finnaly, the radio's channel is not be confused with the radio's pipes. Channel selection +is a way of specifying a certain radio frequency (frequency = [2400 + channel] MHz). +Channel defaults to 76 (like the arduino library), but options range from 0 to 125 -- +that's 2.4 GHz to 2.525 GHz. The channel can be tweaked to find a less occupied frequency +amongst Bluetooth, WiFi, or other ambient signals that use the same spectrum of +frequencies. + +Settings that must Match +************************ + +For successful transmissions, most of the endpoint trasceivers' settings/features must +match. These settings/features include: + +* The RX pipe's address on the receiving nRF24L01 (passed to `open_rx_pipe()`) MUST match + the TX pipe's address on the transmitting nRF24L01 (passed to `open_tx_pipe()`) +* `address_length` +* :py:attr:`~circuitpython_nrf24l01.rf24.RF24.channel` +* `data_rate` +* `dynamic_payloads` +* `payload_length` only when `dynamic_payloads` is disabled +* `auto_ack` on the recieving nRF24L01 must be enabled if `arc` is greater than 0 on the + transmitting nRF24L01 +* custom `ack` payloads +* `crc` + +Settings that do not need to Match +---------------------------------- + +In fact the only attributes that aren't required to match on both endpoint transceivers +would be + +* the identifying data pipe number passed to `open_rx_pipe()` or `load_ack()` (as long as the + corresponding addresses match) +* `pa_level` +* `arc` +* `ard` + +The ``ask_no_ack`` feature can be used despite the +settings/features configuration (see :py:meth:`~circuitpython_nrf24l01.rf24.RF24.send()` & +`write()` function parameters for more details). About the lite version ====================== @@ -83,11 +113,11 @@ boards using the ATSAMD21 M0). The following functionality has been removed from version: * The `FakeBLE` class is not compatible with the ``rf24_lite.py`` module. - * :py:attr:`~circuitpython_nrf24l01.rf24.RF24.is_plus_variant` is removed, meaning the + * `is_plus_variant` is removed, meaning the lite version is not compatibility with the older non-plus variants of the nRF24L01. * `address()` removed. - * :py:func:`~circuitpython_nrf24l01.rf24.RF24.what_happened()` removed. However you can - use the following function to dump all available registers' values (for advanced users): + * `what_happened()` removed. However you can use the following function to dump all available + registers' values (for advanced users): .. code-block:: python @@ -99,21 +129,19 @@ version: elif i not in (0x18, 0x19, 0x1a, 0x1b): print(hex(i), "=", hex(nrf._reg_read(i))) * `dynamic_payloads` applies to all pipes, not individual pipes. This attribute will return - a `bool` instead of an `int`. `set_dynamic_payloads()` and `get_dynamic_payloads()` have been removed. - * :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length` applies to all pipes, not - individual pipes. `set_payload_length()` and `get_payload_length()` have been removed. - instead. + a `bool` instead of an `int`. `set_dynamic_payloads()` and `get_dynamic_payloads()` have + been removed. + * `payload_length` applies to all pipes, not individual pipes. `set_payload_length()` and + `get_payload_length()` have been removed. * `load_ack()` is available, but it will not throw exceptions for malformed ``buf`` or invalid ``pipe_number`` parameters. Rather any call to `load_ack()` with invalid parameters will have no affect on the TX FIFO. * `crc` removed. 2-bytes encoding scheme (CRC16) is always enabled. * `auto_ack` removed. This is always enabled for all pipes. Pass ``ask_no_ack`` parameter - as `True` to `send()` or `write()` to disable automatic acknowledgement for TX - operations. - * :py:attr:`~circuitpython_nrf24l01.rf24.RF24.is_lna_enabled` removed as it only affects - non-plus variants of the nRF24L01. - * :py:attr:`~circuitpython_nrf24l01.rf24.RF24.pa_level` is available, but it will not - accept a `list` or `tuple`. + as `True` to :py:meth:`~circuitpython_nrf24l01.rf24.RF24.send()` or `write()` to disable + automatic acknowledgement for TX operations. + * `is_lna_enabled` removed as it only affects non-plus variants of the nRF24L01. + * `pa_level` is available, but it will not accept a `list` or `tuple`. * `rpd`, `start_carrier_wave()`, & `stop_carrier_wave()` removed. These only perform a test of the nRF24L01's hardware. * All comments and docstrings removed, meaning ``help()`` will not provide any specific @@ -158,8 +186,8 @@ Results (ordered by :py:attr:`~circuitpython_nrf24l01.rf24.RF24.pa_level` settin successfully transmit in the ack example. I should note that without shielding the PA/LNA module and using the L4931 3V regulator, - no TX transmissions got sent (including ACK packets for the - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.auto-ack` feature). + no TX transmissions got sent (including ACK packets for the `auto_ack` feature). + Conclusion ********************************* @@ -167,9 +195,8 @@ Conclusion The PA/LNA modules seem to require quite a bit more power to transmit. The L4931 regulator that I used in the tests boasts a 300 mA current limit and a typical current of 250 mA. While the ItsyBitsy M4 boasts a 500 mA max, it would seem that much of that is consumed - internally. Since playing with the :py:attr:`~circuitpython_nrf24l01.rf24.RF24.pa_level` - is a current saving hack (as noted in the datasheet), I can only imagine that a higher power - 3V regulator may enable sending transmissions (including ACK packets -- with or without ACK - payloads attached) from PA/LNA modules using higher - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.pa_level` settings. More testing is called for, - but I don't have an oscilloscope to measure the peak current draws. + internally. Since playing with the `pa_level` is a current saving hack (as noted in the + datasheet), I can only imagine that a higher power 3V regulator may enable sending + transmissions (including ACK packets -- with or without ACK payloads attached) from PA/LNA + modules using higher `pa_level` settings. More testing is called for, but I don't have an + oscilloscope to measure the peak current draws. From dd7a1e79b954965b25148f7ba3ef69211a2056e4 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 15 Dec 2020 03:59:23 -0800 Subject: [PATCH 047/103] del sidebar link to network api docs --- docs/index.rst | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index c792e4f..6b9304a 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -38,11 +38,6 @@ Table of Contents ble_api -.. toctree:: - :caption: Network API Reference - - network_api - .. toctree:: :caption: Store Links From 7753ac35b777c8c562a6c670159e68e4dfb9e7f3 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 15 Dec 2020 04:13:55 -0800 Subject: [PATCH 048/103] del old favicon --- docs/_static/favicon.ico | Bin 4286 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/_static/favicon.ico diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico deleted file mode 100644 index c15a1650af557d6ec815ebd7c0b5dbf5cc080676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmc(iTT@%t8HTmbTLO|^B{RuQF8dF1+sS`u|3GnV5NCurSYW$$;sBD+2}$S-;$VR> z*!ajn#&(=Z-R9)9?o6jMz3hMR?3p+3S{oE}NPB1FS+=ab*Lv3Xt?zxmg~y}t&nKUF z#NVEqzwvlJ@OV7G<=|JI-*JfVf9*%_oqePG=NxOG=-7*E4&Qs5*y0{Sc65_ zxlNG&Hiskmy>qbo^6(~C-zHnIT>f|pwm%O$@s9XCv#@)!u;VN5EPkUm0$=F}T^rw^ ztNIsoZoNdu_Fv(<{|df4-@&){J-iQofcMdlu=iiVKKcpP@jqZae+~1+KVf~%!O!A5 z@ytGW<-WVeIh-rj=-By|YyM5H-Bo=lSZ@9qKkEQ`ZwR`70s5r^^noa}p%}E`IJD6O zw6P@AiyYU=P^VH*gJ~!;87Nmct}Q{ip5@57|DQ?A=kmRYMLACka1F7}bP?KMOs=o@ zM;+=_PX@TIokOW%Sw zvkmXkHtg(e>T(BmVHb9B7gqTWtd+a4Dtj>3?!nyPsNRRU^}rqC^G%NRd$3mdPLc15 zIVH{)Yvj3B?l#xv$ZR{pdzb@w&o9CE4(d;vNQ)ehpM^JGdF%DB`R85!g*N;TKZNI_ zkN)@g_+xlfwQ=A7Z_ep+`j6H(?=T0jdvXo&E1!Of_iO*6MqZ+mTItxL79YQcZ@#%bpF{=GSp2O#yGWf zeG{tOLlpYlohJS?w5=EPfkpDk{E|AIt3r$3fp%q?{20{HD6H_~6Mo3iE-t$Lr-}bw z_9^`+Og~tHcc%tBwGK0}0c-s(%=n&MOaF2gdh~4kA#YnIhK68uM8{R#LpfxpY+Dh z+wj+(F@EwlUo`T=cxif5P|rOD%lw68WPs7}svM z#ILWCe}(+DC$0R%BbT2zkms)sh9%z|DuMT}Mt+*}d&2PcH1W@M!^>yd2>DmHTlp(b zpNB>59b*6g9nA0mG+#9l*2tQ|iD?}cJx{DPl4;a_gUFCRu zWD*AX+T^sOlFuB#94*WGKE3~)p1*M+1mAh`WBGb+RPud`HTppm=FF{@_>JNd>Ym!; zeWJPkv<&NSiu}xx8~-r*!K~D_&{qSWXDs=DDzx&GNAxA~gVa`2{Tq4mZ?IPv4qN%z z1E`l4VPtDAe2Ja_E zj$T0jQ)jY{Ivjy#wjQqg`n3Lou8uf21kx#$XmfG-(hw^NU!U=zr z@sE%{u|obvL;kyj|I&Ya=jaX1@kdYi4MCCGTBh4PRd*G;oA7EbCm-WjP*UV5e){wX-s{!`du_%ma8@`Btwsg{)*Btd)N$i0=nYm#ds>5Oa%ew~qyEe{! z_VI2q%(F?A>v2dH{UK;m8F@bt9!f8B=ZhX6Ab+6^zarvKLJ7v9d{JLbCpQx%!9SJ6*+RygSpod4H6581`|My-fOPFvIm? ij#+u`=)qupp7^Zoy>yf-DMy)(JIbZl8`j1<{rMRY83?oh From ef09851f11119c19f2e145be10f36ab47b6af622 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 15 Dec 2020 04:14:44 -0800 Subject: [PATCH 049/103] add new favicon --- docs/_static/favicon.ico | Bin 0 -> 4286 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/_static/favicon.ico diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c15a1650af557d6ec815ebd7c0b5dbf5cc080676 GIT binary patch literal 4286 zcmc(iTT@%t8HTmbTLO|^B{RuQF8dF1+sS`u|3GnV5NCurSYW$$;sBD+2}$S-;$VR> z*!ajn#&(=Z-R9)9?o6jMz3hMR?3p+3S{oE}NPB1FS+=ab*Lv3Xt?zxmg~y}t&nKUF z#NVEqzwvlJ@OV7G<=|JI-*JfVf9*%_oqePG=NxOG=-7*E4&Qs5*y0{Sc65_ zxlNG&Hiskmy>qbo^6(~C-zHnIT>f|pwm%O$@s9XCv#@)!u;VN5EPkUm0$=F}T^rw^ ztNIsoZoNdu_Fv(<{|df4-@&){J-iQofcMdlu=iiVKKcpP@jqZae+~1+KVf~%!O!A5 z@ytGW<-WVeIh-rj=-By|YyM5H-Bo=lSZ@9qKkEQ`ZwR`70s5r^^noa}p%}E`IJD6O zw6P@AiyYU=P^VH*gJ~!;87Nmct}Q{ip5@57|DQ?A=kmRYMLACka1F7}bP?KMOs=o@ zM;+=_PX@TIokOW%Sw zvkmXkHtg(e>T(BmVHb9B7gqTWtd+a4Dtj>3?!nyPsNRRU^}rqC^G%NRd$3mdPLc15 zIVH{)Yvj3B?l#xv$ZR{pdzb@w&o9CE4(d;vNQ)ehpM^JGdF%DB`R85!g*N;TKZNI_ zkN)@g_+xlfwQ=A7Z_ep+`j6H(?=T0jdvXo&E1!Of_iO*6MqZ+mTItxL79YQcZ@#%bpF{=GSp2O#yGWf zeG{tOLlpYlohJS?w5=EPfkpDk{E|AIt3r$3fp%q?{20{HD6H_~6Mo3iE-t$Lr-}bw z_9^`+Og~tHcc%tBwGK0}0c-s(%=n&MOaF2gdh~4kA#YnIhK68uM8{R#LpfxpY+Dh z+wj+(F@EwlUo`T=cxif5P|rOD%lw68WPs7}svM z#ILWCe}(+DC$0R%BbT2zkms)sh9%z|DuMT}Mt+*}d&2PcH1W@M!^>yd2>DmHTlp(b zpNB>59b*6g9nA0mG+#9l*2tQ|iD?}cJx{DPl4;a_gUFCRu zWD*AX+T^sOlFuB#94*WGKE3~)p1*M+1mAh`WBGb+RPud`HTppm=FF{@_>JNd>Ym!; zeWJPkv<&NSiu}xx8~-r*!K~D_&{qSWXDs=DDzx&GNAxA~gVa`2{Tq4mZ?IPv4qN%z z1E`l4VPtDAe2Ja_E zj$T0jQ)jY{Ivjy#wjQqg`n3Lou8uf21kx#$XmfG-(hw^NU!U=zr z@sE%{u|obvL;kyj|I&Ya=jaX1@kdYi4MCCGTBh4PRd*G;oA7EbCm-WjP*UV5e){wX-s{!`du_%ma8@`Btwsg{)*Btd)N$i0=nYm#ds>5Oa%ew~qyEe{! z_VI2q%(F?A>v2dH{UK;m8F@bt9!f8B=ZhX6Ab+6^zarvKLJ7v9d{JLbCpQx%!9SJ6*+RygSpod4H6581`|My-fOPFvIm? ij#+u`=)qupp7^Zoy>yf-DMy)(JIbZl8`j1<{rMRY83?oh literal 0 HcmV?d00001 From 247a57b0b96a1ad8c1da199f4a6360b2c9dea171 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 15 Dec 2020 07:06:39 -0800 Subject: [PATCH 050/103] forced EN_CRC bit doesn't show in reg if AA is on --- circuitpython_nrf24l01/rf24.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 6cd681a..ebb6c55 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -607,8 +607,6 @@ def auto_ack(self, enable): self._aa &= 1 self._reg_write(DYN_PL_LEN, self._dyn_pl) self._reg_write(AUTO_ACK, self._aa) - if self._aa: # refresh crc data if enabled - self._config = self._reg_read(CONFIGURE) def set_auto_ack(self, enable, pipe_number=None): """Control the automatic acknowledgement feature for a specific data @@ -713,6 +711,9 @@ def crc(self): """This `int` attribute specifies the nRF24L01's CRC (cyclic redundancy checking) encoding scheme in terms of byte length.""" self._config = self._reg_read(CONFIGURE) + self._aa = self._reg_read(AUTO_ACK) + if self._aa: + return 2 if self._config & 4 else 1 return max(0, ((self._config & 0x0C) >> 2) - 1) @crc.setter From 52bc9e6b6c9b73cdb337b214578965e3d1b39837 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Mon, 21 Dec 2020 14:40:38 -0800 Subject: [PATCH 051/103] add hovering popups (beta sphinx-ext) --- docs/conf.py | 31 +++++++++++++++++++++++++++---- docs/requirements.txt | 1 + 2 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 docs/requirements.txt diff --git a/docs/conf.py b/docs/conf.py index f3914b8..51b13ea 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -17,10 +17,10 @@ "sphinx.ext.napoleon", "sphinx.ext.todo", "sphinx.ext.viewcode", + "hoverxref.extension", # "rst2pdf.pdfbuilder", # for pdf builder support ] -# TODO: Please Read! # Uncomment the below if you use native CircuitPython modules such as # digitalio, micropython and busio. List the modules you use. Without it, the # autodoc module docs will fail to generate with a warning. @@ -56,9 +56,9 @@ # built documents. # # The short X.Y version. -version = u"1.2" +version = u"2.0" # The full version, including alpha/beta/rc tags. -release = u"1.2" +release = u"2.0.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -69,7 +69,14 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", ".env", "CODE_OF_CONDUCT.md"] +exclude_patterns = [ + "_build", + "Thumbs.db", + ".DS_Store", + ".env", + "CODE_OF_CONDUCT.md", + "requirements.txt", +] # The reST default role (used for this markup: `text`) to use for all # documents. @@ -89,6 +96,22 @@ napoleon_numpy_docstring = False +# hoverxref configuration +# ------------------------------------------------- +hoverxref_auto_ref = True +hoverxref_domains = ["py"] +hoverxref_roles = [ + "option", + "doc", +] +hoverxref_role_types = { + "mod": "modal", # for Python Sphinx Domain + "doc": "modal", # for whole docs + "class": "tooltip", # for Python Sphinx Domain + "ref": "tooltip", # for hoverxref_auto_ref config + "confval": "tooltip", # for custom object +} + # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..9ced642 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1 @@ +sphinx-hoverxref \ No newline at end of file From b8dc907e364fff82f6b342ec3fa300538358e376 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 22 Dec 2020 13:10:28 -0800 Subject: [PATCH 052/103] auto-ack independent of dyn_pl --- circuitpython_nrf24l01/rf24.py | 16 +-- docs/_static/darkness.css | 3 +- docs/_static/{favicon.ico => new_favicon.ico} | Bin docs/conf.py | 101 ++++++++++++++---- docs/configure_api.rst | 8 +- docs/greetings.rst | 22 ++-- docs/requirements.txt | 1 - docs/troubleshooting.rst | 25 ++--- 8 files changed, 109 insertions(+), 67 deletions(-) rename docs/_static/{favicon.ico => new_favicon.ico} (100%) delete mode 100644 docs/requirements.txt diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index ebb6c55..3229ea4 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -481,13 +481,9 @@ def dynamic_payloads(self, enable): self._dyn_pl = (self._dyn_pl & ~(1 << i)) | (bool(val) << i) else: raise ValueError("dynamic_payloads: {} is an invalid input" % enable) - if bool(self._features & 4) != (self._dyn_pl & 1): - self._features = (self._features & 3) | ((self._dyn_pl & 1) << 2) + if self._dyn_pl: + self._features = (self._features & 3) | (bool(self._dyn_pl) << 2) self._reg_write(TX_FEATURE, self._features) - if self._dyn_pl != (self._aa & self._dyn_pl): - self._aa |= self._dyn_pl - self._reg_write(AUTO_ACK, self._aa) - self._config = self._reg_read(CONFIGURE) self._reg_write(DYN_PL_LEN, self._dyn_pl) def set_dynamic_payloads(self, enable, pipe_number=None): @@ -596,16 +592,8 @@ def auto_ack(self, enable): self._aa = (self._aa & ~(1 << i)) | (bool(val) << i) else: raise ValueError("auto_ack: {} is not a valid input" % enable) - for i in range(6): - mask = 1 << i - if self._aa & mask != mask and self._dyn_pl & mask == mask: - self._dyn_pl &= ~mask - if not i and self._features & 4 != 4 and self._dyn_pl & mask: - self._features |= 4 - self._reg_write(TX_FEATURE, self._features) if bool(self._aa & 1) != bool(self._aa & 0x3E): self._aa &= 1 - self._reg_write(DYN_PL_LEN, self._dyn_pl) self._reg_write(AUTO_ACK, self._aa) def set_auto_ack(self, enable, pipe_number=None): diff --git a/docs/_static/darkness.css b/docs/_static/darkness.css index 9b872da..d9566c5 100644 --- a/docs/_static/darkness.css +++ b/docs/_static/darkness.css @@ -1,4 +1,5 @@ /* -----------------------------code sections------------------------------ */ +/* .highlight { background: #202020; } @@ -99,7 +100,7 @@ td.linenos pre { .highlight .fm { color: #f7ef84; } - +*/ /* ----------------------table sections---------------------------------------- */ .wy-table thead, .rst-content table.docutils thead, diff --git a/docs/_static/favicon.ico b/docs/_static/new_favicon.ico similarity index 100% rename from docs/_static/favicon.ico rename to docs/_static/new_favicon.ico diff --git a/docs/conf.py b/docs/conf.py index 51b13ea..9be570d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,8 +1,23 @@ # -*- coding: utf-8 -*- -# pylint: disable=invalid-name +# pylint: disable=invalid-name,too-few-public-methods """This file is for `sphinx-build` configuration""" import os import sys +import pygments.styles +from pygments.style import Style +from pygments.token import ( + Text, + Other, + Comment, + Keyword, + Name, + Literal, + String, + Number, + Operator, + Generic, +) + sys.path.insert(0, os.path.abspath("..")) @@ -17,7 +32,6 @@ "sphinx.ext.napoleon", "sphinx.ext.todo", "sphinx.ext.viewcode", - "hoverxref.extension", # "rst2pdf.pdfbuilder", # for pdf builder support ] @@ -85,9 +99,6 @@ # If true, '()' will be appended to :func: etc. cross-reference text. add_function_parentheses = True -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False @@ -96,21 +107,69 @@ napoleon_numpy_docstring = False -# hoverxref configuration -# ------------------------------------------------- -hoverxref_auto_ref = True -hoverxref_domains = ["py"] -hoverxref_roles = [ - "option", - "doc", -] -hoverxref_role_types = { - "mod": "modal", # for Python Sphinx Domain - "doc": "modal", # for whole docs - "class": "tooltip", # for Python Sphinx Domain - "ref": "tooltip", # for hoverxref_auto_ref config - "confval": "tooltip", # for custom object -} +# pygment custom style +# -------------------------------------------------- + +class DarkPlus(Style): + """A custom pygment highlighting scheme based on + VSCode's builtin `Dark Plus` theme""" + + background_color = "#1E1E1E" + highlight_color = "#ff0000" + line_number_color = "#FCFCFC" + line_number_background_color = "#282828" + + default_style = "" + styles = { + Text: "#FEFEFE", + Comment.Single: "#5E9955", + Comment.Multiline: "#5E9955", + Comment.Preproc: "#B369BF", + Other: "#FEFEFE", + Keyword: "#499CD6", + Keyword.Declaration: "#C586C0", + Keyword.Namespace: "#B369BF", + # Keyword.Pseudo: "#499CD6", + # Keyword.Reserved: "#499CD6", + Keyword.Type: "#48C999", + # Name: "#9CDCFE", + Name.Builtin: "#EAEB82", + Name.Builtin.Pseudo: "#499DC7", + Name.Class: "#48C999", + Name.Decorator: "#EAEB82", + Name.Exception: "#48C999", + Name.Attribute: "#569CD6", + Name.Variable:" #9CDCFE", + Name.Variable.Magic: "#EAEB82", + Name.Function: "#EAEB82", + Name.Function.Magic: "#EAEB82", + Literal: "#AC4C1E", + String: "#B88451", + String.Escape: "#DEA868", + String.Affix: "#499DC7", + Number: "#B3D495", + Operator: "#FEFEFE", + Operator.Word: "#499DC7", + # Generic.Output: "#99FFA2", + Generic.Prompt: "#99FFA2", + Generic.Traceback: "#FF0909", + Generic.Error: "#FF0909", + } + + +def pygments_monkeypatch_style(mod_name, cls): + """ function to inject a custom pygment style """ + cls_name = cls.__name__ + mod = type(__import__("os"))(mod_name) + setattr(mod, cls_name, cls) + setattr(pygments.styles, mod_name, mod) + sys.modules["pygments.styles." + mod_name] = mod + pygments.styles.STYLE_MAP[mod_name] = mod_name + "::" + cls_name + + +pygments_monkeypatch_style("dark_plus", DarkPlus) +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = "dark_plus" # -- Options for HTML output ---------------------------------------------- @@ -145,7 +204,7 @@ # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # -html_favicon = "_static/favicon.ico" +html_favicon = "_static/new_favicon.ico" # project logo html_logo = "_static/Logo.png" diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 1ae271e..a517422 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -13,9 +13,7 @@ dynamic_payloads ****************************** .. note:: - |mostly_rx_but_tx0| The `auto_ack` attribute is automatically enabled by this attribute - for any data pipes that have this feature enabled. Disabling this feature for any - data pipe will not affect the `auto_ack` feature for the corresponding data pipes. + |mostly_rx_but_tx0| .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.dynamic_payloads @@ -142,8 +140,8 @@ auto_ack |mostly_rx_but_tx0| This attribute will intuitively: - enable the automatic acknowledgement feature for pipe 0 if any other data pipe is configured to use the automatic acknowledgement feature. - - disable the `dynamic_payloads` feature for any data pipe that is configured to - disable the automatic acknowledgement feature. + - disable the acknowledgement payload feature (`ack` attribute) when the + automatic acknowledgement feature is disabled for data pipe 0. .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.auto_ack diff --git a/docs/greetings.rst b/docs/greetings.rst index 43d9900..a014caf 100644 --- a/docs/greetings.rst +++ b/docs/greetings.rst @@ -116,23 +116,19 @@ See `examples >> from nrf24l01_simple_test import * + Which radio is this? Enter '0' or '1'. Defaults to '0' nRF24L01 Simple test. Run slave() on receiver Run master() on transmitter >>> master() - Sending: 5 as struct: b'\x05\x00\x00\x00' - send() successful - Transmission took 36.0 ms - Sending: 4 as struct: b'\x04\x00\x00\x00' - send() successful - Transmission took 28.0 ms - Sending: 3 as struct: b'\x03\x00\x00\x00' - send() successful - Transmission took 24.0 ms - + Transmission successful! Time to Transmit: 6993.972 us. Sent: 0.0 + Transmission successful! Time to Transmit: 6563.277 us. Sent: 0.01 + Transmission successful! Time to Transmit: 6453.385 us. Sent: 0.02 + Transmission successful! Time to Transmit: 6338.29 us. Sent: 0.03 + Transmission successful! Time to Transmit: 6440.163 us. Sent: 0.04 What to purchase ================= @@ -218,7 +214,7 @@ Future Project Ideas/Additions html>`_ (uses custom bitbanging SPI functions and an external circuit involving a resistor and a capacitor) * network linking layer, maybe something like `TMRh20's RF24Network - `_ + `_ * implement the Gazelle-based protocol used by the BBC micro-bit (`makecode.com's radio blocks `_). @@ -227,7 +223,7 @@ Sphinx documentation ----------------------- Sphinx is used to build the documentation based on rST files and comments in the code. First, -install dependencies (feel free to reuse the virtual environment from `above `_): +install dependencies (feel free to reuse the virtual environment from `above `_): .. code-block:: shell diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 9ced642..0000000 --- a/docs/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -sphinx-hoverxref \ No newline at end of file diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index e42ecf9..58a34ec 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -5,28 +5,29 @@ Troubleshooting info Attribute dependency ******************** -The nRF24L01 has 3 key features that can be interdependent of each other. Their -priority of dependence is as follows: +The nRF24L01 has 3 key features. 1. `auto_ack` feature provides transmission verification by using the RX nRF24L01 to - automatically and imediatedly send an acknowledgment (ACK) packet in response to + automatically and immediatedly send an acknowledgment (ACK) packet in response to received payloads. `auto_ack` does not require `dynamic_payloads` to be enabled. 2. `dynamic_payloads` feature allows either TX/RX nRF24L01 to be able to send/receive payloads with their size written into the payloads' packet. With this disabled, both - RX/TX nRF24L01 must use matching `payload_length` attributes. For `dynamic_payloads` - to be enabled, the `auto_ack` feature must be enabled. Although, the `auto_ack` - feature can be used when the `dynamic_payloads` feature is disabled. + RX/TX nRF24L01 must use matching `payload_length` attributes. `dynamic_payloads` + does not require `auto_ack` to be enabled. + + .. note:: With the `auto_ack` feature enabled, you get: + + * cyclic redundancy checking (`crc`) automatically enabled + * to change amount of automatic re-transmit attempts and the delay time between + them. See the `arc` and `ard` attributes. 3. `ack` feature allows the MCU to append a payload to the ACK packet, thus instant bi-directional communication. A transmitting ACK payload must be loaded into the nRF24L01's TX FIFO buffer (done using `load_ack()`) BEFORE receiving the payload that is to be acknowledged. Once transmitted, the payload is released from the TX FIFO - buffer. This feature requires the `auto_ack` and `dynamic_payloads` features enabled. - -With the `auto_ack` feature enabled, you get: + buffer. - * cyclic redundancy checking (`crc`) automatically enabled - * to change amount of automatic re-transmit attempts and the delay time between them. - See the `arc` and `ard` attributes. + .. important:: This `ack` feature requires the `auto_ack` and `dynamic_payloads` + features enabled. FIFO Capacity ************* From 013c040be914a925fc572b1551998d0ee41cc1ed Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 22 Dec 2020 13:16:12 -0800 Subject: [PATCH 053/103] fix code-block in "Using Examples" --- docs/greetings.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/greetings.rst b/docs/greetings.rst index a014caf..59aedbd 100644 --- a/docs/greetings.rst +++ b/docs/greetings.rst @@ -116,7 +116,7 @@ See `examples >> from nrf24l01_simple_test import * Which radio is this? Enter '0' or '1'. Defaults to '0' From b9df72a15e7c66ded80bf5c057ce53e2bff2bfec Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 22 Dec 2020 13:56:13 -0800 Subject: [PATCH 054/103] consistent examples about TMRh20 compatibility --- docs/examples.rst | 10 +++++++--- examples/nrf24l01_manual_ack_test.py | 3 ++- examples/nrf24l01_multiceiver_test.py | 3 ++- examples/nrf24l01_simple_test.py | 3 ++- examples/nrf24l01_stream_test.py | 1 + 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/examples.rst b/docs/examples.rst index 4398d07..48496f5 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -149,7 +149,7 @@ but this Circuitpython library uses a default value of 3. nrf24l01_multiceiver_test, multiceiverDemo nrf24l01_stream_test, streamingData nrf24l01_interrupt_test, interruptConfigure - nrf24l01_context_test, feature is not available in C++ + nrf24l01_context_test, feature is not available nrf24l01_fake_ble_test, feature is available via `floe's BTLE library `_ .. note:: Each of the Circuitpython examples that are compatible with TMRh20's examples @@ -158,11 +158,15 @@ but this Circuitpython library uses a default value of 3. .. code-block:: python - # uncomment the following 2 lines for compatibility with TMRh20 library + # uncomment the following 3 lines for compatibility with TMRh20 library # nrf.allow_ask_no_ack = False # nrf.dynamic_payloads = False # nrf.payload_length = 4 +.. warning:: Certain C++ datatypes allocate a different amount of memory depending on + the board being used in the Arduino IDE. For example, ``uint8_t`` isn't always + allocated to 1 byte of memory for certain boards. + Make sure you understand the amount of memory that different datatypes occupy in C++. - This will help you understand how to configure + This will help you comprehend how to configure :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length`. diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py index cf9e758..b4317bd 100644 --- a/examples/nrf24l01_manual_ack_test.py +++ b/examples/nrf24l01_manual_ack_test.py @@ -51,7 +51,8 @@ # list to store our integer number for the payloads' counter counter = [0] -# uncomment the following 2 lines for compatibility with TMRh20 library +# uncomment the following 3 lines for compatibility with TMRh20 library +# nrf.allow_ask_no_ack = False # nrf.dynamic_payloads = False # nrf.payload_length = 8 diff --git a/examples/nrf24l01_multiceiver_test.py b/examples/nrf24l01_multiceiver_test.py index 6b0ba27..94d4b74 100644 --- a/examples/nrf24l01_multiceiver_test.py +++ b/examples/nrf24l01_multiceiver_test.py @@ -37,7 +37,8 @@ b"\x05\xB6\xB5\xB4\xB3" ] -# uncomment the following 2 lines for compatibility with TMRh20 library +# uncomment the following 3 lines for compatibility with TMRh20 library +# nrf.allow_ask_no_ack = False # nrf.dynamic_payloads = False # nrf.payload_length = 8 diff --git a/examples/nrf24l01_simple_test.py b/examples/nrf24l01_simple_test.py index 02f0c60..0edc596 100644 --- a/examples/nrf24l01_simple_test.py +++ b/examples/nrf24l01_simple_test.py @@ -49,7 +49,8 @@ # list to store our float number for the payloads sent payload = [0.0] -# uncomment the following 2 lines for compatibility with TMRh20 library +# uncomment the following 3 lines for compatibility with TMRh20 library +# nrf.allow_ask_no_ack = False # nrf.dynamic_payloads = False # nrf.payload_length = 4 diff --git a/examples/nrf24l01_stream_test.py b/examples/nrf24l01_stream_test.py index 520a28b..44049bb 100644 --- a/examples/nrf24l01_stream_test.py +++ b/examples/nrf24l01_stream_test.py @@ -45,6 +45,7 @@ nrf.open_rx_pipe(1, address[not radio_number]) # using pipe 1 # uncomment the following 2 lines for compatibility with TMRh20 library +# nrf.allow_ask_no_ack = False # nrf.dynamic_payloads = False From 4263460b505681e6c6479172dc4e54c31c3bd7f2 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 22 Dec 2020 14:20:55 -0800 Subject: [PATCH 055/103] re-org docs about TMRh20 & examples use footnotes --- docs/_static/darkness.css | 107 ++------------------------------------ docs/examples.rst | 44 ++++++++-------- 2 files changed, 26 insertions(+), 125 deletions(-) diff --git a/docs/_static/darkness.css b/docs/_static/darkness.css index d9566c5..d1967f4 100644 --- a/docs/_static/darkness.css +++ b/docs/_static/darkness.css @@ -1,106 +1,3 @@ -/* -----------------------------code sections------------------------------ */ -/* -.highlight { - background: #202020; -} - -.highlight .s1 { - color: #da8c00; -} - -.highlight .mi { - color: #9ff1c6; -} - -.highlight .nb { - color: #f7ef84; -} - -.highlight .ow { - color: #1f95cb; -} - -.highlight .kc { - color: #2886e4; -} - -.highlight .s2 { - color: #da8c00; -} - -.highlight .mf { - color: #9ff1c6; -} - -.highlight .se { - color: #e2c458; -} - -.highlight .si { - color: #2886e4; -} - -.highlight .sa { - color: #2886e4; -} - -.highlight .nf { - color: #f7ef84; -} - -.highlight .k { - color: #af63ab; -} - -.highlight .c1 { - color: #4bbc3f; -} - -.highlight .o { - color: #fefefe; -} - -.highlight .sd { - color: #da8c00; -} - -.highlight .nn { - color: #fff; -} - -.highlight .kn { - color: #af63ab; -} - -.highlight .bp { - color: #1f95cb; -} - -.highlight .nd { - color: #f7ef84; -} - -.highlight .ne { - color: #13d297; -} - -.highlight .mh { - color: #9ff1c6; -} - -.highlight .go { - color: #1afd00; -} - -td.linenos pre { - color: #fff; - background-color: #373737; -} - -.highlight .fm { - color: #f7ef84; -} -*/ /* ----------------------table sections---------------------------------------- */ .wy-table thead, .rst-content table.docutils thead, @@ -293,6 +190,10 @@ body { color: #fff !important; } +html.writer-html5 .rst-content dl.footnote>dd p { + color: #fcfcfc; +} + /* -------------------------------------sidebar sections------------------------------------------------ */ .wy-side-nav-search { background-color: #006B09; diff --git a/docs/examples.rst b/docs/examples.rst index 48496f5..53337ac 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -132,10 +132,18 @@ To make this circuitpython library compatible with `TMRh20's RF24 library `_: 1. set `dynamic_payloads` to `False`. - 2. set :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length` to the value that + 2. set `allow_ask_no_ack` to `False`. + 3. set :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length` to the value that is passed to TMRh20's ``RF24::setPayloadSize()``. 32 is the default (& maximum) payload length/size for both libraries. - 3. set `allow_ask_no_ack` to `False`. + + .. warning:: Certain C++ datatypes allocate a different amount of memory depending on + the board being used in the Arduino IDE. For example, ``uint8_t`` isn't always + allocated to 1 byte of memory for certain boards. + + Make sure you understand the amount of memory that different datatypes occupy in C++. + This will help you comprehend how to configure + :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length`. For completness, TMRh20's RF24 library uses a default value of 15 for the `ard` attribute, but this Circuitpython library uses a default value of 3. @@ -143,30 +151,22 @@ but this Circuitpython library uses a default value of 3. .. csv-table:: Corresponding examples :header: circuitpython_nrf24l01, TMRh20 RF24 - nrf24l01_simple_test, gettingStarted + "nrf24l01_simple_test\ [1]_ ", gettingStarted nrf24l01_ack_payload_test, acknowledgementPayloads - nrf24l01_manual_ack_test, manualAcknowledgements - nrf24l01_multiceiver_test, multiceiverDemo - nrf24l01_stream_test, streamingData + "nrf24l01_manual_ack_test\ [1]_ ", manualAcknowledgements + "nrf24l01_multiceiver_test\ [1]_ ", multiceiverDemo + "nrf24l01_stream_test\ [1]_ ", streamingData nrf24l01_interrupt_test, interruptConfigure nrf24l01_context_test, feature is not available nrf24l01_fake_ble_test, feature is available via `floe's BTLE library `_ -.. note:: Each of the Circuitpython examples that are compatible with TMRh20's examples - contain 2 lines of code that are commented out for easy modification. These lines - look like this in the examples' source code: - - .. code-block:: python - - # uncomment the following 3 lines for compatibility with TMRh20 library - # nrf.allow_ask_no_ack = False - # nrf.dynamic_payloads = False - # nrf.payload_length = 4 +.. [1] Some of the Circuitpython examples (that are compatible with TMRh20's examples) + contain 2 or 3 lines of code that are commented out for easy modification. These lines + look like this in the examples' source code: -.. warning:: Certain C++ datatypes allocate a different amount of memory depending on - the board being used in the Arduino IDE. For example, ``uint8_t`` isn't always - allocated to 1 byte of memory for certain boards. + .. code-block:: python - Make sure you understand the amount of memory that different datatypes occupy in C++. - This will help you comprehend how to configure - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length`. + # uncomment the following 3 lines for compatibility with TMRh20 library + # nrf.allow_ask_no_ack = False + # nrf.dynamic_payloads = False + # nrf.payload_length = 4 From 4020074946365b8c2333814b294badc35b878e28 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 22 Dec 2020 18:18:04 -0800 Subject: [PATCH 056/103] move admonished note about auto-ack --- docs/troubleshooting.rst | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index 58a34ec..d948bea 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -10,16 +10,16 @@ The nRF24L01 has 3 key features. 1. `auto_ack` feature provides transmission verification by using the RX nRF24L01 to automatically and immediatedly send an acknowledgment (ACK) packet in response to received payloads. `auto_ack` does not require `dynamic_payloads` to be enabled. -2. `dynamic_payloads` feature allows either TX/RX nRF24L01 to be able to send/receive - payloads with their size written into the payloads' packet. With this disabled, both - RX/TX nRF24L01 must use matching `payload_length` attributes. `dynamic_payloads` - does not require `auto_ack` to be enabled. .. note:: With the `auto_ack` feature enabled, you get: * cyclic redundancy checking (`crc`) automatically enabled * to change amount of automatic re-transmit attempts and the delay time between them. See the `arc` and `ard` attributes. +2. `dynamic_payloads` feature allows either TX/RX nRF24L01 to be able to send/receive + payloads with their size written into the payloads' packet. With this disabled, both + RX/TX nRF24L01 must use matching `payload_length` attributes. `dynamic_payloads` + does not require `auto_ack` to be enabled. 3. `ack` feature allows the MCU to append a payload to the ACK packet, thus instant bi-directional communication. A transmitting ACK payload must be loaded into the nRF24L01's TX FIFO buffer (done using `load_ack()`) BEFORE receiving the payload that @@ -37,6 +37,8 @@ there can be up to 3 payloads waiting to be read (RX) and up to 3 payloads waiti transmit (TX). Notice there are seperate FIFO buffers sending & receiving (respectively mentioned in this documentation as TX FIFO & RX FIFO). +Each of the 3 levels in the FIFO buffers can only store a *maximum* of 32 bytes. If you receive 2 payloads with a length of 4 bytes each, then there is only 1 level of the RX FIFO buffers left unoccupied. + Pipes vs Addresses vs Channels ****************************** @@ -48,15 +50,15 @@ Pipes You should think of the data pipes as a "parking spot" for your payload. There are only six data pipes on the nRF24L01, thus it can simultaneously "listen" to a maximum of 6 other -nRF24L01 radios. However, it can only "talk" to 1 other nRF24L01 at a time). +nRF24L01 radios. However, it can only "talk" to 1 other nRF24L01 at a time. Addresses --------- The specified address is not the address of an nRF24L01 radio, rather it is more like a path that connects the endpoints. When assigning addresses to a data pipe, you can use any -5 byte long address you can think of (as long as the first byte is unique among -simultaneously broadcasting addresses), so you're not limited to communicating with only +5 byte long address you can think of (as long as the first byte of the `bytearray` is unique +among simultaneously broadcasting addresses), so you're not limited to communicating with only the same 6 nRF24L01 radios. Channels @@ -82,8 +84,7 @@ match. These settings/features include: * `data_rate` * `dynamic_payloads` * `payload_length` only when `dynamic_payloads` is disabled -* `auto_ack` on the recieving nRF24L01 must be enabled if `arc` is greater than 0 on the - transmitting nRF24L01 +* `auto_ack` * custom `ack` payloads * `crc` From 72253beb2a7239c27618d158330a6e9925f65f78 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 30 Dec 2020 01:29:40 -0800 Subject: [PATCH 057/103] add the click-to-copy button --- .readthedocs.yml | 8 ++++++-- docs/conf.py | 1 + docs/requirements.txt | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 docs/requirements.txt diff --git a/.readthedocs.yml b/.readthedocs.yml index e311bcb..86b0c63 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,3 +1,7 @@ +version: 2 + python: - version: 3 -requirements_file: requirements.txt + version: 3.7 + install: + - doc requirements: docs/requirements.txt + - lib requirements: requirements.txt \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 9be570d..9505166 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -32,6 +32,7 @@ "sphinx.ext.napoleon", "sphinx.ext.todo", "sphinx.ext.viewcode", + "sphinx_copybutton", # "rst2pdf.pdfbuilder", # for pdf builder support ] diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..31e5bdb --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,2 @@ +sphinx-material +sphinx-copybutton \ No newline at end of file From b83179dbf1e77507d483e58b665ad23da7b7bbf4 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 30 Dec 2020 01:46:10 -0800 Subject: [PATCH 058/103] oops should've rtfd --- .readthedocs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index 86b0c63..8ebe42a 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -3,5 +3,5 @@ version: 2 python: version: 3.7 install: - - doc requirements: docs/requirements.txt - - lib requirements: requirements.txt \ No newline at end of file + - requirements: docs/requirements.txt + - requirements: requirements.txt \ No newline at end of file From 26b6d91050c9aed96afebbd424f7a0bccf5759a6 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 30 Dec 2020 02:03:38 -0800 Subject: [PATCH 059/103] fix workflows --- .github/workflows/build.yml | 5 +++-- .github/workflows/release.yml | 4 ++-- docs/requirements.txt | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 79fe429..379eaa8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,9 +46,10 @@ jobs: run: | source actions-ci/install.sh - - name: Pip install pylint, black, & Sphinx + - name: Pip install pylint, black, & Sphinx stuff run: | - pip install pylint black Sphinx sphinx-rtd-theme + pip install pylint black + pip install -r docs/requirements.txt - name: Library version run: git describe --dirty --always --tags - name: PyLint diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 75cfe60..0919911 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,10 +28,10 @@ jobs: awk -F '\/' '{ print tolower($2) }' | tr '-' '_' ) - - name: Set up Python 3.6 + - name: Set up Python 3.7 uses: actions/setup-python@v1 with: - python-version: 3.6 + python-version: 3.7 - name: Versions run: | python3 --version diff --git a/docs/requirements.txt b/docs/requirements.txt index 31e5bdb..bf5467f 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,2 +1,3 @@ sphinx-material -sphinx-copybutton \ No newline at end of file +sphinx-copybutton +sphinx-rtd-theme \ No newline at end of file From bdfd27783c8e993e86250cc86db98e45a8a7ee14 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 30 Dec 2020 02:53:40 -0800 Subject: [PATCH 060/103] switch rtfd.io to material theme --- docs/_static/Logo large.png | Bin 0 -> 105868 bytes docs/_static/Logo large.xcf | Bin 0 -> 1122617 bytes docs/_static/Logo.xcf | Bin 121426 -> 120954 bytes docs/_static/dark_material.css | 94 ++++++++++++++++++++++ docs/_static/favicon.ico | Bin 0 -> 4286 bytes docs/advanced_api.rst | 16 ++-- docs/basic_api.rst | 30 +++---- docs/ble_api.rst | 30 +++---- docs/conf.py | 47 +++++++---- docs/configure_api.rst | 12 +-- docs/examples.rst | 25 +++--- docs/greetings.rst | 31 ++++---- docs/troubleshooting.rst | 141 ++++++++++++++++----------------- 13 files changed, 268 insertions(+), 158 deletions(-) create mode 100644 docs/_static/Logo large.png create mode 100644 docs/_static/Logo large.xcf create mode 100644 docs/_static/dark_material.css create mode 100644 docs/_static/favicon.ico diff --git a/docs/_static/Logo large.png b/docs/_static/Logo large.png new file mode 100644 index 0000000000000000000000000000000000000000..309bd4d60a1ec8bc731564d8c4fb5dd3edc2524d GIT binary patch literal 105868 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

;|SC!<|4zZ(Z51^w#m25=R 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 z%0A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⋘>tP)1@4vrp-Mj1HeO<~M=wD_0qaNd( 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/_static/Logo.xcf b/docs/_static/Logo.xcf index 8fcd2a0542bc8b08575c0c5a6dab31ccb5fe00f5..a905343b707e4e6f1f1d089f800c337b6db6cc22 100644 GIT binary patch delta 334 zcmcb#h5gqC_6>!MoI(sBz_^8Ta~0$LTay#-++nnvF5k{5Da>#;3nJJ03qrTCO%7Nf zW_5QLgv-GJp><6mwBJ(*9nb@zGu}eziU$z7_0{HGcT-j}%7cuT7W9UQZvF_R|4w(< z$|z>lJ{!XC+Xv8x6f{8oTJ0a1mbTu*}}L+nd?Rp yMDj)+*zjpL7zO-pctOSdpmY$F4ujHBP&y7w1BrS8hW~KP1Z49e@bov=7-axiaZHo| delta 809 zcmeyhf&J1J_6>!MoKg%Rz_>+la~0$LTZ~MT9p+!2ta?{~(QW#htBjJu40nqlD%zN! zG~eWa1!7ir4?(yb0uWl)7DD^Ih0p<0Aaur82wm|4Lbra}yyZo&3o!gQ|If}q6I5U1zBm7`NnAVveL0!$jw}FDn%*S< diff --git a/docs/_static/dark_material.css b/docs/_static/dark_material.css new file mode 100644 index 0000000..05247ed --- /dev/null +++ b/docs/_static/dark_material.css @@ -0,0 +1,94 @@ +body { + color: #fcfcfc; + background-color: #232323; +} + +.sig-name.descname { + color: #b4e65c; +} + +.sig-prename.descclassname { + color: #fffefe; +} + +.md-typeset { + background-color: unset; +} + +.md-typeset .codehilitetable .linenos pre, +.md-typeset .highlighttable .linenos pre { + color: #FCFCFC; +} + +.md-typeset .footnote { + color:rgba(255, 255, 255, 0.83); + font-size:.64rem +} + +span.highlighted { + background-color: #794502; +} + +.sig-name.descname, +.sig-prename.descclassname { + background-color: #403f3f; +} + +.docutils.literal.notranslate { + background-color: hsla(0, 0%, 0%, 0); + color: #50e60c; +} + +.reference.internal .docutils.literal.notranslate .pre { + color: #2196f3; +} + +html body .md-typeset .headerlink { + color: rgb(94, 172, 15); +} + +@media only screen and (max-width: 76.1875em) { + .md-nav { + background-color: #393939; + } +} + +.md-nav__link[data-md-state="blur"] { + color: rgb(150, 125, 238); +} + +.md-nav { + font-size:0.8rem; +} + +.md-typeset h1 { + color: rgb(255, 255, 255); +} + +html .md-nav--primary .md-nav__title--site .md-nav__button { + top: 0; + left: 0; + width: inherit; + height: auto; +} + +html .md-nav--primary .md-nav__title~.md-nav__list { + background-color: #fff0; +} + +.md-nav span.caption { + background-color: #172353; +} + +[data-md-color-primary=blue] .md-tabs { + background-color: #006b09; +} + +[data-md-color-primary=blue] .md-header, +[data-md-color-primary=blue] .md-hero { + background-color: #006b09; +} + +html [data-md-color-primary=blue] .md-nav--primary .md-nav__title--site { + background-color: #006B09; +} \ No newline at end of file diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c15a1650af557d6ec815ebd7c0b5dbf5cc080676 GIT binary patch literal 4286 zcmc(iTT@%t8HTmbTLO|^B{RuQF8dF1+sS`u|3GnV5NCurSYW$$;sBD+2}$S-;$VR> z*!ajn#&(=Z-R9)9?o6jMz3hMR?3p+3S{oE}NPB1FS+=ab*Lv3Xt?zxmg~y}t&nKUF z#NVEqzwvlJ@OV7G<=|JI-*JfVf9*%_oqePG=NxOG=-7*E4&Qs5*y0{Sc65_ zxlNG&Hiskmy>qbo^6(~C-zHnIT>f|pwm%O$@s9XCv#@)!u;VN5EPkUm0$=F}T^rw^ ztNIsoZoNdu_Fv(<{|df4-@&){J-iQofcMdlu=iiVKKcpP@jqZae+~1+KVf~%!O!A5 z@ytGW<-WVeIh-rj=-By|YyM5H-Bo=lSZ@9qKkEQ`ZwR`70s5r^^noa}p%}E`IJD6O zw6P@AiyYU=P^VH*gJ~!;87Nmct}Q{ip5@57|DQ?A=kmRYMLACka1F7}bP?KMOs=o@ zM;+=_PX@TIokOW%Sw zvkmXkHtg(e>T(BmVHb9B7gqTWtd+a4Dtj>3?!nyPsNRRU^}rqC^G%NRd$3mdPLc15 zIVH{)Yvj3B?l#xv$ZR{pdzb@w&o9CE4(d;vNQ)ehpM^JGdF%DB`R85!g*N;TKZNI_ zkN)@g_+xlfwQ=A7Z_ep+`j6H(?=T0jdvXo&E1!Of_iO*6MqZ+mTItxL79YQcZ@#%bpF{=GSp2O#yGWf zeG{tOLlpYlohJS?w5=EPfkpDk{E|AIt3r$3fp%q?{20{HD6H_~6Mo3iE-t$Lr-}bw z_9^`+Og~tHcc%tBwGK0}0c-s(%=n&MOaF2gdh~4kA#YnIhK68uM8{R#LpfxpY+Dh z+wj+(F@EwlUo`T=cxif5P|rOD%lw68WPs7}svM z#ILWCe}(+DC$0R%BbT2zkms)sh9%z|DuMT}Mt+*}d&2PcH1W@M!^>yd2>DmHTlp(b zpNB>59b*6g9nA0mG+#9l*2tQ|iD?}cJx{DPl4;a_gUFCRu zWD*AX+T^sOlFuB#94*WGKE3~)p1*M+1mAh`WBGb+RPud`HTppm=FF{@_>JNd>Ym!; zeWJPkv<&NSiu}xx8~-r*!K~D_&{qSWXDs=DDzx&GNAxA~gVa`2{Tq4mZ?IPv4qN%z z1E`l4VPtDAe2Ja_E zj$T0jQ)jY{Ivjy#wjQqg`n3Lou8uf21kx#$XmfG-(hw^NU!U=zr z@sE%{u|obvL;kyj|I&Ya=jaX1@kdYi4MCCGTBh4PRd*G;oA7EbCm-WjP*UV5e){wX-s{!`du_%ma8@`Btwsg{)*Btd)N$i0=nYm#ds>5Oa%ew~qyEe{! z_VI2q%(F?A>v2dH{UK;m8F@bt9!f8B=ZhX6Ab+6^zarvKLJ7v9d{JLbCpQx%!9SJ6*+RygSpod4H6581`|My-fOPFvIm? ij#+u`=)qupp7^Zoy>yf-DMy)(JIbZl8`j1<{rMRY83?oh literal 0 HcmV?d00001 diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index 3b271af..96a88a9 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -407,12 +407,12 @@ fifo() :returns: - A `bool` answer to the question: - "Is the [TX/RX](``about_tx``) FIFO buffer [empty/full](``check_empty``)? + "Is the [TX/RX](``about_tx``) FIFO buffer [empty/full](``check_empty``)? - If the ``check_empty`` parameter is not specified: an `int` in range [0,2] for which: - - ``1`` means the specified FIFO buffer is empty - - ``2`` means the specified FIFO buffer is full - - ``0`` means the specified FIFO buffer is neither full nor empty + - ``1`` means the specified FIFO buffer is empty + - ``2`` means the specified FIFO buffer is full + - ``0`` means the specified FIFO buffer is neither full nor empty pipe ****************************** @@ -472,10 +472,10 @@ rpd The RPD flag is triggered in the following cases: - 1. During RX mode (when `listen` is `True`) and an arbitrary RF transmission with - a gain above -64 dBm threshold is/was present. - 2. When a packet is received (instigated by the nRF24L01 used to detect/"listen" for - incoming packets). + 1. During RX mode (when `listen` is `True`) and an arbitrary RF transmission with + a gain above -64 dBm threshold is/was present. + 2. When a packet is received (instigated by the nRF24L01 used to detect/"listen" for + incoming packets). .. note:: See also `section 6.4 of the Specification Sheet concerning the RPD flag diff --git a/docs/basic_api.rst b/docs/basic_api.rst index fdbc7d2..ec2728b 100644 --- a/docs/basic_api.rst +++ b/docs/basic_api.rst @@ -91,16 +91,16 @@ listen A valid input value is a `bool` in which: - - `True` enables RX mode. Additionally, per `Appendix B of the nRF24L01+ Specifications - Sheet `_, this attribute - flushes the RX FIFO, clears the `irq_dr` status flag, and puts nRF24L01 in power up - mode. Notice the CE pin is be held HIGH during RX mode. - - `False` disables RX mode. As mentioned in above link, this puts nRF24L01's power in - Standby-I (CE pin is LOW meaning low current & no transmissions) mode which is ideal - for post-reception work. Disabing RX mode doesn't flush the RX/TX FIFO buffers, so - remember to flush your 3-level FIFO buffers when appropriate using `flush_tx()` or - `flush_rx()` (see also the `read()` function). + - `True` enables RX mode. Additionally, per `Appendix B of the nRF24L01+ Specifications + Sheet `_, this attribute + flushes the RX FIFO, clears the `irq_dr` status flag, and puts nRF24L01 in power up + mode. Notice the CE pin is be held HIGH during RX mode. + - `False` disables RX mode. As mentioned in above link, this puts nRF24L01's power in + Standby-I (CE pin is LOW meaning low current & no transmissions) mode which is ideal + for post-reception work. Disabing RX mode doesn't flush the RX/TX FIFO buffers, so + remember to flush your 3-level FIFO buffers when appropriate using `flush_tx()` or + `flush_rx()` (see also the `read()` function). any() ****************** @@ -141,11 +141,11 @@ read() :param int length: An optional parameter to specify how many bytes to read from the RX FIFO buffer. This parameter is not constrained in any way. - - If this parameter is less than the length of the first available payload in the - RX FIFO buffer, then the payload will remain in the RX FIFO buffer until the - entire payload is fetched by this function. - - If this parameter is greater than the next available payload's length, then - additional data from other payload(s) in the RX FIFO buffer are returned. + - If this parameter is less than the length of the first available payload in the + RX FIFO buffer, then the payload will remain in the RX FIFO buffer until the + entire payload is fetched by this function. + - If this parameter is greater than the next available payload's length, then + additional data from other payload(s) in the RX FIFO buffer are returned. .. note:: The nRF24L01 will repeatedly return the last byte fetched from the RX FIFO diff --git a/docs/ble_api.rst b/docs/ble_api.rst index 70cc150..a892407 100644 --- a/docs/ble_api.rst +++ b/docs/ble_api.rst @@ -184,9 +184,9 @@ name .. autoattribute:: circuitpython_nrf24l01.fake_ble.FakeBLE.name - This is not required. In fact setting this attribute will subtract from - the available payload length (in bytes). Set this attribute to `None` to - disable advertising the device name. + This is not required. In fact setting this attribute will subtract from + the available payload length (in bytes). Set this attribute to `None` to + disable advertising the device name. .. note:: This information occupies (in the TX FIFO) an extra 2 bytes plus the length of the name set by this attribute. @@ -317,18 +317,18 @@ interrupt_config() Unavailable RF24 functionality ****************************** - The following `RF24` functionality is not available in `FakeBLE` objects: - - - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.dynamic_payloads` - - :py:meth:`~circuitpython_nrf24l01.rf24.RF24.set_dynamic_payloads()` - - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.data_rate` - - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.address_length` - - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.auto_ack` - - :py:meth:`~circuitpython_nrf24l01.rf24.RF24.set_auto_ack()` - - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.ack` - - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.crc` - - :py:meth:`~circuitpython_nrf24l01.rf24.RF24.open_rx_pipe()` - - :py:meth:`~circuitpython_nrf24l01.rf24.RF24.open_tx_pipe()` +The following `RF24` functionality is not available in `FakeBLE` objects: + +- :py:attr:`~circuitpython_nrf24l01.rf24.RF24.dynamic_payloads` +- :py:meth:`~circuitpython_nrf24l01.rf24.RF24.set_dynamic_payloads()` +- :py:attr:`~circuitpython_nrf24l01.rf24.RF24.data_rate` +- :py:attr:`~circuitpython_nrf24l01.rf24.RF24.address_length` +- :py:attr:`~circuitpython_nrf24l01.rf24.RF24.auto_ack` +- :py:meth:`~circuitpython_nrf24l01.rf24.RF24.set_auto_ack()` +- :py:attr:`~circuitpython_nrf24l01.rf24.RF24.ack` +- :py:attr:`~circuitpython_nrf24l01.rf24.RF24.crc` +- :py:meth:`~circuitpython_nrf24l01.rf24.RF24.open_rx_pipe()` +- :py:meth:`~circuitpython_nrf24l01.rf24.RF24.open_tx_pipe()` Service related classes diff --git a/docs/conf.py b/docs/conf.py index 9505166..c8efff9 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -16,6 +16,7 @@ Number, Operator, Generic, + Punctuation, ) @@ -133,7 +134,7 @@ class DarkPlus(Style): # Keyword.Pseudo: "#499CD6", # Keyword.Reserved: "#499CD6", Keyword.Type: "#48C999", - # Name: "#9CDCFE", + Name: "#FEFEFE", Name.Builtin: "#EAEB82", Name.Builtin.Pseudo: "#499DC7", Name.Class: "#48C999", @@ -155,6 +156,7 @@ class DarkPlus(Style): Generic.Prompt: "#99FFA2", Generic.Traceback: "#FF0909", Generic.Error: "#FF0909", + Punctuation: "#FEFEFE", } @@ -176,20 +178,34 @@ def pygments_monkeypatch_style(mod_name, cls): # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -# -on_rtd = os.environ.get("READTHEDOCS", None) == "True" +html_theme = "sphinx_material" +# Material theme options +html_sidebars = { + "**": ["logo-text.html", "globaltoc.html", "localtoc.html", "searchbox.html"] +} -if not on_rtd: # only import and set the theme if we're building docs locally - try: - import sphinx_rtd_theme +html_theme_options = { + # Set the name of the project to appear in the navigation. + "nav_title": "RF24 Revamped", + # Specify a base_url used to generate sitemap.xml. If not + # specified, then no sitemap will be built. + "base_url": "https://2bndy5.github.io/RF24-Revamped/", + # Set the color and the accent color + "color_primary": "blue", + "color_accent": "light-green", + # Set the repo location to get a badge with stats + "repo_url": "https://github.com/2bndy5/RF24-Revamped/", + "repo_name": "RF24-Revamped", + # Visible levels of the global TOC; -1 means unlimited + "globaltoc_depth": 1, + # If False, expand all TOC entries + "globaltoc_collapse": True, + # If True, show hidden TOC entries + "globaltoc_includehidden": False, +} - html_theme = "sphinx_rtd_theme" - html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] - except ImportError: - html_theme = "default" - html_theme_path = ["."] -else: - html_theme_path = ["."] +# Set link name generated in the top bar. +html_title = "CircuitPython-nRF24L01" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, @@ -199,8 +215,9 @@ def pygments_monkeypatch_style(mod_name, cls): # These paths are either relative to html_static_path # or fully qualified paths (eg. https://...) html_css_files = [ - "darkness.css", + "dark_material.css", ] + # The name of an image file (relative to this directory) to use as a favicon of # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. @@ -208,7 +225,7 @@ def pygments_monkeypatch_style(mod_name, cls): html_favicon = "_static/new_favicon.ico" # project logo -html_logo = "_static/Logo.png" +html_logo = "_static/Logo large.png" # Output file base name for HTML help builder. htmlhelp_basename = "nRF24L01_Library_doc" diff --git a/docs/configure_api.rst b/docs/configure_api.rst index a517422..2ee5901 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -77,13 +77,13 @@ payload_length A valid input value must be: - * an `int` value that is clamped to the range [1, 32]. Setting this attribute to a - single `int` configures all 6 data pipes. - * A `list` or `tuple` containing integers |per_data_pipe_control| If any index's - value is ``0``, then the existing setting for the corresponding data pipe will - persist (not be changed). + * an `int` value that is clamped to the range [1, 32]. Setting this attribute to a + single `int` configures all 6 data pipes. + * A `list` or `tuple` containing integers |per_data_pipe_control| If any index's + value is ``0``, then the existing setting for the corresponding data pipe will + persist (not be changed). - Default is set to the nRF24L01's maximum of 32 (on all data pipes). + Default is set to the nRF24L01's maximum of 32 (on all data pipes). :returns: The current setting of the expected static payload length feature for pipe 0 only. diff --git a/docs/examples.rst b/docs/examples.rst index 53337ac..4742427 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -131,19 +131,18 @@ TMRh20's library uses static payload lengths by default. To make this circuitpython library compatible with `TMRh20's RF24 library `_: - 1. set `dynamic_payloads` to `False`. - 2. set `allow_ask_no_ack` to `False`. - 3. set :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length` to the value that - is passed to TMRh20's ``RF24::setPayloadSize()``. 32 is the default (& maximum) - payload length/size for both libraries. - - .. warning:: Certain C++ datatypes allocate a different amount of memory depending on - the board being used in the Arduino IDE. For example, ``uint8_t`` isn't always - allocated to 1 byte of memory for certain boards. - - Make sure you understand the amount of memory that different datatypes occupy in C++. - This will help you comprehend how to configure - :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length`. +1. set `dynamic_payloads` to `False`. +2. set `allow_ask_no_ack` to `False`. +3. set :py:attr:`~circuitpython_nrf24l01.rf24.RF24payload_length` to the value that + is passed to TMRh20's ``RF24::setPayloadSize()``. 32 is the default (& maximum) + payload length/size for both libraries. + + .. warning:: Certain C++ datatypes allocate a different amountof memory depending on + the board being used in the Arduino IDE. For example, ``uint8_t`` isn't always + allocated to 1 byte of memory for certain boards. + Make sure you understand the amount of memory that different datatypes occupy in C++. + This will help you comprehend how to configure + :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length`. For completness, TMRh20's RF24 library uses a default value of 15 for the `ard` attribute, but this Circuitpython library uses a default value of 3. diff --git a/docs/greetings.rst b/docs/greetings.rst index 59aedbd..21c34ff 100644 --- a/docs/greetings.rst +++ b/docs/greetings.rst @@ -164,13 +164,14 @@ functionality, they are subject to a couple lesser known (and lesser advertised) boards' 3V regulators may not be able to provide (after supplying power to internal components). - .. csv-table:: - :header: Specification, Value - :widths: 10,5 + .. csv-table:: + :header: Specification, Value + :widths: 10,5 + + "Emission mode current(peak)", "115 mA" + "Receive Mode current(peak)", "45 mA" + "Power-down mode current", "4.2 µA" - "Emission mode current(peak)", "115 mA" - "Receive Mode current(peak)", "45 mA" - "Power-down mode current", "4.2 µA" 2. Needs shielding from electromagnetic interference. Shielding usually works best when it has a path to ground (GND pin), but this connection to the GND pin is not required. @@ -207,16 +208,16 @@ before contributing to help this project stay welcoming. To contribute, all you Future Project Ideas/Additions ------------------------------ - The following are only ideas; they are not currently supported by this circuitpython library. +The following are only ideas; they are not currently supported by this circuitpython library. - * `There's a few blog posts by Nerd Ralph demonstrating how to use the nRF24L01 via 2 or 3 - pins `_ (uses custom bitbanging SPI functions and an external circuit involving a - resistor and a capacitor) - * network linking layer, maybe something like `TMRh20's RF24Network - `_ - * implement the Gazelle-based protocol used by the BBC micro-bit (`makecode.com's radio - blocks `_). +* `There's a few blog posts by Nerd Ralph demonstrating how to use the nRF24L01 via 2 or 3 + pins `_ (uses custom bitbanging SPI functions and an external circuit involving a + resistor and a capacitor) +* network linking layer, maybe something like `TMRh20's RF24Network + `_ +* implement the Gazelle-based protocol used by the BBC micro-bit (`makecode.com's radio + blocks `_). Sphinx documentation diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index d948bea..91409fe 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -114,47 +114,47 @@ developed to save space on microcontrollers with limited amount of RAM and/or st boards using the ATSAMD21 M0). The following functionality has been removed from the lite version: - * The `FakeBLE` class is not compatible with the ``rf24_lite.py`` module. - * `is_plus_variant` is removed, meaning the - lite version is not compatibility with the older non-plus variants of the nRF24L01. - * `address()` removed. - * `what_happened()` removed. However you can use the following function to dump all available - registers' values (for advanced users): - - .. code-block:: python - - # let `nrf` be the instantiated RF24 object - def dump_registers(end=0x1e): - for i in range(end): - if i in (0xA, 0xB, 0x10): - print(hex(i), "=", nrf._reg_read_bytes(i)) - elif i not in (0x18, 0x19, 0x1a, 0x1b): - print(hex(i), "=", hex(nrf._reg_read(i))) - * `dynamic_payloads` applies to all pipes, not individual pipes. This attribute will return - a `bool` instead of an `int`. `set_dynamic_payloads()` and `get_dynamic_payloads()` have - been removed. - * `payload_length` applies to all pipes, not individual pipes. `set_payload_length()` and - `get_payload_length()` have been removed. - * `load_ack()` is available, but it will not throw exceptions for malformed ``buf`` or - invalid ``pipe_number`` parameters. Rather any call to `load_ack()` with invalid - parameters will have no affect on the TX FIFO. - * `crc` removed. 2-bytes encoding scheme (CRC16) is always enabled. - * `auto_ack` removed. This is always enabled for all pipes. Pass ``ask_no_ack`` parameter - as `True` to :py:meth:`~circuitpython_nrf24l01.rf24.RF24.send()` or `write()` to disable - automatic acknowledgement for TX operations. - * `is_lna_enabled` removed as it only affects non-plus variants of the nRF24L01. - * `pa_level` is available, but it will not accept a `list` or `tuple`. - * `rpd`, `start_carrier_wave()`, & `stop_carrier_wave()` removed. These only perform a - test of the nRF24L01's hardware. - * All comments and docstrings removed, meaning ``help()`` will not provide any specific - information. Exception prompts have also been reduced and adjusted accordingly. - * Cannot switch between different radio configurations using context manager (the `with` - blocks). It is advised that only one `RF24` object be instantiated when RAM is limited - (less than or equal to 32KB). - * `last_tx_arc` attribute removed because it is only meant for troubleshooting. - * `allow_ask_no_ack` attribute removed because it is only provided for the Si24R1 - chinese clone. - * `set_retries()` removed. Use `ard` & `arc` attributes instead. +* The `FakeBLE` class is not compatible with the ``rf24_lite.py`` module. +* `is_plus_variant` is removed, meaning the + lite version is not compatibility with the older non-plus variants of the nRF24L01. +* `address()` removed. +* `what_happened()` removed. However you can use the following function to dump all available + registers' values (for advanced users): + + .. code-block:: python + + # let `nrf` be the instantiated RF24 object + def dump_registers(end=0x1e): + for i in range(end): + if i in (0xA, 0xB, 0x10): + print(hex(i), "=", nrf._reg_read_bytes(i)) + elif i not in (0x18, 0x19, 0x1a, 0x1b): + print(hex(i), "=", hex(nrf._reg_read(i))) +* `dynamic_payloads` applies to all pipes, not individual pipes. This attribute will return + a `bool` instead of an `int`. `set_dynamic_payloads()` and `get_dynamic_payloads()` have + been removed. +* `payload_length` applies to all pipes, not individual pipes. `set_payload_length()` and + `get_payload_length()` have been removed. +* `load_ack()` is available, but it will not throw exceptions for malformed ``buf`` or + invalid ``pipe_number`` parameters. Rather any call to `load_ack()` with invalid + parameters will have no affect on the TX FIFO. +* `crc` removed. 2-bytes encoding scheme (CRC16) is always enabled. +* `auto_ack` removed. This is always enabled for all pipes. Pass ``ask_no_ack`` parameter + as `True` to :py:meth:`~circuitpython_nrf24l01.rf24.RF24.send()` or `write()` to disable + automatic acknowledgement for TX operations. +* `is_lna_enabled` removed as it only affects non-plus variants of the nRF24L01. +* `pa_level` is available, but it will not accept a `list` or `tuple`. +* `rpd`, `start_carrier_wave()`, & `stop_carrier_wave()` removed. These only perform a + test of the nRF24L01's hardware. +* All comments and docstrings removed, meaning ``help()`` will not provide any specific + information. Exception prompts have also been reduced and adjusted accordingly. +* Cannot switch between different radio configurations using context manager (the `with` + blocks). It is advised that only one `RF24` object be instantiated when RAM is limited + (less than or equal to 32KB). +* `last_tx_arc` attribute removed because it is only meant for troubleshooting. +* `allow_ask_no_ack` attribute removed because it is only provided for the Si24R1 + chinese clone. +* `set_retries()` removed. Use `ard` & `arc` attributes instead. Testing nRF24L01+PA+LNA module ================================= @@ -164,41 +164,40 @@ The following are semi-successful test results using a nRF24L01+PA+LNA module: The Setup ********************************* - I wrapped the PA/LNA module with electrical tape and then foil around that (for shielding) - while being very careful to not let the foil touch any current carrying parts (like the GPIO pins and the soldier joints for the antenna mount). Then I wired up a PA/LNA module with a 3V - regulator (L4931 with a 2.2 µF capacitor between V\ :sub:`out` & GND) using my ItsyBitsy M4 - 5V (USB) pin going directly to the L4931 V\ :sub:`in` pin. The following are experiences from - running simple, ack, & stream examples with a reliable nRF24L01+ (no PA/LNA) on the other end (driven by a Raspberry Pi 2): +I wrapped the PA/LNA module with electrical tape and then foil around that (for shielding) +while being very careful to not let the foil touch any current carrying parts (like the GPIO pins and the soldier joints for the antenna mount). Then I wired up a PA/LNA module with a 3V +regulator (L4931 with a 2.2 µF capacitor between V\ :sub:`out` & GND) using my ItsyBitsy M4 +5V (USB) pin going directly to the L4931 V\ :sub:`in` pin. The following are experiences from +running simple, ack, & stream examples with a reliable nRF24L01+ (no PA/LNA) on the other end (driven by a Raspberry Pi 2): Results (ordered by :py:attr:`~circuitpython_nrf24l01.rf24.RF24.pa_level` settings) *********************************************************************************** - * 0 dBm: ``master()`` worked the first time (during simple example) then continuously failed - (during all examples). ``slave()`` worked on simple & stream examples, but the opposing - ``master()`` node reporting that ACK packets (without payloads) were **not** received from - the PA/LNA module; ``slave()`` failed to send ACK packet payloads during the ack example. - * -6 dBm: ``master()`` worked consistently on simple, ack, & stream example. ``slave()`` worked - reliably on simple & stream examples, but failed to transmit **any** ACK packet payloads in - the ack example. - * -12 dBm: ``master()`` worked consistently on simple, ack, & stream example. ``slave()`` - worked reliably on simple & stream examples, but failed to transmit **some** ACK packet - payloads in the ack example. - * -18 dBm: ``master()`` worked consistently on simple, ack, & stream example. ``slave()`` - worked reliably on simple, ack, & stream examples, meaning **all** ACK packet payloads were - successfully transmit in the ack example. - - I should note that without shielding the PA/LNA module and using the L4931 3V regulator, - no TX transmissions got sent (including ACK packets for the `auto_ack` feature). - +* 0 dBm: ``master()`` worked the first time (during simple example) then continuously failed + (during all examples). ``slave()`` worked on simple & stream examples, but the opposing + ``master()`` node reporting that ACK packets (without payloads) were **not** received from + the PA/LNA module; ``slave()`` failed to send ACK packet payloads during the ack example. +* -6 dBm: ``master()`` worked consistently on simple, ack, & stream example. ``slave()`` worked + reliably on simple & stream examples, but failed to transmit **any** ACK packet payloads in + the ack example. +* -12 dBm: ``master()`` worked consistently on simple, ack, & stream example. ``slave()`` + worked reliably on simple & stream examples, but failed to transmit **some** ACK packet + payloads in the ack example. +* -18 dBm: ``master()`` worked consistently on simple, ack, & stream example. ``slave()`` + worked reliably on simple, ack, & stream examples, meaning **all** ACK packet payloads were + successfully transmit in the ack example. + +I should note that without shielding the PA/LNA module and using the L4931 3V regulator, +no TX transmissions got sent (including ACK packets for the `auto_ack` feature). Conclusion ********************************* - The PA/LNA modules seem to require quite a bit more power to transmit. The L4931 regulator - that I used in the tests boasts a 300 mA current limit and a typical current of 250 mA. - While the ItsyBitsy M4 boasts a 500 mA max, it would seem that much of that is consumed - internally. Since playing with the `pa_level` is a current saving hack (as noted in the - datasheet), I can only imagine that a higher power 3V regulator may enable sending - transmissions (including ACK packets -- with or without ACK payloads attached) from PA/LNA - modules using higher `pa_level` settings. More testing is called for, but I don't have an - oscilloscope to measure the peak current draws. +The PA/LNA modules seem to require quite a bit more power to transmit. The L4931 regulator +that I used in the tests boasts a 300 mA current limit and a typical current of 250 mA. +While the ItsyBitsy M4 boasts a 500 mA max, it would seem that much of that is consumed +internally. Since playing with the `pa_level` is a current saving hack (as noted in the +datasheet), I can only imagine that a higher power 3V regulator may enable sending +transmissions (including ACK packets -- with or without ACK payloads attached) from PA/LNA +modules using higher `pa_level` settings. More testing is called for, but I don't have an +oscilloscope to measure the peak current draws. From 9ca1d782ace7f9c0d2b4354a43c0af92b8013c6a Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 30 Dec 2020 02:57:56 -0800 Subject: [PATCH 061/103] use correct lib/repo title --- docs/conf.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index c8efff9..52c7ccb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -186,16 +186,16 @@ def pygments_monkeypatch_style(mod_name, cls): html_theme_options = { # Set the name of the project to appear in the navigation. - "nav_title": "RF24 Revamped", + "nav_title": "CircuitPython-nRF24L01", # Specify a base_url used to generate sitemap.xml. If not # specified, then no sitemap will be built. - "base_url": "https://2bndy5.github.io/RF24-Revamped/", + "base_url": "https://2bndy5.github.io/CircuitPython_nRF24L01/", # Set the color and the accent color "color_primary": "blue", "color_accent": "light-green", # Set the repo location to get a badge with stats - "repo_url": "https://github.com/2bndy5/RF24-Revamped/", - "repo_name": "RF24-Revamped", + "repo_url": "https://github.com/2bndy5/CircuitPython_nRF24L01/", + "repo_name": "CircuitPython_nRF24L01", # Visible levels of the global TOC; -1 means unlimited "globaltoc_depth": 1, # If False, expand all TOC entries From 81cc2e80ca03f9a6b353a6601161960b814ae30d Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 30 Dec 2020 11:09:50 -0800 Subject: [PATCH 062/103] typos in docs --- docs/examples.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/examples.rst b/docs/examples.rst index 4742427..9fb5adc 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -133,11 +133,11 @@ To make this circuitpython library compatible with 1. set `dynamic_payloads` to `False`. 2. set `allow_ask_no_ack` to `False`. -3. set :py:attr:`~circuitpython_nrf24l01.rf24.RF24payload_length` to the value that +3. set :py:attr:`~circuitpython_nrf24l01.rf24.RF24.payload_length` to the value that is passed to TMRh20's ``RF24::setPayloadSize()``. 32 is the default (& maximum) payload length/size for both libraries. - .. warning:: Certain C++ datatypes allocate a different amountof memory depending on + .. warning:: Certain C++ datatypes allocate a different amount of memory depending on the board being used in the Arduino IDE. For example, ``uint8_t`` isn't always allocated to 1 byte of memory for certain boards. Make sure you understand the amount of memory that different datatypes occupy in C++. From 78b80479053d67ab71df18ddea2e39802af25641 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 30 Dec 2020 13:15:05 -0800 Subject: [PATCH 063/103] fix some doc issues on mobile display --- docs/_static/dark_material.css | 17 ++++++++++++++--- docs/conf.py | 2 +- docs/greetings.rst | 4 ++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/docs/_static/dark_material.css b/docs/_static/dark_material.css index 05247ed..618da28 100644 --- a/docs/_static/dark_material.css +++ b/docs/_static/dark_material.css @@ -21,14 +21,18 @@ body { } .md-typeset .footnote { - color:rgba(255, 255, 255, 0.83); - font-size:.64rem + color: rgba(255, 255, 255, 0.83); + font-size: .64rem } span.highlighted { background-color: #794502; } +.highlight-shell.notranslate .highlight pre { + color:#fcfcfc; +} + .sig-name.descname, .sig-prename.descclassname { background-color: #403f3f; @@ -53,12 +57,19 @@ html body .md-typeset .headerlink { } } +@media only screen and (max-width:76.1875em) { + html .md-nav .md-nav--secondary .md-nav__title { + background-color: rgb(0, 107, 9); + color: rgb(255, 255, 255); + } +} + .md-nav__link[data-md-state="blur"] { color: rgb(150, 125, 238); } .md-nav { - font-size:0.8rem; + font-size: 0.8rem; } .md-typeset h1 { diff --git a/docs/conf.py b/docs/conf.py index 52c7ccb..54d8c8d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -152,7 +152,7 @@ class DarkPlus(Style): Number: "#B3D495", Operator: "#FEFEFE", Operator.Word: "#499DC7", - # Generic.Output: "#99FFA2", + Generic.Output: "#F4DA8B", Generic.Prompt: "#99FFA2", Generic.Traceback: "#FF0909", Generic.Error: "#FF0909", diff --git a/docs/greetings.rst b/docs/greetings.rst index 21c34ff..d1c6fa7 100644 --- a/docs/greetings.rst +++ b/docs/greetings.rst @@ -93,7 +93,7 @@ Pinout .. image:: https://lastminuteengineers.com/wp-content/uploads/2018/07/Pinout-nRF24L01-Wireless-Transceiver-Module.png :target: https://lastminuteengineers.com/nrf24l01-arduino-wireless-communication/#nrf24l01-transceiver-module-pinout -The nRF24L01 is controlled through SPI so there are 3 pins (SCK, MOSI, & MISO) that can only be connected to their counterparts on the MCU (microcontroller unit). The other 2 essential pins (CE & CSN) can be connected to any digital output pins. Lastly, the only optional pin on the nRf24L01 GPIOs is the IRQ (interrupt; a digital output that's active when low) pin and is only connected to the MCU via a digital input pin during the interrupt example. The following pinout is used in the example codes of this library's `example directory `_. +The nRF24L01 is controlled through SPI so there are 3 pins (SCK, MOSI, & MISO) that can only be connected to their counterparts on the MCU (microcontroller unit). The other 2 essential pins (CE & CSN) can be connected to any digital output pins. Lastly, the only optional pin on the nRf24L01 GPIOs is the IRQ (interrupt; a digital output that's active when low) pin and is only connected to the MCU via a digital input pin during the interrupt example. The following pinout is used in the example codes of this library's `examples `_. .. csv-table:: :header: nRF2401, "Raspberry Pi", "ItsyBitsy M4" @@ -112,7 +112,7 @@ The nRF24L01 is controlled through SPI so there are 3 pins (SCK, MOSI, & MISO) t Using The Examples ================== -See `examples `_ for testing certain features of this the library. The examples were developed and tested on both Raspberry Pi and ItsyBitsy M4. Pins have been hard coded in the examples for the corresponding device, so please adjust these accordingly to your circuitpython device if necessary. +See `examples `_ for testing certain features of this the library. The examples were developed and tested on both Raspberry Pi and ItsyBitsy M4. Pins have been hard coded in the examples for the corresponding device, so please adjust these accordingly to your circuitpython device if necessary. To run the simple example, navigate to this repository's "examples" folder in the terminal. If you're working with a CircuitPython device (not a Raspberry Pi), copy the file named "nrf24l01_simple_test.py" from this repository's "examples" folder to the root directory of your CircuitPython device's CIRCUITPY drive. Now you're ready to open a python REPR and run the following commands: From 9c07c96caaea1455e0adc3db2fec40348ea48579 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 30 Dec 2020 17:21:16 -0800 Subject: [PATCH 064/103] move troubleshooting to after API refs --- docs/index.rst | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 6b9304a..1c11c04 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,24 +13,11 @@ Table of Contents examples -.. toctree:: - :caption: Troubleshooting - :maxdepth: 5 - - troubleshooting - .. toctree:: :caption: RF24 API Reference basic_api - - -.. toctree:: - advanced_api - -.. toctree:: - configure_api .. toctree:: @@ -38,6 +25,12 @@ Table of Contents ble_api +.. toctree:: + :caption: Troubleshooting + :maxdepth: 5 + + troubleshooting + .. toctree:: :caption: Store Links From 4b792d72720e72351c206a486acd7f13b5567833 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 30 Dec 2020 17:23:11 -0800 Subject: [PATCH 065/103] doc typo --- docs/configure_api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 2ee5901..19aa990 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -267,7 +267,7 @@ ack Disabling this feature does not disable the `auto_ack` and `dynamic_payloads` attributes for any data pipe; they work just fine without this feature. -allow_ask_ack +allow_ask_no_ack ****************************** .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.allow_ask_no_ack From 6ed161c3f49d1aeee40494af1502db27bc90dc8b Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 30 Dec 2020 17:50:19 -0800 Subject: [PATCH 066/103] add get_auto_retries() --- circuitpython_nrf24l01/rf24.py | 6 +++++- docs/advanced_api.rst | 2 +- docs/configure_api.rst | 13 +++++++++++-- docs/troubleshooting.rst | 2 +- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 3229ea4..e5bff0d 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -562,12 +562,16 @@ def ard(self, delta): self._retry_setup = (self._retry_setup & 15) | int((delta - 250) / 250) << 4 self._reg_write(SETUP_RETR, self._retry_setup) - def set_retries(self, delay, count): + def set_auto_retries(self, delay, count): """set the `ard` & `arc` attributes with 1 function.""" delay = int((max(250, min(delay, 4000)) - 250) / 250) << 4 self._retry_setup = delay | max(0, min(int(count), 15)) self._reg_write(SETUP_RETR, self._retry_setup) + def get_auto_retries(self): + """get the `ard` & `arc` attributes with 1 function.""" + return (self.ard, self._retry_setup & 0x0F) + @property def last_tx_arc(self): """Return the number of attempts made for last transission (read-only).""" diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index 96a88a9..4e5c15c 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -463,7 +463,7 @@ last_tx_arc This attribute resets to 0 at the beginning of every transmission in TX mode. Remember that the number of automatic retry attempts made for each transmission is - configured with the `arc` attribute or the `set_retries()` function. + configured with the `arc` attribute or the `set_auto_retries()` function. rpd ****************************** diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 19aa990..6516f18 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -239,14 +239,23 @@ ard invalid input values are clamped to proper range instead of throwing a `ValueError` exception. -set_retries() +set_auto_retries() ****************************** -.. automethod:: circuitpython_nrf24l01.rf24.RF24.set_retries +.. automethod:: circuitpython_nrf24l01.rf24.RF24.set_auto_retries :param int delay: accepts the same input as the `ard` attribute. :param int count: accepts the same input as the `arc` attribute. +get_auto_retries() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.get_auto_retries + + :Return: + A tuple containing 2 items. Index 0 will be the `ard` + and index 1 will be the `arc`. + ack ****************************** diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index 91409fe..a54ec57 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -154,7 +154,7 @@ version: * `last_tx_arc` attribute removed because it is only meant for troubleshooting. * `allow_ask_no_ack` attribute removed because it is only provided for the Si24R1 chinese clone. -* `set_retries()` removed. Use `ard` & `arc` attributes instead. +* `set_auto_retries()` & `get_auto_retries()` removed. Use `ard` & `arc` attributes instead. Testing nRF24L01+PA+LNA module ================================= From b74b24c587bdd149c4d1adafba5e56543bc4d2f7 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 1 Jan 2021 03:12:43 -0800 Subject: [PATCH 067/103] docs theme finalized; fix typos; some re-organized --- circuitpython_nrf24l01/fake_ble.py | 2 +- circuitpython_nrf24l01/rf24.py | 2 +- docs/_static/dark_material.css | 60 +++++ docs/advanced_api.rst | 376 +++++++++++++++-------------- docs/basic_api.rst | 28 +-- docs/ble_api.rst | 2 + docs/conf.py | 51 +++- docs/configure_api.rst | 100 ++++---- docs/examples.rst | 2 +- docs/index.rst | 26 +- docs/requirements.txt | 3 +- docs/troubleshooting.rst | 2 +- examples/nrf24l01_context_test.py | 6 +- 13 files changed, 398 insertions(+), 262 deletions(-) diff --git a/circuitpython_nrf24l01/fake_ble.py b/circuitpython_nrf24l01/fake_ble.py index ede3410..2636701 100644 --- a/circuitpython_nrf24l01/fake_ble.py +++ b/circuitpython_nrf24l01/fake_ble.py @@ -255,7 +255,7 @@ def open_tx_pipe(self, address): raise NotImplementedError("BLE implentation only uses 1 address") # pylint: enable=missing-function-docstring - def what_happened(self, dump_pipes=False): + def printDetails(self, dump_pipes=False): """This debuggung function aggregates and outputs all status/condition related information from the nRF24L01.""" print("Is a plus variant_________{}".format(self.is_plus_variant)) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index e5bff0d..7026bcf 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -343,7 +343,7 @@ def interrupt_config(self, data_recv=True, data_sent=True, data_fail=True): self._config |= (not data_fail) << 4 | (not data_sent) << 5 self._reg_write(CONFIGURE, self._config) - def what_happened(self, dump_pipes=False): + def printDetails(self, dump_pipes=False): """This debuggung function aggregates and outputs all status/condition related information from the nRF24L01.""" observer = self._reg_read(8) diff --git a/docs/_static/dark_material.css b/docs/_static/dark_material.css index 618da28..5001d8e 100644 --- a/docs/_static/dark_material.css +++ b/docs/_static/dark_material.css @@ -33,6 +33,53 @@ span.highlighted { color:#fcfcfc; } +.highlight .cpf { + color: #B88451; +} + +.md-typeset .admonition.tip .admonition-title::before, +.md-typeset .admonition.hint .admonition-title::before { + content: "\E80C"; +} + +.md-typeset .admonition.seealso .admonition-title::before { + content: "\E417"; + color: hsl(301, 100%, 63%); +} + +.md-typeset .admonition.seealso { + border-left:.2rem solid hsl(301, 100%, 63%); +} + +.md-typeset .admonition.seealso .admonition-title { + background-color:hsla(287, 100%, 63%, 0.1); +} + +.md-typeset .admonition.important .admonition-title::before { + content: "\E031"; + color: hsl(123, 100%, 63%); +} + +.md-typeset .admonition.important { + border-left:.2rem solid hsl(123, 100%, 63%); +} + +.md-typeset .admonition.important .admonition-title { + background-color:hsla(123, 100%, 63%, 0.1); +} + +.md-typeset .admonition.warning .admonition-title::before { + color: hsl(0, 100%, 63%); +} + +.md-typeset .admonition.warning { + border-left:.2rem solid hsl(0, 100%, 63%); +} + +.md-typeset .admonition.warning .admonition-title { + background-color:hsla(0, 100%, 63%, 0.1); +} + .sig-name.descname, .sig-prename.descclassname { background-color: #403f3f; @@ -102,4 +149,17 @@ html .md-nav--primary .md-nav__title~.md-nav__list { html [data-md-color-primary=blue] .md-nav--primary .md-nav__title--site { background-color: #006B09; +} + +.md-typeset table:not([class]) th { + background-color:rgba(23, 35, 83, 0.8); +} + +.md-typeset table:not([class]) tr:hover { + background-color:rgba(56, 2, 81, 0.8); + box-shadow:inset 0 .05rem 0 #9515ff; +} + +table { + background-color: hsl(0, 0%, 16%); } \ No newline at end of file diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index 4e5c15c..af0a0df 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -10,13 +10,118 @@ other SPI transactions. Use the :py:func:`~circuitpython_nrf24l01.rf24.RF24.update()` function to manually refresh this data when needed -Advanced API ------------- +Advanced RF24 API +----------------- -what_happened() +resend() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.resend + + This function is meant to be used for payloads that failed to transmit using the + `send()` function. If a payload failed to transmit using the `write()` function, + just call `clear_status_flags()` and re-start the pulse on the nRF24L01's CE pin. + + :returns: Data returned from this function follows the same pattern that `send()` + returns with the added condition that this function will return `False` if the TX + FIFO buffer is empty. + :param bool send_only: This parameter only applies when the `ack` attribute is set to + `True`. Pass this parameter as `True` if the RX FIFO is not to be manipulated. Many + other libraries' behave as though this parameter is `True` + (e.g. The popular TMRh20 Arduino RF24 library). This parameter defaults to `False`. + If this parameter is set to `True`, then use `read()` to get the ACK payload + (if there is any) from the RX FIFO. Remember that the RX FIFO can only hold + up to 3 payloads at once. + + .. note:: The nRF24L01 normally removes a payload from the TX FIFO buffer after successful + transmission, but not when this function is called. The payload (successfully + transmitted or not) will remain in the TX FIFO buffer until `flush_tx()` is called to + remove them. Alternatively, using this function also allows the failed payload to be + over-written by using `send()` or `write()` to load a new payload into the TX FIFO + buffer. + +write() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.write + + This function isn't completely non-blocking as we still need to wait + for the necessary SPI transactions to complete. Example usage of + this function can be seen in the `IRQ pin example `_ and + in the `Stream example's "master_fifo()" function `_ + + :returns: `True` if the payload was added to the TX FIFO buffer. `False` if the TX FIFO + buffer is already full, and no payload could be added to it. + :param bytearray buf: The payload to transmit. This bytearray must have a length greater + than 0 and less than 32 bytes, otherwise a `ValueError` exception is thrown. + + - If the `dynamic_payloads` attribute is disabled for data pipe 0 and this bytearray's + length is less than the `payload_length` attribute for data pipe 0, then this + bytearray is padded with zeros until its length is equal to the `payload_length` + attribute for data pipe 0. + - If the `dynamic_payloads` attribute is disabled for data pipe 0 and this bytearray's + length is greater than `payload_length` attribute for data pipe 0, then this + bytearray's length is truncated to equal the `payload_length` attribute for data + pipe 0. + :param bool ask_no_ack: Pass this parameter as `True` to tell the nRF24L01 not to wait for + an acknowledgment from the receiving nRF24L01. This parameter directly controls a + ``NO_ACK`` flag in the transmission's Packet Control Field (9 bits of information about + the payload). Therefore, it takes advantage of an nRF24L01 feature specific to + individual payloads, and its value is not saved anywhere. You do not need to specify + this for every payload if the `auto_ack` attribute is disabled, however setting this + parameter to `True` will work despite the `auto_ack` attribute's setting. + + .. important:: If the `allow_ask_no_ack` attribute is disabled (set to `False`), + then this parameter will have no affect at all. By default the + `allow_ask_no_ack` attribute is enabled. + + .. note:: Each transmission is in the form of a packet. This packet contains sections + of data around and including the payload. `See Chapter 7.3 in the nRF24L01 + Specifications Sheet `_ for more + details. + :param bool write_only: This function will not manipulate the nRF24L01's CE pin if this + parameter is `True`. The default value of `False` will ensure that the CE pin is + HIGH upon exiting this function. This function does not set the CE pin LOW at + any time. Use this parameter as `True` to fill the TX FIFO buffer before beginning + transmissions. + + .. note:: The nRF24L01 doesn't initiate sending until a mandatory minimum 10 µs pulse + on the CE pin is acheived. If the ``write_only`` parameter is `False`, then that + pulse is initiated before this function exits. However, we have left that 10 µs + wait time to be managed by the MCU in cases of asychronous application, or it is + managed by using `send()` instead of this function. According to the + Specification sheet, if the CE pin remains HIGH for longer than 10 µs, then the + nRF24L01 will continue to transmit all payloads found in the TX FIFO buffer. + + .. warning:: + A note paraphrased from the `nRF24L01+ Specifications Sheet + `_: + + It is important to NEVER to keep the nRF24L01+ in TX mode for more than 4 ms at a time. + If the [`auto_ack` attribute is] enabled, nRF24L01+ is never in TX mode longer than 4 + ms. + + .. tip:: Use this function at your own risk. Because of the underlying + `"Enhanced ShockBurst Protocol" `_, disobeying the 4 + ms rule is easily avoided if the `auto_ack` attribute is greater than ``0``. Alternatively, + you MUST use nRF24L01's IRQ pin and/or user-defined timer(s) to AVOID breaking the + 4 ms rule. If the `nRF24L01+ Specifications Sheet explicitly states this + `_, we have to assume + radio damage or misbehavior as a result of disobeying the 4 ms rule. See also `table 18 + in the nRF24L01 specification sheet `_ for + calculating an adequate transmission timeout sentinal. + .. versionadded:: 1.2.0 + ``write_only`` parameter + +printDetails() ****************************** -.. automethod:: circuitpython_nrf24l01.rf24.RF24.what_happened +.. automethod:: circuitpython_nrf24l01.rf24.RF24.printDetails Some information may be irrelevant depending on nRF24L01's state/condition. @@ -120,9 +225,27 @@ load_ack() (TX FIFO buffer) if it can. Use `flush_tx()` to discard unused ACK payloads when done listening. +Status Byte +****************************** + +tx_full +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.tx_full + + . + + |update manually| (especially after calling + :py:func:`~circuitpython_nrf24l01.rf24.RF24.flush_tx()`). + + :returns: + + - `True` for TX FIFO buffer is full + - `False` for TX FIFO buffer is not full. This doesn't mean the TX FIFO buffer is + empty. irq_dr -****************************** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.irq_dr @@ -144,7 +267,7 @@ irq_dr :py:func:`~circuitpython_nrf24l01.rf24.RF24.clear_status_flags()`). irq_df -****************************** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.irq_df @@ -165,7 +288,7 @@ irq_df :py:func:`~circuitpython_nrf24l01.rf24.RF24.clear_status_flags()`). irq_ds -****************************** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.irq_ds @@ -182,8 +305,46 @@ irq_ds |update manually| (especially after calling :py:func:`~circuitpython_nrf24l01.rf24.RF24.clear_status_flags()`). +update() +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automethod:: circuitpython_nrf24l01.rf24.RF24.update + + Refreshing the status byte is vital to checking status of the interrupt flags, RX pipe + number related to current RX payload, and if the TX FIFO buffer is full. This function + returns nothing, but internally updates the `irq_dr`, `irq_ds`, `irq_df`, `pipe`, and + `tx_full` attributes. Internally this is a helper function to `available()`, `send()`, and `resend()` + functions. + + :returns: `True` for every call. This value is meant to allow this function to be used + in `if` or `while` *in conjunction with* attributes related to the + refreshed status byte. + + .. versionchanged:: 1.2.3 + arbitrarily returns `True` + +pipe +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.pipe + + . + + .. versionchanged:: 1.2.0 + In previous versions of this library, this attribute was a read-only function + (``pipe()``). + + |update manually| (especially after calling + :py:func:`~circuitpython_nrf24l01.rf24.RF24.flush_rx()`). + + :Returns: + + - `None` if there is no payload in RX FIFO. + - The `int` identifying pipe number [0,5] that received the next + available payload in the RX FIFO buffer. + clear_status_flags() -****************************** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. automethod:: circuitpython_nrf24l01.rf24.RF24.clear_status_flags @@ -229,146 +390,11 @@ power nRF24L01+ Specifications Sheet `_ for more details. -tx_full +FIFO management ****************************** -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.tx_full - - . - - |update manually| (especially after calling - :py:func:`~circuitpython_nrf24l01.rf24.RF24.flush_tx()`). - - :returns: - - - `True` for TX FIFO buffer is full - - `False` for TX FIFO buffer is not full. This doesn't mean the TX FIFO buffer is - empty. - -update() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.update - - Refreshing the status byte is vital to checking status of the interrupt flags, RX pipe - number related to current RX payload, and if the TX FIFO buffer is full. This function - returns nothing, but internally updates the `irq_dr`, `irq_ds`, `irq_df`, `pipe`, and - `tx_full` attributes. Internally this is a helper function to `available()`, `send()`, and `resend()` - functions. - - :returns: `True` for every call. This value is meant to allow this function to be used - in `if` or `while` *in conjunction with* attributes related to the - refreshed status byte. - - .. versionchanged:: 1.2.3 - arbitrarily returns `True` - -resend() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.resend - - This function is meant to be used for payloads that failed to transmit using the - `send()` function. If a payload failed to transmit using the `write()` function, - just call `clear_status_flags()` and re-start the pulse on the nRF24L01's CE pin. - - :returns: Data returned from this function follows the same pattern that `send()` - returns with the added condition that this function will return `False` if the TX - FIFO buffer is empty. - :param bool send_only: This parameter only applies when the `ack` attribute is set to - `True`. Pass this parameter as `True` if the RX FIFO is not to be manipulated. Many - other libraries' behave as though this parameter is `True` - (e.g. The popular TMRh20 Arduino RF24 library). This parameter defaults to `False`. - Use `read()` to get the ACK payload (if there is any) from the RX FIFO. Remember that - the RX FIFO can only hold up to 3 payloads at once. - - .. note:: The nRF24L01 normally removes a payload from the TX FIFO buffer after successful - transmission, but not when this function is called. The payload (successfully - transmitted or not) will remain in the TX FIFO buffer until `flush_tx()` is called to - remove them. Alternatively, using this function also allows the failed payload to be - over-written by using `send()` or `write()` to load a new payload into the TX FIFO - buffer. - -write() -****************************** - -.. automethod:: circuitpython_nrf24l01.rf24.RF24.write - - This function isn't completely non-blocking as we still need to wait - for the necessary SPI transactions to complete. Example usage of - this function can be seen in the `IRQ pin example `_ and - in the `Stream example's "master_fifo()" function `_ - - :returns: `True` if the payload was added to the TX FIFO buffer. `False` if the TX FIFO - buffer is already full, and no payload could be added to it. - :param bytearray buf: The payload to transmit. This bytearray must have a length greater - than 0 and less than 32 bytes, otherwise a `ValueError` exception is thrown. - - - If the `dynamic_payloads` attribute is disabled for data pipe 0 and this bytearray's - length is less than the `payload_length` attribute for data pipe 0, then this - bytearray is padded with zeros until its length is equal to the `payload_length` - attribute for data pipe 0. - - If the `dynamic_payloads` attribute is disabled for data pipe 0 and this bytearray's - length is greater than `payload_length` attribute for data pipe 0, then this - bytearray's length is truncated to equal the `payload_length` attribute for data - pipe 0. - :param bool ask_no_ack: Pass this parameter as `True` to tell the nRF24L01 not to wait for - an acknowledgment from the receiving nRF24L01. This parameter directly controls a - ``NO_ACK`` flag in the transmission's Packet Control Field (9 bits of information about - the payload). Therefore, it takes advantage of an nRF24L01 feature specific to - individual payloads, and its value is not saved anywhere. You do not need to specify - this for every payload if the `auto_ack` attribute is disabled, however setting this - parameter to `True` will work despite the `auto_ack` attribute's setting. - - .. important:: If the `allow_ask_no_ack` attribute is disabled (set to `False`), - then this parameter will have no affect at all. By default the - `allow_ask_no_ack` attribute is enabled. - - .. note:: Each transmission is in the form of a packet. This packet contains sections - of data around and including the payload. `See Chapter 7.3 in the nRF24L01 - Specifications Sheet `_ for more - details. - :param bool write_only: This function will not manipulate the nRF24L01's CE pin if this - parameter is `True`. The default value of `False` will ensure that the CE pin is - HIGH upon exiting this function. This function does not set the CE pin LOW at - any time. Use this parameter as `True` to fill the TX FIFO buffer before beginning - transmissions. - - .. note:: The nRF24L01 doesn't initiate sending until a mandatory minimum 10 µs pulse - on the CE pin is acheived. If the ``write_only`` parameter is `False`, then that - pulse is initiated before this function exits. However, we have left that 10 µs - wait time to be managed by the MCU in cases of asychronous application, or it is - managed by using `send()` instead of this function. According to the - Specification sheet, if the CE pin remains HIGH for longer than 10 µs, then the - nRF24L01 will continue to transmit all payloads found in the TX FIFO buffer. - - .. warning:: - A note paraphrased from the `nRF24L01+ Specifications Sheet - `_: - - It is important to NEVER to keep the nRF24L01+ in TX mode for more than 4 ms at a time. - If the [`auto_ack` attribute is] enabled, nRF24L01+ is never in TX mode longer than 4 - ms. - - .. tip:: Use this function at your own risk. Because of the underlying - `"Enhanced ShockBurst Protocol" `_, disobeying the 4 - ms rule is easily avoided if the `auto_ack` attribute is greater than ``0``. Alternatively, - you MUST use nRF24L01's IRQ pin and/or user-defined timer(s) to AVOID breaking the - 4 ms rule. If the `nRF24L01+ Specifications Sheet explicitly states this - `_, we have to assume - radio damage or misbehavior as a result of disobeying the 4 ms rule. See also `table 18 - in the nRF24L01 specification sheet `_ for - calculating an adequate transmission timeout sentinal. - .. versionadded:: 1.2.0 - ``write_only`` parameter - flush_rx() -****************************** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. automethod:: circuitpython_nrf24l01.rf24.RF24.flush_rx @@ -378,7 +404,7 @@ flush_rx() function clears all 3 levels. flush_tx() -****************************** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. automethod:: circuitpython_nrf24l01.rf24.RF24.flush_tx @@ -390,7 +416,7 @@ flush_tx() can be altered). fifo() -****************************** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. automethod:: circuitpython_nrf24l01.rf24.RF24.fifo @@ -414,25 +440,6 @@ fifo() - ``2`` means the specified FIFO buffer is full - ``0`` means the specified FIFO buffer is neither full nor empty -pipe -****************************** - -.. autoattribute:: circuitpython_nrf24l01.rf24.RF24.pipe - - . - - .. versionchanged:: 1.2.0 - In previous versions of this library, this attribute was a read-only function - (``pipe()``). - - |update manually| (especially after calling - :py:func:`~circuitpython_nrf24l01.rf24.RF24.flush_rx()`). - - :Returns: - - - `None` if there is no payload in RX FIFO. - - The `int` identifying pipe number [0,5] that received the next - available payload in the RX FIFO buffer. address_length ****************** @@ -465,9 +472,12 @@ last_tx_arc Remember that the number of automatic retry attempts made for each transmission is configured with the `arc` attribute or the `set_auto_retries()` function. -rpd +Ambiguous Signal Detection ****************************** +rpd +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.rpd The RPD flag is triggered in the following cases: @@ -487,7 +497,7 @@ rpd .. versionadded:: 1.2.0 start_carrier_wave() -****************************** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. automethod:: circuitpython_nrf24l01.rf24.RF24.start_carrier_wave @@ -514,17 +524,22 @@ start_carrier_wave() .. note:: To preserve backward compatibility with non-plus variants of the nRF24L01, this function will also change certain settings if `is_plus_variant` - is `False`. These settings changes include disabling `crc`, disabling - `auto_ack`, disabling `arc`, setting `ard` to 250 microseconds, changing the - TX address to ``b"\xFF\xFF\xFF\xFF\xFF"``, and loading a 32-byte payload (each - byte is ``0xFF``) into the TX FIFO buffer while continuously behaving like - `resend()` to establish the constant carrier wave. If `is_plus_variant` is - `True`, then none of these changes are needed nor applied. + is `False`. These settings changes include + + - disabling `crc` + - disabling `auto_ack` + - disabling `arc` and setting `ard` to 250 microseconds + - changing the TX address to ``b"\xFF\xFF\xFF\xFF\xFF"`` + - loading a 32-byte payload (each byte is ``0xFF``) into the TX FIFO buffer + + Finally the radio continuously behaves like using `resend()` to establish + the constant carrier wave. If `is_plus_variant` is `True`, then none of these + changes are needed nor applied. .. versionadded:: 1.2.0 stop_carrier_wave() -****************************** +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. automethod:: circuitpython_nrf24l01.rf24.RF24.stop_carrier_wave @@ -532,5 +547,16 @@ stop_carrier_wave() .. note:: Calling this function puts the nRF24L01 to sleep (AKA power down mode). + .. hint:: If the radio is a non-plus variant (`is_plus_variant` returns + `False`), then use the following code snippet to re-establish the library + default settings: + + .. code-block:: + + # let `nrf` be the instantiated RF24 object + nrf.crc = 2 + nrf.auto_ack = True + nrf.set_auto_retries(1500, 3) + nrf.open_tx_pipe(nrf.address()) .. versionadded:: 1.2.0 diff --git a/docs/basic_api.rst b/docs/basic_api.rst index ec2728b..7d74d17 100644 --- a/docs/basic_api.rst +++ b/docs/basic_api.rst @@ -1,6 +1,6 @@ -Basic API ---------- +Basic RF24 API +-------------- Constructor ****************** @@ -123,13 +123,7 @@ available() # let `nrf` be the instantiated RF24 object nrf.update() and nrf.pipe is not None - .. versionadded:: 1.0.0-rc1 - .. versionchanged:: 1.0.0-rc3 - removed due to synonomous behavior with `any()`. .. versionadded:: 2.0.0 - re-introduced as convenience to simplify using - ``nrf.update() and nrf.pipe is not None``. This seemed appropriate since the - underlying behavior of `any()` has changed since version 1.0.0 read() ****************** @@ -173,6 +167,11 @@ read() .. versionadded:: 1.2.0 ``length`` parameter + ..versionchanged:: 2.0.0 + renamed this method from ``recv()`` to ``read()`` beccause it isn't doing + any actual receiving. Rather, it is only reading data from the RX FIFO that + was already received. + send() ****************** @@ -216,7 +215,6 @@ send() .. important:: If the `allow_ask_no_ack` attribute is disabled (set to `False`), then this parameter will have no affect at all. By default the `allow_ask_no_ack` attribute is enabled. - .. note:: Each transmission is in the form of a packet. This packet contains sections of data around and including the payload. `See Chapter 7.3 in the nRF24L01 Specifications Sheet `_. During multi-payload processing, this parameter is meant to slow down CircuitPython devices just enough for the Raspberry Pi to catch up (due to the Raspberry Pi's seemingly slower SPI speeds). @@ -233,11 +232,12 @@ send() `True`. Pass this parameter as `True` if the RX FIFO is not to be manipulated. Many other libraries' behave as though this parameter is `True` (e.g. The popular TMRh20 Arduino RF24 library). This parameter defaults to `False`. - Use `read()` to get the ACK payload (if there is any) from the RX FIFO.Remember that - the RX FIFO can only hold up to 3 payloads at once. + If this parameter is set to `True`, then use `read()` to get the ACK payload + (if there is any) from the RX FIFO. Remember that the RX FIFO can only hold + up to 3 payloads at once. - .. tip:: It is highly recommended that `auto_ack` attribute is enabled (greater than - ``0``) when sending multiple payloads. Test results with the `auto_ack` attribute + .. tip:: It is highly recommended that `auto_ack` attribute is enabled + when sending multiple payloads. Test results with the `auto_ack` attribute disabled were rather poor (less than 79% received by a Raspberry Pi). This same advice applies to the ``ask_no_ack`` parameter (leave it as `False` for multiple payloads). diff --git a/docs/ble_api.rst b/docs/ble_api.rst index a892407..4e6d0f5 100644 --- a/docs/ble_api.rst +++ b/docs/ble_api.rst @@ -1,3 +1,5 @@ +BLE API +================= .. versionadded:: 1.2.0 BLE API added diff --git a/docs/conf.py b/docs/conf.py index 54d8c8d..939db43 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -34,7 +34,8 @@ "sphinx.ext.todo", "sphinx.ext.viewcode", "sphinx_copybutton", - # "rst2pdf.pdfbuilder", # for pdf builder support + "sphinx_sitemap", + # "rst2pdf.pdfbuilder", # for local pdf builder support ] # Uncomment the below if you use native CircuitPython modules such as @@ -52,6 +53,8 @@ "CircuitPython": ("https://circuitpython.readthedocs.io/en/latest/", None), } +html_baseurl = "https://circuitpython-nrf24l01.readthedocs.io/" + # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] @@ -72,7 +75,7 @@ # built documents. # # The short X.Y version. -version = u"2.0" +version = u"dev" # The full version, including alpha/beta/rc tags. release = u"2.0.0" @@ -80,7 +83,7 @@ # for a list of supported languages. # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = "en" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -187,23 +190,53 @@ def pygments_monkeypatch_style(mod_name, cls): html_theme_options = { # Set the name of the project to appear in the navigation. "nav_title": "CircuitPython-nRF24L01", - # Specify a base_url used to generate sitemap.xml. If not - # specified, then no sitemap will be built. - "base_url": "https://2bndy5.github.io/CircuitPython_nRF24L01/", + # A list of dictionaries where each has three keys: + # href: The URL or pagename (str) + # title: The title to appear (str) + # internal: Flag indicating to use pathto (bool) + "nav_links": [ + { + "href": "examples", + "title": "Examples", + "internal": True + }, + { + "href": "basic_api", + "title": "Basic API", + "internal": True + }, + { + "href": "advanced_api", + "title": "Advanced API", + "internal": True + }, + { + "href": "configure_api", + "title": "Configuration API", + "internal": True + }, + { + "href": "ble_api", + "title": "BLE API Reference", + "internal": True + }, + + ], # Set the color and the accent color "color_primary": "blue", - "color_accent": "light-green", + "color_accent": "light-blue", # Set the repo location to get a badge with stats "repo_url": "https://github.com/2bndy5/CircuitPython_nRF24L01/", "repo_name": "CircuitPython_nRF24L01", # Visible levels of the global TOC; -1 means unlimited "globaltoc_depth": 1, # If False, expand all TOC entries - "globaltoc_collapse": True, + "globaltoc_collapse": False, # If True, show hidden TOC entries - "globaltoc_includehidden": False, + "globaltoc_includehidden": True, } + # Set link name generated in the top bar. html_title = "CircuitPython-nRF24L01" diff --git a/docs/configure_api.rst b/docs/configure_api.rst index 6516f18..3252061 100644 --- a/docs/configure_api.rst +++ b/docs/configure_api.rst @@ -6,8 +6,8 @@ .. |mostly_rx_but_tx0| replace:: This attribute mostly relates to RX operations, but data pipe 0 applies to TX operations also. -Configuration API ------------------ +Configurable RF24 API +----------------------- dynamic_payloads ****************************** @@ -17,14 +17,9 @@ dynamic_payloads .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.dynamic_payloads - Default setting is enabled on all pipes. + Default setting is enabled on all pipes. A valid input is: - - `True` enables nRF24L01's dynamic payload length feature for all data pipes. - The `payload_length` attribute is ignored when this feature is enabled for all - respective data pipes. - - `False` disables nRF24L01's dynamic payload length feature for all data pipes. - Be sure to adjust the `payload_length` attribute accordingly when this feature is - disabled for any respective data pipes. + - A `bool` to enable (`True`) or disable (`False`) the dynamic payload length feature for all data pipes. - A `list` or `tuple` containing booleans or integers |per_data_pipe_control| If any index's value is less than 0 (a negative value), then the pipe corresponding to that index will remain unaffected. @@ -32,19 +27,26 @@ dynamic_payloads per pipe. Bit position 0 controls this feature for data pipe 0, and bit position 5 controls this feature for data pipe 5. All bits in positions greater than 5 are ignored. + .. note:: + - The `payload_length` attribute is ignored when this feature is enabled + for any respective data pipes. + - Be sure to adjust the `payload_length` attribute accordingly when this + feature is disabled for any respective data pipes. + :returns: An `int` (1 unsigned byte) where each bit in the integer represents the dynamic - payload feature per pipe. - - :setter: `set_dynamic_payloads()` - :getter: `get_dynamic_payloads()` + payload length feature per pipe. .. versionchanged:: 1.2.0 - accepts a list or tuple for control of the dynamic payload feature per pipe. + accepts a list or tuple for control of the dynamic payload length feature per pipe. .. versionchanged:: 2.0.0 - returns a integer instead of a boolean - - accepts an integer for binary control of the dynamic payload feature per pipe + - accepts an integer for binary control of the dynamic payload length + feature per pipe + +set_dynamic_payloads() +^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. automethod:: circuitpython_nrf24l01.rf24.RF24.set_dynamic_payloads @@ -57,6 +59,9 @@ dynamic_payloads .. versionadded:: 2.0.0 +get_dynamic_payloads() +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. automethod:: circuitpython_nrf24l01.rf24.RF24.get_dynamic_payloads :param int pipe_number: The specific data pipe number in range [0, 5] concerning the @@ -77,10 +82,10 @@ payload_length A valid input value must be: - * an `int` value that is clamped to the range [1, 32]. Setting this attribute to a + * an `int` in which the value that will be clamped to the range [1, 32]. Setting this attribute to a single `int` configures all 6 data pipes. * A `list` or `tuple` containing integers |per_data_pipe_control| If any index's - value is ``0``, then the existing setting for the corresponding data pipe will + value is less than or equal to``0``, then the existing setting for the corresponding data pipe will persist (not be changed). Default is set to the nRF24L01's maximum of 32 (on all data pipes). @@ -88,9 +93,6 @@ payload_length :returns: The current setting of the expected static payload length feature for pipe 0 only. - :setter: `set_payload_length()` - :getter: `get_payload_length()` - .. versionchanged:: 1.2.0 return a list of all payload length settings for all pipes. This implementation introduced a couple bugs: @@ -106,6 +108,9 @@ payload_length only. Use `get_payload_length()` to fetch the configuration of the static payload length feature for any data pipe. +set_payload_length() +^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. automethod:: circuitpython_nrf24l01.rf24.RF24.set_payload_length This function only affects data pipes for which the `dynamic_payloads` attribute is @@ -121,6 +126,9 @@ payload_length .. versionadded:: 2.0.0 +get_payload_length() +^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. automethod:: circuitpython_nrf24l01.rf24.RF24.get_payload_length The data returned by this function is only relevant for data pipes in which the @@ -145,14 +153,9 @@ auto_ack .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.auto_ack - Default setting is enabled on all data pipes. + Default setting is enabled on all data pipes. A valid input is: - - `True` enables transmitting automatic acknowledgment packets for all data pipes. - The CRC (cyclic redundancy checking) is enabled (for all transmissions) automatically by - the nRF24L01 if this attribute is enabled for any data pipe (see also `crc` attribute). - - `False` disables transmitting automatic acknowledgment packets for all data - pipes. The `crc` attribute will remain unaffected when disabling this attribute for any - data pipes. + - A `bool` to enable (`True`) or disable (`False`) transmitting automatic acknowledgment packets for all data pipes. - A `list` or `tuple` containing booleans or integers |per_data_pipe_control| If any index's value is less than 0 (a negative value), then the pipe corresponding to that index will remain unaffected. @@ -160,13 +163,15 @@ auto_ack per pipe. Bit position 0 controls this feature for data pipe 0, and bit position 5 controls this feature for data pipe 5. All bits in positions greater than 5 are ignored. + .. note:: The CRC (cyclic redundancy checking) is enabled (for all + transmissions) automatically by the nRF24L01 if this attribute is enabled + for any data pipe (see also `crc` attribute). The `crc` attribute will + remain unaffected when disabling this attribute for any data pipes. + :returns: An `int` (1 unsigned byte) where each bit in the integer represents the automatic acknowledgement feature per pipe. - :setter: `set_auto_ack()` - :getter: `get_auto_ack()` - .. versionchanged:: 1.2.0 accepts a list or tuple for control of the automatic acknowledgement feature per pipe. .. versionchanged:: 2.0.0 @@ -175,6 +180,9 @@ auto_ack - accepts an integer for binary control of the automatic acknowledgement feature per pipe +set_auto_ack() +^^^^^^^^^^^^^^^^^^^^^^^ + .. automethod:: circuitpython_nrf24l01.rf24.RF24.set_auto_ack :param bool enable: The state of the automatic acknowledgement feature about a specified @@ -186,6 +194,9 @@ auto_ack .. versionadded:: 2.0.0 +get_auto_ack() +^^^^^^^^^^^^^^^^^^^^^^^ + .. automethod:: circuitpython_nrf24l01.rf24.RF24.get_auto_ack :param int pipe_number: The specific data pipe number in range [0, 5] concerning the @@ -195,9 +206,12 @@ auto_ack .. versionadded:: 2.0.0 -arc +Auto-Retry feature ****************************** +arc +^^^^^^^^^^^^^^^^^^^^^^^ + .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.arc The `auto_ack` attribute must be enabled on the receiving nRF24L01's pipe 0 & the @@ -215,7 +229,7 @@ arc exception. ard -****************************** +^^^^^^^^^^^^^^^^^^^^^^^ .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.ard @@ -240,7 +254,7 @@ ard exception. set_auto_retries() -****************************** +^^^^^^^^^^^^^^^^^^^^^^^ .. automethod:: circuitpython_nrf24l01.rf24.RF24.set_auto_retries @@ -248,27 +262,31 @@ set_auto_retries() :param int count: accepts the same input as the `arc` attribute. get_auto_retries() -****************************** +^^^^^^^^^^^^^^^^^^^^^^^ .. automethod:: circuitpython_nrf24l01.rf24.RF24.get_auto_retries :Return: - A tuple containing 2 items. Index 0 will be the `ard` - and index 1 will be the `arc`. + A tuple containing 2 items; index 0 will be the `ard` attribute, + and index 1 will be the `arc` attribute. ack ****************************** .. autoattribute:: circuitpython_nrf24l01.rf24.RF24.ack - Use this attribute to set/check if the custom ACK payloads feature is enabled. Default + Use this attribute to set/check if the custom ACK payloads feature is + enabled (`True`) or disabled (`False`). Default setting is `False`. - - `True` enables the use of custom ACK payloads in the ACK packet when responding to - receiving transmissions. - - `False` disables the use of custom ACK payloads in the ACK packet when responding to - receiving transmissions. + .. note:: This attribute differs from the `auto_ack` attribute because the + `auto_ack` attribute enables or disables the use of automatic ACK *packets*. By default, + ACK *packets* have no *payload*. This attribute enables or disables attaching + payloads to the ACK packets. + .. seealso:: + Use `load_ack()` attach ACK payloads. + Use `read()`, `send()`, `resend()` to retrieve ACK payloads. .. important:: As `dynamic_payloads` and `auto_ack` attributes are required for this feature to work, they are automatically enabled (on data pipe 0) as needed. However, it is required to diff --git a/docs/examples.rst b/docs/examples.rst index 9fb5adc..9f6dda0 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -115,7 +115,7 @@ Fake BLE Example .. versionadded:: 1.2.0 -This is a test to show how to use the nRF24L01 as a BLE advertising beacon using the :py:class:`~circuitpython_nrf24l01.rf24.fake_ble.FakeBLE` class. +This is a test to show how to use the nRF24L01 as a BLE advertising beacon using the `FakeBLE` class. .. literalinclude:: ../examples/nrf24l01_fake_ble_test.py :caption: examples/nrf24l01_fake_ble_test.py diff --git a/docs/index.rst b/docs/index.rst index 1c11c04..04c108d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,38 +1,35 @@ - -Table of Contents -================= +.. include:: greetings.rst .. toctree:: :caption: Introduction - :maxdepth: 4 + :hidden: greetings .. toctree:: :caption: Examples + :hidden: examples .. toctree:: - :caption: RF24 API Reference + :caption: API Reference + :hidden: basic_api advanced_api configure_api - -.. toctree:: - :caption: BLE API Reference - ble_api .. toctree:: :caption: Troubleshooting - :maxdepth: 5 + :hidden: troubleshooting .. toctree:: :caption: Store Links + :hidden: 2.4GHz Transceiver IC - nRF24L01+ SparkFun Transceiver Breakout - nRF24L01+ @@ -40,6 +37,7 @@ Table of Contents .. toctree:: :caption: Other Links + :hidden: Download CircuitPython Reference Documentation @@ -49,10 +47,8 @@ Table of Contents Adafruit Blog Adafruit Store -Indices and tables -================== +Site Glossary +============== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` +:ref:`genindex` diff --git a/docs/requirements.txt b/docs/requirements.txt index bf5467f..f1e994b 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,4 @@ sphinx-material sphinx-copybutton -sphinx-rtd-theme \ No newline at end of file +sphinx-rtd-theme +sphinx-sitemap \ No newline at end of file diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index a54ec57..f180ef5 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -118,7 +118,7 @@ version: * `is_plus_variant` is removed, meaning the lite version is not compatibility with the older non-plus variants of the nRF24L01. * `address()` removed. -* `what_happened()` removed. However you can use the following function to dump all available +* `printDetails()` removed. However you can use the following function to dump all available registers' values (for advanced users): .. code-block:: python diff --git a/examples/nrf24l01_context_test.py b/examples/nrf24l01_context_test.py index 302c133..32207be 100644 --- a/examples/nrf24l01_context_test.py +++ b/examples/nrf24l01_context_test.py @@ -44,13 +44,13 @@ nrf.open_rx_pipe(5, b"1Node") # NOTE we do this inside the "with" block # display current settings of the nrf object - nrf.what_happened(True) # True dumps pipe info + nrf.printDetails(True) # True dumps pipe info print("\nsettings configured by the ble object") with ble as nerf: # the "as nerf" part is optional - nerf.what_happened(1) + nerf.printDetails(1) -# if you examine the outputs from what_happened() you'll see: +# if you examine the outputs from printDetails() you'll see: # pipe 5 is opened using the nrf object, but closed using the ble object. # pipe 0 is closed using the nrf object, but opened using the ble object. # also notice the different addresses bound to the RX pipes From a7ce38643a892c7d5f661facfd6eb5a5532879e7 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 1 Jan 2021 10:24:12 -0800 Subject: [PATCH 068/103] what_happened print_details --- circuitpython_nrf24l01/fake_ble.py | 2 +- circuitpython_nrf24l01/rf24.py | 2 +- docs/advanced_api.rst | 4 ++-- docs/troubleshooting.rst | 2 +- examples/nrf24l01_context_test.py | 6 +++--- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/circuitpython_nrf24l01/fake_ble.py b/circuitpython_nrf24l01/fake_ble.py index 2636701..350db6a 100644 --- a/circuitpython_nrf24l01/fake_ble.py +++ b/circuitpython_nrf24l01/fake_ble.py @@ -255,7 +255,7 @@ def open_tx_pipe(self, address): raise NotImplementedError("BLE implentation only uses 1 address") # pylint: enable=missing-function-docstring - def printDetails(self, dump_pipes=False): + def print_details(self, dump_pipes=False): """This debuggung function aggregates and outputs all status/condition related information from the nRF24L01.""" print("Is a plus variant_________{}".format(self.is_plus_variant)) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 7026bcf..0892355 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -343,7 +343,7 @@ def interrupt_config(self, data_recv=True, data_sent=True, data_fail=True): self._config |= (not data_fail) << 4 | (not data_sent) << 5 self._reg_write(CONFIGURE, self._config) - def printDetails(self, dump_pipes=False): + def print_details(self, dump_pipes=False): """This debuggung function aggregates and outputs all status/condition related information from the nRF24L01.""" observer = self._reg_read(8) diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index af0a0df..bdd720d 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -118,10 +118,10 @@ write() .. versionadded:: 1.2.0 ``write_only`` parameter -printDetails() +print_details() ****************************** -.. automethod:: circuitpython_nrf24l01.rf24.RF24.printDetails +.. automethod:: circuitpython_nrf24l01.rf24.RF24.print_details Some information may be irrelevant depending on nRF24L01's state/condition. diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index f180ef5..e469836 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -118,7 +118,7 @@ version: * `is_plus_variant` is removed, meaning the lite version is not compatibility with the older non-plus variants of the nRF24L01. * `address()` removed. -* `printDetails()` removed. However you can use the following function to dump all available +* `print_details()` removed. However you can use the following function to dump all available registers' values (for advanced users): .. code-block:: python diff --git a/examples/nrf24l01_context_test.py b/examples/nrf24l01_context_test.py index 32207be..54bfe91 100644 --- a/examples/nrf24l01_context_test.py +++ b/examples/nrf24l01_context_test.py @@ -44,13 +44,13 @@ nrf.open_rx_pipe(5, b"1Node") # NOTE we do this inside the "with" block # display current settings of the nrf object - nrf.printDetails(True) # True dumps pipe info + nrf.print_details(True) # True dumps pipe info print("\nsettings configured by the ble object") with ble as nerf: # the "as nerf" part is optional - nerf.printDetails(1) + nerf.print_details(1) -# if you examine the outputs from printDetails() you'll see: +# if you examine the outputs from print_details() you'll see: # pipe 5 is opened using the nrf object, but closed using the ble object. # pipe 0 is closed using the nrf object, but opened using the ble object. # also notice the different addresses bound to the RX pipes From 338a27a14498f5133273f86c71a6b8894398f962 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 1 Jan 2021 11:58:25 -0800 Subject: [PATCH 069/103] update logo & remove relics --- docs/_static/Logo large.png | Bin 105868 -> 94683 bytes docs/_static/Logo large.xcf | Bin 1122617 -> 1307379 bytes docs/_static/Logo.png | Bin 10803 -> 0 bytes docs/_static/darkness.css | 361 ------------------------------------ docs/_static/favicon.ico | Bin 4286 -> 0 bytes 5 files changed, 361 deletions(-) delete mode 100644 docs/_static/Logo.png delete mode 100644 docs/_static/darkness.css delete mode 100644 docs/_static/favicon.ico diff --git a/docs/_static/Logo large.png b/docs/_static/Logo large.png index 309bd4d60a1ec8bc731564d8c4fb5dd3edc2524d..25e42159f1427f4a210c1cd0e18cdf6d84793889 100644 GIT binary patch literal 94683 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

$XBO&CaTH<}Ju?^EyAf@wax#|hoJF-K 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 E2T54hy8r+H literal 105868 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

;|SC!<|4zZ(Z51^w#m25=R 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 z%0A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

?xGc|Kijlp@6nUc0a~NfLtq$w+~`pwh7TL+EED- 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 delta 4817 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 diff --git a/docs/_static/darkness.css b/docs/_static/darkness.css deleted file mode 100644 index d1967f4..0000000 --- a/docs/_static/darkness.css +++ /dev/null @@ -1,361 +0,0 @@ -/* ----------------------table sections---------------------------------------- */ -.wy-table thead, -.rst-content table.docutils thead, -.rst-content table.field-list thead { - color: #fcfcfc; - text-align: center; - background-color: #1a4228; -} - -.wy-table-odd td, -.wy-table-striped tr:nth-child(2n-1) td, -.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td { - background-color: #3d3d3d; -} - -.wy-table-bordered-all td, -.rst-content table.docutils td { - border-bottom: 1px solid #e1e4e5; - border-left: 1px solid #e1e4e5; - text-align: center; -} - -.wy-table caption, -.rst-content table.docutils caption, -.rst-content table.field-list caption, -.caption-text { - color: #fff; -} - -/* ------------------------admonition sections------------------------------- */ -.wy-alert.wy-alert-success .wy-alert-title, -.rst-content .wy-alert-success.note .wy-alert-title, -.rst-content .wy-alert-success.attention .wy-alert-title, -.rst-content .wy-alert-success.caution .wy-alert-title, -.rst-content .wy-alert-success.danger .wy-alert-title, -.rst-content .wy-alert-success.error .wy-alert-title, -.rst-content .hint .wy-alert-title, -.rst-content .important .wy-alert-title, -.rst-content .tip .wy-alert-title, -.rst-content .wy-alert-success.warning .wy-alert-title, -.rst-content .wy-alert-success.seealso .wy-alert-title, -.rst-content .wy-alert-success.admonition-todo .wy-alert-title, -.rst-content .wy-alert-success.admonition .wy-alert-title, -.wy-alert.wy-alert-success .rst-content .admonition-title, -.rst-content .wy-alert.wy-alert-success .admonition-title, -.rst-content .wy-alert-success.note .admonition-title, -.rst-content .wy-alert-success.attention .admonition-title, -.rst-content .wy-alert-success.caution .admonition-title, -.rst-content .wy-alert-success.danger .admonition-title, -.rst-content .wy-alert-success.error .admonition-title, -.rst-content .hint .admonition-title, -.rst-content .important .admonition-title, -.rst-content .tip .admonition-title, -.rst-content .wy-alert-success.warning .admonition-title, -.rst-content .wy-alert-success.seealso .admonition-title, -.rst-content .wy-alert-success.admonition-todo .admonition-title, -.rst-content .wy-alert-success.admonition .admonition-title { - background: #05886e; -} - -.wy-alert.wy-alert-success, -.rst-content .wy-alert-success.note, -.rst-content .wy-alert-success.attention, -.rst-content .wy-alert-success.caution, -.rst-content .wy-alert-success.danger, -.rst-content .wy-alert-success.error, -.rst-content .hint, -.rst-content .important, -.rst-content .tip, -.rst-content .wy-alert-success.warning, -.rst-content .wy-alert-success.seealso, -.rst-content .wy-alert-success.admonition-todo, -.rst-content .wy-alert-success.admonition { - background: #28443e; -} - -.wy-alert.wy-alert-info .wy-alert-title, -.rst-content .note .wy-alert-title, -.rst-content .wy-alert-info.attention .wy-alert-title, -.rst-content .wy-alert-info.caution .wy-alert-title, -.rst-content .wy-alert-info.danger .wy-alert-title, -.rst-content .wy-alert-info.error .wy-alert-title, -.rst-content .wy-alert-info.hint .wy-alert-title, -.rst-content .wy-alert-info.important .wy-alert-title, -.rst-content .wy-alert-info.tip .wy-alert-title, -.rst-content .wy-alert-info.warning .wy-alert-title, -.rst-content .seealso .wy-alert-title, -.rst-content .wy-alert-info.admonition-todo .wy-alert-title, -.rst-content .wy-alert-info.admonition .wy-alert-title, -.wy-alert.wy-alert-info .rst-content .admonition-title, -.rst-content .wy-alert.wy-alert-info .admonition-title, -.rst-content .note .admonition-title, -.rst-content .wy-alert-info.attention .admonition-title, -.rst-content .wy-alert-info.caution .admonition-title, -.rst-content .wy-alert-info.danger .admonition-title, -.rst-content .wy-alert-info.error .admonition-title, -.rst-content .wy-alert-info.hint .admonition-title, -.rst-content .wy-alert-info.important .admonition-title, -.rst-content .wy-alert-info.tip .admonition-title, -.rst-content .wy-alert-info.warning .admonition-title, -.rst-content .seealso .admonition-title, -.rst-content .wy-alert-info.admonition-todo .admonition-title, -.rst-content .wy-alert-info.admonition .admonition-title { - background: #064873; -} - -.wy-alert.wy-alert-info, -.rst-content .note, -.rst-content .wy-alert-info.attention, -.rst-content .wy-alert-info.caution, -.rst-content .wy-alert-info.danger, -.rst-content .wy-alert-info.error, -.rst-content .wy-alert-info.hint, -.rst-content .wy-alert-info.important, -.rst-content .wy-alert-info.tip, -.rst-content .wy-alert-info.warning, -.rst-content .seealso, -.rst-content .wy-alert-info.admonition-todo, -.rst-content .wy-alert-info.admonition { - background: #2d3d48; -} - -.wy-alert.wy-alert-warning .wy-alert-title, -.rst-content .wy-alert-warning.note .wy-alert-title, -.rst-content .attention .wy-alert-title, -.rst-content .caution .wy-alert-title, -.rst-content .wy-alert-warning.danger .wy-alert-title, -.rst-content .wy-alert-warning.error .wy-alert-title, -.rst-content .wy-alert-warning.hint .wy-alert-title, -.rst-content .wy-alert-warning.important .wy-alert-title, -.rst-content .wy-alert-warning.tip .wy-alert-title, -.rst-content .warning .wy-alert-title, -.rst-content .wy-alert-warning.seealso .wy-alert-title, -.rst-content .admonition-todo .wy-alert-title, -.rst-content .wy-alert-warning.admonition .wy-alert-title, -.wy-alert.wy-alert-warning .rst-content .admonition-title, -.rst-content .wy-alert.wy-alert-warning .admonition-title, -.rst-content .wy-alert-warning.note .admonition-title, -.rst-content .attention .admonition-title, -.rst-content .caution .admonition-title, -.rst-content .wy-alert-warning.danger .admonition-title, -.rst-content .wy-alert-warning.error .admonition-title, -.rst-content .wy-alert-warning.hint .admonition-title, -.rst-content .wy-alert-warning.important .admonition-title, -.rst-content .wy-alert-warning.tip .admonition-title, -.rst-content .warning .admonition-title, -.rst-content .wy-alert-warning.seealso .admonition-title, -.rst-content .admonition-todo .admonition-title, -.rst-content .wy-alert-warning.admonition .admonition-title { - background: #ed2222; -} - -.wy-alert.wy-alert-warning, -.rst-content .wy-alert-warning.note, -.rst-content .attention, -.rst-content .caution, -.rst-content .wy-alert-warning.danger, -.rst-content .wy-alert-warning.error, -.rst-content .wy-alert-warning.hint, -.rst-content .wy-alert-warning.important, -.rst-content .wy-alert-warning.tip, -.rst-content .warning, -.rst-content .wy-alert-warning.seealso, -.rst-content .admonition-todo, -.rst-content .wy-alert-warning.admonition { - background: #490707; -} - -/* -------------------------------------general page styling-------------------------------------------- */ -body { - color: #fcfcfc; -} - -.wy-nav-content-wrap, -.wy-nav-content { - background: #242424; -} - -.btn-neutral { - background-color: #275325 !important; - color: #fff !important; -} - -.btn-neutral:hover { - background-color: #006060 !important; - color: #fffafa -} - -.btn-neutral:visited { - color: #fff !important; -} - -html.writer-html5 .rst-content dl.footnote>dd p { - color: #fcfcfc; -} - -/* -------------------------------------sidebar sections------------------------------------------------ */ -.wy-side-nav-search { - background-color: #006B09; - color: #fcfcfc; -} - -.wy-side-nav-search input[type=text] { - background: #3e3e3e; - color: #fcfcfc; -} - -.wy-menu-vertical li.on a, -.wy-menu-vertical li.current>a { - color: #fcfcfc; - background: #242424; -} - -.wy-nav-side { - background: #172353; -} - -.wy-menu-vertical li.on a:hover, -.wy-menu-vertical li.current>a:hover { - background: #395c62; -} - -.wy-menu-vertical li.on a:hover, -.wy-menu-vertical li.current>a:hover { - background: #395c62; -} - -.wy-side-nav-search>div.version { - color: rgba(255, 255, 255, 0.69); -} - -.wy-menu-vertical header, -.wy-menu-vertical p.caption { - color: #43df96; -} - -.wy-nav-top { - background: #006B09; -} - -.wy-menu-vertical li.on a span.toctree-expand, -.wy-menu-vertical li.current>a span.toctree-expand { - color: #f2f2f2; -} - -.wy-menu-vertical li span.toctree-expand { - color: #f2f2f2; -} - -.wy-menu-vertical li.current { - background: #034e69; -} - -.wy-menu-vertical li.toctree-l2 a, -.wy-menu-vertical li.toctree-l3 a, -.wy-menu-vertical li.toctree-l4 a { - color: #f2f2f2; -} - -.wy-menu-vertical li.current a:hover { - background: #3e3e3ecf; -} - -.wy-menu-vertical li.toctree-l2.current>a { - background: #242424; -} - -.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a { - background: #033969; -} - -/* -----------------------------------------API sections-------------------------------------- */ - -.wy-table-bordered-all td, -.rst-content table.docutils td { - text-align: left; -} - -.rst-content table.docutils.citation, -.rst-content table.docutils.footnote { - color: white; -} - -.rst-content dl:not(.docutils) dl dt { - background: #343434; - color: #e5df8e; -} - -.rst-content tt, -.rst-content tt, -.rst-content code { - color: #f3f3f3; -} - -.rst-content dl:not(.docutils) dt { - background: #2e363c; -} - -.rst-content tt.literal, -.rst-content tt.literal, -.rst-content code.literal { - color: #16FF00; - border-color: #303030; -} - -code, -.rst-content tt, -.rst-content code { - background: #000; -} - -.rst-content tt.xref, -a .rst-content tt, -.rst-content tt.xref, -.rst-content code.xref, -a .rst-content tt, -a .rst-content code { - color: #fff; -} - -.rst-content dl:not(.docutils) dl dt { - background: #343434; - color: #e5df8e; -} - -.rst-content dl:not(.docutils) dl dt .headerlink { - color: #29ae5b; -} - -.rst-content dl:not(.docutils) dt .headerlink { - color: #29ae5b4d !important; -} - -.rst-content dl dt .headerlink::after { - visibility: visible; -} - -.rst-content h1:hover .headerlink::after, -.rst-content h2:hover .headerlink::after, -.rst-content .toctree-wrapper p.caption:hover .headerlink::after, -.rst-content h3:hover .headerlink::after, -.rst-content h4:hover .headerlink::after, -.rst-content h5:hover .headerlink::after, -.rst-content h6:hover .headerlink::after, -.rst-content dl dt:hover .headerlink::after, -.rst-content p.caption:hover .headerlink::after, -.rst-content table>caption:hover .headerlink::after, -.rst-content .code-block-caption:hover .headerlink::after { - color: #29ae5b !important; -} - -html.writer-html4 .rst-content dl:not(.docutils)>dt, -html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt { - background: #2e363c; -} - -html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt, -html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt { - background: #2e363c; - color: #2980b1; -} \ No newline at end of file diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico deleted file mode 100644 index c15a1650af557d6ec815ebd7c0b5dbf5cc080676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmc(iTT@%t8HTmbTLO|^B{RuQF8dF1+sS`u|3GnV5NCurSYW$$;sBD+2}$S-;$VR> z*!ajn#&(=Z-R9)9?o6jMz3hMR?3p+3S{oE}NPB1FS+=ab*Lv3Xt?zxmg~y}t&nKUF z#NVEqzwvlJ@OV7G<=|JI-*JfVf9*%_oqePG=NxOG=-7*E4&Qs5*y0{Sc65_ zxlNG&Hiskmy>qbo^6(~C-zHnIT>f|pwm%O$@s9XCv#@)!u;VN5EPkUm0$=F}T^rw^ ztNIsoZoNdu_Fv(<{|df4-@&){J-iQofcMdlu=iiVKKcpP@jqZae+~1+KVf~%!O!A5 z@ytGW<-WVeIh-rj=-By|YyM5H-Bo=lSZ@9qKkEQ`ZwR`70s5r^^noa}p%}E`IJD6O zw6P@AiyYU=P^VH*gJ~!;87Nmct}Q{ip5@57|DQ?A=kmRYMLACka1F7}bP?KMOs=o@ zM;+=_PX@TIokOW%Sw zvkmXkHtg(e>T(BmVHb9B7gqTWtd+a4Dtj>3?!nyPsNRRU^}rqC^G%NRd$3mdPLc15 zIVH{)Yvj3B?l#xv$ZR{pdzb@w&o9CE4(d;vNQ)ehpM^JGdF%DB`R85!g*N;TKZNI_ zkN)@g_+xlfwQ=A7Z_ep+`j6H(?=T0jdvXo&E1!Of_iO*6MqZ+mTItxL79YQcZ@#%bpF{=GSp2O#yGWf zeG{tOLlpYlohJS?w5=EPfkpDk{E|AIt3r$3fp%q?{20{HD6H_~6Mo3iE-t$Lr-}bw z_9^`+Og~tHcc%tBwGK0}0c-s(%=n&MOaF2gdh~4kA#YnIhK68uM8{R#LpfxpY+Dh z+wj+(F@EwlUo`T=cxif5P|rOD%lw68WPs7}svM z#ILWCe}(+DC$0R%BbT2zkms)sh9%z|DuMT}Mt+*}d&2PcH1W@M!^>yd2>DmHTlp(b zpNB>59b*6g9nA0mG+#9l*2tQ|iD?}cJx{DPl4;a_gUFCRu zWD*AX+T^sOlFuB#94*WGKE3~)p1*M+1mAh`WBGb+RPud`HTppm=FF{@_>JNd>Ym!; zeWJPkv<&NSiu}xx8~-r*!K~D_&{qSWXDs=DDzx&GNAxA~gVa`2{Tq4mZ?IPv4qN%z z1E`l4VPtDAe2Ja_E zj$T0jQ)jY{Ivjy#wjQqg`n3Lou8uf21kx#$XmfG-(hw^NU!U=zr z@sE%{u|obvL;kyj|I&Ya=jaX1@kdYi4MCCGTBh4PRd*G;oA7EbCm-WjP*UV5e){wX-s{!`du_%ma8@`Btwsg{)*Btd)N$i0=nYm#ds>5Oa%ew~qyEe{! z_VI2q%(F?A>v2dH{UK;m8F@bt9!f8B=ZhX6Ab+6^zarvKLJ7v9d{JLbCpQx%!9SJ6*+RygSpod4H6581`|My-fOPFvIm? ij#+u`=)qupp7^Zoy>yf-DMy)(JIbZl8`j1<{rMRY83?oh From e34e0d3a79fd1715aeee4ba6bcf172c15e217949 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 1 Jan 2021 23:54:18 -0800 Subject: [PATCH 070/103] add troubleshhoting link to top bar --- docs/conf.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 939db43..bd9dc2e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -202,17 +202,17 @@ def pygments_monkeypatch_style(mod_name, cls): }, { "href": "basic_api", - "title": "Basic API", + "title": "Basic RF24 API", "internal": True }, { "href": "advanced_api", - "title": "Advanced API", + "title": "Advanced RF24 API", "internal": True }, { "href": "configure_api", - "title": "Configuration API", + "title": "Configurable RF24 API", "internal": True }, { @@ -220,7 +220,11 @@ def pygments_monkeypatch_style(mod_name, cls): "title": "BLE API Reference", "internal": True }, - + { + "href": "troubleshooting", + "title": "Troubleshooting", + "internal": True + }, ], # Set the color and the accent color "color_primary": "blue", @@ -238,7 +242,7 @@ def pygments_monkeypatch_style(mod_name, cls): # Set link name generated in the top bar. -html_title = "CircuitPython-nRF24L01" +html_title = "Introduction" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, From d364b1152ba541d09b7090f97bfb7fc7a2d754c7 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 2 Jan 2021 12:35:29 -0800 Subject: [PATCH 071/103] add scanner example --- docs/examples.rst | 12 ++++++ examples/nrf24l01_scanner_test.py | 65 +++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 examples/nrf24l01_scanner_test.py diff --git a/docs/examples.rst b/docs/examples.rst index 9f6dda0..1479406 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -52,6 +52,18 @@ This example shows how use a group of 6 nRF24L01 transceivers to transmit to 1 n :caption: examples/nrf24l01_multiceiver_test.py :linenos: +Scanner Example +--------------- + +.. versionadded:: 2.0.0 + +This example simply scans the entire RF frquency (2.4 GHz to 2.525 GHz) +and outputs a vertical graph of how many signals (out of 10 attempted scans per :py:attr:`~circuitpython_nrf24l01.rf24.RF24.channel`) were detected. This example can be used to find a frequency with the least ambient interference from other radio-emitting sources (i.e. WiFi, Bluetooth, or etc). + +.. literalinclude:: ../examples/nrf24l01_scanner_test.py + :caption: examples/nrf24l01_scanner_test.py + :linenos: + IRQ Pin Example --------------- diff --git a/examples/nrf24l01_scanner_test.py b/examples/nrf24l01_scanner_test.py new file mode 100644 index 0000000..6b98f40 --- /dev/null +++ b/examples/nrf24l01_scanner_test.py @@ -0,0 +1,65 @@ +""" +This is an example of how to use the nRF24L01's builtin +Received Power Detection (RPD). This example does not require a +counterpart node, but a master() function is provided to broadcast a constant +carrier wave (which causes interference) for a certain RF data rate & channel. +""" +import time +import board +import digitalio as dio +from circuitpython_nrf24l01.rf24 import RF24 + +# change these (digital output) pins accordingly +ce = dio.DigitalInOut(board.D4) +csn = dio.DigitalInOut(board.D5) + +spi = board.SPI() +nrf = RF24(spi, csn, ce) + + +def print_header(): + """print the vertical header of channel numbers""" + print("_" * 126 + "\n" + "0" * 100 + "1" * 26) + for i in range(13): + print(str(i % 10) * (10 if i < 12 else 6), sep="", end="") + print("") # endl + for i in range(126): + print(str(i % 10), sep="", end="") + print("\n" + "^" * 126) + +def scan(timeout=20): + """Traverse the spectrum of accessible frequencies and print any detection + of ambient signals. + + :param int timeout: The number of seconds for which scanning is performed. + """ + # set the starting channel (2400 MHz for 1 Mbps or 2401 MHz for 2 Mbps) + start_timer = time.monotonic() # start the timer + loop_count = 0 + while time.monotonic() - start_timer < timeout: + if (loop_count % 19) == 0: + print_header() + signals = [0] * 126 # store the signal count for each channel + for curr_channel in range(126): # for each channel + for _ in range(10): # attempt to scan channel 10 times + nrf.channel = curr_channel + nrf.listen = 1 # start a RX session + time.sleep(0.00013) # wait 130 microseconds + signals[curr_channel] += nrf.rpd * 1 # if interference is present + nrf.listen = 0 # reset the RDP flag + time.sleep(0.00013) + + # ouput the signal counts per channel + for sig in signals: + print(sig if sig else "-", sep="", end="") + print("") # endl + loop_count += 1 + + + +print( + """\ + nRF24L01 scanner test\n\ + Run scan() to initiate scan for ambient signals.\n\ + Or manually broadcast a constant carrier wave.""" +) From d4f9aa0c870c4592631e853eb2479eede48370e7 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 2 Jan 2021 13:03:02 -0800 Subject: [PATCH 072/103] (+) RPD to rf24_lite --- circuitpython_nrf24l01/rf24_lite.py | 4 ++++ docs/troubleshooting.rst | 4 ++-- examples/nrf24l01_scanner_test.py | 5 +++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/circuitpython_nrf24l01/rf24_lite.py b/circuitpython_nrf24l01/rf24_lite.py index b955e62..7ef211b 100644 --- a/circuitpython_nrf24l01/rf24_lite.py +++ b/circuitpython_nrf24l01/rf24_lite.py @@ -347,3 +347,7 @@ def fifo(self, about_tx=False, check_empty=None): if check_empty is None: return (_fifo & (0x30 if about_tx else 0x03)) >> (4 * about_tx) return bool(_fifo & ((2 - bool(check_empty)) << (4 * about_tx))) + + @property + def rpd(self): + return bool(self._reg_read(0x09)) diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index e469836..a964138 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -144,8 +144,8 @@ version: automatic acknowledgement for TX operations. * `is_lna_enabled` removed as it only affects non-plus variants of the nRF24L01. * `pa_level` is available, but it will not accept a `list` or `tuple`. -* `rpd`, `start_carrier_wave()`, & `stop_carrier_wave()` removed. These only perform a - test of the nRF24L01's hardware. +* `start_carrier_wave()`, & `stop_carrier_wave()` removed. These only perform a + test of the nRF24L01's hardware. `rpd` is still available. * All comments and docstrings removed, meaning ``help()`` will not provide any specific information. Exception prompts have also been reduced and adjusted accordingly. * Cannot switch between different radio configurations using context manager (the `with` diff --git a/examples/nrf24l01_scanner_test.py b/examples/nrf24l01_scanner_test.py index 6b98f40..71f0b46 100644 --- a/examples/nrf24l01_scanner_test.py +++ b/examples/nrf24l01_scanner_test.py @@ -7,6 +7,8 @@ import time import board import digitalio as dio +# if running this on a ATSAMD21 M0 based board +# from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 # change these (digital output) pins accordingly @@ -60,6 +62,5 @@ def scan(timeout=20): print( """\ nRF24L01 scanner test\n\ - Run scan() to initiate scan for ambient signals.\n\ - Or manually broadcast a constant carrier wave.""" + Run scan() to initiate scan for ambient signals.""" ) From 33eda64332465e2339be4bf95fc9da955413a86a Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 6 Jan 2021 01:34:50 -0800 Subject: [PATCH 073/103] properly close pipe 0; 2nd draft of HID recipes --- circuitpython_nrf24l01/rf24.py | 2 + docs/conf.py | 2 +- docs/index.rst | 1 + docs/recipes.rst | 50 ++++++++++++++ recipes/wireless_hid_hub.py | 107 ++++++++++++++++++----------- recipes/wireless_hid_mouse.py | 95 +++++++++++++++++++++++++ recipes/wireless_hid_peripheral.py | 17 ----- 7 files changed, 216 insertions(+), 58 deletions(-) create mode 100644 docs/recipes.rst create mode 100644 recipes/wireless_hid_mouse.py delete mode 100644 recipes/wireless_hid_peripheral.py diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 0892355..94128f3 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -197,6 +197,8 @@ def close_rx_pipe(self, pipe_number): if pipe_number < 0 or pipe_number > 5: raise IndexError("pipe number must be in range [0, 5]") self._open_pipes = self._reg_read(OPEN_PIPES) + if not pipe_number: + self._pipe0_read_addr = None if self._open_pipes & (1 << pipe_number): self._open_pipes = self._open_pipes & ~(1 << pipe_number) self._reg_write(OPEN_PIPES, self._open_pipes) diff --git a/docs/conf.py b/docs/conf.py index bd9dc2e..6d9ad32 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -41,7 +41,7 @@ # Uncomment the below if you use native CircuitPython modules such as # digitalio, micropython and busio. List the modules you use. Without it, the # autodoc module docs will fail to generate with a warning. -autodoc_mock_imports = ["digitalio", "busio"] +autodoc_mock_imports = ["digitalio", "busio", "usb_hid", "microcontroller"] autodoc_member_order = "bysource" intersphinx_mapping = { diff --git a/docs/index.rst b/docs/index.rst index 04c108d..5dd7f3b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -11,6 +11,7 @@ :hidden: examples + recipes .. toctree:: :caption: API Reference diff --git a/docs/recipes.rst b/docs/recipes.rst new file mode 100644 index 0000000..b32d2d3 --- /dev/null +++ b/docs/recipes.rst @@ -0,0 +1,50 @@ +Recipes +======== + +USB-HID via RF24 +**************** + +RF24 acting as a hub for HIDs +----------------------------- + +This module uses CircuitPython's builtin usb_hid library as a wireless +hub to extend USB HID interfaces via the nRF24L01 transceivers. + +Dependencies in CircuitPython firmware +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- :py:data:`usb_hid.devices` +- :py:data:`~microcontroller.nvm` + +.. warning:: This recipe is not compatible with linux-based SoC computers + like the Raspberry Pi because the `adafruit-blinka + `_ library + does not provide the :py:mod:`usb_hid` module and non-volatile memory + (:py:data:`~microcontroller.nvm`) access. + +.. literalinclude:: ../recipes/wireless_hid_hub.py + :linenos: + :lines: 15- + +RF24 acting as a mouse HID +-------------------------- + +For simplicity, this recipe uses :py:mod:`board` pins for analog +and digital inputs. But it is highly recommended that your solution +uses a `MCP23017 `_ or +`MCP23008 `_ for digital inputs. +Possible alternative analog +inputs could include: + +- `Cirque Glidepoint circle trackpad + `_ + with the `CircuitPython_Cirque_Pinnacle + `_ library +- `MCP3008 `_ with the + `Adafruit_CircuitPython_MCP3xxx + `_ library + +.. literalinclude:: ../recipes/wireless_hid_mouse.py + :linenos: + :lines: 5- + diff --git a/recipes/wireless_hid_hub.py b/recipes/wireless_hid_hub.py index 7d96469..655f2c0 100644 --- a/recipes/wireless_hid_hub.py +++ b/recipes/wireless_hid_hub.py @@ -1,67 +1,94 @@ """ -HID Hub Recipe -============== - This module uses CircuitPython's builtin usb_hid library as a wireless hub to extend USB HID interfaces via the nRF24L01 transceivers. -Dependencies ------------- +Dependencies in CircuitPython firmware +====================================== -circuitpython firmware (namely the `usb_hid` module) +- usb_hid +- microcontroller.nvm -.. warning:: This is not compatible with linux-based SoC computers - like the Raspberry Pi because the ``adafruit-blinka`` library - does not provide the same *exact* API that the CircuitPython - firmware does (concerning the usb_hid module). +.. warning:: This recipe is not compatible with linux-based SoC computers + like the Raspberry Pi because the `adafruit-blinka library + does not provide the `usb_hid` module and non-volatile memory (`microcontroller.nvm`) access. """ +import time +from os import urandom import board from digitalio import DigitalInOut import usb_hid from circuitpython_nrf24l01.rf24 import RF24 -# from microcontroller import nvm +from microcontroller import nvm # SETUP THE HID LIST -# index 0 for wireless cmds; indices 1-4 will relate to the pipe which -# received the HID data reports to pass on over the USB cable -hid = [b""] + [None] * 4 +# indices 0-3 corresponds to the pipe for which the +# received HID data reports will be forwarded over the USB cable +hid = [None] * 4 for device in usb_hid.devices: if device.usage == 6 and device.usage_page == 1: - hid[1] = device # mouse + hid[0] = device #: mouse elif device.usage == 2 and device.usage_page == 1: - hid[2] = device # keyboard + hid[1] = device #: keyboard elif device.usage == 5 and device.usage_page == 1: - hid[3] = device # gamepad + hid[2] = device #: gamepad elif device.usage == 1 and device.usage_page == 0x0C: - hid[4] = device # consumer - + hid[3] = device #: consumer -# SETUP THE TRANSCEIVER +# INSTANTIATE THE HARDWARE ce_pin = DigitalInOut(board.D4) # the nRF24L01 CE pin csn_pin = DigitalInOut(board.D5) # the nRF24L01 CSN pin spi = board.SPI() # the SPI object for the SPI bus nrf = RF24(spi, csn_pin, ce_pin) # the nRF24L01 object -nrf.address_length = 4 # we only need 4-byte addresses -nrf.open_rx_pipe(0, b"Pair") # pipe for pairing operations -nrf.open_rx_pipe(1, b"6HID") # pipe for mouse HID -nrf.open_rx_pipe(2, b"2HID") # pipe for keyboard HID -nrf.open_rx_pipe(3, b"5HID") # pipe for gamepad HID -nrf.open_rx_pipe(4, b"1HID") # pipe for Consumer HID -nrf.close_rx_pipe(5) # pipe 5 will not be used +multi_func_button = DigitalInOut(board.D2) # the pair/sleep hardware button + +# SETUP THE TRANSCEIVER +if nvm[:4] == b"\xFF" * 4: + # "securely" generate a base address for bonding + nvm[:4] = urandom(4) +# NOTE reset the generated bonding address by +# stopping this script and executing: +# from microcontroller import nvm +# nvm[:4] = b"\xFF" * 4 +# then start this script again + +nrf.open_rx_pipe(0, b"\x33Pair") # pipe for pairing operations +nrf.open_rx_pipe(1, b"\x06" + nvm[:4]) # pipe for mouse HID +nrf.open_rx_pipe(2, b"\x02" + nvm[:4]) # pipe for keyboard HID +nrf.open_rx_pipe(3, b"\x05" + nvm[:4]) # pipe for gamepad HID +nrf.open_rx_pipe(4, b"\x01" + nvm[:4]) # pipe for Consumer HID +nrf.close_rx_pipe(5) # pipe not used (reserved for future features) nrf.ack = True # for returning data to peripherals in ACK payloads +while nrf.load_ack(0, nvm[:4]): + pass # fill the TX FIFO with pairing request responses def host(): """Run this function to enable the nRF24L01 as a wireless HID hub""" - nrf.listen = True # start listening - sleep_cmd = False # can be told to - while not sleep_cmd: - while not nrf.fifo(False, True): - if nrf.pipe: # if pipe number > 0 - # forward the data - hid[nrf.pipe].send_report(nrf.recv()) - else: # use pipe 0 as a cmd interface - hid[0] = nrf.recv() # grab cmd buffer - if hid[0][0] == 0: # if first cmd byte is 0 - sleep_cmd = True # put radio to sleep - nrf.listen = False - nrf.power = False # really; put it to sleep + while multi_func_button.value: + pass # wait till the button is released + with nrf: + nrf.open_rx_pipe(0, nrf.address()) # open pipe for pairing + pairing = True + pairing_timeout = time.monotonic() + 1 # pair for 1 minute + nrf.listen = True # start listening + while not multi_func_button.value: + if nrf.available(): + if 0 < nrf.pipe < 5: # if received from a bonded address + hid[nrf.pipe - 1].send_report(nrf.read()) # forward the data + else: # use pipe 0 as a cmd interface + nrf.read() # discard pairing request + # pipe 0 only open when pairing + # keep TX FIFO full of pairing request responses + nrf.load_ack(0, nvm[:4]) + if pairing and time.monotonic() >= pairing_timeout: + nrf.close_rx_pipe(0) # exit pairing + pairing = False + nrf.listen = False + # radio goes to sleep when exiting the `with` block + while multi_func_button.value: + pass # wait till the button is released + +if __name__ == "__main__": + while True: + if multi_func_button.value: + # if button was pressed, then initiate pairing + host() # conitue acting as host until button is pressed again diff --git a/recipes/wireless_hid_mouse.py b/recipes/wireless_hid_mouse.py new file mode 100644 index 0000000..12e5927 --- /dev/null +++ b/recipes/wireless_hid_mouse.py @@ -0,0 +1,95 @@ +""" +This module uses nRF24L01 transceivers to transport normal +USB HID mouse report data. +""" +import time +import struct +import board +from digitalio import DigitalInOut +from analogio import AnalogIn +# if running this on a ATSAMD21 M0 based board +# from circuitpython_nrf24l01.rf24_lite import RF24 +from circuitpython_nrf24l01.rf24 import RF24 + +address = [b"\x33Pair"] # only known address is the pairing address +# bonded address after pairing will be the HID descriptor's usage + +# 4 bytes received from pairing handshake (via ACK payload) +# the HID descriptor's usage for a mouse is `6`, so bonded address will be +address.append(bytearray([6, 0, 0, 0, 0])) +is_paired = [False] # we should re-pair on every boot-up + +hid_report_buf = [0] * 4 # use a list for storing mouse inputs +# the report buffer has 4 bytes: +# byte0 = buttons in which each bit corresponds to an action +# bit5 = back, bit4 = forward, bit2 = middle, bit1 = right, bit0 = left +# byte1 = delta x-axis +# byte2 = delta y-axis +# byte3 = delta scroll wheel + +# INSTANTIATE THE HARDWARE +buttons = [ + # THE ORDER HERE MATTERS + DigitalInOut(board.D9), # the left mouse button + DigitalInOut(board.D10), # the middle mouse button + DigitalInOut(board.D11), # the right mouse button + DigitalInOut(board.D12), # the backward mouse button + DigitalInOut(board.D13), # the forward mouse button +] +axes = [ + # THE ORDER HERE MATTERS + AnalogIn(board.A0), # the x-axis + AnalogIn(board.A1), # the y-axis + AnalogIn(board.A2), # the scroll wheel +] +ce_pin = DigitalInOut(board.D4) # the nRF24L01 CE pin +csn_pin = DigitalInOut(board.D5) # the nRF24L01 CSN pin +spi = board.SPI() # the SPI object for the SPI bus +nrf = RF24(spi, csn_pin, ce_pin) # the nRF24L01 object +nrf.ack = True # for getting pairing data from the HUB +nrf.arc = 9 # max is 15, but this should be performant enough + + +def scan_and_report(): + """Scans buttons and analog inputs to assemble a data structure + that resembles a mouse HID report""" + curr_buf = [0] * 4 + for i, button in enumerate(buttons): + curr_buf[0] |= button.value << i + for i, axis in enumerate(axes): + # scale analog inputs down to a signed 8 bits + curr_buf[i + 1] = (axis.value - 32768) / 512 + need_to_report = False + for i, data in enumerate(curr_buf): + if hid_report_buf[i] != data: + hid_report_buf[i] = data + need_to_report = True + if need_to_report: + buf = struct.pack( + "bBBB", + hid_report_buf[0], + hid_report_buf[1], + hid_report_buf[2], + hid_report_buf[3], + ) + if not nrf.send(buf): + is_paired[0] = False # connection has been lost + + +if __name__ == "__main__": + # initiate pairing operation + nrf.open_tx_pipe(address[0]) + pairing_timeout = time.monotonic() + 1 + while time.monotonic() < pairing_timeout: + if nrf.send(address[1], send_only=True): + break + + if nrf.available(): + # pairing handshake completed + address[1][1:] = nrf.read(4) # save bonded address + nrf.open_tx_pipe(address[1]) # set bonded address + is_paired[0] = True + + with nrf: + while is_paired[0]: + scan_and_report() # also detects if connection is broken + # radio powers down upon exiting `with` block diff --git a/recipes/wireless_hid_peripheral.py b/recipes/wireless_hid_peripheral.py deleted file mode 100644 index 7a91969..0000000 --- a/recipes/wireless_hid_peripheral.py +++ /dev/null @@ -1,17 +0,0 @@ -""" -HID Peripheral Recipe -===================== - -This module uses Adafruit_CircuitPython_HID library to contruct -USB HID report data & transport them to a wireless HID hub via the -nRF24L01 transceivers. - -Dependencies ------------- - -`Adafruit_CircuitPython_HID -`_ - -..note:: The above dependency is primarily only used for - knowing the keyboard keycodes. -""" From f1ea4c459a87bfb70cc3adf59cb258c8c181e8ea Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 6 Jan 2021 01:53:24 -0800 Subject: [PATCH 074/103] avoid bad address format --- recipes/wireless_hid_hub.py | 8 ++++---- recipes/wireless_hid_mouse.py | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/recipes/wireless_hid_hub.py b/recipes/wireless_hid_hub.py index 655f2c0..0199325 100644 --- a/recipes/wireless_hid_hub.py +++ b/recipes/wireless_hid_hub.py @@ -52,10 +52,10 @@ # then start this script again nrf.open_rx_pipe(0, b"\x33Pair") # pipe for pairing operations -nrf.open_rx_pipe(1, b"\x06" + nvm[:4]) # pipe for mouse HID -nrf.open_rx_pipe(2, b"\x02" + nvm[:4]) # pipe for keyboard HID -nrf.open_rx_pipe(3, b"\x05" + nvm[:4]) # pipe for gamepad HID -nrf.open_rx_pipe(4, b"\x01" + nvm[:4]) # pipe for Consumer HID +nrf.open_rx_pipe(1, b"6" + nvm[:4]) # pipe for mouse HID +nrf.open_rx_pipe(2, b"2" + nvm[:4]) # pipe for keyboard HID +nrf.open_rx_pipe(3, b"5" + nvm[:4]) # pipe for gamepad HID +nrf.open_rx_pipe(4, b"1" + nvm[:4]) # pipe for Consumer HID nrf.close_rx_pipe(5) # pipe not used (reserved for future features) nrf.ack = True # for returning data to peripherals in ACK payloads while nrf.load_ack(0, nvm[:4]): diff --git a/recipes/wireless_hid_mouse.py b/recipes/wireless_hid_mouse.py index 12e5927..bfc2c92 100644 --- a/recipes/wireless_hid_mouse.py +++ b/recipes/wireless_hid_mouse.py @@ -11,12 +11,14 @@ # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 +is_paired = [False] # we should re-pair on every boot-up address = [b"\x33Pair"] # only known address is the pairing address # bonded address after pairing will be the HID descriptor's usage + # 4 bytes received from pairing handshake (via ACK payload) # the HID descriptor's usage for a mouse is `6`, so bonded address will be -address.append(bytearray([6, 0, 0, 0, 0])) -is_paired = [False] # we should re-pair on every boot-up +address.append(bytearray([6 + 48, 0, 0, 0, 0])) # needs to be a bytearray +# NOTE we use `6 + 48` to avoid bad address formatting because of the +# OTA packet's preamble (see datasheet section 7.3.1-2) hid_report_buf = [0] * 4 # use a list for storing mouse inputs # the report buffer has 4 bytes: From 8717f11e94f180cef60d9629ff867d3d263333cd Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 6 Jan 2021 03:52:19 -0800 Subject: [PATCH 075/103] display hexlified addresses in proper big endian --- circuitpython_nrf24l01/fake_ble.py | 2 +- circuitpython_nrf24l01/rf24.py | 21 ++++++++++++++++++--- docs/advanced_api.rst | 19 +++++++++++++++++++ docs/greetings.rst | 11 +++++++++-- recipes/wireless_hid_mouse.py | 11 +++++++---- 5 files changed, 54 insertions(+), 10 deletions(-) diff --git a/circuitpython_nrf24l01/fake_ble.py b/circuitpython_nrf24l01/fake_ble.py index 350db6a..9be15ae 100644 --- a/circuitpython_nrf24l01/fake_ble.py +++ b/circuitpython_nrf24l01/fake_ble.py @@ -86,7 +86,7 @@ def __init__(self, spi, csn, ce_pin, spi_frequency=10000000): # disable auto_ack, dynamic payloads, all TX features, & auto-retry self._aa, self._dyn_pl, self._features, self._retry_setup = (0,) * 4 self._addr_len = 4 # use only 4 byte address length - self._tx_address = b"\x71\x91\x7D\x6B" + self._tx_address[:4] = b"\x71\x91\x7D\x6B" self._pipe0_read_addr = b"\x71\x91\x7D\x6B" self._open_pipes = 1 with self: diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 94128f3..47bb83f 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -25,7 +25,13 @@ __repo__ = "https://github.com/2bndy5/CircuitPython_nRF24L01.git" import time from micropython import const - +try: + from binascii import hexlify +except ImportError: + try: + from micropython.binascii import hexlify + except ImportError: + from adafruit_binascii import hexlify try: from ubus_device import SPIDevice except ImportError: @@ -43,6 +49,13 @@ TX_FEATURE = const(0x1D) # dynamic TX-payloads, TX-ACK payloads, TX-NO_ACK +def address_repr(addr): + """Convert an address into a hexlified string (in big endian).""" + rev_str = b"" + for char in range(len(addr) - 1, -1, -1): + rev_str += bytes([addr[char]]) + return str(hexlify(rev_str))[2:-1] + class RF24: """A driver class for the nRF24L01(+) transceiver radios.""" @@ -445,13 +458,15 @@ def print_details(self, dump_pipes=False): self._dump_pipes() def _dump_pipes(self): - print("TX address____________", self.address()) + print("TX address____________", "0x" + address_repr(self.address())) self._open_pipes = self._reg_read(OPEN_PIPES) for i in range(6): is_open = self._open_pipes & (1 << i) print( "Pipe {} ({}) bound: {}".format( - i, " open " if is_open else "closed", self.address(i) + i, + " open " if is_open else "closed", + "0x" + address_repr(self.address(i)) ) ) if is_open: diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index bdd720d..e870e09 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -183,6 +183,25 @@ print_details() This parameter's default is `False` and skips this extra information. +address_repr() +****************************** + +.. automethod:: circuitpython_nrf24l01.rf24.address_repr() + + This method is primarily used in :meth:`~RF24.print_details()` to + display how the address is used by the radio. + + .. code-block:: python + + >>> address_repr(b"1Node") + '65646f4e31' + + :Return: + A string of hexidecimal characters in big endian form of the + specified ``address``. + :param bytes,bytearray addr: The address to convert into a hexlified + string + is_plus_variant ****************************** diff --git a/docs/greetings.rst b/docs/greetings.rst index d1c6fa7..4ec3171 100644 --- a/docs/greetings.rst +++ b/docs/greetings.rst @@ -50,8 +50,15 @@ Dependencies This driver depends on: -* `Adafruit CircuitPython `_ -* `Bus Device `_ (specifically the :py:mod:`~adafruit_bus_device.spi_device`) +* `Adafruit CircuitPython Firmware `_ or the + `Adafruit_Blinka library `_ for Linux + SoC boards like Raspberry Pi +* `Adafruit_CircuitPython_BusDevice + `_ (specifically the + :py:mod:`~adafruit_bus_device.spi_device`) +* `Adafruit_CircuitPython_binascii + `_ only if your board does + not have micropython's or CPython's `binascii` module included. Please ensure all dependencies are available on the CircuitPython filesystem. This is easily achieved by downloading diff --git a/recipes/wireless_hid_mouse.py b/recipes/wireless_hid_mouse.py index bfc2c92..44368b9 100644 --- a/recipes/wireless_hid_mouse.py +++ b/recipes/wireless_hid_mouse.py @@ -80,14 +80,17 @@ def scan_and_report(): if __name__ == "__main__": # initiate pairing operation nrf.open_tx_pipe(address[0]) + nrf.listen = False pairing_timeout = time.monotonic() + 1 + bonding_key = False while time.monotonic() < pairing_timeout: - if nrf.send(address[1], send_only=True): - break + bonding_key = nrf.send(address[1]) + if isinstance(bonding_key, (bytearray, bytes)): + break # only exit loop if ACK was received - if nrf.available(): + if bonding_key: # pairing handshake completed - address[1][1:] = nrf.read(4) # save bonded address + address[1][1:] = bonding_key # save bonded address nrf.open_tx_pipe(address[1]) # set bonded address is_paired[0] = True From 985c898c57209805efc84466f0bb83fb75a3cf0b Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Wed, 6 Jan 2021 14:35:16 -0800 Subject: [PATCH 076/103] removed new binascii dependency --- circuitpython_nrf24l01/fake_ble.py | 2 +- circuitpython_nrf24l01/rf24.py | 14 ++++---------- docs/greetings.rst | 3 --- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/circuitpython_nrf24l01/fake_ble.py b/circuitpython_nrf24l01/fake_ble.py index 9be15ae..f44f79e 100644 --- a/circuitpython_nrf24l01/fake_ble.py +++ b/circuitpython_nrf24l01/fake_ble.py @@ -87,7 +87,7 @@ def __init__(self, spi, csn, ce_pin, spi_frequency=10000000): self._aa, self._dyn_pl, self._features, self._retry_setup = (0,) * 4 self._addr_len = 4 # use only 4 byte address length self._tx_address[:4] = b"\x71\x91\x7D\x6B" - self._pipe0_read_addr = b"\x71\x91\x7D\x6B" + self._pipe0_read_addr[:4] = b"\x71\x91\x7D\x6B" self._open_pipes = 1 with self: self.payload_length = 32 diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 47bb83f..9151711 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -25,13 +25,6 @@ __repo__ = "https://github.com/2bndy5/CircuitPython_nRF24L01.git" import time from micropython import const -try: - from binascii import hexlify -except ImportError: - try: - from micropython.binascii import hexlify - except ImportError: - from adafruit_binascii import hexlify try: from ubus_device import SPIDevice except ImportError: @@ -51,10 +44,11 @@ def address_repr(addr): """Convert an address into a hexlified string (in big endian).""" - rev_str = b"" + rev_str = "" for char in range(len(addr) - 1, -1, -1): - rev_str += bytes([addr[char]]) - return str(hexlify(rev_str))[2:-1] + rev_str += hex(addr[char])[2:] + return rev_str + class RF24: """A driver class for the nRF24L01(+) transceiver radios.""" diff --git a/docs/greetings.rst b/docs/greetings.rst index 4ec3171..b7c46e7 100644 --- a/docs/greetings.rst +++ b/docs/greetings.rst @@ -56,9 +56,6 @@ This driver depends on: * `Adafruit_CircuitPython_BusDevice `_ (specifically the :py:mod:`~adafruit_bus_device.spi_device`) -* `Adafruit_CircuitPython_binascii - `_ only if your board does - not have micropython's or CPython's `binascii` module included. Please ensure all dependencies are available on the CircuitPython filesystem. This is easily achieved by downloading From ad91e9c82506a32aefd2494f8a0689e370f7e6f4 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Thu, 7 Jan 2021 00:54:03 -0800 Subject: [PATCH 077/103] fix scaling of joystick input for mouse x/y axis --- recipes/wireless_hid_mouse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/wireless_hid_mouse.py b/recipes/wireless_hid_mouse.py index 44368b9..4af0cbc 100644 --- a/recipes/wireless_hid_mouse.py +++ b/recipes/wireless_hid_mouse.py @@ -59,7 +59,7 @@ def scan_and_report(): curr_buf[0] |= button.value << i for i, axis in enumerate(axes): # scale analog inputs down to a signed 8 bits - curr_buf[i + 1] = (axis.value - 32768) / 512 + curr_buf[i + 1] = (axis.value - 32768) / 256 need_to_report = False for i, data in enumerate(curr_buf): if hid_report_buf[i] != data: From 0aee272077a1d6a0707d05915d2afd49c94825cb Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Thu, 7 Jan 2021 02:42:42 -0800 Subject: [PATCH 078/103] better docs on address_repr() --- docs/advanced_api.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index e870e09..7cb4024 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -186,19 +186,20 @@ print_details() address_repr() ****************************** -.. automethod:: circuitpython_nrf24l01.rf24.address_repr() +.. automethod:: circuitpython_nrf24l01.rf24.address_repr This method is primarily used in :meth:`~RF24.print_details()` to display how the address is used by the radio. .. code-block:: python + >>> from circuitpython_nrf24l01.rf24 import address_repr >>> address_repr(b"1Node") '65646f4e31' :Return: A string of hexidecimal characters in big endian form of the - specified ``address``. + specified ``addr`` parameter. :param bytes,bytearray addr: The address to convert into a hexlified string From 6192ceaaed2636007a9851462124edb333268039 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Thu, 7 Jan 2021 02:48:24 -0800 Subject: [PATCH 079/103] docs typo --- docs/advanced_api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index 7cb4024..d2acdbc 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -176,7 +176,7 @@ print_details() - ``Pipe [#] ([open/closed]) bound: [address]`` where ``#`` represent the pipe number, the ``open/closed`` status is relative to the pipe's RX status, and ``address`` is the full value stored in the nRF24L01's RX address registers (despite what - `address_length` is set to. + `address_length` is set to). - if the pipe is open, then the output also prints ``expecting [X] byte static payloads`` where ``X`` is the `payload_length` (in bytes) the pipe is setup to receive when `dynamic_payloads` is disabled for that pipe. From 7499f28a19b65742cd9c3e71f1de62b01cd68d48 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Thu, 7 Jan 2021 02:53:42 -0800 Subject: [PATCH 080/103] ref allow_ask_no_ack attr in print_details() docs --- docs/advanced_api.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/advanced_api.rst b/docs/advanced_api.rst index d2acdbc..797231f 100644 --- a/docs/advanced_api.rst +++ b/docs/advanced_api.rst @@ -159,8 +159,7 @@ print_details() - ``RX FIFO empty`` Is the RX FIFO buffer empty? - ``Custom ACK payload`` Is the nRF24L01 setup to use an extra (user defined) payload attached to the acknowledgment packet? (state of the `ack` attribute) - - ``Ask no ACK`` Is the nRF24L01 setup to transmit individual packets that don't - require acknowledgment? + - ``Ask no ACK`` The current setting of the `allow_ask_no_ack` attribute. - ``Automatic Acknowledgment`` The status of the `auto_ack` feature. If this value is a binary representation, then each bit represents the feature's status for each pipe. - ``Dynamic Payloads`` The status of the `dynamic_payloads` feature. If this value is a From 6f544d9e92104b291793d4ef8c5075fc285867e2 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Thu, 7 Jan 2021 19:16:37 -0800 Subject: [PATCH 081/103] add a link to atricle about clones --- docs/greetings.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/greetings.rst b/docs/greetings.rst index b7c46e7..16b842b 100644 --- a/docs/greetings.rst +++ b/docs/greetings.rst @@ -201,6 +201,11 @@ While the options' values differ from those identified by this library's API, th underlying commands to configure those options are almost identical to the nRF24L01. Other known clones include the bk242x (also known as RFM7x). +.. seealso:: + `Read this article + `_ + about using clones with missing capacitors (includees pictures). + Contributing ============ From 38eb680186f1ce5d97fe1a1c1b0cf6bb2420a007 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 8 Jan 2021 15:18:30 -0800 Subject: [PATCH 082/103] removed last of rtd-sphinx theme --- docs/conf.py | 1 - docs/index.rst | 10 ++++++---- docs/requirements.txt | 1 - setup.py | 3 +-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 6d9ad32..371332e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # pylint: disable=invalid-name,too-few-public-methods """This file is for `sphinx-build` configuration""" import os diff --git a/docs/index.rst b/docs/index.rst index 5dd7f3b..411a4e2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -28,6 +28,7 @@ troubleshooting + .. toctree:: :caption: Store Links :hidden: @@ -48,8 +49,9 @@ Adafruit Blog Adafruit Store -Site Glossary -============== - -:ref:`genindex` +Indices and tables +================== +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/requirements.txt b/docs/requirements.txt index f1e994b..b51f761 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,3 @@ sphinx-material sphinx-copybutton -sphinx-rtd-theme sphinx-sitemap \ No newline at end of file diff --git a/setup.py b/setup.py index d672e41..aa2fd04 100644 --- a/setup.py +++ b/setup.py @@ -4,10 +4,9 @@ https://packaging.python.org/en/latest/distributing.html https://github.com/pypa/sampleproject """ - from os import path from codecs import open # To use a consistent encoding -from setuptools import setup #, find_packages +from setuptools import setup ROOT_DIR = path.abspath(path.dirname(__file__)) From 2d6becdac588306ab00735acad24ceee9c35ce11 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Tue, 12 Jan 2021 14:05:09 -0800 Subject: [PATCH 083/103] Update nrf24l01_scanner_test.py --- examples/nrf24l01_scanner_test.py | 38 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/examples/nrf24l01_scanner_test.py b/examples/nrf24l01_scanner_test.py index 71f0b46..5fcde0d 100644 --- a/examples/nrf24l01_scanner_test.py +++ b/examples/nrf24l01_scanner_test.py @@ -14,14 +14,23 @@ # change these (digital output) pins accordingly ce = dio.DigitalInOut(board.D4) csn = dio.DigitalInOut(board.D5) - spi = board.SPI() nrf = RF24(spi, csn, ce) +nrf.auto_ack = 0 +nrf.dynamic_payloads = 0 +def scan(timeout=30, passes=100): + """Traverse the spectrum of accessible frequencies and print any detection + of ambient signals. -def print_header(): - """print the vertical header of channel numbers""" - print("_" * 126 + "\n" + "0" * 100 + "1" * 26) + :param int timeout: The number of seconds for which scanning is performed. + :param int passes: The nuumber of accumulating passes through the entire + frequency spectrum. 1 pass scans a channels 1 time. 100 passes scan all + the channels 100 times. The lower this is set, the faster the scan is + performed but also less accurate picture of ambient signals. + """ + # print the vertical header of channel numbers + print("0" * 100 + "1" * 26) for i in range(13): print(str(i % 10) * (10 if i < 12 else 6), sep="", end="") print("") # endl @@ -29,33 +38,24 @@ def print_header(): print(str(i % 10), sep="", end="") print("\n" + "^" * 126) -def scan(timeout=20): - """Traverse the spectrum of accessible frequencies and print any detection - of ambient signals. - - :param int timeout: The number of seconds for which scanning is performed. - """ # set the starting channel (2400 MHz for 1 Mbps or 2401 MHz for 2 Mbps) start_timer = time.monotonic() # start the timer - loop_count = 0 + while time.monotonic() - start_timer < timeout: - if (loop_count % 19) == 0: - print_header() signals = [0] * 126 # store the signal count for each channel - for curr_channel in range(126): # for each channel - for _ in range(10): # attempt to scan channel 10 times + for _ in range(passes): # attempt to scan channel 10 times + for curr_channel in range(126): # for each channel nrf.channel = curr_channel + # time.sleep(0.00013) nrf.listen = 1 # start a RX session - time.sleep(0.00013) # wait 130 microseconds + # time.sleep(0.00013) # wait 130 microseconds signals[curr_channel] += nrf.rpd * 1 # if interference is present nrf.listen = 0 # reset the RDP flag - time.sleep(0.00013) # ouput the signal counts per channel for sig in signals: - print(sig if sig else "-", sep="", end="") + print(hex(min(0x0F, sig))[2:] if sig else "-", sep="", end="") print("") # endl - loop_count += 1 From bf8018afe9679fe163ce4800ef90ecee45037e07 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 22 Jan 2021 13:59:56 -0800 Subject: [PATCH 084/103] removed recipes & sitemap generation --- docs/conf.py | 4 +- docs/index.rst | 1 - docs/recipes.rst | 50 ----------------- recipes/wireless_hid_hub.py | 94 -------------------------------- recipes/wireless_hid_mouse.py | 100 ---------------------------------- 5 files changed, 2 insertions(+), 247 deletions(-) delete mode 100644 docs/recipes.rst delete mode 100644 recipes/wireless_hid_hub.py delete mode 100644 recipes/wireless_hid_mouse.py diff --git a/docs/conf.py b/docs/conf.py index 371332e..d1e159f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -33,7 +33,6 @@ "sphinx.ext.todo", "sphinx.ext.viewcode", "sphinx_copybutton", - "sphinx_sitemap", # "rst2pdf.pdfbuilder", # for local pdf builder support ] @@ -74,7 +73,7 @@ # built documents. # # The short X.Y version. -version = u"dev" +version = u"2.0.0" # The full version, including alpha/beta/rc tags. release = u"2.0.0" @@ -326,6 +325,7 @@ def pygments_monkeypatch_style(mod_name, cls): # ---Options for PDF output----------------------------------------- # requires `rst2pdf` module which is not builtin to Python 3.4 nor # readthedocs.org's docker) + # pdf_documents = [ # ( # "index", diff --git a/docs/index.rst b/docs/index.rst index 411a4e2..e3db2c8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -11,7 +11,6 @@ :hidden: examples - recipes .. toctree:: :caption: API Reference diff --git a/docs/recipes.rst b/docs/recipes.rst deleted file mode 100644 index b32d2d3..0000000 --- a/docs/recipes.rst +++ /dev/null @@ -1,50 +0,0 @@ -Recipes -======== - -USB-HID via RF24 -**************** - -RF24 acting as a hub for HIDs ------------------------------ - -This module uses CircuitPython's builtin usb_hid library as a wireless -hub to extend USB HID interfaces via the nRF24L01 transceivers. - -Dependencies in CircuitPython firmware -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -- :py:data:`usb_hid.devices` -- :py:data:`~microcontroller.nvm` - -.. warning:: This recipe is not compatible with linux-based SoC computers - like the Raspberry Pi because the `adafruit-blinka - `_ library - does not provide the :py:mod:`usb_hid` module and non-volatile memory - (:py:data:`~microcontroller.nvm`) access. - -.. literalinclude:: ../recipes/wireless_hid_hub.py - :linenos: - :lines: 15- - -RF24 acting as a mouse HID --------------------------- - -For simplicity, this recipe uses :py:mod:`board` pins for analog -and digital inputs. But it is highly recommended that your solution -uses a `MCP23017 `_ or -`MCP23008 `_ for digital inputs. -Possible alternative analog -inputs could include: - -- `Cirque Glidepoint circle trackpad - `_ - with the `CircuitPython_Cirque_Pinnacle - `_ library -- `MCP3008 `_ with the - `Adafruit_CircuitPython_MCP3xxx - `_ library - -.. literalinclude:: ../recipes/wireless_hid_mouse.py - :linenos: - :lines: 5- - diff --git a/recipes/wireless_hid_hub.py b/recipes/wireless_hid_hub.py deleted file mode 100644 index 0199325..0000000 --- a/recipes/wireless_hid_hub.py +++ /dev/null @@ -1,94 +0,0 @@ -""" -This module uses CircuitPython's builtin usb_hid library as a wireless -hub to extend USB HID interfaces via the nRF24L01 transceivers. - -Dependencies in CircuitPython firmware -====================================== - -- usb_hid -- microcontroller.nvm - -.. warning:: This recipe is not compatible with linux-based SoC computers - like the Raspberry Pi because the `adafruit-blinka library - does not provide the `usb_hid` module and non-volatile memory (`microcontroller.nvm`) access. -""" -import time -from os import urandom -import board -from digitalio import DigitalInOut -import usb_hid -from circuitpython_nrf24l01.rf24 import RF24 -from microcontroller import nvm - -# SETUP THE HID LIST -# indices 0-3 corresponds to the pipe for which the -# received HID data reports will be forwarded over the USB cable -hid = [None] * 4 -for device in usb_hid.devices: - if device.usage == 6 and device.usage_page == 1: - hid[0] = device #: mouse - elif device.usage == 2 and device.usage_page == 1: - hid[1] = device #: keyboard - elif device.usage == 5 and device.usage_page == 1: - hid[2] = device #: gamepad - elif device.usage == 1 and device.usage_page == 0x0C: - hid[3] = device #: consumer - -# INSTANTIATE THE HARDWARE -ce_pin = DigitalInOut(board.D4) # the nRF24L01 CE pin -csn_pin = DigitalInOut(board.D5) # the nRF24L01 CSN pin -spi = board.SPI() # the SPI object for the SPI bus -nrf = RF24(spi, csn_pin, ce_pin) # the nRF24L01 object -multi_func_button = DigitalInOut(board.D2) # the pair/sleep hardware button - -# SETUP THE TRANSCEIVER -if nvm[:4] == b"\xFF" * 4: - # "securely" generate a base address for bonding - nvm[:4] = urandom(4) -# NOTE reset the generated bonding address by -# stopping this script and executing: -# from microcontroller import nvm -# nvm[:4] = b"\xFF" * 4 -# then start this script again - -nrf.open_rx_pipe(0, b"\x33Pair") # pipe for pairing operations -nrf.open_rx_pipe(1, b"6" + nvm[:4]) # pipe for mouse HID -nrf.open_rx_pipe(2, b"2" + nvm[:4]) # pipe for keyboard HID -nrf.open_rx_pipe(3, b"5" + nvm[:4]) # pipe for gamepad HID -nrf.open_rx_pipe(4, b"1" + nvm[:4]) # pipe for Consumer HID -nrf.close_rx_pipe(5) # pipe not used (reserved for future features) -nrf.ack = True # for returning data to peripherals in ACK payloads -while nrf.load_ack(0, nvm[:4]): - pass # fill the TX FIFO with pairing request responses - -def host(): - """Run this function to enable the nRF24L01 as a wireless HID hub""" - while multi_func_button.value: - pass # wait till the button is released - with nrf: - nrf.open_rx_pipe(0, nrf.address()) # open pipe for pairing - pairing = True - pairing_timeout = time.monotonic() + 1 # pair for 1 minute - nrf.listen = True # start listening - while not multi_func_button.value: - if nrf.available(): - if 0 < nrf.pipe < 5: # if received from a bonded address - hid[nrf.pipe - 1].send_report(nrf.read()) # forward the data - else: # use pipe 0 as a cmd interface - nrf.read() # discard pairing request - # pipe 0 only open when pairing - # keep TX FIFO full of pairing request responses - nrf.load_ack(0, nvm[:4]) - if pairing and time.monotonic() >= pairing_timeout: - nrf.close_rx_pipe(0) # exit pairing - pairing = False - nrf.listen = False - # radio goes to sleep when exiting the `with` block - while multi_func_button.value: - pass # wait till the button is released - -if __name__ == "__main__": - while True: - if multi_func_button.value: - # if button was pressed, then initiate pairing - host() # conitue acting as host until button is pressed again diff --git a/recipes/wireless_hid_mouse.py b/recipes/wireless_hid_mouse.py deleted file mode 100644 index 4af0cbc..0000000 --- a/recipes/wireless_hid_mouse.py +++ /dev/null @@ -1,100 +0,0 @@ -""" -This module uses nRF24L01 transceivers to transport normal -USB HID mouse report data. -""" -import time -import struct -import board -from digitalio import DigitalInOut -from analogio import AnalogIn -# if running this on a ATSAMD21 M0 based board -# from circuitpython_nrf24l01.rf24_lite import RF24 -from circuitpython_nrf24l01.rf24 import RF24 - -is_paired = [False] # we should re-pair on every boot-up -address = [b"\x33Pair"] # only known address is the pairing address -# bonded address after pairing will be the HID descriptor's usage + -# 4 bytes received from pairing handshake (via ACK payload) -# the HID descriptor's usage for a mouse is `6`, so bonded address will be -address.append(bytearray([6 + 48, 0, 0, 0, 0])) # needs to be a bytearray -# NOTE we use `6 + 48` to avoid bad address formatting because of the -# OTA packet's preamble (see datasheet section 7.3.1-2) - -hid_report_buf = [0] * 4 # use a list for storing mouse inputs -# the report buffer has 4 bytes: -# byte0 = buttons in which each bit corresponds to an action -# bit5 = back, bit4 = forward, bit2 = middle, bit1 = right, bit0 = left -# byte1 = delta x-axis -# byte2 = delta y-axis -# byte3 = delta scroll wheel - -# INSTANTIATE THE HARDWARE -buttons = [ - # THE ORDER HERE MATTERS - DigitalInOut(board.D9), # the left mouse button - DigitalInOut(board.D10), # the middle mouse button - DigitalInOut(board.D11), # the right mouse button - DigitalInOut(board.D12), # the backward mouse button - DigitalInOut(board.D13), # the forward mouse button -] -axes = [ - # THE ORDER HERE MATTERS - AnalogIn(board.A0), # the x-axis - AnalogIn(board.A1), # the y-axis - AnalogIn(board.A2), # the scroll wheel -] -ce_pin = DigitalInOut(board.D4) # the nRF24L01 CE pin -csn_pin = DigitalInOut(board.D5) # the nRF24L01 CSN pin -spi = board.SPI() # the SPI object for the SPI bus -nrf = RF24(spi, csn_pin, ce_pin) # the nRF24L01 object -nrf.ack = True # for getting pairing data from the HUB -nrf.arc = 9 # max is 15, but this should be performant enough - - -def scan_and_report(): - """Scans buttons and analog inputs to assemble a data structure - that resembles a mouse HID report""" - curr_buf = [0] * 4 - for i, button in enumerate(buttons): - curr_buf[0] |= button.value << i - for i, axis in enumerate(axes): - # scale analog inputs down to a signed 8 bits - curr_buf[i + 1] = (axis.value - 32768) / 256 - need_to_report = False - for i, data in enumerate(curr_buf): - if hid_report_buf[i] != data: - hid_report_buf[i] = data - need_to_report = True - if need_to_report: - buf = struct.pack( - "bBBB", - hid_report_buf[0], - hid_report_buf[1], - hid_report_buf[2], - hid_report_buf[3], - ) - if not nrf.send(buf): - is_paired[0] = False # connection has been lost - - -if __name__ == "__main__": - # initiate pairing operation - nrf.open_tx_pipe(address[0]) - nrf.listen = False - pairing_timeout = time.monotonic() + 1 - bonding_key = False - while time.monotonic() < pairing_timeout: - bonding_key = nrf.send(address[1]) - if isinstance(bonding_key, (bytearray, bytes)): - break # only exit loop if ACK was received - - if bonding_key: - # pairing handshake completed - address[1][1:] = bonding_key # save bonded address - nrf.open_tx_pipe(address[1]) # set bonded address - is_paired[0] = True - - with nrf: - while is_paired[0]: - scan_and_report() # also detects if connection is broken - # radio powers down upon exiting `with` block From 1d1c5e01fccb459681b53c61c6af194e64495b8a Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 22 Jan 2021 14:59:18 -0800 Subject: [PATCH 085/103] fix FakeBLE.__init__() --- circuitpython_nrf24l01/fake_ble.py | 1 - 1 file changed, 1 deletion(-) diff --git a/circuitpython_nrf24l01/fake_ble.py b/circuitpython_nrf24l01/fake_ble.py index f44f79e..1fb57c6 100644 --- a/circuitpython_nrf24l01/fake_ble.py +++ b/circuitpython_nrf24l01/fake_ble.py @@ -87,7 +87,6 @@ def __init__(self, spi, csn, ce_pin, spi_frequency=10000000): self._aa, self._dyn_pl, self._features, self._retry_setup = (0,) * 4 self._addr_len = 4 # use only 4 byte address length self._tx_address[:4] = b"\x71\x91\x7D\x6B" - self._pipe0_read_addr[:4] = b"\x71\x91\x7D\x6B" self._open_pipes = 1 with self: self.payload_length = 32 From c0a3a85271301f8c32df226c417dd71315035b53 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 22 Jan 2021 15:11:15 -0800 Subject: [PATCH 086/103] prepend "0" to adress bytes <= 15 --- circuitpython_nrf24l01/rf24.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 9151711..6fa8496 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -46,7 +46,10 @@ def address_repr(addr): """Convert an address into a hexlified string (in big endian).""" rev_str = "" for char in range(len(addr) - 1, -1, -1): - rev_str += hex(addr[char])[2:] + if addr[char] > 0x0F: + rev_str += hex(addr[char])[2:] + else: + rev_str += "0" + hex(addr[char])[2:] return rev_str From 6f8e2629893447f7428da670a7950fd6a60cbc18 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 22 Jan 2021 16:55:32 -0800 Subject: [PATCH 087/103] add BLE stuff to print_details(), set BLE RX addr --- circuitpython_nrf24l01/fake_ble.py | 4 +++- circuitpython_nrf24l01/rf24.py | 5 +---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/circuitpython_nrf24l01/fake_ble.py b/circuitpython_nrf24l01/fake_ble.py index 1fb57c6..67d1642 100644 --- a/circuitpython_nrf24l01/fake_ble.py +++ b/circuitpython_nrf24l01/fake_ble.py @@ -87,9 +87,9 @@ def __init__(self, spi, csn, ce_pin, spi_frequency=10000000): self._aa, self._dyn_pl, self._features, self._retry_setup = (0,) * 4 self._addr_len = 4 # use only 4 byte address length self._tx_address[:4] = b"\x71\x91\x7D\x6B" - self._open_pipes = 1 with self: self.payload_length = 32 + super().open_rx_pipe(0, b"\x71\x91\x7D\x6B\0") def __exit__(self, *exc): self._show_dbm = False @@ -258,6 +258,8 @@ def print_details(self, dump_pipes=False): """This debuggung function aggregates and outputs all status/condition related information from the nRF24L01.""" print("Is a plus variant_________{}".format(self.is_plus_variant)) + print("BLE device name___________{}".format(str(self.name))) + print("Broadcasting PA Level_____{}".format(self.show_pa_level)) print( "Channel___________________{} ~ {} GHz".format( self.channel, (self.channel + 2400) / 1000 diff --git a/circuitpython_nrf24l01/rf24.py b/circuitpython_nrf24l01/rf24.py index 6fa8496..44bf5bf 100644 --- a/circuitpython_nrf24l01/rf24.py +++ b/circuitpython_nrf24l01/rf24.py @@ -46,10 +46,7 @@ def address_repr(addr): """Convert an address into a hexlified string (in big endian).""" rev_str = "" for char in range(len(addr) - 1, -1, -1): - if addr[char] > 0x0F: - rev_str += hex(addr[char])[2:] - else: - rev_str += "0" + hex(addr[char])[2:] + rev_str += ("" if addr[char] > 0x0F else "0") + hex(addr[char])[2:] return rev_str From 29a16392142d7a8f3f3cfbea7aef3c6feefeebf9 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 22 Jan 2021 17:47:10 -0800 Subject: [PATCH 088/103] try to diagnose man_ack_test --- examples/nrf24l01_ack_payload_test.py | 2 +- examples/nrf24l01_manual_ack_test.py | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/examples/nrf24l01_ack_payload_test.py b/examples/nrf24l01_ack_payload_test.py index 770f58d..c2bde8f 100644 --- a/examples/nrf24l01_ack_payload_test.py +++ b/examples/nrf24l01_ack_payload_test.py @@ -133,7 +133,7 @@ def slave(timeout=6): bytes(received[:6]).decode("utf-8"), received[7:8][0], bytes(buffer[:6]).decode("utf-8"), - counter[0] + buffer[7:8][0] ) ) start = time.monotonic() # reset timer diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py index b4317bd..9397434 100644 --- a/examples/nrf24l01_manual_ack_test.py +++ b/examples/nrf24l01_manual_ack_test.py @@ -71,10 +71,9 @@ def master(count=5): # count = 5 will only transmit 5 packets else: # sent successful; listen for a response nrf.listen = True # get radio ready to receive a response timeout = time.monotonic() + 0.2 # set sentinal for timeout - while time.monotonic() < timeout: + while not nrf.available() and time.monotonic() < timeout: # this loop hangs for 200 ms or until response is received - if nrf.available(): - break + pass nrf.listen = False # put the radio back in TX mode end_timer = time.monotonic_ns() # stop timer print( @@ -121,7 +120,11 @@ def slave(timeout=6): # increment counter before sending it back in responding payload counter[0] = received[7:8][0] + 1 nrf.listen = False # put the radio in TX mode - result = nrf.send(b"World \0" + bytes([counter[0]])) + result = False + ack_timeout = time.monotonic_ns() + 200000 + while not result and time.monotonic_ns() < ack_timeout: + # try to send reply for 200 milliseconds (at most) + result = nrf.send(b"World \0" + bytes([counter[0]])) nrf.listen = True # put the radio back in RX mode print( "Received {} on pipe {}: {}{} Sent:".format( From 7b0adad4b6552b1b6ff60050ee429ceff2bce746 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 22 Jan 2021 17:49:45 -0800 Subject: [PATCH 089/103] use time.monotonic_ns() --- examples/nrf24l01_manual_ack_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py index 9397434..9c7ae56 100644 --- a/examples/nrf24l01_manual_ack_test.py +++ b/examples/nrf24l01_manual_ack_test.py @@ -70,8 +70,8 @@ def master(count=5): # count = 5 will only transmit 5 packets print("send() failed or timed out") else: # sent successful; listen for a response nrf.listen = True # get radio ready to receive a response - timeout = time.monotonic() + 0.2 # set sentinal for timeout - while not nrf.available() and time.monotonic() < timeout: + timeout = time.monotonic_ns() + 200000 # set sentinal for timeout + while not nrf.available() and time.monotonic_ns() < timeout: # this loop hangs for 200 ms or until response is received pass nrf.listen = False # put the radio back in TX mode @@ -81,7 +81,7 @@ def master(count=5): # count = 5 will only transmit 5 packets "{} us. Sent: {}{}".format( int((end_timer - start_timer) / 1000), buffer[:6].decode("utf-8"), - buffer[7:8][0] + counter[0] ), end=" " ) From 040f9dc545be8409809dbabbc7917cca1491002a Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 22 Jan 2021 20:16:57 -0800 Subject: [PATCH 090/103] better scanner output in REPL --- examples/nrf24l01_scanner_test.py | 40 ++++++++++++++++++------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/examples/nrf24l01_scanner_test.py b/examples/nrf24l01_scanner_test.py index 5fcde0d..89aa26e 100644 --- a/examples/nrf24l01_scanner_test.py +++ b/examples/nrf24l01_scanner_test.py @@ -7,6 +7,7 @@ import time import board import digitalio as dio + # if running this on a ATSAMD21 M0 based board # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 @@ -19,7 +20,8 @@ nrf.auto_ack = 0 nrf.dynamic_payloads = 0 -def scan(timeout=30, passes=100): + +def scan(timeout=30): """Traverse the spectrum of accessible frequencies and print any detection of ambient signals. @@ -36,27 +38,33 @@ def scan(timeout=30, passes=100): print("") # endl for i in range(126): print(str(i % 10), sep="", end="") - print("\n" + "^" * 126) + print("\n" + "~" * 126) # set the starting channel (2400 MHz for 1 Mbps or 2401 MHz for 2 Mbps) start_timer = time.monotonic() # start the timer + signals = [0] * 126 # store the signal count for each channel while time.monotonic() - start_timer < timeout: - signals = [0] * 126 # store the signal count for each channel - for _ in range(passes): # attempt to scan channel 10 times - for curr_channel in range(126): # for each channel - nrf.channel = curr_channel - # time.sleep(0.00013) - nrf.listen = 1 # start a RX session - # time.sleep(0.00013) # wait 130 microseconds - signals[curr_channel] += nrf.rpd * 1 # if interference is present - nrf.listen = 0 # reset the RDP flag - - # ouput the signal counts per channel - for sig in signals: - print(hex(min(0x0F, sig))[2:] if sig else "-", sep="", end="") - print("") # endl + for curr_channel in range(126): # for each channel + nrf.channel = curr_channel + time.sleep(0.00013) # let radio modulate to new channel + nrf.listen = 1 # start a RX session + time.sleep(0.00013) # wait 130 microseconds + signals[curr_channel] += nrf.rpd # if interference is present + nrf.listen = 0 # end the RX session + # ouptut the signal counts per channel + print( + hex(min(0x0F, signals[curr_channel]))[2:] + if signals[curr_channel] + else "-", + sep="", + end="" if curr_channel < 125 else "\r", + ) + # print results 1 last time to end with a new line + for sig in signals: + print(hex(min(0x0F, sig))[2:] if sig else "-", sep="", end="") + print("") print( From e4ea72c455e3a8682076237da2eaf8a81a342ab6 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 22 Jan 2021 20:56:42 -0800 Subject: [PATCH 091/103] explain how to read scanner output --- docs/_static/dark_material.css | 5 +++++ docs/examples.rst | 21 ++++++++++++++++++++- examples/nrf24l01_scanner_test.py | 10 ++-------- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/docs/_static/dark_material.css b/docs/_static/dark_material.css index 5001d8e..926e329 100644 --- a/docs/_static/dark_material.css +++ b/docs/_static/dark_material.css @@ -37,6 +37,11 @@ span.highlighted { color: #B88451; } +.md-typeset blockquote { + border-left: .2rem solid rgb(85, 84, 84); + color: rgb(183, 183, 183); +} + .md-typeset .admonition.tip .admonition-title::before, .md-typeset .admonition.hint .admonition-title::before { content: "\E80C"; diff --git a/docs/examples.rst b/docs/examples.rst index 1479406..9cdf612 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -58,12 +58,31 @@ Scanner Example .. versionadded:: 2.0.0 This example simply scans the entire RF frquency (2.4 GHz to 2.525 GHz) -and outputs a vertical graph of how many signals (out of 10 attempted scans per :py:attr:`~circuitpython_nrf24l01.rf24.RF24.channel`) were detected. This example can be used to find a frequency with the least ambient interference from other radio-emitting sources (i.e. WiFi, Bluetooth, or etc). +and outputs a vertical graph of how many signals (per :py:attr:`~circuitpython_nrf24l01.rf24.RF24.channel`) were detected. This example can be used to find a frequency with the least ambient interference from other radio-emitting sources (i.e. WiFi, Bluetooth, or etc). .. literalinclude:: ../examples/nrf24l01_scanner_test.py :caption: examples/nrf24l01_scanner_test.py :linenos: +Reading the scanner output +************************** + +The output of the scanner example is supposed to be read vertically (as columns). So, the following + + | 000 + | 111 + | 789 + | ~~~ + | 13- + +could be interpreted as + +- ``1`` signal detected on channel ``017`` +- ``3`` signals detected on channel ``018`` +- no signal (``-``) detected on channel ``019`` + +The ``~`` is just a divider between the vertical header and the signal counts. + IRQ Pin Example --------------- diff --git a/examples/nrf24l01_scanner_test.py b/examples/nrf24l01_scanner_test.py index 89aa26e..5ad8126 100644 --- a/examples/nrf24l01_scanner_test.py +++ b/examples/nrf24l01_scanner_test.py @@ -25,11 +25,7 @@ def scan(timeout=30): """Traverse the spectrum of accessible frequencies and print any detection of ambient signals. - :param int timeout: The number of seconds for which scanning is performed. - :param int passes: The nuumber of accumulating passes through the entire - frequency spectrum. 1 pass scans a channels 1 time. 100 passes scan all - the channels 100 times. The lower this is set, the faster the scan is - performed but also less accurate picture of ambient signals. + :param int timeout: The number of seconds in which scanning is performed. """ # print the vertical header of channel numbers print("0" * 100 + "1" * 26) @@ -40,10 +36,8 @@ def scan(timeout=30): print(str(i % 10), sep="", end="") print("\n" + "~" * 126) - # set the starting channel (2400 MHz for 1 Mbps or 2401 MHz for 2 Mbps) - start_timer = time.monotonic() # start the timer - signals = [0] * 126 # store the signal count for each channel + start_timer = time.monotonic() # start the timer while time.monotonic() - start_timer < timeout: for curr_channel in range(126): # for each channel nrf.channel = curr_channel From 3c827cd1307f527d57c05560e395bc71bee62a38 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 22 Jan 2021 21:01:05 -0800 Subject: [PATCH 092/103] change color of blockquotes --- docs/_static/dark_material.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_static/dark_material.css b/docs/_static/dark_material.css index 926e329..2f2e2ab 100644 --- a/docs/_static/dark_material.css +++ b/docs/_static/dark_material.css @@ -38,8 +38,8 @@ span.highlighted { } .md-typeset blockquote { - border-left: .2rem solid rgb(85, 84, 84); - color: rgb(183, 183, 183); + border-left:.2rem solid rgb(153, 153, 153); + color:rgb(202, 202, 202); } .md-typeset .admonition.tip .admonition-title::before, From 62c472e24d0e4c15db3fdd8931fb7e4a67b56594 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 22 Jan 2021 21:07:57 -0800 Subject: [PATCH 093/103] try that again --- docs/_static/dark_material.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/_static/dark_material.css b/docs/_static/dark_material.css index 2f2e2ab..df7c354 100644 --- a/docs/_static/dark_material.css +++ b/docs/_static/dark_material.css @@ -37,7 +37,8 @@ span.highlighted { color: #B88451; } -.md-typeset blockquote { +blockquote .line-block, +blockquote .line{ border-left:.2rem solid rgb(153, 153, 153); color:rgb(202, 202, 202); } From 1db71acfc3f1ecec6d6cc089993f45e337890ac8 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 22 Jan 2021 21:43:05 -0800 Subject: [PATCH 094/103] something is wrong with blockquotes on rtfd.io when using material theme --- docs/_static/dark_material.css | 3 +-- docs/examples.rst | 14 ++++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/_static/dark_material.css b/docs/_static/dark_material.css index df7c354..55eb288 100644 --- a/docs/_static/dark_material.css +++ b/docs/_static/dark_material.css @@ -37,8 +37,7 @@ span.highlighted { color: #B88451; } -blockquote .line-block, -blockquote .line{ +.md-typeset blockquote{ border-left:.2rem solid rgb(153, 153, 153); color:rgb(202, 202, 202); } diff --git a/docs/examples.rst b/docs/examples.rst index 9cdf612..643ab27 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -69,13 +69,15 @@ Reading the scanner output The output of the scanner example is supposed to be read vertically (as columns). So, the following - | 000 - | 111 - | 789 - | ~~~ - | 13- +.. code-block:: -could be interpreted as + 000 + 111 + 789 + ~~~ + 13- + +should be interpreted as - ``1`` signal detected on channel ``017`` - ``3`` signals detected on channel ``018`` From 06fbbfe6df0343e5580a96586cbe745eec83febb Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Fri, 22 Jan 2021 21:49:33 -0800 Subject: [PATCH 095/103] it was my browser: using blockquotes is fine --- docs/examples.rst | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/examples.rst b/docs/examples.rst index 643ab27..4618524 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -69,13 +69,11 @@ Reading the scanner output The output of the scanner example is supposed to be read vertically (as columns). So, the following -.. code-block:: - - 000 - 111 - 789 - ~~~ - 13- + | 000 + | 111 + | 789 + | ~~~ + | 13- should be interpreted as From 5d27e4185002ad1c635bb1e2ea196e040505df0e Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 23 Jan 2021 15:26:00 -0800 Subject: [PATCH 096/103] let examples run from CLI --- examples/nrf24l01_ack_payload_test.py | 71 ++++++++++++++++------ examples/nrf24l01_fake_ble_test.py | 74 ++++++++++++++++++++--- examples/nrf24l01_interrupt_test.py | 57 +++++++++++++++--- examples/nrf24l01_manual_ack_test.py | 70 ++++++++++++++++----- examples/nrf24l01_multiceiver_test.py | 77 ++++++++++++++++++------ examples/nrf24l01_scanner_test.py | 45 ++++++++++++-- examples/nrf24l01_simple_test.py | 67 ++++++++++++++++----- examples/nrf24l01_stream_test.py | 87 +++++++++++++++++++++------ 8 files changed, 439 insertions(+), 109 deletions(-) diff --git a/examples/nrf24l01_ack_payload_test.py b/examples/nrf24l01_ack_payload_test.py index c2bde8f..94e1ac4 100644 --- a/examples/nrf24l01_ack_payload_test.py +++ b/examples/nrf24l01_ack_payload_test.py @@ -5,6 +5,7 @@ import time import board import digitalio as dio + # if running this on a ATSAMD21 M0 based board # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 @@ -28,7 +29,7 @@ # automatically when you call load_ack() passing: # a buffer protocol object (bytearray) of # length ranging [1,32]. And pipe number always needs -# to be an int ranging [0,5] +# to be an int ranging [0, 5] # to enable the custom ACK payload feature nrf.ack = True # False disables again @@ -44,11 +45,7 @@ # uniquely identify which address this radio will use to transmit # 0 uses address[0] to transmit, 1 uses address[1] to transmit radio_number = bool( - int( - input( - "Which radio is this? Enter '0' or '1'. Defaults to '0' " - ) or 0 - ) + int(input("Which radio is this? Enter '0' or '1'. Defaults to '0' ") or 0) ) # set TX address of RX node into the TX pipe @@ -82,9 +79,9 @@ def master(count=5): # count = 5 will only transmit 5 packets "{} us. Sent: {}{}".format( int((end_timer - start_timer) / 1000), buffer[:6].decode("utf-8"), - counter[0] + counter[0], ), - end=" " + end=" ", ) if isinstance(result, bool): print(" Received an empty ACK packet") @@ -93,8 +90,7 @@ def master(count=5): # count = 5 will only transmit 5 packets # received counter is a unsigned byte, thus result[7:8][0] print( " Received: {}{}".format( - bytes(result[:6]).decode("utf-8"), - result[7:8][0] + bytes(result[:6]).decode("utf-8"), result[7:8][0] ) ) counter[0] += 1 # increment payload counter @@ -133,7 +129,7 @@ def slave(timeout=6): bytes(received[:6]).decode("utf-8"), received[7:8][0], bytes(buffer[:6]).decode("utf-8"), - buffer[7:8][0] + buffer[7:8][0], ) ) start = time.monotonic() # reset timer @@ -145,9 +141,50 @@ def slave(timeout=6): nrf.flush_tx() # flush any ACK payloads that remain -print( - """\ - nRF24L01 ACK test\n\ - Run slave() on receiver\n\ - Run master() on transmitter""" -) +def set_role(): + """Set the role using stdin stream. Timeout arg for slave() can be + specified using a space delimiter (e.g. 'R 10' calls `slave(10)`) + + :return: + - True when role is complete & app should continue running. + - False when app should exit + """ + user_input = ( + input( + "*** Enter 'R' for receiver role.\n" + "*** Enter 'T' for transmitter role.\n" + "*** Enter 'Q' to quit example.\n" + ) + or "?" + ) + user_input = user_input.split() + if user_input[0].upper().startswith("R"): + if len(user_input) > 1: + slave(int(user_input[1])) + else: + slave() + return True + elif user_input[0].upper().startswith("T"): + if len(user_input) > 1: + master(int(user_input[1])) + else: + master() + return True + elif user_input[0].upper().startswith("Q"): + nrf.power = False + return False + print(user_input[0], "is an unrecognized input. Please try again.") + return set_role() + + +print(" nRF24L01 ACK Payload test") + +if __name__ == "__main__": + try: + while set_role(): + pass # continue example until 'Q' is entered + except KeyboardInterrupt: + print(" Keyboard Interrupt detected. Powering down radio...") + nrf.power = False +else: + print(" Run slave() on receiver\n Run master() on transmitter") diff --git a/examples/nrf24l01_fake_ble_test.py b/examples/nrf24l01_fake_ble_test.py index d701c29..b76d8d2 100644 --- a/examples/nrf24l01_fake_ble_test.py +++ b/examples/nrf24l01_fake_ble_test.py @@ -65,7 +65,7 @@ def master(count=50): ble.show_pa_level = True print( "available bytes in next payload:", - ble.len_available(chunk(battery_service.buffer)) + ble.len_available(chunk(battery_service.buffer)), ) # using chunk() gives an accurate estimate of available bytes for i in range(count): # advertise data this many times if ble.len_available(chunk(battery_service.buffer)) >= 0: @@ -92,7 +92,7 @@ def send_temp(count=50): ble.name = b"nRF24L01" print( "available bytes in next payload:", - ble.len_available(chunk(temperature_service.buffer)) + ble.len_available(chunk(temperature_service.buffer)), ) for i in range(count): if ble.len_available(chunk(temperature_service.buffer)) >= 0: @@ -113,12 +113,13 @@ def send_temp(count=50): # lower this estimate since we lowered the actual `ble.pa_level` url_service.pa_level_at_1_meter = -45 # defaults to -25 dBm + def send_url(count=50): """Sends out a URL twice a second.""" with nrf as ble: print( "available bytes in next payload:", - ble.len_available(chunk(url_service.buffer)) + ble.len_available(chunk(url_service.buffer)), ) # NOTE we did NOT set a device name in this with block for i in range(count): @@ -129,10 +130,63 @@ def send_url(count=50): ble.hop_channel() time.sleep(0.2) -print( - """\ - nRF24L01 fake BLE beacon test.\n\ - Run master() to broadcast the device name, pa_level, & battery charge\n\ - Run send_temp() to broadcast the device name & a temperature\n\ - Run send_url() to broadcast a custom URL link""" -) + +def set_role(): + """Set the role using stdin stream. Count arg for all functions can be + specified using a space delimiter (e.g. 'T 10' calls `send_temp(10)`) + + :return: + - True when role is complete & app should continue running. + - False when app should exit + """ + user_input = ( + input( + "*** Enter 'M' to broadcast the device name, pa_level, & battery" + " charge.\n" + "*** Enter 'T' to broadcast the device name & a temperature\n" + "*** Enter 'U' to broadcast a custom URL link\n" + "*** Enter 'Q' to quit example.\n" + ) + or "?" + ) + user_input = user_input.split() + if user_input[0].upper().startswith("M"): + if len(user_input) > 1: + master(int(user_input[1])) + else: + master() + return True + if user_input[0].upper().startswith("T"): + if len(user_input) > 1: + send_temp(int(user_input[1])) + else: + send_temp() + return True + if user_input[0].upper().startswith("U"): + if len(user_input) > 1: + send_url(int(user_input[1])) + else: + send_url() + return True + if user_input[0].upper().startswith("Q"): + nrf.power = False + return False + print(user_input[0], "is an unrecognized input. Please try again.") + return set_role() + + +print(" nRF24L01 fake BLE beacon test") + +if __name__ == "__main__": + try: + while set_role(): + pass # continue example until 'Q' is entered + except KeyboardInterrupt: + print(" Keyboard Interrupt detected. Powering down radio...") + nrf.power = False +else: + print( + " Run master() to broadcast the device name, pa_level, & battery " + "charge\n Run send_temp() to broadcast the device name & a " + "temperature\n Run send_url() to broadcast a custom URL link" + ) diff --git a/examples/nrf24l01_interrupt_test.py b/examples/nrf24l01_interrupt_test.py index 659b1bc..ddc448d 100644 --- a/examples/nrf24l01_interrupt_test.py +++ b/examples/nrf24l01_interrupt_test.py @@ -7,6 +7,7 @@ import time import board import digitalio as dio + # if running this on a ATSAMD21 M0 based board # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 @@ -18,11 +19,7 @@ # uniquely identify which address this radio will use to transmit # 0 uses address[0] to transmit, 1 uses address[1] to transmit radio_number = bool( - int( - input( - "Which radio is this? Enter '0' or '1'. Defaults to '0' " - ) or 0 - ) + int(input("Which radio is this? Enter '0' or '1'. Defaults to '0' ") or 0) ) # select your digital input pin that's connected to the IRQ pin on the nRF4L01 @@ -155,10 +152,50 @@ def slave(timeout=6): # will listen for 6 seconds before timing out nrf.flush_tx() # discard any pending ACK payloads +def set_role(): + """Set the role using stdin stream. Timeout arg for slave() can be + specified using a space delimiter (e.g. 'R 10' calls `slave(10)`) + + :return: + - True when role is complete & app should continue running. + - False when app should exit + """ + user_input = ( + input( + "*** Enter 'R' for receiver role.\n" + "*** Enter 'T' for transmitter role.\n" + "*** Enter 'Q' to quit example.\n" + ) + or "?" + ) + user_input = user_input.split() + if user_input[0].upper().startswith("R"): + if len(user_input) > 1: + slave(int(user_input[1])) + else: + slave() + return True + if user_input[0].upper().startswith("T"): + master() + return True + if user_input[0].upper().startswith("Q"): + nrf.power = False + return False + print(user_input[0], "is an unrecognized input. Please try again.") + return set_role() + + print( - """\ - nRF24L01 Interrupt pin test.\n\ - Make sure the IRQ pin is connected to the MCU\n\ - Run slave() on receiver\n\ - Run master() on transmitter""" + " nRF24L01 Interrupt pin test\n" + " Make sure the IRQ pin is connected to the MCU" ) + +if __name__ == "__main__": + try: + while set_role(): + pass # continue example until 'Q' is entered + except KeyboardInterrupt: + print(" Keyboard Interrupt detected. Powering down radio...") + nrf.power = False +else: + print(" Run slave() on receiver\n Run master() on transmitter") diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py index 9c7ae56..e130bef 100644 --- a/examples/nrf24l01_manual_ack_test.py +++ b/examples/nrf24l01_manual_ack_test.py @@ -7,6 +7,7 @@ import time import board import digitalio as dio + # if running this on a ATSAMD21 M0 based board # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 @@ -33,11 +34,7 @@ # uniquely identify which address this radio will use to transmit # 0 uses address[0] to transmit, 1 uses address[1] to transmit radio_number = bool( - int( - input( - "Which radio is this? Enter '0' or '1'. Defaults to '0' " - ) or 0 - ) + int(input("Which radio is this? Enter '0' or '1'. Defaults to '0' ") or 0) ) # set TX address of RX node into the TX pipe @@ -81,9 +78,9 @@ def master(count=5): # count = 5 will only transmit 5 packets "{} us. Sent: {}{}".format( int((end_timer - start_timer) / 1000), buffer[:6].decode("utf-8"), - counter[0] + counter[0], ), - end=" " + end=" ", ) if nrf.pipe is None: # is there a payload? # nrf.pipe is also updated using `nrf.listen = False` @@ -99,7 +96,7 @@ def master(count=5): # count = 5 will only transmit 5 packets length, pipe_number, bytes(received[:6]).decode("utf-8"), # convert to str - counter[0] + counter[0], ) ) count -= 1 @@ -131,9 +128,9 @@ def slave(timeout=6): length, pipe, bytes(received[:6]).decode("utf-8"), # convert to str - received[7:8][0] + received[7:8][0], ), - end=" " + end=" ", ) if not result: print("Response failed or timed out") @@ -145,9 +142,50 @@ def slave(timeout=6): nrf.listen = False # put the nRF24L01 in TX mode + Standby-I power state -print( - """\ - nRF24L01 manual ACK example.\n\ - Run slave() to receive\n\ - Run master() to transmit""" -) +def set_role(): + """Set the role using stdin stream. Timeout arg for slave() can be + specified using a space delimiter (e.g. 'R 10' calls `slave(10)`) + + :return: + - True when role is complete & app should continue running. + - False when app should exit + """ + user_input = ( + input( + "*** Enter 'R' for receiver role.\n" + "*** Enter 'T' for transmitter role.\n" + "*** Enter 'Q' to quit example.\n" + ) + or "?" + ) + user_input = user_input.split() + if user_input[0].upper().startswith("R"): + if len(user_input) > 1: + slave(int(user_input[1])) + else: + slave() + return True + if user_input[0].upper().startswith("T"): + if len(user_input) > 1: + master(int(user_input[1])) + else: + master() + return True + if user_input[0].upper().startswith("Q"): + nrf.power = False + return False + print(user_input[0], "is an unrecognized input. Please try again.") + return set_role() + + +print(" nRF24L01 manual ACK example") + +if __name__ == "__main__": + try: + while set_role(): + pass # continue example until 'Q' is entered + except KeyboardInterrupt: + print(" Keyboard Interrupt detected. Powering down radio...") + nrf.power = False +else: + print(" Run slave() on receiver\n Run master() on transmitter") diff --git a/examples/nrf24l01_multiceiver_test.py b/examples/nrf24l01_multiceiver_test.py index 94d4b74..d65137b 100644 --- a/examples/nrf24l01_multiceiver_test.py +++ b/examples/nrf24l01_multiceiver_test.py @@ -34,7 +34,7 @@ b"\xCD\xB6\xB5\xB4\xB3", b"\xA3\xB6\xB5\xB4\xB3", b"\x0F\xB6\xB5\xB4\xB3", - b"\x05\xB6\xB5\xB4\xB3" + b"\x05\xB6\xB5\xB4\xB3", ] # uncomment the following 3 lines for compatibility with TMRh20 library @@ -61,13 +61,13 @@ def base(timeout=10): nrf.listen = False -def node(node_number, count=6): +def node(node_number=0, count=6): """start transmitting to the base station. - :param int node_number: the node's identifying index (from the - the `addresses` list) - :param int count: the number of times that the node will transmit - to the base station. + :param int node_number: the node's identifying index (from the + the `addresses` list) + :param int count: the number of times that the node will transmit + to the base station. """ nrf.listen = False # set the TX address to the address of the base station. @@ -87,9 +87,7 @@ def node(node_number, count=6): print( "Transmission of payloadID {} as node {} successfull! " "Transmission time: {} us".format( - counter, - node_number, - (end_timer - start_timer) / 1000 + counter, node_number, (end_timer - start_timer) / 1000 ) ) else: @@ -97,11 +95,56 @@ def node(node_number, count=6): time.sleep(0.5) # slow down the test for readability -print( - """\ - nRF24L01 Multiceiver test.\n\ - Run base() on the receiver\n\ - base() sends ACK payloads to node 1\n\ - Run node(node_number) on a transmitter\n\ - node()'s parameter, `node_number`, must be in range [0, 5]""" -) +def set_role(): + """Set the role using stdin stream. Node number arg for node() can be + specified using a space delimiter (e.g. 'T 0' calls `node(0)`) + + :return: + - True when role is complete & app should continue running. + - False when app should exit + """ + user_input = ( + input( + "*** Enter 'R' for receiver role.\n" + "*** Enter 'T' for transmitter role.\n" + "*** Enter 'Q' to quit example.\n" + ) + or "?" + ) + user_input = user_input.split() + if user_input[0].upper().startswith("R"): + if len(user_input) > 1: + base(int(user_input[1])) + else: + base() + return True + if user_input[0].upper().startswith("T"): + if len(user_input) > 2: + node(int(user_input[1]), int(user_input[2])) + elif len(user_input) > 1: + node(int(user_input[1])) + else: + node() + return True + if user_input[0].upper().startswith("Q"): + nrf.power = False + return False + print(user_input[0], "is an unrecognized input. Please try again.") + return set_role() + + +print(" nRF24L01 Multiceiver test") + +if __name__ == "__main__": + try: + while set_role(): + pass # continue example until 'Q' is entered + except KeyboardInterrupt: + print(" Keyboard Interrupt detected. Powering down radio...") + nrf.power = False +else: + print( + " Run base() on the receiver\n " + "Run node(node_number) on a transmitter\n " + "node()'s parameter, `node_number`, must be in range [0, 5]""" + ) diff --git a/examples/nrf24l01_scanner_test.py b/examples/nrf24l01_scanner_test.py index 5ad8126..7ea2d6a 100644 --- a/examples/nrf24l01_scanner_test.py +++ b/examples/nrf24l01_scanner_test.py @@ -61,8 +61,43 @@ def scan(timeout=30): print("") -print( - """\ - nRF24L01 scanner test\n\ - Run scan() to initiate scan for ambient signals.""" -) +def set_role(): + """Set the role using stdin stream. Timeout arg for scan() can be + specified using a space delimiter (e.g. 'S 10' calls `scan(10)`) + + :return: + - True when role is complete & app should continue running. + - False when app should exit + """ + user_input = ( + input( + "*** Enter 'S' to perform scan.\n" + "*** Enter 'Q' to quit example.\n" + ) + or "?" + ) + user_input = user_input.split() + if user_input[0].upper().startswith("S"): + if len(user_input) > 1: + scan(int(user_input[1])) + else: + scan() + return True + if user_input[0].upper().startswith("Q"): + nrf.power = False + return False + print(user_input[0], "is an unrecognized input. Please try again.") + return set_role() + + +print(" nRF24L01 scanner test") + +if __name__ == "__main__": + try: + while set_role(): + pass # continue example until 'Q' is entered + except KeyboardInterrupt: + print(" Keyboard Interrupt detected. Powering down radio...") + nrf.power = False +else: + print(" Run scan() to initiate scan for ambient signals.") diff --git a/examples/nrf24l01_simple_test.py b/examples/nrf24l01_simple_test.py index 0edc596..449aead 100644 --- a/examples/nrf24l01_simple_test.py +++ b/examples/nrf24l01_simple_test.py @@ -5,6 +5,7 @@ import struct import board import digitalio as dio + # if running this on a ATSAMD21 M0 based board # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 @@ -16,11 +17,7 @@ # uniquely identify which address this radio will use to transmit # 0 uses address[0] to transmit, 1 uses address[1] to transmit radio_number = bool( - int( - input( - "Which radio is this? Enter '0' or '1'. Defaults to '0' " - ) or 0 - ) + int(input("Which radio is this? Enter '0' or '1'. Defaults to '0' ") or 0) ) # change these (digital output) pins accordingly @@ -73,8 +70,7 @@ def master(count=5): # count = 5 will only transmit 5 packets print( "Transmission successful! Time to Transmit: " "{} us. Sent: {}".format( - (end_timer - start_timer) / 1000, - payload[0] + (end_timer - start_timer) / 1000, payload[0] ) ) payload[0] += 0.01 @@ -100,9 +96,7 @@ def slave(timeout=6): # print details about the received packet print( "Received {} bytes on pipe {}: {}".format( - payload_size, - pipe_number, - payload[0] + payload_size, pipe_number, payload[0] ) ) start = time.monotonic() @@ -111,9 +105,50 @@ def slave(timeout=6): nrf.listen = False # put the nRF24L01 is in TX mode -print( - """\ - nRF24L01 Simple test.\n\ - Run slave() on receiver\n\ - Run master() on transmitter""" -) +def set_role(): + """Set the role using stdin stream. Timeout arg for slave() can be + specified using a space delimiter (e.g. 'R 10' calls `slave(10)`) + + :return: + - True when role is complete & app should continue running. + - False when app should exit + """ + user_input = ( + input( + "*** Enter 'R' for receiver role.\n" + "*** Enter 'T' for transmitter role.\n" + "*** Enter 'Q' to quit example.\n" + ) + or "?" + ) + user_input = user_input.split() + if user_input[0].upper().startswith("R"): + if len(user_input) > 1: + slave(int(user_input[1])) + else: + slave() + return True + if user_input[0].upper().startswith("T"): + if len(user_input) > 1: + master(int(user_input[1])) + else: + master() + return True + if user_input[0].upper().startswith("Q"): + nrf.power = False + return False + print(user_input[0], "is an unrecognized input. Please try again.") + return set_role() + + +print(" nRF24L01 Simple test") + +if __name__ == "__main__": + try: + while set_role(): + pass # continue example until 'Q' is entered + except KeyboardInterrupt: + print(" Keyboard Interrupt detected. Powering down radio...") + nrf.power = False +else: + print(" Run slave() on receiver\n Run master() on transmitter") diff --git a/examples/nrf24l01_stream_test.py b/examples/nrf24l01_stream_test.py index 44049bb..9fbbaea 100644 --- a/examples/nrf24l01_stream_test.py +++ b/examples/nrf24l01_stream_test.py @@ -4,6 +4,7 @@ import time import board import digitalio as dio + # if running this on a ATSAMD21 M0 based board # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 @@ -15,11 +16,7 @@ # uniquely identify which address this radio will use to transmit # 0 uses address[0] to transmit, 1 uses address[1] to transmit radio_number = bool( - int( - input( - "Which radio is this? Enter '0' or '1'. Defaults to '0' " - ) or 0 - ) + int(input("Which radio is this? Enter '0' or '1'. Defaults to '0' ") or 0) ) # change these (digital output) pins accordingly @@ -83,9 +80,7 @@ def master(count=1, size=32): # count = 5 will transmit the list 5 times successful += 1 if r else 0 print( "successfully sent {}% ({}/{})".format( - successful / (size * count) * 100, - successful, - size * count + successful / (size * count) * 100, successful, size * count ) ) @@ -129,10 +124,9 @@ def master_fifo(count=1, size=32): end_timer = time.monotonic_ns() # end timer print( "Transmission took {} us with {} failures detected.".format( - (end_timer - start_timer) / 1000, - failures + (end_timer - start_timer) / 1000, failures ), - end=" " if failures < 100 else "\n" + end=" " if failures < 100 else "\n", ) if 1 <= failures < 100: print( @@ -162,10 +156,67 @@ def slave(timeout=5): nrf.listen = False # put the nRF24L01 is in TX mode -print( - """\ - nRF24L01 Stream test\n\ - Run slave() on receiver\n\ - Run master() on transmitter to use 1 level of the TX FIFO\n\ - Run master_fifo() on transmitter to use all 3 levels of the TX FIFO.""" -) +def set_role(): + """Set the role using stdin stream. Timeout arg for slave() can be + specified using a space delimiter (e.g. 'R 10' calls `slave(10)`) + + :return: + - True when role is complete & app should continue running. + - False when app should exit + """ + user_input = ( + input( + "*** Enter 'R' for receiver role.\n" + "*** Enter 'T' for transmitter role (using 1 level" + " of the TX FIFO).\n" + "*** Enter 'F' for transmitter role (using all 3 levels" + " of the TX FIFO).\n" + "*** Enter 'Q' to quit example.\n" + ) + or "?" + ) + user_input = user_input.split() + if user_input[0].upper().startswith("R"): + if len(user_input) > 1: + slave(int(user_input[1])) + else: + slave() + return True + if user_input[0].upper().startswith("T"): + if len(user_input) > 2: + master(int(user_input[1]), int(user_input[2])) + elif len(user_input) > 1: + master(int(user_input[1])) + else: + master() + return True + if user_input[0].upper().startswith("F"): + if len(user_input) > 2: + master_fifo(int(user_input[1]), int(user_input[2])) + elif len(user_input) > 1: + master_fifo(int(user_input[1])) + else: + master_fifo() + return True + if user_input[0].upper().startswith("Q"): + nrf.power = False + return False + print(user_input[0], "is an unrecognized input. Please try again.") + return set_role() + + +print(" nRF24L01 Stream test") + +if __name__ == "__main__": + try: + while set_role(): + pass # continue example until 'Q' is entered + except KeyboardInterrupt: + print(" Keyboard Interrupt detected. Powering down radio...") + nrf.power = False +else: + print( + " Run slave() on receiver\n Run master() on transmitter to use" + " 1 level of the TX FIFO\n Run master_fifo() on transmitter to use" + " all 3 levels of the TX FIFO" + ) From 14909f0f6ea7d2162fb218a3216a6d3c479cb6fe Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 23 Jan 2021 15:38:55 -0800 Subject: [PATCH 097/103] forgot an elif after return --- examples/nrf24l01_ack_payload_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/nrf24l01_ack_payload_test.py b/examples/nrf24l01_ack_payload_test.py index 94e1ac4..4ee23f0 100644 --- a/examples/nrf24l01_ack_payload_test.py +++ b/examples/nrf24l01_ack_payload_test.py @@ -164,13 +164,13 @@ def set_role(): else: slave() return True - elif user_input[0].upper().startswith("T"): + if user_input[0].upper().startswith("T"): if len(user_input) > 1: master(int(user_input[1])) else: master() return True - elif user_input[0].upper().startswith("Q"): + if user_input[0].upper().startswith("Q"): nrf.power = False return False print(user_input[0], "is an unrecognized input. Please try again.") From 03cf057f129199dd4229d12f74f2f1276773bafe Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 23 Jan 2021 15:56:24 -0800 Subject: [PATCH 098/103] add hint about wrapping scanner output in terminal --- docs/examples.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/examples.rst b/docs/examples.rst index 4618524..0b5b27d 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -67,6 +67,9 @@ and outputs a vertical graph of how many signals (per :py:attr:`~circuitpython_n Reading the scanner output ************************** +.. hint:: Make sure the terminal window used to run the scanner example is expanded + to fit 125 characters. Otherwise the output will look weird. + The output of the scanner example is supposed to be read vertically (as columns). So, the following | 000 From ed3d8671283964e393e016985cf5d0158f8ceba6 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 23 Jan 2021 17:36:27 -0800 Subject: [PATCH 099/103] uniform examples' imports and layout --- examples/nrf24l01_ack_payload_test.py | 6 +++--- examples/nrf24l01_context_test.py | 6 +++--- examples/nrf24l01_fake_ble_test.py | 6 +++--- examples/nrf24l01_interrupt_test.py | 28 +++++++++++++-------------- examples/nrf24l01_manual_ack_test.py | 12 ++++++------ examples/nrf24l01_multiceiver_test.py | 6 +++--- examples/nrf24l01_scanner_test.py | 21 +++++++++++++------- examples/nrf24l01_simple_test.py | 26 ++++++++++++------------- examples/nrf24l01_stream_test.py | 26 ++++++++++++------------- 9 files changed, 72 insertions(+), 65 deletions(-) diff --git a/examples/nrf24l01_ack_payload_test.py b/examples/nrf24l01_ack_payload_test.py index 4ee23f0..02e83df 100644 --- a/examples/nrf24l01_ack_payload_test.py +++ b/examples/nrf24l01_ack_payload_test.py @@ -4,15 +4,15 @@ """ import time import board -import digitalio as dio +import digitalio # if running this on a ATSAMD21 M0 based board # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 # change these (digital output) pins accordingly -ce = dio.DigitalInOut(board.D4) -csn = dio.DigitalInOut(board.D5) +ce = digitalio.DigitalInOut(board.D4) +csn = digitalio.DigitalInOut(board.D5) # using board.SPI() automatically selects the MCU's # available SPI pins, board.SCK, board.MOSI, board.MISO diff --git a/examples/nrf24l01_context_test.py b/examples/nrf24l01_context_test.py index 54bfe91..61414f2 100644 --- a/examples/nrf24l01_context_test.py +++ b/examples/nrf24l01_context_test.py @@ -6,13 +6,13 @@ .. warning:: This script is not compatible with the rf24_lite module """ import board -import digitalio as dio +import digitalio from circuitpython_nrf24l01.rf24 import RF24 from circuitpython_nrf24l01.fake_ble import FakeBLE # change these (digital output) pins accordingly -ce = dio.DigitalInOut(board.D4) -csn = dio.DigitalInOut(board.D5) +ce = digitalio.DigitalInOut(board.D4) +csn = digitalio.DigitalInOut(board.D5) # using board.SPI() automatically selects the MCU's # available SPI pins, board.SCK, board.MOSI, board.MISO diff --git a/examples/nrf24l01_fake_ble_test.py b/examples/nrf24l01_fake_ble_test.py index b76d8d2..af451d2 100644 --- a/examples/nrf24l01_fake_ble_test.py +++ b/examples/nrf24l01_fake_ble_test.py @@ -6,7 +6,7 @@ """ import time import board -import digitalio as dio +import digitalio from circuitpython_nrf24l01.fake_ble import ( chunk, FakeBLE, @@ -16,8 +16,8 @@ ) # change these (digital output) pins accordingly -ce = dio.DigitalInOut(board.D4) -csn = dio.DigitalInOut(board.D5) +ce = digitalio.DigitalInOut(board.D4) +csn = digitalio.DigitalInOut(board.D5) # using board.SPI() automatically selects the MCU's # available SPI pins, board.SCK, board.MOSI, board.MISO diff --git a/examples/nrf24l01_interrupt_test.py b/examples/nrf24l01_interrupt_test.py index ddc448d..31ca2e2 100644 --- a/examples/nrf24l01_interrupt_test.py +++ b/examples/nrf24l01_interrupt_test.py @@ -6,28 +6,18 @@ """ import time import board -import digitalio as dio +import digitalio # if running this on a ATSAMD21 M0 based board # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 -# address needs to be in a buffer protocol object (bytearray is preferred) -address = [b"1Node", b"2Node"] - -# to use different addresses on a pair of radios, we need a variable to -# uniquely identify which address this radio will use to transmit -# 0 uses address[0] to transmit, 1 uses address[1] to transmit -radio_number = bool( - int(input("Which radio is this? Enter '0' or '1'. Defaults to '0' ") or 0) -) - # select your digital input pin that's connected to the IRQ pin on the nRF4L01 -irq_pin = dio.DigitalInOut(board.D12) +irq_pin = digitalio.DigitalInOut(board.D12) irq_pin.switch_to_input() # make sure its an input object # change these (digital output) pins accordingly -ce = dio.DigitalInOut(board.D4) -csn = dio.DigitalInOut(board.D5) +ce = digitalio.DigitalInOut(board.D4) +csn = digitalio.DigitalInOut(board.D5) # using board.SPI() automatically selects the MCU's # available SPI pins, board.SCK, board.MOSI, board.MISO @@ -45,6 +35,16 @@ # usually run with nRF24L01 transceivers in close proximity nrf.pa_level = -12 +# address needs to be in a buffer protocol object (bytearray is preferred) +address = [b"1Node", b"2Node"] + +# to use different addresses on a pair of radios, we need a variable to +# uniquely identify which address this radio will use to transmit +# 0 uses address[0] to transmit, 1 uses address[1] to transmit +radio_number = bool( + int(input("Which radio is this? Enter '0' or '1'. Defaults to '0' ") or 0) +) + # set TX address of RX node into the TX pipe nrf.open_tx_pipe(address[radio_number]) # always uses pipe 0 diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py index e130bef..bf0710a 100644 --- a/examples/nrf24l01_manual_ack_test.py +++ b/examples/nrf24l01_manual_ack_test.py @@ -6,18 +6,15 @@ """ import time import board -import digitalio as dio +import digitalio # if running this on a ATSAMD21 M0 based board # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 -# addresses needs to be in a buffer protocol object (bytearray) -address = [b"1Node", b"2Node"] - # change these (digital output) pins accordingly -ce = dio.DigitalInOut(board.D4) -csn = dio.DigitalInOut(board.D5) +ce = digitalio.DigitalInOut(board.D4) +csn = digitalio.DigitalInOut(board.D5) # using board.SPI() automatically selects the MCU's # available SPI pins, board.SCK, board.MOSI, board.MISO @@ -30,6 +27,9 @@ # usually run with nRF24L01 transceivers in close proximity nrf.pa_level = -12 +# addresses needs to be in a buffer protocol object (bytearray) +address = [b"1Node", b"2Node"] + # to use different addresses on a pair of radios, we need a variable to # uniquely identify which address this radio will use to transmit # 0 uses address[0] to transmit, 1 uses address[1] to transmit diff --git a/examples/nrf24l01_multiceiver_test.py b/examples/nrf24l01_multiceiver_test.py index d65137b..ef53305 100644 --- a/examples/nrf24l01_multiceiver_test.py +++ b/examples/nrf24l01_multiceiver_test.py @@ -5,15 +5,15 @@ import time import struct import board -import digitalio as dio +import digitalio # if running this on a ATSAMD21 M0 based board # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 # change these (digital output) pins accordingly -ce = dio.DigitalInOut(board.D4) -csn = dio.DigitalInOut(board.D5) +ce = digitalio.DigitalInOut(board.D4) +csn = digitalio.DigitalInOut(board.D5) # using board.SPI() automatically selects the MCU's # available SPI pins, board.SCK, board.MOSI, board.MISO diff --git a/examples/nrf24l01_scanner_test.py b/examples/nrf24l01_scanner_test.py index 7ea2d6a..1e95ffd 100644 --- a/examples/nrf24l01_scanner_test.py +++ b/examples/nrf24l01_scanner_test.py @@ -1,22 +1,29 @@ """ This is an example of how to use the nRF24L01's builtin -Received Power Detection (RPD). This example does not require a -counterpart node, but a master() function is provided to broadcast a constant -carrier wave (which causes interference) for a certain RF data rate & channel. +Received Power Detection (RPD) to scan for possible interference. +This example does not require a counterpart node. """ import time import board -import digitalio as dio +import digitalio # if running this on a ATSAMD21 M0 based board # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 # change these (digital output) pins accordingly -ce = dio.DigitalInOut(board.D4) -csn = dio.DigitalInOut(board.D5) -spi = board.SPI() +ce = digitalio.DigitalInOut(board.D4) +csn = digitalio.DigitalInOut(board.D5) + +# using board.SPI() automatically selects the MCU's +# available SPI pins, board.SCK, board.MOSI, board.MISO +spi = board.SPI() # init spi bus object + +# we'll be using the dynamic payload size feature (enabled by default) +# initialize the nRF24L01 on the spi bus object nrf = RF24(spi, csn, ce) + +# turn off RX features specific to the nRF24L01 module nrf.auto_ack = 0 nrf.dynamic_payloads = 0 diff --git a/examples/nrf24l01_simple_test.py b/examples/nrf24l01_simple_test.py index 449aead..152c14b 100644 --- a/examples/nrf24l01_simple_test.py +++ b/examples/nrf24l01_simple_test.py @@ -4,25 +4,15 @@ import time import struct import board -import digitalio as dio +import digitalio # if running this on a ATSAMD21 M0 based board # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 -# addresses needs to be in a buffer protocol object (bytearray) -address = [b"1Node", b"2Node"] - -# to use different addresses on a pair of radios, we need a variable to -# uniquely identify which address this radio will use to transmit -# 0 uses address[0] to transmit, 1 uses address[1] to transmit -radio_number = bool( - int(input("Which radio is this? Enter '0' or '1'. Defaults to '0' ") or 0) -) - # change these (digital output) pins accordingly -ce = dio.DigitalInOut(board.D4) -csn = dio.DigitalInOut(board.D5) +ce = digitalio.DigitalInOut(board.D4) +csn = digitalio.DigitalInOut(board.D5) # using board.SPI() automatically selects the MCU's # available SPI pins, board.SCK, board.MOSI, board.MISO @@ -36,6 +26,16 @@ # usually run with nRF24L01 transceivers in close proximity nrf.pa_level = -12 +# addresses needs to be in a buffer protocol object (bytearray) +address = [b"1Node", b"2Node"] + +# to use different addresses on a pair of radios, we need a variable to +# uniquely identify which address this radio will use to transmit +# 0 uses address[0] to transmit, 1 uses address[1] to transmit +radio_number = bool( + int(input("Which radio is this? Enter '0' or '1'. Defaults to '0' ") or 0) +) + # set TX address of RX node into the TX pipe nrf.open_tx_pipe(address[radio_number]) # always uses pipe 0 diff --git a/examples/nrf24l01_stream_test.py b/examples/nrf24l01_stream_test.py index 9fbbaea..c47cbf0 100644 --- a/examples/nrf24l01_stream_test.py +++ b/examples/nrf24l01_stream_test.py @@ -3,25 +3,15 @@ """ import time import board -import digitalio as dio +import digitalio # if running this on a ATSAMD21 M0 based board # from circuitpython_nrf24l01.rf24_lite import RF24 from circuitpython_nrf24l01.rf24 import RF24 -# addresses needs to be in a buffer protocol object (bytearray) -address = [b"1Node", b"2Node"] - -# to use different addresses on a pair of radios, we need a variable to -# uniquely identify which address this radio will use to transmit -# 0 uses address[0] to transmit, 1 uses address[1] to transmit -radio_number = bool( - int(input("Which radio is this? Enter '0' or '1'. Defaults to '0' ") or 0) -) - # change these (digital output) pins accordingly -ce = dio.DigitalInOut(board.D4) -csn = dio.DigitalInOut(board.D5) +ce = digitalio.DigitalInOut(board.D4) +csn = digitalio.DigitalInOut(board.D5) # using board.SPI() automatically selects the MCU's # available SPI pins, board.SCK, board.MOSI, board.MISO @@ -35,6 +25,16 @@ # usually run with nRF24L01 transceivers in close proximity nrf.pa_level = -12 +# addresses needs to be in a buffer protocol object (bytearray) +address = [b"1Node", b"2Node"] + +# to use different addresses on a pair of radios, we need a variable to +# uniquely identify which address this radio will use to transmit +# 0 uses address[0] to transmit, 1 uses address[1] to transmit +radio_number = bool( + int(input("Which radio is this? Enter '0' or '1'. Defaults to '0' ") or 0) +) + # set TX address of RX node into the TX pipe nrf.open_tx_pipe(address[radio_number]) # always uses pipe 0 From 1d8585b10c2d897832b33cec75c86bb9b0b47ea2 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 23 Jan 2021 18:09:21 -0800 Subject: [PATCH 100/103] limit what part of examples is shown in docs --- docs/examples.rst | 17 +++++++++++++++++ examples/nrf24l01_manual_ack_test.py | 6 ++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/docs/examples.rst b/docs/examples.rst index 0b5b27d..70e362c 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -14,6 +14,8 @@ Ensure your device works with this simple test. .. literalinclude:: ../examples/nrf24l01_simple_test.py :caption: examples/nrf24l01_simple_test.py :linenos: + :start-at: import time + :end-before: def set_role(): ACK Payloads Example -------------------- @@ -28,6 +30,8 @@ This is a test to show how to use custom acknowledgment payloads. See also docum .. literalinclude:: ../examples/nrf24l01_ack_payload_test.py :caption: examples/nrf24l01_ack_payload_test.py :linenos: + :start-at: import time + :end-before: def set_role(): Multiceiver Example -------------------- @@ -51,6 +55,8 @@ This example shows how use a group of 6 nRF24L01 transceivers to transmit to 1 n .. literalinclude:: ../examples/nrf24l01_multiceiver_test.py :caption: examples/nrf24l01_multiceiver_test.py :linenos: + :start-at: import time + :end-before: def set_role(): Scanner Example --------------- @@ -63,6 +69,8 @@ and outputs a vertical graph of how many signals (per :py:attr:`~circuitpython_n .. literalinclude:: ../examples/nrf24l01_scanner_test.py :caption: examples/nrf24l01_scanner_test.py :linenos: + :start-at: import time + :end-before: def set_role(): Reading the scanner output ************************** @@ -97,6 +105,8 @@ This is a test to show how to use nRF24L01's interrupt pin. Be aware that :py:fu .. literalinclude:: ../examples/nrf24l01_interrupt_test.py :caption: examples/nrf24l01_interrupt_test.py :linenos: + :start-at: import time + :end-before: def set_role(): Library-Specific Features ========================= @@ -117,6 +127,8 @@ uses all 3 levels of the nRF24L01's TX FIFO to stream data, but it uses the .. literalinclude:: ../examples/nrf24l01_stream_test.py :caption: examples/nrf24l01_stream_test.py :linenos: + :start-at: import time + :end-before: def set_role(): Context Example --------------- @@ -129,6 +141,7 @@ This is a test to show how to use `with` blocks to manage multiple different nRF .. literalinclude:: ../examples/nrf24l01_context_test.py :caption: examples/nrf24l01_context_test.py :linenos: + :start-at: import board Manual ACK Example ------------------ @@ -140,6 +153,8 @@ This is a test to show how to use the library for acknowledgement (ACK) response .. literalinclude:: ../examples/nrf24l01_manual_ack_test.py :caption: examples/nrf24l01_manual_ack_test.py :linenos: + :start-at: import time + :end-before: def set_role(): OTA compatibility ================= @@ -154,6 +169,8 @@ This is a test to show how to use the nRF24L01 as a BLE advertising beacon using .. literalinclude:: ../examples/nrf24l01_fake_ble_test.py :caption: examples/nrf24l01_fake_ble_test.py :linenos: + :start-at: import time + :end-before: def set_role(): TMRh20's Arduino library ------------------------ diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py index bf0710a..e2b7201 100644 --- a/examples/nrf24l01_manual_ack_test.py +++ b/examples/nrf24l01_manual_ack_test.py @@ -1,8 +1,6 @@ """ -Example of library driving the nRF24L01 to communicate with a nRF24L01 driven by -the TMRh20 Arduino library. The Arduino program/sketch that this example was -designed for is named GettingStarted_HandlingData.ino and can be found in the "RF24" -examples after the TMRh20 library is installed from the Arduino Library Manager. +Example of using the library manually send Acknowledgement (ACK) +messages without using the nRF24L01's ACK payloads feature. """ import time import board From 1e7336f60dc07d6e834c4634b5b99f9b060c437d Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sat, 23 Jan 2021 20:18:27 -0800 Subject: [PATCH 101/103] update greetings.rst & examples.rst --- docs/examples.rst | 71 ++++-- docs/greetings.rst | 545 ++++++++++++++++++++++++--------------------- 2 files changed, 343 insertions(+), 273 deletions(-) diff --git a/docs/examples.rst b/docs/examples.rst index 70e362c..452e63d 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -13,7 +13,6 @@ Ensure your device works with this simple test. .. literalinclude:: ../examples/nrf24l01_simple_test.py :caption: examples/nrf24l01_simple_test.py - :linenos: :start-at: import time :end-before: def set_role(): @@ -25,11 +24,12 @@ ACK Payloads Example - uses 2 addresses on pipes 1 & 0 to demonstrate proper addressing convention. - changed payloads to show use of c-strings' NULL terminating character. -This is a test to show how to use custom acknowledgment payloads. See also documentation on `ack` and `load_ack()`. +This is a test to show how to use custom acknowledgment payloads. + +.. seealso:: More details are found in the documentation on `ack` and `load_ack()`. .. literalinclude:: ../examples/nrf24l01_ack_payload_test.py :caption: examples/nrf24l01_ack_payload_test.py - :linenos: :start-at: import time :end-before: def set_role(): @@ -42,19 +42,31 @@ Multiceiver Example no longer uses ACK payloads for responding to node 1. -This example shows how use a group of 6 nRF24L01 transceivers to transmit to 1 nRF24L01 transceiver. `This technique is called "Multiceiver" in the nRF24L01 Specifications Sheet `_ +This example shows how use a group of 6 nRF24L01 transceivers to transmit to 1 nRF24L01 +transceiver. This technique is called `"Multiceiver" in the nRF24L01 Specifications Sheet +`_ -.. note:: This example follows the diagram illistrated in `figure 12 of section 7.7 of the nRF24L01 Specifications Sheet `_ Please note that if `auto_ack` (on the base station) and `arc` (on the transmitting nodes) are disabled, then `figure 10 of section 7.7 of the nRF24L01 Specifications Sheet `_ would be a better illustration. +.. note:: This example follows the diagram illistrated in + `figure 12 of section 7.7 of the nRF24L01 Specifications Sheet + `_ + Please note that if `auto_ack` (on the base station) and `arc` (on the + transmitting nodes) are disabled, then + `figure 10 of section 7.7 of the nRF24L01 Specifications Sheet + `_ + would be a better illustration. .. hint:: A paraphrased note from the the nRF24L01 Specifications Sheet: - *Only when a data pipe receives a complete packet can other data pipes begin to receive data. When multiple [nRF24L01]s are transmitting to [one nRF24L01], the* `ard` *can be used to skew the auto retransmission so that they only block each other once.* + *Only when a data pipe receives a complete packet can other data pipes begin + to receive data. When multiple [nRF24L01]s are transmitting to [one nRF24L01], + the* `ard` *can be used to skew the auto retransmission so that they only block + each other once.* - This basically means that it might help packets get received if the `ard` attribute is set to various values among multiple transmitting nRF24L01 transceivers. + This basically means that it might help packets get received if the `ard` attribute + is set to various values among multiple transmitting nRF24L01 transceivers. .. literalinclude:: ../examples/nrf24l01_multiceiver_test.py :caption: examples/nrf24l01_multiceiver_test.py - :linenos: :start-at: import time :end-before: def set_role(): @@ -64,11 +76,13 @@ Scanner Example .. versionadded:: 2.0.0 This example simply scans the entire RF frquency (2.4 GHz to 2.525 GHz) -and outputs a vertical graph of how many signals (per :py:attr:`~circuitpython_nrf24l01.rf24.RF24.channel`) were detected. This example can be used to find a frequency with the least ambient interference from other radio-emitting sources (i.e. WiFi, Bluetooth, or etc). +and outputs a vertical graph of how many signals (per +:py:attr:`~circuitpython_nrf24l01.rf24.RF24.channel`) were detected. This example +can be used to find a frequency with the least ambient interference from other +radio-emitting sources (i.e. WiFi, Bluetooth, or etc). .. literalinclude:: ../examples/nrf24l01_scanner_test.py :caption: examples/nrf24l01_scanner_test.py - :linenos: :start-at: import time :end-before: def set_role(): @@ -78,7 +92,8 @@ Reading the scanner output .. hint:: Make sure the terminal window used to run the scanner example is expanded to fit 125 characters. Otherwise the output will look weird. -The output of the scanner example is supposed to be read vertically (as columns). So, the following +The output of the scanner example is supposed to be read vertically (as columns). +So, the following | 000 | 111 @@ -99,12 +114,19 @@ IRQ Pin Example .. versionchanged:: 1.2.0 uses ACK payloads to trigger all 3 IRQ events. +.. versionchanged:: 2.0.0 + uses 2 addresses on pipes 1 & 0 to demonstrate proper addressing convention. -This is a test to show how to use nRF24L01's interrupt pin. Be aware that :py:func:`~circuitpython_nrf24l01.rf24.RF24.send()` clears all IRQ events on exit, so we use the non-blocking :py:func:`~circuitpython_nrf24l01.rf24.RF24.write()` instead. Also the `ack` attribute is enabled to trigger the :py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr` event when the master node receives ACK payloads. Simply put, this example is the most advanced example script (in this library), and it runs VERY quickly. +This is a test to show how to use nRF24L01's interrupt pin. Be aware that +:py:func:`~circuitpython_nrf24l01.rf24.RF24.send()` clears all IRQ events on exit, +so we use the non-blocking :py:func:`~circuitpython_nrf24l01.rf24.RF24.write()` +instead. Also the `ack` attribute is enabled to trigger the +:py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr` event when the master node +receives ACK payloads. Simply put, this example is the most advanced example script +(in this library), and it runs **very** quickly. .. literalinclude:: ../examples/nrf24l01_interrupt_test.py :caption: examples/nrf24l01_interrupt_test.py - :linenos: :start-at: import time :end-before: def set_role(): @@ -116,6 +138,8 @@ Stream Example .. versionchanged:: 1.2.3 added ``master_fifo()`` to demonstrate using full TX FIFO to stream data. +.. versionchanged:: 2.0.0 + uses 2 addresses on pipes 1 & 0 to demonstrate proper addressing convention. This is a test to show how to stream data. The ``master()`` uses the :py:meth:`~circuitpython_nrf24l01.rf24.RF24.send()` function to @@ -126,7 +150,6 @@ uses all 3 levels of the nRF24L01's TX FIFO to stream data, but it uses the .. literalinclude:: ../examples/nrf24l01_stream_test.py :caption: examples/nrf24l01_stream_test.py - :linenos: :start-at: import time :end-before: def set_role(): @@ -140,19 +163,27 @@ This is a test to show how to use `with` blocks to manage multiple different nRF .. literalinclude:: ../examples/nrf24l01_context_test.py :caption: examples/nrf24l01_context_test.py - :linenos: :start-at: import board Manual ACK Example ------------------ .. versionadded:: 2.0.0 - -This is a test to show how to use the library for acknowledgement (ACK) responses without using the automatic ACK packets (like the `ACK Payloads Example `_ does). Beware, that this technique is not faster and can be more prone to communication failure. However, This technique has the advantage of using more updated information in the responding payload as information in ACK payloads are always outdated by 1 transmission. + Previously, this example was strictly made for TMRh20's RF24 library example + titled "GettingStarted_HandlingData.ino". With the latest addition of new + examples to the TMRh20 RF24 library, this example was renamed from + "nrf24l01_2arduino_handling_data.py" and adapted for both this library and + TMRh20's RF24 library. + +This is a test to show how to use the library for acknowledgement (ACK) responses +without using the automatic ACK packets (like the `ACK Payloads Example`_ does). +Beware, that this technique is not faster and can be more prone to communication +failure. However, This technique has the advantage of using more updated information +in the responding payload as information in ACK payloads are always outdated by 1 +transmission. .. literalinclude:: ../examples/nrf24l01_manual_ack_test.py :caption: examples/nrf24l01_manual_ack_test.py - :linenos: :start-at: import time :end-before: def set_role(): @@ -164,11 +195,11 @@ Fake BLE Example .. versionadded:: 1.2.0 -This is a test to show how to use the nRF24L01 as a BLE advertising beacon using the `FakeBLE` class. +This is a test to show how to use the nRF24L01 as a BLE advertising beacon using the +`FakeBLE` class. .. literalinclude:: ../examples/nrf24l01_fake_ble_test.py :caption: examples/nrf24l01_fake_ble_test.py - :linenos: :start-at: import time :end-before: def set_role(): diff --git a/docs/greetings.rst b/docs/greetings.rst index 16b842b..1981609 100644 --- a/docs/greetings.rst +++ b/docs/greetings.rst @@ -1,253 +1,292 @@ - -Getting Started -================== - -This is a Circuitpython driver library for the nRF24L01(+) transceiver. - -Originally this code was a Micropython module written by Damien P. George -& Peter Hinch which can still be found `here -`_ - -The Micropython source has since been rewritten to expose all the nRF24L01's -features and for Circuitpython compatible devices (including linux-based -SoC computers like the Raspberry Pi). -Modified by Brendan Doherty & Rhys Thomas. - -* Authors: Damien P. George, Peter Hinch, Rhys Thomas, Brendan Doherty - -Features currently supported ----------------------------- - -* Change the address's length (can be 3 to 5 bytes long) -* Dynamically sized payloads (max 32 bytes each) or statically sized payloads -* Automatic responding acknowledgment (ACK) packets for verifying transmission success -* Append custom payloadsto the acknowledgment (ACK) packets for instant bi-directional communication -* Mark a single payload for no acknowledgment (ACK) from the receiving nRF24L01 (see ``ask_no_ack`` - parameter for :py:meth:`~circuitpython_nrf24l01.rf24.RF24.send()` and `write()` functions) -* Invoke the "re-use the same payload" feature (for manually re-transmitting failed transmissions that - remain in the TX FIFO buffer) -* Multiple payload transmissions with one function call (see documentation on the - :py:meth:`~circuitpython_nrf24l01.rf24.RF24.send()` function and try out the - `Stream example `_) -* Context manager compatible for easily switching between different radio configurations - using `with` blocks (not available in ``rf24_lite.py`` version) -* Configure the interrupt (IRQ) pin to trigger (active low) on received, sent, and/or - failed transmissions (these 3 events control 1 IRQ pin). There's also virtual - representations of these interrupt events available (see `irq_dr`, `irq_ds`, & `irq_df` attributes) -* Invoke sleep mode (AKA power down mode) for ultra-low current consumption -* cyclic redundancy checking (CRC) up to 2 bytes long -* Adjust the nRF24L01's builtin automatic re-transmit feature's parameters (`arc`: number - of attempts, `ard`: delay between attempts) -* Adjust the nRF24L01's frequency channel (2.4-2.525 GHz) -* Adjust the nRF24L01's power amplifier level (0, -6, -12, or -18 dBm) -* Adjust the nRF24L01's RF data rate (250kbps, 1Mbps, or 2Mbps) -* An nRF24L01 driven by this library can communicate with a nRF24L01 on an Arduino driven by the `TMRh20 RF24 library `_. See the `nrf24l01_2arduino_handling_data.py `_ example. -* fake BLE module for sending BLE beacon advertisments from the nRF24L01 as outlined by `Dmitry Grinberg in his write-up (including C source code) `_. -* Multiceiver\ :sup:`TM` mode (up to 6 TX nRF24L01 "talking" to 1 RX nRF24L01 simultaneously). See the `Multiceiver Example `_ - -Dependencies --------------------------- - -This driver depends on: - -* `Adafruit CircuitPython Firmware `_ or the - `Adafruit_Blinka library `_ for Linux - SoC boards like Raspberry Pi -* `Adafruit_CircuitPython_BusDevice - `_ (specifically the - :py:mod:`~adafruit_bus_device.spi_device`) - -Please ensure all dependencies are available on the CircuitPython filesystem. -This is easily achieved by downloading -`the Adafruit library and driver bundle `_. - -.. note:: This library supports Python 3.7 or newer because the examples use - the function `time.monotonic_ns() `_ which returns an arbitrary time "counter" - as an `int` of nanoseconds. CircuitPython firmware also supports - :py:func:`time.monotonic_ns()`. - -Installing from PyPI --------------------- - -On supported GNU/Linux systems like the Raspberry Pi, you can install the driver locally `from -PyPI `_. To install for current user: - -.. code-block:: shell - - pip3 install circuitpython-nrf24l01 - -To install system-wide (this may be required in some cases): - -.. code-block:: shell - - sudo pip3 install circuitpython-nrf24l01 - -To install in a virtual environment in your current project: - -.. code-block:: shell - - mkdir project-name && cd project-name - python3 -m venv .env - source .env/bin/activate - pip3 install circuitpython-nrf24l01 - -Pinout -====== -.. image:: https://lastminuteengineers.com/wp-content/uploads/2018/07/Pinout-nRF24L01-Wireless-Transceiver-Module.png - :target: https://lastminuteengineers.com/nrf24l01-arduino-wireless-communication/#nrf24l01-transceiver-module-pinout - -The nRF24L01 is controlled through SPI so there are 3 pins (SCK, MOSI, & MISO) that can only be connected to their counterparts on the MCU (microcontroller unit). The other 2 essential pins (CE & CSN) can be connected to any digital output pins. Lastly, the only optional pin on the nRf24L01 GPIOs is the IRQ (interrupt; a digital output that's active when low) pin and is only connected to the MCU via a digital input pin during the interrupt example. The following pinout is used in the example codes of this library's `examples `_. - -.. csv-table:: - :header: nRF2401, "Raspberry Pi", "ItsyBitsy M4" - - GND, GND, GND - VCC, 3V, 3.3V - CE, GPIO4, D4 - CSN, GPIO5, D5 - SCK, "GPIO11 (SCK)", SCK - MOSI, "GPIO10 (MOSI)", MOSI - MISO, "GPIO9 (MISO)", MISO - IRQ, GPIO12, D12 - -.. tip:: User reports and personal experiences have improved results if there is a capacitor of 100 mirofarads [+ another optional 0.1 microfarads capacitor for added stability] connected in parrallel to the VCC and GND pins. - -Using The Examples -================== - -See `examples `_ for testing certain features of this the library. The examples were developed and tested on both Raspberry Pi and ItsyBitsy M4. Pins have been hard coded in the examples for the corresponding device, so please adjust these accordingly to your circuitpython device if necessary. - -To run the simple example, navigate to this repository's "examples" folder in the terminal. If you're working with a CircuitPython device (not a Raspberry Pi), copy the file named "nrf24l01_simple_test.py" from this repository's "examples" folder to the root directory of your CircuitPython device's CIRCUITPY drive. Now you're ready to open a python REPR and run the following commands: - -.. code-block:: python - - >>> from nrf24l01_simple_test import * - Which radio is this? Enter '0' or '1'. Defaults to '0' - nRF24L01 Simple test. - Run slave() on receiver - Run master() on transmitter - >>> master() - Transmission successful! Time to Transmit: 6993.972 us. Sent: 0.0 - Transmission successful! Time to Transmit: 6563.277 us. Sent: 0.01 - Transmission successful! Time to Transmit: 6453.385 us. Sent: 0.02 - Transmission successful! Time to Transmit: 6338.29 us. Sent: 0.03 - Transmission successful! Time to Transmit: 6440.163 us. Sent: 0.04 - -What to purchase -================= - -See the store links on the sidebar or just google "nRF24L01+". It is worth noting that you -generally want to buy more than 1 as you need 2 for testing -- 1 to send & 1 to receive and -vise versa. This library has been tested on a cheaply bought 6 pack from Amazon.com, but don't -take Amazon or eBay for granted! There are other wireless transceivers that are NOT compatible -with this library. For instance, the esp8266-01 (also sold in packs) is NOT compatible with -this library, but looks very similar to the nRF24L01+ and could lead to an accidental purchase. - -Power Stability -------------------- - -If you're not using a dedicated 3V regulator to supply power to the nRF24L01, -then adding capcitor(s) (100 µF + an optional 0.1µF) in parrellel (& as close -as possible) to the VCC and GND pins is highly recommended. Stablizing the power -input provides significant performance increases. More finite details about the -nRF24L01 are available from the datasheet (referenced here in the documentation as the -`nRF24L01+ Specification Sheet `_) - -About the nRF24L01+PA+LNA modules ---------------------------------- - -You may find variants of the nRF24L01 transceiver that are marketed as "nRF24L01+PA+LNA". -These modules are distinct in the fact that they come with a detachable (SMA-type) antenna. -They employ seperate RFX24C01 IC with the antenna for enhanced Power Amplification (PA) and -Low Noise Amplification (LNA) features. While they boast greater range with the same -functionality, they are subject to a couple lesser known (and lesser advertised) drawbacks: - -1. Stronger power source. Below is a chart of advertised current requirements that many MCU - boards' 3V regulators may not be able to provide (after supplying power to internal - components). - - .. csv-table:: - :header: Specification, Value - :widths: 10,5 - - "Emission mode current(peak)", "115 mA" - "Receive Mode current(peak)", "45 mA" - "Power-down mode current", "4.2 µA" - -2. Needs shielding from electromagnetic interference. Shielding usually works best when - it has a path to ground (GND pin), but this connection to the GND pin is not required. - -See also the `Testing nRF24L01+PA+LNA module `_ - -nRF24L01(+) clones and counterfeits ------------------------------------ - -This library does not directly support clones/counterfeits as there is no way for the library -to differentiate between an actual nRF24L01+ and a clone/counterfeit. To determine if your -purchase is a counterfeit, please contact the retailer you purchased from (also `reading this -article and its links might help -`_). The most notable clone is the `Si24R1 `_. I could not find -the `Si24R1 datasheet `_ in english. Troubleshooting -the SI24R1 may require `replacing the onboard antenna with a wire -`_. Furthermore, the Si24R1 has different power -amplifier options as noted in the `RF_PWR section (bits 0 through 2) of the RF_SETUP register -(address 0x06) of the datasheet `_. -While the options' values differ from those identified by this library's API, the -underlying commands to configure those options are almost identical to the nRF24L01. Other -known clones include the bk242x (also known as RFM7x). - -.. seealso:: - `Read this article - `_ - about using clones with missing capacitors (includees pictures). - -Contributing -============ - -Contributions are welcome! Please read our `Code of Conduct -`_ -before contributing to help this project stay welcoming. To contribute, all you need to do is fork `this repository `_, develop your idea(s) and submit a pull request when stable. To initiate a discussion of idea(s), you need only open an issue on the aforementioned repository (doesn't have to be a bug report). - - -Future Project Ideas/Additions ------------------------------- - -The following are only ideas; they are not currently supported by this circuitpython library. - -* `There's a few blog posts by Nerd Ralph demonstrating how to use the nRF24L01 via 2 or 3 - pins `_ (uses custom bitbanging SPI functions and an external circuit involving a - resistor and a capacitor) -* network linking layer, maybe something like `TMRh20's RF24Network - `_ -* implement the Gazelle-based protocol used by the BBC micro-bit (`makecode.com's radio - blocks `_). - - -Sphinx documentation ------------------------ - -Sphinx is used to build the documentation based on rST files and comments in the code. First, -install dependencies (feel free to reuse the virtual environment from `above `_): - -.. code-block:: shell - - python3 -m venv .env - source .env/bin/activate - pip install Sphinx sphinx-rtd-theme - -Now, once you have the virtual environment activated: - -.. code-block:: shell - - cd docs - sphinx-build -E -W -b html . _build - -This will output the documentation to ``docs/_build``. Open the index.html in your browser to -view them. It will also (due to -W) error out on any warning like the Github action, Build CI, -does. This is a good way to locally verify it will pass. + +Getting Started +================== + +This is a Circuitpython driver library for the nRF24L01(+) transceiver. + +Originally this code was a Micropython module written by Damien P. George +& Peter Hinch which can still be found `here +`_ + +The Micropython source has since been rewritten to expose all the nRF24L01's +features and for Circuitpython compatible devices (including linux-based +SoC computers like the Raspberry Pi). +Modified by Brendan Doherty & Rhys Thomas. + +* Authors: Damien P. George, Peter Hinch, Rhys Thomas, Brendan Doherty + +Features currently supported +---------------------------- + +* Change the address's length (can be 3 to 5 bytes long) +* Dynamically sized payloads (max 32 bytes each) or statically sized payloads +* Automatic responding acknowledgment (ACK) packets for verifying transmission success +* Append custom payloadsto the acknowledgment (ACK) packets for instant bi-directional communication +* Mark a single payload for no acknowledgment (ACK) from the receiving nRF24L01 (see ``ask_no_ack`` + parameter for :py:meth:`~circuitpython_nrf24l01.rf24.RF24.send()` and `write()` functions) +* Invoke the "re-use the same payload" feature (for manually re-transmitting failed transmissions that + remain in the TX FIFO buffer) +* Multiple payload transmissions with one function call (see documentation on the + :py:meth:`~circuitpython_nrf24l01.rf24.RF24.send()` function and try out the + `Stream example `_) +* Context manager compatible for easily switching between different radio configurations + using `with` blocks (not available in ``rf24_lite.py`` version) +* Configure the interrupt (IRQ) pin to trigger (active low) on received, sent, and/or + failed transmissions (these 3 events control 1 IRQ pin). There's also virtual + representations of these interrupt events available (see `irq_dr`, `irq_ds`, & `irq_df` attributes) +* Invoke sleep mode (AKA power down mode) for ultra-low current consumption +* cyclic redundancy checking (CRC) up to 2 bytes long +* Adjust the nRF24L01's builtin automatic re-transmit feature's parameters (`arc`: number + of attempts, `ard`: delay between attempts) +* Adjust the nRF24L01's frequency channel (2.4-2.525 GHz) +* Adjust the nRF24L01's power amplifier level (0, -6, -12, or -18 dBm) +* Adjust the nRF24L01's RF data rate (250kbps, 1Mbps, or 2Mbps) +* An nRF24L01 driven by this library can communicate with a nRF24L01 on an Arduino driven by the `TMRh20 RF24 library `_. See the `nrf24l01_2arduino_handling_data.py `_ example. +* fake BLE module for sending BLE beacon advertisments from the nRF24L01 as outlined by `Dmitry Grinberg in his write-up (including C source code) `_. +* Multiceiver\ :sup:`TM` mode (up to 6 TX nRF24L01 "talking" to 1 RX nRF24L01 simultaneously). See the `Multiceiver Example `_ + +Dependencies +-------------------------- + +This driver depends on: + +* `Adafruit CircuitPython Firmware `_ or the + `Adafruit_Blinka library `_ for Linux + SoC boards like Raspberry Pi +* `Adafruit_CircuitPython_BusDevice + `_ (specifically the + :py:mod:`~adafruit_bus_device.spi_device`) + +Please ensure all dependencies are available on the CircuitPython filesystem. +This is easily achieved by downloading +`the Adafruit library and driver bundle `_. + +.. note:: This library supports Python 3.7 or newer because the examples use + the function `time.monotonic_ns() `_ which returns an arbitrary time "counter" + as an `int` of nanoseconds. CircuitPython firmware also supports + :py:func:`time.monotonic_ns()`. + +Installing from PyPI +-------------------- + +On supported GNU/Linux systems like the Raspberry Pi, you can install the driver locally `from +PyPI `_. To install for current user: + +.. code-block:: shell + + pip3 install circuitpython-nrf24l01 + +To install system-wide (this may be required in some cases): + +.. code-block:: shell + + sudo pip3 install circuitpython-nrf24l01 + +To install in a virtual environment in your current project: + +.. code-block:: shell + + mkdir project-name && cd project-name + python3 -m venv .env + source .env/bin/activate + pip3 install circuitpython-nrf24l01 + +Pinout +====== +.. image:: https://lastminuteengineers.com/wp-content/uploads/2018/07/Pinout-nRF24L01-Wireless-Transceiver-Module.png + :target: https://lastminuteengineers.com/nrf24l01-arduino-wireless-communication/#nrf24l01-transceiver-module-pinout + +The nRF24L01 is controlled through SPI so there are 3 pins (SCK, MOSI, & MISO) that can only be connected to their counterparts on the MCU (microcontroller unit). The other 2 essential pins (CE & CSN) can be connected to any digital output pins. Lastly, the only optional pin on the nRf24L01 GPIOs is the IRQ (interrupt; a digital output that's active when low) pin and is only connected to the MCU via a digital input pin during the interrupt example. The following pinout is used in the example codes of this library's `examples `_. + +.. csv-table:: + :header: nRF2401, "Raspberry Pi", "ItsyBitsy M4" + + GND, GND, GND + VCC, 3V, 3.3V + CE, GPIO4, D4 + CSN, GPIO5, D5 + SCK, "GPIO11 (SCK)", SCK + MOSI, "GPIO10 (MOSI)", MOSI + MISO, "GPIO9 (MISO)", MISO + IRQ, GPIO12, D12 + +.. tip:: User reports and personal experiences have improved results if there is a capacitor of 100 mirofarads [+ another optional 0.1 microfarads capacitor for added stability] connected in parrallel to the VCC and GND pins. + +Using The Examples +================== + +See `examples `_ for testing certain features of this the library. The examples were developed and tested on both Raspberry Pi and ItsyBitsy M4. Pins have been hard coded in the examples for the corresponding device, so please adjust these accordingly to your circuitpython device if necessary. + +For an interactive REPL +--------------------------- + +All examples can be imported from within an interactive python REPL. + +1. Make sure the examples are located in the current working directory. + On CircuitPython devices, this will be the root directory of the CIRCUITPY drive. +2. Import everything from desired the example. The following code snippet demonstrates running the `Simple Test example `_ + + .. code-block:: python + + >>> from nrf24l01_simple_test import * + Which radio is this? Enter '0' or '1'. Defaults to '0' + nRF24L01 Simple test. + Run slave() on receiver + Run master() on transmitter + >>> master() + Transmission successful! Time to Transmit: 6993.972 us. Sent: 0.0 + Transmission successful! Time to Transmit: 6563.277 us. Sent: 0.01 + Transmission successful! Time to Transmit: 6453.385 us. Sent: 0.02 + Transmission successful! Time to Transmit: 6338.29 us. Sent: 0.03 + Transmission successful! Time to Transmit: 6440.163 us. Sent: 0.04 + +For CircuitPython devices +--------------------------- + +1. Copy the examples to the root directory of the CIRCUITPY device. +2. Rename of the example file to ``main.py``. +3. If the REPL is not already running, then the example should start automatically. + If the REPL is already running in interactive mode, then press ``ctrl+d`` to do a + soft reset, and the example should start automatically. + +For CPython in Linux +--------------------------- + +1. Clone the library repository, then navigate to the reository's example directory. + + .. code-block:: shell + + git clone https://github.com/2bndy5/CircuitPython_nRF24L01.git + cd CircuitPython_nRF24L01/examples + +2. Run the example as a normal python program + + .. code-block:: shell + + python3 nrf24l01_simple_test.py + + +What to purchase +================= + +See the store links on the sidebar or just google "nRF24L01+". It is worth noting that you +generally want to buy more than 1 as you need 2 for testing -- 1 to send & 1 to receive and +vise versa. This library has been tested on a cheaply bought 6 pack from Amazon.com, but don't +take Amazon or eBay for granted! There are other wireless transceivers that are NOT compatible +with this library. For instance, the esp8266-01 (also sold in packs) is NOT compatible with +this library, but looks very similar to the nRF24L01+ and could lead to an accidental purchase. + +.. seealso:: + Beware, there are also `nrf24l01(+) clones and counterfeits`_ that may not work the same. + +Power Stability +------------------- + +If you're not using a dedicated 3V regulator to supply power to the nRF24L01, +then adding capcitor(s) (100 µF + an optional 0.1µF) in parrellel (& as close +as possible) to the VCC and GND pins is highly recommended. Stablizing the power +input provides significant performance increases. More finite details about the +nRF24L01 are available from the datasheet (referenced here in the documentation as the +`nRF24L01+ Specification Sheet `_) + +About the nRF24L01+PA+LNA modules +--------------------------------- + +You may find variants of the nRF24L01 transceiver that are marketed as "nRF24L01+PA+LNA". +These modules are distinct in the fact that they come with a detachable (SMA-type) antenna. +They employ seperate RFX24C01 IC with the antenna for enhanced Power Amplification (PA) and +Low Noise Amplification (LNA) features. While they boast greater range with the same +functionality, they are subject to a couple lesser known (and lesser advertised) drawbacks: + +1. Stronger power source. Below is a chart of advertised current requirements that many MCU + boards' 3V regulators may not be able to provide (after supplying power to internal + components). + + .. csv-table:: + :header: Specification, Value + :widths: 10,5 + + "Emission mode current(peak)", "115 mA" + "Receive Mode current(peak)", "45 mA" + "Power-down mode current", "4.2 µA" + +2. Needs shielding from electromagnetic interference. Shielding usually works best when + it has a path to ground (GND pin), but this connection to the GND pin is not required. + +See also the `Testing nRF24L01+PA+LNA module `_ + +nRF24L01(+) clones and counterfeits +----------------------------------- + +This library does not directly support clones/counterfeits as there is no way for the library +to differentiate between an actual nRF24L01+ and a clone/counterfeit. To determine if your +purchase is a counterfeit, please contact the retailer you purchased from (also `reading this +article and its links might help +`_). The most notable clone is the `Si24R1 `_. I could not find +the `Si24R1 datasheet `_ in english. Troubleshooting +the SI24R1 may require `replacing the onboard antenna with a wire +`_. Furthermore, the Si24R1 has different power +amplifier options as noted in the `RF_PWR section (bits 0 through 2) of the RF_SETUP register +(address 0x06) of the datasheet `_. +While the options' values differ from those identified by this library's API, the +underlying commands to configure those options are almost identical to the nRF24L01. +The Si24R1 is also famous for not supporting :py:attr:`~circuitpython_nrf24l01.rf24.RF24.auto_ack` +correctly because the designers "cloned" a typo from the 1\ :sup:`st` version of the nRF24L01 +(non-plus) datasheet into the Si24R1 firmware. Other known clones include the bk242x (also known as +RFM7x). + +.. seealso:: + `Read this article + `_ + about using clones with missing capacitors (includes pictures). + +Contributing +============ + +Contributions are welcome! Please read our `Code of Conduct +`_ +before contributing to help this project stay welcoming. To contribute, all you need to do is fork `this repository `_, develop your idea(s) and submit a pull request when stable. To initiate a discussion of idea(s), you need only open an issue on the aforementioned repository (doesn't have to be a bug report). + + +Future Project Ideas/Additions +------------------------------ + +The following are only ideas; they are not currently supported by this circuitpython library. + +* `There's a few blog posts by Nerd Ralph demonstrating how to use the nRF24L01 via 2 or 3 + pins `_ (uses custom bitbanging SPI functions and an external circuit involving a + resistor and a capacitor) +* network linking layer, maybe something like `TMRh20's RF24Network + `_ +* implement the Gazelle-based protocol used by the BBC micro-bit (`makecode.com's radio + blocks `_). + + +Sphinx documentation +----------------------- + +Sphinx is used to build the documentation based on rST files and comments in the code. First, +install dependencies (feel free to reuse the virtual environment from `above `_): + +.. code-block:: shell + + python3 -m venv .env + source .env/bin/activate + pip install Sphinx sphinx-rtd-theme + +Now, once you have the virtual environment activated: + +.. code-block:: shell + + cd docs + sphinx-build -E -W -b html . _build + +This will output the documentation to ``docs/_build``. Open the index.html in your browser to +view them. It will also (due to -W) error out on any warning like the Github action, Build CI, +does. This is a good way to locally verify it will pass. From 34cc87489c224d33b3e0fa281e82a53dbcb7d570 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sun, 24 Jan 2021 17:58:55 -0800 Subject: [PATCH 102/103] wrong timeout val in manual_ack test --- docs/examples.rst | 23 +++++++++-------------- examples/nrf24l01_manual_ack_test.py | 2 +- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/docs/examples.rst b/docs/examples.rst index 452e63d..711e4bd 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -41,7 +41,6 @@ Multiceiver Example .. versionchanged:: 2.0.0 no longer uses ACK payloads for responding to node 1. - This example shows how use a group of 6 nRF24L01 transceivers to transmit to 1 nRF24L01 transceiver. This technique is called `"Multiceiver" in the nRF24L01 Specifications Sheet `_ @@ -117,13 +116,10 @@ IRQ Pin Example .. versionchanged:: 2.0.0 uses 2 addresses on pipes 1 & 0 to demonstrate proper addressing convention. -This is a test to show how to use nRF24L01's interrupt pin. Be aware that -:py:func:`~circuitpython_nrf24l01.rf24.RF24.send()` clears all IRQ events on exit, -so we use the non-blocking :py:func:`~circuitpython_nrf24l01.rf24.RF24.write()` -instead. Also the `ack` attribute is enabled to trigger the -:py:attr:`~circuitpython_nrf24l01.rf24.RF24.irq_dr` event when the master node -receives ACK payloads. Simply put, this example is the most advanced example script -(in this library), and it runs **very** quickly. +This is a test to show how to use nRF24L01's interrupt pin using the non-blocking +`write()`. Also the `ack` attribute is enabled to trigger the `irq_dr` event when +the master node receives ACK payloads. Simply put, this example is the most advanced +example script (in this library), and it runs **very** quickly. .. literalinclude:: ../examples/nrf24l01_interrupt_test.py :caption: examples/nrf24l01_interrupt_test.py @@ -141,12 +137,11 @@ Stream Example .. versionchanged:: 2.0.0 uses 2 addresses on pipes 1 & 0 to demonstrate proper addressing convention. -This is a test to show how to stream data. The ``master()`` uses the -:py:meth:`~circuitpython_nrf24l01.rf24.RF24.send()` function to -transmit multiple payloads with 1 function call. However ``master()`` only uses 1 -level of the nRF24L01's TX FIFO. An alternate function, called ``master_fifo()`` -uses all 3 levels of the nRF24L01's TX FIFO to stream data, but it uses the -`write()` function to do so. +This is a test to show how to stream data. The ``master()`` uses the `send()` +function to transmit multiple payloads with 1 function call. However +``master()`` only uses 1 level of the nRF24L01's TX FIFO. An alternate function, +called ``master_fifo()`` uses all 3 levels of the nRF24L01's TX FIFO to stream +data, but it uses the `write()` function to do so. .. literalinclude:: ../examples/nrf24l01_stream_test.py :caption: examples/nrf24l01_stream_test.py diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py index e2b7201..6c6cb4a 100644 --- a/examples/nrf24l01_manual_ack_test.py +++ b/examples/nrf24l01_manual_ack_test.py @@ -65,7 +65,7 @@ def master(count=5): # count = 5 will only transmit 5 packets print("send() failed or timed out") else: # sent successful; listen for a response nrf.listen = True # get radio ready to receive a response - timeout = time.monotonic_ns() + 200000 # set sentinal for timeout + timeout = time.monotonic_ns() + 200000000 # set sentinal for timeout while not nrf.available() and time.monotonic_ns() < timeout: # this loop hangs for 200 ms or until response is received pass From d2114f9910edf5e3aabf2023d9f63cc66f657c33 Mon Sep 17 00:00:00 2001 From: brendan <2bndy5@gmail.com> Date: Sun, 24 Jan 2021 18:03:29 -0800 Subject: [PATCH 103/103] wrong timeout in slave() man_ack test --- examples/nrf24l01_manual_ack_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/nrf24l01_manual_ack_test.py b/examples/nrf24l01_manual_ack_test.py index 6c6cb4a..e61035d 100644 --- a/examples/nrf24l01_manual_ack_test.py +++ b/examples/nrf24l01_manual_ack_test.py @@ -116,7 +116,7 @@ def slave(timeout=6): counter[0] = received[7:8][0] + 1 nrf.listen = False # put the radio in TX mode result = False - ack_timeout = time.monotonic_ns() + 200000 + ack_timeout = time.monotonic_ns() + 200000000 while not result and time.monotonic_ns() < ack_timeout: # try to send reply for 200 milliseconds (at most) result = nrf.send(b"World \0" + bytes([counter[0]]))