<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/23137">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trx_toolkit: define TRXDv0/v1 PDUs using declarative codec<br><br>Change-Id: I739ae5da22c603fb2cf1e84d3a79fb1a6e7343b6<br>Related: OS#4006, SYS#4895<br>---<br>A src/target/trx_toolkit/trxd_proto.py<br>1 file changed, 120 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/trx_toolkit/trxd_proto.py b/src/target/trx_toolkit/trxd_proto.py</span><br><span>new file mode 100644</span><br><span>index 0000000..aef3351</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/trx_toolkit/trxd_proto.py</span><br><span>@@ -0,0 +1,120 @@</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%);">+'''</span><br><span style="color: hsl(120, 100%, 40%);">+TRXD PDU definitions based on declarative codec.</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%);">+# TRX Toolkit</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+# Author: Vadim Yanitskiy <vyanitskiy@sysmocom.de></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%);">+import codec</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class Header(codec.BitFieldSet):</span><br><span style="color: hsl(120, 100%, 40%);">+       ''' Header constructor for TRXD PDUs. '''</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   def __init__(self, ver: int):</span><br><span style="color: hsl(120, 100%, 40%);">+         codec.BitFieldSet.__init__(self, len=1, set=(</span><br><span style="color: hsl(120, 100%, 40%);">+                 codec.BitField('ver', bl=4, val=ver),</span><br><span style="color: hsl(120, 100%, 40%);">+                 codec.BitField.Pad(bl=1), # RFU</span><br><span style="color: hsl(120, 100%, 40%);">+                       codec.BitField('tn', bl=3),</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%);">+class MTS(codec.BitFieldSet):</span><br><span style="color: hsl(120, 100%, 40%);">+   ''' Modulation and Training Sequence. '''</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   DEF_LEN = 1</span><br><span style="color: hsl(120, 100%, 40%);">+   STRUCT = (</span><br><span style="color: hsl(120, 100%, 40%);">+            codec.BitField('nope', bl=1),</span><br><span style="color: hsl(120, 100%, 40%);">+         codec.BitField('mod', bl=4),</span><br><span style="color: hsl(120, 100%, 40%);">+          codec.BitField('tsc', bl=3),</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%);">+   @staticmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ def get_burst_len(mod: int) -> int:</span><br><span style="color: hsl(120, 100%, 40%);">+                ''' Get burst length by modulation type. '''</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                GMSK_BURST_LEN = 148</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                if (mod >> 2) in (0b00, 0b11): # GMSK or AQPSK</span><br><span style="color: hsl(120, 100%, 40%);">+                  return 1 * GMSK_BURST_LEN</span><br><span style="color: hsl(120, 100%, 40%);">+             elif (mod >> 1) == 0b010: # 8-PSK</span><br><span style="color: hsl(120, 100%, 40%);">+                       return 3 * GMSK_BURST_LEN</span><br><span style="color: hsl(120, 100%, 40%);">+             elif (mod >> 1) == 0b100: # 16QAM</span><br><span style="color: hsl(120, 100%, 40%);">+                       return 4 * GMSK_BURST_LEN</span><br><span style="color: hsl(120, 100%, 40%);">+             elif (mod >> 1) == 0b101: # 32QAM</span><br><span style="color: hsl(120, 100%, 40%);">+                       return 5 * GMSK_BURST_LEN</span><br><span style="color: hsl(120, 100%, 40%);">+             elif mod == 0b0110: # GMSK (Access Burst)</span><br><span style="color: hsl(120, 100%, 40%);">+                     return 1 * GMSK_BURST_LEN</span><br><span style="color: hsl(120, 100%, 40%);">+             raise ValueError('Unknown modulation type')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class BurstBits(codec.Buf):</span><br><span style="color: hsl(120, 100%, 40%);">+    ''' Soft-/hard-bits with variable length. '''</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       def __init__(self, name: str, *args, **kw):</span><br><span style="color: hsl(120, 100%, 40%);">+           codec.Buf.__init__(self, name, *args, **kw)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         # This field has a variable length that depends on moduletion type</span><br><span style="color: hsl(120, 100%, 40%);">+            self.get_len = lambda v, _: MTS.get_burst_len(v['mod'])</span><br><span style="color: hsl(120, 100%, 40%);">+               # This field is not present in NOPE / IDLE indications</span><br><span style="color: hsl(120, 100%, 40%);">+                self.get_pres = lambda v: not v['nope']</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%);">+class PDUv0Rx(codec.Envelope):</span><br><span style="color: hsl(120, 100%, 40%);">+   STRUCT = (</span><br><span style="color: hsl(120, 100%, 40%);">+            Header(ver=0),</span><br><span style="color: hsl(120, 100%, 40%);">+                codec.Uint32BE('fn'),</span><br><span style="color: hsl(120, 100%, 40%);">+         codec.Uint('rssi', mult=-1),</span><br><span style="color: hsl(120, 100%, 40%);">+          codec.Int16BE('toa256'),</span><br><span style="color: hsl(120, 100%, 40%);">+              codec.Buf('soft-bits'),</span><br><span style="color: hsl(120, 100%, 40%);">+               codec.Buf('pad'), # Optional</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, *args, **kw):</span><br><span style="color: hsl(120, 100%, 40%);">+              codec.Envelope.__init__(self, *args, **kw)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          # Field 'soft-bits' is either 148 (GMSK) or 444 (8-PSK) octets long</span><br><span style="color: hsl(120, 100%, 40%);">+           self.STRUCT[-2].get_len = lambda _, data: 444 if len(data) > 148 else 148</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class PDUv0Tx(codec.Envelope):</span><br><span style="color: hsl(120, 100%, 40%);">+        STRUCT = (</span><br><span style="color: hsl(120, 100%, 40%);">+            Header(ver=0),</span><br><span style="color: hsl(120, 100%, 40%);">+                codec.Uint32BE('fn'),</span><br><span style="color: hsl(120, 100%, 40%);">+         codec.Uint('pwr'),</span><br><span style="color: hsl(120, 100%, 40%);">+            codec.Buf('hard-bits'),</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%);">+class PDUv1Rx(codec.Envelope):</span><br><span style="color: hsl(120, 100%, 40%);">+ STRUCT = (</span><br><span style="color: hsl(120, 100%, 40%);">+            Header(ver=1),</span><br><span style="color: hsl(120, 100%, 40%);">+                codec.Uint32BE('fn'),</span><br><span style="color: hsl(120, 100%, 40%);">+         codec.Uint('rssi', mult=-1),</span><br><span style="color: hsl(120, 100%, 40%);">+          codec.Int16BE('toa256'),</span><br><span style="color: hsl(120, 100%, 40%);">+              MTS(),</span><br><span style="color: hsl(120, 100%, 40%);">+                codec.Int16BE('cir'),</span><br><span style="color: hsl(120, 100%, 40%);">+         BurstBits('soft-bits'),</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%);">+class PDUv1Tx(PDUv0Tx):</span><br><span style="color: hsl(120, 100%, 40%);">+  # Same structure as PDUv0Tx, only the version is different</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, *args, **kw):</span><br><span style="color: hsl(120, 100%, 40%);">+              PDUv0Tx.__init__(self, *args, **kw)</span><br><span style="color: hsl(120, 100%, 40%);">+           self.STRUCT[0]._fields[0].val = 1</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmocom-bb/+/23137">change 23137</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/c/osmocom-bb/+/23137"/><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-Change-Id: I739ae5da22c603fb2cf1e84d3a79fb1a6e7343b6 </div>
<div style="display:none"> Gerrit-Change-Number: 23137 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>