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

# GR-GSM based transceiver
#
# (C) 2016-2018 by Vadim Yanitskiy <axilirator@gmail.com>
# (C) 2017-2018 by Piotr Krysik <ptrkrysik@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 signal
import getopt
import sys

from gnuradio import eng_notation

from grgsm.trx import ctrl_if_bb
from grgsm.trx import radio_if
from grgsm.trx import fake_pm
from argparse import ArgumentParser

COPYRIGHT = \
	"Copyright (C) 2016-2018 by Vadim Yanitskiy <axilirator@gmail.com>\n" \
	"Copyright (C) 2017-2018 by Piotr Krysik <ptrkrysik@gmail.com>\n" \
	"License GPLv2+: GNU GPL version 2 or later " \
	"<http://gnu.org/licenses/gpl.html>\n" \
	"This is free software: you are free to change and redistribute it.\n" \
	"There is NO WARRANTY, to the extent permitted by law.\n"

class grgsm_trx:
	def __init__(self,
				 remote_addr,
				 bind_addr,
				 base_port,
				 args,
				 sample_rate,
				 rx_gain,
				 tx_gain,
				 rx_antenna,
				 tx_antenna,
				 freq_offset,
				 ppm):
		self.remote_addr = remote_addr
		self.bind_addr = bind_addr
		self.base_port = base_port
		self.phy_args = args
		self.phy_sample_rate = sample_rate
		self.phy_rx_gain = rx_gain
		self.phy_tx_gain = tx_gain
		self.phy_rx_antenna = rx_antenna
		self.phy_tx_antenna = tx_antenna
		self.phy_freq_offset = freq_offset
		self.phy_ppm = ppm

		# Set up signal handlers
		signal.signal(signal.SIGINT, self.sig_handler)

	def run(self):
		# Init Radio interface
		self.radio = radio_if(self.phy_args, self.phy_sample_rate,
			self.phy_rx_gain, self.phy_tx_gain, self.phy_ppm,
			self.phy_rx_antenna, self.phy_tx_antenna, self.phy_freq_offset,
			self.bind_addr, self.remote_addr,
			self.base_port)

		# Power measurement emulation
		# Noise: -120 .. -105
		# BTS: -75 .. -50
		self.pm = fake_pm(-120, -105, -75, -50)

		# Init TRX CTRL interface
		self.server = ctrl_if_bb(
			self.remote_addr, self.base_port + 101,
			self.bind_addr, self.base_port + 1,
			self.radio, self.pm)

		print("[i] Init complete")

		# Enter main loop
		while True:
			self.server.loop()

	def shutdown(self):
		print("[i] Shutting down...")
		self.radio.shutdown()

	def sig_handler(self, signum, frame):
		print("Signal %d received" % signum)
		if signum is signal.SIGINT:
			self.shutdown()
			sys.exit(0)

def parse_args():
	description = 'Burst transceiver for GSM Mobile Station'
	parser = ArgumentParser(prog="grgsm_trx", usage='%(prog)s [options]',
		description=description)
	# TRX specific
	parser.add_argument("-i", "--remote-addr", dest="remote_addr", type=str,
		default='127.0.0.1',
		help="Set remote address default=%(default)s")
	parser.add_argument("-b", "--bind-addr", dest="bind_addr", type=str,
		default='0.0.0.0',
		help="Set bind address default=%(default)s")
	parser.add_argument(
		"-p", "--base_port", dest="base_port", type=int,
		default=6700,
		help="Set base port number default=%(default)s")

	# PHY specific
	parser.add_argument("-a", "--args", dest="args", type=str,
		default="",
		help="Set Device Arguments default=%(default)s")
	parser.add_argument("-s", "--sample-rate", dest="sample_rate", type=float,
		default=1083333.3333333333,
		help="Set samp_rate default=%(default)s")
	parser.add_argument("-g", "--rx-gain", dest="rx_gain", type=float,
		default=30,
		help="Set RX gain default=%(default)s")
	parser.add_argument("-G", "--tx-gain", dest="tx_gain", type=float,
		default=10,
		help="Set TX gain default=%(default)s")
	parser.add_argument("--rx-antenna", dest="rx_antenna", type=str,
		default="RX2",
		help="Set RX antenna")
	parser.add_argument("--tx-antenna", dest="tx_antenna", type=str,
		default='TX/RX',
		help="Set TX antenna default=%(default)s")
	parser.add_argument(
		"--freq-offset", dest="freq_offset", type=float,
		default=0,
		help="Shift Tx and Rx frequencies default=%(default)s")
	parser.add_argument("--ppm", dest="ppm", type=float,
		default=0,
		help="Set ppm default=%(default)s")

	return parser.parse_args()

def main():
	print(COPYRIGHT)
	options = parse_args()
	app = grgsm_trx(
			remote_addr=options.remote_addr,
			bind_addr=options.bind_addr,
			base_port=options.base_port,
			args=options.args,
			sample_rate=options.sample_rate,
			rx_gain=options.rx_gain,
			tx_gain=options.tx_gain,
			rx_antenna=options.rx_antenna,
			tx_antenna=options.tx_antenna,
			freq_offset=options.freq_offset,
			ppm=options.ppm)
	app.run()

if __name__ == '__main__':
	main()
