Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Debug.cpp@2:33e7ce63dd6d, 2012-09-19 (annotated)
- Committer:
- RichardUK
- Date:
- Wed Sep 19 16:44:32 2012 +0000
- Revision:
- 2:33e7ce63dd6d
- Parent:
- 0:63d45df56584
Testing lib update to another project.
Who changed what in which revision?
| 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 |