diff options
Diffstat (limited to 'python/trx/transceiver.py')
-rw-r--r-- | python/trx/transceiver.py | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/python/trx/transceiver.py b/python/trx/transceiver.py new file mode 100644 index 0000000..837a61f --- /dev/null +++ b/python/trx/transceiver.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +# GR-GSM based transceiver +# Transceiver implementation +# +# (C) 2018-2019 by Vadim Yanitskiy <axilirator@gmail.com> +# +# 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. + +from ctrl_if_bb import CTRLInterfaceBB + +class Transceiver: + """ Base transceiver implementation. + + Represents a single transceiver, that can be used as for the BTS side, + as for the MS side. Each individual instance of Transceiver unifies + three basic interfaces built on three independent UDP connections: + + - CLCK (base port + 100/0) - clock indications from TRX to L1, + - CTRL (base port + 101/1) - control interface for L1, + - DATA (base port + 102/2) - bidirectional data interface for bursts. + + A transceiver can be either in active (i.e. working), or in idle mode. + + NOTE: both CLCK and DATA interfaces are handled by the flow-graph, + (see RadioInterface), so we only initialize CTRL interface. + + """ + + def __init__(self, bind_addr, remote_addr, base_port, radio_if): + # Connection info + self.remote_addr = remote_addr + self.bind_addr = bind_addr + self.base_port = base_port + + # Execution state (running or idle) + self.running = False + + # Radio interface (handles both CLCK and DATA interfaces) + self.radio_if = radio_if + + # Init CTRL interface + self.ctrl_if = CTRLInterfaceBB(self, + remote_addr, base_port + 101, + bind_addr, base_port + 1) + + def start(self): + # Check execution state + if self.running: + print("[!] Transceiver is already started") + return False + + # Make sure that Radio interface is ready, i.e. + # all parameters (e.g. RX / RX freq) are set. + if not self.radio_if.ready: + print("[!] RadioInterface is not ready") + return False + + print("[i] Starting transceiver...") + self.radio_if.start() + self.running = True + + return True + + def stop(self): + # POWEROFF is also used to reset transceiver, + # so we should not complain that it isn't running. + if not self.running: + print("[i] Resetting transceiver") + self.radio_if.reset() + return + + print("[i] Stopping transceiver...") + + # TODO: flush all buffers between blocks + self.radio_if.stop() + self.radio_if.wait() + + self.running = False + + def measure(self, freq): + # TODO: transceiver should be in idle mode + return self.radio_if.measure(freq) |