Simulated product dispenser

Dependencies:   HTS221

Fork of mbed-cloud-workshop-connect-HTS221 by Jim Carver

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers pv_log.h Source File

pv_log.h

00001 // ----------------------------------------------------------------------------
00002 // Copyright 2016-2017 ARM Ltd.
00003 //  
00004 // Licensed under the Apache License, Version 2.0 (the "License");
00005 // you may not use this file except in compliance with the License.
00006 // You may obtain a copy of the License at
00007 //  
00008 //     http://www.apache.org/licenses/LICENSE-2.0
00009 //  
00010 // Unless required by applicable law or agreed to in writing, software
00011 // distributed under the License is distributed on an "AS IS" BASIS,
00012 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013 // See the License for the specific language governing permissions and
00014 // limitations under the License.
00015 // ----------------------------------------------------------------------------
00016 
00017 /* Logging macros */
00018 
00019 #ifndef __PV_LOG_H__
00020 #define __PV_LOG_H__
00021 
00022 #ifdef __cplusplus
00023 extern "C" {
00024 #endif
00025 
00026 #define __PV_LOG_H__INSIDE
00027 #include <stdio.h>
00028 #include <inttypes.h>
00029 #include <string.h>
00030 #include <stdbool.h>
00031 #include "pal.h"
00032 #include "mbed-trace/mbed_trace.h"
00033 
00034 #define __SA_PV_FILE__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
00035 
00036 extern palMutexID_t g_pv_logger_mutex;
00037 /**
00038 * Calls to mbed trace print function
00039 *
00040 * - The function sets mbed trace level according to log level, compose buffer with general data (line,color, file..) and message
00041 * and calls to mbed_vtracef.
00042 */
00043 void pv_log_trace(int level, const char* filename, int line, const char *func, const char *format, ...);
00044 /**
00045 * Print buffer with mbed trace function
00046 *
00047 */
00048 void pv_log_trace_buffer(int level, const char* filename, int line, const char *func, const char *color, const char *name, const uint8_t *buff, uint32_t buff_size);
00049 
00050 #define _SA_PV_LOG_FUNC_ENTER(level, filename, line, func, format, ...) _SA_PV_LOG(level, filename, line, func, "===> " format, ##__VA_ARGS__)
00051 
00052 /**  Exit function logging
00053  *
00054  * - Should be called in the end of a function, assuming the function doesn't exit early due to an error.
00055  * - Should display values of output variables (with meaning, no need to print buffers).
00056  * - Usage example (with INFO level): SA_PV_LOG_INFO_FUNC_EXIT("argPointerToInt = %d, argPointerToUnsigned32 = %" PRIu32 "", *argPointerToInt, (uint32_t)*argPointerToUnsigned32);
00057  */
00058 #define _SA_PV_LOG_FUNC_EXIT(level, filename, line, func, format, ...) _SA_PV_LOG(level, filename, line, func, "<=== " format, ##__VA_ARGS__)
00059 
00060 // CRITICAL always being output
00061 #define SA_PV_LOG_CRITICAL(format, ...) \
00062         _SA_PV_LOG(TRACE_LEVEL_CMD, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00063 #define SA_PV_LOG_BYTE_BUFF_CRITICAL(name, buff, buff_size) \
00064         _SA_PV_BYTE_BUFF_LOG(TRACE_LEVEL_CMD, __SA_PV_FILE__, __LINE__, __func__, name, buff, buff_size)
00065 #define SA_PV_LOG_CRITICAL_FUNC_EXIT(format, ...) \
00066         _SA_PV_LOG_FUNC_EXIT(TRACE_LEVEL_CMD, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00067 
00068 #if (MBED_TRACE_MAX_LEVEL >= TRACE_LEVEL_ERROR)
00069 #define SA_PV_LOG_ERR(format, ...) \
00070         _SA_PV_LOG(TRACE_LEVEL_ERROR, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00071 #define SA_PV_LOG_BYTE_BUFF_ERR(name, buff, buff_size) \
00072         _SA_PV_BYTE_BUFF_LOG(TRACE_LEVEL_ERROR, __SA_PV_FILE__, __LINE__, __func__, name, buff, buff_size)
00073 #define SA_PV_LOG_ERR_FUNC_EXIT(format, ...) \
00074         _SA_PV_LOG_FUNC_EXIT(TRACE_LEVEL_ERROR, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00075 
00076 #else
00077 #define SA_PV_LOG_ERR(format, arg...) do {} while (0)
00078 #define SA_PV_LOG_BYTE_BUFF_ERR(format, arg...) do {} while (0)
00079 #define SA_PV_LOG_ERR_FUNC_EXIT(format, ...) do {} while (0)
00080 #endif
00081 
00082 #if (MBED_TRACE_MAX_LEVEL >= TRACE_LEVEL_WARN)
00083 #define SA_PV_LOG_WARN(format, ...) \
00084         _SA_PV_LOG(TRACE_LEVEL_WARN, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00085 #define SA_PV_LOG_BYTE_BUFF_WARN(name, buff, buff_size) \
00086         _SA_PV_BYTE_BUFF_LOG(TRACE_LEVEL_WARN, __SA_PV_FILE__, __LINE__, __func__, name, buff, buff_size)
00087 #define SA_PV_LOG_WARN_FUNC_EXIT(format, ...) \
00088         _SA_PV_LOG_FUNC_EXIT(TRACE_LEVEL_WARN, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00089 #else
00090 #define SA_PV_LOG_WARN(format, ...) do {} while (0)
00091 #define SA_PV_LOG_BYTE_BUFF_WARN(format, ...) do {} while (0)
00092 #define SA_PV_LOG_WARN_FUNC_EXIT(format, ...) do {} while (0)
00093 #endif
00094 
00095 #if (MBED_TRACE_MAX_LEVEL >= TRACE_LEVEL_INFO)
00096 #define SA_PV_LOG_INFO(format, ...) \
00097         _SA_PV_LOG(TRACE_LEVEL_INFO, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00098 #define SA_PV_LOG_INFO_FUNC_ENTER(format, ...) \
00099         _SA_PV_LOG_FUNC_ENTER(TRACE_LEVEL_INFO, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00100 #define SA_PV_LOG_INFO_FUNC_ENTER_NO_ARGS() \
00101         SA_PV_LOG_INFO_FUNC_ENTER("")
00102 #define SA_PV_LOG_INFO_FUNC_EXIT(format, ...) \
00103         _SA_PV_LOG_FUNC_EXIT(TRACE_LEVEL_INFO, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00104 #define SA_PV_LOG_INFO_FUNC_EXIT_NO_ARGS() \
00105         SA_PV_LOG_INFO_FUNC_EXIT("")
00106 #define SA_PV_LOG_BYTE_BUFF_INFO(name, buff, buff_size) \
00107         _SA_PV_BYTE_BUFF_LOG(TRACE_LEVEL_INFO, __SA_PV_FILE__, __LINE__, __func__, name, buff, buff_size)
00108 #else
00109 #define SA_PV_LOG_INFO(format, ...) do {} while (0)
00110 #define SA_PV_LOG_INFO_FUNC_ENTER(format, ...) do {} while (0)
00111 #define SA_PV_LOG_INFO_FUNC_ENTER_NO_ARGS() do {} while (0)
00112 #define SA_PV_LOG_INFO_FUNC_EXIT(format, ...) do {} while (0)
00113 #define SA_PV_LOG_INFO_FUNC_EXIT_NO_ARGS() do {} while (0)
00114 #define SA_PV_LOG_BYTE_BUFF_INFO(format, ...) do {} while (0)
00115 #endif
00116 
00117 #if (MBED_TRACE_MAX_LEVEL >= TRACE_LEVEL_DEBUG)
00118 #define SA_PV_LOG_TRACE(format, ...) \
00119         _SA_PV_LOG(TRACE_LEVEL_DEBUG, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00120 #define SA_PV_LOG_TRACE_FUNC_ENTER(format, ...) \
00121         _SA_PV_LOG_FUNC_ENTER(TRACE_LEVEL_DEBUG, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00122 #define SA_PV_LOG_TRACE_FUNC_ENTER_NO_ARGS() \
00123         SA_PV_LOG_TRACE_FUNC_ENTER("")
00124 #define SA_PV_LOG_TRACE_FUNC_EXIT(format, ...) \
00125         _SA_PV_LOG_FUNC_EXIT(TRACE_LEVEL_DEBUG, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00126 #define SA_PV_LOG_TRACE_FUNC_EXIT_NO_ARGS() \
00127         SA_PV_LOG_TRACE_FUNC_EXIT("")
00128 #define SA_PV_LOG_BYTE_BUFF_TRACE(name, buff, buff_size) \
00129         _SA_PV_BYTE_BUFF_LOG(TRACE_LEVEL_DEBUG, __SA_PV_FILE__, __LINE__, __func__, name, buff, buff_size)
00130 
00131 #else
00132 #define SA_PV_LOG_TRACE(format, ...) do {} while (0)
00133 #define SA_PV_LOG_TRACE_FUNC_ENTER(format, ...) do {} while (0)
00134 #define SA_PV_LOG_TRACE_FUNC_ENTER_NO_ARGS() do {} while (0)
00135 #define SA_PV_LOG_TRACE_FUNC_EXIT(format, ...) do {} while (0)
00136 #define SA_PV_LOG_TRACE_FUNC_EXIT_NO_ARGS() do {} while (0)
00137 #define SA_PV_LOG_BYTE_BUFF_TRACE(format, ...) do {} while (0)
00138 #endif
00139 
00140 #if (MBED_TRACE_MAX_LEVEL >= TRACE_LEVEL_DEBUG)
00141 #define SA_PV_LOG_DATA(format, ...) \
00142         _SA_PV_LOG(TRACE_LEVEL_DEBUG, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00143 #define SA_PV_LOG_DATA_FUNC_ENTER(format, ...) \
00144   _SA_PV_LOG_FUNC_ENTER(TRACE_LEVEL_DEBUG, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00145 #define SA_PV_LOG_DATA_FUNC_ENTER_NO_ARGS() \
00146         SA_PV_LOG_DATA_FUNC_ENTER("")
00147 #define SA_PV_LOG_DATA_FUNC_EXIT(format, ...) \
00148         _SA_PV_LOG_FUNC_EXIT(TRACE_LEVEL_DEBUG, __SA_PV_FILE__, __LINE__, __func__, format, ##__VA_ARGS__)
00149 #define SA_PV_LOG_DATA_FUNC_EXIT_NO_ARGS() \
00150         SA_PV_LOG_DATA_FUNC_EXIT("")
00151 #define SA_PV_LOG_BYTE_BUFF_DATA(name, buff, buff_size) \
00152         _SA_PV_BYTE_BUFF_LOG(TRACE_LEVEL_DEBUG, __SA_PV_FILE__, __LINE__, __func__, name, buff, buff_size)
00153 #else
00154 #define SA_PV_LOG_DATA(format, ...) do {} while (0)
00155 #define SA_PV_LOG_DATA_FUNC_ENTER(format, ...) do {} while (0)
00156 #define SA_PV_LOG_DATA_FUNC_ENTER_NO_ARGS() do {} while (0)
00157 #define SA_PV_LOG_DATA_FUNC_EXIT(format, ...) do {} while (0)
00158 #define SA_PV_LOG_DATA_FUNC_EXIT_NO_ARGS() do {} while (0)
00159 #define SA_PV_LOG_BYTE_BUFF_DATA(format, ...) do {} while (0)
00160 #endif
00161 
00162 /* Should only be called once, additional calls do nothing. */
00163 #define _SA_PV_LOG(level, file, line, func, format, ...) \
00164 do{ \
00165         mbed_tracef(level, "fcc","%s:%d:%s:"format, file, line, func, ##__VA_ARGS__);\
00166 } while (0)
00167 
00168 #define _SA_PV_BYTE_BUFF_LOG(level, file, line, func, name, buff, buff_size) ( mbed_tracef(level, "fcc", "%s"name, mbed_trace_array(buff, buff_size)))
00169 
00170 #undef __PV_LOG_H__INSIDE
00171 
00172 #ifdef __cplusplus
00173 }
00174 #endif
00175 #endif /*__PV_LOG_H__*/
00176