Browse Source

added method `set_preamble_length_bytes()`

Fabian Peter Hammerle 3 years ago
parent
commit
d68319dea3
4 changed files with 49 additions and 0 deletions
  1. 1 0
      CHANGELOG.md
  2. 19 0
      cc1101/__init__.py
  3. 1 0
      examples/transmit_variable_length.py
  4. 28 0
      tests/test_config.py

+ 1 - 0
CHANGELOG.md

@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - method `.get_sync_word()`
 - method `.set_sync_word()`
 - method `.get_preamble_length_bytes()`
+- method `.set_preamble_length_bytes()`
 - preamble length & sync word in string representation
 
 ## [2.0.0] - 2020-12-03

+ 19 - 0
cc1101/__init__.py

@@ -297,6 +297,8 @@ class CC1101:
 
     def get_preamble_length_bytes(self) -> int:
         """
+        MDMCFG1.NUM_PREAMBLE
+
         Minimum number of preamble bytes to be transmitted.
 
         See "15.2 Packet Format"
@@ -306,6 +308,23 @@ class CC1101:
         ) & 0b111
         return 2 ** (index >> 1) * (2 + (index & 0b1))
 
+    def _set_preamble_length_index(self, index: int) -> None:
+        assert 0 <= index <= 0b111
+        mdmcfg1 = self._read_single_byte(ConfigurationRegisterAddress.MDMCFG1)
+        mdmcfg1 &= 0b10001111
+        mdmcfg1 |= index << 4
+        self._write_burst(ConfigurationRegisterAddress.MDMCFG1, [mdmcfg1])
+
+    def set_preamble_length_bytes(self, length: int) -> None:
+        """
+        see .get_preamble_length_bytes()
+        """
+        if length % 2:
+            index = math.log2(length / 3) * 2 + 1
+        else:
+            index = math.log2(length / 2) * 2
+        self._set_preamble_length_index(int(index))
+
     def _set_power_amplifier_setting_index(self, setting_index: int) -> None:
         """
         FREND0.PA_POWER

+ 1 - 0
examples/transmit_variable_length.py

@@ -11,6 +11,7 @@ with cc1101.CC1101() as transceiver:
     transceiver.set_base_frequency_hertz(433.5e6)
     transceiver.set_symbol_rate_baud(600)
     # transceiver.set_sync_mode(cc1101.SyncMode.NO_PREAMBLE_AND_SYNC_WORD)
+    # transceiver.set_preamble_length_bytes(2)
     # transceiver.set_sync_word(b"\x12\x34")
     # transceiver.disable_checksum()
     print(transceiver)

+ 28 - 0
tests/test_config.py

@@ -160,6 +160,34 @@ def test_get_preamble_length_bytes(transceiver, mdmcfg1, length):
     transceiver._spi.xfer.assert_called_once_with([0x13 | 0x80, 0])
 
 
+@pytest.mark.parametrize(
+    ("mdmcfg1_before", "mdmcfg1_after", "length"),
+    [
+        (0b00000010, 0b00000010, 2),
+        (0b00000010, 0b00010010, 3),
+        (0b00000010, 0b00100010, 4),
+        (0b00000010, 0b00110010, 6),
+        (0b00000010, 0b01000010, 8),
+        (0b00000010, 0b01010010, 12),
+        (0b00000010, 0b01100010, 16),
+        (0b00000010, 0b01110010, 24),
+        (0b01010010, 0b01100010, 16),
+        (0b01110010, 0b00000010, 2),
+        (0b01110010, 0b01000010, 8),
+        (0b11011010, 0b11101010, 16),
+        (0b11110111, 0b11000111, 8),
+        (0b11111110, 0b10001110, 2),
+    ],
+)
+def test_set_preamble_length_bytes(transceiver, mdmcfg1_before, mdmcfg1_after, length):
+    transceiver._spi.xfer.return_value = [15, 15]
+    with unittest.mock.patch.object(
+        transceiver, "_read_single_byte", return_value=mdmcfg1_before
+    ):
+        transceiver.set_preamble_length_bytes(length)
+    transceiver._spi.xfer.assert_called_once_with([0x13 | 0x40, mdmcfg1_after])
+
+
 def test_get_packet_length_bytes(transceiver):
     xfer_mock = transceiver._spi.xfer
     xfer_mock.return_value = [0, 8]