/* 灯光处理线程 */ 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; }