<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>