#!/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)
