/**
  ******************************************************************************
  * @file    BLV_485_Dev_HuaErSiFun.c
  * @author  BLW RCU  development Team	林开锐
  * @version V1.0.0
  * @date    2022年10月13日
  * @brief   华尔思背景音乐驱动
	*          参考华尔思背景音乐3.0协议
	注意：C5音乐和485音乐用的是同一个设备类型，在逻辑配置中不能同时存在
  ******************************************************************************
  */

#include "includes.h"

#include "BLV_485_Dev_HuaErSiFun.h"

/***局部宏定义开始***/
#define HUAERSI_MAX_SEND_CNT			0x03	//华尔思音乐设备最大重发次数
#define HUAERSI_READ_TIME				5000	//华尔思读取地址轮询时间间隔
#define HUAERSI_ADDR_CORRECT			0x00	//华尔思音乐设备地址正确
#define HUAERSI_ADDR_READ				0x01	//华尔思音乐设备读地址
#define HUAERSI_ADDR_WRITE				0x02	//华尔思音乐设备写地址
#define HUAERSI_DEFAULT_VOLUME			0x08	//华尔思音乐设备默认音量
#define HUAERSI_COMMAND_FLAG			0x04	//华尔思音乐设备电源控制标记位
#define HUAERSI_RECEIVE_MAX_DATA_LEN	262		//华尔思音乐设备最大数据长度
/***局部宏定义结束***/

/*******************************************************************************
  * @brief      添加设备到链表 - 轮询设备
  * @param  
  *		BUS_Public		设备共有数据结构体
  *		Rs485Music		485音乐私有数据结构体
  * @retval     None
  * @attention	None
*******************************************************************************/
void HuaErSi_RS485_Music_Data_Init(Device_Public_Information_G *BUS_Public, RS485_MUSIC_INFO *Rs485Music)
{
	Rs485Music->huaersi_addr_command = HUAERSI_ADDR_READ;	//置华尔思地址读取
	#if LOGIC_FILE_EN
	Rs485Music->DevMusicCtrlState[Rs485Music->MusicLoopValidNum-1].CtrlCont.CtrlMode = HUAERSI_DEFAULT_VOLUME;	//华尔思音乐当前通道默认音量8
	#else
	Rs485Music->DevMusicCtrlState[Rs485Music->MusicLoopValidNum-1].CtrlCont.CtrlVoice = HUAERSI_DEFAULT_VOLUME;	//华尔思音乐当前通道默认音量8
	#endif
	Rs485Music->MusicStateCtrlFlag[Rs485Music->MusicLoopValidNum-1].MusicReadFlagVar = 0x01;	//华尔思音乐上电设置指定音量
	Rs485Music->MusicStateCtrlCnt[Rs485Music->MusicLoopValidNum-1].MusicReadFlagVar = HUAERSI_MAX_SEND_CNT;	//华尔思音乐上电设置指定音量最大重发次数
	Rs485Music->huaersi_onoff_control[Rs485Music->MusicLoopValidNum-1] = HUAERSI_COMMAND_FLAG | HUAERSI_MAX_SEND_CNT;	//开关机发送标志置1、开关机发送次数3次
	Rs485Music->huaersi_onoff[Rs485Music->MusicLoopValidNum-1] = CFG_Dev_CtrlWay_Is_Close;	//默认关机
	#if LOGIC_FILE_EN
	Rs485Music->DevMusicCtrlState[Rs485Music->MusicLoopValidNum-1].DevMusicCtrlWay.CtrlDir = MUSIC_STOP;	//华尔思上电暂停音乐
	#else
	Rs485Music->DevMusicCtrlState[Rs485Music->MusicLoopValidNum-1].CtrlCont.CtrlMode = MUSIC_STOP;	//华尔思上电暂停音乐
	#endif
	Rs485Music->MusicStateCtrlFlag[Rs485Music->MusicLoopValidNum-1].MusicModeCtrlVar = 0x01;	//发送背景音乐控制
	Rs485Music->MusicStateCtrlCnt[Rs485Music->MusicLoopValidNum-1].MusicModeCtrlVar = 0x03;	//发送背景音乐控制次数
	
	BUS_Public->polling_cf = (uint32_t)&HuaErSi_Music_Polling_Ctrl;	//华尔思音乐轮询控制函数（用于发送命令控制）
	BUS_Public->processing_cf = (uint32_t)&HuaErSi_Music_Data_Processing;	//华尔思音乐接收处理函数
	
	Dbg_Print(DBG_BIT_LOGIC_STATUS_bit,"添加华尔思音乐设备");
}

