254 lines
6.9 KiB
C
254 lines
6.9 KiB
C
/* 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 <stdint.h>
|
||
#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****/
|
||
|