/** 
**************************************************************************
* @file trace.h
* @brief Заголочный файл для работы с трассировкой.
**************************************************************************
* @addtogroup 	TRACE           Trace defines
* @ingroup 		  MYLIBS_DEFINES
* @brief 		    Дефайны для работы с трассировкой
*************************************************************************/
#ifndef __TRACE_H_
#define __TRACE_H_
#include "mylibs_defs.h"

/** 
	* @addtogroup TRACE_SERIAL    Serial trace defines
	* @ingroup 		TRACE
  * @brief 		  Дефайны для работы с serial трассировкой
  * @details    Определяется дефайн my_printf() для работы с serial трассировкой:
    - для RTT это будет вызов функции SEGGER_RTT_printf(), с подключением библиотеки SEGGER_RTT.h
    - для SWO это будет просто printf(), но библиотеку STDOUT надо подключить самостоятельно:
    
    @verbatim
    Manage Run-Time Environment -> Compiler -> I/O -> STDOUT
    @endverbatim
    
    - Если трассировка отключена, то все дефайны определяются как 'ничего' и на производительность кода не влияют
	@{
	*/
/* Выбор какой serial trace использовать */
#ifdef SERIAL_TRACE_ENABLE

  #if defined(RTT_TRACE_ENABLE)
    #undef SWO_TRACE_ENABLE
    #include "SEGGER_RTT.h"
    #define my_printf(...)     SEGGER_RTT_printf(0, __VA_ARGS__)
  #elif defined(SWO_TRACE_ENABLE)
    #undef RTT_TRACE_ENABLE
    #define my_printf(...)     printf(__VA_ARGS__)
  #else // NO_TRACE
    #define my_printf(...)     
    #warning No trace is selected. Serial debug wont work.
  #endif // RTT_TRACE_ENABLE/SWO_TRACE_ENABLE/NO_TRACE
#else //SERIAL_TRACE_ENABLE
  #define my_printf(...)     
  #undef RTT_TRACE_ENABLE
  #undef SWO_TRACE_ENABLE

#endif //SERIAL_TRACE_ENABLE

/** TRACE_SERIAL
  * @}
  */


/** 
	* @addtogroup TRACE_GPIO    GPIO trace defines
	* @ingroup 		TRACE
  * @brief 		  Дефайны для работы с GPIO трассировкой
  * @details    Определяется дефайны для работы с GPIO трассировкой:
    - TRACE_GPIO_RESET() - для сброса ножки GPIO (через BSRR)
    - TRACE_GPIO_SET() - для выставления ножки GPIO (через BSRR)
    
    - Если трассировка отключена, то все дефайны определяются как 'ничего' и на производительность кода не влияют
	@{
	*/
#ifndef GPIO_TRACE_ENABLE
  #define TRACE_GPIO_RESET(_gpio_,_pin_)
  #define TRACE_GPIO_SET(_gpio_,_pin_)
#else
  #define TRACE_GPIO_RESET(_gpio_,_pin_)				(_gpio_)->BSRR = ((_pin_)<<16)
  #define TRACE_GPIO_SET(_gpio_,_pin_)					(_gpio_)->BSRR = (((_pin_)))
#endif //GPIO_TRACE_ENABLE


/** TRACE_GPIO
  * @}
  */


#endif //__TRACE_H_