WORKS

Dependencies:   MAX44000 PWM_Tone_Library nexpaq_mdk

Fork of LED_Demo by Maxim nexpaq

Committer:
cyberjoey
Date:
Sat Oct 22 01:31:58 2016 +0000
Revision:
9:6bb35cef007d
Parent:
1:55a6170b404f
WORKING

Who changed what in which revision?

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