/*******************************************************************************
  * @brief      华尔思音乐轮询控制函数（用于发送命令控制，根据BUS_Public.wait_time的时间运行程序）
  * @param  
  *		dev_addr		设备信息地址
  * @retval     send_time：RS485OCCUPYNOTIME——485发送函数不会占用时间   RS485OCCUPYTIME——485发送函数会占用时间
  * @attention	None
*******************************************************************************/
uint8_t HuaErSi_Music_Polling_Ctrl(uint32_t dev_addr)
{
	uint8_t i, flag = 0, send_time = RS485OCCUPYNOTIME;	//遍历设备回路，发送步骤，发送时间（默认发送不占用时间）
	Device_Public_Information_G BUS_Public;	//声明共有数据结构体
	RS485_MUSIC_INFO Rs485MusicInfo;	//声明音乐私有数据结构体
	
	SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G), dev_addr);	//读取音乐设备的共有数据
	SRAM_DMA_Read_Buff((uint8_t *)&Rs485MusicInfo, sizeof(RS485_MUSIC_INFO), dev_addr+Dev_Privately);	//读取音乐设备的私有数据
	if(SysTick_1ms >= Rs485MusicInfo.huaersi_read_addr_time)	//超过时间
	{
		Rs485MusicInfo.huaersi_read_addr_time = SysTick_1ms + HUAERSI_READ_TIME;	//下一次读取时间
		switch(Rs485MusicInfo.huaersi_addr_command)	//华尔思地址命令
		{
			case HUAERSI_ADDR_READ:	//华尔思音乐设备读地址
				HuaErSi_Background_Read_Addr(&BUS_Public, &Rs485MusicInfo);	//华尔思音乐地址读取函数
				send_time = RS485OCCUPYTIME;	//发送占用时间
				break;
			case HUAERSI_ADDR_WRITE:	//华尔思音乐设备写地址
				HuaErSi_Background_Set_Addr(&BUS_Public, &Rs485MusicInfo);	//华尔思音乐地址设置函数
				send_time = RS485OCCUPYTIME;	//发送占用时间
				break;
		}
	}
	for(i = 0; i < Rs485MusicInfo.MusicLoopValidNum; i++)	//遍历所有通道
	{
		if(Rs485MusicInfo.huaersi_onoff[i] != Rs485MusicInfo.huaersi_onoff_last[i])	//当前开关机状态和上一次开关机状态不一样
		{
			Rs485MusicInfo.huaersi_onoff_last[i] = Rs485MusicInfo.huaersi_onoff[i];	//保存上一次开关机状态
			Rs485MusicInfo.huaersi_onoff_control[i] = HUAERSI_COMMAND_FLAG | HUAERSI_MAX_SEND_CNT;	//开关机发送标志置1、开关机发送次数3次
		}
		/***没有音量读取命令，只有设置了音量大小才能得到音量大小***/
		if(Rs485MusicInfo.MusicStateCtrlFlag[i].MusicReadFlagVar == 0x01)	//上电初始化指定音量设置为1
		{
			if(Rs485MusicInfo.MusicStateCtrlCnt[i].MusicReadFlagVar != 0x00)	//指定音量发送次数不为0
			{
				Rs485MusicInfo.MusicStateCtrlCnt[i].MusicReadFlagVar--;	//指定音量发送次数减少
			}
			else
			{
				Rs485MusicInfo.MusicStateCtrlFlag[i].MusicReadFlagVar = 0x00;	//上电初始化指定音量设置清0
			}
			Rs485MusicInfo.MusicChannelNo = i;	//当前通道号赋值
			HuaErSi_Background_Specifies_Volume_Control(&BUS_Public, &Rs485MusicInfo, i);	//华尔思音乐背景音乐指定音量控制函数（只用于上电初始化）
			send_time = RS485OCCUPYTIME;	//发送占用时间
			break;	//跳出循环
		}
		else if((((Rs485MusicInfo.huaersi_onoff_control[i]) & HUAERSI_COMMAND_FLAG) >> 2) == 1)	//开关机发送标志置1
		{
			if(((Rs485MusicInfo.huaersi_onoff_control[i]) & HUAERSI_MAX_SEND_CNT) != 0)	//开关机发送次数不为0
			{
				Rs485MusicInfo.huaersi_onoff_control[i]--;	//开关机发送次数减少
			}
			if(((Rs485MusicInfo.huaersi_onoff_control[i]) & HUAERSI_MAX_SEND_CNT) == 0)	//开关机发送次数不为0
			{
				Rs485MusicInfo.huaersi_onoff_control[i] &= ~(HUAERSI_COMMAND_FLAG);	//开关机发送标志清0
			}
			Rs485MusicInfo.MusicChannelNo = i;	//当前通道号赋值
			HuaErSi_Background_Power_Control(&BUS_Public, &Rs485MusicInfo, i);	//华尔思音乐电源控制函数
			send_time = RS485OCCUPYTIME;	//发送占用时间
			break;	//跳出循环
		}
		if(Rs485MusicInfo.MusicStateCtrlFlag[i].MusicModeCtrlVar == 0x01)	//背景音乐模式控制标志置1（打开）
		{
			if(Rs485MusicInfo.MusicStateCtrlCnt[i].MusicModeCtrlVar != 0x00)	//背景音乐模式控制发送次数不为0
			{
				Rs485MusicInfo.MusicStateCtrlCnt[i].MusicModeCtrlVar--;	//背景音乐模式控制发送次数减少
			}
			else
			{
				Rs485MusicInfo.MusicStateCtrlFlag[i].MusicModeCtrlVar = 0x00;	//背景音乐模式控制标志置0（关闭）
			}
			Rs485MusicInfo.MusicChannelNo = i;	//当前通道号赋值
			HuaErSi_Background_Music_Control(&BUS_Public, &Rs485MusicInfo, i);	//华尔思音乐背景音乐控制函数
			send_time = RS485OCCUPYTIME;	//发送占用时间
			break;	//跳出循环
		}
		else if(Rs485MusicInfo.MusicStateCtrlFlag[i].MusicVoiceCtrlVar == 0x01)	//背景音乐音量控制标志置1（打开）
		{
			if(Rs485MusicInfo.MusicStateCtrlCnt[i].MusicVoiceCtrlVar != 0x00)	//背景音乐音量控制发送次数不为0
			{
				Rs485MusicInfo.MusicStateCtrlCnt[i].MusicVoiceCtrlVar--;	//背景音乐音量控制发送次数减少
			}
			else
			{
				Rs485MusicInfo.MusicStateCtrlFlag[i].MusicVoiceCtrlVar = 0x00;	//背景音乐音量控制标志置0（关闭）
			}
			Rs485MusicInfo.MusicChannelNo = i;	//当前通道号赋值
			HuaErSi_Background_Volume_Control(&BUS_Public, &Rs485MusicInfo, i);	//华尔思音乐背景音乐音量控制函数
			send_time = RS485OCCUPYTIME;	//发送占用时间
			break;	//跳出循环
		}
		else if((((Rs485MusicInfo.huaersi_track_control[i]) & HUAERSI_COMMAND_FLAG) >> 2) == 1)	//声道发送标志置1（打开）
		{
			if(((Rs485MusicInfo.huaersi_track_control[i]) & HUAERSI_MAX_SEND_CNT) != 0)	//声道发送次数不为0
			{
				Rs485MusicInfo.huaersi_track_control[i]--;	//开关机发送次数减少
			}
			if(((Rs485MusicInfo.huaersi_track_control[i]) & HUAERSI_MAX_SEND_CNT) == 0)	//声道发送次数不为0
			{
				Rs485MusicInfo.huaersi_track_control[i] &= ~(HUAERSI_COMMAND_FLAG);	//声道发送标志清0
			}
			Rs485MusicInfo.MusicChannelNo = i;	//当前通道号赋值
			HuaErSi_Background_Track_Control(&BUS_Public, &Rs485MusicInfo, i);	//华尔思音乐左右声道控制函数
			send_time = RS485OCCUPYTIME;	//发送占用时间
			break;	//跳出循环
		}
	}
	if(send_time == RS485OCCUPYTIME)	//如果发送占用时间
	{
		flag = 1;	//进入下一步
		if(Rs485MusicInfo.DevSendCnt > HUAERSI_MAX_SEND_CNT)	//发送次数大于重发次数
		{
			if(Rs485MusicInfo.DevOffline != DEV_IS_OFFLINE)	//设备当前不是离线
			{
				Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"HuaErSi Music DEV_IS_OFFLINE");
				LOG_Device_Online_Record(DEV_RS485_MUSIC, BUS_Public.addr, LogInfo_Device_Offline);	//记录设备离线
			}
			Rs485MusicInfo.DevOffline = DEV_IS_OFFLINE;	//设备离线
			if(Rs485MusicInfo.DevOffline != Rs485MusicInfo.DevOfflineLast)	//当前在线状态不等于上一次在线状态
			{
				Rs485MusicInfo.DevOfflineLast = Rs485MusicInfo.DevOffline;	//更新上一次在线状态
				Write_Device_Fault_State(BUS_Public.type,BUS_Public.addr,In_ErrFun_LineState,DEV_IS_OFFLINE);	//保存设备在线状态到SRAM
			}
		}
		else	//发送次数小于等于重发
		{
			Rs485MusicInfo.DevSendCnt++;	//发送次数增加
		}
		/*通讯统计*/
		BLV_Communication_Record(&Rs485MusicInfo.comm_record, 0x01, 0x00);
		Rs485MusicInfo.inquire_tick = SysTick_1ms;
	}
	if(flag == 1)
	{
		BUS_Public.check = 0x00;	//检验清0
		BUS_Public.check = DoubleData_CheckSum((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G), (uint8_t *)&Rs485MusicInfo, sizeof(RS485_MUSIC_INFO));	//计算校验
		SRAM_DMA_Write_Buff((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G), dev_addr);	//保存共有数据
		SRAM_DMA_Write_Buff((uint8_t *)&Rs485MusicInfo, sizeof(RS485_MUSIC_INFO), dev_addr+Dev_Privately);	//保存音乐私有数据
	}
	return send_time;
}

