ms: fix startup & shutdown of blade

One of the mystery bugs was that the blade ms needed two starts
after powercycling the bladerf due to transfer timeouts.
This is now fixed.

Change-Id: I1cd8790191790f4861a70bc55c8f4c9993fa10c8
diff --git a/Transceiver52M/ms/bladerf_specific.h b/Transceiver52M/ms/bladerf_specific.h
index 78c51ab..85a2ea0 100644
--- a/Transceiver52M/ms/bladerf_specific.h
+++ b/Transceiver52M/ms/bladerf_specific.h
@@ -293,10 +293,10 @@
 		setRxGain(rxgain, 0);
 		setTxGain(txgain, 0);
 		usleep(1000);
-		blade_check(bladerf_enable_module, dev, BLADERF_MODULE_RX, true);
-		usleep(1000);
-		blade_check(bladerf_enable_module, dev, BLADERF_MODULE_TX, true);
-		usleep(1000);
+
+		bladerf_set_stream_timeout(dev, BLADERF_TX, 10);
+		bladerf_set_stream_timeout(dev, BLADERF_RX, 10);
+
 		blade_check(bladerf_init_stream, &rx_stream, dev, getrxcb(rxh), &buf_mgmt.rx_samples, BLADE_NUM_BUFFERS,
 			    BLADERF_FORMAT_SC16_Q11_META, BLADE_BUFFER_SIZE, NUM_TRANSFERS, (void *)this);
 
@@ -308,15 +308,16 @@
 			buf_mgmt.bufptrqueue.spsc_push(&cur_buffer[i]);
 		}
 
-
-		usleep(1000);
-
-		// bladerf_set_stream_timeout(dev, BLADERF_TX, 4);
-		// bladerf_set_stream_timeout(dev, BLADERF_RX, 4);
-
 		return 0;
 	}
 
+	void actually_enable_streams()
+	{
+		blade_check(bladerf_enable_module, dev, BLADERF_MODULE_RX, true);
+		usleep(1000);
+		blade_check(bladerf_enable_module, dev, BLADERF_MODULE_TX, true);
+	}
+
 	bool tuneTx(double freq, size_t chan = 0)
 	{
 		msleep(15);
@@ -418,8 +419,9 @@
 	auto get_rx_burst_handler_fn(bh_fn_t burst_handler)
 	{
 		auto fn = [this] {
-			int status;
-			status = bladerf_stream(rx_stream, BLADERF_RX_X1);
+			int status = 0;
+			if (!stop_me_flag)
+				status = bladerf_stream(rx_stream, BLADERF_RX_X1);
 			if (status < 0)
 				std::cerr << "rx stream error! " << bladerf_strerror(status) << std::endl;
 
@@ -430,8 +432,9 @@
 	auto get_tx_burst_handler_fn(bh_fn_t burst_handler)
 	{
 		auto fn = [this] {
-			int status;
-			status = bladerf_stream(tx_stream, BLADERF_TX_X1);
+			int status = 0;
+			if (!stop_me_flag)
+				status = bladerf_stream(tx_stream, BLADERF_TX_X1);
 			if (status < 0)
 				std::cerr << "rx stream error! " << bladerf_strerror(status) << std::endl;
 
@@ -442,9 +445,15 @@
 
 	void submit_burst_ts(blade_sample_type *buffer, int len, uint64_t ts)
 	{
-		//get empty bufer from list
 		tx_buf_q_type::elem_t rcd;
 
+		// exit by submitting a dummy buffer to assure the libbladerf stream mutex is happy (thread!)
+		if (!buffer) {
+			bladerf_submit_stream_buffer(tx_stream, (void *)BLADERF_STREAM_SHUTDOWN, 1000);
+			return;
+		}
+
+		//get empty bufer from list
 		while (!buf_mgmt.bufptrqueue.spsc_pop(&rcd))
 			buf_mgmt.bufptrqueue.spsc_prep_pop();
 		assert(rcd != nullptr);