/*************************************************************************************************/ /*! * \file wsf_trace.h * * \brief Trace message interface. * * Copyright (c) 2009-2019 Arm Ltd. All Rights Reserved. * * Copyright (c) 2019-2020 Packetcraft, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /*************************************************************************************************/ #ifndef WSF_TRACE_H #define WSF_TRACE_H #include #include "wsf_types.h" #ifdef __cplusplus extern "C" { #endif /*! \addtogroup WSF_TRACE_API * \{ */ /************************************************************************************************** Macros **************************************************************************************************/ #ifndef WSF_TRACE_ENABLED /*! \brief Trace enable flag (default is disabled, override with compile-time directive). */ #define WSF_TRACE_ENABLED FALSE #endif #ifndef WSF_TOKEN_ENABLED /*! \brief Tokenized tracing enable flag (default is disabled, override with compile-time directive). */ #define WSF_TOKEN_ENABLED FALSE #endif #ifndef LL_TRACE_ENABLED /*! \brief Trace enabled for controller */ #define LL_TRACE_ENABLED FALSE #endif #ifndef AUD_TRACE_ENABLED /*! \brief Trace enabled for audio subsystem */ #define AUD_TRACE_ENABLED FALSE #endif /************************************************************************************************** Data Types **************************************************************************************************/ /*! \brief Token event handler. */ typedef bool_t (*WsfTraceHandler_t)(const uint8_t *pBuf, uint32_t len); /*! \brief BT4 Platform trace callback. */ typedef void (*WsfBt4TraceCback_t)(const char *pStr, va_list args); /************************************************************************************************** Function Prototypes **************************************************************************************************/ /*************************************************************************************************/ /*! * \brief Output tokenized message. * * \param tok Token * \param var Variable */ /*************************************************************************************************/ void WsfToken(uint32_t tok, uint32_t var); /*************************************************************************************************/ /*! * \brief Enable trace messages. * * \param enable TRUE to enable, FALSE to disable */ /*************************************************************************************************/ void WsfTraceEnable(bool_t enable); /*************************************************************************************************/ /*! * \brief Output trace message. * * \param pStr Format string * Addition parameters variable arguments to the format string. */ /*************************************************************************************************/ void WsfTrace(const char *pStr, ...); /*************************************************************************************************/ /*! * \brief Register trace handler. * * \param traceCback Token event handler. * * This routine registers a token callback. This callback is called when the next token event * is ready to be written to the I/O. */ /*************************************************************************************************/ void WsfTraceRegisterHandler(WsfTraceHandler_t traceCback); /*************************************************************************************************/ /*! * \brief Register BT4 platform trace callback function. * * \param cback Callback function */ /*************************************************************************************************/ void WsfTraceRegister(WsfBt4TraceCback_t cback); /*************************************************************************************************/ /*! * \brief Service the trace ring buffer. * * \return TRUE if trace messages pending, FALSE otherwise. * * This routine is called in the main loop for a "push" type trace systems. */ /*************************************************************************************************/ bool_t WsfTokenService(void); /************************************************************************************************** Macros **************************************************************************************************/ #ifdef TOKEN_GENERATION #define WSF_TOKEN(subsys, stat, msg) \ __WSF_TOKEN_DEFINE__(/* token: */ MODULE_ID, __LINE__, /* origin: */ __FILE__, subsys, /* message: */ stat, msg) #define WSF_TRACE0(subsys, stat, msg) WSF_TOKEN(subsys, stat, msg) #define WSF_TRACE1(subsys, stat, msg, var1) WSF_TOKEN(subsys, stat, msg) #define WSF_TRACE2(subsys, stat, msg, var1, var2) WSF_TOKEN(subsys, stat, msg) #define WSF_TRACE3(subsys, stat, msg, var1, var2, var3) WSF_TOKEN(subsys, stat, msg) #elif WSF_TOKEN_ENABLED == TRUE /** \name Trace macros * */ /**@{*/ #define WSF_TRACE0(subsys, stat, msg) WsfToken(((__LINE__ & 0xFFF) << 16) | MODULE_ID, 0) #define WSF_TRACE1(subsys, stat, msg, var1) WsfToken(((__LINE__ & 0xFFF) << 16) | MODULE_ID, (uint32_t)(var1)) #define WSF_TRACE2(subsys, stat, msg, var1, var2) \ WsfToken(((__LINE__ & 0xFFF) << 16) | MODULE_ID, (uint32_t)(((var2) << 16) | ((var1)&0xFFFF))) #define WSF_TRACE3(subsys, stat, msg, var1, var2, var3) \ WsfToken(((__LINE__ & 0xFFF) << 16) | MODULE_ID, \ (uint32_t)((((var3)&0xFFFF) << 16) | (((var2)&0xFF) << 8) | ((var1)&0xFF))) /**@}*/ #elif WSF_TRACE_ENABLED == TRUE /** \name Trace macros * */ /**@{*/ #define WSF_TRACE0(subsys, stat, msg) WsfTrace(msg) #define WSF_TRACE1(subsys, stat, msg, var1) WsfTrace(msg, var1) #define WSF_TRACE2(subsys, stat, msg, var1, var2) WsfTrace(msg, var1, var2) #define WSF_TRACE3(subsys, stat, msg, var1, var2, var3) WsfTrace(msg, var1, var2, var3) #define WSF_TRACE4(subsys, stat, msg, var1, var2, var3, var4) WsfTrace(msg, var1, var2, var3, var4) #define WSF_TRACE5(subsys, stat, msg, var1, var2, var3, var4, var5) WsfTrace(msg, var1, var2, var3, var4, var5) #define WSF_TRACE6(subsys, stat, msg, var1, var2, var3, var4, var5, var6) \ WsfTrace(msg, var1, var2, var3, var4, var5, var6) #define WSF_TRACE7(subsys, stat, msg, var1, var2, var3, var4, var5, var6, var7) \ WsfTrace(msg, var1, var2, var3, var4, var5, var6, var7) #define WSF_TRACE8(subsys, stat, msg, var1, var2, var3, var4, var5, var6, var7, var8) \ WsfTrace(msg, var1, var2, var3, var4, var5, var6, var7, var8) #define WSF_TRACE9(subsys, stat, msg, var1, var2, var3, var4, var5, var6, var7, var8, var9) \ WsfTrace(msg, var1, var2, var3, var4, var5, var6, var7, var8, var9) #define WSF_TRACE12(subsys, stat, msg, var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12) \ WsfTrace(msg, var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12) /**@}*/ #else /** \name Trace macros * */ /**@{*/ #define WSF_TRACE0(subsys, stat, msg) #define WSF_TRACE1(subsys, stat, msg, var1) #define WSF_TRACE2(subsys, stat, msg, var1, var2) #define WSF_TRACE3(subsys, stat, msg, var1, var2, var3) #define WSF_TRACE4(subsys, stat, msg, var1, var2, var3, var4) #define WSF_TRACE5(subsys, stat, msg, var1, var2, var3, var4, var5) #define WSF_TRACE6(subsys, stat, msg, var1, var2, var3, var4, var5, var6) #define WSF_TRACE7(subsys, stat, msg, var1, var2, var3, var4, var5, var6, var7) #define WSF_TRACE8(subsys, stat, msg, var1, var2, var3, var4, var5, var6, var7, var8) #define WSF_TRACE9(subsys, stat, msg, var1, var2, var3, var4, var5, var6, var7, var8, var9) #define WSF_TRACE12(subsys, stat, msg, var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12) /**@}*/ #endif /*! \brief 0 argument WSF info trace. */ #define WSF_TRACE_INFO0(msg) /*! \brief 1 argument WSF info trace. */ #define WSF_TRACE_INFO1(msg, var1) /*! \brief 2 argument WSF info trace. */ #define WSF_TRACE_INFO2(msg, var1, var2) /*! \brief 3 argument WSF info trace. */ #define WSF_TRACE_INFO3(msg, var1, var2, var3) /*! \brief 0 argument WSF warning trace. */ #define WSF_TRACE_WARN0(msg) WSF_TRACE0("WSF", "WARN", msg) /*! \brief 1 argument WSF warning trace. */ #define WSF_TRACE_WARN1(msg, var1) WSF_TRACE1("WSF", "WARN", msg, var1) /*! \brief 2 argument WSF warning trace. */ #define WSF_TRACE_WARN2(msg, var1, var2) WSF_TRACE2("WSF", "WARN", msg, var1, var2) /*! \brief 3 argument WSF warning trace. */ #define WSF_TRACE_WARN3(msg, var1, var2, var3) WSF_TRACE3("WSF", "WARN", msg, var1, var2, var3) /*! \brief 0 argument WSF error trace. */ #define WSF_TRACE_ERR0(msg) WSF_TRACE0("WSF", "ERR", msg) /*! \brief 1 argument WSF error trace. */ #define WSF_TRACE_ERR1(msg, var1) WSF_TRACE1("WSF", "ERR", msg, var1) /*! \brief 2 argument WSF error trace. */ #define WSF_TRACE_ERR2(msg, var1, var2) WSF_TRACE2("WSF", "ERR", msg, var1, var2) /*! \brief 3 argument WSF error trace. */ #define WSF_TRACE_ERR3(msg, var1, var2, var3) WSF_TRACE3("WSF", "ERR", msg, var1, var2, var3) /*! \brief 0 argument WSF buffer allocation trace. */ #define WSF_TRACE_ALLOC0(msg) /*! \brief 1 argument WSF buffer allocation trace. */ #define WSF_TRACE_ALLOC1(msg, var1) /*! \brief 2 argument WSF buffer allocation trace. */ #define WSF_TRACE_ALLOC2(msg, var1, var2) /*! \brief 3 argument WSF buffer allocation trace. */ #define WSF_TRACE_ALLOC3(msg, var1, var2, var3) /*! \brief 0 argument WSF buffer free trace. */ #define WSF_TRACE_FREE0(msg) /*! \brief 1 argument WSF buffer free trace. */ #define WSF_TRACE_FREE1(msg, var1) /*! \brief 2 argument WSF buffer free trace. */ #define WSF_TRACE_FREE2(msg, var1, var2) /*! \brief 3 argument WSF buffer free trace. */ #define WSF_TRACE_FREE3(msg, var1, var2, var3) /*! \brief 0 argument WSF message trace. */ #define WSF_TRACE_MSG0(msg) /*! \brief 1 argument WSF message trace. */ #define WSF_TRACE_MSG1(msg, var1) /*! \brief 2 argument WSF message trace. */ #define WSF_TRACE_MSG2(msg, var1, var2) /*! \brief 3 argument WSF message trace. */ #define WSF_TRACE_MSG3(msg, var1, var2, var3) /*! \brief 0 argument App info trace. */ #define APP_TRACE_INFO0(msg) WSF_TRACE0("APP", "INFO", msg) /*! \brief 1 argument App info trace. */ #define APP_TRACE_INFO1(msg, var1) WSF_TRACE1("APP", "INFO", msg, var1) /*! \brief 2 argument App info trace. */ #define APP_TRACE_INFO2(msg, var1, var2) WSF_TRACE2("APP", "INFO", msg, var1, var2) /*! \brief 3 argument App info trace. */ #define APP_TRACE_INFO3(msg, var1, var2, var3) WSF_TRACE3("APP", "INFO", msg, var1, var2, var3) /*! \brief 4 argument App info trace. */ #define APP_TRACE_INFO4(msg, var1, var2, var3, var4) WSF_TRACE4(INFO, APP, msg, var1, var2, var3, var4) /*! \brief 5 argument App info trace. */ #define APP_TRACE_INFO5(msg, var1, var2, var3, var4, var5) WSF_TRACE5(INFO, APP, msg, var1, var2, var3, var4, var5) /*! \brief 6 argument App info trace. */ #define APP_TRACE_INFO6(msg, var1, var2, var3, var4, var5, var6) \ WSF_TRACE6(INFO, APP, msg, var1, var2, var3, var4, var5, var6) /*! \brief 7 argument App info trace. */ #define APP_TRACE_INFO7(msg, var1, var2, var3, var4, var5, var6, var7) \ WSF_TRACE7(INFO, APP, msg, var1, var2, var3, var4, var5, var6, var7) /*! \brief 8 argument App info trace. */ #define APP_TRACE_INFO8(msg, var1, var2, var3, var4, var5, var6, var7, var8) \ WSF_TRACE8(INFO, APP, msg, var1, var2, var3, var4, var5, var6, var7, var8) /*! \brief 9 argument App info trace. */ #define APP_TRACE_INFO9(msg, var1, var2, var3, var4, var5, var6, var7, var8, var9) \ WSF_TRACE9(INFO, APP, msg, var1, var2, var3, var4, var5, var6, var7, var8, var9) /*! \brief 12 argument App info trace. */ #define APP_TRACE_INFO12(msg, var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12) \ WSF_TRACE12(INFO, APP, msg, var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12) /*! \brief 0 argument App warning trace. */ #define APP_TRACE_WARN0(msg) WSF_TRACE0("APP", "WARN", msg) /*! \brief 1 argument App warning trace. */ #define APP_TRACE_WARN1(msg, var1) WSF_TRACE1("APP", "WARN", msg, var1) /*! \brief 2 argument App warning trace. */ #define APP_TRACE_WARN2(msg, var1, var2) WSF_TRACE2("APP", "WARN", msg, var1, var2) /*! \brief 3 argument App warning trace. */ #define APP_TRACE_WARN3(msg, var1, var2, var3) WSF_TRACE3("APP", "WARN", msg, var1, var2, var3) /*! \brief 0 argument App error trace. */ #define APP_TRACE_ERR0(msg) WSF_TRACE0("APP", "ERR", msg) /*! \brief 1 argument App error trace. */ #define APP_TRACE_ERR1(msg, var1) WSF_TRACE1("APP", "ERR", msg, var1) /*! \brief 2 argument App error trace. */ #define APP_TRACE_ERR2(msg, var1, var2) WSF_TRACE2("APP", "ERR", msg, var1, var2) /*! \brief 3 argument App error trace. */ #define APP_TRACE_ERR3(msg, var1, var2, var3) WSF_TRACE3("APP", "ERR", msg, var1, var2, var3) /*! \} */ /* WSF_TRACE_API */ #ifdef __cplusplus }; #endif #endif /* WSF_TRACE_H */