#!/usr/bin/env python2 # -*- coding: utf-8 -*- # GR-GSM based transceiver # Transceiver implementation # # (C) 2018-2019 by Vadim Yanitskiy # # 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)