Fork to see if I can get working

Dependencies:   BufferedSerial OneWire WinbondSPIFlash libxDot-dev-mbed5-deprecated

Fork of xDotBridge_update_test20180823 by Matt Briggs

Files at this revision

API Documentation at this revision

Comitter:
Matt Briggs
Date:
Tue Mar 14 09:54:04 2017 -0600
Parent:
62:9751a8504c82
Child:
64:46c8819c07cc
Commit message:
Quick refactor of logging

Changed in this revision

xDotBridge/inc/CommProtocolPeerBrute.h Show annotated file Show diff for this revision Revisions of this file
xDotBridge/inc/MyLog.h Show annotated file Show diff for this revision Revisions of this file
xDotBridge/inc/RadioEvent.h Show annotated file Show diff for this revision Revisions of this file
xDotBridge/inc/dot_util.h Show annotated file Show diff for this revision Revisions of this file
xDotBridge/src/BaseboardIO.cpp Show annotated file Show diff for this revision Revisions of this file
xDotBridge/src/CommProtocolPeerBrute.cpp Show annotated file Show diff for this revision Revisions of this file
xDotBridge/src/MyLog.cpp Show annotated file Show diff for this revision Revisions of this file
xDotBridge/src/main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/xDotBridge/inc/CommProtocolPeerBrute.h	Tue Mar 14 08:32:55 2017 -0600
+++ b/xDotBridge/inc/CommProtocolPeerBrute.h	Tue Mar 14 09:54:04 2017 -0600
@@ -207,6 +207,7 @@
 
     // TODO maybe this should be private
     CmdResult configForPairingNetwork();
+    void printDotConfig();
 
 private:
     NvmProtocolObj mMemObj;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xDotBridge/inc/MyLog.h	Tue Mar 14 09:54:04 2017 -0600
