Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
XinZhangMS 0:f7f1f0d76dd6 1 // Copyright (c) Microsoft. All rights reserved.
XinZhangMS 0:f7f1f0d76dd6 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
XinZhangMS 0:f7f1f0d76dd6 3
XinZhangMS 0:f7f1f0d76dd6 4 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 5 #include "azure_c_shared_utility/consolelogger.h"
XinZhangMS 0:f7f1f0d76dd6 6
XinZhangMS 0:f7f1f0d76dd6 7 #ifndef NO_LOGGING
XinZhangMS 0:f7f1f0d76dd6 8
XinZhangMS 0:f7f1f0d76dd6 9
XinZhangMS 0:f7f1f0d76dd6 10 #ifdef WINCE
XinZhangMS 0:f7f1f0d76dd6 11 #include <stdarg.h>
XinZhangMS 0:f7f1f0d76dd6 12
XinZhangMS 0:f7f1f0d76dd6 13 void consolelogger_log(LOG_CATEGORY log_category, const char* file, const char* func, int line, unsigned int options, const char* format, ...)
XinZhangMS 0:f7f1f0d76dd6 14 {
XinZhangMS 0:f7f1f0d76dd6 15 va_list args;
XinZhangMS 0:f7f1f0d76dd6 16 va_start(args, format);
XinZhangMS 0:f7f1f0d76dd6 17
XinZhangMS 0:f7f1f0d76dd6 18 time_t t = time(NULL);
XinZhangMS 0:f7f1f0d76dd6 19
XinZhangMS 0:f7f1f0d76dd6 20 switch (log_category)
XinZhangMS 0:f7f1f0d76dd6 21 {
XinZhangMS 0:f7f1f0d76dd6 22 case AZ_LOG_INFO:
XinZhangMS 0:f7f1f0d76dd6 23 (void)printf("Info: ");
XinZhangMS 0:f7f1f0d76dd6 24 break;
XinZhangMS 0:f7f1f0d76dd6 25 case AZ_LOG_ERROR:
XinZhangMS 0:f7f1f0d76dd6 26 (void)printf("Error: Time:%.24s File:%s Func:%s Line:%d ", ctime(&t), file, func, line);
XinZhangMS 0:f7f1f0d76dd6 27 break;
XinZhangMS 0:f7f1f0d76dd6 28 default:
XinZhangMS 0:f7f1f0d76dd6 29 break;
XinZhangMS 0:f7f1f0d76dd6 30 }
XinZhangMS 0:f7f1f0d76dd6 31
XinZhangMS 0:f7f1f0d76dd6 32 (void)vprintf(format, args);
XinZhangMS 0:f7f1f0d76dd6 33 va_end(args);
XinZhangMS 0:f7f1f0d76dd6 34
XinZhangMS 0:f7f1f0d76dd6 35 (void)log_category;
XinZhangMS 0:f7f1f0d76dd6 36 if (options & LOG_LINE)
XinZhangMS 0:f7f1f0d76dd6 37 {
XinZhangMS 0:f7f1f0d76dd6 38 (void)printf("\r\n");
XinZhangMS 0:f7f1f0d76dd6 39 }
XinZhangMS 0:f7f1f0d76dd6 40 }
XinZhangMS 0:f7f1f0d76dd6 41 #endif
XinZhangMS 0:f7f1f0d76dd6 42
XinZhangMS 0:f7f1f0d76dd6 43 LOGGER_LOG global_log_function = consolelogger_log;
XinZhangMS 0:f7f1f0d76dd6 44
XinZhangMS 0:f7f1f0d76dd6 45 void xlogging_set_log_function(LOGGER_LOG log_function)
XinZhangMS 0:f7f1f0d76dd6 46 {
XinZhangMS 0:f7f1f0d76dd6 47 global_log_function = log_function;
XinZhangMS 0:f7f1f0d76dd6 48 }
XinZhangMS 0:f7f1f0d76dd6 49
XinZhangMS 0:f7f1f0d76dd6 50 LOGGER_LOG xlogging_get_log_function(void)
XinZhangMS 0:f7f1f0d76dd6 51 {
XinZhangMS 0:f7f1f0d76dd6 52 return global_log_function;
XinZhangMS 0:f7f1f0d76dd6 53 }
XinZhangMS 0:f7f1f0d76dd6 54
XinZhangMS 0:f7f1f0d76dd6 55 #if (defined(_MSC_VER)) && (!(defined WINCE))
XinZhangMS 0:f7f1f0d76dd6 56
XinZhangMS 0:f7f1f0d76dd6 57 LOGGER_LOG_GETLASTERROR global_log_function_GetLastError = consolelogger_log_with_GetLastError;
XinZhangMS 0:f7f1f0d76dd6 58
XinZhangMS 0:f7f1f0d76dd6 59 void xlogging_set_log_function_GetLastError(LOGGER_LOG_GETLASTERROR log_function_GetLastError)
XinZhangMS 0:f7f1f0d76dd6 60 {
XinZhangMS 0:f7f1f0d76dd6 61 global_log_function_GetLastError = log_function_GetLastError;
XinZhangMS 0:f7f1f0d76dd6 62 }
XinZhangMS 0:f7f1f0d76dd6 63
XinZhangMS 0:f7f1f0d76dd6 64 LOGGER_LOG_GETLASTERROR xlogging_get_log_function_GetLastError(void)
XinZhangMS 0:f7f1f0d76dd6 65 {
XinZhangMS 0:f7f1f0d76dd6 66 return global_log_function_GetLastError;
XinZhangMS 0:f7f1f0d76dd6 67 }
XinZhangMS 0:f7f1f0d76dd6 68 #endif
XinZhangMS 0:f7f1f0d76dd6 69
XinZhangMS 0:f7f1f0d76dd6 70 /* Print up to 16 bytes per line. */
XinZhangMS 0:f7f1f0d76dd6 71 #define LINE_SIZE 16
XinZhangMS 0:f7f1f0d76dd6 72
XinZhangMS 0:f7f1f0d76dd6 73 /* Return the printable char for the provided value. */
XinZhangMS 0:f7f1f0d76dd6 74 #define PRINTABLE(c) ((c >= ' ') && (c <= '~')) ? (char)c : '.'
XinZhangMS 0:f7f1f0d76dd6 75
XinZhangMS 0:f7f1f0d76dd6 76 /* Convert the lower nibble of the provided byte to a hexadecimal printable char. */
XinZhangMS 0:f7f1f0d76dd6 77 #define HEX_STR(c) (((c) & 0xF) < 0xA) ? (char)(((c) & 0xF) + '0') : (char)(((c) & 0xF) - 0xA + 'A')
XinZhangMS 0:f7f1f0d76dd6 78
XinZhangMS 0:f7f1f0d76dd6 79 void LogBinary(const char* comment, const void* data, size_t size)
XinZhangMS 0:f7f1f0d76dd6 80 {
XinZhangMS 0:f7f1f0d76dd6 81 char charBuf[LINE_SIZE + 1];
XinZhangMS 0:f7f1f0d76dd6 82 char hexBuf[LINE_SIZE * 3 + 1];
XinZhangMS 0:f7f1f0d76dd6 83 size_t countbuf = 0;
XinZhangMS 0:f7f1f0d76dd6 84 size_t i = 0;
XinZhangMS 0:f7f1f0d76dd6 85 const unsigned char* bufAsChar = (const unsigned char*)data;
XinZhangMS 0:f7f1f0d76dd6 86 const unsigned char* startPos = bufAsChar;
XinZhangMS 0:f7f1f0d76dd6 87
XinZhangMS 0:f7f1f0d76dd6 88 LOG(AZ_LOG_TRACE, LOG_LINE, "%s %lu bytes", comment, size);
XinZhangMS 0:f7f1f0d76dd6 89
XinZhangMS 0:f7f1f0d76dd6 90 /* Print the whole buffer. */
XinZhangMS 0:f7f1f0d76dd6 91 for (i = 0; i < size; i++)
XinZhangMS 0:f7f1f0d76dd6 92 {
XinZhangMS 0:f7f1f0d76dd6 93 /* Store the printable value of the char in the charBuf to print. */
XinZhangMS 0:f7f1f0d76dd6 94 charBuf[countbuf] = PRINTABLE(*bufAsChar);
XinZhangMS 0:f7f1f0d76dd6 95
XinZhangMS 0:f7f1f0d76dd6 96 /* Convert the high nibble to a printable hexadecimal value. */
XinZhangMS 0:f7f1f0d76dd6 97 hexBuf[countbuf * 3] = HEX_STR(*bufAsChar >> 4);
XinZhangMS 0:f7f1f0d76dd6 98
XinZhangMS 0:f7f1f0d76dd6 99 /* Convert the low nibble to a printable hexadecimal value. */
XinZhangMS 0:f7f1f0d76dd6 100 hexBuf[countbuf * 3 + 1] = HEX_STR(*bufAsChar);
XinZhangMS 0:f7f1f0d76dd6 101
XinZhangMS 0:f7f1f0d76dd6 102 hexBuf[countbuf * 3 + 2] = ' ';
XinZhangMS 0:f7f1f0d76dd6 103
XinZhangMS 0:f7f1f0d76dd6 104 countbuf++;
XinZhangMS 0:f7f1f0d76dd6 105 bufAsChar++;
XinZhangMS 0:f7f1f0d76dd6 106 /* If the line is full, print it to start another one. */
XinZhangMS 0:f7f1f0d76dd6 107 if (countbuf == LINE_SIZE)
XinZhangMS 0:f7f1f0d76dd6 108 {
XinZhangMS 0:f7f1f0d76dd6 109 charBuf[countbuf] = '\0';
XinZhangMS 0:f7f1f0d76dd6 110 hexBuf[countbuf * 3] = '\0';
XinZhangMS 0:f7f1f0d76dd6 111 LOG(AZ_LOG_TRACE, LOG_LINE, "%p: %s %s", startPos, hexBuf, charBuf);
XinZhangMS 0:f7f1f0d76dd6 112 countbuf = 0;
XinZhangMS 0:f7f1f0d76dd6 113 startPos = bufAsChar;
XinZhangMS 0:f7f1f0d76dd6 114 }
XinZhangMS 0:f7f1f0d76dd6 115 }
XinZhangMS 0:f7f1f0d76dd6 116
XinZhangMS 0:f7f1f0d76dd6 117 /* If the last line does not fit the line size. */
XinZhangMS 0:f7f1f0d76dd6 118 if (countbuf > 0)
XinZhangMS 0:f7f1f0d76dd6 119 {
XinZhangMS 0:f7f1f0d76dd6 120 /* Close the charBuf string. */
XinZhangMS 0:f7f1f0d76dd6 121 charBuf[countbuf] = '\0';
XinZhangMS 0:f7f1f0d76dd6 122
XinZhangMS 0:f7f1f0d76dd6 123 /* Fill the hexBuf with spaces to keep the charBuf alignment. */
XinZhangMS 0:f7f1f0d76dd6 124 while ((countbuf++) < LINE_SIZE - 1)
XinZhangMS 0:f7f1f0d76dd6 125 {
XinZhangMS 0:f7f1f0d76dd6 126 hexBuf[countbuf * 3] = ' ';
XinZhangMS 0:f7f1f0d76dd6 127 hexBuf[countbuf * 3 + 1] = ' ';
XinZhangMS 0:f7f1f0d76dd6 128 hexBuf[countbuf * 3 + 2] = ' ';
XinZhangMS 0:f7f1f0d76dd6 129 }
XinZhangMS 0:f7f1f0d76dd6 130 hexBuf[countbuf * 3] = '\0';
XinZhangMS 0:f7f1f0d76dd6 131
XinZhangMS 0:f7f1f0d76dd6 132 /* Print the last line. */
XinZhangMS 0:f7f1f0d76dd6 133 LOG(AZ_LOG_TRACE, LOG_LINE, "%p: %s %s", startPos, hexBuf, charBuf);
XinZhangMS 0:f7f1f0d76dd6 134 }
XinZhangMS 0:f7f1f0d76dd6 135 }
XinZhangMS 0:f7f1f0d76dd6 136
XinZhangMS 0:f7f1f0d76dd6 137 #endif