#ifndef _BLV_BUS_DEV_C5MUSICFUN_H_
#define _BLV_BUS_DEV_C5MUSICFUN_H_

#include "stdint.h"
#include "BLV_485_Protocol.h"
#include "BLV_All_Dev_Init.h"

#define C5MUSICTYPE			0x01		//C5IO设备类型 - 这设备类型只用于BLV_BUS协议通讯使用
#define DEV_C5MUSIC_Type	0x15		//用于设备列表中的设备类型

#define C5MUSIC_REPEATSENDTIMEMAX			0x04  	//本设备重发次数上限
#define C5MUSIC_SEND_WAIT_TIME				0x0020	//C5MUSIC发送等待时间 - 32ms

#define BLV_C5MUSIC_Playback_Status_CMD				0x20		//查询当前播放状态命令
#define BLV_C5MUSIC_Set_Default_Volume_CMD			0x21		//设定音量默认参数命令
#define BLV_C5MUSIC_Specify_Play_CMD				0x22		//指定播放状态命令
#define BLV_C5MUSIC_Set_Volume_CMD					0x23		//设置音量命令
#define BLV_C5MUSIC_Query_Default_Volume_CMD		0x24		//查询默认音量命令
#define BLV_C5MUSIC_Query_Volume_CMD				0x26		//查询音量命令
#define BLV_C5MUSIC_Set_Loop_Mode_CMD				0x29		//设置循环模式命令
#define BLV_C5MUSIC_Query_Loop_Mode_CMD				0x2A		//查询循环模式命令
#define BLV_C5MUSIC_Query_Filenum_CMD				0x2B		//查询文件总数(音乐总数)命令
#define BLV_C5MUSIC_Query_Versions_CMD				0x2C		//查询版本号命令
#define BLV_C5MUSIC_Write_FILEHEAD_CMD				0x2D		//写文件头命令
#define BLV_C5MUSIC_Write_FILEData_CMD				0x2E		//写文件数据命令
#define BLV_C5MUSIC_Read_FILEHEAD_CMD				0x2F		//读文件头命令
#define BLV_C5MUSIC_Read_FILEData_CMD				0x40		//读文件数据命令

#define BLV_C5MUSIC_Playback_Status_Reply			0x30		//查询当前播放状态回复
#define BLV_C5MUSIC_Set_Default_Volume_Reply		0x31		//设定音量默认参数回复
#define BLV_C5MUSIC_Specify_Play_Reply				0x32		//指定播放状态回复
#define BLV_C5MUSIC_Set_Volume_Reply				0x33		//设置音量回复
#define BLV_C5MUSIC_Query_Default_Volume_Reply		0x34		//查询默认音量回复
#define BLV_C5MUSIC_Query_Volume_Reply				0x36		//查询音量回复
#define BLV_C5MUSIC_Set_Loop_Mode_Reply				0x39		//设置循环模式回复
#define BLV_C5MUSIC_Query_Loop_Mode_Reply			0x3A		//查询循环模式回复
#define BLV_C5MUSIC_Query_Filenum_Reply				0x3B		//查询文件总数(音乐总数)回复
#define BLV_C5MUSIC_Query_Versions_Reply			0x3C		//查询版本号回复
#define BLV_C5MUSIC_Write_FILEHEAD_Reply			0x3D		//写文件头回复
#define BLV_C5MUSIC_Write_FILEData_Reply			0x3E		//写文件数据回复
#define BLV_C5MUSIC_Read_FILEHEAD_Reply				0x3F		//读文件头回复
#define BLV_C5MUSIC_Read_FILEData_Reply				0x50		//读文件数据回复

#define C5MUSIC_Control_Num						13			//13种控制
#define C5MUSIC_Set_Default_Volume_Flag			0x0001		//设定音量默认参数控制标志位
#define C5MUSIC_Set_Volume_Flag					0x0002		//设置音量控制标志位
#define C5MUSIC_Set_Loop_Mode_Flag				0x0004		//设置循环模式控制标志位
#define C5MUSIC_Specify_Play_Flag				0x0008		//指定播放状态控制标志位
#define C5MUSIC_Query_Default_Volume_Flag		0x0010		//查询默认音量控制标志位
#define C5MUSIC_Query_Volume_Flag				0x0020		//查询音量控制标志位
#define C5MUSIC_Query_Loop_Mode_Flag			0x0040		//查询循环模式控制标志位
#define C5MUSIC_Query_Filenum_Flag				0x0080		//查询文件总数(音乐总数)控制标志位
#define C5MUSIC_Query_Versions_Flag				0x0100		//查询版本号控制标志位
#define C5MUSIC_Write_FILEHEAD_Flag				0x0200		//写文件头控制标志位
#define C5MUSIC_Write_FILEData_Flag				0x0400		//写文件数据控制标志位
#define C5MUSIC_Read_FILEHEAD_Flag				0x0800		//读文件头控制标志位
#define C5MUSIC_Read_FILEData_Flag				0x1000		//读文件数据回复标志位
                                                