/*******************************************************************************
  * @brief      华尔思音乐接收处理函数
  * @param  
  *		dev_addr		设备信息地址
  *		data_addr		485数据包地址
  *		DataLen			数据包长度
  * @retval     0-是华尔思音乐数据，1-不是华尔思音乐数据
  * @attention	上下一曲，回复是歌名，由于没有命令接收无法区分
  *  头  地址  Len  内容 内容 内容 内容 SOR  尾
  *  FC   00   00   03   03   00   00   06   FE
*******************************************************************************/
uint8_t HuaErSi_Music_Data_Processing(uint32_t dev_addr, uint32_t data_addr, uint16_t len)
{
	uint8_t rec = 1, data[HUAERSI_RECEIVE_MAX_DATA_LEN];	//返回值，接收的数据中间变量
	Device_Public_Information_G BUS_Public;	//声明共有数据结构体
	RS485_MUSIC_INFO Rs485MusicInfo;	//声明音乐私有数据结构体
	
	SRAM_DMA_Read_Buff(data, len, data_addr);	//读取音乐设备的485数据
	SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G), dev_addr);	//读取音乐设备的共有数据
	if((data[0] != 0xFC) || ((data[3]+0x06) != len) || (data[len-1] != 0xFE))
	{
		return rec;
	}
	if(data[len-2] == (SOR_CRC(&data[1], len-3)))
	{
		rec = 0;
		SRAM_DMA_Read_Buff((uint8_t *)&Rs485MusicInfo, sizeof(RS485_MUSIC_INFO), dev_addr+Dev_Privately);	//读取音乐设备的私有数据
		if(Rs485MusicInfo.DevOffline != DEV_IS_ONLINE)
		{
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"Rs485Music DEV_IS_ONLINE");
			LOG_Device_Online_Record(DEV_RS485_MUSIC, BUS_Public.addr, LogInfo_Device_Online);	//记录设备在线
		}
		Rs485MusicInfo.DevSendCnt = 0x00;
		Rs485MusicInfo.DevOffline = DEV_IS_ONLINE;	//设备在线
		if(Rs485MusicInfo.DevOffline != Rs485MusicInfo.DevOfflineLast)	//当前在线状态不等于上一次在线状态
		{
			Rs485MusicInfo.DevOfflineLast = Rs485MusicInfo.DevOffline;	//更新上一次在线状态
			Write_Device_Fault_State(BUS_Public.type,BUS_Public.addr,In_ErrFun_LineState,DEV_IS_ONLINE);	//保存设备在线状态到SRAM
		}
		BLV_Communication_Record(&Rs485MusicInfo.comm_record, 0x02, 0x01);
		switch(data[3])
		{
			case 0x01:
			case 0x02:
			case 0x03:
			case 0x04:
			case 0x05:
				switch(data[4])
				{
					case 0x69:	//读取地址回复
						if(data[6] == 0x00 || data[6] == 0x01)	//只针对0、1地址
						{
							Rs485MusicInfo.huaersi_addr = data[6];	//得到实际的华尔思音乐设备地址
							Rs485MusicInfo.huaersi_addr_command = HUAERSI_ADDR_WRITE;	//设置华尔思音乐设备写地址
						}
						if(data[6] == BUS_Public.addr && data[6] < 0x02)	//如果华尔思音乐设备地址和逻辑地址一样
						{
							Rs485MusicInfo.huaersi_addr_command = HUAERSI_ADDR_CORRECT;	//华尔思音乐设备地址正确
						}
						break;
					case 0x04:	//设置地址回复（先读取再设置地址才会回复）
						Rs485MusicInfo.huaersi_addr_command = HUAERSI_ADDR_READ;	//设置华尔思音乐设备读地址
						break;
					case 0x12:	//设置音量回复
						Rs485MusicInfo.MusicStateCtrlFlag[Rs485MusicInfo.MusicChannelNo].MusicReadFlagVar = 0x00;	//上电初始化指定音量设置清0
						break;
					case 0x10:	//播放欢迎词回复
						Rs485MusicInfo.MusicStateCtrlFlag[Rs485MusicInfo.MusicChannelNo].MusicModeCtrlVar = 0x00;	//背景音乐模式控制标志置0
						break;
					case 0x03:	//背景音乐常用控制回复（播放、暂停、音量加减、开关机）
						switch(data[5])
						{
							case 0x00:	//开机成功
							case 0x01:	//关机成功
								Rs485MusicInfo.huaersi_onoff_control[Rs485MusicInfo.MusicChannelNo] &= ~(HUAERSI_COMMAND_FLAG);	//开关机发送标志清0
								break;
							case 0x02:	//播放回复
							case 0x03:	//暂停回复
								Rs485MusicInfo.MusicStateCtrlFlag[Rs485MusicInfo.MusicChannelNo].MusicModeCtrlVar = 0x00;	//背景音乐模式控制标志置0
								break;
							case 0x06:	//音量减回复
							case 0x07:	//音量加回复
								Rs485MusicInfo.MusicStateCtrlFlag[Rs485MusicInfo.MusicChannelNo].MusicVoiceCtrlVar = 0x00;	//背景音乐音量控制标志置0
								break;
							default:break;
						}
						break;
					case 0x89:	//指定播放回复
						Rs485MusicInfo.MusicStateCtrlFlag[Rs485MusicInfo.MusicChannelNo].MusicModeCtrlVar = 0x00;	//背景音乐模式控制标志置0
						break;
					case 0x28:	//声道控制回复
						Rs485MusicInfo.huaersi_track_control[Rs485MusicInfo.MusicChannelNo] &= ~(HUAERSI_COMMAND_FLAG);	//开关机发送标志清0
						break;
					default:break;
				}
				break;
			default:	//默认上下一曲的歌名回复
				Rs485MusicInfo.MusicStateCtrlFlag[Rs485MusicInfo.MusicChannelNo].MusicModeCtrlVar = 0x00;	//背景音乐模式控制标志置0
				break;
		}
		BUS_Public.check = 0x00;	//校验置0
		BUS_Public.check = DoubleData_CheckSum((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G), (uint8_t *)&Rs485MusicInfo, 
												sizeof(RS485_MUSIC_INFO));	//计算校验值
		SRAM_DMA_Write_Buff((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G),dev_addr);	//将共有数据保存
		SRAM_DMA_Write_Buff((uint8_t *)&Rs485MusicInfo,sizeof(RS485_MUSIC_INFO),dev_addr+Dev_Privately);	//将私有数据保存
	}
	
	return rec;
}

