/** ************************************************************************** * @file mylibs_defs.h * @brief Заголочный файл для дефайнов библиотеки MyLibsGeneral. ************************************************************************** * @defgroup MYLIBS_DEFINES General Defines * @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 * @} */ /*************************************************************************** ********************************ACCESS_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 * @} */ /*************************************************************************** *******************************MATH_DEFINES********************************/ /** * @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_