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

from argparse import ArgumentParser
from argparse import ArgumentTypeError
from gnuradio import eng_notation

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

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 Application:
	def __init__(self, argv):
		self.remote_addr = argv.remote_addr
		self.bind_addr = argv.bind_addr
		self.base_port = argv.base_port
		self.phy_args = argv.args
		self.phy_sample_rate = argv.sample_rate
		self.phy_rx_gain = argv.rx_gain
		self.phy_tx_gain = argv.tx_gain
		self.phy_rx_antenna = argv.rx_antenna
		self.phy_tx_antenna = argv.tx_antenna
		self.phy_freq_offset = argv.freq_offset
		self.phy_ppm = argv.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 eng_float(value):
	try:
		return eng_notation.str_to_num(value)
	except:
		raise ArgumentTypeError("invalid engineering notation "
			"value: {0}".format(value))

def parse_argv():
	parser = ArgumentParser(prog = "grgsm_trx")

	# TRX interface 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")
	parser.add_argument("-s", "--sample-rate",
		dest = "sample_rate", type = eng_float,
		default = radio_if.SAMPLE_RATE,
		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 (default %(default)s)")
	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 = eng_float, default = 0,
		help = "Shift baseband freq. (e.g. -500M)")
	parser.add_argument("--ppm",
		dest = "ppm", type = float, default = 0,
		help = "Set frequency correction (default %(default)s)")

	return parser.parse_args()

if __name__ == '__main__':
	print(COPYRIGHT)
	argv = parse_argv()
	app = Application(argv)
	app.run()
