#include "main.h" #include "YX5200_main.h" #include "Delay.h" #include "SPI-SD/Lcd/lcd_5110_solution.h" uint8_t TxBufferUart2[256] = { 0 }; uint8_t RxBufferUart2[256] = { 0 }; __IO uint8_t TxCounterUart2 = 0x00; __IO uint8_t RxCounterUart2 = 0x00; uint8_t Uart2SendCount = 0;//实际发送 uint8_t YX5200HaveRecFlag = false; /*******************wifi UART通讯配置*********************/ void Configuration_YX5200_Usart2 ( void ) { #if xy5200_Uart2_def GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; //使能USARTz 时钟可配置 YX5200_RCC_GPIO_CONFIG(); YX5200_RCC_UART_CONFIG(); YX5200_RCC_Remap_CONFIG(); /* * USART2_TX -> PD5 , USART2_RX -> PD6 */ GPIO_InitStructure.GPIO_Pin = YX5200_Tx; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init ( YX5200_GPIO, &GPIO_InitStructure ); GPIO_InitStructure.GPIO_Pin = YX5200_Rx; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init ( YX5200_GPIO, &GPIO_InitStructure ); USART_InitStructure.USART_BaudRate = YX5200_UART_BAUD; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init ( YX5200_UART, &USART_InitStructure ); USART_ITConfig ( YX5200_UART, USART_IT_RXNE, ENABLE ); USART_ITConfig ( YX5200_UART, USART_IT_TXE, DISABLE ); USART_Cmd ( YX5200_UART, ENABLE ); #endif } //系统中断管理 void NVIC_Configuration_YX5200_USART2 ( void ) { #if xy5200_Uart2_def NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig ( YX5200_NVIC_Group ); /* Enable the USARTy Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = YX5200_NVIC_Interrupt; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = YX5200_NVIC_Pre; NVIC_InitStructure.NVIC_IRQChannelSubPriority = YX5200_NVIC_Sub; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init ( &NVIC_InitStructure ); Init_YX5200_VOL(); #endif } void Uart2Send ( char *buffer, int nBytes ) { // Wait for previous xmt to complete while ( TxCounterUart2 < Uart2SendCount ); // Setup next XMT memcpy ( TxBufferUart2, buffer, nBytes ); TxCounterUart2 = 0; Uart2SendCount = nBytes; USART_ITConfig ( YX5200_UART, USART_IT_TXE, ENABLE ); } /*******************************************************************************************************************/ //配置结束 /*******************************************************************************************************************/ static INT8U MSG_FIFO = NO_MSG; static INT8U InputNumCnt = 0 ; static INT8U FolderNum = 0 ;//指定文件夹操作时的文件夹数目 static INT8U FileNum = 0 ;//指定文件名操作时的文件名数目 INT8U _ErrorStatus = 0 ; INT8U FEEDBACK = 1 ;//是否需要反馈[=1:要应答][=0:不要应答] INT8U UartRecvStatus ; INT16U UartRecvACK ; bool UartRecvACKFlag = false; INT8U UartRecv_100Ms ;//保证串口接收错误,也能回到初始状态 INT8U System_Status = 0 ;//系统状态 INT8U OutTimeCnt = 0 ;//重发计时 INT8U ResendCount = 3 ;//重发次数 INT8U QueryACKTime = 0 ;//[查询参数]等待应答计时 INT8U SysReturnTime = 0 ;//系统返回初始界面计时 INT8U PlayledCnt = 0 ;//测试led点亮的时间 INT8U PlayledStatus; INT8U CurrentEQ = 0 ;//当前的EQ INT8U PlayMode = 0 ;//当前的播放模式 INT8U PlayDevice = 0;//当前播放的设备 INT8U OnlineDevice = 0 ;//在线的设备 INT8U DelayTime = 0 ; INT8U input_vol = 0 ;//当前的音量 INT8U CurrentModule = 0 ;//当前的模块型号 INT8U PointFunc = 0 ; INT16U input_number ;//选曲输入的数字 INT16U CurDevTotal = 0 ;//当前设备的总文件数 INT16U UDiskTotal = 0 ; //U盘总文件数 INT16U TFTotal = 0 ;//TF卡文件数 INT16U FlashTotal = 0 ;//_FLASH中的文件数 INT16U CurDevNUM = 0 ;//当前设备播放的曲目 INT16U UDiskCurFile = 0 ; //当前U盘播放的文件号 INT16U TFCurFile = 0 ;//当前TF播放的文件号 INT16U FlashCurFile = 0 ;//当前_FLASH播放的文件号 INT16U input_cur_fold = 0; //指定的文件夹 INT16U CurFileNum = 0 ;//当前文件数目 INT16U CurFoldNum = 0 ;//当前文件夹数目 cc Status0 , Status1 , Status2, Status3; const INT8U asc_number[] = "0123456789"; ///<0~9的ASCII码表 INT8U bcd_number[5]; void Let_One_Music_play ( u8 fold, u16 file ) { #if xy5200_Uart2_def FolderNum = fold; FileNum = file; PointFunc = POINTNUM_FOLDER; put_msg_lifo ( MSG_MUSIC_PLAY_NEW_FILE ); #endif } void Random_play_music ( u8 num ) { #if xy5200_Uart2_def input_number = num; put_msg_lifo ( MSG_PLAY_RANDOM ); #endif } /***************************************************************************************************** - 功能描述: 将消息存入消息池 - 隶属模块: 外部 - 参数说明: 无 - 返回说明: - 注:无 *****************************************************************************************************/ void put_msg_lifo ( INT8U msg ) { MSG_FIFO = msg ; } /***************************************************************************************************** - 功能描述: 取消息 - 隶属模块: 外部 - 参数说明: 无 - 返回说明: - 注:无 *****************************************************************************************************/ INT8U app_get_msg ( void ) { static INT8U msg ; msg = MSG_FIFO ; if ( MSG_FIFO != NO_MSG ) { MSG_FIFO = NO_MSG ; return msg ; } else { return NO_MSG ;//将消息清除 } } /***************************************************************************************************** - 函数说明:获取一个一位十进制的数的个位 - 隶属模块:内部 - 参数说明:i:输入的一个一位十进制的数 - 返回说明: - 注 : *****************************************************************************************************/ void itoa1 ( INT8U i ) { bcd_number[0] = asc_number[i % 10]; bcd_number[1] = 0; } /***************************************************************************************************** - 函数说明:获取一个2位十进制的数的各个位 - 隶属模块:内部 - 参数说明:i:输入的一个2位十进制的数 - 返回说明: - 注 : *****************************************************************************************************/ void itoa2 ( INT8U i ) { bcd_number[0] = asc_number[ ( i % 100 ) / 10]; bcd_number[1] = asc_number[ ( i % 10 )]; bcd_number[2] = 0; } /***************************************************************************************************** - 函数说明:获取一个3位十进制数的各个位 - 隶属模块:内部 - 参数说明:i:输入的一个3位十进制数 - 返回说明: - 注 : *****************************************************************************************************/ void itoa3 ( INT16U i ) { bcd_number[0] = asc_number[ ( i % 1000 ) / 100]; bcd_number[1] = asc_number[ ( i % 100 ) / 10]; bcd_number[2] = asc_number[i % 10]; bcd_number[3] = 0; } /***************************************************************************************************** - 函数说明:获取一个4位十进制的数的各个位 - 隶属模块:内部 - 参数说明:i:输入的一个4位十进制的数 - 返回说明: - 注 : *****************************************************************************************************/ void itoa4 ( INT16U i ) { bcd_number[0] = asc_number[ ( i % 10000 ) / 1000]; bcd_number[1] = asc_number[ ( i % 1000 ) / 100]; bcd_number[2] = asc_number[ ( i % 100 ) / 10]; bcd_number[3] = asc_number[i % 10]; bcd_number[4] = 0; } /******************************************************************************************** - 功能描述: 清屏 - 隶属模块: 内部 - 参数说明: - 返回说明: - 注: *******************************************************************************************/ void LCD1602_Clear ( void ) { if ( System_Flag_Prin_Music ) { memset ( n5110_string, 0x20, sizeof ( n5110_string ) ); delay_ms ( 1 ); } } /******************************************************************************************** - 功能描述: 指定位置显示字符 - 隶属模块: 内部 - 参数说明: x:代表显示的行[0:第一行][1:第二行] y:代表显示的列[0~15] - 返回说明: - 注: *******************************************************************************************/ void LCD1602_DispDat ( INT8U x, INT8U y, INT8U ch ) { if ( System_Flag_Prin_Music ) { sprintf ( &n5110_string[2 * x][y], "%c", ch ); } } /******************************************************************************************** - 功能描述: 指定位置显示字符串 - 隶属模块: 内部 - 参数说明: x:代表显示的行[0:第一行][1:第二行] y:代表显示的列[0~15] - 返回说明: - 注: *******************************************************************************************/ void LCD1602_DispStr ( INT8U x, INT8U y, INT8U *str ) { if ( System_Flag_Prin_Music ) { sprintf ( &n5110_string[2 * x][y], "%s", str ); } } /******************************************************************************************** - 功能描述: 清除指定的行 - 隶属模块: 内部 - 参数说明: - 返回说明: - 注: *******************************************************************************************/ void LCD1602_ClearLine ( INT8U x ) { sprintf ( n5110_string[x * 2 + 0], " " ); sprintf ( n5110_string[x * 2 + 1], " " ); } /***************************************************************************************************** - 函数说明:显示模块返回的错误 - 隶属模块:内部 - 参数说明:无 - 返回说明: - 注 : *****************************************************************************************************/ void DispModlueError ( INT8U error ) { LCD1602_Clear(); LCD1602_DispStr ( 0 , 0 , "RETURN ERROR " ); switch ( error ) { case ERROR_IDLE : break ; case ERROR_Busy : LCD1602_DispStr ( 1 , 0 , "BUSY " ); break ; case ERROR_SLEEP : LCD1602_DispStr ( 1 , 0 , "SLEEP " ); break ; case ERROR_RecvError : LCD1602_DispStr ( 1 , 0 , "RECV ERROR " ); break ; case ERROR_CheckSError : LCD1602_DispStr ( 1 , 0 , "SUM ERROR " ); break ; case ERROR_FolPointOver : LCD1602_DispStr ( 1 , 0 , "FOL OVER " ); break ; case ERROR_FolPointNo : LCD1602_DispStr ( 1 , 0 , "NO FIND FILE " ); break ; } } /***************************************************************************************************** - 功能描述: 按键的初始化 - 隶属模块: 外部 - 参数说明: 无 - 返回说明: 无 - 注: *****************************************************************************************************/ void RAM_Init ( void ) { System_Flag_2Ms = 0 ; System_Flag_10Ms = 0 ; System_Flag_100Ms = 0 ; System_Flag_500Ms = 0 ; RecvOver_Flag = 0 ; Resend_Flag_Enable = 0 ; MainEnable = true ; SysReturnTime = 0 ; PlayledCnt = 0 ; PlayledStatus = 0; PlayledStatus = SET_PLAYLED_OFF; } /***************************************************************************************************** - 功能描述:初始化 - 参数说明:无 - 返回参数:无 - 注:无 *****************************************************************************************************/ void System_Init ( void ) { RAM_Init() ; itoa1 ( 0 ); itoa2 ( 0 ); itoa3 ( 0 ); itoa4 ( 0 ); TrigEnable = 1 ; PointFunc = POINTNUM_ONE ; input_vol = MAX_MAIN_VOL ;//上电默认最大音量 System_Status = SYS_STATUS_WORK ; SysReturnTime = 30 ;//定义3S的时候等待模块初始化完成 } /******************************************************************************************** - 功能描述: 显示当前的播放模式 - 隶属模块: 内部 - 参数说明: - 返回说明: - 注: *******************************************************************************************/ static void DispDevice ( INT8U device ) { switch ( device ) { case PLAYDEVICE_UDISK : LCD1602_DispStr ( 0 , 9 , "U" ); break ; case PLAYDEVICE_TFCARD : LCD1602_DispStr ( 0 , 9 , "T" ); break ; case PLAYDEVICE_PC: LCD1602_DispStr ( 0 , 9 , "P" ); break ; case PLAYDEVICE_FLASH: LCD1602_DispStr ( 0 , 9 , "F" ); break ; case PLAYDEVICE_SLEEP: LCD1602_DispStr ( 0 , 9 , "S" ); break ; default: LCD1602_DispStr ( 0 , 9 , "N" ); break ; } } /******************************************************************************************** - 功能描述: 返回液晶显示界面 - 隶属模块: 内部 - 参数说明: - 返回说明: - 注: *******************************************************************************************/ void ReturnLcdInit ( void ) { DispDevice ( PlayDevice ) ; if ( FEEDBACK ) { LCD1602_DispStr ( 0 , 13 , "ACK" ); } else { LCD1602_DispStr ( 0 , 12 , "NACK" ); } #if 0 if ( TrigEnable ) { LCD1602_DispStr ( 1 , 5 , "TRIG" ); //触发模式 } else { LCD1602_DispStr ( 1 , 5 , "CONT" ); //连续模式 } #endif if ( PointFunc == POINTNUM_ONE ) { LCD1602_DispStr ( 1 , 5 , "ONE " ); } else if ( PointFunc == POINTNUM_LOOP ) { LCD1602_DispStr ( 1 , 5 , "LOOP" ); } else if ( PointFunc == POINTNUM_FOLDER ) { LCD1602_DispStr ( 1 , 5 , "FOLD" ); } if ( PointFolNum_Flag ) { LCD1602_DispStr ( 0 , 7 , "F" ); //指定文件夹 } else { LCD1602_DispStr ( 0 , 7 , "N" ); //正常指定曲目 } } /******************************************************************************************** - 功能描述: 显示播放到的设备 - 隶属模块: 内部 - 参数说明: - 返回说明: - 注: *******************************************************************************************/ void Disp_PlayDevice ( INT8U device ) { if ( device == PLAYDEVICE_UDISK ) { LCD1602_DispStr ( 1 , 0 , "PLAYD:_UDISK" ); } else if ( device == PLAYDEVICE_TFCARD ) { LCD1602_DispStr ( 1 , 0 , "PLAYD:_TFCARD" ); } else if ( device == PLAYDEVICE_PC ) { LCD1602_DispStr ( 1 , 0 , "PLAYD:_PC" ); } else if ( device == PLAYDEVICE_FLASH ) { LCD1602_DispStr ( 1 , 0 , "PLAYD:_FLASH" ); } else if ( device == PLAYDEVICE_SLEEP ) { LCD1602_DispStr ( 1 , 0 , "PLAYD:SLEEP" ); } } /******************************************************************************************** - 功能描述: 显示播放到的模式 - 隶属模块: 内部 - 参数说明: - 返回说明: - 注: *******************************************************************************************/ void Disp_PlayMode ( INT8U mode ) { if ( mode == REPEAT_ALL ) { LCD1602_DispStr ( 1 , 0 , "PLAYM:ALL_0" ); } else if ( mode == REPEAT_FOLDER ) { LCD1602_DispStr ( 1 , 0 , "PLAYM:FOLDER_1" ); } else if ( mode == REPEAT_ONE ) { LCD1602_DispStr ( 1 , 0 , "PLAYM:ONE_2" ); } else if ( mode == REPEAT_RANDOM ) { LCD1602_DispStr ( 1 , 0 , "PLAYM:RANDOM_3" ); } } /******************************************************************************************** - 功能描述: 显示播放到的EQ - 隶属模块: 内部 - 参数说明: - 返回说明: - 注: *******************************************************************************************/ void Disp_PlayEQ ( INT8U EQ ) { if ( EQ == EQ_NORMAL ) { LCD1602_DispStr ( 1 , 0 , "EQ:NORMAL_0" ); } else if ( EQ == EQ_POP ) { LCD1602_DispStr ( 1 , 0 , "EQ:POP_1" ); } else if ( EQ == EQ_ROCK ) { LCD1602_DispStr ( 1 , 0 , "EQ:ROCK_2" ); } else if ( EQ == EQ_JAZZ ) { LCD1602_DispStr ( 1 , 0 , "EQ:JAZZ_3" ); } else if ( EQ == EQ_CLASSIC ) { LCD1602_DispStr ( 1 , 0 , "EQ:CLASSIC_4" ); } else if ( EQ == EQ_BASS ) { LCD1602_DispStr ( 1 , 0 , "EQ:BASS_5" ); } } /******************************************************************************************** - 功能描述: 显示模块返回的在线设备 - 隶属模块: 内部 - 参数说明: - 返回说明: - 注: *******************************************************************************************/ void Disp_OnlineDevice ( INT8U Online ) { INT8U temp ; temp = Online & 0x01 ; if ( temp ) //_UDISK { LCD1602_DispStr ( 1 , 12 , "U" ); } temp = Online & 0x02 ; if ( temp ) //TF { LCD1602_DispStr ( 1 , 13 , "T" ); } temp = Online & 0x04 ; if ( temp ) //_PC { LCD1602_DispStr ( 1 , 14 , "P" ); } temp = Online & 0x08 ; if ( temp ) //_FLASH { LCD1602_DispStr ( 1 , 15 , "F" ); } } /******************************************************************************************** - 功能描述: 上电跳转至设备状态 - 隶属模块: 外部 - 参数说明: - 返回说明: - 注: *******************************************************************************************/ void GoInitDevice ( INT8U Online ) { INT8U temp ; if ( 0 == Online ) { PlayDevice = PLAYDEVICE_SLEEP ; return ; } temp = Online & 0x01 ; if ( temp ) { PlayDevice = PLAYDEVICE_UDISK ; return ; } temp = Online & 0x02 ; if ( temp ) //TF { PlayDevice = PLAYDEVICE_TFCARD ; return ; } temp = Online & 0x04 ; if ( temp ) //_PC { PlayDevice = PLAYDEVICE_PC ; return ; } temp = Online & 0x08 ; if ( temp ) //_FLASH { PlayDevice = PLAYDEVICE_FLASH ; return ; } } /******************************************************************************************** - 功能描述: 设备拔出跳至下一个设备 - 隶属模块: 外部 - 参数说明: - 返回说明: - 注: *******************************************************************************************/ void GotoNextDevice ( INT8U device ) { if ( device == _UDISK ) { if ( OnlineDevice & BIT ( _TFCARD ) ) { PlayDevice = PLAYDEVICE_TFCARD ; } else { if ( OnlineDevice & BIT ( _FLASH ) ) { PlayDevice = PLAYDEVICE_FLASH ; } else { PlayDevice = PLAYDEVICE_SLEEP ; } } } else if ( device == _TFCARD ) { if ( OnlineDevice & BIT ( _UDISK ) ) { PlayDevice = PLAYDEVICE_UDISK ; } else { if ( OnlineDevice & BIT ( _FLASH ) ) { PlayDevice = PLAYDEVICE_FLASH ; } else { PlayDevice = PLAYDEVICE_SLEEP ; } } } else if ( device == _PC ) { if ( OnlineDevice & BIT ( _FLASH ) ) { PlayDevice = PLAYDEVICE_FLASH ; } else { PlayDevice = PLAYDEVICE_SLEEP ; } } } void ChangeDevice ( INT8U dev ) { if ( dev == PLAYDEVICE_UDISK ) { if ( 0 == ( OnlineDevice & BIT ( _UDISK ) ) ) { if ( OnlineDevice & BIT ( _TFCARD ) ) { PlayDevice = PLAYDEVICE_TFCARD ; } else { if ( OnlineDevice & BIT ( _FLASH ) ) { PlayDevice = PLAYDEVICE_FLASH ; } else { PlayDevice = PLAYDEVICE_SLEEP ; } } } } if ( dev == PLAYDEVICE_TFCARD ) { if ( 0 == ( OnlineDevice & BIT ( _TFCARD ) ) ) { if ( OnlineDevice & BIT ( _UDISK ) ) { PlayDevice = PLAYDEVICE_UDISK ; } else { if ( OnlineDevice & BIT ( _FLASH ) ) { PlayDevice = PLAYDEVICE_FLASH ; } else { PlayDevice = PLAYDEVICE_SLEEP ; } } } } else if ( dev == PLAYDEVICE_PC ) { if ( 0 == ( OnlineDevice & BIT ( _PC ) ) ) { if ( OnlineDevice & BIT ( _FLASH ) ) { PlayDevice = PLAYDEVICE_FLASH ; } else { PlayDevice = PLAYDEVICE_SLEEP ; } } } else if ( dev == PLAYDEVICE_FLASH ) { if ( 0 == ( OnlineDevice & BIT ( _FLASH ) ) ) { PlayDevice = PLAYDEVICE_SLEEP ; } } } /******************************************************************************************** - 功能描述: LCD1602液晶初始化 - 隶属模块: 内部 - 参数说明: - 返回说明: - 注: *******************************************************************************************/ void LCD1602_Init() { //LCD初始化设定 LCD1602_DispDat ( 0, 0, 0 ); LCD1602_DispStr ( 0 , 0 , "QYMxFS----------" ); // LCD1602_DispStr ( 1 , 0 , "PLAY: " ); // ReturnLcdInit(); Disp_OnlineDevice ( OnlineDevice ); } #define DBG(str) /***************************************************************************************************** - 函数说明:数字选曲操作 - 隶属模块:内部 - 参数说明:无 - 返回说明: - 注 : *****************************************************************************************************/ void PointPlayNum ( INT8U num ) { DBG ( "MSG_input_num\n" ) ; if ( 0 == InputNumCnt ) { LCD1602_ClearLine ( 1 ); } InputNumCnt = 30 ;//连续3S没有按键按下,输入超时 SysReturnTime = 0 ; LCD1602_DispStr ( 1 , 0 , "INPUT NUM:[" ); LCD1602_DispStr ( 1 , 15 , "]" ); input_number = input_number * 10 + num ; if ( input_number > 1999 ) { input_number = 0; } itoa4 ( input_number ); LCD1602_DispStr ( 1 , 11 , ( INT8U * ) bcd_number ); } /***************************************************************************************************** - 函数说明:指定文件夹以及文件名操作 - 隶属模块:内部 - 参数说明:无 - 返回说明: - 注 : *****************************************************************************************************/ void PointPlayFolderNum ( INT8U num ) { static INT8U InputCnt = 0 ; DBG ( "MSG_input_num\n" ) ; if ( 0 == InputNumCnt ) { InputCnt = 5 ; LCD1602_Clear(); LCD1602_DispStr ( 0 , 0 , "FOLD NUM[ ]" ); //指定的文件夹 LCD1602_DispStr ( 1 , 0 , "FILE NUM[ ]" ); //指定的文件名 } InputNumCnt = 30 ;//连续3S没有按键按下,输入超时 SysReturnTime = 0 ; if ( InputCnt > 3 ) { FolderNum = FolderNum * 10 + num ; if ( FileNum > 99 ) { FileNum = 0; } itoa2 ( FolderNum ); LCD1602_DispStr ( 0 , 9 , ( INT8U * ) bcd_number ); } else { FileNum = FileNum * 10 + num ; if ( FileNum >= 255 ) { FileNum = 0; } itoa3 ( FileNum ); LCD1602_DispStr ( 1 , 9 , ( INT8U * ) bcd_number ); } if ( ( --InputCnt ) == 0 ) { InputCnt = 0 ; InputNumCnt = 10 ; } } /***************************************************************************************************** - 函数说明:消息处理 - 隶属模块:内部 - 参数说明:无 - 返回说明: - 注 : *****************************************************************************************************/ void MSG_Task ( void ) { #if xy5200_Uart2_def static INT8U msg ; msg = app_get_msg(); switch ( msg ) { /***************************************************** 显示模块返回的错误 *****************************************************/ case MSG_RECV_ERROR: DispModlueError ( _ErrorStatus ); SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 返回初始状态 *****************************************************/ case MSG_RETURN_INIT: RAM_Init() ; LCD1602_Init(); DBG ( "MSG_RETURN_INIT\n" ) ; break ; /***************************************************** 设备插入 *****************************************************/ case MSG_UDISK_IN: LCD1602_ClearLine ( 1 ); LCD1602_DispStr ( 1 , 0 , "_UDISK IN" ); PlayDevice = PLAYDEVICE_UDISK ; OnlineDevice |= BIT ( _UDISK ) ; SysReturnTime = SYSRETURNTIME ; break ; case MSG_TF_IN: LCD1602_ClearLine ( 1 ); LCD1602_DispStr ( 1 , 0 , "TF IN" ); PlayDevice = PLAYDEVICE_TFCARD ; OnlineDevice |= BIT ( _TFCARD ) ; SysReturnTime = SYSRETURNTIME ; break ; case MSG_PC_IN: LCD1602_ClearLine ( 1 ); LCD1602_DispStr ( 1 , 0 , "_PC IN" ); PlayDevice = PLAYDEVICE_PC ; OnlineDevice |= BIT ( _PC ) ; SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 设备拔出 *****************************************************/ case MSG_UDISK_OUT: LCD1602_ClearLine ( 1 ); LCD1602_DispStr ( 1 , 0 , "_UDISK OUT" ); OnlineDevice &= ~ BIT ( _UDISK ) ; GotoNextDevice ( _UDISK ) ; SysReturnTime = SYSRETURNTIME ; break ; case MSG_TF_OUT: LCD1602_ClearLine ( 1 ); LCD1602_DispStr ( 1 , 0 , "TF OUT" ); OnlineDevice &= ~ BIT ( _TFCARD ) ; GotoNextDevice ( _TFCARD ) ; SysReturnTime = SYSRETURNTIME ; break ; case MSG_PC_OUT: LCD1602_ClearLine ( 1 ); LCD1602_DispStr ( 1 , 0 , "_PC OUT" ); OnlineDevice &= ~ BIT ( _PC ) ; GotoNextDevice ( _PC ) ; SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 返回初始状态 *****************************************************/ case MSG_DELAY_TIME: DelayTime = 6 ; break ; /***************************************************** 查询参数无应答 *****************************************************/ case MSG_QUERY_ERROR: LCD1602_Clear() ; LCD1602_DispStr ( 1 , 0 , "ERROR CMD" ); SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 查询歌曲总数 *****************************************************/ case MSG_QUERY_NUMTOTAL: LCD1602_Clear() ; LCD1602_DispStr ( 0 , 0 , "QUERY TOTAL NUM " ); #if 1 if ( PlayDevice == PLAYDEVICE_SLEEP ) { LCD1602_Clear() ; LCD1602_DispStr ( 1 , 0 , "MOD IN SLEEP " ); QueryACKTime = QUERYACKTIME ;//等待应答计时 break; } #endif if ( PlayDevice == PLAYDEVICE_UDISK ) { Uart_SendCMD ( UARTQUR_UDISK_TOTAL , FEEDBACK , 0 ); } else if ( PlayDevice == PLAYDEVICE_TFCARD ) { Uart_SendCMD ( UARTQUR_TF_TOTAL , FEEDBACK , 0 ); } else if ( PlayDevice == PLAYDEVICE_FLASH ) { Uart_SendCMD ( UARTQUR_FLASH_TOTAL , FEEDBACK , 0 ); } LCD1602_DispStr ( 1 , 0 , "WAIT RETURN ...." ); QueryACKTime = QUERYACKTIME ;//等待应答计时 break ; /***************************************************** 显示查询当前播放设备曲目总数 *****************************************************/ case MSG_RETURN_NUMTOTAL: QueryACKTime = 0 ;//清除等待超时 LCD1602_Clear() ; LCD1602_DispStr ( 0 , 0 , "DEVICE: " ); LCD1602_DispStr ( 1 , 0 , "TOTAL NUM: " ); if ( PlayDevice == PLAYDEVICE_UDISK ) { CurDevTotal = UDiskTotal ; LCD1602_DispStr ( 0 , 8 , "_UDISK" ); } else if ( PlayDevice == PLAYDEVICE_TFCARD ) { CurDevTotal = TFTotal ; LCD1602_DispStr ( 0 , 8 , "TF" ); } else if ( PlayDevice == PLAYDEVICE_FLASH ) { CurDevTotal = FlashTotal ; LCD1602_DispStr ( 0 , 8 , "_FLASH" ); } itoa4 ( CurDevTotal ); LCD1602_DispStr ( 1 , 11 , ( INT8U * ) bcd_number ); break ; /***************************************************** 指定文件夹曲目数查询 *****************************************************/ case MSG_QUERY_CURNUM: LCD1602_Clear() ; LCD1602_DispStr ( 0 , 0 , "QUERY CUR NUM " ); if ( PlayDevice == PLAYDEVICE_SLEEP ) { LCD1602_Clear() ; LCD1602_DispStr ( 1 , 0 , "MOD IN SLEEP " ); QueryACKTime = QUERYACKTIME ;//等待应答计时 break; } if ( PlayDevice == PLAYDEVICE_UDISK ) { Uart_SendCMD ( UARTQUR_UDISK_FILE , FEEDBACK , 0 ); } else if ( PlayDevice == PLAYDEVICE_TFCARD ) { Uart_SendCMD ( UARTQUR_TF_FILE , FEEDBACK , 0 ); } else if ( PlayDevice == PLAYDEVICE_FLASH ) { Uart_SendCMD ( UARTQUR_FLASH_FILE, FEEDBACK , 0 ); } LCD1602_DispStr ( 1 , 0 , "WAIT RETURN ...." ); QueryACKTime = QUERYACKTIME ;//等待应答计时 break ; /***************************************************** 显示查询当前播放曲目 *****************************************************/ case MSG_RETURN_CURNUM: QueryACKTime = 0 ;//清除等待超时 LCD1602_Clear() ; LCD1602_DispStr ( 0 , 0 , "DEVICE: " ); LCD1602_DispStr ( 1 , 0 , "CUR UM: " ); if ( PlayDevice == PLAYDEVICE_UDISK ) { CurDevNUM = UDiskCurFile ; LCD1602_DispStr ( 0 , 8 , "_UDISK" ); } else if ( PlayDevice == PLAYDEVICE_TFCARD ) { CurDevNUM = TFCurFile ; LCD1602_DispStr ( 0 , 8 , "TF" ); } else if ( PlayDevice == PLAYDEVICE_FLASH ) { CurDevNUM = FlashCurFile ; LCD1602_DispStr ( 0 , 8 , "_FLASH" ); } itoa4 ( CurDevNUM ); LCD1602_DispStr ( 1 , 11 , ( INT8U * ) bcd_number ); SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 查询当前文件数 *****************************************************/ case MSG_QUERY_FILENUM: LCD1602_Clear() ; LCD1602_DispStr ( 0 , 0 , "QUERY CUR FILE " ); LCD1602_DispStr ( 1 , 0 , "WAIT RETURN ...." ); Uart_SendCMD ( UARTQUR_FILE_NUM , FEEDBACK , input_cur_fold ); input_cur_fold = 0 ; QueryACKTime = QUERYACKTIME ;//等待应答计时 break; /***************************************************** 显示当前文件数(0-999) *****************************************************/ case MSG_RETURN_FILENUM: QueryACKTime = 0 ;//清除等待超时 LCD1602_Clear() ; LCD1602_DispStr ( 1 , 0 , "FILE: " ); itoa3 ( CurFileNum ); LCD1602_DispStr ( 1 , 11 , ( INT8U * ) bcd_number ); SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 查询当前音量 *****************************************************/ case MSG_QUERY_VOL: LCD1602_Clear() ; LCD1602_DispStr ( 0 , 0 , "QUERY CUR VOL " ); #if 0 if ( PlayDevice == PLAYDEVICE_SLEEP ) { LCD1602_DispStr ( 1 , 0 , "MOD IN SLEEP " ); } else #endif { LCD1602_DispStr ( 1 , 0 , "WAIT RETURN ...." ); Uart_SendCMD ( UARTQUR_VOL , FEEDBACK , 0 ); } QueryACKTime = QUERYACKTIME ;//等待应答计时 break ; /***************************************************** 显示查询当前音量的数据 *****************************************************/ case MSG_RETURN_VOL: QueryACKTime = 0 ;//清除等待超时 LCD1602_Clear() ; LCD1602_DispStr ( 1 , 0 , "VOL: " ); itoa2 ( input_vol ); LCD1602_DispStr ( 1 , 11 , ( INT8U * ) bcd_number ); SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 查询当前EQ *****************************************************/ case MSG_QUERY_EQ: LCD1602_Clear() ; LCD1602_DispStr ( 0 , 0 , "QUERY CUR EQ " ); #if 1 if ( PlayDevice == PLAYDEVICE_SLEEP ) { LCD1602_DispStr ( 1 , 0 , "MOD IN SLEEP " ); } else #endif { LCD1602_DispStr ( 1 , 0 , "WAIT RETURN ...." ); Uart_SendCMD ( UARTQUR_EQ , FEEDBACK , 0 ); } QueryACKTime = QUERYACKTIME ;//等待应答计时 break ; /***************************************************** 显示查询当前EQ的数据 *****************************************************/ case MSG_RETURN_EQ: QueryACKTime = 0 ;//清除等待超时 LCD1602_Clear() ; Disp_PlayEQ ( CurrentEQ ); SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 查询当前播放模式 *****************************************************/ case MSG_QUERY_PLAYMODE: LCD1602_Clear() ; LCD1602_DispStr ( 0 , 0 , "QUERY PLAY MODE " ); if ( PlayDevice == PLAYDEVICE_SLEEP ) { LCD1602_DispStr ( 1 , 0 , "MOD IN SLEEP " ); } else { LCD1602_DispStr ( 1 , 0 , "WAIT RETURN ...." ); Uart_SendCMD ( UARTQUR_PLAYMODE , FEEDBACK , 0 ); } QueryACKTime = QUERYACKTIME ;//等待应答计时 break ; /***************************************************** 显示查询当前播放模式的数据 *****************************************************/ case MSG_RETURN_PLAYMODE: QueryACKTime = 0 ;//清除等待超时 LCD1602_Clear() ; Disp_PlayMode ( PlayMode ); SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 显示模块初始化发出的数据 *****************************************************/ case MSG_RETURN_MINIT: LCD1602_Clear() ; LCD1602_DispStr ( 0 , 0 , "RECV MODL OK " ); LCD1602_DispStr ( 1 , 0 , "ONLINE DEV: " ); Disp_OnlineDevice ( OnlineDevice ); GoInitDevice ( OnlineDevice ) ; System_Status = SYS_STATUS_WORK ; SysReturnTime = SYSRETURNTIME ;//定义3S的时候等待模块初始化完成 break ; #if 0 /***************************************************** 切换工作模式 *****************************************************/ case MSG_TRIG_MODE: TrigEnable = !TrigEnable ; LCD1602_ClearLine ( 1 ); if ( TrigEnable == PLAYDEVICE_UDISK ) { LCD1602_DispStr ( 1 , 0 , "PLAYM : TRIG" ); //1:触发模式 } else { LCD1602_DispStr ( 1 , 0 , "PLAYM : CONT" ); //0:连续模式 } SysReturnTime = SYSRETURNTIME ; break ; #endif /***************************************************** 切换当前播放设备 *****************************************************/ case MSG_NEXT_WORKMODE: LCD1602_Clear() ; LCD1602_DispStr ( 0 , 0 , "PLAY DEVICE SET" ); PlayDevice ++ ; if ( PlayDevice == PLAYDEVICE_MAX ) { PlayDevice = PLAYDEVICE_UDISK; } ChangeDevice ( PlayDevice ); Disp_PlayDevice ( PlayDevice ); Uart_SendCMD ( UARTCMD_PLAYDEVICE , FEEDBACK , PlayDevice ); SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** EQ *****************************************************/ case MSG_MUSIC_NEXT_EQ: LCD1602_Clear() ; LCD1602_DispStr ( 0 , 0 , "EQ SET" ); CurrentEQ ++ ; if ( CurrentEQ == EQ_BASS ) { CurrentEQ = EQ_NORMAL; } Uart_SendCMD ( UARTCMD_EQ_POINT , FEEDBACK , CurrentEQ ); Disp_PlayEQ ( CurrentEQ ); SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 播放 *****************************************************/ case MSG_MUSIC_PLAY: Uart_SendCMD ( UARTCMD_MUSIC_PLAY , FEEDBACK , 0 ); DBG ( "MUSIC_PLAY\n" ) ; LCD1602_ClearLine ( 1 ); LCD1602_DispStr ( 1 , 0 , "MUSIC_PLAY" ); SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 暂停 *****************************************************/ case MSG_MUSIC_PAUSE: Uart_SendCMD ( UARTCMD_MUSIC_PAUSE , FEEDBACK , 0 ); DBG ( "MUSIC_PAUSE\n" ) ; LCD1602_ClearLine ( 1 ); LCD1602_DispStr ( 1 , 0 , "MUSIC_PAUSE" ); SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 下一曲 *****************************************************/ case MSG_MUSIC_NEXT_FILE: if ( input_vol > 0 ) { input_vol -- ; } Uart_SendCMD ( UARTCMD_NEXT_FILE , FEEDBACK , 0 ); DBG ( "MSG_MUSIC_NEXT_FILE\n" ) ; LCD1602_ClearLine ( 1 ); LCD1602_DispStr ( 1 , 0 , "NEXT FILE PLAY" ); SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 上一曲 *****************************************************/ case MSG_MUSIC_PREV_FILE: Uart_SendCMD ( UARTCMD_PREV_FILE , FEEDBACK , 0 ); DBG ( "MSG_MUSIC_PREV_FILE\n" ) ; LCD1602_ClearLine ( 1 ); LCD1602_DispStr ( 1 , 0 , "PREV FILE PLAY" ); SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 循环播放模式设置 *****************************************************/ case MSG_PLAYALL: PlayAllFlag = !PlayAllFlag ; LCD1602_ClearLine ( 1 ); if ( PlayAllFlag ) { LCD1602_DispStr ( 1 , 0 , "ALL PLAY ON " ); put_msg_lifo ( MSG_PLAYALL_ON ); } else { LCD1602_DispStr ( 1 , 0 , "ALL PLAY OFF" ); put_msg_lifo ( MSG_PLAYALL_OFF ); } break ; /***************************************************** 循环播放模式--开 *****************************************************/ case MSG_PLAYALL_ON: Uart_SendCMD ( UARTCMD_PLAYALL , FEEDBACK , 0x01 ); DBG ( "MSG_MUSIC_PREV_FILE\n" ) ; SysReturnTime = SYSRETURNTIME ; break ; /***************************************************** 循环播放模式--关 *****************************************************/ case MSG_PLAYALL_OFF: Uart_SendCMD ( UARTCMD_PLAYALL , FEEDBACK , 0 ); DBG ( "MSG_MUSIC_PREV_FILE\n" ) ; SysReturnTime = SYSRETURNTIME ; break ; /****************************************************** 音量调节 *****************************************************/ case MSG_VOL_UP: input_vol++; input_vol++; case MSG_VOL_DOWN: input_vol--; if ( input_vol == 255 ) { input_vol = 0 ; } else if ( input_vol > MAX_MAIN_VOL ) { input_vol = MAX_MAIN_VOL ; } Uart_SendCMD ( UARTCMD_VOL_POINT , FEEDBACK , input_vol ); LCD1602_ClearLine ( 1 ); LCD1602_DispStr ( 1 , 0 , "CUR VOL[ ]" ); SysReturnTime = SYSRETURNTIME ; itoa2 ( input_vol ); LCD1602_DispStr ( 1 , 8 , ( INT8U * ) bcd_number ); break ; /***************************************************** 输入超时处理 *****************************************************/ case MSG_INPUT_TIMEOUT: DBG ( "MSG_INPUT_TIMEOUT\n" ) ; put_msg_lifo ( MSG_MUSIC_PLAY_NEW_FILE ); break; /***************************************************** 选择指定的曲目 *****************************************************/ case MSG_MUSIC_PLAY_NEW_FILE: DBG ( "MSG_MUSIC_PLAY_NEW_FILE\n" ) ; LCD1602_Clear() ; if ( PlayDevice == PLAYDEVICE_SLEEP ) { LCD1602_DispStr ( 1 , 0 , "MOD IN SLEEP " ); } else { if ( POINTNUM_ONE == PointFunc ) //指定单曲播放 { Uart_SendCMD ( UARTCMD_NUM_POINT , FEEDBACK , input_number ); LCD1602_DispStr ( 1 , 0 , "SEND ONE NUM " ); } else if ( POINTNUM_LOOP == PointFunc ) //指定单曲循环播放 { Uart_SendCMD ( UARTCMD_LOOP_PLAY , FEEDBACK , input_number ); LCD1602_DispStr ( 1 , 0 , "SEND LOOP NUM " ); } else if ( POINTNUM_FOLDER == PointFunc ) //指定文件夹和文件 { input_number = ( ( INT16U ) ( FolderNum ) << 8 ) | FileNum ; FileNum = 0 ; FolderNum = 0 ; Uart_SendCMD ( UARTCMD_MUSIC_FOLDER , FEEDBACK , input_number ); LCD1602_DispStr ( 1 , 0 , "FOLD FILE POINT" ); } } input_number = 0 ; SysReturnTime = SYSRETURNTIME ; break; /***************************************************** 随机播放 *****************************************************/ case MSG_PLAY_RANDOM: Uart_SendCMD ( UARTCMD_PLAY_RANDOM_ALL , FEEDBACK , input_number ); input_number = 0; LCD1602_ClearLine ( 1 ); LCD1602_DispStr ( 1 , 0 , "PLAY RANDOM" ); SysReturnTime = SYSRETURNTIME ; break; /***************************************************** 指定文件夹以及指定文件名 *****************************************************/ case MSG_SET_PLAYMODE: if ( ( ++PointFunc ) == POINTNUM_MAX ) { PointFunc = POINTNUM_ONE ; } SysReturnTime = SYSRETURNTIME ; LCD1602_ClearLine ( 1 ); if ( PointFunc == POINTNUM_ONE ) { LCD1602_DispStr ( 1 , 0 , "POINT ONE " ); } else if ( PointFunc == POINTNUM_LOOP ) { LCD1602_DispStr ( 1 , 0 , "POINT LOOP " ); } else if ( PointFunc == POINTNUM_FOLDER ) { LCD1602_DispStr ( 1 , 0 , "POINT FOLDER " ); } break; /***************************************************** 切换是否需要反馈 *****************************************************/ case MSG_UART_ACK: LCD1602_ClearLine ( 1 ); if ( FEEDBACK ) { FEEDBACK = 0 ; LCD1602_DispStr ( 1 , 0 , "NO NEED ACK" ); } else { FEEDBACK = 1 ; LCD1602_DispStr ( 1 , 0 , "NEED ACK" ); } SysReturnTime = SYSRETURNTIME ; break; /***************************************************** 数字键操作,用于数字选曲 和文件夹指定,文件名指定 *****************************************************/ case MSG_0: case MSG_1: case MSG_2: case MSG_3: case MSG_4: case MSG_5: case MSG_6: case MSG_7: case MSG_8: case MSG_9: if ( POINTNUM_FOLDER == PointFunc ) //指定文件夹的状态 { PointPlayFolderNum ( msg ); } else { PointPlayNum ( msg ) ; } break ; } #endif } /***************************************************************************************************** - 函数说明:播放指示灯[100ms处理一次] - 隶属模块:内部 - 参数说明:无 - 返回说明: - 注 : *****************************************************************************************************/ void Indicator_Scan ( void ) { static INT8U flash_cnt; switch ( PlayledStatus ) { case SET_PLAYLED_ON: PLAYLED_ON; break; case SET_PLAYLED_OFF: PLAYLED_OFF; break; case SET_PLAYLED_100MS_FLASH: PLAYLED_FLASH; break; case SET_PLAYLED_500MS_FLASH: if ( ++flash_cnt > 4 ) { flash_cnt = 0; PLAYLED_FLASH; } break; case SET_PLAYLED_900MS_ON_100MS_OFF: if ( ++flash_cnt > 4 ) { flash_cnt = 0; PLAYLED_ON; } else { PLAYLED_OFF; } break; } } /***************************************************************************************************** - 函数说明:定时[100ms运行一次] - 隶属模块:内部 - 参数说明:无 - 返回说明: - 注 : *****************************************************************************************************/ void Time_Task ( void ) { #if xy5200_Uart2_def if ( ( DelayTime ) && ( ( --DelayTime ) == 0 ) ) { put_msg_lifo ( MSG_MUSIC_PLAY ); ; // } if ( ( UartRecv_100Ms ) && ( ( --UartRecv_100Ms ) == 0 ) ) { UartRecvStatus = UART_RECV_IDLE ;//串口接收限定时间未接收完毕 } if ( ( PlayledCnt ) && ( ( --PlayledCnt ) == 0 ) ) { PlayledStatus = SET_PLAYLED_OFF ; } if ( ( InputNumCnt ) && ( ( --InputNumCnt ) == 0 ) ) { put_msg_lifo ( MSG_INPUT_TIMEOUT ); } if ( ( SysReturnTime ) && ( ( --SysReturnTime ) == 0 ) ) { if ( System_Status == SYS_STATUS_INIT ) { put_msg_lifo ( MSG_RETURN_INIT ); } else if ( System_Status == SYS_STATUS_WORK ) { put_msg_lifo ( MSG_RETURN_INIT ); } } if ( ( UartRecvACK ) && ( ( --UartRecvACK ) == 0 ) ) //没有收到应答 { if ( FEEDBACK ) { PlayledCnt = PLAYLEDCNT ; PlayledStatus = SET_PLAYLED_100MS_FLASH ; } } if ( ( QueryACKTime ) && ( ( --QueryACKTime ) == 0 ) ) //没有收到应答 { if ( PlayDevice == PLAYDEVICE_NULL ) { SysReturnTime = 1 ; } else { put_msg_lifo ( MSG_QUERY_ERROR ); } } #endif }