#include "includes.h" #include "osi_api.h" #define APP_IDLE_TIME 3 //Èç¹ûPOCÒÑÐݱ‹APPûÓвÙ×÷Ò»¶¨ÃëÊýºóÐÝÃß int keyNum=0; APP_DEF sutApp; void plusKeyNum(void){ keyNum++; } static void appDataInit(void){ memset((unsigned char *)&sutApp, 0, sizeof(APP_DEF)); sutApp.updateStatusBar=1; sutApp.g_iBAT=-1; sutApp.copstype=-1; sutApp.pcant=4; sutApp.enableKey=1; appSleepCtl(ASLEEP_POC, 1); appSleepCtl(ASLEEP_LCD, 1); readInfoNow(); sysIniRead(); ReadXbFile(); ReadLeaderFile(); #ifdef ENABLE_DEBUG takeNoteOfSerType(); #endif } void dataInit(void){ appDataInit(); pocDataInit(); gpsDataInit(); uiDataInit(); } static void ledsProCtl(void){ if(sutApp.gtMode!=0) return; if(0==sutPocStatus.logined) uioStatusSet(UIO_INDOFFLINE); else if(sutPocStatus.spk>0)uioStatusSet(UIO_INDRX); else if(sutPocStatus.mic>0 )uioStatusSet(UIO_INDTX); else uioStatusSet(UIO_INDONLINE); } static void adcRead(unsigned int interval); char isKeyPress(void){ if(keyNum) return keyNum--; else return 0; } /*APPÐÝÃß´¦Àí½Ó¿Ú ctlType, ²Ù×÷¶ÔÏó status,²Ù×÷Öµ£¬0 Çå³ý else ÉèÖà */ void appSleepCtl(ASLEEP_ENUM ctlType, char status){ if(status==0) sutApp.appSleepStatus &= ~(1<=(APP_IDLE_TIME*1000/APP_SUB_DIV_TIME)){ idleCnt=0; return 1; }else return 0; } void usbCmdHandler(const char *data,unsigned int length){ static char buf[256]; static int len=0; static char lach; char ch; int i; if(sutApp.authReady==0){ authRecvPro(data, length); return; } for(i=0;i=2 && j>w){//ÉÏÒ»´ÎÖÁÉÙÁ½¸ö¼ü°´Ï£¬ÏÖÔÚ·¢Éú±ä»¯,ÖÁÉÙÒ»¸ö¼ü·Å¿ªÁË£¬È«¼üÇå³ý lkey=0; clearKeyValue(); } lkey=key; } unsigned char keyInArow=0; void keyCheck(unsigned short keyStatus){ static unsigned short lkey=0; static unsigned char keyCtl=0,keyCnt=0; unsigned char keyType,needSendKey=0; assistantCheck(keyStatus); if(keyStatus==KS_ALL_IDLE){ keyType=0; if(keyCtl==1){ keyCtl=0; needSendKey=1; } }else{ keyType=1; if(lkey != keyStatus) keyCtl=0;//Öµ±äÄä if(keyCtl==0){ lkey=keyStatus; keyCtl=1; keyCnt=0; needSendKey=1; }else if(keyInArow!=0){//ÊÇ·ñÊä³ö³ÖÐø‚ž if(++keyCnt>=(1000/KEY_TIMER_TICK)){//ÿÃë²úÉú³ÖÐø‚ž keyCnt=0; needSendKey=1; } } } if(needSendKey){ if(sutApp.enableKey!=0)//ÑÓʱÆڼ䲻¼ì²â°´ïÍ keySendEvent(lkey,keyType); } } bool lcdBackLightStatus=false; void pwrDetRead(char type){ static char cnt=0; if(type==0){ cnt++; if(cnt==3){ sutApp.waitEscReleased=1; uISetNextStatus(UIS_MENU_SHUT_PWR); } }else{ sutApp.waitEscReleased=0; cnt=0; } #if 0 if(sutUIstatus.Status == UIS_MENU_SHUT_PWR) return;//¹Ø»ú½çÃæ²»´¦Àí if(type==0) return;//·Å¿ªÊ±´¦Àí //´¦Àí°´¶¥²¿¼üÇл»UI uiTimeOutToStandby(1,APP_SUB_DIV_TIME); //´¦Àí°´¶¥²¿¼üÇл»±³¹â if(sutUIstatus.Status != UIS_STANDBY) return;//´ý»úÒ³Ãæʱ²Å·´×ª±³¹â if(lcdBackLightStatus==false) backLightReset(); else lcdBackLightApi(0); #endif } void lcdBackLightApi(char value){ CTL_LCD_BL(value); if(value==0) lcdBackLightStatus=false; else lcdBackLightStatus=true; } static void lockProcess(void){ if(sutApp.keyLock==0){ sutApp.keyLock=1; appSleepCtl(ASLEEP_GGROUP, 0); appSleepCtl(ASLEEP_GUSER, 0); uISetNextStatus(UIS_STANDBY); }else{ sutApp.keyLock=0; sutApp.lockShow=0; } } void keyToneStart(void){ if(newPara.KeySound==0) return; sutPocStatus.beep=1; paControl(true); if(ToneThreadPtr!=NULL)threadSendEvent(ToneThreadPtr,OHPOC_EVENT_MAIN,NULL,NULL,NULL);//0702 } void quickUiSwitch(int uistatus){ if(true==isUiSwitchReady()) return; uISetNextStatus(uistatus); getStackStruct()->FastUiChange=1; } /*½øÈëGTģʽ*/ static void enterGTMode(void){ sutApp.gtMode=1; uioStatusSet(UIO_INDGT); paControl(true);//GTϳ£¿ªÀ®°È LSAPI_OSI_ThreadSleep(200); MSG_WARN(1, "Enter GT Mode"); } void micPttHandler(char status){ keySendEvent(MKEY_VALUE_MIC_PTT,status); } void quickUiSel(char func01_02){ switch(func01_02){ case 0: quickUiSwitch(UIS_MENU_BLE_ENABLE); break; case 1: quickUiSwitch(UIS_MENU_XINBIAO_SENDMODE); break; case 2: quickUiSwitch(UIS_MENU_XINBIAO_INFO); break; case 3: quickUiSwitch(UIS_MENU_GROUP_SEL); break; case 4: quickUiSwitch(UIS_MENU_USER_SEL); break; case 5: quickUiSwitch(UIS_MENU_FRIEND_SEL); break; } } void keyHandler(unsigned short key,unsigned char status){//ÆÕͨ°´¼üÖµ´¦¬q static unsigned char debugcnt=0; static unsigned char gtModeCnt=0; static unsigned char lockCnt=0; if(newPara.lockType!=0){ if(sutApp.keyLock!=0 &&(MKEY_VALUE_MENU!=key)){ sutApp.lockShow=1; return; } }else{ if(sutApp.keyLock!=0 && (MKEY_VALUE_DOWN==key || MKEY_VALUE_ESC==key)){ sutApp.lockShow=1; return; } } showKeyMessage(key,status); //MSG_INFO(1,"key========%d",key); if(status==0){//key free switch(key){ case MKEY_VALUE_MIC_PTT: pttHandler(0,0); break; case MKEY_VALUE_PTT: pttHandler(1,0); break; case MKEY_VALUE_CB_PTT: pttHandler(2,0); break; case MKEY_VALUE_ESC: pwrDetRead(1); break; case MKEY_VALUE_UP: //if(sutApp.key_f1_cnt==1 && sutUIstatus.Status!=UIS_MENU_SYS_SERVERPASS) sutApp.voluemUpdate=1; sutApp.key_f1_cnt=0; break; case MKEY_VALUE_DOWN: //if(sutApp.key_f2_cnt==1 && sutUIstatus.Status!=UIS_MENU_SYS_SERVERPASS) sutApp.voluemUpdate=2; sutApp.key_f2_cnt=0; break; case MKEY_VALUE_CB_GT: gtModeCnt=0; break; case MKEY_VALUE_MENU: if(sutApp.keyLock != 0 && lockCnt==1)//ʵ¼ÊÎÞ·¨ÊµÏÖËø¶Ì°´Ò»Ï£¬ÒòΪ°´ÏÂÈ¥¼üÖµ¾Í±»Ê¹ÓÃÁË£¬²»¹ýËø¼üÅ̺󣬶¼ÊÇÔÚ´ý»ú½çÃ棬²»Ó°Ïì sutApp.lockShow=1; lockCnt=0; break; case MKEY_VALUE_CB_IP: debugcnt=0; break; default: break; } sutApp.timeOutCnt=0; keyInArow=0; appSleepCtl(ASLEEP_MKEY, 0); }else{//key press if(key!=MKEY_VALUE_MIC_PTT &&key!=MKEY_VALUE_PTT && key!=MKEY_VALUE_CB_GT) keyToneStart(); backLightReset();//ÆäËüËùÓмü¶¼µãÁÁ(½Ó¿ÚÀïÃæÓе÷×èÖ¹ÐÝÃß½Ó¿Ú) appSleepCtl(ASLEEP_MKEY, 1); keyNum++; switch(key){ case MKEY_VALUE_MIC_PTT: pttHandler(0,1); break; case MKEY_VALUE_PTT: pttHandler(1,1); break; case MKEY_VALUE_CB_PTT: pttHandler(2,1); break; case MKEY_VALUE_ESC: keyInArow=1; pwrDetRead(0); break; case MKEY_VALUE_UP: keyInArow=1; sutApp.key_f1_cnt++; if(sutApp.keyLock==0){ if(sutApp.key_f1_cnt==3) { quickUiSel(newPara.sidekey01_func); } }else if(sutApp.key_f1_cnt!=1) sutApp.lockShow=1; break; case MKEY_VALUE_DOWN: keyInArow=1; sutApp.key_f2_cnt++; if(sutApp.keyLock==0){ if(sutApp.key_f2_cnt==3) { quickUiSel(newPara.sidekey02_func); } }else if(sutApp.key_f2_cnt!=1) sutApp.lockShow=1; break; case MKEY_VALUE_CB_GT: keyInArow=1; gtModeCnt++; if(sutApp.keyLock==0){ if(gtModeCnt==3){ if(sutApp.gtMode==0){ enterGTMode(); } } }else sutApp.lockShow=1; break; case MKEY_VALUE_CB_IP: keyInArow=1; if(++debugcnt==10) uISetNextStatus(UIS_DEBUG); break; case MKEY_VALUE_MENU: keyInArow=1; if(++lockCnt==30) lockProcess(); break; default: break; } } } unsigned char encodeDirection=ENCODE_IDLE; unsigned char getEncodeStatus(void){ unsigned char tmp=encodeDirection; if(encodeDirection!=ENCODE_IDLE) encodeDirection=ENCODE_IDLE; return tmp; } #define PROCESS_ENCODE_TIME//ÊÇ·ñÒªÑÓʱÁ¬Ðø´¦ÀíÐýÅ¥¼üÖµ void encodeHandler(unsigned char encode){ #ifdef PROCESS_ENCODE_TIME static int64_t lastTimeMs=0; int64_t timems=LSAPI_OSI_UpTime(); //Ìí¼ÓÏÂÑÓʱ£¬0.5Ãë´¦ÀíÒ»´Î if(timems-lastTimeMs<100) goto ENCODE_END; lastTimeMs=timems; #endif //´¦Àí¼üÖµ if(encode==ENCODE_SHUN) MSG_INFO(1, "[Encode]:shun"); else if(encode==ENCODE_NI) MSG_INFO(1, "[Encode]:ni"); plusKeyNum(); backLightReset(); tryWakeupApp(); sutApp.timeOutCnt=0; // if(sutUIstatus.Status==UIS_STANDBY){ // sutApp.groupKeyType=1; // quickUiSwitch(UIS_MENU_GROUP_SEL); // }else{ // encodeDirection=encode; // } if(encode==ENCODE_SHUN){ sutApp.voluemUpdate=1; }else if(encode==ENCODE_NI){ sutApp.voluemUpdate=2; } #ifdef PROCESS_ENCODE_TIME ENCODE_END: #endif encodeReleased(); } /////////////////////////////ʼþ·¢ËͽӅ·////////////////////////// void threadSendEvent(LSAPI_OSI_Thread_t *threadID, unsigned int id, unsigned int param1,unsigned int param2,unsigned int param3){ LSAPI_OSI_Event_t pEventSend; pEventSend.id=id; pEventSend.param1=param1; pEventSend.param2=param2; pEventSend.param3=param3; osiEventTrySend(threadID,&pEventSend,0); } //////////////////////////////ÆäËü´¦Àí½Ó¿Ú////////////////////////// static void adcRead(unsigned int interval){ static unsigned char earStatus=0xff; int32_t chargeVol; static unsigned short cnt=0,lcnt=0; static unsigned int laSiVbat; unsigned int adcValueTmp; if(++cnt<(1000/interval)) return;//1Ãë¶ÁÒ»´ÎADC¼´¿É cnt=0; LSAPI_SYS_BattGetVol(&adcValueTmp); sutApp.g_iBAT=adcValueTmp/10; if(sutApp.g_iBAT == laSiVbat){ laSiVbat=sutApp.g_iBAT; if(sutApp.g_iBAT<=MIN_PWR_LEVEL){ MSG_WARN(1,"Low power:%d", lcnt++); if(lcnt>=10){ MSG_INFO(1, "Low power ,shut"); sutApp.lowPwrMsg=1; appSleepCtl(ASLEEP_PWR, 1); } }else lcnt=0; } //¶ÁÈ¡³äµç/¶ú»ú½ÓÈë״̬ //²»ÖªµÀΪɶÊÇLSAPI_Device_ADC_CHANNEL_3£¬¶ø²»ÊÇLSAPI_Device_ADC_CHANNEL_1 chargeVol=LSAPI_Device_AdcGetChannelVolt(LSAPI_Device_ADC_CHANNEL_3, LSAPI_Device_ADC_SCALE_3V233); if(chargeVol<=2000){//¶,ûÔÚ³äµç //tmpEar=0; sutApp.chargeStatus=0; }else{//ÕýÔÚ³äµç //tmpEar=1; sutApp.chargeStatus=1; } } /*´¦ÀíUI²Ù×÷*/ static void uiProcess(unsigned int exeInterval){ static int cnt=0; if(getAppObjStatus(ASLEEP_PWR) != 0) return;//¹Ø»úºó£¬²»Çл»²Ëµ¥£¬Ö»ÏÔʾ¹Ø»ú uiLoop(exeInterval); uiResponse(exeInterval); } /*´¥·¢¹Ø»ú²Ù×÷*/ static void pwrShutPro(void){ static char shutFlag=0; if(getAppObjStatus(ASLEEP_PWR) == 0) return; lcdBackLightApi(1); msgAtSend("AT+CFUN=0\r\n"); if(shutFlag==0){ //ÏÔʾ¹Ø»ú½çÃæ if(sutApp.lowPwrMsg==0) guiShowMessageBox("ÕýÔڹػú"); else guiShowMessageBox("µÍѹ¹Ø»ú"); shutFlag=1; LSAPI_OSI_ThreadSleep(1000); guiShowBmp(0,0,"BYEBYE.bmp"); LSAPI_OSI_ThreadSleep(1000); } MSG_INFO(1, "Normal PwrOff"); //msgAtSend("AT+TRB=1\r\n");//normal power off µ±Ç°¹Ì¼þÏȲ»·¢Ä£¿é¹Ø»úÖ¸Á·ñÔò¶ÏµçÔÙÉϵçÓпÉÄÜÊÇÆð²»À´Ãó //LSAPI_OSI_ThreadSleep(1000);//Ò»ÃëºóÊͷŵçÔ´ïÍ·ÀÖ¹Èí¹Ø»ú²»³É¹¦ lcdBackLightApi(0); MSG_INFO(1, "Release pwr"); guiFillRect(0,0,GLCD_WIDTH-1,GLCD_HEIGHT-1,guiGetBackColor());//·ÀÖ¹Ï´οª»úÄÜ¿´µ½²ÐÁô msgAtSend("AT+CPOF\r\n");//Èí¼þ¹Ø»úÄ£¿é LSAPI_OSI_ThreadSleep(100); CTL_POWER_HOLD(false); } static void NoteCheck(int interval){ int dlyMs; if(sutApp.lowPwrWarn!=0){ sutApp.lowPwrCnt += interval; if(sutPocStatus.spk==0 && sutPocStatus.mic==0){//¶Ô¼Æ״̬ϲ»²¥·ÅÇë³äµç if(sutApp.lowPwrCnt>=WARN_TTS_INTERVAL){ sutApp.lowPwrCnt=0; ttsPlay(ENCODE_USER_GBK, "C7EBB3E4B5E7"); } } } } void AntModeRun(void){ #ifdef ENABLE_ANT_MODE guiShowMessageBox("µ÷ÌìÏßģʽ"); for(;;){ LSAPI_OSI_ThreadSleep(2000); } #endif } void ShouHuProcess(int interva) { static char nRet=0; static char regcnt=0; //static int LastAtt_state=0; int tmepAtt_state=0; static int cnt=0; if(sutApp.gtMode==1||sutApp.cardStatus==0)return; if(++cnt<(1000/interva)) return; cnt=0; nRet=LSAPI_NET_GetGprsAttState(&tmepAtt_state); if(nRet!=0){ MSG_WARN(1,"Get REG status failed"); return; } if(tmepAtt_state!=1){ //if(LastAtt_state!=tmepAtt_state)MSG_WARN(1,"REG off"); if(regcnt==60){ MSG_WARN(1,"!!!!CFUN=0"); msgAtSend("AT+CFUN=0\r\n"); }else if(regcnt>=61){ MSG_WARN(1,"!!!!CFUN=1"); msgAtSend("AT+CFUN=1\r\n"); regcnt=0; } ++regcnt; }else { regcnt=0; } } void Ear_Judge(){ LSAPI_HeadSetStatus_t status; status= LSAPI_Device_HeadSetGetStatus();//0628 if(status == LSAPI_HEADSET_DISCONNECT) { MSG_INFO(1,"headset_disconnect"); handsetStatusOutput(1); } else if(status == LSAPI_HEADSET_CONNECT) { MSG_INFO(1," headset_connect"); handsetStatusOutput(0); } else { MSG_INFO(1,"unknow state"); } } //30Ãë ÎÞÈ˺ô½Ð×Ô¶¯Í˳öµ¥ºô void AutoExitDanhu(int interva) { static int cnt=0; unsigned char buf[40]; if(sutPocStatus.danHuStatus==0)return; if(sutPocStatus.mic||sutPocStatus.spk){ cnt=0; return; } if(++cnt<(30*1000/interva)) return; cnt=0; snprintf(buf, sizeof(buf),"AT+POC=090000%08x\r\n",sutPocStatus.LocalGroup.ID); msgAtSend(buf); } #define APP_NEED_SLEEP OSI_MAKE_TAG('S', 'E', 'L', 'P') void ls_suspend(void *ctx, osiSuspendMode_t mode) { MSG_INFO(1,"\n\r ls_suspend mode:%d\n",mode); } void ls_resume(void *ctx, osiSuspendMode_t mode, uint32_t source) { MSG_INFO(1,"\n\r ls_resume mode:%d,source:%d\n",mode,source); } osiPmSourceOps_t sleep_ops = { ls_suspend, ls_resume, NULL, NULL }; static void paProCtl(void); static void subTimerCtl(unsigned char sleep_or_not); static void configureVoiceParam(void); void SecProcess(int interva) { static int cnt=0; if(sutApp.gtMode!=0) return; if(++cnt<(5*1000/interva)) return; // 5ÃëÄÃÒ»´ÎGPSÊý¾Ý cnt=0; if(sutGpsInfo.g_GpsEnable)msgAtSend("AT+GPSRD=\"ALL\"\r\n"); } void appRun(void){ char cnt=0; char buf[20]; LSAPI_OSI_Event_t event={0}; osiPmSource_t*App_osiPmSource_t=NULL; App_osiPmSource_t=osiPmSourceCreate(APP_NEED_SLEEP, &sleep_ops, NULL); osiPmWakeLock(App_osiPmSource_t); //ÄÃס×ÊÔ´²»ÈÃϵͳÐÝÃß //µÈ´ýlcd³õʼ»¯Íê·¿ MSG_INFO(1, "wait lcd init"); while(sutApp.guiStatus==0){LSAPI_OSI_ThreadSleep(50);}//ÊÇ·ñ¼ì²â³¬Ê±£¿ AntModeRun(); localAuthNow(); //µÈ´ýpocÆô¶¯Íê³É MSG_INFO(1, "lcd init done, wait poc start"); while(sutApp.pocInitStatus==0){ msgAtSend("ATE0\r\n"); LSAPI_OSI_ThreadSleep(1000); }//ÊÇ·ñ¼ì²â³¬Ê±£¿ MSG_INFO(1, "app loop start"); msgAtSend("AT+AUDCH=0,0\r\n");//´Ë»úÐÍֻʹÓÃÖ÷ͨµÀ Ear_Judge(); //ÉèÖÃÒ»ÏÂTTSÓïÒôËÙ¶È msgAtSend("AT+LSHTTSPARAM=3000,106,100\r\n");//ÉèÖÃTTS²ÎÊý msgAtSend("ATI\r\n");//²éѯģ¿é°æ±¾ msgAtSend("AT+SIMCROSS?\r\n"); LSAPI_OSI_ThreadSleep(1000); msgAtSend("AT+POC=2500000150\r\n"); //toneÒôÁ¿ msgAtSend("AT+POC=4500000064\r\n"); //¶Ô½²ÒôÁ¿ #ifdef CONFIG_AUDIO_AFTER_INIT configureVoiceParam(); #else for(cnt=0;cnt<5;cnt++){ configureVoiceParam(); LSAPI_OSI_ThreadSleep(100); sutApp.audioReconfig=2; msgAtSend("AT+CACCP=0,0,1,\"\"\r\n");//¼ì²âmicÊÇ·ñ±»muteµôÁË LSAPI_OSI_ThreadSleep(200); if(sutApp.audioReconfig==0) break; } #endif adcRead(APP_SUB_DIV_TIME);//ÔÚ¿ª»ú²¥·ÅÇ°ÉèÖÃÏÂSPK splVolumeSet(newPara.spkVol*10);//¸üÐÂÒôÁ¿ backLightReset(); if(newPara.ttsMessage[0]!=0){ if(newPara.ttsCodeType==0){ ttsPlay(ENCODE_USER_UNICODE_BE, newPara.ttsMessage); }else if(newPara.ttsCodeType==1) ttsPlay(ENCODE_USER_GBK, newPara.ttsMessage); else MSG_INFO(1, "ttsCodeType:%d not support", newPara.ttsCodeType); }else MSG_INFO(1, "tts null"); //¼ì²â¿¨ÊÇ·ñ´æÔÚ while(sutApp.cardStatus==0){ msgAtSend("AT+CPIN?\r\n"); LSAPI_OSI_ThreadSleep(1000); if(++cnt>=10){ MSG_INFO(1, "Check card timeout"); break; } } msgAtSend("AT+POC=000000010101\r\n"); pwrModeSetCmd(newPara.pwrMode);//ÐÄÌø¼ä¸ô ZZD_PWRMODE ModemSetZZDPocPara(); snprintf(buf,sizeof(buf),"AT+POC=3000%02d01\r\n",newPara.Poc_sound+1); msgAtSend(buf); //BLE_Open();//d ´ò¿ªÀ¶ÑÀ osiPmWakeUnlock(App_osiPmSource_t); for(;;){ #ifdef CONFIG_AUDIO_AFTER_INIT audioParaCheck(); #endif volUpdateNeed(); ledsProCtl(); adcRead(APP_SUB_DIV_TIME); uiProcess(APP_SUB_DIV_TIME); AutoExitDanhu(APP_SUB_DIV_TIME); ShouHuProcess(APP_SUB_DIV_TIME); pocProCtl(APP_SUB_DIV_TIME); NoteCheck(APP_SUB_DIV_TIME); //uiTimeOutToStandby(0, APP_SUB_DIV_TIME); HookGroupUserInfo(); HookVolToutCheck(); SecProcess(APP_SUB_DIV_TIME); Ble_handler(APP_SUB_DIV_TIME); Xinbiao_handler(APP_SUB_DIV_TIME); GpsInternalChange(APP_SUB_DIV_TIME); //IncomingSMS(); LogoutOutTimeCheck(APP_SUB_DIV_TIME); if(isSleepReady()==0) LSAPI_OSI_ThreadSleep(APP_TASK_SLEEP_TIME); else if(sutApp.gtMode==0){//Õý³£Ä£Ê½Ï¿ÉÒÔÐݱ‹ MSG_WARN(1, "APP SLEEP"); // uiTimeOutToStandby(1, APP_SUB_DIV_TIME); stopKeyTimer(); subTimerCtl(1);//Çл»ÎªÐÝÃß״̬¶¨Ê±Æ÷ sutApp.appStatus=1; redLedCtl(false);//ÐÝÃߺó±£Ö¤µÆûÁÁ£¬·ñÔòÓпÉÄܵÆÁÁ10ms£¬°´Àí10msºóµÆÄÜÃð£¬È»ºó10msʱÐÝÃßÁË£¬Ó¦ÓþͶÌʱ¼äÄÚ²»»áÃðµÆ greenLedCtl(false);//ÐÝÃߺó±£Ö¤µÆûÁÁ sutApp.updateStatusBar=1; LSAPI_OSI_EventWait(LSAPI_OSI_ThreadCurrent(), &event); LSAPI_OSI_ThreadSleep(150);//Ìí¼ÓÕâ¸öºó£¬ÐÝÃßʱ°´¼ü»ò±»ºô½Ð»ò±¾»úºô½Ð£¬toneÒôÄÜÊÇÍêÕûµÄ lcdDrv_Init(1);//Éî¶ÈÐÝÃß»½ÐѺóÖØгõʼ»¯SPI-LCD if(sutApp.lcdDlyLightUp){ sutApp.lcdDlyLightUp=0; lcdBackLightApi(1); } sutApp.forceUiFlash=1; sutApp.appStatus=0; subTimerCtl(0);//Çл»Îª»½ÐÑ״̬¶¨Ê±Æ÷ MSG_WARN(1, "APP WAKEUP"); } //¼ì²âÊÇ·ñ¹Ø»ú£¬ÕâÀïÒª·ÅÔÚ»½ÐѺó²Ù×÷ pwrShutPro(); } } unsigned int subTimerInterval=100;//¶¨Ê±Æ÷¶¨Ê±µÄʱ¼ä LSAPI_OSI_Timer_t *pSubtimer_t = NULL; /* ΪÁË×öµÍ¹¦ºÄ£¬´Ë¶¨Ê±Æ÷ÔÚÐÝÃßʱ£¬ÉèÖÃΪ³¤Ê±¼ä¶¨•J ·ÇÐÝÃßʱ£¬ÉèÖÃΪ¶Ìʱ¼ä¶¨•J sleep_or_not:0 δÐÝÃߣ¬ else ÐÝÃß */ static void subTimerCtl(unsigned char sleep_or_not){ if(NULL==pSubtimer_t){ MSG_WARN(1, "subTimer null"); return; } LSAPI_OSI_TimerStop(pSubtimer_t); //´ò¿ª¶¨Ê±‡’ if(sleep_or_not==0) subTimerInterval=100;//δÐÝÃßʱ£ß00ms else subTimerInterval=5000;//ÐÝÃß•J5000ms LSAPI_OSI_TimerStart(pSubtimer_t,subTimerInterval); } static void subTimeroutcallback(void *param){ unsigned int *dlyTime=(unsigned int *)param; //´¦ÀíµÆµÄÏÔʾ uioProctl(*dlyTime); //¿ØÖƹ¦·ÅµÄ¹Øê] paProCtl(); if(NULL!=pSubtimer_t) LSAPI_OSI_TimerStart(pSubtimer_t,subTimerInterval); } void subTask(void *param){ LSAPI_OSI_Event_t event={0}; if(NULL==pSubtimer_t) pSubtimer_t = LSAPI_OSI_TimerCreate(LSAPI_OSI_ThreadCurrent(), subTimeroutcallback, (void *)&subTimerInterval); if(NULL==pSubtimer_t) MSG_WARN(1,"sub timer init failed"); else LSAPI_OSI_TimerStart(pSubtimer_t,subTimerInterval); for(;;){LSAPI_OSI_EventWait(LSAPI_OSI_ThreadCurrent(), &event);} } static void paProCtl(void){ //»á±»¶¨Ê±µ÷Óà static char PaDlyCnt=0; if(sutPocStatus.PaDlyStart==1){ if(++PaDlyCnt<30)return; //3 } if(sutPocStatus.TTS!=0) return; if(sutPocStatus.spk!=0) return; if(sutPocStatus.TONE!=0) return; if(sutPocStatus.beep!=0) return; if(sutApp.gtMode!=0) return; PaDlyCnt=0; sutPocStatus.PaDlyStart=0; paControl(false); //MSG_INFO(1,"spk off"); } void tryWakeupApp(void){ if(sutApp.appStatus!=0){ if(mainThreadPtr!=NULL){ threadSendEvent(mainThreadPtr,OHPOC_EVENT_MAIN,NULL,NULL,NULL); } } } void ttsPlay(ENCODE_USER_ENUM type, char *tts){ char buf[120]; MSG_INFO(1, "tts Play:%d,%s",type,tts); //sutPocStatus.TTS=1; paControl(true); snprintf(buf, sizeof(buf), "AT+POC=770000%02d%s\r\n", type,tts); msgAtSend(buf); } /*±³¹âʱ¼äµ½£¬Ï¨Ãð*/ void backLightCb(void *param){ if(sutPocStatus.firstLogin==0) return;//δµÇ¼¹ý£¬²»ÃðÆÁ if(newPara.lcdParaList[newPara.lcdParaDefaultIndex]==0) return;//³£ÁÁ lcdBackLightApi(0); appSleepCtl(ASLEEP_LCD, 0);//¿ÉÒÔÐÝÃß } /*µãÁÁ±³¹â*/ void backLightReset(void){ unsigned short tmp; appSleepCtl(ASLEEP_LCD, 1);//²»ÈÃÐÝÃß tmp=newPara.lcdParaList[newPara.lcdParaDefaultIndex]; if(sutApp.appStatus==0) lcdBackLightApi(1);//δÐÝÃßʱ£¬Ö±½ÓµãÁÁ else sutApp.lcdDlyLightUp=1;//ÐÝÃßʱ²»ÂíÉÏÁÁÁÁ£¬»áÔÚLCD³õʼ»¯ÍêºóµãÁÁ startBackLightTimer(tmp*1000); } void sysPwrLock(void){ sutApp.pwrLock=1; } void sysPwrRlease(void){ sutApp.pwrLock=0; } //"3132" --> 0x31,0x32 void StrAsciiToHex(char *src, unsigned char *des){ unsigned char temp[2],i; if(strlen(src)%2) return; while(0!=*src) { for(i=0;i<2;i++) { temp[i] = *src++; if(temp[i] >= '0' && temp[i] <= '9') temp[i] -= 0x30; else if(temp[i] >= 'A' && temp[i] <= 'F') temp[i] -= 0x37; else temp[i] -= 0x57; } temp[0] <<= 4; temp[0] &= 0xf0; *des++=temp[0]|temp[1]; } *des=0; } void splVolumeSet(unsigned char level){ char info[30]; snprintf(info, sizeof(info), "AT+CLVL=%d\r\nAT+CRSL=%d\r\n", level,level); msgAtSend(info); MSG_INFO(1,"SPK_VOL:%d",level); } const unsigned char spkGainTable[SPK_GAIN_NUM]; const unsigned char spkGainTable[SPK_GAIN_NUM]={ 24,32,40,48,56,64,72,80 }; /*µ÷½ÚÒôÁ¿£¬Ë¢ÐÂÒôÁ¿½ø¶ÈÌõ*/ void volAdjAction(char direction,unsigned char UIStatus){ const unsigned char spkVolTable[MAX_SPK_VOL+1]={0,10,20,30,40,50,60,70,80,90,100};//²»½Ó¶ú»úʱÀ®°ÈÒô unsigned char vol; if(sutApp.earLev==0){//²»½Ó¶ú»ú if(direction==0){ if(newPara.spkVol0) newPara.spkVol--; else goto FLASH; } vol=spkVolTable[newPara.spkVol]; splVolumeSet(vol); }else{//½ÓÁ˶ú»ú if(direction==0){ if(newPara.spkGain0) newPara.spkGain--; else goto FLASH; } if(newPara.spkGain==0) vol=0; else vol=spkGainTable[newPara.spkGain-1]; splVolumeSet(vol); vol=newPara.spkGain; } sysIniSave("adjvol"); //ˢнø¶ÈÌõ FLASH: if(sutApp.earLev==0) vol=newPara.spkVol; else vol=newPara.spkGain; if(UIS_STANDBY==UIStatus) volUiFlash(vol); } void volUpdateNeed(void){ if(sutApp.voluemUpdate==0) return; if(sutApp.voluemUpdate==1) volAdjAction(0, sutUIstatus.Status); else if(sutApp.voluemUpdate==2) volAdjAction(1, sutUIstatus.Status); sutApp.voluemUpdate=0; } void VolSpkUpdate(void){ char cmd[30]; unsigned char volLev; if(sutApp.earLev==0){//¶ú»ú°Îµôºó£¬»Ö¸´Õý³£µÄSPKÔöÒæ volLev=newPara.spkVol*10; }else{//¶ú»ú½ÓÈ룬ӦÓÃÌض¨Öµ if(newPara.spkGain>=SPK_GAIN_NUM) volLev=SPK_GAIN_DEFAULT; else volLev=newPara.spkGain; if(volLev>0) volLev=spkGainTable[newPara.spkGain-1]; } splVolumeSet(volLev); } //¶Ô¶¼Ê¹ÓÃÖ÷ÒôƵͨµÀÉè¼ÆÀ´Ëµ£¬¶ú»úģʽʱ£¬ÐèÒª°´±ÈÀý½µµÍÊäÈëÊä³öÔöÒæ const unsigned short micGainTable[MIC_GAIN_NUM][2]={ {2,6},{2,10},{3,10},{4,10},{5,10},{6,10},{6,13} }; void VolMicUpdate(void){ #if 1 char cmd[50]; unsigned char hana,lana,hadc,ladc; if(sutApp.earLev==0){//¶ú»ú°Îµô,»Ö¸´Õý³£MICÔöÒæ hana=sutApp.mic_ana>>8; lana=sutApp.mic_ana; hadc=sutApp.mic_adc>>8; ladc=sutApp.mic_adc; }else{//¶ú»ú½ÓÈë hana=micGainTable[newPara.micGain][0]>>8; lana=micGainTable[newPara.micGain][0]; hadc=micGainTable[newPara.micGain][1]>>8; ladc=micGainTable[newPara.micGain][1]; } snprintf(cmd, sizeof(cmd), "AT+CACCP=0,0,0,\"%02x%02x%02x%02x\"\r\n",lana,hana,ladc,hadc); msgAtSend(cmd); #else unsigned char tableIndex; char cmd[50]; int vol=newPara.spkVol*10; splVolumeSet(vol); if(sutApp.earLev==0){//¶ú»ú°Îµô,»Ö¸´Õý³£MICÔöÒæ tableIndex=newPara.micGain_onspk; //msgAtSend("AT+CACCP=0,0,0,\"04000a00\"\r\n"); }else{//¶ú»ú½ÓÈë tableIndex=newPara.micGain_onear; //msgAtSend("AT+CACCP=0,0,0,\"02000f00\"\r\n"); } if(tableIndex>=MIC_GAIN_NUM){ MSG_WARN(1, "Index invalid:%d", tableIndex); return; } snprintf(cmd, sizeof(cmd), "AT+CACCP=0,0,0,\"%02x00%02x00\"\r\n", micGainTable[tableIndex][0],micGainTable[tableIndex][1]); msgAtSend(cmd); #endif } //¿ª»úÅäÖÃÉ趨ºÃµÄÄ£¿éÒôƵ²ÎÊýÎļþ #define READ_PER_SIZE 400 //ÿ´Î´ÓBinÎļþ¶ÁÈ¡×î¶à400×Ö½ÚÀ´·¢ËÍ£¬ATʱ³¤¶È·­±¶ static void configureVoiceParam(void){ //const char *confiFile="ZT-MINI101HGS.bin"; const char *confiFile="ZT-MINI201-202HGS-20210703.bin"; unsigned char sendbuf[40+2*400];//AT+CAIET=0,0,9600,400,"" unsigned char *dataPtr=sendbuf+sizeof(sendbuf)-READ_PER_SIZE; char buf[3]; char status=0; int fd,offset,readsize,i; LSAPI_FS_Stat_info_t pBuf; MSG_INFO(1, "config audio file'%s'",confiFile); fd=LSAPI_FS_Open(confiFile, LSAPI_FS_O_RDONLY,0x0); if(fd>0){ memset(&pBuf,0,sizeof(pBuf)); LSAPI_FS_Fstat(fd,&pBuf); offset=0; LSAPI_FS_Seek(fd, offset, LSAPI_FS_SEEK_SET); while(offset400) readsize=400; readsize=LSAPI_FS_Read(fd, dataPtr, readsize); if(readsize==0) break; else if(readsize<0){ status=1; break; } sprintf(sendbuf, "AT+CAIET=0,0,%d,%d,\"", offset, readsize); for(i=0;i