/*******************************************************************************
  * @brief      华尔思音乐地址读取函数（定时查询）
  * @param  
  *		BUS_Public		设备共有数据结构体
  *		Rs485Music		485音乐私有数据结构体
  *		DevOutputLoop	当前输出回路数
  * @retval     None
  * @attention	None
*******************************************************************************/
void HuaErSi_Background_Read_Addr(Device_Public_Information_G *BUS_Public, RS485_MUSIC_INFO* Rs485MusicInfo)
{
	/***数据包长度为命令+参数的长度***/
					 //头      默认    地址    长度    命令    校验    尾
	uint8_t data[7] = {0xFA,   0x00,   0x00,   0x01,   0x68,   0x69,   0xFE};	//要发送的数据
	
	MCU485_SendString(BUS_Public->port, data, 7);	//485发送数据
	Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"华尔思音乐地址读取数据");
}

/*******************************************************************************
  * @brief      华尔思音乐地址设置函数（定时设置）
  * @param  
  *		BUS_Public		设备共有数据结构体
  *		Rs485Music		485音乐私有数据结构体
  *		DevOutputLoop	当前输出回路数
  * @retval     None
  * @attention	None
*******************************************************************************/
void HuaErSi_Background_Set_Addr(Device_Public_Information_G *BUS_Public, RS485_MUSIC_INFO *Rs485MusicInfo)
{
	/***数据包长度为命令+参数的长度***/
					 //头      默认    地址    长度    命令    参数1   参数2   校验    尾
	uint8_t data[9] = {0xFA,   0x00,   0x00,   0x03,   0x03,   0x00,   0x00,   0x00,   0xFE};	//要发送的数据
	
	data[2] = Rs485MusicInfo->huaersi_addr;	//用读取到的地址进行通讯
	data[6] = 0x02;	//设备地址赋值
//	data[6] = BUS_Public->addr;	//设备地址赋值
	data[7] = SOR_CRC(&data[1], 6);	//数据校验
	MCU485_SendString(BUS_Public->port, data, 9);	//485发送数据
	Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"华尔思音乐地址设置数据");
}

