184 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** 
 | 
						||
**************************************************************************
 | 
						||
* @file mylibs_defs.h
 | 
						||
* @brief Заголочный файл для дефайнов библиотеки MyLibsGeneral.
 | 
						||
**************************************************************************
 | 
						||
* @defgroup MYLIBS_DEFINES  General Tools
 | 
						||
* @ingroup  MYLIBS_ALL
 | 
						||
* @brief    Общие макросы и typedef'ы, используемые по всему проекту
 | 
						||
*
 | 
						||
*************************************************************************/
 | 
						||
#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);
 | 
						||
 | 
						||
/**
 | 
						||
  * @brief Error_Handler который будет вызыватся в библиотеке
 | 
						||
  */
 | 
						||
#define MyLibs_Error_Handler(params)  Error_Handler(params)
 | 
						||
/* If error handler not defined - set void */
 | 
						||
#ifndef MyLibs_Error_Handler
 | 
						||
#define MyLibs_Error_Handler(...)
 | 
						||
#endif // MyLibs_Error_Handler
 | 
						||
 | 
						||
/** @brief Проверить один указатель на NULL */
 | 
						||
#define check_null_ptr_1(p1)                  (p1 == NULL)
 | 
						||
 | 
						||
/** @brief Проверить два указателя на NULL */
 | 
						||
#define check_null_ptr_2(p1, p2)              ((p1 == NULL) || (p1 != NULL && p2 == NULL))
 | 
						||
 | 
						||
/** @brief Проверить три указателя на NULL */
 | 
						||
#define check_null_ptr_3(p1, p2, p3)          ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && p3 == NULL))))
 | 
						||
 | 
						||
/** @brief Проверить четыре указателя на NULL */
 | 
						||
#define check_null_ptr_4(p1, p2, p3, p4)      ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && p4 == NULL))))))
 | 
						||
 | 
						||
/** @brief Проверить пять указателей на NULL */
 | 
						||
#define check_null_ptr_5(p1, p2, p3, p4, p5)  ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && ((p4 == NULL) || (p4 != NULL && p5 == NULL))))))))
 | 
						||
 | 
						||
/** ERROR_HANDLER_DEFINES
 | 
						||
  * @}
 | 
						||
  */
 | 
						||
  
 | 
						||
 | 
						||
/***************************************************************************
 | 
						||
******************************DELAYS_DEFINES*******************************/
 | 
						||
/** 
 | 
						||
  * @addtogroup DELAYS_DEFINES    Delays defines
 | 
						||
  * @ingroup    MYLIBS_DEFINES
 | 
						||
  * @brief       Макросы и определения для работы с задержками в миллисекундах.
 | 
						||
  * @details
 | 
						||
  * Этот блок содержит макросы для реализации задержек с использованием HAL или FreeRTOS:
 | 
						||
  * - @ref msDelay             — простая задержка заданной длительности;
 | 
						||
  * - @ref msDelayStart        — сохранение текущего времени начала задержки;
 | 
						||
  * - @ref msDelayWhileActive  — проверка, активна ли задержка;
 | 
						||
  * - @ref msDelayWaitDone     — проверка, завершена ли задержка.
 | 
						||
  * Эти макросы удобны для реализации неблокирующих задержек.
 | 
						||
  * @{
 | 
						||
  */
 | 
						||
 | 
						||
/** 
 | 
						||
  * @def msDelay(_ms_)
 | 
						||
  * @brief Задержка на указанное количество миллисекунд.
 | 
						||
  * @param _ms_ Время задержки в миллисекундах.
 | 
						||
  * @note Использует HAL_Delay или osDelay в зависимости от @ref FREERTOS_DELAY.
 | 
						||
  */
 | 
						||
#ifdef FREERTOS_DELAY
 | 
						||
  #define msDelay(_ms_)       osDelay(_ms_)
 | 
						||
#else
 | 
						||
  #define msDelay(_ms_)       HAL_Delay(_ms_)
 | 
						||
#endif
 | 
						||
 | 
						||
 | 
						||
/**
 | 
						||
  * @brief Начать отсчет задержки.
 | 
						||
  * @param _pvar_ Указатель на переменную типа uint32_t для хранения времени старта.
 | 
						||
  * @details После вызова этого макроса переменная _pvar_ содержит текущее количество миллисекунд
 | 
						||
  * с момента запуска системы (HAL_GetTick). 
 | 
						||
  * 
 | 
						||
  * Используется для реализации неблокирующих задержек.
 | 
						||
  */
 | 
						||
