diff --git a/src/shared/drivers/usart/USART.cpp b/src/shared/drivers/usart/USART.cpp index 846d2219adf81a2ae756c7cb79a56d43b1de4ddc..c3a3044d5e65971da6c394975980680c0f0569dd 100644 --- a/src/shared/drivers/usart/USART.cpp +++ b/src/shared/drivers/usart/USART.cpp @@ -27,6 +27,7 @@ #include <utils/Debug.h> #include <utils/Numeric.h> +#include <fstream> #include <string> #include "arch/common/drivers/serial.h" @@ -592,6 +593,26 @@ void USART::writeString(const char* buffer) }; } +bool USART::writeFile(const std::string& fileName) +{ + std::ifstream file(fileName, std::ifstream::binary); + std::vector<uint8_t> buffer(1024, 0); // 1024 Bytes buffer. + + if (!file.is_open()) + { + LOG_ERR(logger, "Failed to open file {}", fileName); + return false; + } + + while (file.read(reinterpret_cast<char*>(buffer.data()), buffer.size())) + { + std::streamsize s = file.gcount(); + if (s > 0) + write(buffer.data(), static_cast<size_t>(s)); + } + return true; +} + void USART::clearQueue() { char buf[INTERNAL_QUEUE_LENGTH]; diff --git a/src/shared/drivers/usart/USART.h b/src/shared/drivers/usart/USART.h index 1e0f378adb5d31373aa2f4e2f9b4f26c7dfe0308..c39ad94451220f3268ba3d3ed4ad7b8395a4625c 100644 --- a/src/shared/drivers/usart/USART.h +++ b/src/shared/drivers/usart/USART.h @@ -267,6 +267,14 @@ public: */ void writeString(const char* buffer); + /** + * @brief Given a filename, uses the USART interface to stream the file in + * 1KB chunks + * @param fileName String containing the name of the file to stream. + * @return A boolean value (true if stream is complete, false otherwise). + */ + bool writeFile(const std::string& fileName); + /** * @brief Set the length of the word to 8 or to 9. *