Transceiver52M: Set variable thread priority levels

The transceiver and underlying device drivers are threaded. use
the following priority levels.

0.50 - UHD driver internal threads
0.45 - Receive device drive thread
0.44 - Transmit device drive thread
0.43 - UHD asynchronous update thread (error reporting)
0.42 - Receive burst processing thread(s)

Signed-off-by: Thomas Tsou <tom@tsou.cc>
diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp
index 2d4a3cb..6e446f3 100644
--- a/Transceiver52M/Transceiver.cpp
+++ b/Transceiver52M/Transceiver.cpp
@@ -800,6 +800,8 @@
 
   delete chan;
 
+  trx->setPriority(0.42);
+
   while (1) {
     trx->driveReceiveFIFO(num);
     pthread_testcancel();
@@ -809,7 +811,7 @@
 
 void *RxLowerLoopAdapter(Transceiver *transceiver)
 {
-  transceiver->setPriority();
+  transceiver->setPriority(0.45);
 
   while (1) {
     transceiver->driveReceiveRadio();
@@ -820,6 +822,8 @@
 
 void *TxLowerLoopAdapter(Transceiver *transceiver)
 {
+  transceiver->setPriority(0.44);
+
   while (1) {
     transceiver->driveTxFIFO();
     pthread_testcancel();
diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h
index 4356ef2..d1a6ec9 100644
--- a/Transceiver52M/Transceiver.h
+++ b/Transceiver52M/Transceiver.h
@@ -235,7 +235,7 @@
   void reset();
 
   /** set priority on current thread */
-  void setPriority() { mRadioInterface->setPriority(); }
+  void setPriority(float prio = 0.5) { mRadioInterface->setPriority(prio); }
 
 };
 
diff --git a/Transceiver52M/UHDDevice.cpp b/Transceiver52M/UHDDevice.cpp
index 224ebd0..660bce4 100644
--- a/Transceiver52M/UHDDevice.cpp
+++ b/Transceiver52M/UHDDevice.cpp
@@ -218,7 +218,7 @@
 	bool start();
 	bool stop();
 	void restart(uhd::time_spec_t ts);
-	void setPriority();
+	void setPriority(float prio);
 	enum TxWindowType getWindowType() { return tx_window; }
 
 	int readSamples(std::vector<short *> &bufs, int len, bool *overrun,
@@ -308,6 +308,8 @@
 
 void *async_event_loop(uhd_device *dev)
 {
+	dev->setPriority(0.43);
+
 	while (1) {
 		dev->recv_async_msg();
 		pthread_testcancel();
@@ -673,8 +675,6 @@
 		return false;
 	}
 
-	setPriority();
-
 	// Register msg handler
 	uhd::msg::register_handler(&uhd_msg_handler);
 
@@ -703,9 +703,9 @@
 	return true;
 }
 
-void uhd_device::setPriority()
+void uhd_device::setPriority(float prio)
 {
-	uhd::set_thread_priority_safe();
+	uhd::set_thread_priority_safe(prio);
 	return;
 }
 
diff --git a/Transceiver52M/USRPDevice.h b/Transceiver52M/USRPDevice.h
index cfc6222..c9f98ed 100644
--- a/Transceiver52M/USRPDevice.h
+++ b/Transceiver52M/USRPDevice.h
@@ -108,7 +108,7 @@
   bool stop();
 
   /** Set priority not supported */
-  void setPriority() { }
+  void setPriority(float prio = 0.5) { }
 
   enum TxWindowType getWindowType() { return TX_WINDOW_USRP1; }
 
diff --git a/Transceiver52M/radioDevice.h b/Transceiver52M/radioDevice.h
index e577bc5..19b5a88 100644
--- a/Transceiver52M/radioDevice.h
+++ b/Transceiver52M/radioDevice.h
@@ -52,7 +52,7 @@
   virtual enum TxWindowType getWindowType()=0;
 
   /** Enable thread priority */
-  virtual void setPriority()=0;
+  virtual void setPriority(float prio = 0.5) = 0;
 
   /**
 	Read samples from the radio.
diff --git a/Transceiver52M/radioInterface.h b/Transceiver52M/radioInterface.h
index 1e58ecb..124cdc3 100644
--- a/Transceiver52M/radioInterface.h
+++ b/Transceiver52M/radioInterface.h
@@ -133,7 +133,7 @@
   double fullScaleOutputValue();
 
   /** set thread priority on current thread */
-  void setPriority() { mRadio->setPriority(); }
+  void setPriority(float prio = 0.5) { mRadio->setPriority(prio); }
 
   /** get transport window type of attached device */ 
   enum RadioDevice::TxWindowType getWindowType() { return mRadio->getWindowType(); }