diff --git a/makefiles/pseudomodules.inc.mk b/makefiles/pseudomodules.inc.mk index 063eb10722..c2a03b2d4a 100644 --- a/makefiles/pseudomodules.inc.mk +++ b/makefiles/pseudomodules.inc.mk @@ -152,6 +152,7 @@ PSEUDOMODULES += sock_udp PSEUDOMODULES += socket_zep_hello PSEUDOMODULES += soft_uart_modecfg PSEUDOMODULES += stdin +PSEUDOMODULES += stdio_available PSEUDOMODULES += stdio_cdc_acm PSEUDOMODULES += stdio_ethos PSEUDOMODULES += stdio_uart_rx diff --git a/makefiles/stdio.inc.mk b/makefiles/stdio.inc.mk index 63f4ec8e86..477bb6d97e 100644 --- a/makefiles/stdio.inc.mk +++ b/makefiles/stdio.inc.mk @@ -17,6 +17,7 @@ endif ifneq (,$(filter stdio_cdc_acm,$(USEMODULE))) USEMODULE += usbus_cdc_acm USEMODULE += isrpipe + USEMODULE += stdio_available endif ifneq (,$(filter stdio_rtt,$(USEMODULE))) @@ -37,6 +38,7 @@ endif ifneq (,$(filter stdio_uart_rx,$(USEMODULE))) USEMODULE += isrpipe USEMODULE += stdio_uart + USEMODULE += stdio_available endif ifneq (,$(filter stdio_uart,$(USEMODULE))) diff --git a/sys/Kconfig.stdio b/sys/Kconfig.stdio index f031cb0f43..b204e9b0fd 100644 --- a/sys/Kconfig.stdio +++ b/sys/Kconfig.stdio @@ -49,10 +49,16 @@ config MODULE_STDIO_UART_RX bool depends on MODULE_STDIO_UART select MODULE_ISRPIPE + select MODULE_STDIO_AVAILABLE default y if MODULE_STDIN help Reception when using UART-based STDIO needs to be enabled. +config MODULE_STDIO_AVAILABLE + bool + help + Indicates that the implementation supports function stdio_available + config MODULE_PRINTF_FLOAT bool "Float support in printf" diff --git a/sys/include/stdio_base.h b/sys/include/stdio_base.h index e76bd2ff19..d9a972064f 100644 --- a/sys/include/stdio_base.h +++ b/sys/include/stdio_base.h @@ -25,6 +25,8 @@ #include +#include "kernel_defines.h" + #ifdef __cplusplus extern "C" { #endif @@ -34,6 +36,18 @@ extern "C" { */ void stdio_init(void); +#if IS_USED(MODULE_STDIO_AVAILABLE) || DOXYGEN +/** + * @brief Get the number of bytes available for reading from stdio. + * + * @warning This function is only available if the implementation supports + * it and the @c stdio_available module is enabled. + * + * @return number of available bytes + */ +int stdio_available(void); +#endif + /** * @brief read @p len bytes from stdio uart into @p buffer * diff --git a/sys/stdio_uart/stdio_uart.c b/sys/stdio_uart/stdio_uart.c index 21f715be5b..be6cd8e9b7 100644 --- a/sys/stdio_uart/stdio_uart.c +++ b/sys/stdio_uart/stdio_uart.c @@ -67,6 +67,13 @@ void stdio_init(void) #endif } +#if IS_USED(MODULE_STDIO_AVAILABLE) +int stdio_available(void) +{ + return tsrb_avail(&stdio_uart_isrpipe.tsrb); +} +#endif + ssize_t stdio_read(void* buffer, size_t count) { #ifdef MODULE_STDIO_UART_RX diff --git a/sys/usb/usbus/cdc/acm/Kconfig b/sys/usb/usbus/cdc/acm/Kconfig index 68a8ea1d1f..42c2866452 100644 --- a/sys/usb/usbus/cdc/acm/Kconfig +++ b/sys/usb/usbus/cdc/acm/Kconfig @@ -58,5 +58,6 @@ config MODULE_STDIO_CDC_ACM bool "CDC ACM" depends on MODULE_USBUS_CDC_ACM select MODULE_ISRPIPE + select MODULE_STDIO_AVAILABLE endchoice diff --git a/sys/usb/usbus/cdc/acm/cdc_acm_stdio.c b/sys/usb/usbus/cdc/acm/cdc_acm_stdio.c index 568eddf703..a145b03412 100644 --- a/sys/usb/usbus/cdc/acm/cdc_acm_stdio.c +++ b/sys/usb/usbus/cdc/acm/cdc_acm_stdio.c @@ -51,6 +51,13 @@ void stdio_init(void) #endif } +#if IS_USED(MODULE_STDIO_AVAILABLE) +int stdio_available(void) +{ + return tsrb_avail(&_cdc_stdio_isrpipe.tsrb); +} +#endif + ssize_t stdio_read(void* buffer, size_t len) { (void)buffer;