#define BLV_C5MUSIC_Relay_SUCC					0xE0	//无错误
#define BLV_C5MUSIC_Relay_Check_Error			0xE1	//CRC校验错误
#define BLV_C5MUSIC_Relay_CMD_Error				0xE2	//命令错误
#define BLV_C5MUSIC_Relay_Para_Error			0xE3	//参数错误
#define BLV_C5MUSIC_Relay_Other_Error			0xE4	//其他错误

#define BLV_C5MUSIC_Music_Dir			0x00	//音乐文件夹
#define BLV_C5MUSIC_Warning_Dir			0x01	//提示音文件夹
#define BLV_C5MUSIC_Helpsleep_Dir		0x02	//助眠文件夹
#define BLV_C5MUSIC_Doorbell_Dir		0x03	//门铃文件夹
#define BLV_C5MUSIC_Greet_Dir			0x04	//欢迎词文件夹
#define BLV_C5MUSIC_Helpsleep1_Dir		0x05	//助眠文件_1_冥想
#define BLV_C5MUSIC_Helpsleep2_Dir		0x06	//助眠文件_2_海浪
#define BLV_C5MUSIC_Helpsleep3_Dir		0x07	//助眠文件_3_森林


#define BLV_C5MUSIC_Full_Loop			0x00	//全部循环
#define BLV_C5MUSIC_Single_Cycle		0x01	//单曲循环
#define BLV_C5MUSIC_Folder_Loop			0x02	//文件夹循环
#define BLV_C5MUSIC_Random_Cycle		0x03	//随机循环
#define BLV_C5MUSIC_Order_CyCle			0x05	//顺序循环

#define BLV_C5MUSIC_Playing				0x00	//播放状态
#define BLV_C5MUSIC_Halted				0x01	//暂停状态
#define BLV_C5MUSIC_Stopped				0x02	//停止状态
#define BLV_C5MUSIC_Next_Song			0x03	//下一曲
#define BLV_C5MUSIC_Prev_Song			0x04	//上一曲
#define BLV_C5MUSIC_Fast_Forward		0x05	//快进
#define BLV_C5MUSIC_Rewind				0x06	//快退
#define BLV_C5MUSIC_Single_Play			0x07	//单曲播放
#define BLV_C5MUSIC_Forestall			0x08	//抢先播放

#define BLV_C5MUSIC_Volume_MAX			30		//最大音量
#define BLV_C5MUSIC_Volume_MIN			0
#define BLV_C5MUSIC_Default_Volume		25		//默认音量
#define BLV_C5MUSIC_HelpSleep_Start_Volume	10	//助眠起始音量

/*背景音乐宏定义开始*/
//#define MUSICCTRLSTATECONVER(data) (*(uint16_t *)&data)  //实际u16的值
#define MUSICLOOPMAX     0x05   //每个背景音乐最多回路数
#define CtrlDirectOpen    0x01   //开
#define CtrlDirectClose   0x02   //关

typedef struct{
	
	uint8_t CtrlDirect;   //控制方向   配置工具:0x00功能 0x01开机 0x02关机 0x03开播放 0x04关播放
	uint8_t CtrlDir;      //控制目录   当CtrlDirect为0x03时  CtrlDir表示文件夹  CtrlCont表示序号  当CtrlDirect为0x00时  CtrlDir为1表示播放 CtrlDir为2表示暂停

}__attribute__ ((__packed__))DEV_MUSIC_CTRLWAY;  //控制方式  如果当成1个字节处理，就是开关机

typedef struct{
	uint8_t CtrlMode;   //控制模式
	uint8_t CtrlVoice;  //控制音量
}__attribute__ ((__packed__))DEV_MUSIC_CTRLCONT;  //控制内容

typedef struct{
	DEV_MUSIC_CTRLWAY DevMusicCtrlWay;   //控制方式
	DEV_MUSIC_CTRLCONT CtrlCont;         //控制内容  
}__attribute__ ((__packed__))DEV_MUSIC_CTRLSTATE;   //输出控制
/*背景音乐宏定义结束*/

