<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12541">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trx_toolkit/transceiver.py: add support for child transceivers<br><br>A BTS can (optionally) have more than one transceiver. In this case<br>additional (let's say child) transceivers basically share the same<br>clock source of the first transceiver, and being powered on / off<br>as soon as the first transceiver is powered on / off.<br><br>Change-Id: I7e97b7f32dde7ab74779133e9d7504f1d0fce60c<br>---<br>M src/target/trx_toolkit/transceiver.py<br>A src/target/trx_toolkit/trx_list.py<br>2 files changed, 100 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/41/12541/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/trx_toolkit/transceiver.py b/src/target/trx_toolkit/transceiver.py</span><br><span>index edd4d31..57ca531 100644</span><br><span>--- a/src/target/trx_toolkit/transceiver.py</span><br><span>+++ b/src/target/trx_toolkit/transceiver.py</span><br><span>@@ -4,7 +4,7 @@</span><br><span> # TRX Toolkit</span><br><span> # Transceiver implementation</span><br><span> #</span><br><span style="color: hsl(0, 100%, 40%);">-# (C) 2018 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2018-2019 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span> #</span><br><span> # All Rights Reserved</span><br><span> #</span><br><span>@@ -27,6 +27,7 @@</span><br><span> from ctrl_if_trx import CTRLInterfaceTRX</span><br><span> from data_if import DATAInterface</span><br><span> from udp_link import UDPLink</span><br><span style="color: hsl(120, 100%, 40%);">+from trx_list import TRXList</span><br><span> </span><br><span> class Transceiver:</span><br><span>  """ Base transceiver implementation.</span><br><span>@@ -54,6 +55,21 @@</span><br><span>     NOTE: we don't store the associated channel combinations,</span><br><span>              as they are only useful for burst detection and demodulation.</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       == Child transceivers</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       A BTS can (optionally) have more than one transceiver. In this case</span><br><span style="color: hsl(120, 100%, 40%);">+   additional (let's say child) transceivers basically share the same</span><br><span style="color: hsl(120, 100%, 40%);">+        clock source of the first transceiver, so UDP port mapping is a bit</span><br><span style="color: hsl(120, 100%, 40%);">+   different, for example:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       (trx_0) clck=5700, ctrl=5701, data=5702,</span><br><span style="color: hsl(120, 100%, 40%);">+      (trx_1)            ctrl=5703, data=5704,</span><br><span style="color: hsl(120, 100%, 40%);">+      (trx_2)            ctrl=5705, data=5706.</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%);">+       As soon as the first transceiver is powered on / off,</span><br><span style="color: hsl(120, 100%, 40%);">+ all child transceivers are also powered on / off.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  == Clock distribution (optional)</span><br><span> </span><br><span>         The clock indications are not expected by L1 when transceiver</span><br><span>@@ -75,21 +91,26 @@</span><br><span>  """</span><br><span> </span><br><span>       def __init__(self, bind_addr, remote_addr, base_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                   clck_gen = None, pwr_meas = None):</span><br><span style="color: hsl(120, 100%, 40%);">+                    child_idx = 0, clck_gen = None, pwr_meas = None):</span><br><span>            # Connection info</span><br><span>            self.remote_addr = remote_addr</span><br><span>               self.bind_addr = bind_addr</span><br><span>           self.base_port = base_port</span><br><span style="color: hsl(120, 100%, 40%);">+            self.child_idx = child_idx</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          # Child transceiver cannot have its own clock</span><br><span style="color: hsl(120, 100%, 40%);">+         if clck_gen is not None and child_idx > 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                 raise TypeError("Child transceiver cannot have its own clock")</span><br><span> </span><br><span>                 # Init DATA interface</span><br><span>                self.data_if = DATAInterface(</span><br><span style="color: hsl(0, 100%, 40%);">-                   remote_addr, base_port + 102,</span><br><span style="color: hsl(0, 100%, 40%);">-                   bind_addr, base_port + 2)</span><br><span style="color: hsl(120, 100%, 40%);">+                     remote_addr, base_port + child_idx * 2 + 102,</span><br><span style="color: hsl(120, 100%, 40%);">+                 bind_addr, base_port + child_idx * 2 + 2)</span><br><span> </span><br><span>                # Init CTRL interface</span><br><span>                self.ctrl_if = CTRLInterfaceTRX(self,</span><br><span style="color: hsl(0, 100%, 40%);">-                   remote_addr, base_port + 101,</span><br><span style="color: hsl(0, 100%, 40%);">-                   bind_addr, base_port + 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                     remote_addr, base_port + child_idx * 2 + 101,</span><br><span style="color: hsl(120, 100%, 40%);">+                 bind_addr, base_port + child_idx * 2 + 1)</span><br><span> </span><br><span>                # Init optional CLCK interface</span><br><span>               self.clck_gen = clck_gen</span><br><span>@@ -111,12 +132,22 @@</span><br><span>             # List of active (configured) timeslots</span><br><span>              self.ts_list = []</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+         # List of child transceivers</span><br><span style="color: hsl(120, 100%, 40%);">+          self.child_trx_list = TRXList()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    # To be overwritten if required,</span><br><span>     # no custom command handlers by default</span><br><span>      def ctrl_cmd_handler(self, request):</span><br><span>                 return None</span><br><span> </span><br><span>      def power_event_handler(self, event):</span><br><span style="color: hsl(120, 100%, 40%);">+         # Update child transceivers</span><br><span style="color: hsl(120, 100%, 40%);">+           for trx in self.child_trx_list.trx_list:</span><br><span style="color: hsl(120, 100%, 40%);">+                      if event == "POWERON":</span><br><span style="color: hsl(120, 100%, 40%);">+                              trx.running = True</span><br><span style="color: hsl(120, 100%, 40%);">+                    else:</span><br><span style="color: hsl(120, 100%, 40%);">+                         trx.running = False</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                # Trigger clock generator if required</span><br><span>                if self.clck_gen is not None:</span><br><span>                        clck_links = self.clck_gen.clck_links</span><br><span>diff --git a/src/target/trx_toolkit/trx_list.py b/src/target/trx_toolkit/trx_list.py</span><br><span>new file mode 100644</span><br><span>index 0000000..7bea560</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/trx_toolkit/trx_list.py</span><br><span>@@ -0,0 +1,63 @@</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%);">+# TRX Toolkit</span><br><span style="color: hsl(120, 100%, 40%);">+# Transceiver list implementation</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 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%);">+class TRXList:</span><br><span style="color: hsl(120, 100%, 40%);">+    """ Transceiver list implementation.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ This class is a simple wrapper around generic Python's list.</span><br><span style="color: hsl(120, 100%, 40%);">+      The aim is to simplify management of multiple Transceiver</span><br><span style="color: hsl(120, 100%, 40%);">+     instances, e.g. appending, removing and finding them.</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):</span><br><span style="color: hsl(120, 100%, 40%);">+           self.trx_list = []</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  def __getitem__(self, i):</span><br><span style="color: hsl(120, 100%, 40%);">+             return self.trx_list[i]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     def find_trx(self, remote_addr, base_port, child_idx = 0):</span><br><span style="color: hsl(120, 100%, 40%);">+            for trx in self.trx_list:</span><br><span style="color: hsl(120, 100%, 40%);">+                     if trx.remote_addr != remote_addr:</span><br><span style="color: hsl(120, 100%, 40%);">+                            continue</span><br><span style="color: hsl(120, 100%, 40%);">+                      if trx.base_port != base_port:</span><br><span style="color: hsl(120, 100%, 40%);">+                                continue</span><br><span style="color: hsl(120, 100%, 40%);">+                      if trx.child_idx != child_idx:</span><br><span style="color: hsl(120, 100%, 40%);">+                                continue</span><br><span style="color: hsl(120, 100%, 40%);">+                      return trx</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ def add_trx(self, trx):</span><br><span style="color: hsl(120, 100%, 40%);">+               if trx in self.trx_list:</span><br><span style="color: hsl(120, 100%, 40%);">+                      raise IndexError("TRX '%s' is already in the list" % trx)</span><br><span style="color: hsl(120, 100%, 40%);">+           if self.find_trx(trx.remote_addr, trx.base_port, trx.child_idx):</span><br><span style="color: hsl(120, 100%, 40%);">+                      raise IndexError("TRX '%s' has duplicate in the list" % trx)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              self.trx_list.append(trx)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   def del_trx(self, trx):</span><br><span style="color: hsl(120, 100%, 40%);">+               if trx not in self.trx_list:</span><br><span style="color: hsl(120, 100%, 40%);">+                  raise IndexError("TRX '%s' is not in the list" % trx)</span><br><span style="color: hsl(120, 100%, 40%);">+               self.trx_list.remove(trx)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12541">change 12541</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/12541"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I7e97b7f32dde7ab74779133e9d7504f1d0fce60c </div>
<div style="display:none"> Gerrit-Change-Number: 12541 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>