#ifndef __ASR_CONFIG_H__
#define __ASR_CONFIG_H__


/******************************************************************************
                                WARNING!!!   不需要修改 
******************************************************************************/
#include <csi_config.h>
#include "console/sys_console.h"
#include "app_gpio.h"
#include "app_uart.h"
#include "app_beep.h"
#include "asr_event.h"

typedef struct _ASR_LOGIC
{
    unsigned char *_asr_result;
    unsigned char *_send_uart;
    unsigned char _asr_response;
} ASR_LOGIC;

typedef struct _RCV_LOGIC
{
    unsigned char *_rcv_uart;
    unsigned char _rcv_response;
} RCV_LOGIC;

/******************************************************************************  
    1:语音识别指令、唤醒词、发送和接收数据、对应提示音播放相关功能配置
******************************************************************************/
//播放开机语，该宏为对应提示音名称，如果不播放则不用写 
#define WELCOME_PLAY                    BEEP_00

//播放退出唤醒提示音，该宏为对应提示音的名称，如果不播放则不用写
#define WAKEDOWN_PLAY                   BEEP_02

//唤醒时间，单位（秒）:10s   
#define VOICE_WAKE_TIMES                10

//唤醒词个数
//这里设定的是“10”，即最多10个唤醒词
#define ASR_WAKE_INDEX                  3
//唤醒词长度 = 汉字个数 * 3 + 1 /取最长指令
//这里写得19，即最大支持5个字的识别指令
#define ASR_WAKE_LEN                    19
//在该数组中填入需要的唤醒词
extern unsigned char wakeup_cmd_data[ASR_WAKE_INDEX][ASR_WAKE_LEN];

//指令词总数
#define ASR_CMD_INDEX                   50
//控制指令长度 = 汉字个数 * 3 + 1 /取最长指令
//这里写得19，即最大支持5个字的识别指令
#define ASR_CMD_LEN                     19
//将所有需要用到的识别指令填入改数组中
extern unsigned char asr_cmd_data[ASR_CMD_INDEX][ASR_CMD_LEN];

//需要发送的串口指令数量
//这里是设定的“50”，即最多在send_uart_buf[]中写入50条串口指令
#define SEND_UART_DATA_NUM              50
//串口指令长度
//这里设定的是“32”，即最多发送32个字节，且这里设定的字节数不能大于32字节
#define SEND_UART_DATA_LEN              32
//该数组中填写对应串口数据,需要特别注意发送的数据不能连续超过5个0x00
extern unsigned char send_uart_buf[SEND_UART_DATA_NUM][SEND_UART_DATA_LEN];

//在该数组中填写识别逻辑，对应：识别指令，发送串口数据，播放的提示音名称
//识别指令为 asr_cmd_data[]
//发送串口数据为 send_uart_buf[]
extern ASR_LOGIC asr_logic[ASR_CMD_INDEX];

//需要接收的串口指令数量
//这里是设定的“50”，即最多在rcv_uart_buf[]中写入50条串口指令
#define RCV_UART_DATA_NUM               50
//串口指令长度
//这里设定的是“32”，即最多接收32个字节，且这里设定的字节数不能大于32字节
//且数据头和尾要和设定的一样，详情见 4:通信串口相关配置设定的宏命令：
//UART1_RCV_HEAD // UART1_RCV_END
#define RCV_UART_DATA_LEN               32
unsigned char rcv_uart_buf[RCV_UART_DATA_NUM][RCV_UART_DATA_LEN];

//在该数组中填写接收串口逻辑，对应：接收串口数据，播放的提示音名称
extern RCV_LOGIC rcv_uart_logic[RCV_UART_DATA_NUM];



/******************************************************************************
    2:语音播报/语音识别 相关功能模块
******************************************************************************/

//启用该功能后，可以通过语音识别控制是否开启语音识别，目前如果关闭了语音识别，那么除了唤醒词，其他指令都不能被识别
//如果启用改模块需要在asr_cmd_data[]和asr_logic[]中写入对应的VOICE_POWER_ON/VOICE_POWER_OFF 指令
//比如说这里是“打开语音”/“关闭语音”，则需要在asr_cmd_data[]和asr_logic[]写入“打开语音”/“关闭语音”，
//同时在识别指令的lib中“打开语音”/“关闭语音”要能够被识别
//#define VOICE_POWER_MARK
#ifdef VOICE_POWER_MARK
#define VOICE_POWER_ON "打开语音"
#define VOICE_POWER_OFF "关闭语音"
//在关闭了语音识别功能后，识别了其他控制指令如果需要有提示，需要在这里填上对应的提示音名称，如果不需要可不填
#define VOICE_POWER_FLAG_PLAY    BEEP_57
#endif


//启用该功能后，可以通过语音识别控制是否播放提示音
//如果启用改模块需要在asr_cmd_data[]和asr_logic[]中写入对应的 PLAY_POWER_ON/PLAY_POWER_OFF 指令
//比如说这里是“打开播报”/“关闭播报”，则需要在asr_cmd_data[]和asr_logic[]写入“打开播报”/“关闭播报”，
//同时在识别指令的lib中“打开播报”/“关闭播报”要能够被识别
//#define PLAY_POWER_MARK
#ifdef PLAY_POWER_MARK
#define PLAY_POWER_ON "打开播报"
#define PLAY_POWER_OFF "关闭播报"
#endif

//提示音是否会被串口接收打断（uart1）
#define INTERRUPT_PLAYING    0         

/******************************************************************************
    3:LOG 打印串口输出相关配置
******************************************************************************/
 //是否开启log打印输出
#define APP_LOG_ENABLE                  1     

#if APP_LOG_ENABLE
//设置引脚/功能复用
#define CLOCK_GETTIME_USE_TIMER_ID      0
#define CONSOLE_IDX                     0

//LOG打印输出引脚
#define CONSOLE_TXD                     PA23

//作为串口输入，接收到的数据会由通信串口输出
#define CONSOLE_RXD                     PA24

#define CONSOLE_TXD_FUNC                PA23_UART0_TX
#define CONSOLE_RXD_FUNC                PA24_UART0_RX

//波特率设置
#define CONSOLE_UART_BAUDRATE           115200
#endif

/******************************************************************************
                            4:通信串口相关配置
******************************************************************************/

#define EXAMPLE_UART_IDX                1
#define EXAMPLE_PIN_UART_TX             PA28             
#define EXAMPLE_PIN_UART_RX             PA27             
#define EXAMPLE_PIN_UART_TX_FUNC        PA28_UART1_TX
#define EXAMPLE_PIN_UART_RX_FUNC        PA27_UART1_RX

//通信串口波特率设置
#define EXAMPLE_UART_BAUDRATE           9600

//数据长度最多：32Byte
//接收串口命令数据头：如果不设置会收不到数据
#define UART1_RCV_HEAD                  0xBB

      

//接收串口命令数据尾：如果不设置会收不到数据
#define UART1_RCV_END                   0xDF           


#endif