From b5bf28c204a812f2275f052af8449026c7e1e76c Mon Sep 17 00:00:00 2001 From: Jacob Dahl Date: Mon, 28 Jul 2025 20:16:13 -0800 Subject: [PATCH] platform: serial: add bytesAvailable() function --- platforms/common/Serial.cpp | 5 +++++ .../common/include/px4_platform_common/Serial.hpp | 1 + platforms/nuttx/src/px4/common/SerialImpl.cpp | 12 ++++++++++++ .../nuttx/src/px4/common/include/SerialImpl.hpp | 1 + platforms/posix/include/SerialImpl.hpp | 1 + platforms/posix/src/px4/common/SerialImpl.cpp | 12 ++++++++++++ platforms/qurt/include/SerialImpl.hpp | 1 + platforms/qurt/src/px4/SerialImpl.cpp | 7 +++++++ 8 files changed, 40 insertions(+) diff --git a/platforms/common/Serial.cpp b/platforms/common/Serial.cpp index ca338eb190..88a29667c8 100644 --- a/platforms/common/Serial.cpp +++ b/platforms/common/Serial.cpp @@ -69,6 +69,11 @@ bool Serial::close() return _impl.close(); } +ssize_t Serial::bytesAvailable() +{ + return _impl.bytesAvailable(); +} + ssize_t Serial::read(uint8_t *buffer, size_t buffer_size) { return _impl.read(buffer, buffer_size); diff --git a/platforms/common/include/px4_platform_common/Serial.hpp b/platforms/common/include/px4_platform_common/Serial.hpp index fb45b52385..cad568d134 100644 --- a/platforms/common/include/px4_platform_common/Serial.hpp +++ b/platforms/common/include/px4_platform_common/Serial.hpp @@ -61,6 +61,7 @@ public: bool close(); + ssize_t bytesAvailable(); ssize_t read(uint8_t *buffer, size_t buffer_size); ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_ms = 0); diff --git a/platforms/nuttx/src/px4/common/SerialImpl.cpp b/platforms/nuttx/src/px4/common/SerialImpl.cpp index 904d6124b1..a46c1bd548 100644 --- a/platforms/nuttx/src/px4/common/SerialImpl.cpp +++ b/platforms/nuttx/src/px4/common/SerialImpl.cpp @@ -259,6 +259,18 @@ bool SerialImpl::close() return true; } +ssize_t SerialImpl::bytesAvailable() +{ + if (!_open) { + PX4_ERR("Device not open!"); + return -1; + } + + ssize_t bytes_available = 0; + int ret = ioctl(_serial_fd, FIONREAD, &bytes_available); + return ret >= 0 ? bytes_available : 0; +} + ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size) { if (!_open) { diff --git a/platforms/nuttx/src/px4/common/include/SerialImpl.hpp b/platforms/nuttx/src/px4/common/include/SerialImpl.hpp index 543041bc97..c7fb1ede81 100644 --- a/platforms/nuttx/src/px4/common/include/SerialImpl.hpp +++ b/platforms/nuttx/src/px4/common/include/SerialImpl.hpp @@ -59,6 +59,7 @@ public: bool close(); + ssize_t bytesAvailable(); ssize_t read(uint8_t *buffer, size_t buffer_size); ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0); diff --git a/platforms/posix/include/SerialImpl.hpp b/platforms/posix/include/SerialImpl.hpp index 543041bc97..c7fb1ede81 100644 --- a/platforms/posix/include/SerialImpl.hpp +++ b/platforms/posix/include/SerialImpl.hpp @@ -59,6 +59,7 @@ public: bool close(); + ssize_t bytesAvailable(); ssize_t read(uint8_t *buffer, size_t buffer_size); ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0); diff --git a/platforms/posix/src/px4/common/SerialImpl.cpp b/platforms/posix/src/px4/common/SerialImpl.cpp index 2298c38292..6d9b64a828 100644 --- a/platforms/posix/src/px4/common/SerialImpl.cpp +++ b/platforms/posix/src/px4/common/SerialImpl.cpp @@ -251,6 +251,18 @@ bool SerialImpl::close() return true; } +ssize_t SerialImpl::bytesAvailable() +{ + if (!_open) { + PX4_ERR("Device not open!"); + return -1; + } + + ssize_t bytes_available = 0; + int ret = ioctl(_serial_fd, FIONREAD, &bytes_available); + return ret >= 0 ? bytes_available : 0; +} + ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size) { if (!_open) { diff --git a/platforms/qurt/include/SerialImpl.hpp b/platforms/qurt/include/SerialImpl.hpp index 39c3d63553..469bd6db97 100644 --- a/platforms/qurt/include/SerialImpl.hpp +++ b/platforms/qurt/include/SerialImpl.hpp @@ -58,6 +58,7 @@ public: bool close(); + ssize_t bytesAvailable(); ssize_t read(uint8_t *buffer, size_t buffer_size); ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0); diff --git a/platforms/qurt/src/px4/SerialImpl.cpp b/platforms/qurt/src/px4/SerialImpl.cpp index 7225f32dce..4977b3bd7d 100644 --- a/platforms/qurt/src/px4/SerialImpl.cpp +++ b/platforms/qurt/src/px4/SerialImpl.cpp @@ -158,6 +158,13 @@ bool SerialImpl::close() return true; } +ssize_t SerialImpl::bytesAvailable() +{ + // TODO: + PX4_WARN("bytesAvailable not implemented!"); + return 0; +} + ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size) { if (!_open) {