typedef struct{
	BLV_COMM_RECORD_G comm_record;						//通讯记录
	
	uint8_t 	DevSendCnt;					//设备发送计数   计数达到重发次数都没有回复，判为离线
	uint8_t 	DevOffline;       			//设备离线标志 1，设备离线   0，设备在线
	uint8_t		DevOfflineLast;				//上一次离线标志 1，设备离线   0，设备在线
	uint8_t 	DevSendSN;					//发送SN号
	
	uint8_t 	now_playback_status_num;	//播放状态改变计数 - 连续读取状态超过一定次数才赋值状态
	uint8_t 	now_playback_type;			//当前播放类型 - 0x01:房间音乐、0x02:洗手间音乐、0x03:房间和洗手、0x04:门铃、0x05播放欢迎词
	uint8_t 	now_playback_status;		//当前播放状态 - 播放，未播放
	uint8_t 	last_playback_status;		
	uint8_t 	now_playback_volume;		//当前播放音量
	uint8_t 	last_playback_volume;
	uint8_t   	now_mute_status;			//当前静音状态
	uint8_t 	now_global_volume;			//当前全局百分比音量
	uint8_t 	now_music_volume;			//当前音乐音量
	uint8_t 	now_tone_volume;			//当前提示音音量
	uint8_t 	now_door_volume;			//当前门铃音量
	uint8_t     now_helpsleep_volume;       //当前助眠音乐音量    2022-12-16
	uint8_t 	now_playback_mode;			//当前播放模式 - 0x00:全部循环播放、0x01:单曲循环、0x02:文件夹循环、0x03:随机播放、0x05:顺序播放
	uint8_t 	now_playback_dir;			//当前播放文件夹
	uint8_t 	last_playback_dir;			
	uint16_t 	now_playback_idx;			//当前播放序号
	uint16_t 	last_playback_idx;			
	
	uint8_t 	assign_dir;					//0x00:音乐文件夹 0x01:提示音文件夹 0x02:助眠文件夹 0x03:门铃文件夹 0x04:欢迎词文件夹
	uint16_t 	assign_playback_path;		//指定播放路劲
	uint16_t 	assign_playback_idx;		//指定播放文件名
	
	uint8_t		adjust_volume_type;			//调节音量类型	0x01:绝对调节 0x02:相对调节
	uint8_t 	adjust_volume_operate;		//调节相对音量操作：0x01 - 音量减一、0x02 - 音量加一
	uint8_t 	adjust_volume_loop;			//调节音量回路
	uint8_t 	set_playback_volume;		//设置音量
	uint8_t 	set_music_volume;				//设置音乐音量
	uint8_t 	set_tone_volume;				//设置提示音音量
	uint8_t 	set_door_volume;				//设置门铃音量
	uint8_t     set_helpsleep_volume;
	uint8_t 	set_global_volume;			//设置全局百分比音量
	uint16_t 	fade_time;					//渐变时间 - 单位：100ms
	uint16_t 	helpsleep_time;				//助眠时间 - 单位：1S
	uint32_t 	helpsleep_tick;				//助眠时间搓
	
	uint8_t 	playback_type;				//播放类型 - 0x01:房间音乐、0x02:洗手间音乐、0x03:房间和洗手、0x04:门铃、0x05播放欢迎词
	uint8_t 	playback_fun;				//播放功能 - 0x00:播放、0x01:暂停、0x02:停止、0x03:下一首、0x04:上一首、0x05:快进、0x06:快退、0x07:单曲播放
	uint8_t 	playback_mode;				//播放模式 - 0x00:全部循环播放、0x01:单曲循环、0x02:文件夹循环、0x03:随机播放、0x05:顺序播放
	uint8_t 	quiet_mode;					//静音模式 - 0x00:不开启，0x01:开启静音
	uint8_t 	set_quiet_status;			//设置静音状态 - 0x00:开启静音，0x01:关闭静音
	uint8_t 	quite_flag;					//静音控制反馈灯标志位
	uint8_t 	global_volume;				//全局百分比音量
	uint8_t 	default_volume;				//默认音量
	uint8_t 	helpsleep_volume;			//助眠音量
	uint8_t 	playback_volume_max;		//播放最大音量
	uint8_t 	playback_volume_min;		//播放最小音量

/*背景音乐状态定义开始*/
	DEV_MUSIC_CTRLSTATE BackMusicState[MUSICLOOPMAX];      //背景音乐当前状态
	DEV_MUSIC_CTRLSTATE BackMusicStateLast[MUSICLOOPMAX];      //背景音乐上一个状态
	
/*背景音乐状态定义结束*/

	uint16_t 	file_block;					//文件当前块号
	uint16_t 	file_block_num;				//文件总块数
	uint16_t 	file_size;					//文件大小
	uint32_t 	file_start_addr;			//文件起始地址
	uint32_t 	file_end_addr;				//文件结束地址
	
	uint16_t 	playback_num;				//播放总数
	uint16_t 	dev_versions;				//设备版本号
	uint32_t 	control_flag;				//控制标志位
	
	uint32_t 	inquire_tick;		//询问时间戳
}__attribute__ ((__packed__)) BUS_C5MUSIC_INFO;


