ST / ST_Events-old

Dependents:   HelloWorld_CCA01M1 HelloWorld_CCA02M1 CI-data-logger-server HelloWorld_CCA02M1 ... more

This is a fork of the events subdirectory of https://github.com/ARMmbed/mbed-os.

Note, you must import this library with import name: events!!!

Committer:
Seppo Takalo
Date:
Wed Oct 05 16:09:58 2016 +0300
Revision:
8542:2e1ef628fbee
Parent:
201:dd058cec5f28
Squashed 'features/FEATURE_COMMON_PAL/mbed-trace/' changes from b17e969..31e338c

31e338c Use temp variable in mutex release loop (#52)

git-subtree-dir: features/FEATURE_COMMON_PAL/mbed-trace
git-subtree-split: 31e338c23934491fcb852ee4d2788d34851d01a2

Who changed what in which revision?

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