/** 
**************************************************************************
* @file mylibs_defs.h
* @brief Заголочный файл для дефайнов библиотеки MyLibsGeneral.
**************************************************************************
* @defgroup MYLIBS_DEFINES  My Libs defines
* @brief 		Базовые дефайны для всего проекта
*
*************************************************************************/
#ifndef __MYLIBS_DEFINES_H_
#define __MYLIBS_DEFINES_H_

#include "mylibs_config.h"

/***************************************************************************
******************************ERROR_HANDLER********************************/
/** 
	* @addtogroup ERROR_HANDLER_DEFINES   Error Handler defines
	* @ingroup 		MYLIBS_DEFINES
  * @brief 		  Дефайны для определения функции обработки ошибок
	@{
	*/

/* extern Error_Handler from main.h */
extern void Error_Handler(void);

/* Define error handler for MyLibs */
#define MyLibs_Error_Handler(_params_) 	Error_Handler(_params_)
/* If error handler not defined - set void */
#ifndef MyLibs_Error_Handler
#define ((void)0U)
#endif // MyLibs_Error_Handler

/** ERROR_HANDLER_DEFINES
  * @}
  */
  

/***************************************************************************
********************************ACCESS_DEFINES*****************************/

#define ClearStruct(_struct_)     memset(&(_struct_), 0, sizeof(_struct_))



/***************************************************************************
******************************DELAYS_DEFINES*******************************/
/** 
	* @addtogroup DELAYS_DEFINES    Delays defines
	* @ingroup 		MYLIBS_DEFINES
  * @brief 		  Дефайны для реализации задержек
	@{
	*/

#ifdef FREERTOS_DELAY
	#define msDelay(_ms_)			osDelay(_ms_)
#else
	#define msDelay(_ms_)			if(_ms_ != 0) HAL_Delay(_ms_-1)
#endif

/** DELAYS_DEFINES
  * @}
  */


/***************************************************************************
*******************************MATH_DEFINES********************************/
/** 
	* @addtogroup MATH_DEFINES      Math defines
	* @ingroup 		MYLIBS_DEFINES
  * @brief 		  Дефайны для различных математических функций
	@{
	*/

/**
	* @brief	Calc dividing including remainder
	*	@param 	_val_		- делимое.
	*	@param 	_div_		- делитель.
	*	@details 	Если результат деления без остатка: он возвращается как есть
						Если с остатком - округляется вверх
	*/
//#define Divide_Up(_val_, _div_)												(((_val_)%(_div_))? (_val_)/(_div_)+1 : (_val_)/_div_)	/* через тернарный оператор */
#define Divide_Up(_val_, _div_)												((_val_ - 1) / _div_) + 1																	/* через мат выражение */	

/** 
	* @brief 	Swap between Little Endian and Big Endian
	* @param 	v 			- Переменная для свапа.
  * @return v (new)	- Свапнутая переменная.
  * @details 	Переключения между двумя типами хранения слова: HI-LO байты и LO-HI байты.
	*/
#define ByteSwap16(v)																	(((v&0xFF00) >> (8)) | ((v&0x00FF) << (8)))

/** 
	* @brief 	Absolute
	* @param 	x 			- Переменная для модудя.
  * @return x (new)	- Число по модулю.
  * @details  Берет число по модулю. Хз как работает библиотечный abs в stdlib.h, мб это быстрее, но вряд ли конечно.
	*/
#define ABS(x) ( ((x) > 0)? (x) : -(x))?

/** MATH_DEFINES
  * @}
  */
  
#endif //__MYLIBS_DEFINES_H_