aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2018-09-03 16:46:34 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2018-09-03 18:53:52 +0200
commit49ad7590728880f967dbc31876679a9dbd10d014 (patch)
tree0314924ca41662d1dd3ee6a1af22f361201fea46
parent8e498bfd354ad0d6042fd9c88e9ffa1f40ef5ff4 (diff)
lms: Return error on device read timeout
If LImeSDR device is unplugged or its fw crashes during operation, reading from the device will fail and will first receive short reads and finally 0 byte reads. Let's quickly notify these events to upper layers instead of trying to process the buffer and checking timestamps for something we know it's already not useful. Related: OS#3340 Change-Id: Ib1af8cdd6cdadf581b039882add4049eea45a0f7
-rw-r--r--Transceiver52M/device/lms/LMSDevice.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/Transceiver52M/device/lms/LMSDevice.cpp b/Transceiver52M/device/lms/LMSDevice.cpp
index 881cfb7..d8220ea 100644
--- a/Transceiver52M/device/lms/LMSDevice.cpp
+++ b/Transceiver52M/device/lms/LMSDevice.cpp
@@ -511,11 +511,13 @@ int LMSDevice::readSamples(std::vector < short *>&bufs, int len, bool * overrun,
for (i = 0; i<chans; i++) {
thread_enable_cancel(false);
rc = LMS_RecvStream(&m_lms_stream_rx[i], bufs[i], len, &rx_metadata, 100);
- if (timestamp != (TIMESTAMP)rx_metadata.timestamp)
- LOGC(DDEV, ALERT) << "chan "<< i << " recv buffer of len " << rc << " expect " << std::hex << timestamp << " got " << std::hex << (TIMESTAMP)rx_metadata.timestamp << " (" << std::hex << rx_metadata.timestamp <<") diff=" << rx_metadata.timestamp - timestamp;
if (rc != len) {
- LOGC(DDEV, ALERT) << "LMS: Device receive timed out";
+ LOGC(DDEV, ALERT) << "LMS: Device receive timed out (" << rc << " vs exp " << len << ").";
+ thread_enable_cancel(true);
+ return -1;
}
+ if (timestamp != (TIMESTAMP)rx_metadata.timestamp)
+ LOGC(DDEV, ALERT) << "chan "<< i << " recv buffer of len " << rc << " expect " << std::hex << timestamp << " got " << std::hex << (TIMESTAMP)rx_metadata.timestamp << " (" << std::hex << rx_metadata.timestamp <<") diff=" << rx_metadata.timestamp - timestamp;
if (LMS_GetStreamStatus(&m_lms_stream_rx[i], &status) == 0) {
if (status.underrun > m_last_rx_underruns[i])