diff --git a/device/device.cpp b/device/device.cpp index 3f578fa..9ad6888 100644 --- a/device/device.cpp +++ b/device/device.cpp @@ -1878,7 +1878,7 @@ bool Device::subscribeLiveData(std::shared_ptr message) if(response) { auto statusMsg = std::dynamic_pointer_cast(response); - if(statusMsg->requestedCommand == message->cmd) { + if(statusMsg && statusMsg->requestedCommand == message->cmd) { switch(statusMsg->status) { case LiveDataStatus::SUCCESS: return true; diff --git a/platform/posix/firmio.cpp b/platform/posix/firmio.cpp index 0f62ee3..e432fa6 100644 --- a/platform/posix/firmio.cpp +++ b/platform/posix/firmio.cpp @@ -42,9 +42,13 @@ void FirmIO::Find(std::vector& found) { Decoder decoder([](APIEvent::Type, APIEvent::Severity) {}); using namespace std::chrono; const auto start = steady_clock::now(); - auto timeout = milliseconds(50); - while(temp.readWait(payload, timeout)) { - timeout -= duration_cast(steady_clock::now() - start); + // Get an absolute wall clock to compare to + const auto overallTimeout = start + milliseconds(500); + while(temp.readWait(payload, milliseconds(50))) { + if(steady_clock::now() > overallTimeout) { + // failed to read out a serial number reponse in time + break; + } if(!packetizer.input(payload)) continue; // A full packet has not yet been read out