A small library that's provide helpers for programmers

Dependents:   PYRN

Committer:
clemounet
Date:
Tue Apr 14 13:07:53 2015 +0000
Revision:
4:eef83534b19e
Parent:
2:6cc4c56940af
.add CallBack

Who changed what in which revision?

UserRevisionLine numberNew contents of line
clemounet 2:6cc4c56940af 1 /* dbg.cpp */
clemounet 2:6cc4c56940af 2 /* Copyright (C) 2012 mbed.org, MIT License
clemounet 2:6cc4c56940af 3 *
clemounet 2:6cc4c56940af 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
clemounet 2:6cc4c56940af 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
clemounet 2:6cc4c56940af 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
clemounet 2:6cc4c56940af 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
clemounet 2:6cc4c56940af 8 * furnished to do so, subject to the following conditions:
clemounet 2:6cc4c56940af 9 *
clemounet 2:6cc4c56940af 10 * The above copyright notice and this permission notice shall be included in all copies or
clemounet 2:6cc4c56940af 11 * substantial portions of the Software.
clemounet 2:6cc4c56940af 12 *
clemounet 2:6cc4c56940af 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
clemounet 2:6cc4c56940af 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
clemounet 2:6cc4c56940af 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
clemounet 2:6cc4c56940af 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
clemounet 2:6cc4c56940af 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
clemounet 2:6cc4c56940af 18 */
clemounet 2:6cc4c56940af 19
clemounet 2:6cc4c56940af 20 #include "MyDebug.h"
clemounet 2:6cc4c56940af 21
clemounet 2:6cc4c56940af 22 #include "mbed.h"
clemounet 2:6cc4c56940af 23 #include "rtos.h"
clemounet 2:6cc4c56940af 24
clemounet 2:6cc4c56940af 25 #include <cstdio>
clemounet 2:6cc4c56940af 26 #include <cstdarg>
clemounet 2:6cc4c56940af 27
clemounet 2:6cc4c56940af 28 using namespace std;
clemounet 2:6cc4c56940af 29
clemounet 2:6cc4c56940af 30 static Serial debug_pc(USBTX, USBRX);
clemounet 2:6cc4c56940af 31
clemounet 2:6cc4c56940af 32 static char debug_newline[3];
clemounet 2:6cc4c56940af 33
clemounet 2:6cc4c56940af 34 static void debug_lock(bool set)
clemounet 2:6cc4c56940af 35 {
clemounet 2:6cc4c56940af 36 static Mutex* mtx = new Mutex(); //Singleton runtime initialisation to avoid static initialisation chaos problems
clemounet 2:6cc4c56940af 37 static bool init = false;
clemounet 2:6cc4c56940af 38 if(set)
clemounet 2:6cc4c56940af 39 {
clemounet 2:6cc4c56940af 40 mtx->lock();
clemounet 2:6cc4c56940af 41 if(!init)
clemounet 2:6cc4c56940af 42 {
clemounet 2:6cc4c56940af 43 strncpy( debug_newline, "\n", 2 );
clemounet 2:6cc4c56940af 44 printf("[START]\n");
clemounet 2:6cc4c56940af 45 fflush(stdout);
clemounet 2:6cc4c56940af 46 init = true;
clemounet 2:6cc4c56940af 47 }
clemounet 2:6cc4c56940af 48 }
clemounet 2:6cc4c56940af 49 else
clemounet 2:6cc4c56940af 50 {
clemounet 2:6cc4c56940af 51 mtx->unlock();
clemounet 2:6cc4c56940af 52 }
clemounet 2:6cc4c56940af 53 }
clemounet 2:6cc4c56940af 54
clemounet 2:6cc4c56940af 55 void debug_init()
clemounet 2:6cc4c56940af 56 {
clemounet 2:6cc4c56940af 57 debug_lock(true); //Force init
clemounet 2:6cc4c56940af 58 debug_lock(false);
clemounet 2:6cc4c56940af 59 }
clemounet 2:6cc4c56940af 60
clemounet 2:6cc4c56940af 61 void debug_set_newline(const char* newline)
clemounet 2:6cc4c56940af 62 {
clemounet 2:6cc4c56940af 63 debug_lock(true);
clemounet 2:6cc4c56940af 64 strncpy( debug_newline, newline, 2 );
clemounet 2:6cc4c56940af 65 debug_newline[2] = '\0';
clemounet 2:6cc4c56940af 66 debug_lock(false);
clemounet 2:6cc4c56940af 67 }
clemounet 2:6cc4c56940af 68
clemounet 2:6cc4c56940af 69 void debug_set_speed(int speed)
clemounet 2:6cc4c56940af 70 {
clemounet 2:6cc4c56940af 71 debug_pc.baud(speed);
clemounet 2:6cc4c56940af 72 }
clemounet 2:6cc4c56940af 73
clemounet 2:6cc4c56940af 74 void debug(int level, const char* module, int line, const char* fmt, ...)
clemounet 2:6cc4c56940af 75 {
clemounet 2:6cc4c56940af 76 debug_lock(true);
clemounet 2:6cc4c56940af 77 switch(level)
clemounet 2:6cc4c56940af 78 {
clemounet 2:6cc4c56940af 79 default:
clemounet 2:6cc4c56940af 80 case 1:
clemounet 2:6cc4c56940af 81 printf("[ERROR]");
clemounet 2:6cc4c56940af 82 break;
clemounet 2:6cc4c56940af 83 case 2:
clemounet 2:6cc4c56940af 84 printf("[WARN]");
clemounet 2:6cc4c56940af 85 break;
clemounet 2:6cc4c56940af 86 case 3:
clemounet 2:6cc4c56940af 87 printf("[INFO]");
clemounet 2:6cc4c56940af 88 break;
clemounet 2:6cc4c56940af 89 case 4:
clemounet 2:6cc4c56940af 90 printf("[DBG]");
clemounet 2:6cc4c56940af 91 break;
clemounet 2:6cc4c56940af 92 }
clemounet 2:6cc4c56940af 93
clemounet 2:6cc4c56940af 94 printf(" Module %s - Line %d: ", module, line);
clemounet 2:6cc4c56940af 95
clemounet 2:6cc4c56940af 96 va_list argp;
clemounet 2:6cc4c56940af 97
clemounet 2:6cc4c56940af 98 va_start(argp, fmt);
clemounet 2:6cc4c56940af 99 vprintf(fmt, argp);
clemounet 2:6cc4c56940af 100 va_end(argp);
clemounet 2:6cc4c56940af 101
clemounet 2:6cc4c56940af 102 printf(debug_newline);
clemounet 2:6cc4c56940af 103
clemounet 2:6cc4c56940af 104 fflush(stdout);
clemounet 2:6cc4c56940af 105
clemounet 2:6cc4c56940af 106 debug_lock(false);
clemounet 2:6cc4c56940af 107
clemounet 2:6cc4c56940af 108 }
clemounet 2:6cc4c56940af 109
clemounet 2:6cc4c56940af 110 void debug_error(const char* module, int line, int ret)
clemounet 2:6cc4c56940af 111 {
clemounet 2:6cc4c56940af 112 debug_lock(true);
clemounet 2:6cc4c56940af 113 printf("[RC] Module %s - Line %d : Error %d\n", module, line, ret);
clemounet 2:6cc4c56940af 114 fflush(stdout);
clemounet 2:6cc4c56940af 115 debug_lock(false);
clemounet 2:6cc4c56940af 116 }
clemounet 2:6cc4c56940af 117
clemounet 2:6cc4c56940af 118 void debug_exact(const char* fmt, ...)
clemounet 2:6cc4c56940af 119 {
clemounet 2:6cc4c56940af 120 debug_lock(true);
clemounet 2:6cc4c56940af 121 va_list argp;
clemounet 2:6cc4c56940af 122
clemounet 2:6cc4c56940af 123 va_start(argp, fmt);
clemounet 2:6cc4c56940af 124 vprintf(fmt, argp);
clemounet 2:6cc4c56940af 125 va_end(argp);
clemounet 2:6cc4c56940af 126 debug_lock(false);
clemounet 2:6cc4c56940af 127 }
clemounet 2:6cc4c56940af 128
clemounet 2:6cc4c56940af 129 #ifndef HEXDUMP_COLS
clemounet 2:6cc4c56940af 130 #define HEXDUMP_COLS 16
clemounet 2:6cc4c56940af 131 #endif
clemounet 2:6cc4c56940af 132
clemounet 2:6cc4c56940af 133 void debug_memdump(int level, const char* module, int line, const char* msg, const char* mem, int len)
clemounet 2:6cc4c56940af 134 {
clemounet 2:6cc4c56940af 135 int i,j;
clemounet 2:6cc4c56940af 136 debug(level,module,line,msg);
clemounet 2:6cc4c56940af 137 debug_lock(true);
clemounet 2:6cc4c56940af 138
clemounet 2:6cc4c56940af 139 for(i = 0; i < len + ((len % HEXDUMP_COLS) ? (HEXDUMP_COLS - len % HEXDUMP_COLS) : 0); i++) {
clemounet 2:6cc4c56940af 140 /* print offset */
clemounet 2:6cc4c56940af 141 if(i % HEXDUMP_COLS == 0) {
clemounet 2:6cc4c56940af 142 printf("0x%04x: ", ((int)mem)+i);
clemounet 2:6cc4c56940af 143 }
clemounet 2:6cc4c56940af 144
clemounet 2:6cc4c56940af 145 /* print hex data */
clemounet 2:6cc4c56940af 146 if(i < len) {
clemounet 2:6cc4c56940af 147 printf("%02x ", 0xFF & ((char*)mem)[i]);
clemounet 2:6cc4c56940af 148 } else {
clemounet 2:6cc4c56940af 149 printf(" ");
clemounet 2:6cc4c56940af 150 }
clemounet 2:6cc4c56940af 151
clemounet 2:6cc4c56940af 152 /* print ASCII dump */
clemounet 2:6cc4c56940af 153 if(i % HEXDUMP_COLS == (HEXDUMP_COLS - 1)) {
clemounet 2:6cc4c56940af 154 for(j = i - (HEXDUMP_COLS - 1); j <= i; j++) {
clemounet 2:6cc4c56940af 155 if(j >= len) {
clemounet 2:6cc4c56940af 156 printf(" ");
clemounet 2:6cc4c56940af 157 } else if((*(mem+j)>31) && (*(mem+j)<128)){
clemounet 2:6cc4c56940af 158 printf("%c",*(mem+j));
clemounet 2:6cc4c56940af 159 } else {
clemounet 2:6cc4c56940af 160 printf(".");
clemounet 2:6cc4c56940af 161 }
clemounet 2:6cc4c56940af 162 }
clemounet 2:6cc4c56940af 163 printf(debug_newline);
clemounet 2:6cc4c56940af 164 }
clemounet 2:6cc4c56940af 165 }
clemounet 2:6cc4c56940af 166
clemounet 2:6cc4c56940af 167 printf(debug_newline);
clemounet 2:6cc4c56940af 168 fflush(stdout);
clemounet 2:6cc4c56940af 169 debug_lock(false);
clemounet 2:6cc4c56940af 170 }