Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-os by
features/FEATURE_COMMON_PAL/mbed-trace/mbed-trace/mbed_trace.h@0:f269e3021894, 2016-10-23 (annotated)
- Committer:
- elessair
- Date:
- Sun Oct 23 15:10:02 2016 +0000
- Revision:
- 0:f269e3021894
Initial commit
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| elessair | 0:f269e3021894 | 1 | /* |
| elessair | 0:f269e3021894 | 2 | * Copyright (c) 2015 ARM Limited. All rights reserved. |
| elessair | 0:f269e3021894 | 3 | * SPDX-License-Identifier: Apache-2.0 |
| elessair | 0:f269e3021894 | 4 | * Licensed under the Apache License, Version 2.0 (the License); you may |
| elessair | 0:f269e3021894 | 5 | * not use this file except in compliance with the License. |
| elessair | 0:f269e3021894 | 6 | * You may obtain a copy of the License at |
| elessair | 0:f269e3021894 | 7 | * |
| elessair | 0:f269e3021894 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| elessair | 0:f269e3021894 | 9 | * |
| elessair | 0:f269e3021894 | 10 | * Unless required by applicable law or agreed to in writing, software |
| elessair | 0:f269e3021894 | 11 | * distributed under the License is distributed on an AS IS BASIS, WITHOUT |
| elessair | 0:f269e3021894 | 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| elessair | 0:f269e3021894 | 13 | * See the License for the specific language governing permissions and |
| elessair | 0:f269e3021894 | 14 | * limitations under the License. |
| elessair | 0:f269e3021894 | 15 | */ |
| elessair | 0:f269e3021894 | 16 | |
| elessair | 0:f269e3021894 | 17 | /** |
| elessair | 0:f269e3021894 | 18 | * \file mbed_trace.h |
| elessair | 0:f269e3021894 | 19 | * Trace interface for MbedOS applications. |
| elessair | 0:f269e3021894 | 20 | * This file provide simple but flexible way to handle software traces. |
| elessair | 0:f269e3021894 | 21 | * Trace library are abstract layer, which use stdout (printf) by default, |
| elessair | 0:f269e3021894 | 22 | * but outputs can be easily redirect to custom function, for example to |
| elessair | 0:f269e3021894 | 23 | * store traces to memory or other interfaces. |
| elessair | 0:f269e3021894 | 24 | * |
| elessair | 0:f269e3021894 | 25 | * usage example: |
| elessair | 0:f269e3021894 | 26 | * \code(main.c:) |
| elessair | 0:f269e3021894 | 27 | * #include "mbed_trace.h" |
| elessair | 0:f269e3021894 | 28 | * #define TRACE_GROUP "main" |
| elessair | 0:f269e3021894 | 29 | * |
| elessair | 0:f269e3021894 | 30 | * int main(void){ |
| elessair | 0:f269e3021894 | 31 | * mbed_trace_init(); // initialize trace library |
| elessair | 0:f269e3021894 | 32 | * tr_debug("this is debug msg"); //print debug message to stdout: "[DBG] |
| elessair | 0:f269e3021894 | 33 | * tr_err("this is error msg"); |
| elessair | 0:f269e3021894 | 34 | * tr_warn("this is warning msg"); |
| elessair | 0:f269e3021894 | 35 | * tr_info("this is info msg"); |
| elessair | 0:f269e3021894 | 36 | * return 0; |
| elessair | 0:f269e3021894 | 37 | * } |
| elessair | 0:f269e3021894 | 38 | * \endcode |
| elessair | 0:f269e3021894 | 39 | * Activate with compiler flag: YOTTA_CFG_MBED_TRACE |
| elessair | 0:f269e3021894 | 40 | * Configure trace line buffer size with compiler flag: YOTTA_CFG_MBED_TRACE_LINE_LENGTH. Default length: 1024. |
| elessair | 0:f269e3021894 | 41 | * |
| elessair | 0:f269e3021894 | 42 | */ |
| elessair | 0:f269e3021894 | 43 | #ifndef MBED_TRACE_H_ |
| elessair | 0:f269e3021894 | 44 | #define MBED_TRACE_H_ |
| elessair | 0:f269e3021894 | 45 | |
| elessair | 0:f269e3021894 | 46 | #ifdef __cplusplus |
| elessair | 0:f269e3021894 | 47 | extern "C" { |
| elessair | 0:f269e3021894 | 48 | #endif |
| elessair | 0:f269e3021894 | 49 | |
| elessair | 0:f269e3021894 | 50 | #ifdef YOTTA_CFG |
| elessair | 0:f269e3021894 | 51 | #include <stdint.h> |
| elessair | 0:f269e3021894 | 52 | #include <stddef.h> |
| elessair | 0:f269e3021894 | 53 | #include <stdbool.h> |
| elessair | 0:f269e3021894 | 54 | #else |
| elessair | 0:f269e3021894 | 55 | #include "ns_types.h" |
| elessair | 0:f269e3021894 | 56 | #endif |
| elessair | 0:f269e3021894 | 57 | |
| elessair | 0:f269e3021894 | 58 | #include <stdarg.h> |
| elessair | 0:f269e3021894 | 59 | |
| elessair | 0:f269e3021894 | 60 | #ifndef YOTTA_CFG_MBED_TRACE |
| elessair | 0:f269e3021894 | 61 | #define YOTTA_CFG_MBED_TRACE 0 |
| elessair | 0:f269e3021894 | 62 | #endif |
| elessair | 0:f269e3021894 | 63 | |
| elessair | 0:f269e3021894 | 64 | #ifndef YOTTA_CFG_MBED_TRACE_FEA_IPV6 |
| elessair | 0:f269e3021894 | 65 | #define YOTTA_CFG_MBED_TRACE_FEA_IPV6 1 |
| elessair | 0:f269e3021894 | 66 | #endif |
| elessair | 0:f269e3021894 | 67 | |
| elessair | 0:f269e3021894 | 68 | #ifndef MBED_CONF_MBED_TRACE_ENABLE |
| elessair | 0:f269e3021894 | 69 | #define MBED_CONF_MBED_TRACE_ENABLE 0 |
| elessair | 0:f269e3021894 | 70 | #endif |
| elessair | 0:f269e3021894 | 71 | |
| elessair | 0:f269e3021894 | 72 | /** 3 upper bits are trace modes related, |
| elessair | 0:f269e3021894 | 73 | and 5 lower bits are trace level configuration */ |
| elessair | 0:f269e3021894 | 74 | |
| elessair | 0:f269e3021894 | 75 | /** Config mask */ |
| elessair | 0:f269e3021894 | 76 | #define TRACE_MASK_CONFIG 0xE0 |
| elessair | 0:f269e3021894 | 77 | /** Trace level mask */ |
| elessair | 0:f269e3021894 | 78 | #define TRACE_MASK_LEVEL 0x1F |
| elessair | 0:f269e3021894 | 79 | |
| elessair | 0:f269e3021894 | 80 | /** plain trace data instead of "headers" */ |
| elessair | 0:f269e3021894 | 81 | #define TRACE_MODE_PLAIN 0x80 |
| elessair | 0:f269e3021894 | 82 | /** color mode */ |
| elessair | 0:f269e3021894 | 83 | #define TRACE_MODE_COLOR 0x40 |
| elessair | 0:f269e3021894 | 84 | /** Use print CR before trace line */ |
| elessair | 0:f269e3021894 | 85 | #define TRACE_CARRIAGE_RETURN 0x20 |
| elessair | 0:f269e3021894 | 86 | |
| elessair | 0:f269e3021894 | 87 | /** used to activate all trace levels */ |
| elessair | 0:f269e3021894 | 88 | #define TRACE_ACTIVE_LEVEL_ALL 0x1F |
| elessair | 0:f269e3021894 | 89 | /** print all traces same as above */ |
| elessair | 0:f269e3021894 | 90 | #define TRACE_ACTIVE_LEVEL_DEBUG 0x1f |
| elessair | 0:f269e3021894 | 91 | /** print info,warn and error traces */ |
| elessair | 0:f269e3021894 | 92 | #define TRACE_ACTIVE_LEVEL_INFO 0x0f |
| elessair | 0:f269e3021894 | 93 | /** print warn and error traces */ |
| elessair | 0:f269e3021894 | 94 | #define TRACE_ACTIVE_LEVEL_WARN 0x07 |
| elessair | 0:f269e3021894 | 95 | /** print only error trace */ |
| elessair | 0:f269e3021894 | 96 | #define TRACE_ACTIVE_LEVEL_ERROR 0x03 |
| elessair | 0:f269e3021894 | 97 | /** print only cmd line data */ |
| elessair | 0:f269e3021894 | 98 | #define TRACE_ACTIVE_LEVEL_CMD 0x01 |
| elessair | 0:f269e3021894 | 99 | /** trace nothing */ |
| elessair | 0:f269e3021894 | 100 | #define TRACE_ACTIVE_LEVEL_NONE 0x00 |
| elessair | 0:f269e3021894 | 101 | |
| elessair | 0:f269e3021894 | 102 | /** this print is some deep information for debug purpose */ |
| elessair | 0:f269e3021894 | 103 | #define TRACE_LEVEL_DEBUG 0x10 |
| elessair | 0:f269e3021894 | 104 | /** Info print, for general purpose prints */ |
| elessair | 0:f269e3021894 | 105 | #define TRACE_LEVEL_INFO 0x08 |
| elessair | 0:f269e3021894 | 106 | /** warning prints, which shouldn't causes any huge problems */ |
| elessair | 0:f269e3021894 | 107 | #define TRACE_LEVEL_WARN 0x04 |
| elessair | 0:f269e3021894 | 108 | /** Error prints, which causes probably problems, e.g. out of mem. */ |
| elessair | 0:f269e3021894 | 109 | #define TRACE_LEVEL_ERROR 0x02 |
| elessair | 0:f269e3021894 | 110 | /** special level for cmdline. Behaviours like "plain mode" */ |
| elessair | 0:f269e3021894 | 111 | #define TRACE_LEVEL_CMD 0x01 |
| elessair | 0:f269e3021894 | 112 | |
| elessair | 0:f269e3021894 | 113 | //usage macros: |
| elessair | 0:f269e3021894 | 114 | #define tr_info(...) mbed_tracef(TRACE_LEVEL_INFO, TRACE_GROUP, __VA_ARGS__) //!< Print info message |
| elessair | 0:f269e3021894 | 115 | #define tr_debug(...) mbed_tracef(TRACE_LEVEL_DEBUG, TRACE_GROUP, __VA_ARGS__) //!< Print debug message |
| elessair | 0:f269e3021894 | 116 | #define tr_warning(...) mbed_tracef(TRACE_LEVEL_WARN, TRACE_GROUP, __VA_ARGS__) //!< Print warning message |
| elessair | 0:f269e3021894 | 117 | #define tr_warn(...) mbed_tracef(TRACE_LEVEL_WARN, TRACE_GROUP, __VA_ARGS__) //!< Alternative warning message |
| elessair | 0:f269e3021894 | 118 | #define tr_error(...) mbed_tracef(TRACE_LEVEL_ERROR, TRACE_GROUP, __VA_ARGS__) //!< Print Error Message |
| elessair | 0:f269e3021894 | 119 | #define tr_err(...) mbed_tracef(TRACE_LEVEL_ERROR, TRACE_GROUP, __VA_ARGS__) //!< Alternative error message |
| elessair | 0:f269e3021894 | 120 | #define tr_cmdline(...) mbed_tracef(TRACE_LEVEL_CMD, TRACE_GROUP, __VA_ARGS__) //!< Special print for cmdline. See more from TRACE_LEVEL_CMD -level |
| elessair | 0:f269e3021894 | 121 | |
| elessair | 0:f269e3021894 | 122 | //aliases for the most commonly used functions and the helper functions |
| elessair | 0:f269e3021894 | 123 | #define tracef(dlevel, grp, ...) mbed_tracef(dlevel, grp, __VA_ARGS__) //!< Alias for mbed_tracef() |
| elessair | 0:f269e3021894 | 124 | #define vtracef(dlevel, grp, fmt, ap) mbed_vtracef(dlevel, grp, fmt, ap) //!< Alias for mbed_vtracef() |
| elessair | 0:f269e3021894 | 125 | #define tr_array(buf, len) mbed_trace_array(buf, len) //!< Alias for mbed_trace_array() |
| elessair | 0:f269e3021894 | 126 | #define tr_ipv6(addr_ptr) mbed_trace_ipv6(addr_ptr) //!< Alias for mbed_trace_ipv6() |
| elessair | 0:f269e3021894 | 127 | #define tr_ipv6_prefix(prefix, prefix_len) mbed_trace_ipv6_prefix(prefix, prefix_len) //!< Alias for mbed_trace_ipv6_prefix() |
| elessair | 0:f269e3021894 | 128 | #define trace_array(buf, len) mbed_trace_array(buf, len) //!< Alias for mbed_trace_array() |
| elessair | 0:f269e3021894 | 129 | #define trace_ipv6(addr_ptr) mbed_trace_ipv6(addr_ptr) //!< Alias for mbed_trace_ipv6() |
| elessair | 0:f269e3021894 | 130 | #define trace_ipv6_prefix(prefix, prefix_len) mbed_trace_ipv6_prefix(prefix, prefix_len) //!< Alias for mbed_trace_ipv6_prefix() |
| elessair | 0:f269e3021894 | 131 | |
| elessair | 0:f269e3021894 | 132 | |
| elessair | 0:f269e3021894 | 133 | /** |
| elessair | 0:f269e3021894 | 134 | * Allow specification of default TRACE_GROUP to be used if not specified by application |
| elessair | 0:f269e3021894 | 135 | */ |
| elessair | 0:f269e3021894 | 136 | |
| elessair | 0:f269e3021894 | 137 | #ifndef TRACE_GROUP |
| elessair | 0:f269e3021894 | 138 | #ifdef YOTTA_CFG_MBED_TRACE_GROUP |
| elessair | 0:f269e3021894 | 139 | #define TRACE_GROUP_STR_HELPER(x) #x |
| elessair | 0:f269e3021894 | 140 | #define TRACE_GROUP_STR(x) TRACE_GROUP_STR_HELPER(x) |
| elessair | 0:f269e3021894 | 141 | #define TRACE_GROUP TRACE_GROUP_STR(YOTTA_CFG_MBED_TRACE_GROUP) |
| elessair | 0:f269e3021894 | 142 | #endif |
| elessair | 0:f269e3021894 | 143 | #endif |
| elessair | 0:f269e3021894 | 144 | |
| elessair | 0:f269e3021894 | 145 | /** |
| elessair | 0:f269e3021894 | 146 | * Initialize trace functionality |
| elessair | 0:f269e3021894 | 147 | * @return 0 when all success, otherwise non zero |
| elessair | 0:f269e3021894 | 148 | */ |
| elessair | 0:f269e3021894 | 149 | int mbed_trace_init( void ); |
| elessair | 0:f269e3021894 | 150 | /** |
| elessair | 0:f269e3021894 | 151 | * Free trace memory |
| elessair | 0:f269e3021894 | 152 | */ |
| elessair | 0:f269e3021894 | 153 | void mbed_trace_free( void ); |
| elessair | 0:f269e3021894 | 154 | /** |
| elessair | 0:f269e3021894 | 155 | * Resize buffers (line / tmp ) sizes |
| elessair | 0:f269e3021894 | 156 | * @param lineLength new maximum length for trace line (0 = do no resize) |
| elessair | 0:f269e3021894 | 157 | * @param tmpLength new maximum length for trace tmp buffer (used for trace_array, etc) (0 = do no resize) |
| elessair | 0:f269e3021894 | 158 | */ |
| elessair | 0:f269e3021894 | 159 | void mbed_trace_buffer_sizes(int lineLength, int tmpLength); |
| elessair | 0:f269e3021894 | 160 | /** |
| elessair | 0:f269e3021894 | 161 | * Set trace configurations |
| elessair | 0:f269e3021894 | 162 | * Possible parameters: |
| elessair | 0:f269e3021894 | 163 | * |
| elessair | 0:f269e3021894 | 164 | * TRACE_MODE_COLOR |
| elessair | 0:f269e3021894 | 165 | * TRACE_MODE_PLAIN (this exclude color mode) |
| elessair | 0:f269e3021894 | 166 | * TRACE_CARRIAGE_RETURN (print CR before trace line) |
| elessair | 0:f269e3021894 | 167 | * |
| elessair | 0:f269e3021894 | 168 | * TRACE_ACTIVE_LEVEL_ALL - to activate all trace levels |
| elessair | 0:f269e3021894 | 169 | * or TRACE_ACTIVE_LEVEL_DEBUG (alternative) |
| elessair | 0:f269e3021894 | 170 | * TRACE_ACTIVE_LEVEL_INFO |
| elessair | 0:f269e3021894 | 171 | * TRACE_ACTIVE_LEVEL_WARN |
| elessair | 0:f269e3021894 | 172 | * TRACE_ACTIVE_LEVEL_ERROR |
| elessair | 0:f269e3021894 | 173 | * TRACE_ACTIVE_LEVEL_CMD |
| elessair | 0:f269e3021894 | 174 | * TRACE_LEVEL_NONE - to deactivate all traces |
| elessair | 0:f269e3021894 | 175 | * |
| elessair | 0:f269e3021894 | 176 | * @param config Byte size Bit-mask. Bits are descripted above. |
| elessair | 0:f269e3021894 | 177 | * usage e.g. |
| elessair | 0:f269e3021894 | 178 | * @code |
| elessair | 0:f269e3021894 | 179 | * mbed_trace_config_set( TRACE_ACTIVE_LEVEL_ALL|TRACE_MODE_COLOR ); |
| elessair | 0:f269e3021894 | 180 | * @endcode |
| elessair | 0:f269e3021894 | 181 | */ |
| elessair | 0:f269e3021894 | 182 | void mbed_trace_config_set(uint8_t config); |
| elessair | 0:f269e3021894 | 183 | /** get trace configurations |
| elessair | 0:f269e3021894 | 184 | * @return trace configuration byte |
| elessair | 0:f269e3021894 | 185 | */ |
| elessair | 0:f269e3021894 | 186 | uint8_t mbed_trace_config_get(void); |
| elessair | 0:f269e3021894 | 187 | /** |
| elessair | 0:f269e3021894 | 188 | * Set trace prefix function |
| elessair | 0:f269e3021894 | 189 | * pref_f -function return string with null terminated |
| elessair | 0:f269e3021894 | 190 | * Can be used for e.g. time string |
| elessair | 0:f269e3021894 | 191 | * e.g. |
| elessair | 0:f269e3021894 | 192 | * char* trace_time(){ return "rtc-time-in-string"; } |
| elessair | 0:f269e3021894 | 193 | * mbed_trace_prefix_function_set( &trace_time ); |
| elessair | 0:f269e3021894 | 194 | */ |
| elessair | 0:f269e3021894 | 195 | void mbed_trace_prefix_function_set( char* (*pref_f)(size_t) ); |
| elessair | 0:f269e3021894 | 196 | /** |
| elessair | 0:f269e3021894 | 197 | * Set trace suffix function |
| elessair | 0:f269e3021894 | 198 | * suffix -function return string with null terminated |
| elessair | 0:f269e3021894 | 199 | * Can be used for e.g. time string |
| elessair | 0:f269e3021894 | 200 | * e.g. |
| elessair | 0:f269e3021894 | 201 | * char* trace_suffix(){ return " END"; } |
| elessair | 0:f269e3021894 | 202 | * mbed_trace_suffix_function_set( &trace_suffix ); |
| elessair | 0:f269e3021894 | 203 | */ |
| elessair | 0:f269e3021894 | 204 | void mbed_trace_suffix_function_set(char* (*suffix_f)(void) ); |
| elessair | 0:f269e3021894 | 205 | /** |
| elessair | 0:f269e3021894 | 206 | * Set trace print function |
| elessair | 0:f269e3021894 | 207 | * By default, trace module print using printf() function, |
| elessair | 0:f269e3021894 | 208 | * but with this you can write own print function, |
| elessair | 0:f269e3021894 | 209 | * for e.g. to other IO device. |
| elessair | 0:f269e3021894 | 210 | */ |
| elessair | 0:f269e3021894 | 211 | void mbed_trace_print_function_set( void (*print_f)(const char*) ); |
| elessair | 0:f269e3021894 | 212 | /** |
| elessair | 0:f269e3021894 | 213 | * Set trace print function for tr_cmdline() |
| elessair | 0:f269e3021894 | 214 | */ |
| elessair | 0:f269e3021894 | 215 | void mbed_trace_cmdprint_function_set( void (*printf)(const char*) ); |
| elessair | 0:f269e3021894 | 216 | /** |
| elessair | 0:f269e3021894 | 217 | * Set trace mutex wait function |
| elessair | 0:f269e3021894 | 218 | * By default, trace calls are not thread safe. |
| elessair | 0:f269e3021894 | 219 | * If thread safety is required this can be used to set a callback function that will be called before each trace call. |
| elessair | 0:f269e3021894 | 220 | * The specific implementation is up to the application developer, but the mutex must count so it can |
| elessair | 0:f269e3021894 | 221 | * be acquired from a single thread repeatedly. |
| elessair | 0:f269e3021894 | 222 | */ |
| elessair | 0:f269e3021894 | 223 | void mbed_trace_mutex_wait_function_set(void (*mutex_wait_f)(void)); |
| elessair | 0:f269e3021894 | 224 | /** |
| elessair | 0:f269e3021894 | 225 | * Set trace mutex release function |
| elessair | 0:f269e3021894 | 226 | * By default, trace calls are not thread safe. |
| elessair | 0:f269e3021894 | 227 | * If thread safety is required this can be used to set a callback function that will be called before returning from |
| elessair | 0:f269e3021894 | 228 | * each trace call. The specific implementation is up to the application developer, but the mutex must count so it can |
| elessair | 0:f269e3021894 | 229 | * be acquired from a single thread repeatedly. |
| elessair | 0:f269e3021894 | 230 | */ |
| elessair | 0:f269e3021894 | 231 | void mbed_trace_mutex_release_function_set(void (*mutex_release_f)(void)); |
| elessair | 0:f269e3021894 | 232 | /** |
| elessair | 0:f269e3021894 | 233 | * When trace group contains text in filters, |
| elessair | 0:f269e3021894 | 234 | * trace print will be ignored. |
| elessair | 0:f269e3021894 | 235 | * e.g.: |
| elessair | 0:f269e3021894 | 236 | * mbed_trace_exclude_filters_set("mygr"); |
| elessair | 0:f269e3021894 | 237 | * mbed_tracef(TRACE_ACTIVE_LEVEL_DEBUG, "ougr", "This is not printed"); |
| elessair | 0:f269e3021894 | 238 | */ |
| elessair | 0:f269e3021894 | 239 | void mbed_trace_exclude_filters_set(char* filters); |
| elessair | 0:f269e3021894 | 240 | /** get trace exclude filters |
| elessair | 0:f269e3021894 | 241 | */ |
| elessair | 0:f269e3021894 | 242 | const char* mbed_trace_exclude_filters_get(void); |
| elessair | 0:f269e3021894 | 243 | /** |
| elessair | 0:f269e3021894 | 244 | * When trace group contains text in filter, |
| elessair | 0:f269e3021894 | 245 | * trace will be printed. |
| elessair | 0:f269e3021894 | 246 | * e.g.: |
| elessair | 0:f269e3021894 | 247 | * set_trace_include_filters("mygr"); |
| elessair | 0:f269e3021894 | 248 | * mbed_tracef(TRACE_ACTIVE_LEVEL_DEBUG, "mygr", "Hi There"); |
| elessair | 0:f269e3021894 | 249 | * mbed_tracef(TRACE_ACTIVE_LEVEL_DEBUG, "grp2", "This is not printed"); |
| elessair | 0:f269e3021894 | 250 | */ |
| elessair | 0:f269e3021894 | 251 | void mbed_trace_include_filters_set(char* filters); |
| elessair | 0:f269e3021894 | 252 | /** get trace include filters |
| elessair | 0:f269e3021894 | 253 | */ |
| elessair | 0:f269e3021894 | 254 | const char* mbed_trace_include_filters_get(void); |
| elessair | 0:f269e3021894 | 255 | /** |
| elessair | 0:f269e3021894 | 256 | * General trace function |
| elessair | 0:f269e3021894 | 257 | * This should be used every time when user want to print out something important thing |
| elessair | 0:f269e3021894 | 258 | * Usage e.g. |
| elessair | 0:f269e3021894 | 259 | * mbed_tracef( TRACE_LEVEL_INFO, "mygr", "Hello world!"); |
| elessair | 0:f269e3021894 | 260 | * |
| elessair | 0:f269e3021894 | 261 | * @param dlevel debug level |
| elessair | 0:f269e3021894 | 262 | * @param grp trace group |
| elessair | 0:f269e3021894 | 263 | * @param fmt trace format (like printf) |
| elessair | 0:f269e3021894 | 264 | * @param ... variable arguments related to fmt |
| elessair | 0:f269e3021894 | 265 | */ |
| elessair | 0:f269e3021894 | 266 | #if defined(__GNUC__) || defined(__CC_ARM) |
| elessair | 0:f269e3021894 | 267 | void mbed_tracef(uint8_t dlevel, const char* grp, const char *fmt, ...) __attribute__ ((__format__(__printf__, 3, 4))); |
| elessair | 0:f269e3021894 | 268 | #else |
| elessair | 0:f269e3021894 | 269 | void mbed_tracef(uint8_t dlevel, const char* grp, const char *fmt, ...); |
| elessair | 0:f269e3021894 | 270 | #endif |
| elessair | 0:f269e3021894 | 271 | /** |
| elessair | 0:f269e3021894 | 272 | * General trace function |
| elessair | 0:f269e3021894 | 273 | * This should be used every time when user want to print out something important thing |
| elessair | 0:f269e3021894 | 274 | * and vprintf functionality is desired |
| elessair | 0:f269e3021894 | 275 | * Usage e.g. |
| elessair | 0:f269e3021894 | 276 | * va_list ap; |
| elessair | 0:f269e3021894 | 277 | * va_start (ap, fmt); |
| elessair | 0:f269e3021894 | 278 | * mbed_vtracef( TRACE_LEVEL_INFO, "mygr", fmt, ap ); |
| elessair | 0:f269e3021894 | 279 | * va_end (ap); |
| elessair | 0:f269e3021894 | 280 | * |
| elessair | 0:f269e3021894 | 281 | * @param dlevel debug level |
| elessair | 0:f269e3021894 | 282 | * @param grp trace group |
| elessair | 0:f269e3021894 | 283 | * @param fmt trace format (like vprintf) |
| elessair | 0:f269e3021894 | 284 | * @param ap variable arguments list (like vprintf) |
| elessair | 0:f269e3021894 | 285 | */ |
| elessair | 0:f269e3021894 | 286 | #if defined(__GNUC__) || defined(__CC_ARM) |
| elessair | 0:f269e3021894 | 287 | void mbed_vtracef(uint8_t dlevel, const char* grp, const char *fmt, va_list ap) __attribute__ ((__format__(__printf__, 3, 0))); |
| elessair | 0:f269e3021894 | 288 | #else |
| elessair | 0:f269e3021894 | 289 | void mbed_vtracef(uint8_t dlevel, const char* grp, const char *fmt, va_list ap); |
| elessair | 0:f269e3021894 | 290 | #endif |
| elessair | 0:f269e3021894 | 291 | |
| elessair | 0:f269e3021894 | 292 | |
| elessair | 0:f269e3021894 | 293 | /** |
| elessair | 0:f269e3021894 | 294 | * Get last trace from buffer |
| elessair | 0:f269e3021894 | 295 | */ |
| elessair | 0:f269e3021894 | 296 | const char* mbed_trace_last(void); |
| elessair | 0:f269e3021894 | 297 | #if YOTTA_CFG_MBED_TRACE_FEA_IPV6 == 1 |
| elessair | 0:f269e3021894 | 298 | /** |
| elessair | 0:f269e3021894 | 299 | * mbed_tracef helping function for convert ipv6 |
| elessair | 0:f269e3021894 | 300 | * table to human readable string. |
| elessair | 0:f269e3021894 | 301 | * usage e.g. |
| elessair | 0:f269e3021894 | 302 | * char ipv6[16] = {...}; // ! array length is 16 bytes ! |
| elessair | 0:f269e3021894 | 303 | * mbed_tracef(TRACE_LEVEL_INFO, "mygr", "ipv6 addr: %s", mbed_trace_ipv6(ipv6)); |
| elessair | 0:f269e3021894 | 304 | * |
| elessair | 0:f269e3021894 | 305 | * @param add_ptr IPv6 Address pointer |
| elessair | 0:f269e3021894 | 306 | * @return temporary buffer where ipv6 is in string format |
| elessair | 0:f269e3021894 | 307 | */ |
| elessair | 0:f269e3021894 | 308 | char* mbed_trace_ipv6(const void *addr_ptr); |
| elessair | 0:f269e3021894 | 309 | /** |
| elessair | 0:f269e3021894 | 310 | * mbed_tracef helping function for print ipv6 prefix |
| elessair | 0:f269e3021894 | 311 | * usage e.g. |
| elessair | 0:f269e3021894 | 312 | * char ipv6[16] = {...}; // ! array length is 16 bytes ! |
| elessair | 0:f269e3021894 | 313 | * mbed_tracef(TRACE_LEVEL_INFO, "mygr", "ipv6 addr: %s", mbed_trace_ipv6_prefix(ipv6, 4)); |
| elessair | 0:f269e3021894 | 314 | * |
| elessair | 0:f269e3021894 | 315 | * @param prefix IPv6 Address pointer |
| elessair | 0:f269e3021894 | 316 | * @param prefix_len prefix length |
| elessair | 0:f269e3021894 | 317 | * @return temporary buffer where ipv6 is in string format |
| elessair | 0:f269e3021894 | 318 | */ |
| elessair | 0:f269e3021894 | 319 | char* mbed_trace_ipv6_prefix(const uint8_t *prefix, uint8_t prefix_len); |
| elessair | 0:f269e3021894 | 320 | #endif |
| elessair | 0:f269e3021894 | 321 | /** |
| elessair | 0:f269e3021894 | 322 | * mbed_tracef helping function for convert hex-array to string. |
| elessair | 0:f269e3021894 | 323 | * usage e.g. |
| elessair | 0:f269e3021894 | 324 | * char myarr[] = {0x10, 0x20}; |
| elessair | 0:f269e3021894 | 325 | * mbed_tracef(TRACE_LEVEL_INFO, "mygr", "arr: %s", mbed_trace_array(myarr, 2)); |
| elessair | 0:f269e3021894 | 326 | * |
| elessair | 0:f269e3021894 | 327 | * @param buf hex array pointer |
| elessair | 0:f269e3021894 | 328 | * @param len buffer length |
| elessair | 0:f269e3021894 | 329 | * @return temporary buffer where string copied |
| elessair | 0:f269e3021894 | 330 | * if array as string not fit to temp buffer, this function write '*' as last character, |
| elessair | 0:f269e3021894 | 331 | * which indicate that buffer is too small for array. |
| elessair | 0:f269e3021894 | 332 | */ |
| elessair | 0:f269e3021894 | 333 | char* mbed_trace_array(const uint8_t* buf, uint16_t len); |
| elessair | 0:f269e3021894 | 334 | |
| elessair | 0:f269e3021894 | 335 | #ifdef __cplusplus |
| elessair | 0:f269e3021894 | 336 | } |
| elessair | 0:f269e3021894 | 337 | #endif |
| elessair | 0:f269e3021894 | 338 | |
| elessair | 0:f269e3021894 | 339 | #endif /* MBED_TRACE_H_ */ |
| elessair | 0:f269e3021894 | 340 | |
| elessair | 0:f269e3021894 | 341 | /* These macros are outside the inclusion guard so they will be re-evaluated for every inclusion of the header. |
| elessair | 0:f269e3021894 | 342 | * If tracing is disabled, the dummies will hide the real functions. The real functions can still be reached by |
| elessair | 0:f269e3021894 | 343 | * surrounding the name of the function with brackets, e.g. "(mbed_tracef)(dlevel, grp, "like so");" |
| elessair | 0:f269e3021894 | 344 | * */ |
| elessair | 0:f269e3021894 | 345 | #if defined(FEA_TRACE_SUPPORT) || MBED_CONF_MBED_TRACE_ENABLE || YOTTA_CFG_MBED_TRACE || (defined(YOTTA_CFG) && !defined(NDEBUG)) |
| elessair | 0:f269e3021894 | 346 | // Make sure FEA_TRACE_SUPPORT is always set whenever traces are enabled. |
| elessair | 0:f269e3021894 | 347 | #ifndef FEA_TRACE_SUPPORT |
| elessair | 0:f269e3021894 | 348 | #define FEA_TRACE_SUPPORT |
| elessair | 0:f269e3021894 | 349 | #endif |
| elessair | 0:f269e3021894 | 350 | // undefine dummies, revealing the real functions |
| elessair | 0:f269e3021894 | 351 | #undef MBED_TRACE_DUMMIES_DEFINED |
| elessair | 0:f269e3021894 | 352 | #undef mbed_trace_init |
| elessair | 0:f269e3021894 | 353 | #undef mbed_trace_free |
| elessair | 0:f269e3021894 | 354 | #undef mbed_trace_buffer_sizes |
| elessair | 0:f269e3021894 | 355 | #undef mbed_trace_config_set |
| elessair | 0:f269e3021894 | 356 | #undef mbed_trace_config_get |
| elessair | 0:f269e3021894 | 357 | #undef mbed_trace_prefix_function_set |
| elessair | 0:f269e3021894 | 358 | #undef mbed_trace_suffix_function_set |
| elessair | 0:f269e3021894 | 359 | #undef mbed_trace_print_function_set |
| elessair | 0:f269e3021894 | 360 | #undef mbed_trace_cmdprint_function_set |
| elessair | 0:f269e3021894 | 361 | #undef mbed_trace_mutex_wait_function_set |
| elessair | 0:f269e3021894 | 362 | #undef mbed_trace_mutex_release_function_set |
| elessair | 0:f269e3021894 | 363 | #undef mbed_trace_exclude_filters_set |
| elessair | 0:f269e3021894 | 364 | #undef mbed_trace_exclude_filters_get |
| elessair | 0:f269e3021894 | 365 | #undef mbed_trace_include_filters_set |
| elessair | 0:f269e3021894 | 366 | #undef mbed_trace_include_filters_get |
| elessair | 0:f269e3021894 | 367 | #undef mbed_tracef |
| elessair | 0:f269e3021894 | 368 | #undef mbed_vtracef |
| elessair | 0:f269e3021894 | 369 | #undef mbed_trace_last |
| elessair | 0:f269e3021894 | 370 | #undef mbed_trace_ipv6 |
| elessair | 0:f269e3021894 | 371 | #undef mbed_trace_ipv6_prefix |
| elessair | 0:f269e3021894 | 372 | #undef mbed_trace_array |
| elessair | 0:f269e3021894 | 373 | |
| elessair | 0:f269e3021894 | 374 | #elif !defined(MBED_TRACE_DUMMIES_DEFINED) |
| elessair | 0:f269e3021894 | 375 | // define dummies, hiding the real functions |
| elessair | 0:f269e3021894 | 376 | #define MBED_TRACE_DUMMIES_DEFINED |
| elessair | 0:f269e3021894 | 377 | #define mbed_trace_init(...) ((void) 0) |
| elessair | 0:f269e3021894 | 378 | #define mbed_trace_free(...) ((void) 0) |
| elessair | 0:f269e3021894 | 379 | #define mbed_trace_buffer_sizes(...) ((void) 0) |
| elessair | 0:f269e3021894 | 380 | #define mbed_trace_config_set(...) ((void) 0) |
| elessair | 0:f269e3021894 | 381 | #define mbed_trace_config_get(...) ((uint8_t) 0) |
| elessair | 0:f269e3021894 | 382 | #define mbed_trace_prefix_function_set(...) ((void) 0) |
| elessair | 0:f269e3021894 | 383 | #define mbed_trace_suffix_function_set(...) ((void) 0) |
| elessair | 0:f269e3021894 | 384 | #define mbed_trace_print_function_set(...) ((void) 0) |
| elessair | 0:f269e3021894 | 385 | #define mbed_trace_cmdprint_function_set(...) ((void) 0) |
| elessair | 0:f269e3021894 | 386 | #define mbed_trace_mutex_wait_function_set(...) ((void) 0) |
| elessair | 0:f269e3021894 | 387 | #define mbed_trace_mutex_release_function_set(...) ((void) 0) |
| elessair | 0:f269e3021894 | 388 | #define mbed_trace_exclude_filters_set(...) ((void) 0) |
| elessair | 0:f269e3021894 | 389 | #define mbed_trace_exclude_filters_get(...) ((const char *) 0) |
| elessair | 0:f269e3021894 | 390 | #define mbed_trace_include_filters_set(...) ((void) 0) |
| elessair | 0:f269e3021894 | 391 | #define mbed_trace_include_filters_get(...) ((const char *) 0) |
| elessair | 0:f269e3021894 | 392 | #define mbed_trace_last(...) ((const char *) 0) |
| elessair | 0:f269e3021894 | 393 | #define mbed_tracef(...) ((void) 0) |
| elessair | 0:f269e3021894 | 394 | #define mbed_vtracef(...) ((void) 0) |
| elessair | 0:f269e3021894 | 395 | /** |
| elessair | 0:f269e3021894 | 396 | * These helper functions accumulate strings in a buffer that is only flushed by actual trace calls. Using these |
| elessair | 0:f269e3021894 | 397 | * functions outside trace calls could cause the buffer to overflow. |
| elessair | 0:f269e3021894 | 398 | */ |
| elessair | 0:f269e3021894 | 399 | #define mbed_trace_ipv6(...) dont_use_trace_helpers_outside_trace_calls |
| elessair | 0:f269e3021894 | 400 | #define mbed_trace_ipv6_prefix(...) dont_use_trace_helpers_outside_trace_calls |
| elessair | 0:f269e3021894 | 401 | #define mbed_trace_array(...) dont_use_trace_helpers_outside_trace_calls |
| elessair | 0:f269e3021894 | 402 | |
| elessair | 0:f269e3021894 | 403 | #endif /* FEA_TRACE_SUPPORT */ |
