#!/usr/bin/env python2 # -*- coding: utf-8 -*- # GR-GSM based transceiver # CTRL interface for OsmocomBB # # (C) 2016-2017 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. import grgsm from ctrl_if import ctrl_if class ctrl_if_bb(ctrl_if): def __init__(self, remote_addr, remote_port, bind_port, tb, pm): print("[i] Init CTRL interface") ctrl_if.__init__(self, remote_addr, remote_port, bind_port) # Set link to the follow graph (top block) self.tb = tb # Power measurement self.pm = pm def parse_cmd(self, request): # Power control if self.verify_cmd(request, "POWERON", 0): print("[i] Recv POWERON CMD") # Ensure transceiver isn't working if self.tb.trx_started: print("[!] Transceiver already started") return -1 print("[i] Starting transceiver...") self.tb.trx_started = True self.tb.start() return 0 elif self.verify_cmd(request, "POWEROFF", 0): print("[i] Recv POWEROFF cmd") # TODO: flush all buffers between blocks if self.tb.trx_started: print("[i] Stopping transceiver...") self.tb.trx_started = False self.tb.set_ta(0) self.tb.stop() self.tb.wait() return 0 # Gain control elif self.verify_cmd(request, "SETRXGAIN", 1): print("[i] Recv SETRXGAIN cmd") # TODO: check gain value gain = int(request[1]) self.tb.set_rx_gain(gain) return 0 elif self.verify_cmd(request, "SETTXGAIN", 1): print("[i] Recv SETTXGAIN cmd") # TODO: check gain value gain = int(request[1]) self.tb.set_tx_gain(gain) return 0 # Tuning Control elif self.verify_cmd(request, "RXTUNE", 1): print("[i] Recv RXTUNE cmd") # TODO: check freq range freq = int(request[1]) * 1000 self.tb.set_rx_freq(freq) return 0 elif self.verify_cmd(request, "TXTUNE", 1): print("[i] Recv TXTUNE cmd") # TODO: check freq range freq = int(request[1]) * 1000 self.tb.set_tx_freq(freq) return 0 # Timeslot management elif self.verify_cmd(request, "SETSLOT", 2): print("[i] Recv SETSLOT cmd") # Obtain TS index tn = int(request[1]) if tn not in range(0, 8): print("[!] TS index should be in range: 0..7") return -1 # Ignore timeslot type for now config = int(request[2]) print("[i] Configure timeslot filter to: %s" % ("drop all" if config == 0 else "TS %d" % tn)) if config == 0: # Value 0 means 'drop all' self.tb.ts_filter.set_policy( grgsm.FILTER_POLICY_DROP_ALL) else: self.tb.ts_filter.set_policy( grgsm.FILTER_POLICY_DEFAULT) self.tb.ts_filter.set_tn(tn) return 0 # Power measurement elif self.verify_cmd(request, "MEASURE", 1): print("[i] Recv MEASURE cmd") # TODO: check freq range meas_freq = int(request[1]) * 1000 # HACK: send fake low power values # until actual power measurement is implemented meas_dbm = str(self.pm.measure(meas_freq)) return (0, [meas_dbm]) # Timing Advance control elif self.verify_cmd(request, "SETTA", 1): print("[i] Recv SETTA cmd") # Check TA range ta = int(request[1]) if ta < 0 or ta > 63: print("[!] TA value must be in range: 0..63") return -1 self.tb.set_ta(ta) return 0 # Misc elif self.verify_cmd(request, "ECHO", 0): print("[i] Recv ECHO cmd") return 0 # Wrong / unknown command else: print("[!] Wrong request on CTRL interface") return -1