/* 灯光处理线程 */
void LED_handleThread(void *inContext)
{
    u8  ledValue = 0;
    u8  playLedTimes = 0; //无播放音乐时,演示LED次数

    printf( "This is LED_handleThread.\r\n");
    LED_openRGB(0, 0, 0); //初始化关闭所有灯
    LED_closeRGB();

    while(mico_rtos_get_semaphore(&cupTimeObj.playLed_sem, MICO_WAIT_FOREVER) == kNoErr)
    {

        while(mico_rtos_get_semaphore(&cupTimeObj.stopLed_sem, MICO_NO_WAIT) != kNoErr \
                && cupTimeObj.playMode != PLAY_ONLY_MP3)
        {
            printf("Playing led ........\r\n");
#if 0
            for (ledValue = 0; ledValue < 100; ledValue++)
            {
                LED_openRGB(100 - ledValue, ledValue, ledValue);
                mico_thread_msleep(15);
            }
            mico_thread_msleep(100);

            for (ledValue = 100; ledValue > 0; ledValue--)
            {
                LED_openRGB(100 - ledValue, ledValue, ledValue);
                mico_thread_msleep(15);
            }
            mico_thread_msleep(100);
#else
            /* 秒闪 */
            LED_openRGB(50, 50, 50);
            mico_thread_msleep(500);
            LED_openRGB(0, 0, 0);
            mico_thread_msleep(500);
#endif

            /* 只有LED模式时,LED只演示三次 */
            if (cupTimeObj.playMode == PLAY_ONLY_LED)
            {
                playLedTimes++;
                if (playLedTimes == 3 || KEY_getValue() == KEY_UP)
                {
                    playLedTimes = 0;
                    break;
                }
            }
        }

        LED_openRGB(0, 0, 0);
        LED_closeRGB();

    }
}
/* user main function, called by AppFramework after system init done && wifi
 * station on in user_main thread.
 */