/*******************************************************************************
  * @brief      华尔思音乐背景音乐指定音量控制函数
  * @param  
  *		BUS_Public		设备共有数据结构体
  *		Rs485Music		485音乐私有数据结构体
  *		DevOutputLoop	当前输出回路数
  * @retval     None
  * @attention	None
*******************************************************************************/
void HuaErSi_Background_Specifies_Volume_Control(Device_Public_Information_G *BUS_Public, RS485_MUSIC_INFO *Rs485MusicInfo, uint16_t DevOutputLoop)
{
	/***数据包长度为命令+参数的长度***/
					 //头      默认    地址    长度    命令    参数    校验    尾
	uint8_t data[8] = {0xFA,   0x00,   0x00,   0x02,   0x11,   0x00,   0x00,   0xFE};	//要发送的数据
	
	data[2] = BUS_Public->addr;	//设备地址赋值
	
	#if LOGIC_FILE_EN
	data[5] = Rs485MusicInfo->DevMusicCtrlState[DevOutputLoop].CtrlCont.CtrlMode;	//默认音量8
	#else
	data[5] = Rs485MusicInfo->DevMusicCtrlState[DevOutputLoop].CtrlCont.CtrlVoice;	//默认音量8
	#endif
	data[6] = SOR_CRC(&data[1], 5);	//数据校验
	MCU485_SendString(BUS_Public->port, data, 8);	//485发送数据
	Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的指定音量控制数据");
}

