/****************************************************************************************************
* created by sunpeng 2017 all rights reserved!
****************************************************************************************************/

#ifndef __BEEP_H__
#define __BEEP_H__

/* Includes ------------------------------------------------------------------*/	   
#include <stdint.h>
#include "include.h"

typedef enum
{
	MUSIC_NOTICE_TYPE_MIN = -1,
#if HW_VOICE_TYPE == HW_VOICE_TYPE_SPEAKER
	MUSIC_NOTICE_TYPE_1 = 1,        //你好，我是智能魔方小易
	MUSIC_NOTICE_TYPE_2 ,           //再见了，拜拜
	MUSIC_NOTICE_TYPE_3 ,           //我也累了，拜拜
	MUSIC_NOTICE_TYPE_4 ,           //抢吃灯游戏
	MUSIC_NOTICE_TYPE_5 ,           //转灭灯游戏
	MUSIC_NOTICE_TYPE_6 ,           //时间已到
	MUSIC_NOTICE_TYPE_7 ,           //游戏结束
	MUSIC_NOTICE_TYPE_8 ,           //记录模式
	MUSIC_NOTICE_TYPE_9 ,           //记录完成
	MUSIC_NOTICE_TYPE_10,           //提示模式
	MUSIC_NOTICE_TYPE_11,           //正转90
	MUSIC_NOTICE_TYPE_12,           //反转90
	MUSIC_NOTICE_TYPE_13,           //转180
	MUSIC_NOTICE_TYPE_14,           //错啦
	MUSIC_NOTICE_TYPE_15,           //顺时针方向
	MUSIC_NOTICE_TYPE_16,           //逆时针方向
	MUSIC_NOTICE_TYPE_17,           //正转
	MUSIC_NOTICE_TYPE_18,           //反转
	MUSIC_NOTICE_TYPE_19,           //红
	MUSIC_NOTICE_TYPE_20,           //蓝
	MUSIC_NOTICE_TYPE_21,           //黄
	MUSIC_NOTICE_TYPE_22,           //绿
	MUSIC_NOTICE_TYPE_23,           //紫
	MUSIC_NOTICE_TYPE_24,           //橙
	MUSIC_NOTICE_TYPE_25,           //白
	MUSIC_NOTICE_TYPE_26,           //顶面是
	MUSIC_NOTICE_TYPE_27,           //前面是
	MUSIC_NOTICE_TYPE_28,           //左面是
	MUSIC_NOTICE_TYPE_29,           //后面是
	MUSIC_NOTICE_TYPE_30,           //右面是
	MUSIC_NOTICE_TYPE_31,           //
	MUSIC_NOTICE_TYPE_32,           //亮灯
	MUSIC_NOTICE_TYPE_33,           //按下了
	MUSIC_NOTICE_TYPE_34,           //总共有
	MUSIC_NOTICE_TYPE_35,           //条记录
	MUSIC_NOTICE_TYPE_36,           //good
	
	MUSIC_NOTICE_TYPE_step_ok = 201,	// = MUSIC_NOTICE_TYPE_36,
	MUSIC_NOTICE_TYPE_game_over = 202,	// = MUSIC_NOTICE_TYPE_7,
#else
	MUSIC_NOTICE_TYPE_fresh_start,
	MUSIC_NOTICE_TYPE_step_ok,
	MUSIC_NOTICE_TYPE_step_failed,
	MUSIC_NOTICE_TYPE_all_ok,
	MUSIC_NOTICE_TYPE_game_over,
	
#endif
	MUSIC_NOTICE_TYPE_MAX
}MUSIC_NOTICE_TYPE_ENUM;			//蜂鸣器提示音种类
	
#if HW_VOICE_TYPE == HW_VOICE_TYPE_SPEAKER

#define 	SPEAKER_VOLUMN_MIN		0		/*喇叭音量最小值*/
#define		SPEAKER_VOLUMN_MAX		31		/*喇叭音量最大值*/

