/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : fm33lg0xx_event.h * @brief : 事件记录头文件 * @version : 1.0 * @changelog : version 1.0 初始版本 2025.11.25 * version 1.1 新增故障掩码筛选函数 2025.12.08 ****************************************************************************** * @attention * * Copyright (c) 2025 Yuwell Software Danyang.Jiangsu.China * THIS SOFTWARE is licensed under the Mulan PSL v1. * can use this software according to the terms and conditions of the Mulan PSL v1. * You may obtain a copy of Mulan PSL v1 at: * http://license.coscl.org.cn/MulanPSL * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR * PURPOSE. * See the Mulan PSL v1 for more details. * ****************************************************************************** */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __FM33LG0XX_EVENT_H #define __FM33LG0XX_EVENT_H #ifdef __cplusplus extern "C" { #endif #include #include "fm33lg0xx_fl.h" /** * @brief 制氧机事件类型定义(位映射,1位对应1个事件) * 注:使用uint32_t确保足够的事件位扩展空间,当前占用8个bit */ typedef enum { EVENT_O2_SENSOR_ERROR = (1U << 0), // 氧传感器故障 EVENT_E1_PRESS_LOW = (1U << 1), // 储气罐压力低 EVENT_E2_PRESS_HIGH = (1U << 2), // 储气罐压力高 EVENT_E3_ELEC_LOW = (1U << 3), // 压缩机电流低 EVENT_E4_ELEC_HIGH = (1U << 4), // 压缩机电流过高 EVENT_E5_NTC_HIGH = (1U << 5), // 压缩机电流过高 EVENT_LL_FLOW_LOW = (1U << 6), // 流量低 EVENT_E7_220V_LOW = (1U << 7), // 压缩机电流低 EVENT_O2_900_LOW = (1U << 8), // 氧浓度低 EVENT_O2_835_LOW = (1U << 9), // 氧浓度低 EVENT_KEY2_PRESS = (1U << 10), // 按键2被按下 EVENT_KEY121_PRESS = (1U << 11), // 按键121被按下 EVENT_OK_BLINK = (1U << 12), // OK灯进行闪烁一下 EVENT_BEEP_MUTE = (1U << 13), // 报警器静音 EVENT_464_CLEAR = (1U << 14), // 清零事件 EVENT_BLUE_BLINK = (1U << 15), // 清零事件 EVENT_CLEAN_FILTER_NOTIFY = (1U << 16), // 清洁滤清器事件是否曾经发生过 EVENT_REPLACE_FILTER_NOTIFY = (1U << 17), // 更换滤清器事件是否曾经发生过 } OxygenMachineEvent_t; /** * @brief 事件组存储类型(本质是位掩码) * 用于记录所有事件的发生状态,1表示事件发生,0表示事件未发生 */ typedef uint32_t OxygenEventGroup_t; /** * @brief E1~E7故障掩码(覆盖E1/E2/E3/E4/E5/E7,LL) * 数值:190(十进制)/ 0xBE(十六进制)/ 10111110(二进制) */ #define FAULT_MASK_ERROR_SHOUNTDOWN (EVENT_E1_PRESS_LOW | EVENT_E2_PRESS_HIGH | \ EVENT_E3_ELEC_LOW | EVENT_E4_ELEC_HIGH | \ EVENT_E5_NTC_HIGH | EVENT_LL_FLOW_LOW) #define FAULT_MASK_ERROR_NONE_STOP (EVENT_E7_220V_LOW | EVENT_O2_900_LOW | EVENT_O2_835_LOW) /************************** 事件组操作函数定义 *************************/ /** * @brief 初始化事件组(清除所有事件) * @param pxEventGroup 指向事件组的指针 */ static inline void vOxygenEventGroupInit(OxygenEventGroup_t *pxEventGroup) { if (pxEventGroup != NULL) { *pxEventGroup = 0U; // 所有事件初始化为未发生状态 } } /** * @brief 设置指定事件(标记事件发生) * @param pxEventGroup 指向事件组的指针 * @param ulEventBits 要设置的事件(可通过|组合多个事件) */ static inline void vOxygenEventGroupSetBits(OxygenEventGroup_t *pxEventGroup, uint32_t ulEventBits) { if (pxEventGroup != NULL) { *pxEventGroup |= ulEventBits; // 置位对应事件位 } } /** * @brief 清除指定事件(标记事件已处理) * @param pxEventGroup 指向事件组的指针 * @param ulEventBits 要清除的事件(可通过|组合多个事件) */ static inline void vOxygenEventGroupClearBits(OxygenEventGroup_t *pxEventGroup, uint32_t ulEventBits) { if (pxEventGroup != NULL) { *pxEventGroup &= ~ulEventBits; // 清零对应事件位 } } /** * @brief 检查指定事件是否发生(单次检查单个事件) * @param pxEventGroup 指向事件组的指针 * @param ulEventBit 要检查的单个事件(不可组合多个事件) * @return true: 事件已发生, false: 事件未发生或参数无效 */ static inline bool xOxygenEventGroupCheckBit(const OxygenEventGroup_t *pxEventGroup, uint32_t ulEventBit) { if (pxEventGroup == NULL || (ulEventBit & (ulEventBit - 1)) != 0) { return false; // 确保输入是单个事件位(非0且只有一个bit置1) } return (*pxEventGroup & ulEventBit) != 0; } /** * @brief 检查多个事件中是否有任意一个发生 * @param pxEventGroup 指向事件组的指针 * @param ulEventBits 要检查的事件组合(通过|组合多个事件) * @return true: 至少一个事件已发生, false: 所有指定事件均未发生或参数无效 */ static inline bool xOxygenEventGroupCheckAnyBits(const OxygenEventGroup_t *pxEventGroup, uint32_t ulEventBits) { if (pxEventGroup == NULL) { return false; } return (*pxEventGroup & ulEventBits) != 0; } /** * @brief 检查多个事件是否全部发生 * @param pxEventGroup 指向事件组的指针 * @param ulEventBits 要检查的事件组合(通过|组合多个事件) * @return true: 所有指定事件均已发生, false: 至少一个事件未发生或参数无效 */ static inline bool xOxygenEventGroupCheckAllBits(const OxygenEventGroup_t *pxEventGroup, uint32_t ulEventBits) { if (pxEventGroup == NULL) { return false; } return (*pxEventGroup & ulEventBits) == ulEventBits; } /** * @brief 获取当前所有事件状态(原始位掩码) * @param pxEventGroup 指向事件组的指针 * @return 当前事件组的位掩码值,参数无效时返回0 */ static inline uint32_t ulOxygenEventGroupGetAllBits(const OxygenEventGroup_t *pxEventGroup) { return (pxEventGroup != NULL) ? *pxEventGroup : 0U; } /** * @brief 清除所有事件(复位事件组) * @param pxEventGroup 指向事件组的指针 */ static inline void vOxygenEventGroupClearAllBits(OxygenEventGroup_t *pxEventGroup) { if (pxEventGroup != NULL) { *pxEventGroup = 0U; } } /** * @brief 根据故障掩码筛选当前事件组中的故障码 * @param pxEventGroup 指向事件组的指针 * @param ulFaultMask 故障掩码(如FAULT_MASK_ERROR_SHOUNTDOWN) * @return 掩码范围内的故障码(位掩码形式),参数无效时返回0 * @note 返回值中置1的位表示对应故障已发生且在掩码范围内,0表示无故障 */ static inline uint32_t ulOxygenEventGroupGetFaultByMask(const OxygenEventGroup_t *pxEventGroup, uint32_t ulFaultMask) { // 入参校验,避免空指针访问 if (pxEventGroup == NULL) { return 0U; } // 通过按位与操作筛选出掩码范围内的故障事件 return (*pxEventGroup & ulFaultMask); } extern OxygenEventGroup_t global_event; #ifdef __cplusplus } #endif #endif /* __FM33LG0XX_EVENT_H */ /************************ (C) COPYRIGHT Yuwell *****END OF FILE****/