This is a low-level network debugging utility that utilizes raw packet i/o to construct and deconstruct tcp, udp, ipv4, arp, and icmp packets over ethernet.

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers log.h Source File

log.h

Go to the documentation of this file.
00001 #ifndef LOG_H
00002 #define LOG_H
00003 
00004 #include "mbed.h"
00005 
00006 #include "stdarg.h"
00007 #include "stdio.h"
00008 
00009 /**
00010   \file log.h
00011   \brief Logging utilities
00012   
00013   This file contains logging utilities
00014 */
00015 
00016 #define LOG_BUFSIZE 4096
00017 
00018 /// Enumeration used to enable/disable various serial lines in the logger
00019 typedef enum {
00020   LOG_USB = 0,
00021   LOG_SER_9_10,
00022   LOG_SER_13_14,
00023   LOG_SER_28_27,
00024   LOG_MAX
00025 } SerialLines;
00026 
00027 /// Combination serial/file logger
00028 class Log {
00029 private:
00030   // Accomodate all 3 serial ports and USB
00031   Serial *m_serial[4];
00032   bool    m_enable[4];
00033   
00034   // File log
00035   LocalFileSystem local;
00036 
00037 public:
00038   /// Constructor
00039   inline Log() : local("local")
00040   {
00041     // Write to file
00042     FILE *logfile = fopen("/local/NetTool.log", "w");
00043     fputs("NetTool - Welcome!", logfile);
00044     fclose(logfile);
00045   
00046     // Set up the serial classes
00047     m_serial[LOG_USB]       = new Serial(USBTX,USBRX);
00048     m_serial[LOG_SER_9_10]  = new Serial(p9,p10);
00049     m_serial[LOG_SER_13_14] = new Serial(p13,p14);
00050     m_serial[LOG_SER_28_27] = new Serial(p28,p27);
00051     
00052     // Disable logging to all of them by default
00053     for (int idx = 0; idx < LOG_MAX; ++idx)
00054     {
00055       m_enable[idx] = false;
00056     }
00057   }
00058 
00059   /// Enable logging to the given serial line
00060   inline void enable(SerialLines idx)
00061   {
00062     m_enable[idx] = true;
00063   }
00064   
00065   /// Disable logging to the given serial line
00066   inline void disable(SerialLines idx)
00067   {
00068     m_enable[idx] = false;
00069   }
00070   
00071   /// This can log messages up to 4095 characters and has printf semantics
00072   /// All log messages include an implicit \r\n at the end
00073   inline bool printf(char *format, ...)
00074   {
00075     static char buffer[LOG_BUFSIZE];
00076     static int count;
00077     static va_list va;
00078     
00079     va_start(va, format);
00080     count = vsnprintf(buffer, LOG_BUFSIZE, format, va);
00081     
00082     // Ensure that the log message fit
00083     if (count > LOG_BUFSIZE-1)
00084     {
00085       // Log an error message if it didn't
00086       Log::printf("Log message too long: %4d", count);
00087     }
00088     else
00089     {
00090       // Write all characters from the message
00091       puts(buffer);
00092       // Send the EOM (\r\n)
00093       puts("\r\n");
00094     }
00095     va_end(va);
00096     return true;
00097   } // printf
00098   
00099   /// Put the given string (no implicit \r\n) on all enabled serial lines and to the logfile
00100   bool puts(const char *str)
00101   {
00102     // Write to file
00103     FILE *logfile = fopen("/local/NetTool.log", "a");
00104     fputs(str, logfile);
00105     fclose(logfile);
00106     
00107     // Write all characters from the message
00108     while (*str)
00109     {
00110       // Write to all serial devices
00111       for (int s = 0; s < LOG_MAX; ++s)
00112       {
00113         // Only write if enabled
00114         if (m_enable[s])
00115           s[*m_serial].putc(*str++);
00116       }
00117     }
00118     return true;
00119   }
00120 
00121 };
00122 
00123 #endif