/*******************************************************************************
  * @brief      华尔思音乐电源控制函数
  * @param  
  *		BUS_Public		设备共有数据结构体
  *		Rs485Music		485音乐私有数据结构体
  *		DevOutputLoop	当前输出回路数
  * @retval     None
  * @attention	None
*******************************************************************************/
void HuaErSi_Background_Power_Control(Device_Public_Information_G *BUS_Public, RS485_MUSIC_INFO *Rs485MusicInfo, uint16_t DevOutputLoop)
{
	/***数据包长度为命令+参数的长度***/
					 //头      默认    地址    长度    命令    参数    校验    尾
	uint8_t data[8] = {0xFA,   0x00,   0x00,   0x02,   0x10,   0x00,   0x00,   0xFE};	//要发送的数据
	
	data[2] = BUS_Public->addr;	//设备地址赋值
	switch(Rs485MusicInfo->huaersi_onoff_last[DevOutputLoop])	//根据上一次开关机的值判断
	{
		case CFG_Dev_CtrlWay_Is_Open:	//开机
			data[4] = 0x10;
			data[5] = 0x00;
			break;
		case CFG_Dev_CtrlWay_Is_Close:	//关机
			data[4] = 0x10;
			data[5] = 0x01;
			break;
	}
	data[6] = SOR_CRC(&data[1], 5);	//数据校验
	MCU485_SendString(BUS_Public->port, data, 8);	//485发送数据
	Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的电源控制数据");
}

