1. 概述:
Alarm模块,主要针对场景监测,进行报警和恢复的动作
例如,高温监测
系统处于监测工作中,监测到温度高于80℃并持续一分钟,系统触发报警
系统处于报警状态时,监测到温度低于60℃并持续一分钟,系统恢复正常
2. 测试:
示例:
秒数的滚动轮询是0-59-0-59-…
秒数小于或等于10并且维持2秒时报警,就相当于时间点处于1S的时候会报警;
秒数大于或等于30并且维持2秒时恢复,就相当于时间点处于31S的时候会恢复
3. 接口:
Alarm模块接口,见头文件,持续完善,欢迎补充
/*
From : https://github.com/paiminlin/PM
From : https://blog.csdn.net/lpaim/article/details/122160744
Author : PaiMin.lin
Date : 2022.7.16
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C"{
#endif
#ifndef ALARM_H_
#define ALARM_H_
#define AlarmTask_MAXNUM 100 /* 支持最多管理的报警对象数量 */
typedef struct Alarm_Interval
{
int Threshold; /* 阈值 */
int duration; /* 维持时间 duration * Alarm_Run */
} Alarm_Interval;
typedef int (*AlarmGetData_Fun)(void);
typedef int (*AlarmSill_Fun)(void);
typedef int (*AlarmResume_Fun)(void);
typedef struct AlarmTask_Info
{
Alarm_Interval AlarmSill; /* 报警阈值/维持时间 */
Alarm_Interval AlarmResume; /* 回滞阈值/维持时间 */
AlarmGetData_Fun AlarmGetDataFun; /* 获取报警对象 返回报警对象数据 */
AlarmSill_Fun AlarmSillFun; /* 触发报警 */
AlarmResume_Fun AlarmResumeFun; /* 触发回滞 */
} AlarmTask_Info;
int Alarm_Run(void);
int Alarm_Start(void);
int Alarm_Stop(void);
int Alarm_Init(void);
int Alarm_DeInit(void);
int Alarm_CreatTask(AlarmTask_Info * pstAlarmTaskInfo);
int Alarm_DestroyTask(int TaskNum, AlarmTask_Info * pstAlarmTaskInfo);
bool Alarm_GetTaskStatus(int TaskNum);
#endif /* ALARM_H_ */
#ifdef __cplusplus
}
#endif
/*
From : https://github.com/paiminlin/PM
From : https://blog.csdn.net/lpaim/article/details/122160744
Author : PaiMin.lin
Date : 2022.7.16
*/
#include "Alarm.h"
#ifdef __cplusplus
extern "C"{
#endif
typedef enum
{
Alarm_Sill_Mode = 0,
Alarm_Resume_Mode = 1,
Alarm_Invalid_Mode = 2,
}Alarm_Mode;
typedef struct Alarm_Info
{
bool bAlarmInit;
bool bAlarmStart;
bool bAlarmTaskStatus[AlarmTask_MAXNUM];
} Alarm_Info;
static int s_AlarmCounter[AlarmTask_MAXNUM] = {
0};
static Alarm_Mode s_enLastAlarmMode[AlarmTask_MAXNUM] = {
0};
static Alarm_Info s_stAlarmInfo = {
0};
static AlarmTask_Info s_stAlarmTaskInfo[AlarmTask_MAXNUM] = {
0};
int Alarm_Run(void)
{
if(s_stAlarmInfo.bAlarmInit == false || s_stAlarmInfo.bAlarmStart == false)
return 0;
int TaskNum = 0;
for(TaskNum = 0; TaskNum <AlarmTask_MAXNUM; TaskNum ++)
{
if(s_stAlarmTaskInfo[TaskNum].AlarmGetDataFun != NULL)
{
/*
报警阈值 > 恢复阈值;
*/
if(s_stAlarmTaskInfo[TaskNum].AlarmSill.Threshold > s_stAlarmTaskInfo[TaskNum