diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2018-09-03 16:46:34 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2018-09-03 18:53:52 +0200 |
commit | 49ad7590728880f967dbc31876679a9dbd10d014 (patch) | |
tree | 0314924ca41662d1dd3ee6a1af22f361201fea46 /Transceiver52M | |
parent | 8e498bfd354ad0d6042fd9c88e9ffa1f40ef5ff4 (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
Diffstat (limited to 'Transceiver52M')
-rw-r--r-- | Transceiver52M/device/lms/LMSDevice.cpp | 8 |
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]) |