OSStatus user_main( app_context_t * const app_context )
{
    OSStatus err = kNoErr;
    int time_sencond = 50*1000;  /* 60s */


    require(app_context, exit);
    net_init(app_context);

    /* Create a new thread */

    err = mico_rtos_create_thread(NULL, MICO_APPLICATION_PRIORITY, "RGB_LED", LED_handleThread, 1024, NULL );
    require_noerr_string( err, exit, "ERROR: Unable to start the RGB LED thread ." );

    err = mico_rtos_create_thread(NULL, MICO_APPLICATION_PRIORITY, "MP3_PLAY", MP3_handleThread, 1024, NULL );
    require_noerr_string( err, exit, "ERROR: Unable to start the MP3 PLAY thread" );

    err = mico_rtos_create_thread(NULL, MICO_APPLICATION_PRIORITY, "BAT_DETECT", BAT_handleThread, 500, NULL );
    require_noerr_string( err, exit, "ERROR: Unable to start the BAT DETECT thread ." );

    KEY_Init(KEY_irq_handler); //按键初始化

    mico_rtos_init_semaphore(&cupTimeObj.playMp3_sem, 1);  //信号量初始化
    mico_rtos_init_semaphore(&cupTimeObj.playLed_sem, 1);
    mico_rtos_init_semaphore(&cupTimeObj.stopLed_sem, 1);

    err = mico_init_timer(&cupTimeObj.cup_timer, time_sencond, cup_timer_timeout_handler, (void *)&cupTimeObj);
    cupTimeObj.drinkTime = 1;
    cupTimeObj.playMode = PLAY_MP3_LED;
    if (KEY_getValue() == KEY_DOWN)
    {
        TIMER_start(); //启动定时喝水
    }

    while(1)
    {
        // printf("this is main thread.\r\n");
        //net_test(app_context);
        mico_thread_sleep(10);
    }

exit:
    if(kNoErr != err) {
        printf("ERROR: user_main thread exit with err=%d", err);
    }
    mico_rtos_delete_thread(NULL);
    return kNoErr;
}
//提杯和放杯处理函数
static void  KEY_irq_handler( void* arg )
{
    (void)(arg);

    if ( KEY_getValue() == KEY_UP)
    {
        printf("key up!\r\n");
        TIMER_stop();
    }
    else
    {
        TIMER_start();
        printf("key down!\r\n");
    }

}
static void health_thread(void* arg)
{
    app_context_t *app_context = (app_context_t *)arg;
    user_log_trace();
    EKey ot;

#if 0
    u8 cup_status_temp, cup_status;

    cup_status = cup_status_temp = KEY_getValue();
#endif
  
    /* thread loop */
    while(1){
#if 1
        ot = GetOuterTriggerStatus();
        if(OUTERTRIGGER_PICKUP == ot) {
            SetDrinkPutStatus(true);

            if(IsDrinkPutStatusChanged()) {
                SendJsonBool(app_context, "HEALTH-1/DrinkPutStatus", GetDrinkPutStatus());
                if(!NoDisturbing() && IsPickupSetting()) {
                    u8 type;
                    u16 track_id;
                    
                    FindPickupTrack(&type, &track_id);
                    AaSysLogPrint(LOGLEVEL_DBG, "track type %d index %d will be played", type, track_id);
                    // stop last track before play new song
                    SendQuitReq();
                    SendPlayReq(type, track_id);
                }
            }
        }
        else if(OUTERTRIGGER_PUTDOWN == ot) {
            SetDrinkPutStatus(false);

            if(IsDrinkPutStatusChanged()) {
                SendJsonBool(app_context, "HEALTH-1/DrinkPutStatus", GetDrinkPutStatus());
                if(!NoDisturbing() && IsPutDownSetting()) {
                    startPutDownTimerGroup();
                }
            }
        }

        mico_thread_msleep(100);
#elif
        if(mico_rtos_get_semaphore(&semaphore_getup, CHECK_CUPSTATUS_TIMEOUT)) {
            // key fliter
            cup_status_temp = KEY_getValue();
            if(cup_status != cup_status_temp) {
                cup_status = cup_status_temp;
                
                SetDrinkStamp(true);
                
                if(!NoDisturbing() && IsPickupSetting()) {
                    PlayingSong(FindPickupTrack());
                }
            }
        }

        if(mico_rtos_get_semaphore(&semaphore_putdown, CHECK_CUPSTATUS_TIMEOUT)) {
            // key fliter
            cup_status_temp = KEY_getValue();
            if(cup_status != cup_status_temp) {
                cup_status = cup_status_temp;
                
                SetPutDownStamp(true);

                if(!NoDisturbing() && IsPutDownSetting()) {
                    startPutDownTimerGroup();
                }
            }
        }
#endif
    }
}
//播放一曲指定的歌曲	
//pname:歌曲路径+名字
//返回值:0,正常播放完成
//		 1,下一曲
//       2,上一曲
//       0XFF,出现错误了
u8 MP3_playSong(const char *pName)
{	 
 	FIL* fmp3;
	u16 br;
	u8 res,rval;	  
	u8 *databuf;	   		   
	u16 i=0; 
	u8 key;  	    
	//static u8 pause=0;		//暂停标志 
    static u8 lastVol = 0;  //上一次音量
    //u8 j = 0;
	rval=0;	    
	fmp3=(FIL*)malloc(sizeof(FIL));	//申请内存
	databuf=(u8*)malloc(READ_MP3_SIZE);		//开辟4096字节的内存区域
	if(databuf==NULL||fmp3==NULL)rval=0XFF ;//内存申请失败.

	if(rval==0)
	{
        VS_HD_Reset();
        VS_Soft_Reset();
        
        lastVol = vsset.mvol;
        mp3_vol_show((vsset.mvol-100)/5);	//音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30  
        
	  	VS_Restart_Play();  					//重启播放 
		VS_Set_All();        					//设置音量等信息 			 
		VS_Reset_DecodeTime();					//复位解码时间 	  
		/*res=f_typetell(pname);	 	 			//得到文件后缀	 			  	 						 
		if(res==0x4c)//如果是flac,加载patch
		{	
			VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);
		} */ 				 		   		 						  
		res=f_open(fmp3,(const TCHAR*)pName,FA_READ);//打开文件

		//printf("sram :%d",mem_perused(0));
		if(res==0)//打开成功.
		{ 
			VS_SPI_SpeedHigh();	//高速						   
			while(rval==0)
			{
              
				res=f_read(fmp3,databuf,READ_MP3_SIZE,(UINT*)&br);//读出4096个字节  
              
				i=0;   

                if (lastVol != vsset.mvol)  //检测音量是否重新配置
                {
                    VS_Set_Vol(vsset.mvol);
                    lastVol = vsset.mvol; 
                    //保存到配置文件
                }      
#if 1
                
				do//主播放循环
			    {  	
                    
					if((VS_Send_MusicData(databuf+i)==0))//给VS10XX发送音频数据
					{
						i+=32;
					}
                    else   
					{
						key=KEY_getValue(); 
						switch(key)
						{
							case KEY_UP:
                                printf("+++++++++++++++++++++++++++key up\r\n");
								rval=KEY_UP;		//跳出
								break;
							default:
								break;
						}
						//mp3_msg_show(fmp3->fsize);//显示信息	
                       
					}	  
                    
				}while(i<READ_MP3_SIZE);//循环发送4096个字节 

#endif            
				if(br!=READ_MP3_SIZE||res!=0)
				{
					rval=KEY_UP;
					break;//读完了.	
				} 							 
			}
			f_close(fmp3);
		}else rval=0XFF;//出现错误	   	  
	}	
    
    if (databuf != NULL)
      free(databuf);	
    
    if (fmp3 != NULL)
      free(fmp3);
    
	return rval;	  	 		  	    
}