#!/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_hz = 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.bind_addr, self.remote_addr,
			self.base_port)

		# Optional frequency offset
		if self.phy_freq_offset_hz is not None:
			self.radio.freq_offset_hz = self.phy_freq_offset_hz

		# 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()