typedef enum
{
	JQSW_DATA_STEP_MIN = -1,
	JQSW_DATA_STEP_START,
	JQSW_DATA_STEP_START_WAITTING,
	JQSW_DATA_STEP_DATA_BIT_FIRST,
	JQSW_DATA_STEP_DATA_BIT_FIRST_WAITTING,
	JQSW_DATA_STEP_DATA_BIT_LAST,
	JQSW_DATA_STEP_DATA_BIT_LAST_WAITTING,
	JQSW_DATA_STEP_STOP,
	JQSW_DATA_STEP_STOP_WAITTING,
	JQSW_DATA_STEP_MAX
}JQSW_DATA_STEP_ENUM;				//JQ8400音乐模块 单线通信协议

typedef struct
{
	uint8_t byte_to_send;			//当前发送的字节
	uint8_t bit_to_send;			//当前发送的位
	uint8_t bit_offset;				//当前发送的位在字节中的偏移量  offset=1表示第0位数据
}JQSW_DATA_SEND_CONTROL_STRUCT;		//JQ8400音乐模块 单线协议 需要发送的一个byte数据控制

typedef enum
{
	JQSW_CMD_MIN = 0x09,
	JQSW_CMD_ClearNumber,		 //清零数字（清除发送的数字）
	JQSW_CMD_SelectMusicAck,     //选曲确认
	JQSW_CMD_SetVolumn,          //设置音量
	JQSW_CMD_SetEQ,              //设置EQ
	JQSW_CMD_SetCycleMode,       //设置循环模式
	JQSW_CMD_SetChannel,         //设置通道
	JQSW_CMD_SetInterruptMusic,  //设置插播曲目
	JQSW_CMD_Start,              //播放
	JQSW_CMD_Pause,              //暂停
	JQSW_CMD_Stop,               //停止
	JQSW_CMD_Prev,               //上一曲
	JQSW_CMD_Next,               //下一曲
	JQSW_CMD_PrevDirectory,      //上一目录
	JQSW_CMD_NextDirectory,      //下一目录
	JQSW_CMD_SelectSDCard,       //选择SD卡
	JQSW_CMD_SelectUDisk,        //选择U盘
	JQSW_CMD_SelectFlash,        //选择Flash
	JQSW_CMD_Sleep,              //休眠
	JQSW_CMD_MAX,
}JQSW_CMD_ENUM;						//JQ8400音乐模块单线控制指令

#endif

/**@brief Function for beep init.
 *
 * @param[in] void.
 */
void init_beep(void);

//开启开机欢迎语音定时器
void start_BroadBootWelcomeVoice_timer(void);

void enable_ring(void);

void disable_ring(void);

/**@brief Function for beep ring n times.
 *
 * @param[in] uint16_t times: ring times. 
 */
void set_beep_times(uint16_t times);

//响指定提示音
//n_type	:	提示音种类
//times		:	提示次数
void ring_notice(MUSIC_NOTICE_TYPE_ENUM n_type, uint16_t times);

#if HW_VOICE_TYPE == HW_VOICE_TYPE_SPEAKER
//发送到JQ8400上控制数据
void JQSW_SendData(uint8_t data);

//发送到JQ8400上控制指令
void JQSW_SendCmd(uint8_t data);

//设置音乐模块音量
uint8_t JQSW_SetVolumn(uint8_t volumn);

//初始化数据发送控制数据结构
uint8_t init_dsc_offset(JQSW_DATA_SEND_CONTROL_STRUCT *dsc);

//后移数据发送控制数据结构一位
uint8_t shift_dsc_offset(JQSW_DATA_SEND_CONTROL_STRUCT *dsc);

//获取数据发送控制数据当前发送的bit
uint8_t get_dsc_bit_to_send(JQSW_DATA_SEND_CONTROL_STRUCT *dsc);

#endif

/**@brief Function for beep ring cycle.
 *
 * @param[in] void. 
 */
void ring_beep_cycle(void);

//定时检测是否需要将扬声器声音设置小于30%，以节省电量
void cycleCheckSetSpeakerVoiceLower(void);

void test_beep(void);

#endif

/*********************************************end of file*********************************************/