/*******************************************************************************
  * @brief      华尔思音乐背景音乐控制函数
  * @param  
  *		BUS_Public		设备共有数据结构体
  *		Rs485Music		485音乐私有数据结构体
  *		DevOutputLoop	当前输出回路数
  * @retval     None
  * @attention	None
*******************************************************************************/
void HuaErSi_Background_Music_Control(Device_Public_Information_G *BUS_Public, RS485_MUSIC_INFO *Rs485MusicInfo, uint16_t DevOutputLoop)
{
	/***数据包长度为命令+参数的长度***/
					  //头      默认    地址    长度    命令    参数    校验    尾
	uint8_t data1[8] = {0xFA,   0x00,   0x00,   0x02,   0x10,   0x00,   0x00,   0xFE};	//要发送的数据
					   //头      默认    地址    长度    命令    参数1   参数2   参数3   校验    尾
	uint8_t data2[10] = {0xFA,   0x00,   0x00,   0x04,   0x89,   0x03,   0x00,   0x00,   0x00,   0xFE};	//要发送的数据
	
	data1[2] = BUS_Public->addr;	//设备地址赋值
	data2[2] = BUS_Public->addr;	//设备地址赋值
	#if LOGIC_FILE_EN
	switch(Rs485MusicInfo->DevMusicCtrlState[DevOutputLoop].DevMusicCtrlWay.CtrlDir)	//逻辑文件根据控制目录判断
	#else
	switch(Rs485MusicInfo->DevMusicCtrlState[DevOutputLoop].CtrlCont.CtrlMode)	//根据回路控制模式判断
	#endif
	{
		case MUSIC_PLAY:	//播放
			data2[7] = 0x01;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的播放音乐控制数据");
			break;
		case MUSIC_STOP:	//暂停
			data1[5] = 0x03;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的停止播放控制数据");
			break;
		case MUSIC_PRE:		//上一曲
			data1[5] = 0x0B;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的上一曲控制数据");
			break;
		case MUSIC_NEX:		//下一曲
			data1[5] = 0x0C;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的下一曲控制数据");
			break;
		case MUSIC_PLAY_SPE_1:	//指定播放第1首
			data1[5] = 0x27;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的指定播放第1首控制数据");
			break;
		case MUSIC_PLAY_SPE_2:	//指定播放第2首
			data2[7] = 0x02;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的指定播放第2首控制数据");
			break;
		case MUSIC_PLAY_SPE_3:	//指定播放第3首
			data2[7] = 0x03;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的指定播放第3首控制数据");
			break;
		case MUSIC_PLAY_SPE_4:	//指定播放第4首
			data2[7] = 0x04;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的指定播放第4首控制数据");
			break;
		case MUSIC_PLAY_SPE_5:	//指定播放第5首
			data2[7] = 0x05;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的指定播放第5首控制数据");
			break;
		case MUSIC_PLAY_SPE_6:	//指定播放第6首		
			data2[7] = 0x06;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的指定播放第6首控制数据");
			break;
	}
	#if LOGIC_FILE_EN
	switch(Rs485MusicInfo->DevMusicCtrlState[DevOutputLoop].DevMusicCtrlWay.CtrlDir)	//逻辑文件根据控制目录判断
	#else
	switch(Rs485MusicInfo->DevMusicCtrlState[DevOutputLoop].CtrlCont.CtrlMode)	//根据回路控制模式判断
	#endif
	{
		case MUSIC_STOP:	//暂停
		case MUSIC_PRE:   //上一曲
		case MUSIC_NEX:   //下一曲
		case MUSIC_PLAY_SPE_1:	//指定播放第1首
			data1[6] = SOR_CRC(&data1[1], 5);	//数据校验
			MCU485_SendString(BUS_Public->port, data1, 8);	//485发送数据
			break;
		case MUSIC_PLAY:	//音乐播放
		case MUSIC_PLAY_SPE_2:	//指定播放第2首
		case MUSIC_PLAY_SPE_3:	//指定播放第3首
		case MUSIC_PLAY_SPE_4:	//指定播放第4首
		case MUSIC_PLAY_SPE_5:	//指定播放第5首 
		case MUSIC_PLAY_SPE_6:	//指定播放第6首
			data2[8] = SOR_CRC(&data2[1], 7);	//数据校验
			MCU485_SendString(BUS_Public->port, data2, 10);	//485发送数据
			break;
	}
}

