drivers/gps: prioritize non-blocking reads over injection (#25535)

This commit is contained in:
Daniel Agar 2025-09-15 19:18:45 -04:00 committed by GitHub
parent a14cd9ad79
commit 41d3403ec7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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