@@ -0,0 +1,104 @@
+#ifndef MYLOG_H
+#define MYLOG_H
+
+#include "MTSLog.h"
+
+//inline const char* className(const std::string& prettyFunction)
+//{
+//    size_t colons = prettyFunction.find_last_of("::");
+//    if (colons == std::string::npos)
+//        return "";
+//    size_t begin = prettyFunction.substr(0,colons).rfind(" ") + 1;
+//    size_t end = colons - begin;
+//
+//    return prettyFunction.substr(begin,end).c_str();
+//}
+//
+//#define __CLASSNAME__ className(__PRETTY_FUNCTION__)
+
+
+#ifdef MTS_DEBUG
+#define logFatal(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::FATAL_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::FATAL_LABEL, ##__VA_ARGS__)
+#define logError(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::ERROR_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::ERROR_LABEL, ##__VA_ARGS__)
+#define logWarning(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::WARNING_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::WARNING_LABEL, ##__VA_ARGS__)
+#define logInfo(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::INFO_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::INFO_LABEL, ##__VA_ARGS__)
+#define logDebug(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::DEBUG_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::DEBUG_LABEL, ##__VA_ARGS__)
+#define logTrace(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::TRACE_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::TRACE_LABEL, ##__VA_ARGS__)
+#else
+#define myLogFatal(format, ...) \
+    MyLog::printMessage(MyLog::FATAL_LEVEL, "[%s] " format "\r\n", MyLog::FATAL_LABEL, ##__VA_ARGS__)
+#define myLogError(format, ...) \
+    MyLog::printMessage(MyLog::ERROR_LEVEL, "[%s] " format "\r\n", MyLog::ERROR_LABEL, ##__VA_ARGS__)
+#define myLogWarning(format, ...) \
+    MyLog::printMessage(MyLog::WARNING_LEVEL, "[%s] " format "\r\n", MyLog::WARNING_LABEL, ##__VA_ARGS__)
+#define myLogInfo(format, ...) \
+    MyLog::printMessage(MyLog::INFO_LEVEL, "[%s] " format "\r\n", MyLog::INFO_LABEL, ##__VA_ARGS__)
+#define myLogDebug(format, ...) \
+    MyLog::printMessage(MyLog::DEBUG_LEVEL, "[%s] " format "\r\n", MyLog::DEBUG_LABEL, ##__VA_ARGS__)
+#define myLogTrace(format, ...) \
+    MyLog::printMessage(MyLog::TRACE_LEVEL, "[%s] " format "\r\n", MyLog::TRACE_LABEL, ##__VA_ARGS__)
+#endif
+
+class MyLog
+{
+public:
+
+    /** Enum of log levels.
+     */
+    enum logLevel {
+        NONE_LEVEL = 0,
+        FATAL_LEVEL = 1,
+        ERROR_LEVEL = 2,
+        WARNING_LEVEL = 3,
+        INFO_LEVEL = 4,
+        DEBUG_LEVEL = 5,
+        TRACE_LEVEL = 6
+    };
+
+    /** Print log message.
+     */
+    static void printMessage(int level, const char* format, ...);
+
+    /** Determine if the given level is currently printable.
+     */
+    static bool printable(int level);
+
+    /** Set log level
+     * Messages with lower priority than the current level will not be printed.
+     * If the level is set to NONE, no messages will print.
+     */
+    static void setLogLevel(int level);
+
+    /** Get the current log level.
+     */
+    static int getLogLevel();
+
+    /** Get string representation of the current log level.
+     */
+    static const char* getLogLevelString();
+
+    static const char* NONE_LABEL;
+    static const char* FATAL_LABEL;
+    static const char* ERROR_LABEL;
+    static const char* WARNING_LABEL;
+    static const char* INFO_LABEL;
+    static const char* DEBUG_LABEL;
+    static const char* TRACE_LABEL;
+
+private:
+
+    /** Constructor
+     */
+    MyLog();
+
+    static int currentLevel;
+
+};
+
+#endif
--- a/xDotBridge/inc/RadioEvent.h	Tue Mar 14 08:32:55 2017 -0600
+++ b/xDotBridge/inc/RadioEvent.h	Tue Mar 14 09:54:04 2017 -0600
@@ -68,7 +68,7 @@
 
                 // print RX data as string
                 std::string rx((const char*)info->RxBuffer, info->RxBufferSize);
-                printf("Rx data: %s\r\n", rx.c_str());
+                mtsLogInfo("Rx data: %s\r\n", rx.c_str());
             }
         }
     }
--- a/xDotBridge/inc/dot_util.h	Tue Mar 14 08:32:55 2017 -0600
+++ b/xDotBridge/inc/dot_util.h	Tue Mar 14 09:54:04 2017 -0600
@@ -1,11 +1,12 @@
 #ifndef __DOT_UTIL_H__
 #define __DOT_UTIL_H__
 
+#include <inc/MyLog.h>
 #include "../config.h"
 #include "mbed.h"
 #include "mDot.h"
+#include "MTSText.h"
 #include "MTSLog.h"
-#include "MTSText.h"
 //#include "ISL29011.h"
 
 extern mDot* dot;
@@ -38,4 +39,32 @@
 
 void send_data(std::vector<uint8_t> data);
 
+#ifdef MTS_DEBUG
+#define logFatal(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::FATAL_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::FATAL_LABEL, ##__VA_ARGS__)
+#define logError(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::ERROR_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::ERROR_LABEL, ##__VA_ARGS__)
+#define logWarning(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::WARNING_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::WARNING_LABEL, ##__VA_ARGS__)
+#define logInfo(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::INFO_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::INFO_LABEL, ##__VA_ARGS__)
+#define logDebug(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::DEBUG_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::DEBUG_LABEL, ##__VA_ARGS__)
+#define logTrace(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::TRACE_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::TRACE_LABEL, ##__VA_ARGS__)
+#else
+#define mtsLogFatal(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::FATAL_LEVEL, "[%s] " format "\r\n", mts::MTSLog::FATAL_LABEL, ##__VA_ARGS__)
+#define mtsLogError(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::ERROR_LEVEL, "[%s] " format "\r\n", mts::MTSLog::ERROR_LABEL, ##__VA_ARGS__)
+#define mtsLogWarning(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::WARNING_LEVEL, "[%s] " format "\r\n", mts::MTSLog::WARNING_LABEL, ##__VA_ARGS__)
+#define mtsLogInfo(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::INFO_LEVEL, "[%s] " format "\r\n", mts::MTSLog::INFO_LABEL, ##__VA_ARGS__)
+#define mtsLogDebug(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::DEBUG_LEVEL, "[%s] " format "\r\n", mts::MTSLog::DEBUG_LABEL, ##__VA_ARGS__)
+#define mtsLogTrace(format, ...) \
+    mts::MTSLog::printMessage(mts::MTSLog::TRACE_LEVEL, "[%s] " format "\r\n", mts::MTSLog::TRACE_LABEL, ##__VA_ARGS__)
 #endif
+
+#endif
--- a/xDotBridge/src/BaseboardIO.cpp	Tue Mar 14 08:32:55 2017 -0600
+++ b/xDotBridge/src/BaseboardIO.cpp	Tue Mar 14 09:54:04 2017 -0600
@@ -6,9 +6,9 @@
  */
 
 #include "BaseboardIO.h"
-#include "MTSLog.h"
 #include "dot_util.h" // FIXME just need the reference to dot somehow
 #include "xdot_low_power.h"
+#include "MyLog.h"
 
 // Original
 //const float COIL_ON_TIME = 0.030; // 30 ms
@@ -64,37 +64,37 @@
     uint8_t val;
     // Setup port expanders
     if (readInfoFromNVM() == cmdSuccess && !overwriteNvm) {
-        logInfo("Stored ROM0 Addr: %02x:%02x:%02x:%02x:%02x:%02x:%02x%02x found.",
-                mNvmObj.mPortExpanderROM0[7],
-                mNvmObj.mPortExpanderROM0[6],
-                mNvmObj.mPortExpanderROM0[5],
-                mNvmObj.mPortExpanderROM0[4],
-                mNvmObj.mPortExpanderROM0[3],
-                mNvmObj.mPortExpanderROM0[2],
-                mNvmObj.mPortExpanderROM0[1],
-                mNvmObj.mPortExpanderROM0[0]);
-        logInfo("Stored ROM1 Addr: %02x:%02x:%02x:%02x:%02x:%02x:%02x%02x found.",
-                mNvmObj.mPortExpanderROM1[7],
-                mNvmObj.mPortExpanderROM1[6],
-                mNvmObj.mPortExpanderROM1[5],
-                mNvmObj.mPortExpanderROM1[4],
-                mNvmObj.mPortExpanderROM1[3],
-                mNvmObj.mPortExpanderROM1[2],
-                mNvmObj.mPortExpanderROM1[1],
-                mNvmObj.mPortExpanderROM1[0]);
-        logInfo("BaseboardIO parameters successfully loaded from NVM");
+        myLogInfo("Stored ROM0 Addr: %02x:%02x:%02x:%02x:%02x:%02x:%02x%02x found.",
+                   mNvmObj.mPortExpanderROM0[7],
+                   mNvmObj.mPortExpanderROM0[6],
+                   mNvmObj.mPortExpanderROM0[5],
+                   mNvmObj.mPortExpanderROM0[4],
+                   mNvmObj.mPortExpanderROM0[3],
+                   mNvmObj.mPortExpanderROM0[2],
+                   mNvmObj.mPortExpanderROM0[1],
+                   mNvmObj.mPortExpanderROM0[0]);
+        myLogInfo("Stored ROM1 Addr: %02x:%02x:%02x:%02x:%02x:%02x:%02x%02x found.",
+                   mNvmObj.mPortExpanderROM1[7],
+                   mNvmObj.mPortExpanderROM1[6],
+                   mNvmObj.mPortExpanderROM1[5],
+                   mNvmObj.mPortExpanderROM1[4],
+                   mNvmObj.mPortExpanderROM1[3],
+                   mNvmObj.mPortExpanderROM1[2],
+                   mNvmObj.mPortExpanderROM1[1],
+                   mNvmObj.mPortExpanderROM1[0]);
+        myLogInfo("BaseboardIO parameters successfully loaded from NVM");
         // Check that the ROM Addresses are correct and valid
         uint8_t portEx0Ctrl, portEx1Ctrl;
         mPortEx0 = new DS2408(&mOWMaster, mNvmObj.mPortExpanderROM0);
         mPortEx0->registerReadReliable(0x8D, portEx0Ctrl);
         // Gets 0xFF if it is not the correct address
-        logInfo("PortEx0 Control register reads %02X", portEx0Ctrl);
+        myLogInfo("PortEx0 Control register reads %02X", portEx0Ctrl);
 
         mPortEx1 = new DS2408(&mOWMaster, mNvmObj.mPortExpanderROM1);
         mPortEx1->registerReadReliable(0x8D, portEx1Ctrl);
-        logInfo("PortEx1 Control register reads %02X", portEx1Ctrl);
+        myLogInfo("PortEx1 Control register reads %02X", portEx1Ctrl);
         if ((portEx0Ctrl == 0xFF) || (portEx1Ctrl == 0xFF)) {
-            logError("Stored port expander ROM check failed.  Set EEPROM to defaults.");
+            myLogError("Stored port expander ROM check failed.  Set EEPROM to defaults.");
         }
         else {
             storedROMsGood = true;
@@ -106,37 +106,37 @@
         // Find ROM address and test which one is which.  Requires user
         // switches to be in known state.
         if (identifyPortExpanders() != cmdSuccess) {
-            logError("Error identifying port expanders");
+            myLogError("Error identifying port expanders");
             return cmdError;
         }
         if (writeInfoToNVM() == cmdSuccess) {
-            logInfo("Baseboard config saved to NVM");
+            myLogInfo("Baseboard config saved to NVM");
         }
         else {
-            logError("Baseboard config failed to save to NVM");
+            myLogError("Baseboard config failed to save to NVM");
         }
         mPortEx0 = new DS2408(&mOWMaster, mNvmObj.mPortExpanderROM0);
         mPortEx0->registerReadReliable(0x8D, val);
         // Gets 0xFF if it is not the correct address
-        logInfo("PortEx0 Control register reads %02X", val);
+        myLogInfo("PortEx0 Control register reads %02X", val);
         mPortEx1 = new DS2408(&mOWMaster, mNvmObj.mPortExpanderROM1);
         mPortEx1->registerReadReliable(0x8D, val);
-        logInfo("PortEx1 Control register reads %02X", val);
+        myLogInfo("PortEx1 Control register reads %02X", val);
     }
 
     if (sampleUserSwitches() != cmdSuccess) {
-        logError("Error sampling user switches");
+        myLogError("Error sampling user switches");
         return cmdError;
     }
 
     // Put relay in known state
     if (relayNormal() != cmdSuccess) {
-        logError("Error setting relay during init");
+        myLogError("Error setting relay during init");
         return cmdError;
     }
     ledOff();
 
-    logInfo("Baseboard IO initialization successful");
+    myLogInfo("Baseboard IO initialization successful");
     return cmdSuccess;
 }
 
@@ -180,12 +180,12 @@
     wait(0.001);  // Wait 1 ms
     if (mPortEx0->pioLogicReliableRead(mPortExpanderVal0) != cmdSuccess) {
         disableSwitchedIO();
-        logError("Error reading port expander 0.");
+        myLogError("Error reading port expander 0.");
         return cmdError;
     }
     if (mPortEx1->pioLogicReliableRead(mPortExpanderVal1) != cmdSuccess) {
         disableSwitchedIO();
-        logError("Error reading port expander 1.");
+        myLogError("Error reading port expander 1.");
         return cmdError;
     }
     disableSwitchedIO();
@@ -296,7 +296,7 @@
 {
     uint8_t val;
     if (mPortEx0 == NULL) {
-        logError("Error enabling 232.  Port expanders not initialized.");
+        myLogError("Error enabling 232.  Port expanders not initialized.");
         return cmdError;
     }
     mPortEx0->pioLogicReliableRead(val);
@@ -310,7 +310,7 @@
     }
 
     if (mPortEx0->pioLogicReliableWrite(val | ~pEx0OutMask) != cmdSuccess) {
-        logError("Error enabling 232");
+        myLogError("Error enabling 232");
         return cmdError;
     }
     return cmdSuccess;
@@ -319,7 +319,7 @@
 {
     uint8_t val;
     if (mPortEx0 == NULL) {
-        logError("Error enabling 232 TX.  Port expanders not initialized.");
+        myLogError("Error enabling 232 TX.  Port expanders not initialized.");
         return cmdError;
     }
     mPortEx0->pioLogicReliableRead(val);
@@ -333,7 +333,7 @@
     }
 
     if (mPortEx0->pioLogicReliableWrite(val | ~pEx0OutMask) != cmdSuccess) {
-        logError("Error enabling 232 TX");
+        myLogError("Error enabling 232 TX");
         return cmdError;
     }
     return cmdSuccess;
@@ -353,11 +353,11 @@
     mNvmObj.fromBytes(data, BASEBOARDIO_NVM_SIZE);
     delete [] data;
     if (!mNvmObj.validBaseboardIOFlag()) {
-        logWarning("Invalid BaseboardIO Flag.  Using default values.");
+        myLogWarning("Invalid BaseboardIO Flag.  Using default values.");
         return cmdError;
     }
     else if (!mNvmObj.validBaseboardIORev()) {
-        logWarning("Invalid BaseboardIO Rev.  Using default values.");
+        myLogWarning("Invalid BaseboardIO Rev.  Using default values.");
         return cmdError;
     }
     else {
@@ -381,7 +381,7 @@
     int i;
 
     // Search Bus
-    logInfo("Starting OneWire Search");
+    myLogInfo("Starting OneWire Search");
     enableSwitchedIO();
     for (int j=0;j<10;j++) { // Try 5 times
         i=0;
@@ -394,7 +394,7 @@
             if (result != 1) {
                 break;
             }
-            logInfo("ROM Addr: %02x:%02x:%02x:%02x:%02x:%02x:%02x%02x found.",
+            myLogInfo("ROM Addr: %02x:%02x:%02x:%02x:%02x:%02x:%02x%02x found.",
                     addr[7],addr[6],addr[5],addr[4],addr[3],addr[2],addr[1],addr[0]);
             if (i == 0) {
                 std::memcpy(mNvmObj.mPortExpanderROM0, addr, sizeof(mNvmObj.mPortExpanderROM0));
@@ -410,9 +410,9 @@
         }
     }
 
-    logInfo("Finished OneWire Search");
+    myLogInfo("Finished OneWire Search");
     if (i != 2) {
-        logError("Incorrect Number of OneWire devices (Got %d.  Expected 2) OneWire port expanders found.", i);
+        myLogError("Incorrect Number of OneWire devices (Got %d.  Expected 2) OneWire port expanders found.", i);
         return cmdError;
     }
 
@@ -426,14 +426,14 @@
 
     enableSwitchedIO();
     if (mPortEx0->pioLogicReliableRead(mPortExpanderVal0) != cmdSuccess) {
-        logError("Error during port expander ID.  Read failed.");
+        myLogError("Error during port expander ID.  Read failed.");
         disableSwitchedIO();
         delete mPortEx0;
         delete mPortEx1;
         return cmdError;
     }
     if (mPortEx1->pioLogicReliableRead(mPortExpanderVal1) != cmdSuccess) {
-        logError("Error during port expander ID.  Read failed.");
+        myLogError("Error during port expander ID.  Read failed.");
         disableSwitchedIO();
         delete mPortEx0;
         delete mPortEx1;
@@ -442,16 +442,16 @@
 
     disableSwitchedIO();
     if ((mPortExpanderVal0 == 0xFF) and (mPortExpanderVal1 == 0xF0)) { // Luckily got it right
-        logInfo("ROMS Swap Not Needed.");
+        myLogInfo("ROMS Swap Not Needed.");
     }
     else if ((mPortExpanderVal0 == 0xF0) and (mPortExpanderVal1 == 0xFF)) { // Just need to swap
         std::memcpy(addr, mNvmObj.mPortExpanderROM0, sizeof(addr)); // Store Orig ROM0 -> addr
         std::memcpy(mNvmObj.mPortExpanderROM0, mNvmObj.mPortExpanderROM1, sizeof(mNvmObj.mPortExpanderROM0)); // Store Orig ROM1 -> ROM0
         std::memcpy(mNvmObj.mPortExpanderROM1, addr, sizeof(mNvmObj.mPortExpanderROM1)); // Store Orig ROM0 (addr) -> ROM1
-        logInfo("Swapped ROMS.");
+        myLogInfo("Swapped ROMS.");
     }
     else {
-        logError("Error during port expander ID.  Port expanders not in "
+        myLogError("Error during port expander ID.  Port expanders not in "
                 "expected states (0xFF and 0xF0).  Check user switches.  Got %02X and %02X",
                 mPortExpanderVal0, mPortExpanderVal1);
         delete mPortEx0;
@@ -476,7 +476,7 @@
         val |= pEx1RlyA; // Turn Relay A off
         val |= pEx1RlyB; // Turn Relay B off
         mPortEx1->pioLogicReliableWrite(val | ~pEx1OutMask); // Write a non assert value just to try to overcome an error
-        logError ("Error turning on coil.  Turning both coils off.");
+        myLogError ("Error turning on coil.  Turning both coils off.");
         return cmdError;
     }
 
@@ -487,7 +487,7 @@
 
     if (mPortEx1->pioLogicReliableWrite(val | ~pEx1OutMask) != cmdSuccess) {
         mPortEx1->pioLogicReliableWrite(val | ~pEx1OutMask);
-        logError ("Error turning off coils.  Trying again.");
+        myLogError ("Error turning off coils.  Trying again.");
         return cmdError;
     }
 
@@ -504,7 +504,7 @@
         val |= pEx1RlyA; // Turn Relay A off
         val |= pEx1RlyB; // Turn Relay B off
         mPortEx1->pioLogicReliableWrite(val | ~pEx1OutMask); // Write a non assert value just to try to overcome an error
-        logError ("Error turning on coil.  Turning both coils off.");
+        myLogError ("Error turning on coil.  Turning both coils off.");
         return cmdError;
     }
 
@@ -515,7 +515,7 @@
 
     if (mPortEx1->pioLogicReliableWrite(val | ~pEx1OutMask) != cmdSuccess) {
         mPortEx1->pioLogicReliableWrite(val | ~pEx1OutMask);
-        logError ("Error turning off coils.  Trying again.");
+        myLogError ("Error turning off coils.  Trying again.");
         return cmdError;
     }
 
--- a/xDotBridge/src/CommProtocolPeerBrute.cpp	Tue Mar 14 08:32:55 2017 -0600
+++ b/xDotBridge/src/CommProtocolPeerBrute.cpp	Tue Mar 14 09:54:04 2017 -0600
@@ -6,8 +6,8 @@
  */
 
 #include "CommProtocolPeerBrute.h"
-#include "MTSLog.h"
 #include "dot_util.h"
+#include "MyLog.h"
 
 // wireless bridge protocol
 const uint8_t TX_PWR = 20; // 20 dBm
@@ -18,7 +18,7 @@
 
 CommProtocolPeerBrute::CommProtocolPeerBrute()
 {
-    logInfo("RX_SLEEP_TIME %f, timeOnAir %lu, nTimesToTx %lu", RX_SLEEP_TIME, TX_TIME, nTimesToTx);
+    myLogDebug("RX_SLEEP_TIME %f, timeOnAir %lu, nTimesToTx %lu", RX_SLEEP_TIME, TX_TIME, nTimesToTx);
 
     mIsTx = true; // default to TX
 }
@@ -31,7 +31,7 @@
     }
     result = readInfoFromNVM();
     if (result != cmdSuccess) {
-        logInfo("Reverting to protocol defaults NVM Read failed");
+        myLogWarning("Reverting to protocol defaults NVM Read failed");
         mMemObj.setDefaults();
     }
     configForSavedNetwork();
@@ -47,7 +47,7 @@
         return cmdError;
     }
 
-//    logInfo("defaulting Dot configuration");
+//    myLogInfo("defaulting Dot configuration");
 //    dot->resetConfig();
 
     // Common Configuration
@@ -60,11 +60,11 @@
 
     // TODO break out in a utility function
     // update configuration if necessary
-    logInfo("Setting up peer to peer configuration");
+    myLogDebug("Setting up peer to peer configuration");
     if (dot->getJoinMode() != mDot::PEER_TO_PEER) {
-        logInfo("changing network join mode to PEER_TO_PEER");
+        myLogDebug("changing network join mode to PEER_TO_PEER");
         if (dot->setJoinMode(mDot::PEER_TO_PEER) != mDot::MDOT_OK) {
-            logError("failed to set network join mode to PEER_TO_PEER");
+            myLogError("failed to set network join mode to PEER_TO_PEER");
         }
     }
     uint8_t tx_power;
@@ -112,7 +112,7 @@
         return cmdError;
     }
 
-//    logInfo("defaulting Dot configuration");
+//    myLogInfo("defaulting Dot configuration");
 //    dot->resetConfig();
 
     // Common Configuration
@@ -124,11 +124,11 @@
     dot->setPreserveSession(false);
     // TODO break out in a utility function
     // update configuration if necessary
-    logInfo("Setting up peer to peer configuration");
+    myLogDebug("Setting up peer to peer configuration");
     if (dot->getJoinMode() != mDot::PEER_TO_PEER) {
-        logInfo("changing network join mode to PEER_TO_PEER");
+        myLogDebug("changing network join mode to PEER_TO_PEER");
         if (dot->setJoinMode(mDot::PEER_TO_PEER) != mDot::MDOT_OK) {
-            logError("failed to set network join mode to PEER_TO_PEER");
+            myLogError("failed to set network join mode to PEER_TO_PEER");
         }
     }
 
@@ -186,44 +186,44 @@
     // REPLACE WITH NETWORK ADDRESS
 //    result = genEncypKey(key, 8);
 //    if (result != cmdSuccess) {
-//        logError("Error generating network ID.");
+//        myLogError("Error generating network ID.");
 //        return cmdError;
 //    }
 //    if (dot->setNetworkId(key) != mDot::MDOT_OK) {
-//        logError("Error setting network ID.");
+//        myLogError("Error setting network ID.");
 //        return cmdError;
 //    }
 
     result = genEncypKey(key, 4, false);
     if (result != cmdSuccess) {
-        logError("Error generating network address.");
+        myLogError("Error generating network address.");
         return cmdError;
     }
     mMemObj.setNetworkAddr(key);
 //    if (dot->setNetworkAddress(key) != mDot::MDOT_OK) {
-//        logError("Error setting network address.");
+//        myLogError("Error setting network address.");
 //        return cmdError;
 //    }
 
     result = genEncypKey(key, 16);
     if (result != cmdSuccess) {
-        logError("Error generating network encryption keys.");
+        myLogError("Error generating network encryption keys.");
         return cmdError;
     }
     mMemObj.setNetworkSessionKey(key);
 //    if (dot->setNetworkSessionKey(key) != mDot::MDOT_OK) {
-//        logError("Error setting network session key.");
+//        myLogError("Error setting network session key.");
 //        return cmdError;
 //    }
 
     result = genEncypKey(key, 16);
     if (result != cmdSuccess) {
-        logError("Error generating data session encryption keys.");
+        myLogError("Error generating data session encryption keys.");
         return cmdError;
     }
     mMemObj.setDataSessionKey(key);
 //    if (dot->setDataSessionKey(key) != mDot::MDOT_OK) {
-//        logError("Error setting data session key.");
+//        myLogError("Error setting data session key.");
 //        return cmdError;
 //    }
 
@@ -240,11 +240,11 @@
     if (!dot->getNetworkJoinStatus()) {
         join_network();
     }
-    logInfo("Starting TX.  Time: %lu", us_ticker_read());
+    myLogDebug("Starting TX.  Time: %lu", us_ticker_read());
     for(uint8_t i=0;i<nTimesToTx;++i) {
         dot->send(msg);
     }
-    logInfo("Finished TX.  Time: %lu", us_ticker_read());
+    myLogDebug("Finished TX.  Time: %lu", us_ticker_read());
     return cmdError;
 }
 
@@ -329,32 +329,32 @@
     // Flag
     msg->push_back(0xFD);
     msg->push_back(0x02);
-    logInfo("flag msg size %d", msg->size());
+    myLogDebug("flag msg size %d", msg->size());
     // EUI
     std::vector<uint8_t> *eui = new std::vector<uint8_t>(dot->getDeviceId());
     msg->insert(msg->end(),eui->begin(), eui->end());
     delete eui;
-    logInfo("eui msg size %d", msg->size());
+    myLogDebug("eui msg size %d", msg->size());
 
     // Reserved for Freq
     for(uint8_t i=0;i<4;i++) {
         msg->push_back(0x00);
     }
-    logInfo("freq msg size %d", msg->size());
+    myLogDebug("freq msg size %d", msg->size());
 
     // Network Address
     std::vector<uint8_t> *networkAddr = new std::vector<uint8_t>;
     mMemObj.getNetworkAddr(*networkAddr);
     msg->insert(msg->end(),networkAddr->begin(), networkAddr->end());
     delete networkAddr;
-    logInfo("netAddr msg size %d", msg->size());
+    myLogDebug("netAddr msg size %d", msg->size());
 
     // Network session key
     std::vector<uint8_t> *networkSessionKey = new std::vector<uint8_t>;
     mMemObj.getNetworkSessionKey(*networkSessionKey);
     msg->insert(msg->end(),networkSessionKey->begin(), networkSessionKey->end());
     delete networkSessionKey;
-    logInfo("netSessionKey msg size %d", msg->size());
+    myLogDebug("netSessionKey msg size %d", msg->size());
 
     // Data session key
     std::vector<uint8_t> *dataSessionKey = new std::vector<uint8_t>;
@@ -362,7 +362,7 @@
     msg->insert(msg->end(),dataSessionKey->begin(), dataSessionKey->end());
     delete dataSessionKey;
 
-    logInfo("msg size %d", msg->size());
+    myLogDebug("msg size %d", msg->size());
     // Only send once since requester should be listening always
     sendResult = mDot::MDOT_OK == dot->send(*msg);
     delete msg;
@@ -389,7 +389,7 @@
     std::vector<uint8_t> acceptMsg;
     dot->recv(acceptMsg);
     if (acceptMsg[0] != 0xFD || acceptMsg[1] != 0x02) {
-        logError("Invalid accept message flag.");
+        myLogError("Invalid accept message flag.");
         return cmdError;
     }
 
@@ -436,12 +436,12 @@
     mMemObj.fromBytes(data, PROTOCOL_NVM_SIZE);
     delete [] data;
     if (!mMemObj.validProtocolFlag()) {
-        logWarning("Invalid Protocol Flag.  Using default values.");
+        myLogWarning("Invalid Protocol Flag.  Using default values.");
         mMemObj.setDefaults();
         return cmdError;
     }
     else if (!mMemObj.validProtocolRev()) {
-        logWarning("Invalid Protocol Rev.  Using default values.");
+        myLogWarning("Invalid Protocol Rev.  Using default values.");
         mMemObj.setDefaults();
         return cmdError;
     }
@@ -484,6 +484,47 @@
     return cmdSuccess;
 }
 
+void CommProtocolPeerBrute::printDotConfig()
+{
+    // display configuration and library version information
+    myLogInfo("=====================");
+    myLogInfo("general configuration");
+    myLogInfo("=====================");
+    myLogInfo("version ------------------ %s", dot->getId().c_str());
+    myLogInfo("device ID/EUI ------------ %s", mts::Text::bin2hexString(dot->getDeviceId()).c_str());
+    myLogInfo("frequency band ----------- %s", mDot::FrequencyBandStr(dot->getFrequencyBand()).c_str());
+    if (dot->getFrequencySubBand() != mDot::FB_EU868) {
+        myLogInfo("frequency sub band ------- %u", dot->getFrequencySubBand());
+    }
+    myLogInfo("public network ----------- %s", dot->getPublicNetwork() ? "on" : "off");
+    myLogInfo("=========================");
+    myLogInfo("credentials configuration");
+    myLogInfo("=========================");
+    myLogInfo("device class ------------- %s", dot->getClass().c_str());
+    myLogInfo("network join mode -------- %s", mDot::JoinModeStr(dot->getJoinMode()).c_str());
+    if (dot->getJoinMode() == mDot::MANUAL || dot->getJoinMode() == mDot::PEER_TO_PEER) {
+	myLogInfo("network address ---------- %s", mts::Text::bin2hexString(dot->getNetworkAddress()).c_str());
+	myLogInfo("network session key------- %s", mts::Text::bin2hexString(dot->getNetworkSessionKey()).c_str());
+	myLogInfo("data session key---------- %s", mts::Text::bin2hexString(dot->getDataSessionKey()).c_str());
+    } else {
+	myLogInfo("network name ------------- %s", dot->getNetworkName().c_str());
+	myLogInfo("network phrase ----------- %s", dot->getNetworkPassphrase().c_str());
+	myLogInfo("network EUI -------------- %s", mts::Text::bin2hexString(dot->getNetworkId()).c_str());
+	myLogInfo("network KEY -------------- %s", mts::Text::bin2hexString(dot->getNetworkKey()).c_str());
+    }
+    myLogInfo("========================");
+    myLogInfo("communication parameters");
+    myLogInfo("========================");
+    if (dot->getJoinMode() == mDot::PEER_TO_PEER) {
+	myLogInfo("TX frequency ------------- %lu", dot->getTxFrequency());
+    } else {
+	myLogInfo("acks --------------------- %s, %u attempts", dot->getAck() > 0 ? "on" : "off", dot->getAck());
+    }
+    myLogInfo("TX datarate -------------- %s", mDot::DataRateStr(dot->getTxDataRate()).c_str());
+    myLogInfo("TX power ----------------- %lu dBm", dot->getTxPower());
+    myLogInfo("atnenna gain ------------- %u dBm", dot->getAntennaGain());
+}
+
 // NvmProtocolObj
 NvmProtocolObj::NvmProtocolObj()
 {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xDotBridge/src/MyLog.cpp	Tue Mar 14 09:54:04 2017 -0600
@@ -0,0 +1,72 @@
+/*
+ * MyLog.cpp
+ *
+ *  Heavily borrowed from MTSLog
+ *
+ *  Created on: Mar 14, 2017
+ *      Author: mbriggs
+ */
+
+#include "MyLog.h"
+
+#include "mbed.h"
+#include <stdarg.h>
+
+using namespace mts;
+
+int MyLog::currentLevel = MyLog::WARNING_LEVEL;
+
+const char* MyLog::NONE_LABEL = "NONE";
+const char* MyLog::FATAL_LABEL = "FATAL";
+const char* MyLog::ERROR_LABEL = "ERROR";
+const char* MyLog::WARNING_LABEL = "WARNING";
+const char* MyLog::INFO_LABEL = "INFO";
+const char* MyLog::DEBUG_LABEL = "DEBUG";
+const char* MyLog::TRACE_LABEL = "TRACE";
+
+void MyLog::printMessage(int level, const char* format, ...) {
+    if (printable(level)) {
+        va_list argptr;
+        va_start(argptr, format);
+        vprintf(format, argptr);
+        va_end(argptr);
+    }
+}
+
+bool MyLog::printable(int level) {
+    return level <= currentLevel;
+}
+
+void MyLog::setLogLevel(int level) {
+    if (level < NONE_LEVEL)
+        currentLevel = NONE_LEVEL;
+    else if (level > TRACE_LEVEL)
+        currentLevel = TRACE_LEVEL;
+    else
+    currentLevel = level;
+}
+
+int MyLog::getLogLevel() {
+    return currentLevel;
+}
+
+const char* MyLog::getLogLevelString() {
+    switch (currentLevel) {
+        case NONE_LEVEL:
+            return NONE_LABEL;
+        case FATAL_LEVEL:
+            return FATAL_LABEL;
+        case ERROR_LEVEL:
+            return ERROR_LABEL;
+        case WARNING_LEVEL:
+            return WARNING_LABEL;
+        case INFO_LEVEL:
+            return INFO_LABEL;
+        case DEBUG_LEVEL:
+            return DEBUG_LABEL;
+        case TRACE_LEVEL:
+            return TRACE_LABEL;
+        default:
+            return "unknown";
+    }
+}
--- a/xDotBridge/src/main.cpp	Tue Mar 14 08:32:55 2017 -0600
+++ b/xDotBridge/src/main.cpp	Tue Mar 14 09:54:04 2017 -0600
@@ -7,6 +7,7 @@
 #include "UserInterface.h"
 //#include <xdot_low_power.h>
 #include "mDot.h"
+#include "MyLog.h"
 
 #include "BaseboardIO.h"
 #include "CommProtocolPeerBrute.h"
@@ -43,27 +44,29 @@
     RadioEvent events;  // Custom event handler for automatically displaying RX data
 
     mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);
+    MyLog::setLogLevel(MyLog::INFO_LEVEL);
 
     dot = mDot::getInstance();
 
     // make sure library logging is turned on
-    dot->setLogLevel(mts::MTSLog::INFO_LEVEL);
+    dot->setLogLevel(mts::MTSLog::WARNING_LEVEL);
 
-    logInfo("mbed-os library version: %d", MBED_LIBRARY_VERSION);
-    logInfo("libxDot-mbed5 library ID: %s", dot->getId().c_str());
+    myLogInfo("mbed-os library version: %d", MBED_LIBRARY_VERSION);
+    myLogInfo("libxDot-mbed5 library ID: %s", dot->getId().c_str());
 
     // attach the custom events handler
     dot->setEvents(&events);  // Little bonus event debug information
 
     // Finish radio init
-    pc.printf("= Protocol Init Starting                     =\r\n");
+    myLogInfo("= Protocol Init Starting                     =\r\n");
     protocol->init();
     if (result == cmdSuccess) {
-        pc.printf("= Protocol Init Finished Successfully    =\r\n");
+        myLogInfo("= Protocol Init Finished Successfully    =\r\n");
     }
     else {
-        pc.printf("= Protocol Init Finished with Error      =\r\n");
+        myLogInfo("= Protocol Init Finished with Error      =\r\n");
     }
+    protocol->printDotConfig();
 
     // save changes to configuration
 //    logInfo("saving configuration");
@@ -99,13 +102,13 @@
     // display configuration
 //    display_config();
 
-    pc.printf("= Baseboard Init Starting                     =\r\n");
+    myLogInfo("= Baseboard Init Starting                     =\r\n");
     result = bbio->init();
     if (result == cmdSuccess) {
-        pc.printf("= Baseboard Init Finished Successfully    =\r\n");
+        myLogInfo("= Baseboard Init Finished Successfully    =\r\n");
     }
     else {
-        pc.printf("= Baseboard Init Finished with Error      =\r\n");
+        myLogInfo("= Baseboard Init Finished with Error      =\r\n");
     }
 
     uint16_t txSeqNum=0;
@@ -155,15 +158,16 @@
                     protocol->sampleDLC();
                     protocol->configForPairingNetwork();
                     protocol->sendPairReq();
-                    logInfo("Sent pair request.  Waiting %f secs for accept.", TX_ACCEPT_WAIT_TIME);
+                    myLogInfo("Sent pair request.  Waiting %f secs for accept.", TX_ACCEPT_WAIT_TIME);
                     result = protocol->waitForAccept(TX_ACCEPT_WAIT_TIME);
                     if (result == cmdSuccess) {
-                        logInfo("Got accept");
+                        myLogInfo("Got accept");
                     }
                     else {
-                        logInfo("Did not receive accept");
+                        myLogInfo("Did not receive accept");
                     }
                     protocol->configForSavedNetwork();
+                    protocol->printDotConfig();
                 }
             }
             if (protocol->isRx()) {
@@ -171,31 +175,32 @@
                     protocol->sampleDLC();
                     protocol->configForPairingNetwork();
                     bbio->ledOn();
-                    logInfo("Waiting for pair request for %f seconds", RX_PAIR_WAIT_TIME);
+                    myLogInfo("Waiting for pair request for %f seconds", RX_PAIR_WAIT_TIME);
                     result = protocol->waitForPairing(RX_PAIR_WAIT_TIME);
                     bbio->ledOff();
                     if (result == cmdSuccess) {
-                        logInfo("Got pair request and responded");
+                        myLogInfo("Got pair request and responded");
                     }
                     else if (result == cmdTimeout) {
-                        logInfo("Did not receive request");
+                        myLogInfo("Did not receive request");
                     }
                     else {
-                        logInfo("Unknown pair error");
+                        myLogInfo("Unknown pair error");
                     }
                     protocol->configForSavedNetwork();
+                    protocol->printDotConfig();
                 }
                 else if (pairBtnState == pairBtnLongPress) {
-                    logInfo("Clearing pair values and generating new ones.");
+                    myLogInfo("Clearing pair values and generating new ones.");
                     protocol->clearPair();
-                    // Maybe add Nvm save commands here
+                    protocol->printDotConfig();
                 }
             }
         }
 
         // Alert code
 		if (protocol->isTx()) {
-            logInfo("Loop #%d. CCFlag %d, CCAlertState %d, TamperFlag %d, PairBtnFlag %d",
+            myLogInfo("Loop #%d. CCFlag %d, CCAlertState %d, TamperFlag %d, PairBtnFlag %d",
                     loopCnt, ccIntFlag, bbio->isCCInAlert(), tamperIntFlag, pairBtnIntFlag);
             // TODO add tamper
 		    if (ccIntFlag || // If contact closure in
@@ -210,7 +215,7 @@
                 data.push_back((txSeqNum >> 8) & 0xFF);
                 data.push_back(txSeqNum & 0xFF);
                 std::string dataStr(data.begin(), data.end());
-                logInfo("Sent msg num: %d, payload: %s", txSeqNum, dataStr.c_str());
+                myLogInfo("Sent msg num: %d, payload: %s", txSeqNum, dataStr.c_str());
                 protocol->send(data);
                 txSeqNum++;
                 wait(0.5); // Leave the LED on so a person can see it.
@@ -232,12 +237,12 @@
 		if (protocol->isRx()) {
 		    bool msgPending;
 		    protocol->listen(msgPending);
-		    logInfo("Loop Cnt %d.  Listening.", loopCnt);
+		    myLogInfo("Loop Cnt %d.  Listening.", loopCnt);
 		    if (msgPending) {
 		        data.clear();
 		        protocol->recv(data);
                 std::string dataStr(data.begin(), data.end());
-                logInfo("Got msg num: %d, payload: %s", rxSeqNum, dataStr.c_str());
+                myLogInfo("Got msg num: %d, payload: %s", rxSeqNum, dataStr.c_str());
                 bbio->relayAlert();
                 rxSeqNum++;
                 #if LED_FEEDBACK
@@ -245,20 +250,19 @@
                 #endif
                 // Hold time for alert
                 // TODO maybe use sleep instead of wait
-                logInfo("Holding alert for %f secs", HoldTimeSetting::rotVal2Sec(bbio->rotarySwitch1()));
+                myLogInfo("Holding alert for %f secs", HoldTimeSetting::rotVal2Sec(bbio->rotarySwitch1()));
                 wait(HoldTimeSetting::rotVal2Sec(bbio->rotarySwitch1()));
                 bbio->ledOff();
                 bbio->relayNormal();
 		    }
-            logInfo("Sleeping.  Time %d", us_ticker_read());
+            myLogInfo("Sleeping.  Time %d", us_ticker_read());
             protocol->sampleDLC();
             bbio->prepareSleep();
             dot->sleep(2, mDot::RTC_ALARM_OR_INTERRUPT, false);  // Go to sleep until wake button
             bbio->exitSleep();
 		}
 
-        logInfo("\r\n================================");
-//        wait(1.0); // May want to remove
+        myLogInfo("\r\n================================");
         loopCnt++;
     }