/*******************************************************************************
  * @brief      华尔思音乐背景音乐音量控制函数（只进行音量加减）
  * @param  
  *		BUS_Public		设备共有数据结构体
  *		Rs485Music		485音乐私有数据结构体
  *		DevOutputLoop	当前输出回路数
  * @retval     None
  * @attention	None
*******************************************************************************/
void HuaErSi_Background_Volume_Control(Device_Public_Information_G *BUS_Public, RS485_MUSIC_INFO *Rs485MusicInfo, uint16_t DevOutputLoop)
{
	/***数据包长度为命令+参数的长度***/
					 //头      默认    地址    长度    命令    参数    校验    尾
	uint8_t data[8] = {0xFA,   0x00,   0x00,   0x02,   0x10,   0x00,   0x00,   0xFE};	//要发送的数据
	
	data[2] = BUS_Public->addr;	//设备地址赋值
	#if LOGIC_FILE_EN
	switch(Rs485MusicInfo->DevMusicCtrlState[DevOutputLoop].DevMusicCtrlWay.CtrlDir)	//逻辑文件根据控制目录判断
	#else
	switch(Rs485MusicInfo->DevMusicCtrlState[DevOutputLoop].CtrlCont.CtrlMode)	//根据回路控制模式判断
	#endif
	{
		case MUSIC_VOICE_UP:	//音量加
			data[5] = 0x07;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的音量加控制数据");
			break;
		case MUSIC_VOICE_DOWN:	//音量减
			data[5] = 0x06;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的音量减控制数据");
			break;
	}
	data[6] = SOR_CRC(&data[1], 5);	//数据校验
	MCU485_SendString(BUS_Public->port, data, 8);	//485发送数据
}

/*******************************************************************************
  * @brief      华尔思音乐左右声道控制函数
  * @param  
  *		BUS_Public		设备共有数据结构体
  *		Rs485Music		485音乐私有数据结构体
  *		DevOutputLoop	当前输出回路数
  * @retval     None
  * @attention	None
*******************************************************************************/
void HuaErSi_Background_Track_Control(Device_Public_Information_G *BUS_Public, RS485_MUSIC_INFO *Rs485MusicInfo, uint16_t DevOutputLoop)
{
	/***数据包长度为命令+参数的长度***/
					 //头      默认    地址    长度    命令    参数    校验    尾
	uint8_t data[8] = {0xFA,   0x00,   0x00,   0x02,   0x28,   0x00,   0x00,   0xFE};	//要发送的数据
	
	data[2] = BUS_Public->addr;	//设备地址赋值
	switch(Rs485MusicInfo->DevMusicCtrlState[DevOutputLoop].DevMusicCtrlWay.CtrlDirect)	//根据控制方式（控制方向）
	{
		case 0x05:	//打开左声道
			data[5] = 0x01;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的打开左声道控制数据");
			break;
		case 0x06:	//关闭左声道
			data[5] = 0x02;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的关闭左声道控制数据");
			break;
		case 0x07:	//打开右声道
			data[5] = 0x03;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的打开右声道控制数据");
			break;
		case 0x08:	//关闭右声道
			data[5] = 0x04;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的关闭右声道控制数据");
			break;
		case 0x09:	//打开左右声道
			data[5] = 0x05;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的打开左右声道控制数据");
			break;
		case 0x0A:	//关闭左右声道
			data[5] = 0x06;
			Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"发送华尔思的关闭左右声道控制数据");
			break;
	}
	data[6] = SOR_CRC(&data[1], 5);	//数据校验
	MCU485_SendString(BUS_Public->port, data, 8);	//485发送数据
}
