diff --git a/include/zephyr/storage/stream_flash.h b/include/zephyr/storage/stream_flash.h index 5a1e096e6d1..6be67896013 100644 --- a/include/zephyr/storage/stream_flash.h +++ b/include/zephyr/storage/stream_flash.h @@ -106,6 +106,15 @@ int stream_flash_init(struct stream_flash_ctx *ctx, const struct device *fdev, */ size_t stream_flash_bytes_written(const struct stream_flash_ctx *ctx); +/** + * @brief Read number of bytes buffered for the next flash write. + * + * @param ctx context + * + * @return Number of payload bytes buffered for the next flash write. + */ +size_t stream_flash_bytes_buffered(const struct stream_flash_ctx *ctx); + /** * @brief Process input buffers to be written to flash device in single blocks. * Will store remainder between calls. diff --git a/subsys/storage/stream/stream_flash.c b/subsys/storage/stream/stream_flash.c index 8155ef3dfe3..c611dde9dc4 100644 --- a/subsys/storage/stream/stream_flash.c +++ b/subsys/storage/stream/stream_flash.c @@ -307,6 +307,11 @@ size_t stream_flash_bytes_written(const struct stream_flash_ctx *ctx) return ctx->bytes_written; } +size_t stream_flash_bytes_buffered(const struct stream_flash_ctx *ctx) +{ + return ctx->buf_bytes; +} + #ifdef CONFIG_STREAM_FLASH_INSPECT struct _inspect_flash { size_t buf_len; diff --git a/tests/subsys/storage/stream/stream_flash/src/main.c b/tests/subsys/storage/stream/stream_flash/src/main.c index b691a7e0792..944892e256f 100644 --- a/tests/subsys/storage/stream/stream_flash/src/main.c +++ b/tests/subsys/storage/stream/stream_flash/src/main.c @@ -276,6 +276,42 @@ ZTEST(lib_stream_flash, test_stream_flash_bytes_written) VERIFY_WRITTEN(BUF_LEN, BUF_LEN); } +ZTEST(lib_stream_flash, test_stream_flash_bytes_buffered) +{ + int rc; + size_t buffered; + + init_target(); + + /* Initially no bytes should be buffered */ + buffered = stream_flash_bytes_buffered(&ctx); + zassert_equal(buffered, 0, "expected no buffered bytes"); + + /* Write partial buffer */ + rc = stream_flash_buffered_write(&ctx, write_buf, BUF_LEN - 128, false); + zassert_equal(rc, 0, "expected success"); + + /* Verify buffered bytes */ + buffered = stream_flash_bytes_buffered(&ctx); + zassert_equal(buffered, BUF_LEN - 128, "expected buffered bytes"); + + /* Write remaining buffer */ + rc = stream_flash_buffered_write(&ctx, write_buf, 128, false); + zassert_equal(rc, 0, "expected success"); + + /* After auto-flush, no bytes should be buffered */ + buffered = stream_flash_bytes_buffered(&ctx); + zassert_equal(buffered, 0, "expected no buffered bytes"); + + /* Write more than buffer size to trigger auto-flush */ + rc = stream_flash_buffered_write(&ctx, write_buf, BUF_LEN + 128, false); + zassert_equal(rc, 0, "expected success"); + + /* Verify buffered bytes */ + buffered = stream_flash_bytes_buffered(&ctx); + zassert_equal(buffered, 128, "expected remaining buffered bytes after auto-flush"); +} + ZTEST(lib_stream_flash, test_stream_flash_buf_size_greater_than_page_size) { int rc;