summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/library/espnow.rst2
-rw-r--r--tests/multi_espnow/75_rate.py92
-rw-r--r--tests/multi_espnow/75_rate.py.exp31
3 files changed, 124 insertions, 1 deletions
diff --git a/docs/library/espnow.rst b/docs/library/espnow.rst
index 4b4b058f8..14a92c114 100644
--- a/docs/library/espnow.rst
+++ b/docs/library/espnow.rst
@@ -172,7 +172,7 @@ Configuration
api-reference/network/esp_wifi.html#_CPPv415wifi_phy_rate_t>`_. This
parameter is actually *write-only* due to ESP-IDF not providing any
means for querying the radio interface's rate parameter.
- See also `espnow-long-range`.
+ See also `espnow-long-range`. This API currently doesn't work on ESP32-C6.
.. data:: Returns:
diff --git a/tests/multi_espnow/75_rate.py b/tests/multi_espnow/75_rate.py
new file mode 100644
index 000000000..9c05a24bd
--- /dev/null
+++ b/tests/multi_espnow/75_rate.py
@@ -0,0 +1,92 @@
+# Test configuring transmit rates for ESP-NOW on ESP32
+
+import sys
+import time
+
+try:
+ import network
+ import espnow
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+# ESP8266 doesn't support multiple ESP-NOW data rates
+if sys.platform == "esp8266":
+ print("SKIP")
+ raise SystemExit
+
+# Currently the config(rate=...) implementation is not compatible with ESP32-C6
+# (this test passes when C6 is receiver, but not if C6 is sender.)
+if "ESP32C6" in sys.implementation._machine:
+ print("SKIP")
+ raise SystemExit
+
+# ESP32-C2 doesn't support Long Range mode. This test is currently written assuming
+# LR mode can be enabled.
+if "ESP32C2" in sys.implementation._machine:
+ print("SKIP")
+ raise SystemExit
+
+
+timeout_ms = 1000
+default_pmk = b"MicroPyth0nRules"
+CHANNEL = 9
+
+
+def init_sta():
+ sta = network.WLAN(network.WLAN.IF_STA)
+ e = espnow.ESPNow()
+ e.active(True)
+ sta.active(True)
+ sta.disconnect() # Force AP disconnect for any saved config, important so the channel doesn't change
+ sta.config(channel=CHANNEL)
+ e.set_pmk(default_pmk)
+ # Enable both default 802.11 modes and Long Range modes
+ sta.config(protocol=network.WLAN.PROTOCOL_LR | network.WLAN.PROTOCOL_DEFAULT)
+ return sta, e
+
+
+# Receiver
+def instance0():
+ sta, e = init_sta()
+ multitest.globals(PEER=sta.config("mac"))
+ multitest.next()
+ while True:
+ peer, msg = e.recv(timeout_ms)
+ if peer is None:
+ print("Timeout")
+ break
+ # Note that we don't have any way in Python to tell what data rate this message
+ # was received with, so we're assuming the rate was correct.
+ print(msg)
+ e.active(False)
+
+
+# Sender
+def instance1():
+ sta, e = init_sta()
+ multitest.next()
+ peer = PEER
+
+ e.add_peer(peer)
+ # Test normal, non-LR rates
+ for msg, rate in (
+ (b"default rate", None),
+ (b"5Mbit", espnow.RATE_5M),
+ (b"11Mbit", espnow.RATE_11M),
+ (b"24Mbit", espnow.RATE_24M),
+ (b"54Mbit", espnow.RATE_54M),
+ (b"250K LR", espnow.RATE_LORA_250K),
+ (b"500K LR", espnow.RATE_LORA_500K),
+ # switch back to non-LR rates to check it's all OK
+ (b"1Mbit again", espnow.RATE_1M),
+ (b"11Mbit again", espnow.RATE_11M),
+ ):
+ if rate is not None:
+ e.config(rate=rate)
+ for _ in range(3):
+ e.send(peer, msg)
+ time.sleep_ms(50) # give messages some time to be received before continuing
+ e.del_peer(peer)
+
+ e.active(False)
diff --git a/tests/multi_espnow/75_rate.py.exp b/tests/multi_espnow/75_rate.py.exp
new file mode 100644
index 000000000..5a275ee6b
--- /dev/null
+++ b/tests/multi_espnow/75_rate.py.exp
@@ -0,0 +1,31 @@
+--- instance0 ---
+b'default rate'
+b'default rate'
+b'default rate'
+b'5Mbit'
+b'5Mbit'
+b'5Mbit'
+b'11Mbit'
+b'11Mbit'
+b'11Mbit'
+b'24Mbit'
+b'24Mbit'
+b'24Mbit'
+b'54Mbit'
+b'54Mbit'
+b'54Mbit'
+b'250K LR'
+b'250K LR'
+b'250K LR'
+b'500K LR'
+b'500K LR'
+b'500K LR'
+b'1Mbit again'
+b'1Mbit again'
+b'1Mbit again'
+b'11Mbit again'
+b'11Mbit again'
+b'11Mbit again'
+Timeout
+--- instance1 ---
+