void BLV_BUS_C5MUSIC_For_Logic_Init(LOGICFILE_DEVICE_INFO *dev_info,uint8_t *data,uint16_t data_len);
uint8_t BLV_BUS_C5MUSIC_Cycle_Call(uint32_t dev_addr);
uint8_t BLV_BUS_C5MUSIC_Data_Processing(uint32_t dev_addr,uint32_t data_addr,uint16_t len);
void BUS_C5MUSIC_Playback_Status_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);
void BUS_C5MUSIC_Set_Default_Volume_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);
void BUS_C5MUSIC_Specify_Play_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);
void BUS_C5MUSIC_Set_Volume_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);
void BUS_C5MUSIC_Query_Default_Volume_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);
void BUS_C5MUSIC_Query_Volume_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);
void BUS_C5MUSIC_Set_Loop_Mode_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);
void BUS_C5MUSIC_Query_Loop_Mode_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);
void BUS_C5MUSIC_Query_Filenum_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);
void BUS_C5MUSIC_Query_Versions_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);
void BUS_C5MUSIC_Write_FILEHEAD_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);
void BUS_C5MUSIC_Write_FILEData_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);
void BUS_C5MUSIC_Read_FILEHEAD_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);
void BUS_C5MUSIC_Read_FILEData_Datasend(uint32_t dev_addr,BUS_C5MUSIC_INFO *Dev_Info);

//void BUS_C5MUSIC_Test(void);

void BUS_C5MUSIC_Set_Playback_Mode(uint32_t devaddr,uint8_t playback_mode);
void BUS_C5MUSIC_Playback(uint32_t devaddr,uint8_t play_dir,uint8_t playback,uint8_t play_id);
void BUS_C5MUSIC_Doorbell_Dir(uint32_t devaddr,uint8_t id);
void BUS_C5MUSIC_Warning_Dir(uint32_t devaddr,uint8_t id,uint8_t start);
void BUS_C5MUSIC_Greet_Dir(uint32_t devaddr,uint8_t id,uint8_t start);
void BUS_C5MUSIC_Helpsleep_Dir(uint32_t devaddr,uint8_t dir,uint8_t id);

void BUS_C5MUSIC_Stop_Playback(uint32_t devaddr);    //停止播放（不论当前处于那个文件夹）
void BUS_C5MUSIC_Play_Playback(uint32_t devaddr);    //播放音乐
void BUS_C5MUSIC_Pause_Playback(uint32_t devaddr);    //暂停播放（驱动只支持音乐暂停）
void BUS_C5MUSIC_Playback_Next(uint32_t devaddr, uint8_t dir);  //播放下一曲（支持音乐和助眠，必须处于助眠文件夹，助眠下一曲才能生效）
void BUS_C5MUSIC_Playback_Prev(uint32_t devaddr, uint8_t dir);  //播放上一曲（支持音乐和助眠，必须处于助眠文件夹，助眠下一曲才能生效）
	
void BUS_C5MUSIC_Relative_Volume_Plus(uint32_t devaddr);
void BUS_C5MUSIC_Relative_Volume_Subtraction(uint32_t devaddr);

void BUS_C5MUSIC_Relative_Volume_PlusValue(uint32_t devaddr, uint8_t value);
void BUS_C5MUSIC_Relative_Volume_SubtractionValue(uint32_t devaddr, uint8_t value);

void BUS_C5MUSIC_Set_Quiet_Mode(uint32_t devaddr);
void BUS_C5MUSIC_Set_Global_Volume(uint32_t devaddr,uint8_t vel);
void BUS_C5MUSIC_Set_Quiet_Mode2(uint32_t devaddr,uint8_t status);
void BUS_C5MUSIC_Set_LoopVolume(uint32_t devaddr,uint8_t loop,uint8_t vel);
void BUS_C5MUSIC_Set_LoopVolume_2(uint32_t devaddr,uint8_t loop,uint8_t vel);
uint8_t Get_BUS_C5MUSIC_Loop_Volume(uint32_t devaddr,uint8_t loop);
uint8_t Get_BUS_C5MUSIC_Online_Status(uint32_t devaddr);

void BUS_C5MUSIC_Helpsleep_Dir_Just(uint32_t devaddr,uint8_t dir,uint8_t id);

void BLV_Music_CtrlState_Get(DEV_MUSIC_CTRLSTATE *music_state,uint16_t Output_state );
void Logic_Music_Ctrl(uint32_t DevAddrIn, uint16_t DevInputLoop, uint32_t DevAddrOut, uint16_t DevOutputLoop, uint16_t DevOutputType);    //2025.07.10  从本地修改为全局


extern uint8_t sd_log_flag;

#endif
