python/trx: fork RadioInterfaceUHD from RadioInterface

Change-Id: I1644a3f6b8da0d5f2a1a133058269e5383948fda
diff --git a/python/trx/radio_if.py b/python/trx/radio_if.py
index 4c678e7..c4d4bd1 100644
--- a/python/trx/radio_if.py
+++ b/python/trx/radio_if.py
@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 
 # GR-GSM based transceiver
-# Follow graph implementation
+# Generic (device independent) flow-graph implementation
 #
 # (C) 2016-2019 by Vadim Yanitskiy <axilirator@gmail.com>
 # (C) 2017      by Piotr Krysik <ptrkrysik@gmail.com>
@@ -33,7 +33,6 @@
 from gnuradio import eng_notation
 from gnuradio import digital
 from gnuradio import blocks
-from gnuradio import uhd
 from gnuradio import gr
 
 from gnuradio import filter
@@ -57,11 +56,6 @@
 	GSM_SYM_RATE = (1.0 / GSM_SYM_PERIOD_uS) * 1e6
 	SAMPLE_RATE = GSM_SYM_RATE * osr
 
-	# FIXME: shall be measured (automatically?) for
-	# particular device and particular clock rate.
-	# The current value is measured for USRP B2X0 at 26e6.
-	delay_correction = (285.616 + 2 * GSM_SYM_PERIOD_uS) * 1e-6
-
 	# Dummy freq. value that is used during initialization
 	# basically, the DL freq. of ARFCN 0
 	DUMMY_FREQ = 935e6
@@ -83,6 +77,10 @@
 		self.ppm = phy_ppm
 		self.freq_offset = phy_freq_offset
 
+		self.phy_args = phy_args
+		self.rx_antenna = phy_rx_antenna
+		self.tx_antenna = phy_tx_antenna
+
 		gr.top_block.__init__(self, "GR-GSM TRX")
 
 		# TRX Burst Interface
@@ -91,15 +89,7 @@
 			str(trx_base_port))
 
 		# RX path definition
-		self.phy_src = uhd.usrp_source(phy_args,
-			uhd.stream_args(cpu_format="fc32",
-				channels=range(1)))
-
-		self.phy_src.set_clock_rate(26e6, uhd.ALL_MBOARDS)
-		self.phy_src.set_antenna(phy_rx_antenna, 0)
-		self.phy_src.set_samp_rate(phy_sample_rate)
-		self.phy_src.set_bandwidth(650e3, 0)
-		self.phy_src.set_gain(phy_rx_gain)
+		self.phy_init_source()
 
 		self.msg_to_tag_src = grgsm.msg_to_tag()
 
@@ -115,7 +105,7 @@
 
 		# Connections
 		self.connect(
-			(self.phy_src, 0),
+			(self._phy_src, 0),
 			(self.msg_to_tag_src, 0))
 
 		self.connect(
@@ -140,18 +130,11 @@
 
 
 		# TX Path Definition
-		self.phy_sink = uhd.usrp_sink(phy_args,
-			uhd.stream_args(cpu_format="fc32",
-				channels=range(1)), "packet_len")
-
-		self.phy_sink.set_clock_rate(26e6, uhd.ALL_MBOARDS)
-		self.phy_sink.set_antenna(phy_tx_antenna, 0)
-		self.phy_sink.set_samp_rate(phy_sample_rate)
-		self.phy_sink.set_gain(self.tx_gain)
+		self.phy_init_sink()
 
 		self.tx_time_setter = grgsm.txtime_setter(
 			0xffffffff, 0, 0, 0, 0, 0,
-			self.delay_correction + self.GSM_UL_DL_SHIFT_uS * 1e-6)
+			self.phy_proc_delay + self.GSM_UL_DL_SHIFT_uS * 1e-6)
 
 		self.tx_burst_proc = grgsm.preprocess_tx_burst()
 
@@ -200,7 +183,7 @@
 
 		self.connect(
 			(self.rotator_sink, 0),
-			(self.phy_sink, 0))
+			(self._phy_sink, 0))
 
 
 		# RX & TX synchronization
@@ -245,11 +228,11 @@
 			(self.dict_toggle_sign, 'dict_out'),
 			(self.msg_to_tag_sink, 'msg'))
 
+	def phy_init_source(self):
+		raise NotImplementedError
 
-		# Some UHD devices (such as UmTRX) do start the clock
-		# not from 0, so it's required to reset it manually.
-		# Resetting UHD source will also affect the sink.
-		self.phy_src.set_time_now(uhd.time_spec(0.0))
+	def phy_init_sink(self):
+		raise NotImplementedError
 
 	def shutdown(self):
 		print("[i] Shutdown Radio interface")
@@ -281,9 +264,10 @@
 			print("[#] Shifting RX freq. to %s (offset is %s)"
 				% (eng_notation.num_to_str(fc),
 					eng_notation.num_to_str(self.freq_offset)))
-		self.phy_src.set_center_freq(fc, 0)
+
 		self.rotator_src.set_phase_inc(self.calc_phase_inc(fc))
 		self.gsm_clck_ctrl.set_fc(fc)
+		self.phy_set_rx_freq(fc)
 		self.rx_freq = fc
 
 	def set_tx_freq(self, fc):
@@ -292,16 +276,17 @@
 			print("[#] Shifting TX freq. to %s (offset is %s)"
 				% (eng_notation.num_to_str(fc),
 					eng_notation.num_to_str(self.freq_offset)))
-		self.phy_sink.set_center_freq(fc, 0)
+
 		self.rotator_sink.set_phase_inc(-self.calc_phase_inc(fc))
+		self.phy_set_tx_freq(fc)
 		self.tx_freq = fc
 
 	def set_rx_gain(self, gain):
-		self.phy_src.set_gain(gain, 0)
+		self.phy_set_rx_gain(gain)
 		self.rx_gain = gain
 
 	def set_tx_gain(self, gain):
-		self.phy_sink.set_gain(gain, 0)
+		self.phy_set_tx_gain(gain)
 		self.tx_gain = gain
 
 	def set_slot(self, slot, config):