current_v/Inc/fm33lg0xx_event.h
2025-12-31 08:21:43 +08:00

254 lines
6.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* 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/E7LL
* 数值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****/