summaryrefslogtreecommitdiff
path: root/common/uart_buffering.c
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2012-05-22 10:37:56 -0700
committerRandall Spangler <rspangler@chromium.org>2012-05-22 10:37:56 -0700
commit9b44097d2399e8305f9b64f6e66c85acd18744f9 (patch)
treec89d56cdfbe2a732b290434037d76b8492d900af /common/uart_buffering.c
parent15854fa680c57cfd49f30cf265a2a4d4bb67b076 (diff)
downloadchrome-ec-9b44097d2399e8305f9b64f6e66c85acd18744f9.tar.gz
Add support for printing fixed-point numbers
This makes timestamps much easier to read. Signed-off-by: Randall Spangler <rspangler@chromium.org> BUG=chrome-os-partner:9866 TEST=timerinfo, taskinfo, battery commands have fixed-point numbers, and timestamps printed in the log look right. Change-Id: If91c83f725984c8e04bfb7cdcff316d9c3bfe24c
Diffstat (limited to 'common/uart_buffering.c')
-rw-r--r--common/uart_buffering.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/common/uart_buffering.c b/common/uart_buffering.c
index 5848a30f1d..0aa3c760b7 100644
--- a/common/uart_buffering.c
+++ b/common/uart_buffering.c
@@ -387,7 +387,7 @@ int uart_vprintf(const char *format, va_list args)
{
static const char int_chars[] = "0123456789abcdef";
static const char error_str[] = "ERROR";
- char intbuf[33];
+ char intbuf[34];
/* Longest uint64 in decimal = 20
* longest uint32 in binary = 32
*/
@@ -454,6 +454,18 @@ int uart_vprintf(const char *format, va_list args)
int is_negative = 0;
int is_64bit = 0;
int base = 10;
+ int fixed_point = 0;
+
+ /* Handle fixed point numbers */
+ if (c == '.') {
+ c = *format++;
+ if (c < '0' || c > '9') {
+ format = error_str;
+ continue;
+ }
+ fixed_point = c - '0';
+ c = *format++;
+ }
if (c == 'l') {
is_64bit = 1;
@@ -464,6 +476,7 @@ int uart_vprintf(const char *format, va_list args)
if (c == 'T') {
v = get_time().val;
is_64bit = 1;
+ fixed_point = 6;
} else if (is_64bit) {
v = va_arg(args, uint64_t);
} else {
@@ -507,6 +520,13 @@ int uart_vprintf(const char *format, va_list args)
vstr = intbuf + sizeof(intbuf) - 1;
*(vstr) = '\0';
+ /* Handle digits to right of decimal for fixed point
+ * numbers. */
+ for (vlen = 0; vlen < fixed_point; vlen++)
+ *(--vstr) = int_chars[uint64divmod(&v, 10)];
+ if (fixed_point)
+ *(--vstr) = '.';
+
if (!v)
*(--vstr) = '0';