diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/device.h | 5 | ||||
-rw-r--r-- | include/device_proto.h | 14 |
2 files changed, 18 insertions, 1 deletions
diff --git a/include/device.h b/include/device.h index 768ac32..dc7832d 100644 --- a/include/device.h +++ b/include/device.h @@ -39,6 +39,11 @@ class Device { */ virtual CommError recv(void *packet); + int get_retry_count() { return m_retry_count; } + const; + std::chrono::milliseconds get_retry_timeout() { return m_retry_timeout; } + const; + protected: uint16_t m_vid; uint16_t m_pid; diff --git a/include/device_proto.h b/include/device_proto.h index 142b45b..f2ed84d 100644 --- a/include/device_proto.h +++ b/include/device_proto.h @@ -1,6 +1,7 @@ #ifndef DEVICE_PROTO_H #define DEVICE_PROTO_H #include <utility> +#include <thread> #include <type_traits> #include <stdexcept> #include <string> @@ -179,7 +180,18 @@ class Transaction : semantics::non_constructible { std::string("Device error while sending command ") + std::to_string((int)(status))); - status = dev.recv(&resp); + // FIXME make checks done in device:recv here + int retry = dev.get_retry_count(); + while (retry-- > 0) { + status = dev.recv(&resp); + if (resp.device_status == 0) break; + Log::instance()("Device status is not ready (CRC error?) retrying..", + Loglevel::DEBUG); // FIXME translate device_status to log + Log::instance()("Invalid incoming HID packet:", Loglevel::DEBUG_L2); + Log::instance()((std::string)(resp), Loglevel::DEBUG_L2); + std::this_thread::sleep_for(dev.get_retry_timeout()); + continue; + } if ((int)(status) < 0 && status != CommError::ERR_NO_ERROR) throw std::runtime_error( std::string("Device error while executing command ") + |