#!/usr/bin/env python2
# -*- coding: utf-8 -*-

# GR-GSM based transceiver
# CTRL interface for OsmocomBB
#
# (C) 2016-2017 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.

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 shutdown(self):
		print("[i] Shutdown CTRL interface")
		ctrl_if.shutdown(self)

	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

			# Ensure transceiver is ready to start
			if not self.tb.check_available():
				print("[!] Transceiver isn't ready to start")
				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.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_fc(freq)

			return 0

		elif self.verify_cmd(request, "TXTUNE", 1):
			print("[i] Recv TXTUNE cmd")

			# TODO: is not implemented yet
			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.gsm_ts_filter.set_policy(
					grgsm.FILTER_POLICY_DROP_ALL)
			else:
				self.tb.gsm_ts_filter.set_policy(
					grgsm.FILTER_POLICY_DEFAULT)
				self.tb.gsm_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])

		# 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
