Tracing Library

Committer:
Yogesh Pande
Date:
Thu Mar 31 18:10:53 2016 +0300
Revision:
1:506ad37c6bd7
mbed-trace v1.1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Yogesh Pande 1:506ad37c6bd7 1 /*
Yogesh Pande 1:506ad37c6bd7 2 * Copyright (c) 2014-2015 ARM Limited. All rights reserved.
Yogesh Pande 1:506ad37c6bd7 3 * SPDX-License-Identifier: Apache-2.0
Yogesh Pande 1:506ad37c6bd7 4 * Licensed under the Apache License, Version 2.0 (the License); you may
Yogesh Pande 1:506ad37c6bd7 5 * not use this file except in compliance with the License.
Yogesh Pande 1:506ad37c6bd7 6 * You may obtain a copy of the License at
Yogesh Pande 1:506ad37c6bd7 7 *
Yogesh Pande 1:506ad37c6bd7 8 * http://www.apache.org/licenses/LICENSE-2.0
Yogesh Pande 1:506ad37c6bd7 9 *
Yogesh Pande 1:506ad37c6bd7 10 * Unless required by applicable law or agreed to in writing, software
Yogesh Pande 1:506ad37c6bd7 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
Yogesh Pande 1:506ad37c6bd7 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Yogesh Pande 1:506ad37c6bd7 13 * See the License for the specific language governing permissions and
Yogesh Pande 1:506ad37c6bd7 14 * limitations under the License.
Yogesh Pande 1:506ad37c6bd7 15 */
Yogesh Pande 1:506ad37c6bd7 16 #include <stdio.h>
Yogesh Pande 1:506ad37c6bd7 17 #include <string.h>
Yogesh Pande 1:506ad37c6bd7 18 #include <stdarg.h>
Yogesh Pande 1:506ad37c6bd7 19 #include <stdlib.h>
Yogesh Pande 1:506ad37c6bd7 20
Yogesh Pande 1:506ad37c6bd7 21 #ifndef YOTTA_CFG_MBED_TRACE
Yogesh Pande 1:506ad37c6bd7 22 #define YOTTA_CFG_MBED_TRACE
Yogesh Pande 1:506ad37c6bd7 23 #define YOTTA_CFG_MBED_TRACE_FEA_IPV6 1
Yogesh Pande 1:506ad37c6bd7 24 #endif
Yogesh Pande 1:506ad37c6bd7 25
Yogesh Pande 1:506ad37c6bd7 26 #include "mbed-trace/mbed_trace.h"
Yogesh Pande 1:506ad37c6bd7 27 #if YOTTA_CFG_MTRACE_FEA_IPV6 == 1
Yogesh Pande 1:506ad37c6bd7 28 #include "mbed-trace/mbed_trace_ip6tos.h"
Yogesh Pande 1:506ad37c6bd7 29 #endif
Yogesh Pande 1:506ad37c6bd7 30
Yogesh Pande 1:506ad37c6bd7 31 #ifndef MEM_ALLOC
Yogesh Pande 1:506ad37c6bd7 32 #define MEM_ALLOC malloc
Yogesh Pande 1:506ad37c6bd7 33 #endif
Yogesh Pande 1:506ad37c6bd7 34 #ifndef MEM_FREE
Yogesh Pande 1:506ad37c6bd7 35 #define MEM_FREE free
Yogesh Pande 1:506ad37c6bd7 36 #endif
Yogesh Pande 1:506ad37c6bd7 37
Yogesh Pande 1:506ad37c6bd7 38 #define VT100_COLOR_ERROR "\x1b[31m"
Yogesh Pande 1:506ad37c6bd7 39 #define VT100_COLOR_WARN "\x1b[33m"
Yogesh Pande 1:506ad37c6bd7 40 #define VT100_COLOR_INFO "\x1b[39m"
Yogesh Pande 1:506ad37c6bd7 41 #define VT100_COLOR_DEBUG "\x1b[90m"
Yogesh Pande 1:506ad37c6bd7 42
Yogesh Pande 1:506ad37c6bd7 43 /** default max trace line size in bytes */
Yogesh Pande 1:506ad37c6bd7 44 #ifdef YOTTA_CFG_MBED_TRACE_LINE_LENGTH
Yogesh Pande 1:506ad37c6bd7 45 #define DEFAULT_TRACE_LINE_LENGTH YOTTA_CFG_MBED_TRACE_LINE_LENGTH
Yogesh Pande 1:506ad37c6bd7 46 #else
Yogesh Pande 1:506ad37c6bd7 47 #define DEFAULT_TRACE_LINE_LENGTH 1024
Yogesh Pande 1:506ad37c6bd7 48 #endif
Yogesh Pande 1:506ad37c6bd7 49 /** default max temporary buffer size in bytes, used in
Yogesh Pande 1:506ad37c6bd7 50 trace_ipv6, trace_array and trace_strn */
Yogesh Pande 1:506ad37c6bd7 51 #ifdef YOTTA_CFG_MTRACE_TMP_LINE_LEN
Yogesh Pande 1:506ad37c6bd7 52 #define DEFAULT_TRACE_TMP_LINE_LEN YOTTA_CFG_MTRACE_TMP_LINE_LEN
Yogesh Pande 1:506ad37c6bd7 53 #else
Yogesh Pande 1:506ad37c6bd7 54 #define DEFAULT_TRACE_TMP_LINE_LEN 128
Yogesh Pande 1:506ad37c6bd7 55 #endif
Yogesh Pande 1:506ad37c6bd7 56 /** default max filters (include/exclude) length in bytes */
Yogesh Pande 1:506ad37c6bd7 57 #define DEFAULT_TRACE_FILTER_LENGTH 24
Yogesh Pande 1:506ad37c6bd7 58
Yogesh Pande 1:506ad37c6bd7 59 /** default print function, just redirect str to printf */
Yogesh Pande 1:506ad37c6bd7 60 static void mbed_trace_realloc( char **buffer, int *length_ptr, int new_length);
Yogesh Pande 1:506ad37c6bd7 61 static void mbed_trace_default_print(const char *str);
Yogesh Pande 1:506ad37c6bd7 62 static void mbed_trace_reset_tmp(void);
Yogesh Pande 1:506ad37c6bd7 63
Yogesh Pande 1:506ad37c6bd7 64 typedef struct trace_s {
Yogesh Pande 1:506ad37c6bd7 65 /** trace configuration bits */
Yogesh Pande 1:506ad37c6bd7 66 uint8_t trace_config;
Yogesh Pande 1:506ad37c6bd7 67 /** exclude filters list, related group name */
Yogesh Pande 1:506ad37c6bd7 68 char *filters_exclude;
Yogesh Pande 1:506ad37c6bd7 69 /** include filters list, related group name */
Yogesh Pande 1:506ad37c6bd7 70 char *filters_include;
Yogesh Pande 1:506ad37c6bd7 71 /** Filters length */
Yogesh Pande 1:506ad37c6bd7 72 int filters_length;
Yogesh Pande 1:506ad37c6bd7 73 /** trace line */
Yogesh Pande 1:506ad37c6bd7 74 char *line;
Yogesh Pande 1:506ad37c6bd7 75 /** trace line length */
Yogesh Pande 1:506ad37c6bd7 76 int line_length;
Yogesh Pande 1:506ad37c6bd7 77 /** temporary data */
Yogesh Pande 1:506ad37c6bd7 78 char *tmp_data;
Yogesh Pande 1:506ad37c6bd7 79 /** temporary data array length */
Yogesh Pande 1:506ad37c6bd7 80 int tmp_data_length;
Yogesh Pande 1:506ad37c6bd7 81 /** temporary data pointer */
Yogesh Pande 1:506ad37c6bd7 82 char *tmp_data_ptr;
Yogesh Pande 1:506ad37c6bd7 83
Yogesh Pande 1:506ad37c6bd7 84 /** prefix function, which can be used to put time to the trace line */
Yogesh Pande 1:506ad37c6bd7 85 char *(*prefix_f)(size_t);
Yogesh Pande 1:506ad37c6bd7 86 /** suffix function, which can be used to some string to the end of trace line */
Yogesh Pande 1:506ad37c6bd7 87 char *(*suffix_f)(void);
Yogesh Pande 1:506ad37c6bd7 88 /** print out function. Can be redirect to flash for example. */
Yogesh Pande 1:506ad37c6bd7 89 void (*printf)(const char *);
Yogesh Pande 1:506ad37c6bd7 90 /** print out function for TRACE_LEVEL_CMD */
Yogesh Pande 1:506ad37c6bd7 91 void (*cmd_printf)(const char *);
Yogesh Pande 1:506ad37c6bd7 92 } trace_t;
Yogesh Pande 1:506ad37c6bd7 93
Yogesh Pande 1:506ad37c6bd7 94 static trace_t m_trace = {
Yogesh Pande 1:506ad37c6bd7 95 .filters_exclude = 0,
Yogesh Pande 1:506ad37c6bd7 96 .filters_include = 0,
Yogesh Pande 1:506ad37c6bd7 97 .line = 0,
Yogesh Pande 1:506ad37c6bd7 98 .tmp_data = 0,
Yogesh Pande 1:506ad37c6bd7 99 .prefix_f = 0,
Yogesh Pande 1:506ad37c6bd7 100 .suffix_f = 0,
Yogesh Pande 1:506ad37c6bd7 101 .printf = 0,
Yogesh Pande 1:506ad37c6bd7 102 .cmd_printf = 0
Yogesh Pande 1:506ad37c6bd7 103 };
Yogesh Pande 1:506ad37c6bd7 104
Yogesh Pande 1:506ad37c6bd7 105 int mbed_trace_init(void)
Yogesh Pande 1:506ad37c6bd7 106 {
Yogesh Pande 1:506ad37c6bd7 107 m_trace.trace_config = TRACE_MODE_COLOR | TRACE_ACTIVE_LEVEL_ALL | TRACE_CARRIAGE_RETURN;
Yogesh Pande 1:506ad37c6bd7 108 m_trace.line_length = DEFAULT_TRACE_LINE_LENGTH;
Yogesh Pande 1:506ad37c6bd7 109 if (m_trace.line == NULL) {
Yogesh Pande 1:506ad37c6bd7 110 m_trace.line = MEM_ALLOC(m_trace.line_length);
Yogesh Pande 1:506ad37c6bd7 111 }
Yogesh Pande 1:506ad37c6bd7 112 m_trace.tmp_data_length = DEFAULT_TRACE_TMP_LINE_LEN;
Yogesh Pande 1:506ad37c6bd7 113 if (m_trace.tmp_data == NULL) {
Yogesh Pande 1:506ad37c6bd7 114 m_trace.tmp_data = MEM_ALLOC(m_trace.tmp_data_length);
Yogesh Pande 1:506ad37c6bd7 115 }
Yogesh Pande 1:506ad37c6bd7 116 m_trace.tmp_data_ptr = m_trace.tmp_data;
Yogesh Pande 1:506ad37c6bd7 117 m_trace.filters_length = DEFAULT_TRACE_FILTER_LENGTH;
Yogesh Pande 1:506ad37c6bd7 118 if (m_trace.filters_exclude == NULL) {
Yogesh Pande 1:506ad37c6bd7 119 m_trace.filters_exclude = MEM_ALLOC(m_trace.filters_length);
Yogesh Pande 1:506ad37c6bd7 120 }
Yogesh Pande 1:506ad37c6bd7 121 if (m_trace.filters_include == NULL) {
Yogesh Pande 1:506ad37c6bd7 122 m_trace.filters_include = MEM_ALLOC(m_trace.filters_length);
Yogesh Pande 1:506ad37c6bd7 123 }
Yogesh Pande 1:506ad37c6bd7 124
Yogesh Pande 1:506ad37c6bd7 125 if (m_trace.line == NULL ||
Yogesh Pande 1:506ad37c6bd7 126 m_trace.tmp_data == NULL ||
Yogesh Pande 1:506ad37c6bd7 127 m_trace.filters_exclude == NULL ||
Yogesh Pande 1:506ad37c6bd7 128 m_trace.filters_include == NULL) {
Yogesh Pande 1:506ad37c6bd7 129 //memory allocation fail
Yogesh Pande 1:506ad37c6bd7 130 mbed_trace_free();
Yogesh Pande 1:506ad37c6bd7 131 return -1;
Yogesh Pande 1:506ad37c6bd7 132 }
Yogesh Pande 1:506ad37c6bd7 133 memset(m_trace.tmp_data, 0, m_trace.tmp_data_length);
Yogesh Pande 1:506ad37c6bd7 134 memset(m_trace.filters_exclude, 0, m_trace.filters_length);
Yogesh Pande 1:506ad37c6bd7 135 memset(m_trace.filters_include, 0, m_trace.filters_length);
Yogesh Pande 1:506ad37c6bd7 136 memset(m_trace.line, 0, m_trace.line_length);
Yogesh Pande 1:506ad37c6bd7 137
Yogesh Pande 1:506ad37c6bd7 138 m_trace.prefix_f = 0;
Yogesh Pande 1:506ad37c6bd7 139 m_trace.suffix_f = 0;
Yogesh Pande 1:506ad37c6bd7 140 m_trace.printf = mbed_trace_default_print;
Yogesh Pande 1:506ad37c6bd7 141 m_trace.cmd_printf = 0;
Yogesh Pande 1:506ad37c6bd7 142
Yogesh Pande 1:506ad37c6bd7 143 return 0;
Yogesh Pande 1:506ad37c6bd7 144 }
Yogesh Pande 1:506ad37c6bd7 145 void mbed_trace_free(void)
Yogesh Pande 1:506ad37c6bd7 146 {
Yogesh Pande 1:506ad37c6bd7 147 MEM_FREE(m_trace.line);
Yogesh Pande 1:506ad37c6bd7 148 m_trace.line_length = 0;
Yogesh Pande 1:506ad37c6bd7 149 m_trace.line = 0;
Yogesh Pande 1:506ad37c6bd7 150 MEM_FREE(m_trace.tmp_data);
Yogesh Pande 1:506ad37c6bd7 151 m_trace.tmp_data = 0;
Yogesh Pande 1:506ad37c6bd7 152 m_trace.tmp_data_ptr = 0;
Yogesh Pande 1:506ad37c6bd7 153 MEM_FREE(m_trace.filters_exclude);
Yogesh Pande 1:506ad37c6bd7 154 m_trace.filters_exclude = 0;
Yogesh Pande 1:506ad37c6bd7 155 MEM_FREE(m_trace.filters_include);
Yogesh Pande 1:506ad37c6bd7 156 m_trace.filters_include = 0;
Yogesh Pande 1:506ad37c6bd7 157 m_trace.filters_length = 0;
Yogesh Pande 1:506ad37c6bd7 158 m_trace.prefix_f = 0;
Yogesh Pande 1:506ad37c6bd7 159 m_trace.suffix_f = 0;
Yogesh Pande 1:506ad37c6bd7 160 m_trace.printf = mbed_trace_default_print;
Yogesh Pande 1:506ad37c6bd7 161 m_trace.cmd_printf = 0;
Yogesh Pande 1:506ad37c6bd7 162 }
Yogesh Pande 1:506ad37c6bd7 163 static void mbed_trace_realloc( char **buffer, int *length_ptr, int new_length)
Yogesh Pande 1:506ad37c6bd7 164 {
Yogesh Pande 1:506ad37c6bd7 165 MEM_FREE(*buffer);
Yogesh Pande 1:506ad37c6bd7 166 *buffer = MEM_ALLOC(new_length);
Yogesh Pande 1:506ad37c6bd7 167 *length_ptr = new_length;
Yogesh Pande 1:506ad37c6bd7 168 }
Yogesh Pande 1:506ad37c6bd7 169 void mbed_trace_buffer_sizes(int lineLength, int tmpLength)
Yogesh Pande 1:506ad37c6bd7 170 {
Yogesh Pande 1:506ad37c6bd7 171 if( lineLength > 0 ) {
Yogesh Pande 1:506ad37c6bd7 172 mbed_trace_realloc( &(m_trace.line), &m_trace.line_length, lineLength );
Yogesh Pande 1:506ad37c6bd7 173 }
Yogesh Pande 1:506ad37c6bd7 174 if( tmpLength > 0 ) {
Yogesh Pande 1:506ad37c6bd7 175 mbed_trace_realloc( &(m_trace.tmp_data), &m_trace.tmp_data_length, tmpLength);
Yogesh Pande 1:506ad37c6bd7 176 mbed_trace_reset_tmp();
Yogesh Pande 1:506ad37c6bd7 177 }
Yogesh Pande 1:506ad37c6bd7 178 }
Yogesh Pande 1:506ad37c6bd7 179 void mbed_trace_config_set(uint8_t config)
Yogesh Pande 1:506ad37c6bd7 180 {
Yogesh Pande 1:506ad37c6bd7 181 m_trace.trace_config = config;
Yogesh Pande 1:506ad37c6bd7 182 }
Yogesh Pande 1:506ad37c6bd7 183 uint8_t mbed_trace_config_get(void)
Yogesh Pande 1:506ad37c6bd7 184 {
Yogesh Pande 1:506ad37c6bd7 185 return m_trace.trace_config;
Yogesh Pande 1:506ad37c6bd7 186 }
Yogesh Pande 1:506ad37c6bd7 187 void mbed_trace_prefix_function_set(char *(*pref_f)(size_t))
Yogesh Pande 1:506ad37c6bd7 188 {
Yogesh Pande 1:506ad37c6bd7 189 m_trace.prefix_f = pref_f;
Yogesh Pande 1:506ad37c6bd7 190 }
Yogesh Pande 1:506ad37c6bd7 191 void mbed_trace_suffix_function_set(char *(*suffix_f)(void))
Yogesh Pande 1:506ad37c6bd7 192 {
Yogesh Pande 1:506ad37c6bd7 193 m_trace.suffix_f = suffix_f;
Yogesh Pande 1:506ad37c6bd7 194 }
Yogesh Pande 1:506ad37c6bd7 195 void mbed_trace_print_function_set(void (*printf)(const char *))
Yogesh Pande 1:506ad37c6bd7 196 {
Yogesh Pande 1:506ad37c6bd7 197 m_trace.printf = printf;
Yogesh Pande 1:506ad37c6bd7 198 }
Yogesh Pande 1:506ad37c6bd7 199 void mbed_trace_cmdprint_function_set(void (*printf)(const char *))
Yogesh Pande 1:506ad37c6bd7 200 {
Yogesh Pande 1:506ad37c6bd7 201 m_trace.cmd_printf = printf;
Yogesh Pande 1:506ad37c6bd7 202 }
Yogesh Pande 1:506ad37c6bd7 203 void mbed_trace_exclude_filters_set(char *filters)
Yogesh Pande 1:506ad37c6bd7 204 {
Yogesh Pande 1:506ad37c6bd7 205 if (filters) {
Yogesh Pande 1:506ad37c6bd7 206 (void)strncpy(m_trace.filters_exclude, filters, m_trace.filters_length);
Yogesh Pande 1:506ad37c6bd7 207 } else {
Yogesh Pande 1:506ad37c6bd7 208 m_trace.filters_exclude[0] = 0;
Yogesh Pande 1:506ad37c6bd7 209 }
Yogesh Pande 1:506ad37c6bd7 210 }
Yogesh Pande 1:506ad37c6bd7 211 const char *mbed_trace_exclude_filters_get(void)
Yogesh Pande 1:506ad37c6bd7 212 {
Yogesh Pande 1:506ad37c6bd7 213 return m_trace.filters_exclude;
Yogesh Pande 1:506ad37c6bd7 214 }
Yogesh Pande 1:506ad37c6bd7 215 const char *mbed_trace_include_filters_get(void)
Yogesh Pande 1:506ad37c6bd7 216 {
Yogesh Pande 1:506ad37c6bd7 217 return m_trace.filters_include;
Yogesh Pande 1:506ad37c6bd7 218 }
Yogesh Pande 1:506ad37c6bd7 219 void mbed_trace_include_filters_set(char *filters)
Yogesh Pande 1:506ad37c6bd7 220 {
Yogesh Pande 1:506ad37c6bd7 221 if (filters) {
Yogesh Pande 1:506ad37c6bd7 222 (void)strncpy(m_trace.filters_include, filters, m_trace.filters_length);
Yogesh Pande 1:506ad37c6bd7 223 } else {
Yogesh Pande 1:506ad37c6bd7 224 m_trace.filters_include[0] = 0;
Yogesh Pande 1:506ad37c6bd7 225 }
Yogesh Pande 1:506ad37c6bd7 226 }
Yogesh Pande 1:506ad37c6bd7 227 static int8_t mbed_trace_skip(int8_t dlevel, const char *grp)
Yogesh Pande 1:506ad37c6bd7 228 {
Yogesh Pande 1:506ad37c6bd7 229 if (dlevel >= 0 && grp != 0) {
Yogesh Pande 1:506ad37c6bd7 230 // filter debug prints only when dlevel is >0 and grp is given
Yogesh Pande 1:506ad37c6bd7 231
Yogesh Pande 1:506ad37c6bd7 232 /// @TODO this could be much better..
Yogesh Pande 1:506ad37c6bd7 233 if (m_trace.filters_exclude[0] != '\0' &&
Yogesh Pande 1:506ad37c6bd7 234 strstr(m_trace.filters_exclude, grp) != 0) {
Yogesh Pande 1:506ad37c6bd7 235 //grp was in exclude list
Yogesh Pande 1:506ad37c6bd7 236 return 1;
Yogesh Pande 1:506ad37c6bd7 237 }
Yogesh Pande 1:506ad37c6bd7 238 if (m_trace.filters_include[0] != '\0' &&
Yogesh Pande 1:506ad37c6bd7 239 strstr(m_trace.filters_include, grp) == 0) {
Yogesh Pande 1:506ad37c6bd7 240 //grp was in include list
Yogesh Pande 1:506ad37c6bd7 241 return 1;
Yogesh Pande 1:506ad37c6bd7 242 }
Yogesh Pande 1:506ad37c6bd7 243 }
Yogesh Pande 1:506ad37c6bd7 244 return 0;
Yogesh Pande 1:506ad37c6bd7 245 }
Yogesh Pande 1:506ad37c6bd7 246 static void mbed_trace_default_print(const char *str)
Yogesh Pande 1:506ad37c6bd7 247 {
Yogesh Pande 1:506ad37c6bd7 248 puts(str);
Yogesh Pande 1:506ad37c6bd7 249 }
Yogesh Pande 1:506ad37c6bd7 250 void mbed_tracef(uint8_t dlevel, const char *grp, const char *fmt, ...)
Yogesh Pande 1:506ad37c6bd7 251 {
Yogesh Pande 1:506ad37c6bd7 252 if (NULL == m_trace.line) {
Yogesh Pande 1:506ad37c6bd7 253 return;
Yogesh Pande 1:506ad37c6bd7 254 }
Yogesh Pande 1:506ad37c6bd7 255
Yogesh Pande 1:506ad37c6bd7 256 m_trace.line[0] = 0; //by default trace is empty
Yogesh Pande 1:506ad37c6bd7 257
Yogesh Pande 1:506ad37c6bd7 258 if (mbed_trace_skip(dlevel, grp) || fmt == 0 || grp == 0 || !m_trace.printf) {
Yogesh Pande 1:506ad37c6bd7 259 //return tmp data pointer back to the beginning
Yogesh Pande 1:506ad37c6bd7 260 mbed_trace_reset_tmp();
Yogesh Pande 1:506ad37c6bd7 261 return;
Yogesh Pande 1:506ad37c6bd7 262 }
Yogesh Pande 1:506ad37c6bd7 263 if ((m_trace.trace_config & TRACE_MASK_LEVEL) & dlevel) {
Yogesh Pande 1:506ad37c6bd7 264 bool color = (m_trace.trace_config & TRACE_MODE_COLOR) != 0;
Yogesh Pande 1:506ad37c6bd7 265 bool plain = (m_trace.trace_config & TRACE_MODE_PLAIN) != 0;
Yogesh Pande 1:506ad37c6bd7 266 bool cr = (m_trace.trace_config & TRACE_CARRIAGE_RETURN) != 0;
Yogesh Pande 1:506ad37c6bd7 267
Yogesh Pande 1:506ad37c6bd7 268 int retval = 0, bLeft = m_trace.line_length;
Yogesh Pande 1:506ad37c6bd7 269 char *ptr = m_trace.line;
Yogesh Pande 1:506ad37c6bd7 270 if (plain == true || dlevel == TRACE_LEVEL_CMD) {
Yogesh Pande 1:506ad37c6bd7 271 va_list ap;
Yogesh Pande 1:506ad37c6bd7 272 va_start(ap, fmt);
Yogesh Pande 1:506ad37c6bd7 273 //add trace data
Yogesh Pande 1:506ad37c6bd7 274 retval = vsnprintf(ptr, bLeft, fmt, ap);
Yogesh Pande 1:506ad37c6bd7 275 va_end(ap);
Yogesh Pande 1:506ad37c6bd7 276 if (dlevel == TRACE_LEVEL_CMD && m_trace.cmd_printf) {
Yogesh Pande 1:506ad37c6bd7 277 m_trace.cmd_printf(m_trace.line);
Yogesh Pande 1:506ad37c6bd7 278 m_trace.cmd_printf("\n");
Yogesh Pande 1:506ad37c6bd7 279 } else {
Yogesh Pande 1:506ad37c6bd7 280 //print out whole data
Yogesh Pande 1:506ad37c6bd7 281 m_trace.printf(m_trace.line);
Yogesh Pande 1:506ad37c6bd7 282 }
Yogesh Pande 1:506ad37c6bd7 283 } else {
Yogesh Pande 1:506ad37c6bd7 284 if (color) {
Yogesh Pande 1:506ad37c6bd7 285 if (cr) {
Yogesh Pande 1:506ad37c6bd7 286 retval = snprintf(ptr, bLeft, "\r\x1b[2K");
Yogesh Pande 1:506ad37c6bd7 287 if (retval >= bLeft) {
Yogesh Pande 1:506ad37c6bd7 288 retval = 0;
Yogesh Pande 1:506ad37c6bd7 289 }
Yogesh Pande 1:506ad37c6bd7 290 if (retval > 0) {
Yogesh Pande 1:506ad37c6bd7 291 ptr += retval;
Yogesh Pande 1:506ad37c6bd7 292 bLeft -= retval;
Yogesh Pande 1:506ad37c6bd7 293 }
Yogesh Pande 1:506ad37c6bd7 294 }
Yogesh Pande 1:506ad37c6bd7 295 if (bLeft > 0) {
Yogesh Pande 1:506ad37c6bd7 296 //include color in ANSI/VT100 escape code
Yogesh Pande 1:506ad37c6bd7 297 switch (dlevel) {
Yogesh Pande 1:506ad37c6bd7 298 case (TRACE_LEVEL_ERROR):
Yogesh Pande 1:506ad37c6bd7 299 retval = snprintf(ptr, bLeft, "%s", VT100_COLOR_ERROR);
Yogesh Pande 1:506ad37c6bd7 300 break;
Yogesh Pande 1:506ad37c6bd7 301 case (TRACE_LEVEL_WARN):
Yogesh Pande 1:506ad37c6bd7 302 retval = snprintf(ptr, bLeft, "%s", VT100_COLOR_WARN);
Yogesh Pande 1:506ad37c6bd7 303 break;
Yogesh Pande 1:506ad37c6bd7 304 case (TRACE_LEVEL_INFO):
Yogesh Pande 1:506ad37c6bd7 305 retval = snprintf(ptr, bLeft, "%s", VT100_COLOR_INFO);
Yogesh Pande 1:506ad37c6bd7 306 break;
Yogesh Pande 1:506ad37c6bd7 307 case (TRACE_LEVEL_DEBUG):
Yogesh Pande 1:506ad37c6bd7 308 retval = snprintf(ptr, bLeft, "%s", VT100_COLOR_DEBUG);
Yogesh Pande 1:506ad37c6bd7 309 break;
Yogesh Pande 1:506ad37c6bd7 310 default:
Yogesh Pande 1:506ad37c6bd7 311 color = 0; //avoid unneeded color-terminate code
Yogesh Pande 1:506ad37c6bd7 312 retval = 0;
Yogesh Pande 1:506ad37c6bd7 313 break;
Yogesh Pande 1:506ad37c6bd7 314 }
Yogesh Pande 1:506ad37c6bd7 315 if (retval >= bLeft) {
Yogesh Pande 1:506ad37c6bd7 316 retval = 0;
Yogesh Pande 1:506ad37c6bd7 317 }
Yogesh Pande 1:506ad37c6bd7 318 if (retval > 0 && color) {
Yogesh Pande 1:506ad37c6bd7 319 ptr += retval;
Yogesh Pande 1:506ad37c6bd7 320 bLeft -= retval;
Yogesh Pande 1:506ad37c6bd7 321 }
Yogesh Pande 1:506ad37c6bd7 322 }
Yogesh Pande 1:506ad37c6bd7 323
Yogesh Pande 1:506ad37c6bd7 324 }
Yogesh Pande 1:506ad37c6bd7 325 if (bLeft > 0 && m_trace.prefix_f) {
Yogesh Pande 1:506ad37c6bd7 326 va_list ap;
Yogesh Pande 1:506ad37c6bd7 327 va_start(ap, fmt);
Yogesh Pande 1:506ad37c6bd7 328 //find out length of body
Yogesh Pande 1:506ad37c6bd7 329 size_t sz = 0;
Yogesh Pande 1:506ad37c6bd7 330 sz = vsnprintf(NULL, 0, fmt, ap) + retval + (retval ? 4 : 0);
Yogesh Pande 1:506ad37c6bd7 331 //add prefix string
Yogesh Pande 1:506ad37c6bd7 332 retval = snprintf(ptr, bLeft, "%s", m_trace.prefix_f(sz));
Yogesh Pande 1:506ad37c6bd7 333 if (retval >= bLeft) {
Yogesh Pande 1:506ad37c6bd7 334 retval = 0;
Yogesh Pande 1:506ad37c6bd7 335 }
Yogesh Pande 1:506ad37c6bd7 336 if (retval > 0) {
Yogesh Pande 1:506ad37c6bd7 337 ptr += retval;
Yogesh Pande 1:506ad37c6bd7 338 bLeft -= retval;
Yogesh Pande 1:506ad37c6bd7 339 }
Yogesh Pande 1:506ad37c6bd7 340 va_end(ap);
Yogesh Pande 1:506ad37c6bd7 341 }
Yogesh Pande 1:506ad37c6bd7 342 if (bLeft > 0) {
Yogesh Pande 1:506ad37c6bd7 343 //add group tag
Yogesh Pande 1:506ad37c6bd7 344 switch (dlevel) {
Yogesh Pande 1:506ad37c6bd7 345 case (TRACE_LEVEL_ERROR):
Yogesh Pande 1:506ad37c6bd7 346 retval = snprintf(ptr, bLeft, "[ERR ][%-4s]: ", grp);
Yogesh Pande 1:506ad37c6bd7 347 break;
Yogesh Pande 1:506ad37c6bd7 348 case (TRACE_LEVEL_WARN):
Yogesh Pande 1:506ad37c6bd7 349 retval = snprintf(ptr, bLeft, "[WARN][%-4s]: ", grp);
Yogesh Pande 1:506ad37c6bd7 350 break;
Yogesh Pande 1:506ad37c6bd7 351 case (TRACE_LEVEL_INFO):
Yogesh Pande 1:506ad37c6bd7 352 retval = snprintf(ptr, bLeft, "[INFO][%-4s]: ", grp);
Yogesh Pande 1:506ad37c6bd7 353 break;
Yogesh Pande 1:506ad37c6bd7 354 case (TRACE_LEVEL_DEBUG):
Yogesh Pande 1:506ad37c6bd7 355 retval = snprintf(ptr, bLeft, "[DBG ][%-4s]: ", grp);
Yogesh Pande 1:506ad37c6bd7 356 break;
Yogesh Pande 1:506ad37c6bd7 357 default:
Yogesh Pande 1:506ad37c6bd7 358 retval = snprintf(ptr, bLeft, " ");
Yogesh Pande 1:506ad37c6bd7 359 break;
Yogesh Pande 1:506ad37c6bd7 360 }
Yogesh Pande 1:506ad37c6bd7 361 if (retval >= bLeft) {
Yogesh Pande 1:506ad37c6bd7 362 retval = 0;
Yogesh Pande 1:506ad37c6bd7 363 }
Yogesh Pande 1:506ad37c6bd7 364 if (retval > 0) {
Yogesh Pande 1:506ad37c6bd7 365 ptr += retval;
Yogesh Pande 1:506ad37c6bd7 366 bLeft -= retval;
Yogesh Pande 1:506ad37c6bd7 367 }
Yogesh Pande 1:506ad37c6bd7 368 }
Yogesh Pande 1:506ad37c6bd7 369 if (retval > 0 && bLeft > 0) {
Yogesh Pande 1:506ad37c6bd7 370 va_list ap;
Yogesh Pande 1:506ad37c6bd7 371 va_start(ap, fmt);
Yogesh Pande 1:506ad37c6bd7 372 //add trace text
Yogesh Pande 1:506ad37c6bd7 373 retval = vsnprintf(ptr, bLeft, fmt, ap);
Yogesh Pande 1:506ad37c6bd7 374 if (retval >= bLeft) {
Yogesh Pande 1:506ad37c6bd7 375 retval = 0;
Yogesh Pande 1:506ad37c6bd7 376 }
Yogesh Pande 1:506ad37c6bd7 377 if (retval > 0) {
Yogesh Pande 1:506ad37c6bd7 378 ptr += retval;
Yogesh Pande 1:506ad37c6bd7 379 bLeft -= retval;
Yogesh Pande 1:506ad37c6bd7 380 }
Yogesh Pande 1:506ad37c6bd7 381 va_end(ap);
Yogesh Pande 1:506ad37c6bd7 382 }
Yogesh Pande 1:506ad37c6bd7 383
Yogesh Pande 1:506ad37c6bd7 384 if (retval > 0 && bLeft > 0 && m_trace.suffix_f) {
Yogesh Pande 1:506ad37c6bd7 385 //add suffix string
Yogesh Pande 1:506ad37c6bd7 386 retval = snprintf(ptr, bLeft, "%s", m_trace.suffix_f());
Yogesh Pande 1:506ad37c6bd7 387 if (retval >= bLeft) {
Yogesh Pande 1:506ad37c6bd7 388 retval = 0;
Yogesh Pande 1:506ad37c6bd7 389 }
Yogesh Pande 1:506ad37c6bd7 390 if (retval > 0) {
Yogesh Pande 1:506ad37c6bd7 391 ptr += retval;
Yogesh Pande 1:506ad37c6bd7 392 bLeft -= retval;
Yogesh Pande 1:506ad37c6bd7 393 }
Yogesh Pande 1:506ad37c6bd7 394 }
Yogesh Pande 1:506ad37c6bd7 395
Yogesh Pande 1:506ad37c6bd7 396 if (retval > 0 && bLeft > 0 && color) {
Yogesh Pande 1:506ad37c6bd7 397 //add zero color VT100 when color mode
Yogesh Pande 1:506ad37c6bd7 398 retval = snprintf(ptr, bLeft, "\x1b[0m");
Yogesh Pande 1:506ad37c6bd7 399 if (retval >= bLeft) {
Yogesh Pande 1:506ad37c6bd7 400 retval = 0;
Yogesh Pande 1:506ad37c6bd7 401 }
Yogesh Pande 1:506ad37c6bd7 402 if (retval > 0) {
Yogesh Pande 1:506ad37c6bd7 403 // not used anymore
Yogesh Pande 1:506ad37c6bd7 404 //ptr += retval;
Yogesh Pande 1:506ad37c6bd7 405 //bLeft -= retval;
Yogesh Pande 1:506ad37c6bd7 406 }
Yogesh Pande 1:506ad37c6bd7 407 }
Yogesh Pande 1:506ad37c6bd7 408 //print out whole data
Yogesh Pande 1:506ad37c6bd7 409 m_trace.printf(m_trace.line);
Yogesh Pande 1:506ad37c6bd7 410 }
Yogesh Pande 1:506ad37c6bd7 411 //return tmp data pointer back to the beginning
Yogesh Pande 1:506ad37c6bd7 412 mbed_trace_reset_tmp();
Yogesh Pande 1:506ad37c6bd7 413 }
Yogesh Pande 1:506ad37c6bd7 414 }
Yogesh Pande 1:506ad37c6bd7 415 static void mbed_trace_reset_tmp(void)
Yogesh Pande 1:506ad37c6bd7 416 {
Yogesh Pande 1:506ad37c6bd7 417 m_trace.tmp_data_ptr = m_trace.tmp_data;
Yogesh Pande 1:506ad37c6bd7 418 }
Yogesh Pande 1:506ad37c6bd7 419 const char *mbed_trace_last(void)
Yogesh Pande 1:506ad37c6bd7 420 {
Yogesh Pande 1:506ad37c6bd7 421 return m_trace.line;
Yogesh Pande 1:506ad37c6bd7 422 }
Yogesh Pande 1:506ad37c6bd7 423 /* Helping functions */
Yogesh Pande 1:506ad37c6bd7 424 #define tmp_data_left() m_trace.tmp_data_length-(m_trace.tmp_data_ptr-m_trace.tmp_data)
Yogesh Pande 1:506ad37c6bd7 425 #if YOTTA_CFG_MTRACE_FEA_IPV6 == 1
Yogesh Pande 1:506ad37c6bd7 426 char *mbed_trace_ipv6(const void *addr_ptr)
Yogesh Pande 1:506ad37c6bd7 427 {
Yogesh Pande 1:506ad37c6bd7 428 char *str = m_trace.tmp_data_ptr;
Yogesh Pande 1:506ad37c6bd7 429 if (str == NULL) {
Yogesh Pande 1:506ad37c6bd7 430 return "";
Yogesh Pande 1:506ad37c6bd7 431 }
Yogesh Pande 1:506ad37c6bd7 432 if (tmp_data_left() < 41) {
Yogesh Pande 1:506ad37c6bd7 433 return "";
Yogesh Pande 1:506ad37c6bd7 434 }
Yogesh Pande 1:506ad37c6bd7 435 if (addr_ptr == NULL) {
Yogesh Pande 1:506ad37c6bd7 436 return "<null>";
Yogesh Pande 1:506ad37c6bd7 437 }
Yogesh Pande 1:506ad37c6bd7 438 str[0] = 0;
Yogesh Pande 1:506ad37c6bd7 439 mbed_trace_ip6tos(addr_ptr, str);
Yogesh Pande 1:506ad37c6bd7 440 m_trace.tmp_data_ptr += strlen(str) + 1;
Yogesh Pande 1:506ad37c6bd7 441 return str;
Yogesh Pande 1:506ad37c6bd7 442 }
Yogesh Pande 1:506ad37c6bd7 443 char *mbed_trace_ipv6_prefix(const uint8_t *prefix, uint8_t prefix_len)
Yogesh Pande 1:506ad37c6bd7 444 {
Yogesh Pande 1:506ad37c6bd7 445 char *str = m_trace.tmp_data_ptr;
Yogesh Pande 1:506ad37c6bd7 446 int retval, bLeft = tmp_data_left();
Yogesh Pande 1:506ad37c6bd7 447 char tmp[40];
Yogesh Pande 1:506ad37c6bd7 448 uint8_t addr[16] = {0};
Yogesh Pande 1:506ad37c6bd7 449
Yogesh Pande 1:506ad37c6bd7 450 if (str == NULL) {
Yogesh Pande 1:506ad37c6bd7 451 return "";
Yogesh Pande 1:506ad37c6bd7 452 }
Yogesh Pande 1:506ad37c6bd7 453 if (bLeft < 45) {
Yogesh Pande 1:506ad37c6bd7 454 return "";
Yogesh Pande 1:506ad37c6bd7 455 }
Yogesh Pande 1:506ad37c6bd7 456
Yogesh Pande 1:506ad37c6bd7 457 if (prefix_len != 0) {
Yogesh Pande 1:506ad37c6bd7 458 if (prefix == NULL || prefix_len > 128) {
Yogesh Pande 1:506ad37c6bd7 459 return "<err>";
Yogesh Pande 1:506ad37c6bd7 460 }
Yogesh Pande 1:506ad37c6bd7 461 #ifdef COMMON_FUNCTIONS_FN
Yogesh Pande 1:506ad37c6bd7 462 bitcopy(addr, prefix, prefix_len);
Yogesh Pande 1:506ad37c6bd7 463 #else
Yogesh Pande 1:506ad37c6bd7 464 return "";
Yogesh Pande 1:506ad37c6bd7 465 #endif //COMMON_FUNCTIONS_FN
Yogesh Pande 1:506ad37c6bd7 466 }
Yogesh Pande 1:506ad37c6bd7 467
Yogesh Pande 1:506ad37c6bd7 468 mbed_trace_ip6tos(addr, tmp);
Yogesh Pande 1:506ad37c6bd7 469 retval = snprintf(str, bLeft, "%s/%u", tmp, prefix_len);
Yogesh Pande 1:506ad37c6bd7 470 if (retval <= 0 || retval > bLeft) {
Yogesh Pande 1:506ad37c6bd7 471 return "";
Yogesh Pande 1:506ad37c6bd7 472 }
Yogesh Pande 1:506ad37c6bd7 473
Yogesh Pande 1:506ad37c6bd7 474 m_trace.tmp_data_ptr += retval + 1;
Yogesh Pande 1:506ad37c6bd7 475 return str;
Yogesh Pande 1:506ad37c6bd7 476 }
Yogesh Pande 1:506ad37c6bd7 477 #endif //YOTTA_CFG_MTRACE_FEA_IPV6
Yogesh Pande 1:506ad37c6bd7 478 char *mbed_trace_array(const uint8_t *buf, uint16_t len)
Yogesh Pande 1:506ad37c6bd7 479 {
Yogesh Pande 1:506ad37c6bd7 480 int i, bLeft = tmp_data_left();
Yogesh Pande 1:506ad37c6bd7 481 char *str, *wptr;
Yogesh Pande 1:506ad37c6bd7 482 str = m_trace.tmp_data_ptr;
Yogesh Pande 1:506ad37c6bd7 483 if (str == NULL || bLeft == 0) {
Yogesh Pande 1:506ad37c6bd7 484 return "";
Yogesh Pande 1:506ad37c6bd7 485 }
Yogesh Pande 1:506ad37c6bd7 486 if (buf == NULL) {
Yogesh Pande 1:506ad37c6bd7 487 return "<null>";
Yogesh Pande 1:506ad37c6bd7 488 }
Yogesh Pande 1:506ad37c6bd7 489 wptr = str;
Yogesh Pande 1:506ad37c6bd7 490 wptr[0] = 0;
Yogesh Pande 1:506ad37c6bd7 491 const uint8_t *ptr = buf;
Yogesh Pande 1:506ad37c6bd7 492 char overflow = 0;
Yogesh Pande 1:506ad37c6bd7 493 for (i = 0; i < len; i++) {
Yogesh Pande 1:506ad37c6bd7 494 if (bLeft <= 3) {
Yogesh Pande 1:506ad37c6bd7 495 overflow = 1;
Yogesh Pande 1:506ad37c6bd7 496 break;
Yogesh Pande 1:506ad37c6bd7 497 }
Yogesh Pande 1:506ad37c6bd7 498 int retval = snprintf(wptr, bLeft, "%02x:", *ptr++);
Yogesh Pande 1:506ad37c6bd7 499 if (retval <= 0 || retval > bLeft) {
Yogesh Pande 1:506ad37c6bd7 500 break;
Yogesh Pande 1:506ad37c6bd7 501 }
Yogesh Pande 1:506ad37c6bd7 502 bLeft -= retval;
Yogesh Pande 1:506ad37c6bd7 503 wptr += retval;
Yogesh Pande 1:506ad37c6bd7 504 }
Yogesh Pande 1:506ad37c6bd7 505 if (wptr > str) {
Yogesh Pande 1:506ad37c6bd7 506 if( overflow ) {
Yogesh Pande 1:506ad37c6bd7 507 // replace last character as 'star',
Yogesh Pande 1:506ad37c6bd7 508 // which indicate buffer len is not enough
Yogesh Pande 1:506ad37c6bd7 509 *(wptr - 1) = '*';
Yogesh Pande 1:506ad37c6bd7 510 } else {
Yogesh Pande 1:506ad37c6bd7 511 //null to replace last ':' character
Yogesh Pande 1:506ad37c6bd7 512 *(wptr - 1) = 0;
Yogesh Pande 1:506ad37c6bd7 513 }
Yogesh Pande 1:506ad37c6bd7 514 }
Yogesh Pande 1:506ad37c6bd7 515 m_trace.tmp_data_ptr = wptr;
Yogesh Pande 1:506ad37c6bd7 516 return str;
Yogesh Pande 1:506ad37c6bd7 517 }