Browse Source

set_preamble_length_bytes(): raise ValueError if length unsupported

Fabian Peter Hammerle 3 years ago
parent
commit
391a1706d3
2 changed files with 20 additions and 1 deletions
  1. 12 1
      cc1101/__init__.py
  2. 8 0
      tests/test_config.py

+ 12 - 1
cc1101/__init__.py

@@ -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:
+            raise ValueError(
+                "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:

+ 8 - 0
tests/test_config.py

@@ -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]