mbed client lightswitch demo

Dependencies:   mbed Socket lwip-eth lwip-sys lwip

Fork of mbed-client-classic-example-lwip by Austin Blackstone

Committer:
mbedAustin
Date:
Thu Jun 09 17:08:36 2016 +0000
Revision:
11:cada08fc8a70
Commit for public Consumption

Who changed what in which revision?

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