User | Revision | Line number | New 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
|