/*------------------------------------------------------------------------------------------------*/
/* UNICENS V2.1.0-3491 */
/* Copyright (c) 2017 Microchip Technology Germany II GmbH & Co. KG. */
/* */
/* This program is free software: you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation, either version 2 of the License, or */
/* (at your option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see . */
/* */
/* You may also obtain this software under a propriety license from Microchip. */
/* Please contact Microchip for further information. */
/*------------------------------------------------------------------------------------------------*/
/*!
* \file
* \brief Internal header file of the trace interface
*/
#ifndef UCS_TRACE_H
#define UCS_TRACE_H
/*------------------------------------------------------------------------------------------------*/
/* Includes */
/*------------------------------------------------------------------------------------------------*/
#include "ucs_trace_pb.h"
#ifdef __cplusplus
extern "C"
{
#endif
/*------------------------------------------------------------------------------------------------*/
/* Unit and entry ids */
/*------------------------------------------------------------------------------------------------*/
#define TR_UCS_ASSERT "ASSERT failed in line %d"
#define TR_UCS_INIC_RESULT_ID_1 "INIC error data:"
#define TR_UCS_INIC_RESULT_ID_2 "--> Data[%u]: 0x%02X"
/*------------------------------------------------------------------------------------------------*/
/* Internal macros */
/*------------------------------------------------------------------------------------------------*/
/*! \def UCS_TR_INFO
* \brief Trace macro to capture trace info events
* \details This macro is used to enable the capturing of trace info events. The macro must be
* mapped onto a user-defined function. To disable the trace info events, the macro must
* not be defined. The mapped user-defined function must adhere to the following function
* signature.
*
* void (*Ucs_TraceCb_t)(void * ucs_user_ptr, const char module_str[], const char entry_str[], uint16_t vargs_cnt, ...);
* - ucs_user_ptr
Reference to the User argument
* - module_str
The name of the software module that has posted the trace
* - entry_str
The trace entry as formatted string
* - vargs_cnt
Number of trace arguments which will be passed within the variable
* argument list
* - [...]
Variable argument list to pass trace arguments
*
* \warning Do not assign UCS_TR_INFO in a production system. This has major effects on the CPU load and runtime.
* UCS_TR_INFO is intended for debugging software during development phase. Microchip Support might
* request you to assign of this macro to spy on internal events. Disable this macro definition after
* your support case is closed.
*
* Example:
* \code
* extern void App_UcsTraceInfo(void * ucs_user_ptr,
* const char module_str[],
* const char entry_str[],
* uint16_t vargs_cnt,
* ...);
*
* #define UCS_TR_INFO App_UcsTraceInfo
* \endcode
*
* \ingroup G_UCS_TRACE
*/
/*! \def UCS_TR_ERROR
* \brief Trace macro to capture trace error events
* \details This macro is used to enable the capturing of trace error events. The macro must be
* mapped onto a user-defined function. To disable the trace error events, the macro must
* not be defined. The mapped user-defined function must adhere to the following function
* signature.
*
* void (*Ucs_TraceCb_t)(void * ucs_user_ptr, const char module_str[], const char entry_str[], uint16_t vargs_cnt, ...);
* - ucs_user_ptr
Reference to the User argument
* - module_str
The name of the software module that has posted the trace
* - entry_str
The trace entry as formatted string
* - vargs_cnt
Number of trace arguments which will be passed within the variable
* argument list
* - [...]
Variable argument list to pass trace arguments
*
* \note The captured error events can be used for logging and as a first step for debugging
* unexpected behavior. However, the application must not derive any action when an error
* is indicated by the trace interface. An application must handle rely on result callback
* functions and handle "general.error_fptr()".
*
* Example:
* \code
* extern void App_UcsTraceError(void * ucs_user_ptr,
* const char module_str[],
* const char entry_str[],
* uint16_t vargs_cnt,
* ...);
*
* #define UCS_TR_ERROR App_UcsTraceError
* \endcode
*
* \ingroup G_UCS_TRACE
*/
/*! \addtogroup G_UCS_TRACE
* \details The UCS Trace Interface is intended for debugging and logging purpose.
* There are 2 different trace options:
* - The definition of trace macros to print out internal states, messages
* and errors. This option provides two trace classes: \c info and \c error. Each trace
* class can be activated by defining the respective macro UCS_TR_INFO
* UCS_TR_ERROR in the configuration header file \c ucs_cfg.h.
* While the \c info class is intended only for debugging purpose during
* development, the \c error class can also be active for logging purpose
* in a production system.
* - Implementation of the callback function Ucs_DebugErrorMsgCb_t which is assigned
* during initialization. The callback function is fired on every received Error
* message from a local or remote INIC.
*/
/*!
* \cond UCS_INTERNAL_DOC
* \addtogroup G_TRACE
* @{
*/
/*! \def TR_INFO
* \brief Trace macro to capture trace info events
* \details The macro is referenced to a public trace macro which must be defined in ucs_cfg.h. The
* public macros refers to a trace function which must be implemented by the application.
* The given arguments can be stored or immediately converted into a trace output by
* invoking the function Ucs_Tr_DecodeTrace().
* \param args Container of arguments. The following arguments are of the container.
* - ucs_user_ptr Reference to the User argument
* - unit Id of the UNICENS unit that has posted the trace
* - entry Id of the trace entry
* - vargs_cnt Number of trace arguments which will be passed within the variable
* argument list
* - [...] Variable argument list to pass trace arguments
*/
/*! \def TR_ERROR
* \brief Trace macro to capture trace error events
* \details The macro is referenced to a public trace macro which must be defined in ucs_cfg.h. The
* public macros refers to a trace function which must be implemented by the application.
* The given arguments can be stored or immediately converted into a trace output by
* invoking the function Ucs_Tr_DecodeTrace().
* \param args Container of arguments. The following arguments are of the container.
* - ucs_user_ptr Reference to the User argument
* - unit Id of the UNICENS unit that has posted the trace
* - entry Id of the trace entry
* - vargs_cnt Number of trace arguments which will be passed within the variable
* argument list
* - [...] Variable argument list to pass trace arguments
*/
/*! \def TR_FAILED_ASSERT
* \brief Failed Assert statement which will add error entry into the trace output.
* \param ucs_user_ptr Reference to the User argument
* \param unit Identifier for the respective software unit.
*/
/*! \def TR_ASSERT
* \brief Assert statement which evaluates an expression to true. If the expression
* evaluates to false a failed assert will be printed into the trace output.
* \param ucs_user_ptr Reference to the User argument
* \param unit Identifier for the respective software unit.
* \param expr Expression which shall evaluate to \c true (expectation applies)
*/
/*! \def TR_ERROR_INIC_RESULT
* \brief Trace macro to capture INIC error data
* \param ucs_user_ptr Reference to the User argument
* \param unit Identifier for the respective software unit.
* \param info_ptr Byte stream which contains the raw INIC error data
* \param info_size Size of the INIC error data in bytes
*/
/*!
* @}
* \endcond
*/
/* parasoft suppress MISRA2004-19_7 MISRA2004-19_4 reason "function-like macros are allowed for tracing" */
#ifdef UCS_TR_ERROR
# define TR_ERROR(args) UCS_TR_ERROR args;
# define TR_FAILED_ASSERT(ucs_user_ptr, unit) TR_ERROR(((ucs_user_ptr), (unit), TR_UCS_ASSERT, 1U, __LINE__))
# define TR_ASSERT(ucs_user_ptr, unit, expr) if (!(expr)) {TR_FAILED_ASSERT((ucs_user_ptr), (unit));}
# define TR_ERROR_INIC_RESULT(ucs_user_ptr, unit, info_ptr, info_size) \
{ \
uint8_t i; \
TR_ERROR(((ucs_user_ptr), (unit), TR_UCS_INIC_RESULT_ID_1, 0U)); \
for(i=0U; i