f

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers arduino-util.cpp Source File

arduino-util.cpp

00001 #ifdef ARDUINO
00002 
00003 #include <Arduino.h>
00004 #include "arduino-util.h"
00005 #include <cstdarg>
00006 #include <stdio.h>
00007 
00008 
00009 char tmpbuf[160];
00010 extern int us_getTicker(void);
00011 extern int s_getTicker(void);
00012 extern Stream *ser;
00013 
00014 void
00015 dprintf(const char *format, ...)
00016 {
00017     static volatile bool busy;
00018     if (busy)
00019         return;
00020     busy = true;
00021     
00022     int secs = s_getTicker();
00023     int s = secs % 60;
00024     int m = secs / 60;
00025     int h = secs / 3600;
00026     int us = us_getTicker() % 1000000;
00027 
00028     snprintf(tmpbuf, sizeof(tmpbuf)-1, "%02d:%02d:%02d.%.06d ", h, m, s, us);
00029     ser->write(tmpbuf, (int) sizeof "00:00:34.3436868 " -1);
00030 
00031     va_list arg;
00032     va_start(arg, format);
00033     int len = vsnprintf(tmpbuf, sizeof(tmpbuf)-3, format, arg);
00034     tmpbuf[len] = '\r';
00035     tmpbuf[len+1] = '\n';
00036     tmpbuf[len+2] = 0;
00037     ser->write(tmpbuf, len+3);
00038     va_end(arg);
00039     busy = false;
00040 }
00041 
00042 void
00043 rprintf(const char *format, ...)
00044 {
00045     va_list arg;
00046     va_start(arg, format);
00047     int len = vsnprintf(tmpbuf, sizeof(tmpbuf)-3, format, arg);
00048     tmpbuf[len] = 0;
00049     ser->write(tmpbuf, len+1);
00050     va_end(arg);
00051 }
00052 
00053 void
00054 dump(const char *title, const void *data, int len)
00055 {
00056     dprintf("dump(\"%s\", 0x%x, %d bytes)", title, data, len);
00057     
00058     int i, j, cnt;
00059     unsigned char *u;
00060     const int width = 16;
00061     const int seppos = 7;
00062     
00063     cnt = 0;
00064     u = (unsigned char *)data;
00065     while (len > 0) {
00066         rprintf("%08x: ", (unsigned int)data + cnt);
00067         cnt += width;
00068         j = len < width ? len : width;
00069         for (i = 0; i < j; i++) {
00070             rprintf("%2.2x ", *(u + i));
00071             if (i == seppos)
00072                 ser->write(' ');
00073         }
00074         ser->write(' ');
00075         if (j < width) {
00076             i = width - j;
00077             if (i > seppos + 1)
00078                 ser->write(' ');
00079             while (i--) {
00080                 ser->print("   ");
00081             }
00082         }
00083         for (i = 0; i < j; i++) {
00084             int c = *(u + i);
00085             if (c >= ' ' && c <= '~')
00086                 ser->write(c);
00087             else
00088                 ser->write('.');
00089             if (i == seppos)
00090                 ser->write(' ');
00091         }
00092         len -= width;
00093         u += width;
00094         ser->print("\r\n");
00095     }
00096     ser->print("--\r\n");
00097     
00098 }
00099 #endif