Bladeren bron

setCarrierFrequency: accept arbitrary frequencies (previously limited to 433MHz and 868MHz)

Fabian Peter Hammerle 3 jaren geleden
bovenliggende
commit
a529d84499
2 gewijzigde bestanden met toevoegingen van 28 en 11 verwijderingen
  1. 8 11
      pycc1101/pycc1101.py
  2. 20 0
      test_pycc1101.py

+ 8 - 11
pycc1101/pycc1101.py

@@ -183,18 +183,15 @@ class TICC1101(object):
         self.sidle()
         self._strobe(self.SPWD)
 
+    @staticmethod
+    def _computeFrequencyControlWords(freq_mhz: float) -> tuple:
+        return tuple(int(freq_mhz * 2520.6155).to_bytes(length=3, byteorder="big"))
+
     def setCarrierFrequency(self, freq=433):
-        # Register values extracted from SmartRF Studio 7
-        if freq == 433:
-            self._writeSingleByte(self.FREQ2, 0x10)
-            self._writeSingleByte(self.FREQ1, 0xA7)
-            self._writeSingleByte(self.FREQ0, 0x62)
-        elif freq == 868:
-            self._writeSingleByte(self.FREQ2, 0x21)
-            self._writeSingleByte(self.FREQ1, 0x62)
-            self._writeSingleByte(self.FREQ0, 0x76)
-        else:
-            raise Exception("Only 433MHz and 868MHz are currently supported")
+        freq2, freq1, freq0 = self._computeFrequencyControlWords(freq)
+        self._writeSingleByte(self.FREQ2, freq2)
+        self._writeSingleByte(self.FREQ1, freq1)
+        self._writeSingleByte(self.FREQ0, freq0)
 
     def setChannel(self, channel=0x00):
         self._writeSingleByte(self.CHANNR, channel)

+ 20 - 0
test_pycc1101.py

@@ -0,0 +1,20 @@
+"""
+run tests via pytest / pytest-3 command
+"""
+
+import pytest
+
+from pycc1101.pycc1101 import TICC1101
+
+
+@pytest.mark.parametrize(
+    ("freq_mhz", "control_words"),
+    [
+        (433, (0x10, 0xA7, 0x62)),
+        (433.42, (0x10, 0xAB, 0x85)),
+        (434, (0x10, 0xB1, 0x3B)),
+        (868, (0x21, 0x62, 0x76)),
+    ],
+)
+def test_compute_frequency_control_words(freq_mhz, control_words):
+    assert TICC1101._computeFrequencyControlWords(freq_mhz) == control_words