适用条件:
有报警信息产生,并且需要轮询展示
当报警消失时,消息也会随之消失
. H
#define ALARM_MAX_NUM 32
#define NO_ERROR 0
#define HAVE_ERROR 1
struct s_Alarm_info_msg_box{
uint8_t state; //告警状态
uint8_t msg_box[ALARM_MAX_NUM]; //信息盒子
uint8_t index; //指向当前要展示的告警信息
uint8_t last; //告警信息数量
};
定义一个全局对象:
struct s_Alarm_info_msg_box alarm_box;
初始化对象为默认值,放入init函数
alarm_box.state = NO_ERROR;
alarm_box.last = 0;
alarm_box.index = alarm_box.last;
memset(alarm_box.msg_box ,'\0',32); //清空消息盒子
.C
/**
@ bref 增加一个消息msg
msg为自定义非0 数据即可
**/
void Add_error_msg( uint8_t msg){
//更新状态为有报警
uint8_t i = 0;
uint8_t identical = 1;
alarm_box.state = HAVE_ERROR;
#ifdef __LED_H
setNumber_5(7,START); //报警灯亮
Led_State.Led7 = START;
#endif
if(alarm_box.last <= ALARM_MAX_NUM){
//把报警消息放入盒子 不同数值对应不同的报警信息,只需要放入即可,不用排序
//判断盒子是否已经存在此消息
for(i = 0 ;i < alarm_box.last;i++){
if(alarm_box.msg_box[i] == msg){
identical = 0;
//printf("存在相同告警信息\n");
break;// 存在相同,退出
}
}
if(identical){
alarm_box.msg_box[alarm_box.last] = msg;
//增加消息last;
alarm_box.last++;
}
}
}
/**
@bref 按照加入的顺序循环读取msg,
一次只能读一个
返回读取到的msg
**/
uint8_t Read_error_msg(void){
uint8_t rtn = 0;
uint8_t i = 0;
#ifdef OFF_LINE
//掉线警告优先级最高
if((alarm_box.state == HAVE_ERROR)&& (alarm_box.last >0)){
for(i=0;i<alarm_box.last ;i++){
if(alarm_box.msg_box[i] == OFF_LINE){
return OFF_LINE; //掉线之后只返回掉线信息
}
}
}
#endif
//判断告警消息盒子是否为空
if(alarm_box.state == HAVE_ERROR){
//判断index是否 = last
if(alarm_box.index >= alarm_box.last){
alarm_box.index = 0;
}
//不为空取出index所指向的消息
rtn = alarm_box.msg_box[alarm_box.index];
//index++
alarm_box.index++;
//返回消息值
return rtn;
}
else{
return 0; //无消息返回0
}
}
/**
@bref 根据传入的msg,从盒子里面找到一样的进行删除
**/
uint8_t Alarm_infor_clear(uint8_t msg){
uint8_t i = 0;
uint8_t index = 0;
//uint8_t temp = 0;
//先查看消息盒子知否为空
if(alarm_box.state == HAVE_ERROR){
//不为空,遍历查找对应的msg,然后清除
for(i = 0 ;i < alarm_box.last;i++){
if(alarm_box.msg_box[i] == msg){
index = i; //找到相同的消息
break;
}
else if((i+1) == alarm_box.last){
return 0; //没有找到相同的消息
}
}
//把后面的消息依次向前靠拢
for(i = index;i < alarm_box.last;i++){
alarm_box.msg_box[i] = alarm_box.msg_box[i+1];
}
alarm_box.last--;
if(alarm_box.last == 0){
alarm_box.state = NO_ERROR;
#ifdef __LED_H
setNumber_5(7,CLOSE); //报警灯灭
Led_State.Led7 = CLOSE;
#endif
}
return 1;
}
else{
return 0; //空盒子返回0
}
}