MCU Alarm报警监测

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值