#!/usr/bin/env python2 # -*- coding: utf-8 -*- # GR-GSM based transceiver # # (C) 2016-2018 by Vadim Yanitskiy # (C) 2017-2018 by Piotr Krysik # # All Rights Reserved # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import signal import sys from argparse import ArgumentParser from argparse import ArgumentTypeError from gnuradio import eng_notation from grgsm.trx import ctrl_if_bb from grgsm.trx import radio_if from grgsm.trx import fake_pm COPYRIGHT = \ "Copyright (C) 2016-2018 by Vadim Yanitskiy \n" \ "Copyright (C) 2017-2018 by Piotr Krysik \n" \ "License GPLv2+: GNU GPL version 2 or later " \ "\n" \ "This is free software: you are free to change and redistribute it.\n" \ "There is NO WARRANTY, to the extent permitted by law.\n" class Application: def __init__(self, argv): self.remote_addr = argv.remote_addr self.bind_addr = argv.bind_addr self.base_port = argv.base_port self.phy_args = argv.args self.phy_sample_rate = argv.sample_rate self.phy_rx_gain = argv.rx_gain self.phy_tx_gain = argv.tx_gain self.phy_rx_antenna = argv.rx_antenna self.phy_tx_antenna = argv.tx_antenna self.phy_freq_offset_hz = argv.freq_offset self.phy_ppm = argv.ppm # Set up signal handlers signal.signal(signal.SIGINT, self.sig_handler) def run(self): # Init Radio interface self.radio = radio_if(self.phy_args, self.phy_sample_rate, self.phy_rx_gain, self.phy_tx_gain, self.phy_ppm, self.phy_rx_antenna, self.phy_tx_antenna, self.bind_addr, self.remote_addr, self.base_port) # Optional frequency offset if self.phy_freq_offset_hz is not None: self.radio.freq_offset_hz = self.phy_freq_offset_hz # Power measurement emulation # Noise: -120 .. -105 # BTS: -75 .. -50 self.pm = fake_pm(-120, -105, -75, -50) # Init TRX CTRL interface self.server = ctrl_if_bb( self.remote_addr, self.base_port + 101, self.bind_addr, self.base_port + 1, self.radio, self.pm) print("[i] Init complete") # Enter main loop while True: self.server.loop() def shutdown(self): print("[i] Shutting down...") self.radio.shutdown() def sig_handler(self, signum, frame): print("Signal %d received" % signum) if signum is signal.SIGINT: self.shutdown() sys.exit(0) def eng_float(value): try: return eng_notation.str_to_num(value) except: raise ArgumentTypeError("invalid engineering notation " "value: {0}".format(value)) def parse_argv(): parser = ArgumentParser(prog = "grgsm_trx") # TRX interface specific parser.add_argument("-i", "--remote-addr", dest = "remote_addr", type = str, default = "127.0.0.1", help = "Set remote address (default %(default)s)") parser.add_argument("-b", "--bind-addr", dest = "bind_addr", type = str, default = "0.0.0.0", help = "Set bind address (default %(default)s)") parser.add_argument("-p", "--base_port", dest = "base_port", type = int, default = 6700, help = "Set base port number (default %(default)s)") # PHY specific parser.add_argument("-a", "--args", dest = "args", type = str, default = "", help = "Set device arguments") parser.add_argument("-s", "--sample-rate", dest = "sample_rate", type = eng_float, default = radio_if.SAMPLE_RATE, help = "Set samp_rate (default %(default)s)") parser.add_argument("-g", "--rx-gain", dest = "rx_gain", type = float, default = 30, help = "Set RX gain (default %(default)s)") parser.add_argument("-G", "--tx-gain", dest = "tx_gain", type = float, default = 10, help = "Set TX gain (default %(default)s)") parser.add_argument("--rx-antenna", dest = "rx_antenna", type = str, default = "RX2", help = "Set RX antenna (default %(default)s)") parser.add_argument("--tx-antenna", dest = "tx_antenna", type = str, default = "TX/RX", help = "Set TX antenna (default %(default)s)") parser.add_argument("--freq-offset", dest = "freq_offset", type = eng_float, default = 0, help = "Shift baseband freq. (e.g. -500M)") parser.add_argument("--ppm", dest = "ppm", type = float, default = 0, help = "Set frequency correction (default %(default)s)") return parser.parse_args() if __name__ == '__main__': print(COPYRIGHT) argv = parse_argv() app = Application(argv) app.run()