#include "includes.h" #define APP_IDLE_TIME 3 //如果POC已休眿APP没有操作一定秒数后休眠 int keyNum=0; APP_DEF sutApp; static void appDataInit(void){ memset((unsigned char *)&sutApp, 0, sizeof(APP_DEF)); sutApp.pcant=4; sutApp.enableKey=1; appSleepCtl(ASLEEP_POC, 1); appSleepCtl(ASLEEP_LCD, 1); readInfoNow(); sysIniRead(); } void dataInit(void){ RTC_Init(); 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(void); 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=(1000/KEY_TIMER_TICK)){//每秒产生持续倿 keyCnt=0; needSendKey=1; } } } if(needSendKey){ if(sutApp.enableKey!=0)//延时期间不检测按锿 keySendEvent(lkey,keyType); } } void pwrDetRead(char type){ static char cnt=0; if(type==0){ if(++cnt>=3){ MSG_INFO(1, "Power is off!"); appSleepCtl(ASLEEP_PWR, 1); } }else{ cnt=0; } } 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.KeyToneStart=1; paControl(true); if(ToneThreadPtr!=NULL)threadSendEvent(ToneThreadPtr,OHPOC_EVENT_MAIN,NULL,NULL,NULL);//0702 } void quickUiSwitch(int uistatus){ uISetNextStatus(uistatus); getStackStruct()->FastUiChange=1; } /*进入GT模式*/ static void enterGTMode(void){ #ifndef ENABLE_PWM_BEEP msgAtSend("AT+TONES=1\r\n"); #endif sutApp.gtMode=1; uioStatusSet(UIO_INDGT); paControl(true);//GT下常开喇叭 #ifdef ENABLE_PWM_BEEP pwmBeepStart(868,50); LSAPI_OSI_ThreadSleep(100); pwmBeepStart(500,50); LSAPI_OSI_ThreadSleep(100); pwmBeepStart(868,50); #else msgAtSend("AT+TONE\r\n"); LSAPI_OSI_ThreadSleep(200); msgAtSend("AT+TONE\r\n"); #endif MSG_WARN(1, "Enter GT Mode"); } void micPttHandler(char status){ keySendEvent(MKEY_VALUE_MIC_PTT,status); } //char beepStatus=0;//只tone一次,任何键放开后,有键按下可tone void keyHandler(unsigned short key,unsigned char status){//普通按键值处琿 static unsigned char gtModeCnt=0; static unsigned char lockCnt=0; if(sutApp.keyLock!=0 && MKEY_VALUE_ESC!=key){ sutApp.lockShow=1; return; } showKeyMessage(key,status); //if(key!=MKEY_VALUE_MIC_PTT&&key!=MKEY_VALUE_PTT)sutPocStatus.KeyToneStart=1; 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_PWR: pwrDetRead(1); break; case MKEY_VALUE_ESC: lockCnt=0; break; case MKEY_VALUE_F2: if(sutApp.key_f2_cnt==1) quickUiSwitch(UIS_MENU_USER_SEL); sutApp.key_f2_cnt=0; break; case MKEY_VALUE_CB_GT: gtModeCnt=0; break; default: break; } keyInArow=0; appSleepCtl(ASLEEP_MKEY, 0); //beepStatus=0; sutPocStatus.KeyToneStart=0; }else{//key press if(key!=MKEY_VALUE_PTT && key!=MKEY_VALUE_CB_GT && sutPocStatus.KeyToneStart==0) keyToneStart(); //beepStatus=1; 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_PWR: keyInArow=1; pwrDetRead(0); break; case MKEY_VALUE_ESC: keyInArow=1; // msgAtSend("AT+POC=0D00000000000500000001\r\n"); if(++lockCnt==3) lockProcess(); break; case MKEY_VALUE_F1: quickUiSwitch(UIS_MENU_GROUP_SEL); break; case MKEY_VALUE_F2: keyInArow=1; if(++sutApp.key_f2_cnt==3) quickUiSwitch(UIS_MENU_SYS_SIM); break; case MKEY_VALUE_CB_GT: keyInArow=1; if(++gtModeCnt==3){ if(sutApp.gtMode==0){ enterGTMode(); } } break; case MKEY_VALUE_CB_IP: keyInArow=1; break; default: break; } } } /////////////////////////////事件发送接叿////////////////////////// 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(void){ #define VBAT_READ_TIME 20 unsigned int adcValueTmp; static unsigned int siVbat=0,laSiVbat; static unsigned char index=0; LSAPI_SYS_BattGetVol(&adcValueTmp); siVbat += adcValueTmp; if(++index>=VBAT_READ_TIME){ sutApp.g_iBAT=siVbat / VBAT_READ_TIME / 10; if(laSiVbat!=sutApp.g_iBAT){ //MSG_INFO(1, "bat:%d", sutApp.g_iBAT); laSiVbat=sutApp.g_iBAT; if(sutApp.g_iBAT<=MIN_PWR_LEVEL){ MSG_INFO(1, "Low power ,shut"); sutApp.lowPwrMsg=1; appSleepCtl(ASLEEP_PWR, 1); } } siVbat=0; index=0; } } /*处理UI操作*/ static void uiProcess(unsigned int exeInterval){ if(getAppObjStatus(ASLEEP_PWR) != 0) return;//关机后,不切换菜单,只显示关机页靿 uiLoop(exeInterval); uiResponse(exeInterval); } /*触发关机操作*/ static void pwrShutPro(void){ static char shutFlag=0; if(getAppObjStatus(ASLEEP_PWR) == 0) return; CTL_LCD_BL(1); msgAtSend("AT+POC=050000\r\n"); msgAtSend("AT+CFUN=0\r\n"); if(shutFlag==0){ //显示关机界面 if(sutApp.lowPwrMsg==0) guiShowMessageBox("正在关机"); else guiShowMessageBox("低压关机"); shutFlag=1; LSAPI_OSI_ThreadSleep(1000); } MSG_INFO(1, "Normal PwrOff"); //msgAtSend("AT+TRB=1\r\n");//normal power off 当前固件先不发模块关机指令,否则断电再上电有可能是起不来皿 //LSAPI_OSI_ThreadSleep(1000);//一秒后释放电源锿防止软关机不成功 CTL_LCD_BL(0); MSG_INFO(1, "Release pwr"); guiFillRect(0,0,GLCD_WIDTH-1,GLCD_HEIGHT-1,guiGetBackColor());//防止下次开机能看到残留 CTL_POWER_HOLD(0); msgAtSend("AT+CPOF\r\n");//软件关机模块 LSAPI_OSI_ThreadSleep(100); } static void NoteCheck(int interval){ int dlyMs; if(sutApp.lowPwrWarn!=0){ sutApp.lowPwrCnt += interval; 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 pocGetBJTime(unsigned int exeInterval){ static unsigned short cnt=0; if(++cnt>1000/exeInterval){ RTC_Update(); cnt=0; } } static void paProCtl(void); static void subTimerCtl(unsigned char sleep_or_not); void appRun(void){ char cnt=0; LSAPI_OSI_Event_t event={0}; //等待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(50); } //是否检测超时? MSG_INFO(1, "app loop start"); msgAtSend("AT+COPS=0,2\r\n");//运营商名称获取方式,数字 splVolumeSet(newPara.spkVol*10);//更新音量 //设置一下TTS语音速度 msgAtSend("AT+LSHTTSPARAM=3000,106,100\r\n");//设置TTS参数 //查询一下POC版本叿 msgAtSend("AT+POC_VER\r\n"); msgAtSend("AT+GMR\r\n");//查询模块版本 msgAtSend("AT+SIMCROSS?\r\n"); adcRead();//在开机播放前设置下SPK backLightReset(); //检测卡是否存在 while(sutApp.cardStatus==0){ msgAtSend("AT+CPIN?\r\n"); LSAPI_OSI_ThreadSleep(2000); if(++cnt>=5){ MSG_INFO(1, "Check card timeout"); cnt=0; break; } } msgAtSend("AT+POC=4500000064\r\n"); msgAtSend("AT+POC=2500000064\r\n"); msgAtSend("AT+POC=000000010101\r\n"); //ModemSetZZDPocPara(); for(;;){ ledsProCtl(); adcRead(); uiProcess(APP_SUB_DIV_TIME); gpsProCtl(APP_SUB_DIV_TIME); pocProCtl(APP_SUB_DIV_TIME); NoteCheck(APP_SUB_DIV_TIME); pocGetBJTime(APP_SUB_DIV_TIME); HookGroupUserInfo(); HookVolToutCheck(); IncomingSMS(); if(isSleepReady()==0) LSAPI_OSI_ThreadSleep(APP_TASK_SLEEP_TIME); else if(sutApp.gtMode==0){//正常模式下可以休眿 MSG_WARN(1, "APP SLEEP"); stopKeyTimer(); subTimerCtl(1);//切换为休眠状态定时器 sutApp.appStatus=1; redLedCtl(false);//休眠后保证灯没亮,否则有可能灯亮10ms,按理10ms后灯能灭,然后10ms时休眠了,应用就短时间内不会灭灯 greenLedCtl(false);//休眠后保证灯没亮 LSAPI_OSI_EventWait(LSAPI_OSI_ThreadCurrent(), &event); lcdDrv_Init(1);//深度休眠唤醒后重新初始化SPI-LCD if(sutApp.lcdDlyLightUp){ sutApp.lcdDlyLightUp=0; CTL_LCD_BL(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; /* 为了做低功耗,此定时器在休眠时,设置为长时间定旿 非休眠时,设置为短时间定旿 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;//休眠旿5000ms 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){ //会被定时调用 if(sutPocStatus.TTS!=0) return; if(sutPocStatus.spk!=0) return; if(sutPocStatus.TONE!=0) return; if(sutPocStatus.KeyToneStart!=0) return; if(sutApp.gtMode!=0) return; 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[20]; MSG_INFO(1, "tts Play:%d,%s",type,tts); paControl(true); snprintf(buf, sizeof(buf), "AT+LSHTTS=%d,\"", type); msgAtSend(buf); msgAtSend(tts); msgAtSend("\"\r\n"); sutPocStatus.TTS=1; } /*背光时间到,熄灭*/ void backLightCb(void *param){ if(sutPocStatus.firstLogin==0) return;//未登录过,不灭屏 if(newPara.lcdParaList[newPara.lcdParaDefaultIndex]==0) return;//常亮 CTL_LCD_BL(0); appSleepCtl(ASLEEP_LCD, 0);//可以休眠 } /*点亮背光*/ void backLightReset(void){ unsigned short tmp; appSleepCtl(ASLEEP_LCD, 1);//不让休眠 tmp=newPara.lcdParaList[newPara.lcdParaDefaultIndex]; if(sutApp.appStatus==0) CTL_LCD_BL(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); } /*调节音量,刷新音量进度条*/ void volAdjAction(char direction){ if(direction==0){ if(newPara.spkVol0) newPara.spkVol--; else goto FLASH; } splVolumeSet(newPara.spkVol*10); MSG_INFO(1,"SPK_VOL:%d",newPara.spkVol*10); sysIniSave(); //刷新进度条 FLASH: volUiFlash(newPara.spkVol); }