#define msDelayStart(_pvar_)            *(_pvar_) = HAL_GetTick()
 | 
						||
 | 
						||
/**
 | 
						||
 * @brief Проверяет, активна ли задержка.
 | 
						||
 * @param _ms_ Длительность задержки в миллисекундах.
 | 
						||
 * @param _pvar_ Указатель на переменную, в которой сохранено время начала (@ref msDelayStart).
 | 
						||
 * @retval 1 Задержка еще активна.
 | 
						||
 * @retval 0 Задержка завершена.
 | 
						||
 * @details
 | 
						||
 * Возвращает true, пока время задержки не истекло. Используется в проверках,
 | 
						||
 * когда нужно **действовать, пока задержка выполняется**. Пример:
 | 
						||
 * @code
 | 
						||
 * while(msDelayWhileActive(1000, &tick)) {
 | 
						||
 *     // выполняем другие задачи, задержка не блокирует поток
 | 
						||
 * }
 | 
						||
 * @endcode
 | 
						||
 */
 | 
						||
#define msDelayWhileActive(_ms_, _pvar_)    (HAL_GetTick() - *(_pvar_) < _ms_)
 | 
						||
 | 
						||
/**
 | 
						||
 * @brief Проверяет, завершилась ли задержка.
 | 
						||
 * @param _ms_ Длительность задержки в миллисекундах.
 | 
						||
 * @param _pvar_ Указатель на переменную, в которой сохранено время начала (msDelayStart).
 | 
						||
 * @retval 1 Задержка завершена.
 | 
						||
 * @retval 0 Задержка еще активна.
 | 
						||
 * @details
 | 
						||
 * Возвращает true, когда задержка уже завершена. Используется в проверках,
 | 
						||
 * когда нужно **выполнить действие только после окончания задержки**. Пример:
 | 
						||
 * @code
 | 
						||
 * if(msDelayWaitDone(1000, &tick)) {
 | 
						||
 *     // выполняем действие после завершения задержки
 | 
						||
 * }
 | 
						||
 * @endcode
 | 
						||
 */
 | 
						||
#define msDelayWaitDone(_ms_, _pvar_)    (HAL_GetTick() - *(_pvar_) >= _ms_)
 | 
						||
 | 
						||
/** DELAYS_DEFINES
 | 
						||
  * @}
 | 
						||
  */
 | 
						||
 | 
						||
 | 
						||
/***************************************************************************
 | 
						||
*******************************UTIL_DEFINES********************************/
 | 
						||
static int dummy;
 | 
						||
/** 
 | 
						||
  * @addtogroup UTILS_DEFINES      Utils defines
 | 
						||
  * @ingroup    MYLIBS_DEFINES
 | 
						||
  * @brief      Общие вспомогательные макросы
 | 
						||
  * @{
 | 
						||
  */
 | 
						||
 | 
						||
/**
 | 
						||
 * @brief Обнуление структуры.
 | 
						||
 * @param _struct_ Структура, которую нужно обнулить.
 | 
						||
 * @details Макрос использует memset для обнуления всей памяти структуры.
 | 
						||
 * Используется для быстрой и безопасной инициализации переменных структур до нуля.
 | 
						||
 */
 | 
						||
#define ClearStruct(_struct_)     memset(&(_struct_), 0, sizeof(_struct_))
 | 
						||
 | 
						||
/**
 | 
						||
  * @brief  Деление с округлением вверх
 | 
						||
  * @param _val_ Делимое.
 | 
						||
  * @param _div_ Делитель.
 | 
						||
  * @return Результат деления, округленный вверх.
 | 
						||
  * @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 Исходное 16-битное значение.
 | 
						||
  * @return Результат с поменяными местами старшим и младшим байтом.
 | 
						||
  * @details  Переключения между двумя типами хранения слова: HI-LO байты и LO-HI байты.
 | 
						||
  */
 | 
						||
#define ByteSwap16(v)                                 (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8)))
 | 
						||
 | 
						||
/** 
 | 
						||
  * @brief  Абсолютное значение числа
 | 
						||
  * @param x Число.
 | 
						||
  * @return Абсолютное значение числа x.
 | 
						||
  * @details  Берет число по модулю. Хз как работает библиотечный abs в stdlib.h, мб это быстрее, но вряд ли конечно.
 | 
						||
  */
 | 
						||
#define ABS(x) ( ((x) > 0)? (x) : -(x))
 | 
						||
 | 
						||
/** UTILS_DEFINES
 | 
						||
  * @}
 | 
						||
  */
 | 
						||
  
 | 
						||
#endif //__MYLIBS_DEFINES_H_
 |