

#ifndef _POPUP_SCHEDULER_XiaoKang_H_
#define _POPUP_SCHEDULER_XiaoKang_H_

//目前最大支持30个声音报警
#include "Alarm_typdef.h"

typedef enum
{
	Sound_Play_Control = 0,
	Sound_Play_NOTControl
} _Sound_Play_Control;

#define PlayForeverNUM 0xFF //播放次数最大，一直播放

#define Trigger_Edge 0	 //跳变沿类//报警触发之后，当播放次数播放完毕之后，不必删除可以再次触发该报警。
#define Trigger_Continue 1 //持续类//报警触发之后，当播放次数播放完毕之后，必须删除报警之后才能再次触发

#define Recover_Disable 0 //不可恢复  //报警触发时如果没有播放该报警，则之后需要重新触发才可再播放
#define Recover_Enable 1  //   1  //可恢复  //高优先级播放完时，该报警再次参加比较，优先级高则播放。

#define Break_Sound_Again 0	//重新播放，从0开始
#define Break_Sound_Continue 1 //继续之前的次数播放

#define Break_Condition_Sound_Again 0
#define Break_Condition_Sound_Continue 1

#define Condition_Sound_Again 0
#define Condition_Sound_Continue 1

//声音报警固定信息结构体
typedef struct
{
	//优先级         //数字小的优先级高   //原则上不能有优先级相等的报警除非报警条件互斥
	INT8U Prio;
	//该报警需要播放时长   //最大播放次数，播放完整一个报警声音的次数
	//需要一直播放时填PlayForeverNUM
	INT8U PlayNumMax;
	//跳变沿类的报警在触发之后策略内会自行删除（待播放完毕之后），外部应用不必删除。
	//需要再次触发报警时直接再次申请即可
	//持续类的，需手动删除报警后方可再次触发
	// 报警触发类型
	INT8U TYPE_Trigger : 1;
	//高优先级在播放，低优先级无法立即播放，待高优先级播放完之后    条件仍存在,
	//或者声音报警播放过程中被打断，高优先级报警播放完毕后，被打断报警触发条件仍存在,
	//是否允许再次触发报警   不可恢复的 需要条件取消后再次触发
	//一般跳边沿触发的在比较优先级失败后不再恢复。持续类的再高优先级消失后可恢复。
	INT8U TYPE_Recover : 1;
	//再次触发报警时是继续之前的报警次数播放，还是从0开始
	//报警取消之后再次触发，那播放次数一定是从0开始
	INT8U Break_AgainOrContinue : 1; //
	//某个报警播放时被打断，且可恢复且是续播//被打断期间有新条件触发，此时是否清零计数变量
	INT8U Break_Condition_AgainOrContinue : 1;
	//当报警正在播放时，又有新的条件触发报警此时
	//是清零播放次数，还是保持计数不变
	//注意当一个条件触发，但播放次数已经达到最大之后又有新的条件触发那么此时一定重新计数
	INT8U Condition_AgainOrContinue : 1;

	INT8U : 3;

} _SoundAlarmAttribute;

extern const _SoundAlarmAttribute SoundAlarmAttribute[SoundAlarm_MAX];
//声音报警相关参数初始化//上30电调用一次即可    //输入最大报警数量
extern void Sound_Scheduler_Init(_SoundAlarm MAX_NUM);
//具体某个声音完成播放完成一次后调用一次
extern void Sound_Play_Once_Done(_SoundAlarm AlarmVoice);
//声音播放受声音调度控制时执行一次  Sound_Play_Control
//声音播放不受声音调度控制时执行一次      Sound_Play_NOTControl     //例如2F时   自检期间
//初始化默认受控
extern void Sound_Play_Switch_Handle(_Sound_Play_Control ON_OFF);
//删除某个报警
extern void Sound_Delete(_SoundAlarm AlarmVoice, _Alarm_Trigger_Enum Voice_Trigger);
//当某个报警声音真正开始播放时调用
extern void Sound_Play_Begin(_SoundAlarm AlarmVoice);
//声音报警请求函数
extern void Sound_Request(_SoundAlarm AlarmVoice, _Alarm_Trigger_Enum Voice_Trigger);
//获取当前应该播放的声音报警索引
extern _SoundAlarm Popup_Get_Current_Sound(void);

#endif
