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