From 41d3403ec776778dfff0c8d8a278f4c8fca98ede Mon Sep 17 00:00:00 2001 From: Daniel Agar Date: Mon, 15 Sep 2025 19:18:45 -0400 Subject: [PATCH] drivers/gps: prioritize non-blocking reads over injection (#25535) --- src/drivers/gps/gps.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/drivers/gps/gps.cpp b/src/drivers/gps/gps.cpp index eae1732f0a..af6508f8cf 100644 --- a/src/drivers/gps/gps.cpp +++ b/src/drivers/gps/gps.cpp @@ -469,10 +469,16 @@ int GPS::pollOrRead(uint8_t *buf, size_t buf_length, int timeout) const int max_timeout = 50; int timeout_adjusted = math::min(max_timeout, timeout); - handleInjectDataTopic(); - if (_interface == GPSHelper::Interface::UART) { - ret = _uart.readAtLeast(buf, buf_length, math::min(character_count, buf_length), timeout_adjusted); + + const ssize_t read_at_least = math::min(character_count, buf_length); + + // handle injection data before read if caught up + if (_uart.bytesAvailable() < read_at_least) { + handleInjectDataTopic(); + } + + ret = _uart.readAtLeast(buf, buf_length, read_at_least, timeout_adjusted); if (ret > 0) { _num_bytes_read += ret; @@ -483,6 +489,8 @@ int GPS::pollOrRead(uint8_t *buf, size_t buf_length, int timeout) } else if ((_interface == GPSHelper::Interface::SPI) && (_spi_fd >= 0)) { + handleInjectDataTopic(); + //Poll only for the SPI data. In the same thread we also need to handle orb messages, //so ideally we would poll on both, the SPI fd and orb subscription. Unfortunately the //two pollings use different underlying mechanisms (at least under posix), which makes this