Committer:
RichardUK
Date:
Sun Jul 08 20:18:58 2012 +0000
Revision:
0:63d45df56584
Fixed memory leak where endpoints were being allocated over and over again. Now only allocates on first use.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RichardUK 0:63d45df56584 1 #include <cstdarg>
RichardUK 0:63d45df56584 2 #include "Debug.h"
RichardUK 0:63d45df56584 3
RichardUK 0:63d45df56584 4 #ifdef __DEBUG
RichardUK 0:63d45df56584 5
RichardUK 0:63d45df56584 6 #define __LINE_LENGTH__ 93
RichardUK 0:63d45df56584 7
RichardUK 0:63d45df56584 8 void DebugHelper::Debug(const char* p_format, ...) {
RichardUK 0:63d45df56584 9 va_list argp;
RichardUK 0:63d45df56584 10
RichardUK 0:63d45df56584 11 va_start(argp, p_format);
RichardUK 0:63d45df56584 12 vprintf(p_format, argp);
RichardUK 0:63d45df56584 13 va_end(argp);
RichardUK 0:63d45df56584 14 } // End of method DebugHelper::Debug
RichardUK 0:63d45df56584 15
RichardUK 0:63d45df56584 16 void DebugHelper::HexaDump(unsigned char* p_buffer, int p_count, int p_offset) {
RichardUK 0:63d45df56584 17
RichardUK 0:63d45df56584 18 int currentIdx = p_offset;
RichardUK 0:63d45df56584 19 unsigned short startAddress = ((unsigned short)(p_offset / 16)) * 16;
RichardUK 0:63d45df56584 20
RichardUK 0:63d45df56584 21 // Display header
RichardUK 0:63d45df56584 22 printf(" HEX | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F : 0 1 2 3 4 5 6 7 8 9 A B C D E F \r\n");
RichardUK 0:63d45df56584 23 printf("-----|+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-:--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r\n");
RichardUK 0:63d45df56584 24 // 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 2
RichardUK 0:63d45df56584 25 // 0 1 2 3 4 5 6 7 8 9
RichardUK 0:63d45df56584 26 // Address offset padding
RichardUK 0:63d45df56584 27 char line[__LINE_LENGTH__ + 1];
RichardUK 0:63d45df56584 28 memset(line, 0x20, __LINE_LENGTH__);
RichardUK 0:63d45df56584 29 line[__LINE_LENGTH__] = 0x00; // NULL character
RichardUK 0:63d45df56584 30 sprintf(line, "%04x |", (unsigned short)startAddress);
RichardUK 0:63d45df56584 31 line[6] = 0x20; // Remove NULL character added by sprintf
RichardUK 0:63d45df56584 32 int idx = 0;
RichardUK 0:63d45df56584 33 int hexOffset = 7;
RichardUK 0:63d45df56584 34 int charOffset = 58;
RichardUK 0:63d45df56584 35 for ( ; idx < (int)(currentIdx % 16); idx++) {
RichardUK 0:63d45df56584 36 line[hexOffset] = 0x30;
RichardUK 0:63d45df56584 37 line[hexOffset + 1] = 0x30;
RichardUK 0:63d45df56584 38 hexOffset += 3;
RichardUK 0:63d45df56584 39 charOffset += 2;
RichardUK 0:63d45df56584 40 }
RichardUK 0:63d45df56584 41 // Fill line by line
RichardUK 0:63d45df56584 42 int endOfDump = p_count + p_offset;
RichardUK 0:63d45df56584 43 while(currentIdx < endOfDump) {
RichardUK 0:63d45df56584 44 for ( ; (idx < 16) && (currentIdx < endOfDump); idx++) {
RichardUK 0:63d45df56584 45 line[hexOffset] = DebugHelper::ToHexDigit(*(p_buffer + currentIdx) >> 4);
RichardUK 0:63d45df56584 46 line[hexOffset + 1] = DebugHelper::ToHexDigit(*(p_buffer + currentIdx) & 0x0f);
RichardUK 0:63d45df56584 47 line[charOffset] = DebugHelper::ToCharDigit(*(p_buffer + currentIdx));
RichardUK 0:63d45df56584 48 // Prepare next byte
RichardUK 0:63d45df56584 49 hexOffset += 3;
RichardUK 0:63d45df56584 50 charOffset += 2;
RichardUK 0:63d45df56584 51 currentIdx += 1;
RichardUK 0:63d45df56584 52 }
RichardUK 0:63d45df56584 53 // Display the line
RichardUK 0:63d45df56584 54 line[56] = ':';
RichardUK 0:63d45df56584 55 line[__LINE_LENGTH__ - 1] = 0x0d;
RichardUK 0:63d45df56584 56 line[__LINE_LENGTH__] = 0x0a;
RichardUK 0:63d45df56584 57 printf(line);
RichardUK 0:63d45df56584 58 if (currentIdx < endOfDump) { // Prepare next line, one line = 16 digits
RichardUK 0:63d45df56584 59 startAddress += 16;
RichardUK 0:63d45df56584 60 memset(line, 0x20, __LINE_LENGTH__);
RichardUK 0:63d45df56584 61 sprintf(line, "%04x |", (unsigned short)startAddress);
RichardUK 0:63d45df56584 62 line[6] = 0x20; // Remove NULL character added by sprintf
RichardUK 0:63d45df56584 63 idx = 0;
RichardUK 0:63d45df56584 64 hexOffset = 7;
RichardUK 0:63d45df56584 65 charOffset = 58;
RichardUK 0:63d45df56584 66 } else { // End of line padding
RichardUK 0:63d45df56584 67 break;
RichardUK 0:63d45df56584 68 }
RichardUK 0:63d45df56584 69 } // End of 'while' statement
RichardUK 0:63d45df56584 70 } // End of method DebugHelper::HexaDump
RichardUK 0:63d45df56584 71
RichardUK 0:63d45df56584 72 void DebugHelper::BreakPoint(const char* p_file, int p_line) {
RichardUK 0:63d45df56584 73 printf("Stop in %s at line %d\r\n", p_file, p_line);
RichardUK 0:63d45df56584 74 fflush(stdout);
RichardUK 0:63d45df56584 75 getchar();
RichardUK 0:63d45df56584 76 fflush(stdin);
RichardUK 0:63d45df56584 77 } // End of method DebugHelper::BreakPoint
RichardUK 0:63d45df56584 78
RichardUK 0:63d45df56584 79 #endif // __DEBUG