Browse Source

flowchart source block: added option to invert bit sequence

Fabian Peter Hammerle 3 years ago
parent
commit
611965af6b
2 changed files with 27 additions and 14 deletions
  1. 17 13
      scope.grc
  2. 10 1
      serial_source_block.py

+ 17 - 13
scope.grc

@@ -192,30 +192,34 @@ blocks:
   id: epy_block
   parameters:
     _source_code: "import gnuradio\nimport numpy\nimport serial\n\n\nclass SerialSourceBlock(gnuradio.gr.sync_block):\n\
-      \    def __init__(\n        self, port=\"/dev/ttyUSB0\", baud_rate=115200, buffer_max_length=10,\
-      \ timeout=2\n    ):\n        gnuradio.gr.sync_block.__init__(\n            self,\
-      \ name=\"Serial Source Block\", in_sig=None, out_sig=[numpy.uint8]\n       \
-      \ )\n        self._serial_port = serial.Serial(\n            port=port, baudrate=baud_rate,\
-      \ bytesize=serial.EIGHTBITS, timeout=timeout\n        )\n        self._buffer_max_length\
-      \ = buffer_max_length\n\n    def work(self, input_items, output_items):\n  \
-      \      # pylint: disable=unused-argument\n        buffer = self._serial_port.read(\n\
-      \            min(len(output_items[0]), self._buffer_max_length)\n        )\n\
-      \        output_items[0][: len(buffer)] = numpy.frombuffer(buffer, dtype=\"\
-      u1\")\n        assert output_items[0][: len(buffer)].max() <= 1, \"invalid value\"\
-      \n        return len(buffer)\n"
+      \    def __init__(\n        self,\n        port=\"/dev/ttyUSB0\",\n        baud_rate=115200,\n\
+      \        buffer_max_length=10,\n        timeout=2,\n        invert=False,\n\
+      \    ):\n        # pylint: disable=too-many-arguments\n        gnuradio.gr.sync_block.__init__(\n\
+      \            self, name=\"Serial Source Block\", in_sig=None, out_sig=[numpy.uint8]\n\
+      \        )\n        self._serial_port = serial.Serial(\n            port=port,\
+      \ baudrate=baud_rate, bytesize=serial.EIGHTBITS, timeout=timeout\n        )\n\
+      \        self._buffer_max_length = buffer_max_length\n        self._invert =\
+      \ invert\n\n    def work(self, input_items, output_items):\n        # pylint:\
+      \ disable=unused-argument\n        buffer = self._serial_port.read(\n      \
+      \      min(len(output_items[0]), self._buffer_max_length)\n        )\n     \
+      \   output_items[0][: len(buffer)] = numpy.frombuffer(buffer, dtype=\"u1\")\n\
+      \        if self._invert:\n            output_items[0] ^= 1\n        assert\
+      \ output_items[0][: len(buffer)].max() <= 1, \"invalid value\"\n        return\
+      \ len(buffer)\n"
     affinity: ''
     alias: ''
     baud_rate: '115200'
     buffer_max_length: int(sample_rate_hz/4)
     comment: ''
+    invert: 'False'
     maxoutbuf: '0'
     minoutbuf: '0'
     port: '''/dev/ttyUSB0'''
     timeout: '2'
   states:
     _io_cache: ('Serial Source Block', 'SerialSourceBlock', [('port', "'/dev/ttyUSB0'"),
-      ('baud_rate', '115200'), ('buffer_max_length', '10'), ('timeout', '2')], [],
-      [('0', 'byte', 1)], '', [])
+      ('baud_rate', '115200'), ('buffer_max_length', '10'), ('timeout', '2'), ('invert',
+      'False')], [], [('0', 'byte', 1)], '', [])
     bus_sink: false
     bus_source: false
     bus_structure: null

+ 10 - 1
serial_source_block.py

@@ -5,8 +5,14 @@ import serial
 
 class SerialSourceBlock(gnuradio.gr.sync_block):
     def __init__(
-        self, port="/dev/ttyUSB0", baud_rate=115200, buffer_max_length=10, timeout=2
+        self,
+        port="/dev/ttyUSB0",
+        baud_rate=115200,
+        buffer_max_length=10,
+        timeout=2,
+        invert=False,
     ):
+        # pylint: disable=too-many-arguments
         gnuradio.gr.sync_block.__init__(
             self, name="Serial Source Block", in_sig=None, out_sig=[numpy.uint8]
         )
@@ -14,6 +20,7 @@ class SerialSourceBlock(gnuradio.gr.sync_block):
             port=port, baudrate=baud_rate, bytesize=serial.EIGHTBITS, timeout=timeout
         )
         self._buffer_max_length = buffer_max_length
+        self._invert = invert
 
     def work(self, input_items, output_items):
         # pylint: disable=unused-argument
@@ -21,5 +28,7 @@ class SerialSourceBlock(gnuradio.gr.sync_block):
             min(len(output_items[0]), self._buffer_max_length)
         )
         output_items[0][: len(buffer)] = numpy.frombuffer(buffer, dtype="u1")
+        if self._invert:
+            output_items[0] ^= 1
         assert output_items[0][: len(buffer)].max() <= 1, "invalid value"
         return len(buffer)