<p>Piotr Krysik <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10782">View Change</a></p><div style="white-space:pre-wrap">Objections:
  Vadim Yanitskiy: I would prefer this is not merged as is

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">grgsm_trx: Migrated argument parsing to argparse<br><br>Argparse makes adding new parameters easier and<br>adds consistent way of handling default values of<br>parameters and printing of their help info.<br><br>Change-Id: Idf99fd7a581464aa2f77fe01e721dbd162686811<br>---<br>M apps/grgsm_trx<br>M python/trx/radio_if.py<br>2 files changed, 280 insertions(+), 300 deletions(-)<br><br></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 45312e6..712b0b7 100755</span><br><span>--- a/apps/grgsm_trx</span><br><span>+++ b/apps/grgsm_trx</span><br><span>@@ -4,6 +4,7 @@</span><br><span> # GR-GSM based transceiver</span><br><span> #</span><br><span> # (C) 2016-2018 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2017-2018 by Piotr Krysik <ptrkrysik@gmail.com></span><br><span> #</span><br><span> # All Rights Reserved</span><br><span> #</span><br><span>@@ -30,34 +31,40 @@</span><br><span> from grgsm.trx import ctrl_if_bb</span><br><span> from grgsm.trx import radio_if</span><br><span> from grgsm.trx import fake_pm</span><br><span style="color: hsl(120, 100%, 40%);">+from argparse import ArgumentParser</span><br><span> </span><br><span> COPYRIGHT = \</span><br><span>      "Copyright (C) 2016-2018 by Vadim Yanitskiy <axilirator@gmail.com>\n" \</span><br><span style="color: hsl(0, 100%, 40%);">- "Copyright (C) 2017 by Piotr Krysik <ptrkrysik@gmail.com>\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+        "Copyright (C) 2017-2018 by Piotr Krysik <ptrkrysik@gmail.com>\n" \</span><br><span>  "License GPLv2+: GNU GPL version 2 or later " \</span><br><span>    "<http://gnu.org/licenses/gpl.html>\n" \</span><br><span>     "This is free software: you are free to change and redistribute it.\n" \</span><br><span>   "There is NO WARRANTY, to the extent permitted by law.\n"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-class Application:</span><br><span style="color: hsl(0, 100%, 40%);">-       # Application variables</span><br><span style="color: hsl(0, 100%, 40%);">- remote_addr = "127.0.0.1"</span><br><span style="color: hsl(0, 100%, 40%);">-     bind_addr = "0.0.0.0"</span><br><span style="color: hsl(0, 100%, 40%);">- base_port = 6700</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        # PHY specific</span><br><span style="color: hsl(0, 100%, 40%);">-  phy_sample_rate = 4 * 1625000 / 6</span><br><span style="color: hsl(0, 100%, 40%);">-       phy_freq_offset_hz = None</span><br><span style="color: hsl(0, 100%, 40%);">-       phy_tx_antenna = "TX/RX"</span><br><span style="color: hsl(0, 100%, 40%);">-      phy_rx_antenna = "RX2"</span><br><span style="color: hsl(0, 100%, 40%);">-        phy_rx_gain = 30</span><br><span style="color: hsl(0, 100%, 40%);">-        phy_tx_gain = 10</span><br><span style="color: hsl(0, 100%, 40%);">-        phy_args = ""</span><br><span style="color: hsl(0, 100%, 40%);">- phy_ppm = 0</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     def __init__(self):</span><br><span style="color: hsl(0, 100%, 40%);">-             self.print_copyright()</span><br><span style="color: hsl(0, 100%, 40%);">-          self.parse_argv()</span><br><span style="color: hsl(120, 100%, 40%);">+class grgsm_trx:</span><br><span style="color: hsl(120, 100%, 40%);">+   def __init__(self,</span><br><span style="color: hsl(120, 100%, 40%);">+                             remote_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                          bind_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                            base_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                            args,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 sample_rate,</span><br><span style="color: hsl(120, 100%, 40%);">+                          rx_gain,</span><br><span style="color: hsl(120, 100%, 40%);">+                              tx_gain,</span><br><span style="color: hsl(120, 100%, 40%);">+                              rx_antenna,</span><br><span style="color: hsl(120, 100%, 40%);">+                           tx_antenna,</span><br><span style="color: hsl(120, 100%, 40%);">+                           freq_offset,</span><br><span style="color: hsl(120, 100%, 40%);">+                          ppm):</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%);">+            self.phy_args = args</span><br><span style="color: hsl(120, 100%, 40%);">+          self.phy_sample_rate = sample_rate</span><br><span style="color: hsl(120, 100%, 40%);">+            self.phy_rx_gain = rx_gain</span><br><span style="color: hsl(120, 100%, 40%);">+            self.phy_tx_gain = tx_gain</span><br><span style="color: hsl(120, 100%, 40%);">+            self.phy_rx_antenna = rx_antenna</span><br><span style="color: hsl(120, 100%, 40%);">+              self.phy_tx_antenna = tx_antenna</span><br><span style="color: hsl(120, 100%, 40%);">+              self.phy_freq_offset = freq_offset</span><br><span style="color: hsl(120, 100%, 40%);">+            self.phy_ppm = ppm</span><br><span> </span><br><span>               # Set up signal handlers</span><br><span>             signal.signal(signal.SIGINT, self.sig_handler)</span><br><span>@@ -66,14 +73,10 @@</span><br><span>                 # Init Radio interface</span><br><span>               self.radio = radio_if(self.phy_args, self.phy_sample_rate,</span><br><span>                   self.phy_rx_gain, self.phy_tx_gain, self.phy_ppm,</span><br><span style="color: hsl(0, 100%, 40%);">-                       self.phy_rx_antenna, self.phy_tx_antenna,</span><br><span style="color: hsl(120, 100%, 40%);">+                     self.phy_rx_antenna, self.phy_tx_antenna, self.phy_freq_offset,</span><br><span>                      self.bind_addr, self.remote_addr,</span><br><span>                    self.base_port)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             # Optional frequency offset</span><br><span style="color: hsl(0, 100%, 40%);">-             if self.phy_freq_offset_hz is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-                 self.radio.freq_offset_hz = self.phy_freq_offset_hz</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>          # Power measurement emulation</span><br><span>                # Noise: -120 .. -105</span><br><span>                # BTS: -75 .. -50</span><br><span>@@ -95,97 +98,73 @@</span><br><span>              print("[i] Shutting down...")</span><br><span>              self.radio.shutdown()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       def print_copyright(self):</span><br><span style="color: hsl(0, 100%, 40%);">-              print(COPYRIGHT)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        def print_help(self):</span><br><span style="color: hsl(0, 100%, 40%);">-           s  = " Usage: " + sys.argv[0] + " [options]\n\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                   " Some help...\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                   "  -h --help         this text\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          # TRX specific</span><br><span style="color: hsl(0, 100%, 40%);">-          s += " TRX interface specific\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                     "  -i --remote-addr  Set remote address (default %s)\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                     "  -b --bind-addr    Set bind address (default %s)\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                       "  -p --base-port    Set base port number (default %d)\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          # PHY specific</span><br><span style="color: hsl(0, 100%, 40%);">-          s += " Radio interface specific\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                   "  -a --device-args  Set device arguments\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                        "  -s --sample-rate  Set sample rate\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                     "  -g --rx-gain      Set RX gain (default %d)\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                    "  -G --tx-gain      Set TX gain (default %d)\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                    "     --rx-antenna   Set RX antenna (default %s)\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                         "     --tx-antenna   Set TX antenna (default %s)\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                         "     --freq-offset  Shift baseband freq. (e.g. -500M)\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-                   "     --ppm          Set frequency correction (default %d)\n"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                print(s % (</span><br><span style="color: hsl(0, 100%, 40%);">-                     self.remote_addr,</span><br><span style="color: hsl(0, 100%, 40%);">-                       self.bind_addr,</span><br><span style="color: hsl(0, 100%, 40%);">-                 self.base_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                 self.phy_rx_gain,</span><br><span style="color: hsl(0, 100%, 40%);">-                       self.phy_tx_gain,</span><br><span style="color: hsl(0, 100%, 40%);">-                       self.phy_rx_antenna,</span><br><span style="color: hsl(0, 100%, 40%);">-                    self.phy_tx_antenna,</span><br><span style="color: hsl(0, 100%, 40%);">-                    self.phy_ppm))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  def parse_argv(self):</span><br><span style="color: hsl(0, 100%, 40%);">-           try:</span><br><span style="color: hsl(0, 100%, 40%);">-                    opts, args = getopt.getopt(sys.argv[1:],</span><br><span style="color: hsl(0, 100%, 40%);">-                                "i:b:p:a:s:g:G:h",</span><br><span style="color: hsl(0, 100%, 40%);">-                            ["help", "remote-addr=", "bind-addr=", "base-port=",</span><br><span style="color: hsl(0, 100%, 40%);">-                            "device-args=", "sample-rate=", "rx-gain=", "tx-gain=",</span><br><span style="color: hsl(0, 100%, 40%);">-                         "ppm=", "rx-antenna=", "tx-antenna=", "freq-offset="])</span><br><span style="color: hsl(0, 100%, 40%);">-          except getopt.GetoptError as err:</span><br><span style="color: hsl(0, 100%, 40%);">-                       # Print(help and exit)</span><br><span style="color: hsl(0, 100%, 40%);">-                  self.print_help()</span><br><span style="color: hsl(0, 100%, 40%);">-                       print("[!] " + str(err))</span><br><span style="color: hsl(0, 100%, 40%);">-                      sys.exit(2)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             for o, v in opts:</span><br><span style="color: hsl(0, 100%, 40%);">-                       if o in ("-h", "--help"):</span><br><span style="color: hsl(0, 100%, 40%);">-                           self.print_help()</span><br><span style="color: hsl(0, 100%, 40%);">-                               sys.exit(2)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                     # TRX specific</span><br><span style="color: hsl(0, 100%, 40%);">-                  elif o in ("-i", "--remote-addr"):</span><br><span style="color: hsl(0, 100%, 40%);">-                          self.remote_addr = v</span><br><span style="color: hsl(0, 100%, 40%);">-                    elif o in ("-b", "--bind-addr"):</span><br><span style="color: hsl(0, 100%, 40%);">-                            self.bind_addr = v</span><br><span style="color: hsl(0, 100%, 40%);">-                      elif o in ("-p", "--base-port"):</span><br><span style="color: hsl(0, 100%, 40%);">-                            if int(v) >= 0 and int(v) <= 65535:</span><br><span style="color: hsl(0, 100%, 40%);">-                                       self.base_port = int(v)</span><br><span style="color: hsl(0, 100%, 40%);">-                         else:</span><br><span style="color: hsl(0, 100%, 40%);">-                                   print("[!] The port number should be in range [0-65536]")</span><br><span style="color: hsl(0, 100%, 40%);">-                                     sys.exit(2)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                     # PHY specific</span><br><span style="color: hsl(0, 100%, 40%);">-                  elif o in ("-a", "--device-args"):</span><br><span style="color: hsl(0, 100%, 40%);">-                          self.phy_args = v</span><br><span style="color: hsl(0, 100%, 40%);">-                       elif o in ("-s", "--sample-rate"):</span><br><span style="color: hsl(0, 100%, 40%);">-                          self.phy_sample_rate = int(v)</span><br><span style="color: hsl(0, 100%, 40%);">-                   elif o in ("-g", "--rx-gain"):</span><br><span style="color: hsl(0, 100%, 40%);">-                              self.phy_rx_gain = int(v)</span><br><span style="color: hsl(0, 100%, 40%);">-                       elif o in ("-G", "--tx-gain"):</span><br><span style="color: hsl(0, 100%, 40%);">-                              self.phy_tx_gain = int(v)</span><br><span style="color: hsl(0, 100%, 40%);">-                       elif o in ("--rx-antenna"):</span><br><span style="color: hsl(0, 100%, 40%);">-                           self.phy_rx_antenna = v</span><br><span style="color: hsl(0, 100%, 40%);">-                 elif o in ("--tx-antenna"):</span><br><span style="color: hsl(0, 100%, 40%);">-                           self.phy_tx_antenna = v</span><br><span style="color: hsl(0, 100%, 40%);">-                 elif o in ("--ppm"):</span><br><span style="color: hsl(0, 100%, 40%);">-                          self.phy_ppm = int(v)</span><br><span style="color: hsl(0, 100%, 40%);">-                   elif o in ("--freq-offset"):</span><br><span style="color: hsl(0, 100%, 40%);">-                          # Convert /\d+(\.\d+)?(M|k)?/ to Hz</span><br><span style="color: hsl(0, 100%, 40%);">-                             offset_hz = eng_notation.str_to_num(v)</span><br><span style="color: hsl(0, 100%, 40%);">-                          self.phy_freq_offset_hz = offset_hz</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>  def sig_handler(self, signum, frame):</span><br><span>                print("Signal %d received" % signum)</span><br><span>               if signum is signal.SIGINT:</span><br><span>                  self.shutdown()</span><br><span>                      sys.exit(0)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-if __name__ == '__main__':</span><br><span style="color: hsl(0, 100%, 40%);">-       app = Application()</span><br><span style="color: hsl(120, 100%, 40%);">+def parse_args():</span><br><span style="color: hsl(120, 100%, 40%);">+        description = 'Burst transceiver for GSM Mobile Station'</span><br><span style="color: hsl(120, 100%, 40%);">+      parser = ArgumentParser(prog="grgsm_trx", usage='%(prog)s [options]',</span><br><span style="color: hsl(120, 100%, 40%);">+               description=description)</span><br><span style="color: hsl(120, 100%, 40%);">+      # TRX specific</span><br><span style="color: hsl(120, 100%, 40%);">+        parser.add_argument("-i", "--remote-addr", dest="remote_addr", type=str,</span><br><span style="color: hsl(120, 100%, 40%);">+                default='127.0.0.1',</span><br><span style="color: hsl(120, 100%, 40%);">+          help="Set remote address default=%(default)s")</span><br><span style="color: hsl(120, 100%, 40%);">+      parser.add_argument("-b", "--bind-addr", dest="bind_addr", type=str,</span><br><span style="color: hsl(120, 100%, 40%);">+            default='0.0.0.0',</span><br><span style="color: hsl(120, 100%, 40%);">+            help="Set bind address default=%(default)s")</span><br><span style="color: hsl(120, 100%, 40%);">+        parser.add_argument(</span><br><span style="color: hsl(120, 100%, 40%);">+          "-p", "--base_port", dest="base_port", type=int,</span><br><span style="color: hsl(120, 100%, 40%);">+                default=6700,</span><br><span style="color: hsl(120, 100%, 40%);">+         help="Set base port number default=%(default)s")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # PHY specific</span><br><span style="color: hsl(120, 100%, 40%);">+        parser.add_argument("-a", "--args", dest="args", type=str,</span><br><span style="color: hsl(120, 100%, 40%);">+              default="",</span><br><span style="color: hsl(120, 100%, 40%);">+         help="Set Device Arguments default=%(default)s")</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_argument("-s", "--sample-rate", dest="sample_rate", type=float,</span><br><span style="color: hsl(120, 100%, 40%);">+              default=1083333.3333333333,</span><br><span style="color: hsl(120, 100%, 40%);">+           help="Set samp_rate default=%(default)s")</span><br><span style="color: hsl(120, 100%, 40%);">+   parser.add_argument("-g", "--rx-gain", dest="rx_gain", type=float,</span><br><span style="color: hsl(120, 100%, 40%);">+              default=30,</span><br><span style="color: hsl(120, 100%, 40%);">+           help="Set RX gain default=%(default)s")</span><br><span style="color: hsl(120, 100%, 40%);">+     parser.add_argument("-G", "--tx-gain", dest="tx_gain", type=float,</span><br><span style="color: hsl(120, 100%, 40%);">+              default=10,</span><br><span style="color: hsl(120, 100%, 40%);">+           help="Set TX gain default=%(default)s")</span><br><span style="color: hsl(120, 100%, 40%);">+     parser.add_argument("--rx-antenna", dest="rx_antenna", type=str,</span><br><span style="color: hsl(120, 100%, 40%);">+          default="RX2",</span><br><span style="color: hsl(120, 100%, 40%);">+              help="Set RX antenna")</span><br><span style="color: hsl(120, 100%, 40%);">+      parser.add_argument("--tx-antenna", dest="tx_antenna", type=str,</span><br><span style="color: hsl(120, 100%, 40%);">+          default='TX/RX',</span><br><span style="color: hsl(120, 100%, 40%);">+              help="Set TX antenna default=%(default)s")</span><br><span style="color: hsl(120, 100%, 40%);">+  parser.add_argument(</span><br><span style="color: hsl(120, 100%, 40%);">+          "--freq-offset", dest="freq_offset", type=float,</span><br><span style="color: hsl(120, 100%, 40%);">+          default=0,</span><br><span style="color: hsl(120, 100%, 40%);">+            help="Shift Tx and Rx frequencies default=%(default)s")</span><br><span style="color: hsl(120, 100%, 40%);">+     parser.add_argument("--ppm", dest="ppm", type=float,</span><br><span style="color: hsl(120, 100%, 40%);">+              default=0,</span><br><span style="color: hsl(120, 100%, 40%);">+            help="Set ppm default=%(default)s")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return parser.parse_args()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def main():</span><br><span style="color: hsl(120, 100%, 40%);">+     print(COPYRIGHT)</span><br><span style="color: hsl(120, 100%, 40%);">+      options = parse_args()</span><br><span style="color: hsl(120, 100%, 40%);">+        app = grgsm_trx(</span><br><span style="color: hsl(120, 100%, 40%);">+                      remote_addr=options.remote_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                      bind_addr=options.bind_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                  base_port=options.base_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                  args=options.args,</span><br><span style="color: hsl(120, 100%, 40%);">+                    sample_rate=options.sample_rate,</span><br><span style="color: hsl(120, 100%, 40%);">+                      rx_gain=options.rx_gain,</span><br><span style="color: hsl(120, 100%, 40%);">+                      tx_gain=options.tx_gain,</span><br><span style="color: hsl(120, 100%, 40%);">+                      rx_antenna=options.rx_antenna,</span><br><span style="color: hsl(120, 100%, 40%);">+                        tx_antenna=options.tx_antenna,</span><br><span style="color: hsl(120, 100%, 40%);">+                        freq_offset=options.freq_offset,</span><br><span style="color: hsl(120, 100%, 40%);">+                      ppm=options.ppm)</span><br><span>     app.run()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if __name__ == '__main__':</span><br><span style="color: hsl(120, 100%, 40%);">+       main()</span><br><span>diff --git a/python/trx/radio_if.py b/python/trx/radio_if.py</span><br><span>index 407e724..17a0d00 100644</span><br><span>--- a/python/trx/radio_if.py</span><br><span>+++ b/python/trx/radio_if.py</span><br><span>@@ -59,251 +59,252 @@</span><br><span>             self.message_port_pub(pmt.intern("dict_out"), pmt.to_pmt(d))</span><br><span> </span><br><span> class radio_if(gr.top_block):</span><br><span style="color: hsl(0, 100%, 40%);">-  # PHY specific variables</span><br><span style="color: hsl(0, 100%, 40%);">-        freq_offset_hz = None</span><br><span style="color: hsl(0, 100%, 40%);">-   rx_freq = 935e6</span><br><span style="color: hsl(0, 100%, 40%);">- tx_freq = 890e6</span><br><span style="color: hsl(0, 100%, 40%);">- osr = 4</span><br><span style="color: hsl(120, 100%, 40%);">+  # PHY specific variables</span><br><span style="color: hsl(120, 100%, 40%);">+  rx_freq = 935e6</span><br><span style="color: hsl(120, 100%, 40%);">+  tx_freq = 890e6</span><br><span style="color: hsl(120, 100%, 40%);">+  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(120, 100%, 40%);">+  # Application state flags</span><br><span style="color: hsl(120, 100%, 40%);">+  trx_started = False</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     # GSM timings (in microseconds [uS])</span><br><span style="color: hsl(0, 100%, 40%);">-    # One timeslot duration is 576.9 μs = 15/26 ms,</span><br><span style="color: hsl(0, 100%, 40%);">-        # or 156.25 symbol periods (a symbol period is 48/13 μs)</span><br><span style="color: hsl(0, 100%, 40%);">-       GSM_SYM_PERIOD_uS = 48.0 / 13.0</span><br><span style="color: hsl(0, 100%, 40%);">- GSM_TS_PERIOD_uS = GSM_SYM_PERIOD_uS * 156.25</span><br><span style="color: hsl(0, 100%, 40%);">-   GSM_UL_DL_SHIFT_uS = -(GSM_TS_PERIOD_uS * 3)</span><br><span style="color: hsl(120, 100%, 40%);">+  # GSM timings (in microseconds [uS])</span><br><span style="color: hsl(120, 100%, 40%);">+  # One timeslot duration is 576.9 μs = 15/26 ms,</span><br><span style="color: hsl(120, 100%, 40%);">+  # or 156.25 symbol periods (a symbol period is 48/13 μs)</span><br><span style="color: hsl(120, 100%, 40%);">+  GSM_SYM_PERIOD_uS = 48.0 / 13.0</span><br><span style="color: hsl(120, 100%, 40%);">+  GSM_TS_PERIOD_uS = GSM_SYM_PERIOD_uS * 156.25</span><br><span style="color: hsl(120, 100%, 40%);">+  GSM_UL_DL_SHIFT_uS = -(GSM_TS_PERIOD_uS * 3)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   # FIXME: shall be measured (automatically?) for</span><br><span style="color: hsl(0, 100%, 40%);">- # particular device and particular clock rate.</span><br><span style="color: hsl(0, 100%, 40%);">-  # The current value is measured for USRP B2X0 at 26e6.</span><br><span style="color: hsl(0, 100%, 40%);">-  delay_correction = (285.616 + 2 * GSM_SYM_PERIOD_uS) * 1e-6</span><br><span style="color: hsl(120, 100%, 40%);">+  # FIXME: shall be measured (automatically?) for</span><br><span style="color: hsl(120, 100%, 40%);">+  # particular device and particular clock rate.</span><br><span style="color: hsl(120, 100%, 40%);">+  # The current value is measured for USRP B2X0 at 26e6.</span><br><span style="color: hsl(120, 100%, 40%);">+  delay_correction = (285.616 + 2 * GSM_SYM_PERIOD_uS) * 1e-6</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   def __init__(self, phy_args, phy_sample_rate,</span><br><span style="color: hsl(0, 100%, 40%);">-                   phy_rx_gain, phy_tx_gain, phy_ppm,</span><br><span style="color: hsl(0, 100%, 40%);">-                      phy_rx_antenna, phy_tx_antenna,</span><br><span style="color: hsl(0, 100%, 40%);">-                 trx_bind_addr, trx_remote_addr,</span><br><span style="color: hsl(0, 100%, 40%);">-                 trx_base_port):</span><br><span style="color: hsl(120, 100%, 40%);">+  def __init__(self, phy_args, phy_sample_rate,</span><br><span style="color: hsl(120, 100%, 40%);">+      phy_rx_gain, phy_tx_gain, phy_ppm,</span><br><span style="color: hsl(120, 100%, 40%);">+      phy_rx_antenna, phy_tx_antenna,</span><br><span style="color: hsl(120, 100%, 40%);">+      phy_freq_offset,</span><br><span style="color: hsl(120, 100%, 40%);">+      trx_bind_addr, trx_remote_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+      trx_base_port):</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             print("[i] Init Radio interface (L:%s:%u <-> R:%s:%u)"</span><br><span style="color: hsl(0, 100%, 40%);">-                  % (trx_bind_addr, trx_base_port + 2,</span><br><span style="color: hsl(0, 100%, 40%);">-                            trx_remote_addr, trx_base_port + 102))</span><br><span style="color: hsl(120, 100%, 40%);">+    print("[i] Init Radio interface (L:%s:%u <-> R:%s:%u)"</span><br><span style="color: hsl(120, 100%, 40%);">+      % (trx_bind_addr, trx_base_port + 2,</span><br><span style="color: hsl(120, 100%, 40%);">+        trx_remote_addr, trx_base_port + 102))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              # PHY specific variables</span><br><span style="color: hsl(0, 100%, 40%);">-                self.sample_rate = phy_sample_rate</span><br><span style="color: hsl(0, 100%, 40%);">-              self.rx_gain = phy_rx_gain</span><br><span style="color: hsl(0, 100%, 40%);">-              self.tx_gain = phy_tx_gain</span><br><span style="color: hsl(0, 100%, 40%);">-              self.ppm = phy_ppm</span><br><span style="color: hsl(120, 100%, 40%);">+    # PHY specific variables</span><br><span style="color: hsl(120, 100%, 40%);">+    self.sample_rate = phy_sample_rate</span><br><span style="color: hsl(120, 100%, 40%);">+    self.rx_gain = phy_rx_gain</span><br><span style="color: hsl(120, 100%, 40%);">+    self.tx_gain = phy_tx_gain</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_freq_offset = phy_freq_offset</span><br><span style="color: hsl(120, 100%, 40%);">+    self.ppm = phy_ppm</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                gr.top_block.__init__(self, "GR-GSM TRX")</span><br><span style="color: hsl(120, 100%, 40%);">+    gr.top_block.__init__(self, "GR-GSM TRX")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # TRX Burst Interface</span><br><span style="color: hsl(0, 100%, 40%);">-           self.trx_burst_if = grgsm.trx_burst_if(</span><br><span style="color: hsl(0, 100%, 40%);">-                 trx_bind_addr, trx_remote_addr,</span><br><span style="color: hsl(0, 100%, 40%);">-                 str(trx_base_port))</span><br><span style="color: hsl(120, 100%, 40%);">+    # TRX Burst Interface</span><br><span style="color: hsl(120, 100%, 40%);">+    self.trx_burst_if = grgsm.trx_burst_if(</span><br><span style="color: hsl(120, 100%, 40%);">+      trx_bind_addr, trx_remote_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+      str(trx_base_port))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-               # RX path definition</span><br><span style="color: hsl(0, 100%, 40%);">-            self.phy_src = uhd.usrp_source(phy_args,</span><br><span style="color: hsl(0, 100%, 40%);">-                        uhd.stream_args(cpu_format="fc32",</span><br><span style="color: hsl(0, 100%, 40%);">-                            channels=range(1)))</span><br><span style="color: hsl(120, 100%, 40%);">+    # RX path definition</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_src = uhd.usrp_source(phy_args,</span><br><span style="color: hsl(120, 100%, 40%);">+      uhd.stream_args(cpu_format="fc32",</span><br><span style="color: hsl(120, 100%, 40%);">+        channels=range(1)))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                self.phy_src.set_clock_rate(26e6, uhd.ALL_MBOARDS)</span><br><span style="color: hsl(0, 100%, 40%);">-              self.phy_src.set_center_freq(self.rx_freq, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-           self.phy_src.set_antenna(phy_rx_antenna, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-             self.phy_src.set_samp_rate(phy_sample_rate)</span><br><span style="color: hsl(0, 100%, 40%);">-             self.phy_src.set_bandwidth(650e3, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            self.phy_src.set_gain(phy_rx_gain)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_src.set_clock_rate(26e6, uhd.ALL_MBOARDS)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_src.set_center_freq(self.rx_freq, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_src.set_antenna(phy_rx_antenna, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_src.set_samp_rate(phy_sample_rate)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_src.set_bandwidth(650e3, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_src.set_gain(phy_rx_gain)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           self.msg_to_tag_src = grgsm.msg_to_tag()</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_to_tag_src = grgsm.msg_to_tag()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              self.rotator_src = grgsm.controlled_rotator_cc(</span><br><span style="color: hsl(0, 100%, 40%);">-                 self.calc_phase_inc(self.rx_freq))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.rotator_src = grgsm.controlled_rotator_cc(</span><br><span style="color: hsl(120, 100%, 40%);">+      self.calc_phase_inc(self.rx_freq))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           self.lpf = filter.fir_filter_ccf(1, firdes.low_pass(</span><br><span style="color: hsl(0, 100%, 40%);">-                    1, phy_sample_rate, 125e3, 5e3, firdes.WIN_HAMMING, 6.76))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.lpf = filter.fir_filter_ccf(1, firdes.low_pass(</span><br><span style="color: hsl(120, 100%, 40%);">+      1, phy_sample_rate, 125e3, 5e3, firdes.WIN_HAMMING, 6.76))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              self.gsm_receiver = grgsm.receiver(self.osr, ([0]), ([]))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.gsm_receiver = grgsm.receiver(self.osr, ([0]), ([]))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            self.ts_filter = grgsm.burst_timeslot_filter(0)</span><br><span style="color: hsl(0, 100%, 40%);">-         self.ts_filter.set_policy(grgsm.FILTER_POLICY_DROP_ALL)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.ts_filter = grgsm.burst_timeslot_filter(0)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.ts_filter.set_policy(grgsm.FILTER_POLICY_DROP_ALL)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           # Connections</span><br><span style="color: hsl(0, 100%, 40%);">-           self.connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                   (self.phy_src, 0),</span><br><span style="color: hsl(0, 100%, 40%);">-                      (self.msg_to_tag_src, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+    # Connections</span><br><span style="color: hsl(120, 100%, 40%);">+    self.connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.phy_src, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.msg_to_tag_src, 0))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          self.connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                   (self.msg_to_tag_src, 0),</span><br><span style="color: hsl(0, 100%, 40%);">-                       (self.rotator_src, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.msg_to_tag_src, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.rotator_src, 0))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            self.connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                   (self.rotator_src, 0),</span><br><span style="color: hsl(0, 100%, 40%);">-                  (self.lpf, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.rotator_src, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.lpf, 0))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-               self.connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                   (self.lpf, 0),</span><br><span style="color: hsl(0, 100%, 40%);">-                  (self.gsm_receiver, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.lpf, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.gsm_receiver, 0))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             self.msg_connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                       (self.gsm_receiver, 'C0'),</span><br><span style="color: hsl(0, 100%, 40%);">-                      (self.ts_filter, 'in'))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.gsm_receiver, 'C0'),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.ts_filter, 'in'))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             self.msg_connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                       (self.ts_filter, 'out'),</span><br><span style="color: hsl(0, 100%, 40%);">-                        (self.trx_burst_if, 'bursts'))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.ts_filter, 'out'),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.trx_burst_if, 'bursts'))</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             # TX Path Definition</span><br><span style="color: hsl(0, 100%, 40%);">-            self.phy_sink = uhd.usrp_sink(phy_args,</span><br><span style="color: hsl(0, 100%, 40%);">-                 uhd.stream_args(cpu_format="fc32",</span><br><span style="color: hsl(0, 100%, 40%);">-                            channels=range(1)), "packet_len")</span><br><span style="color: hsl(120, 100%, 40%);">+    # TX Path Definition</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_sink = uhd.usrp_sink(phy_args,</span><br><span style="color: hsl(120, 100%, 40%);">+      uhd.stream_args(cpu_format="fc32",</span><br><span style="color: hsl(120, 100%, 40%);">+        channels=range(1)), "packet_len")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-         self.phy_sink.set_clock_rate(26e6, uhd.ALL_MBOARDS)</span><br><span style="color: hsl(0, 100%, 40%);">-             self.phy_sink.set_antenna(phy_tx_antenna, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            self.phy_sink.set_samp_rate(phy_sample_rate)</span><br><span style="color: hsl(0, 100%, 40%);">-            self.phy_sink.set_center_freq(self.tx_freq, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          self.phy_sink.set_gain(self.tx_gain)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_sink.set_clock_rate(26e6, uhd.ALL_MBOARDS)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_sink.set_antenna(phy_tx_antenna, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_sink.set_samp_rate(phy_sample_rate)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_sink.set_center_freq(self.tx_freq, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_sink.set_gain(self.tx_gain)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             self.tx_time_setter = grgsm.txtime_setter(</span><br><span style="color: hsl(0, 100%, 40%);">-                      0xffffffff, 0, 0, 0, 0, 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                      self.delay_correction + self.GSM_UL_DL_SHIFT_uS * 1e-6)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.tx_time_setter = grgsm.txtime_setter(</span><br><span style="color: hsl(120, 100%, 40%);">+      0xffffffff, 0, 0, 0, 0, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+      self.delay_correction + self.GSM_UL_DL_SHIFT_uS * 1e-6)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            self.tx_burst_proc = grgsm.preprocess_tx_burst()</span><br><span style="color: hsl(120, 100%, 40%);">+    self.tx_burst_proc = grgsm.preprocess_tx_burst()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              self.pdu_to_tagged_stream = blocks.pdu_to_tagged_stream(</span><br><span style="color: hsl(0, 100%, 40%);">-                        blocks.byte_t, 'packet_len')</span><br><span style="color: hsl(120, 100%, 40%);">+    self.pdu_to_tagged_stream = blocks.pdu_to_tagged_stream(</span><br><span style="color: hsl(120, 100%, 40%);">+      blocks.byte_t, 'packet_len')</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              self.gmsk_mod = grgsm.gsm_gmsk_mod(</span><br><span style="color: hsl(0, 100%, 40%);">-                     BT = 0.3, pulse_duration = 4, sps = self.osr)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.gmsk_mod = grgsm.gsm_gmsk_mod(</span><br><span style="color: hsl(120, 100%, 40%);">+      BT = 0.3, pulse_duration = 4, sps = self.osr)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-         self.burst_shaper = digital.burst_shaper_cc(</span><br><span style="color: hsl(0, 100%, 40%);">-                    (firdes.window(firdes.WIN_HANN, 16, 0)),</span><br><span style="color: hsl(0, 100%, 40%);">-                        0, 20, False, "packet_len")</span><br><span style="color: hsl(120, 100%, 40%);">+    self.burst_shaper = digital.burst_shaper_cc(</span><br><span style="color: hsl(120, 100%, 40%);">+      (firdes.window(firdes.WIN_HANN, 16, 0)),</span><br><span style="color: hsl(120, 100%, 40%);">+      0, 20, False, "packet_len")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                self.msg_to_tag_sink = grgsm.msg_to_tag()</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_to_tag_sink = grgsm.msg_to_tag()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            self.rotator_sink = grgsm.controlled_rotator_cc(</span><br><span style="color: hsl(0, 100%, 40%);">-                        -self.calc_phase_inc(self.tx_freq))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.rotator_sink = grgsm.controlled_rotator_cc(</span><br><span style="color: hsl(120, 100%, 40%);">+      -self.calc_phase_inc(self.tx_freq))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # Connections</span><br><span style="color: hsl(0, 100%, 40%);">-           self.msg_connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                       (self.trx_burst_if, 'bursts'),</span><br><span style="color: hsl(0, 100%, 40%);">-                  (self.tx_time_setter, 'bursts_in'))</span><br><span style="color: hsl(120, 100%, 40%);">+    # Connections</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.trx_burst_if, 'bursts'),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.tx_time_setter, 'bursts_in'))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              self.msg_connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                       (self.tx_time_setter, 'bursts_out'),</span><br><span style="color: hsl(0, 100%, 40%);">-                    (self.tx_burst_proc, 'bursts_in'))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.tx_time_setter, 'bursts_out'),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.tx_burst_proc, 'bursts_in'))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             self.msg_connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                       (self.tx_burst_proc, 'bursts_out'),</span><br><span style="color: hsl(0, 100%, 40%);">-                     (self.pdu_to_tagged_stream, 'pdus'))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.tx_burst_proc, 'bursts_out'),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.pdu_to_tagged_stream, 'pdus'))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          self.connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                   (self.pdu_to_tagged_stream, 0),</span><br><span style="color: hsl(0, 100%, 40%);">-                 (self.gmsk_mod, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.pdu_to_tagged_stream, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.gmsk_mod, 0))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            self.connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                   (self.gmsk_mod, 0),</span><br><span style="color: hsl(0, 100%, 40%);">-                     (self.burst_shaper, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.gmsk_mod, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.burst_shaper, 0))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                self.connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                   (self.burst_shaper, 0),</span><br><span style="color: hsl(0, 100%, 40%);">-                 (self.msg_to_tag_sink, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.burst_shaper, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.msg_to_tag_sink, 0))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              self.connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                   (self.msg_to_tag_sink, 0),</span><br><span style="color: hsl(0, 100%, 40%);">-                      (self.rotator_sink, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.msg_to_tag_sink, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.rotator_sink, 0))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-         self.connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                   (self.rotator_sink, 0),</span><br><span style="color: hsl(0, 100%, 40%);">-                 (self.phy_sink, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.rotator_sink, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.phy_sink, 0))</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # RX & TX synchronization</span><br><span style="color: hsl(0, 100%, 40%);">-           self.bt_filter = grgsm.burst_type_filter([3])</span><br><span style="color: hsl(0, 100%, 40%);">-           self.burst_to_fn_time = grgsm.burst_to_fn_time()</span><br><span style="color: hsl(120, 100%, 40%);">+    # RX & TX synchronization</span><br><span style="color: hsl(120, 100%, 40%);">+    self.bt_filter = grgsm.burst_type_filter([3])</span><br><span style="color: hsl(120, 100%, 40%);">+    self.burst_to_fn_time = grgsm.burst_to_fn_time()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # Connections</span><br><span style="color: hsl(0, 100%, 40%);">-           self.msg_connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                       (self.gsm_receiver, 'C0'),</span><br><span style="color: hsl(0, 100%, 40%);">-                      (self.bt_filter, 'bursts_in'))</span><br><span style="color: hsl(120, 100%, 40%);">+    # Connections</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.gsm_receiver, 'C0'),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.bt_filter, 'bursts_in'))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            self.msg_connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                       (self.bt_filter, 'bursts_out'),</span><br><span style="color: hsl(0, 100%, 40%);">-                 (self.burst_to_fn_time, 'bursts_in'))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.bt_filter, 'bursts_out'),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.burst_to_fn_time, 'bursts_in'))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            self.msg_connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                       (self.burst_to_fn_time, 'fn_time_out'),</span><br><span style="color: hsl(0, 100%, 40%);">-                 (self.tx_time_setter, 'fn_time'))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.burst_to_fn_time, 'fn_time_out'),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.tx_time_setter, 'fn_time'))</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # AFC (Automatic Frequency Correction)</span><br><span style="color: hsl(0, 100%, 40%);">-          self.gsm_clck_ctrl = grgsm.clock_offset_control(</span><br><span style="color: hsl(0, 100%, 40%);">-                        self.rx_freq, phy_sample_rate, osr = self.osr)</span><br><span style="color: hsl(120, 100%, 40%);">+    # AFC (Automatic Frequency Correction)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.gsm_clck_ctrl = grgsm.clock_offset_control(</span><br><span style="color: hsl(120, 100%, 40%);">+      self.rx_freq, phy_sample_rate, osr = self.osr)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              self.dict_toggle_sign = dict_toggle_sign()</span><br><span style="color: hsl(120, 100%, 40%);">+    self.dict_toggle_sign = dict_toggle_sign()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          # Connections</span><br><span style="color: hsl(0, 100%, 40%);">-           self.msg_connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                       (self.gsm_receiver, 'measurements'),</span><br><span style="color: hsl(0, 100%, 40%);">-                    (self.gsm_clck_ctrl, 'measurements'))</span><br><span style="color: hsl(120, 100%, 40%);">+    # Connections</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.gsm_receiver, 'measurements'),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.gsm_clck_ctrl, 'measurements'))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            self.msg_connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                       (self.gsm_clck_ctrl, 'ctrl'),</span><br><span style="color: hsl(0, 100%, 40%);">-                   (self.msg_to_tag_src, 'msg'))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.gsm_clck_ctrl, 'ctrl'),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.msg_to_tag_src, 'msg'))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              self.msg_connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                       (self.gsm_clck_ctrl, 'ctrl'),</span><br><span style="color: hsl(0, 100%, 40%);">-                   (self.dict_toggle_sign, 'dict_in'))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.gsm_clck_ctrl, 'ctrl'),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.dict_toggle_sign, 'dict_in'))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          self.msg_connect(</span><br><span style="color: hsl(0, 100%, 40%);">-                       (self.dict_toggle_sign, 'dict_out'),</span><br><span style="color: hsl(0, 100%, 40%);">-                    (self.msg_to_tag_sink, 'msg'))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.msg_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.dict_toggle_sign, 'dict_out'),</span><br><span style="color: hsl(120, 100%, 40%);">+      (self.msg_to_tag_sink, 'msg'))</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-         # Some UHD devices (such as UmTRX) do start the clock</span><br><span style="color: hsl(0, 100%, 40%);">-           # not from 0, so it's required to reset it manually.</span><br><span style="color: hsl(0, 100%, 40%);">-                # Resetting UHD source will also affect the sink.</span><br><span style="color: hsl(0, 100%, 40%);">-               self.phy_src.set_time_now(uhd.time_spec(0.0))</span><br><span style="color: hsl(120, 100%, 40%);">+    # Some UHD devices (such as UmTRX) do start the clock</span><br><span style="color: hsl(120, 100%, 40%);">+    # not from 0, so it's required to reset it manually.</span><br><span style="color: hsl(120, 100%, 40%);">+    # Resetting UHD source will also affect the sink.</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_src.set_time_now(uhd.time_spec(0.0))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def shutdown(self):</span><br><span style="color: hsl(0, 100%, 40%);">-             print("[i] Shutdown Radio interface")</span><br><span style="color: hsl(0, 100%, 40%);">-         self.stop()</span><br><span style="color: hsl(0, 100%, 40%);">-             self.wait()</span><br><span style="color: hsl(120, 100%, 40%);">+  def shutdown(self):</span><br><span style="color: hsl(120, 100%, 40%);">+    print("[i] Shutdown Radio interface")</span><br><span style="color: hsl(120, 100%, 40%);">+    self.stop()</span><br><span style="color: hsl(120, 100%, 40%);">+    self.wait()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   def calc_phase_inc(self, fc):</span><br><span style="color: hsl(0, 100%, 40%);">-           return self.ppm / 1.0e6 * 2 * pi * fc / self.sample_rate</span><br><span style="color: hsl(120, 100%, 40%);">+  def calc_phase_inc(self, fc):</span><br><span style="color: hsl(120, 100%, 40%);">+    return self.ppm / 1.0e6 * 2 * pi * fc / self.sample_rate</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     def set_rx_freq(self, fc):</span><br><span style="color: hsl(0, 100%, 40%);">-              if self.freq_offset_hz is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-                     fc += self.freq_offset_hz</span><br><span style="color: hsl(0, 100%, 40%);">-                       print("[#] Shifting RX freq. to %s (offset is %s)"</span><br><span style="color: hsl(0, 100%, 40%);">-                            % (eng_notation.num_to_str(fc),</span><br><span style="color: hsl(0, 100%, 40%);">-                                 eng_notation.num_to_str(self.freq_offset_hz)))</span><br><span style="color: hsl(0, 100%, 40%);">-          self.phy_src.set_center_freq(fc, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-             self.rotator_src.set_phase_inc(self.calc_phase_inc(fc))</span><br><span style="color: hsl(0, 100%, 40%);">-         self.rx_freq = fc</span><br><span style="color: hsl(120, 100%, 40%);">+  def set_rx_freq(self, fc):</span><br><span style="color: hsl(120, 100%, 40%);">+    if self.phy_freq_offset != 0:</span><br><span style="color: hsl(120, 100%, 40%);">+      fc += self.phy_freq_offset</span><br><span style="color: hsl(120, 100%, 40%);">+      print("[#] Shifting RX freq. to %s (offset is %s)"</span><br><span style="color: hsl(120, 100%, 40%);">+        % (eng_notation.num_to_str(fc),</span><br><span style="color: hsl(120, 100%, 40%);">+          eng_notation.num_to_str(self.freq_offset)))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_src.set_center_freq(fc, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.rotator_src.set_phase_inc(self.calc_phase_inc(fc))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.rx_freq = fc</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       def set_tx_freq(self, fc):</span><br><span style="color: hsl(0, 100%, 40%);">-              if self.freq_offset_hz is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-                     fc += self.freq_offset_hz</span><br><span style="color: hsl(0, 100%, 40%);">-                       print("[#] Shifting TX freq. to %s (offset is %s)"</span><br><span style="color: hsl(0, 100%, 40%);">-                            % (eng_notation.num_to_str(fc),</span><br><span style="color: hsl(0, 100%, 40%);">-                                 eng_notation.num_to_str(self.freq_offset_hz)))</span><br><span style="color: hsl(0, 100%, 40%);">-          self.phy_sink.set_center_freq(fc, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            self.rotator_sink.set_phase_inc(-self.calc_phase_inc(fc))</span><br><span style="color: hsl(0, 100%, 40%);">-               self.tx_freq = fc</span><br><span style="color: hsl(120, 100%, 40%);">+  def set_tx_freq(self, fc):</span><br><span style="color: hsl(120, 100%, 40%);">+    if self.phy_freq_offset != 0:</span><br><span style="color: hsl(120, 100%, 40%);">+      fc += self.phy_freq_offset</span><br><span style="color: hsl(120, 100%, 40%);">+      print("[#] Shifting TX freq. to %s (offset is %s)"</span><br><span style="color: hsl(120, 100%, 40%);">+        % (eng_notation.num_to_str(fc),</span><br><span style="color: hsl(120, 100%, 40%);">+          eng_notation.num_to_str(self.freq_offset)))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_sink.set_center_freq(fc, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.rotator_sink.set_phase_inc(-self.calc_phase_inc(fc))</span><br><span style="color: hsl(120, 100%, 40%);">+    self.tx_freq = fc</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def set_rx_gain(self, gain):</span><br><span style="color: hsl(0, 100%, 40%);">-            self.phy_src.set_gain(gain, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          self.rx_gain = gain</span><br><span style="color: hsl(120, 100%, 40%);">+  def set_rx_gain(self, gain):</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_src.set_gain(gain, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.rx_gain = gain</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def set_tx_gain(self, gain):</span><br><span style="color: hsl(0, 100%, 40%);">-            self.phy_sink.set_gain(gain, 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         self.tx_gain = gain</span><br><span style="color: hsl(120, 100%, 40%);">+  def set_tx_gain(self, gain):</span><br><span style="color: hsl(120, 100%, 40%);">+    self.phy_sink.set_gain(gain, 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    self.tx_gain = gain</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   def set_ta(self, ta):</span><br><span style="color: hsl(0, 100%, 40%);">-           print("[i] Setting TA value %d" % ta)</span><br><span style="color: hsl(0, 100%, 40%);">-         advance_time_sec = ta * self.GSM_SYM_PERIOD_uS * 1e-6</span><br><span style="color: hsl(0, 100%, 40%);">-           self.tx_time_setter.set_timing_advance(advance_time_sec)</span><br><span style="color: hsl(120, 100%, 40%);">+  def set_ta(self, ta):</span><br><span style="color: hsl(120, 100%, 40%);">+    print("[i] Setting TA value %d" % ta)</span><br><span style="color: hsl(120, 100%, 40%);">+    advance_time_sec = ta * self.GSM_SYM_PERIOD_uS * 1e-6</span><br><span style="color: hsl(120, 100%, 40%);">+    self.tx_time_setter.set_timing_advance(advance_time_sec)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10782">change 10782</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/10782"/><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: merged </div>
<div style="display:none"> Gerrit-Change-Id: Idf99fd7a581464aa2f77fe01e721dbd162686811 </div>
<div style="display:none"> Gerrit-Change-Number: 10782 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Piotr Krysik <ptrkrysik@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>