From 216fd858e82d06f44718d3ad1efb45da939b98d1 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 cc303d5c3b..1497b9ba42 100644 --- a/src/drivers/gps/gps.cpp +++ b/src/drivers/gps/gps.cpp @@ -472,10 +472,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; @@ -486,6 +492,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