@@ -319,10 +319,21 @@ class CC1101:
"""
see .get_preamble_length_bytes()
- if length % 2:
+ if length < 1:
+ raise ValueError(
+ "invalid preamble length {} given".format(length)
+ + "\ncall .set_sync_mode(cc1101.SyncMode.NO_PREAMBLE_AND_SYNC_WORD)"
+ + " to disable preamble"
+ )
+ if length % 3 == 0:
index = math.log2(length / 3) * 2 + 1
else:
index = math.log2(length / 2) * 2
+ if not index.is_integer() or index < 0 or index > 0b111:
+ "unsupported preamble length: {} bytes".format(length)
+ + "\nsee MDMCFG1.NUM_PREAMBLE in cc1101 docs"
self._set_preamble_length_index(int(index))
def _set_power_amplifier_setting_index(self, setting_index: int) -> None:
@@ -188,6 +188,14 @@ def test_set_preamble_length_bytes(transceiver, mdmcfg1_before, mdmcfg1_after, l
transceiver._spi.xfer.assert_called_once_with([0x13 | 0x40, mdmcfg1_after])
+@pytest.mark.parametrize(
+ "length", [-21, 0, 1, 5, 7, 9, 10, 11, 13, 14, 15, 17, 20, 23, 25, 32, 42]
+)
+def test_set_preamble_length_bytes_invalid(transceiver, length):
+ with pytest.raises(ValueError, match=r"\bpreamble length\b"):
+ transceiver.set_preamble_length_bytes(length)
+
def test_get_packet_length_bytes(transceiver):
xfer_mock = transceiver._spi.xfer
xfer_mock.return_value = [0, 8]