options: parameters: author: '' category: '[GRC Hier Blocks]' cmake_opt: '' comment: '' copyright: '' description: '' gen_cmake: 'On' gen_linking: dynamic generate_options: qt_gui hier_block_src_path: '.:' id: transmit max_nouts: '0' output_language: python placement: (0,0) qt_qss_theme: '' realtime_scheduling: '' run: 'True' run_command: '{python} -u {filename}' run_options: prompt sizing_mode: fixed thread_safe_setters: '' title: Arduino Serial Transmitter window_size: '' states: bus_sink: false bus_source: false bus_structure: null coordinate: [70, 37] rotation: 0 state: enabled blocks: - name: sample_rate_hz id: variable parameters: comment: '' value: '1000' states: bus_sink: false bus_source: false bus_structure: null coordinate: [668, 314] rotation: 0 state: enabled - name: analog_sig_source_x_0 id: analog_sig_source_x parameters: affinity: '' alias: '' amp: '1' comment: '' freq: '200' maxoutbuf: '0' minoutbuf: '0' offset: '0' phase: '0' samp_rate: sample_rate_hz type: byte waveform: analog.GR_SQR_WAVE states: bus_sink: false bus_source: false bus_structure: null coordinate: [70, 187] rotation: 0 state: true - name: blocks_char_to_float_0 id: blocks_char_to_float parameters: affinity: '' alias: '' comment: '' maxoutbuf: '0' minoutbuf: '0' scale: '1' vlen: '1' states: bus_sink: false bus_source: false bus_structure: null coordinate: [627, 176] rotation: 0 state: enabled - name: serial_sink_block id: epy_block parameters: _source_code: "import ctypes\nimport ctypes.util\nimport time\n\nimport gnuradio.gr\n\ import numpy\nimport serial\n\n_LIBC_NAME = ctypes.util.find_library(\"c\")\n\ if not _LIBC_NAME:\n raise Exception(\"couldn't find libc\")\n_LIBC = ctypes.CDLL(_LIBC_NAME)\n\ \n\nclass _Timespec(ctypes.Structure):\n # pylint: disable=too-few-public-methods\n\ \ \"\"\"\n > struct timespec {\n > time_t tv_sec; /* seconds\ \ */\n > long tv_nsec; /* nanoseconds */\n > };\n\n > The\ \ value of the nanoseconds field must be in the range 0 to 999999999.\n \"\ \"\"\n _fields_ = [(\"tv_sec\", ctypes.c_uint32), (\"tv_nsec\", ctypes.c_long)]\n\ \n\n_NANOSLEEP = _LIBC.nanosleep\n_NANOSLEEP.argtypes = [ctypes.POINTER(_Timespec),\ \ ctypes.POINTER(_Timespec)]\n_NANOSLEEP.restype = ctypes.c_int\n\n\nclass SerialSinkBlock(gnuradio.gr.basic_block):\n\ \ _SLEEP_THRESHOLD_NS = 10000\n\n def __init__(self, port=\"/dev/ttyUSB0\"\ , baud_rate=115200, sample_rate_hz=1000):\n gnuradio.gr.basic_block.__init__(\n\ \ self, name=\"Serial Sink Block\", in_sig=[numpy.uint8], out_sig=None\n\ \ )\n self._serial_port = serial.Serial(\n port=port,\ \ baudrate=baud_rate, bytesize=serial.EIGHTBITS\n )\n self._tick_interval_ns\ \ = int(1e9 / sample_rate_hz)\n # periodically return from .general_work()\ \ to handle signals\n self._work_max_samples = max(int(sample_rate_hz\ \ * 2), 1)\n self._next_tick_time_ns = None\n self._libc = ctypes.CDLL(ctypes.util.find_library(\"\ c\"))\n\n def general_work(self, input_items, output_items) -> int:\n \ \ # pylint: disable=unused-argument\n if not self._next_tick_time_ns:\n\ \ self._next_tick_time_ns = time.perf_counter_ns()\n for byte\ \ in input_items[0][: self._work_max_samples]:\n while (\n \ \ self._next_tick_time_ns - time.perf_counter_ns()\n ) >\ \ self._SLEEP_THRESHOLD_NS:\n _NANOSLEEP(\n \ \ _Timespec(\n 0,\n # negative\ \ values make nanosleep return -1\n min(\n \ \ self._next_tick_time_ns\n - time.perf_counter_ns()\n\ \ - self._SLEEP_THRESHOLD_NS,\n \ \ 999999999,\n ),\n ),\n\ \ None,\n )\n while (self._next_tick_time_ns\ \ - time.perf_counter_ns()) > 0:\n pass\n self._serial_port.write(b\"\ \\x01\" if byte else b\"\\0\")\n self._next_tick_time_ns += self._tick_interval_ns\n\ \ self.consume(0, min(len(input_items[0]), self._work_max_samples))\n\ \ return 0\n" affinity: '' alias: '' baud_rate: '115200' comment: '' maxoutbuf: '0' minoutbuf: '0' port: '"/dev/ttyUSB0"' sample_rate_hz: sample_rate_hz states: _io_cache: ('Serial Sink Block', 'SerialSinkBlock', [('port', "'/dev/ttyUSB0'"), ('baud_rate', '115200'), ('sample_rate_hz', '1000')], [('0', 'byte', 1)], [], '', []) bus_sink: false bus_source: false bus_structure: null coordinate: [625, 417] rotation: 0 state: true - name: qtgui_time_sink_x_0 id: qtgui_time_sink_x parameters: affinity: '' alias: '' alpha1: '1.0' alpha10: '1.0' alpha2: '1.0' alpha3: '1.0' alpha4: '1.0' alpha5: '1.0' alpha6: '1.0' alpha7: '1.0' alpha8: '1.0' alpha9: '1.0' autoscale: 'False' axislabels: 'True' color1: blue color10: dark blue color2: red color3: green color4: black color5: cyan color6: magenta color7: yellow color8: dark red color9: dark green comment: '' ctrlpanel: 'False' entags: 'True' grid: 'False' gui_hint: '' label1: Signal 1 label10: Signal 10 label2: Signal 2 label3: Signal 3 label4: Signal 4 label5: Signal 5 label6: Signal 6 label7: Signal 7 label8: Signal 8 label9: Signal 9 legend: 'False' marker1: '-1' marker10: '-1' marker2: '-1' marker3: '-1' marker4: '-1' marker5: '-1' marker6: '-1' marker7: '-1' marker8: '-1' marker9: '-1' name: '""' nconnections: '1' size: int(sample_rate_hz*1) srate: sample_rate_hz stemplot: 'False' style1: '1' style10: '1' style2: '1' style3: '1' style4: '1' style5: '1' style6: '1' style7: '1' style8: '1' style9: '1' tr_chan: '0' tr_delay: '0' tr_level: '0.0' tr_mode: qtgui.TRIG_MODE_FREE tr_slope: qtgui.TRIG_SLOPE_POS tr_tag: '""' type: float update_time: '0.10' width1: '1' width10: '1' width2: '1' width3: '1' width4: '1' width5: '1' width6: '1' width7: '1' width8: '1' width9: '1' ylabel: Signal ymax: '1' ymin: '0' yunit: '""' states: bus_sink: false bus_source: false bus_structure: null coordinate: [883, 144] rotation: 0 state: enabled connections: - [analog_sig_source_x_0, '0', blocks_char_to_float_0, '0'] - [analog_sig_source_x_0, '0', serial_sink_block, '0'] - [blocks_char_to_float_0, '0', qtgui_time_sink_x_0, '0'] metadata: file_format: 1