<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12635">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">python/trx: introduce and use Transceiver class<br><br>Change-Id: I6dc88edbb69a68746cc8e01206dc86f7ea2fa80f<br>---<br>M apps/grgsm_trx<br>M python/trx/CMakeLists.txt<br>M python/trx/__init__.py<br>M python/trx/ctrl_if_bb.py<br>M python/trx/radio_if.py<br>A python/trx/transceiver.py<br>6 files changed, 142 insertions(+), 54 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/gr-gsm refs/changes/35/12635/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/apps/grgsm_trx b/apps/grgsm_trx</span><br><span>index c3e83d9..5e5e3be 100755</span><br><span>--- a/apps/grgsm_trx</span><br><span>+++ b/apps/grgsm_trx</span><br><span>@@ -29,8 +29,8 @@</span><br><span> from argparse import ArgumentTypeError</span><br><span> from gnuradio import eng_notation</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-from grgsm.trx import CTRLInterfaceBB</span><br><span> from grgsm.trx import RadioInterface</span><br><span style="color: hsl(120, 100%, 40%);">+from grgsm.trx import Transceiver</span><br><span> </span><br><span> COPYRIGHT = \</span><br><span> "Copyright (C) 2016-2018 by Vadim Yanitskiy <axilirator@gmail.com>\n" \</span><br><span>@@ -64,18 +64,17 @@</span><br><span> self.phy_freq_offset, self.bind_addr,</span><br><span> self.remote_addr, self.base_port)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- # Init TRX CTRL interface</span><br><span style="color: hsl(0, 100%, 40%);">- self.server = CTRLInterfaceBB(</span><br><span style="color: hsl(0, 100%, 40%);">- self.remote_addr, self.base_port + 101,</span><br><span style="color: hsl(0, 100%, 40%);">- self.bind_addr, self.base_port + 1,</span><br><span style="color: hsl(0, 100%, 40%);">- self.radio)</span><br><span style="color: hsl(120, 100%, 40%);">+ # Init Transceiver</span><br><span style="color: hsl(120, 100%, 40%);">+ self.trx = Transceiver(self.bind_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+ self.remote_addr, self.base_port,</span><br><span style="color: hsl(120, 100%, 40%);">+ radio_if = self.radio)</span><br><span> </span><br><span> print("[i] Init complete")</span><br><span> </span><br><span> def run(self):</span><br><span> # Enter main loop</span><br><span> while True:</span><br><span style="color: hsl(0, 100%, 40%);">- self.server.loop()</span><br><span style="color: hsl(120, 100%, 40%);">+ self.trx.ctrl_if.loop()</span><br><span> </span><br><span> def shutdown(self):</span><br><span> print("[i] Shutting down...")</span><br><span>diff --git a/python/trx/CMakeLists.txt b/python/trx/CMakeLists.txt</span><br><span>index 4333407..11290f3 100644</span><br><span>--- a/python/trx/CMakeLists.txt</span><br><span>+++ b/python/trx/CMakeLists.txt</span><br><span>@@ -25,6 +25,7 @@</span><br><span> ctrl_if_bb.py</span><br><span> radio_if.py</span><br><span> radio_if_grc.py</span><br><span style="color: hsl(120, 100%, 40%);">+ transceiver.py</span><br><span> dict_toggle_sign.py</span><br><span> DESTINATION ${GR_PYTHON_DIR}/grgsm/trx</span><br><span> )</span><br><span>diff --git a/python/trx/__init__.py b/python/trx/__init__.py</span><br><span>index 7b20699..00d370b 100644</span><br><span>--- a/python/trx/__init__.py</span><br><span>+++ b/python/trx/__init__.py</span><br><span>@@ -25,5 +25,6 @@</span><br><span> from ctrl_if_bb import CTRLInterfaceBB</span><br><span> from radio_if_grc import RadioInterfaceGRC</span><br><span> from radio_if import RadioInterface</span><br><span style="color: hsl(120, 100%, 40%);">+from transceiver import Transceiver</span><br><span> </span><br><span> from dict_toggle_sign import dict_toggle_sign</span><br><span>diff --git a/python/trx/ctrl_if_bb.py b/python/trx/ctrl_if_bb.py</span><br><span>index 0e194d0..4814263 100644</span><br><span>--- a/python/trx/ctrl_if_bb.py</span><br><span>+++ b/python/trx/ctrl_if_bb.py</span><br><span>@@ -4,7 +4,7 @@</span><br><span> # GR-GSM based transceiver</span><br><span> # CTRL interface for OsmocomBB</span><br><span> #</span><br><span style="color: hsl(0, 100%, 40%);">-# (C) 2016-2017 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2016-2019 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span> #</span><br><span> # All Rights Reserved</span><br><span> #</span><br><span>@@ -22,49 +22,32 @@</span><br><span> # with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span> # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-import grgsm</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> from ctrl_if import CTRLInterface</span><br><span> </span><br><span> class CTRLInterfaceBB(CTRLInterface):</span><br><span style="color: hsl(0, 100%, 40%);">- def __init__(self, remote_addr, remote_port, bind_addr, bind_port, tb):</span><br><span style="color: hsl(0, 100%, 40%);">- CTRLInterface.__init__(self, remote_addr, remote_port,</span><br><span style="color: hsl(0, 100%, 40%);">- bind_addr, bind_port)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+ def __init__(self, trx, *ctrl_if_args):</span><br><span style="color: hsl(120, 100%, 40%);">+ CTRLInterface.__init__(self, *ctrl_if_args)</span><br><span> print("[i] Init CTRL interface (%s)" % self.desc_link())</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- # Set link to the follow graph (top block)</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb = tb</span><br><span style="color: hsl(120, 100%, 40%);">+ # Transceiver instance we belong to</span><br><span style="color: hsl(120, 100%, 40%);">+ self.trx = trx</span><br><span> </span><br><span> def parse_cmd(self, request):</span><br><span> # Power control</span><br><span> if self.verify_cmd(request, "POWERON", 0):</span><br><span> print("[i] Recv POWERON CMD")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- # Ensure transceiver isn't working</span><br><span style="color: hsl(0, 100%, 40%);">- if self.tb.trx_started:</span><br><span style="color: hsl(0, 100%, 40%);">- print("[!] Transceiver already started")</span><br><span style="color: hsl(120, 100%, 40%);">+ # Start transceiver</span><br><span style="color: hsl(120, 100%, 40%);">+ if not self.trx.start():</span><br><span> return -1</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- print("[i] Starting transceiver...")</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.trx_started = True</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.start()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> return 0</span><br><span> </span><br><span> elif self.verify_cmd(request, "POWEROFF", 0):</span><br><span> print("[i] Recv POWEROFF cmd")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- # TODO: flush all buffers between blocks</span><br><span style="color: hsl(0, 100%, 40%);">- if self.tb.trx_started:</span><br><span style="color: hsl(0, 100%, 40%);">- print("[i] Stopping transceiver...")</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.trx_started = False</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.set_ta(0)</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.stop()</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.wait()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- # POWEROFF is also used to reset transceiver</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.reset()</span><br><span style="color: hsl(120, 100%, 40%);">+ # Stop transceiver</span><br><span style="color: hsl(120, 100%, 40%);">+ self.trx.stop()</span><br><span> </span><br><span> return 0</span><br><span> </span><br><span>@@ -74,7 +57,7 @@</span><br><span> </span><br><span> # TODO: check gain value</span><br><span> gain = int(request[1])</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.set_rx_gain(gain)</span><br><span style="color: hsl(120, 100%, 40%);">+ self.trx.radio_if.set_rx_gain(gain)</span><br><span> </span><br><span> return 0</span><br><span> </span><br><span>@@ -83,7 +66,7 @@</span><br><span> </span><br><span> # TODO: check gain value</span><br><span> gain = int(request[1])</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.set_tx_gain(gain)</span><br><span style="color: hsl(120, 100%, 40%);">+ self.trx.radio_if.set_tx_gain(gain)</span><br><span> </span><br><span> return 0</span><br><span> </span><br><span>@@ -93,7 +76,7 @@</span><br><span> </span><br><span> # TODO: check freq range</span><br><span> freq = int(request[1]) * 1000</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.set_rx_freq(freq)</span><br><span style="color: hsl(120, 100%, 40%);">+ self.trx.radio_if.set_rx_freq(freq)</span><br><span> </span><br><span> return 0</span><br><span> </span><br><span>@@ -102,7 +85,7 @@</span><br><span> </span><br><span> # TODO: check freq range</span><br><span> freq = int(request[1]) * 1000</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.set_tx_freq(freq)</span><br><span style="color: hsl(120, 100%, 40%);">+ self.trx.radio_if.set_tx_freq(freq)</span><br><span> </span><br><span> return 0</span><br><span> </span><br><span>@@ -116,19 +99,12 @@</span><br><span> print("[!] TS index should be in range: 0..7")</span><br><span> return -1</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- # Ignore timeslot type for now</span><br><span style="color: hsl(120, 100%, 40%);">+ # Channel combination number (see GSM TS 05.02)</span><br><span style="color: hsl(120, 100%, 40%);">+ # TODO: check this value</span><br><span> config = int(request[2])</span><br><span style="color: hsl(0, 100%, 40%);">- print("[i] Configure timeslot filter to: %s"</span><br><span style="color: hsl(0, 100%, 40%);">- % ("drop all" if config == 0 else "TS %d" % tn))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if config == 0:</span><br><span style="color: hsl(0, 100%, 40%);">- # Value 0 means 'drop all'</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.ts_filter.set_policy(</span><br><span style="color: hsl(0, 100%, 40%);">- grgsm.FILTER_POLICY_DROP_ALL)</span><br><span style="color: hsl(0, 100%, 40%);">- else:</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.ts_filter.set_policy(</span><br><span style="color: hsl(0, 100%, 40%);">- grgsm.FILTER_POLICY_DEFAULT)</span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.ts_filter.set_tn(tn)</span><br><span style="color: hsl(120, 100%, 40%);">+ # TODO: check return value</span><br><span style="color: hsl(120, 100%, 40%);">+ self.trx.radio_if.set_slot(tn, config)</span><br><span> </span><br><span> return 0</span><br><span> </span><br><span>@@ -138,9 +114,11 @@</span><br><span> </span><br><span> # TODO: check freq range</span><br><span> meas_freq = int(request[1]) * 1000</span><br><span style="color: hsl(0, 100%, 40%);">- meas_dbm = str(self.tb.measure(meas_freq))</span><br><span style="color: hsl(120, 100%, 40%);">+ meas_dbm = self.trx.measure(meas_freq)</span><br><span style="color: hsl(120, 100%, 40%);">+ if meas_dbm is None:</span><br><span style="color: hsl(120, 100%, 40%);">+ return -1</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return (0, [meas_dbm])</span><br><span style="color: hsl(120, 100%, 40%);">+ return (0, [str(meas_dbm)])</span><br><span> </span><br><span> # Timing Advance control</span><br><span> elif self.verify_cmd(request, "SETTA", 1):</span><br><span>@@ -152,7 +130,7 @@</span><br><span> print("[!] TA value must be in range: 0..63")</span><br><span> return -1</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- self.tb.set_ta(ta)</span><br><span style="color: hsl(120, 100%, 40%);">+ self.trx.radio_if.set_ta(ta)</span><br><span> return 0</span><br><span> </span><br><span> # Misc</span><br><span>diff --git a/python/trx/radio_if.py b/python/trx/radio_if.py</span><br><span>index ed5a8de..ec9cd5f 100644</span><br><span>--- a/python/trx/radio_if.py</span><br><span>+++ b/python/trx/radio_if.py</span><br><span>@@ -47,9 +47,6 @@</span><br><span> tx_freq = None</span><br><span> osr = 4</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- # Application state flags</span><br><span style="color: hsl(0, 100%, 40%);">- trx_started = False</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> # GSM timings (in microseconds [uS])</span><br><span> # One timeslot duration is 576.9 μs = 15/26 ms,</span><br><span> # or 156.25 symbol periods (a symbol period is 48/13 μs)</span><br><span>@@ -304,6 +301,20 @@</span><br><span> self.phy_sink.set_gain(gain, 0)</span><br><span> self.tx_gain = gain</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ def set_slot(self, slot, config):</span><br><span style="color: hsl(120, 100%, 40%);">+ print("[i] Configure timeslot filter to: %s"</span><br><span style="color: hsl(120, 100%, 40%);">+ % ("drop all" if config == 0 else "tn=%d" % slot))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if config == 0:</span><br><span style="color: hsl(120, 100%, 40%);">+ # Value 0 is used for deactivation</span><br><span style="color: hsl(120, 100%, 40%);">+ self.ts_filter.set_policy(grgsm.FILTER_POLICY_DROP_ALL)</span><br><span style="color: hsl(120, 100%, 40%);">+ else:</span><br><span style="color: hsl(120, 100%, 40%);">+ # FIXME: ideally, we should (re)configure the Receiver</span><br><span style="color: hsl(120, 100%, 40%);">+ # block, but there is no API for that, and hard-coded</span><br><span style="color: hsl(120, 100%, 40%);">+ # timeslot configuration is used...</span><br><span style="color: hsl(120, 100%, 40%);">+ self.ts_filter.set_policy(grgsm.FILTER_POLICY_DEFAULT)</span><br><span style="color: hsl(120, 100%, 40%);">+ self.ts_filter.set_tn(slot)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> def set_ta(self, ta):</span><br><span> print("[i] Setting TA value %d" % ta)</span><br><span> advance_time_sec = ta * self.GSM_SYM_PERIOD_uS * 1e-6</span><br><span>diff --git a/python/trx/transceiver.py b/python/trx/transceiver.py</span><br><span>new file mode 100644</span><br><span>index 0000000..837a61f</span><br><span>--- /dev/null</span><br><span>+++ b/python/trx/transceiver.py</span><br><span>@@ -0,0 +1,98 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python2</span><br><span style="color: hsl(120, 100%, 40%);">+# -*- coding: utf-8 -*-</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# GR-GSM based transceiver</span><br><span style="color: hsl(120, 100%, 40%);">+# Transceiver implementation</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2018-2019 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+# the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+# (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+# with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from ctrl_if_bb import CTRLInterfaceBB</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class Transceiver:</span><br><span style="color: hsl(120, 100%, 40%);">+ """ Base transceiver implementation.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Represents a single transceiver, that can be used as for the BTS side,</span><br><span style="color: hsl(120, 100%, 40%);">+ as for the MS side. Each individual instance of Transceiver unifies</span><br><span style="color: hsl(120, 100%, 40%);">+ three basic interfaces built on three independent UDP connections:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ - CLCK (base port + 100/0) - clock indications from TRX to L1,</span><br><span style="color: hsl(120, 100%, 40%);">+ - CTRL (base port + 101/1) - control interface for L1,</span><br><span style="color: hsl(120, 100%, 40%);">+ - DATA (base port + 102/2) - bidirectional data interface for bursts.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ A transceiver can be either in active (i.e. working), or in idle mode.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ NOTE: both CLCK and DATA interfaces are handled by the flow-graph,</span><br><span style="color: hsl(120, 100%, 40%);">+ (see RadioInterface), so we only initialize CTRL interface.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ """</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ def __init__(self, bind_addr, remote_addr, base_port, radio_if):</span><br><span style="color: hsl(120, 100%, 40%);">+ # Connection info</span><br><span style="color: hsl(120, 100%, 40%);">+ self.remote_addr = remote_addr</span><br><span style="color: hsl(120, 100%, 40%);">+ self.bind_addr = bind_addr</span><br><span style="color: hsl(120, 100%, 40%);">+ self.base_port = base_port</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ # Execution state (running or idle)</span><br><span style="color: hsl(120, 100%, 40%);">+ self.running = False</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ # Radio interface (handles both CLCK and DATA interfaces)</span><br><span style="color: hsl(120, 100%, 40%);">+ self.radio_if = radio_if</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ # Init CTRL interface</span><br><span style="color: hsl(120, 100%, 40%);">+ self.ctrl_if = CTRLInterfaceBB(self,</span><br><span style="color: hsl(120, 100%, 40%);">+ remote_addr, base_port + 101,</span><br><span style="color: hsl(120, 100%, 40%);">+ bind_addr, base_port + 1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ def start(self):</span><br><span style="color: hsl(120, 100%, 40%);">+ # Check execution state</span><br><span style="color: hsl(120, 100%, 40%);">+ if self.running:</span><br><span style="color: hsl(120, 100%, 40%);">+ print("[!] Transceiver is already started")</span><br><span style="color: hsl(120, 100%, 40%);">+ return False</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ # Make sure that Radio interface is ready, i.e.</span><br><span style="color: hsl(120, 100%, 40%);">+ # all parameters (e.g. RX / RX freq) are set.</span><br><span style="color: hsl(120, 100%, 40%);">+ if not self.radio_if.ready:</span><br><span style="color: hsl(120, 100%, 40%);">+ print("[!] RadioInterface is not ready")</span><br><span style="color: hsl(120, 100%, 40%);">+ return False</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ print("[i] Starting transceiver...")</span><br><span style="color: hsl(120, 100%, 40%);">+ self.radio_if.start()</span><br><span style="color: hsl(120, 100%, 40%);">+ self.running = True</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return True</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ def stop(self):</span><br><span style="color: hsl(120, 100%, 40%);">+ # POWEROFF is also used to reset transceiver,</span><br><span style="color: hsl(120, 100%, 40%);">+ # so we should not complain that it isn't running.</span><br><span style="color: hsl(120, 100%, 40%);">+ if not self.running:</span><br><span style="color: hsl(120, 100%, 40%);">+ print("[i] Resetting transceiver")</span><br><span style="color: hsl(120, 100%, 40%);">+ self.radio_if.reset()</span><br><span style="color: hsl(120, 100%, 40%);">+ return</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ print("[i] Stopping transceiver...")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ # TODO: flush all buffers between blocks</span><br><span style="color: hsl(120, 100%, 40%);">+ self.radio_if.stop()</span><br><span style="color: hsl(120, 100%, 40%);">+ self.radio_if.wait()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ self.running = False</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ def measure(self, freq):</span><br><span style="color: hsl(120, 100%, 40%);">+ # TODO: transceiver should be in idle mode</span><br><span style="color: hsl(120, 100%, 40%);">+ return self.radio_if.measure(freq)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12635">change 12635</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12635"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: gr-gsm </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I6dc88edbb69a68746cc8e01206dc86f7ea2fa80f </div>
<div style="display:none"> Gerrit-Change-Number: 12635 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>