From 69775a1519c0fa3291f0bacd98c24a9f247d76d6 Mon Sep 17 00:00:00 2001
From: Rahix <rahix@rahix.de>
Date: Thu, 15 Aug 2019 21:22:10 +0200
Subject: [PATCH] feat(epicardium): Display all output on CDC-ACM

Closes #67

Signed-off-by: Rahix <rahix@rahix.de>
---
 epicardium/meson.build      |  1 +
 epicardium/modules/serial.c | 20 +++++++++++++++++++-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/epicardium/meson.build b/epicardium/meson.build
index 4c32b0a0..c9b128f7 100644
--- a/epicardium/meson.build
+++ b/epicardium/meson.build
@@ -85,6 +85,7 @@ elf = executable(
   include_directories: [freertos_includes],
   link_args: [
     '-Wl,-Map=' + meson.current_build_dir() + '/' + name + '.map',
+    '-Wl,--defsym=_write=_write_epicardium',
   ],
 )
 
diff --git a/epicardium/modules/serial.c b/epicardium/modules/serial.c
index db188ebe..a7392056 100644
--- a/epicardium/modules/serial.c
+++ b/epicardium/modules/serial.c
@@ -49,7 +49,7 @@ int epic_uart_read_char(void)
  */
 int epic_uart_read_str(char *buf, size_t cnt)
 {
-	int i = 0;
+	size_t i = 0;
 
 	for (i = 0; i < cnt; i++) {
 		if (xQueueReceive(read_queue, &buf[i], 0) != pdTRUE) {
@@ -60,6 +60,24 @@ int epic_uart_read_str(char *buf, size_t cnt)
 	return i;
 }
 
+long _write_epicardium(int fd, const char *buf, size_t cnt)
+{
+	/*
+	 * Only print one line at a time.  Insert `\r` between lines so they are
+	 * properly displayed on the serial console.
+	 */
+	size_t i, last = 0;
+	for (i = 0; i < cnt; i++) {
+		if (buf[i] == '\n') {
+			epic_uart_write_str(&buf[last], i - last);
+			epic_uart_write_str("\r", 1);
+			last = i;
+		}
+	}
+	epic_uart_write_str(&buf[last], cnt - last);
+	return cnt;
+}
+
 /* Interrupt handler needed for SDK UART implementation */
 void UART0_IRQHandler(void)
 {
-- 
GitLab