app.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. #include "includes.h"
  2. #define APP_IDLE_TIME 3 //如果POC已休眿APP没有操作一定秒数后休眠
  3. int keyNum=0;
  4. APP_DEF sutApp;
  5. static void appDataInit(void){
  6. memset((unsigned char *)&sutApp, 0, sizeof(APP_DEF));
  7. sutApp.pcant=4;
  8. sutApp.enableKey=1;
  9. appSleepCtl(ASLEEP_POC, 1);
  10. appSleepCtl(ASLEEP_LCD, 1);
  11. readInfoNow();
  12. sysIniRead();
  13. }
  14. void dataInit(void){
  15. RTC_Init();
  16. appDataInit();
  17. pocDataInit();
  18. gpsDataInit();
  19. uiDataInit();
  20. }
  21. static void ledsProCtl(void){
  22. if(sutApp.gtMode!=0) return;
  23. if(0==sutPocStatus.logined) uioStatusSet(UIO_INDOFFLINE);
  24. else if(sutPocStatus.spk>0)uioStatusSet(UIO_INDRX);
  25. else if(sutPocStatus.mic>0 )uioStatusSet(UIO_INDTX);
  26. else uioStatusSet(UIO_INDONLINE);
  27. }
  28. static void adcRead(void);
  29. char isKeyPress(void){
  30. if(keyNum) return keyNum--;
  31. else return 0;
  32. }
  33. /*APP休眠处理接口
  34. ctlType, 操作对象
  35. status,操作值,0 清除 else 设置
  36. */
  37. void appSleepCtl(ASLEEP_ENUM ctlType, char status){
  38. if(status==0) sutApp.appSleepStatus &= ~(1<<ctlType);
  39. else sutApp.appSleepStatus |= 1<<ctlType;
  40. }
  41. /*APP休眠状态接叿*/
  42. char isAppSleepReady(void){
  43. if(sutApp.appSleepStatus==0) return 1;
  44. else return 0;
  45. }
  46. /*获取指定休眠控制成员锁定的状怿
  47. 0 未锁宿否则锁定,锁定即可以休眠
  48. */
  49. char getAppObjStatus(ASLEEP_ENUM ctlType){
  50. if(sutApp.appSleepStatus & (1<<ctlType)) return 1;
  51. else return 0;
  52. }
  53. /*检测是否APP可以休眠操作*/
  54. char isSleepReady(void){
  55. static unsigned int idleCnt=0;
  56. #ifdef DISABLE_SLEEP
  57. return 0;//不休眿
  58. #endif
  59. if(isAppSleepReady()==0){
  60. idleCnt=0;
  61. return 0;
  62. }
  63. if(++idleCnt>=(APP_IDLE_TIME*1000/APP_SUB_DIV_TIME)){
  64. idleCnt=0;
  65. return 1;
  66. }else return 0;
  67. }
  68. void usbCmdHandler(const char *data,unsigned int length){
  69. static char buf[256];
  70. static int len=0;
  71. static char lach;
  72. char ch;
  73. int i;
  74. if(sutApp.authReady==0){
  75. authRecvPro(data, length);
  76. return;
  77. }
  78. for(i=0;i<length;i++){
  79. ch=data[i];
  80. if(len<sizeof(buf)-1) buf[len++]=ch;
  81. else{
  82. MSG_WARN(1, "USB Buf Over");
  83. len=0;
  84. buf[len++]=ch;
  85. }
  86. if(lach=='\r' && ch=='\n'){
  87. buf[len]=0;
  88. cmdSetting(buf);
  89. len=0;
  90. }
  91. lach=ch;
  92. }
  93. }
  94. static char micPttPressed=0;
  95. static char pttPressed=0;
  96. static void pttHandler(char type, char ctl){
  97. char needSend=0;
  98. char mic_spk;
  99. if(type==0){//ptt
  100. if(ctl==0){//放开
  101. if(micPttPressed==0){
  102. needSend=1;mic_spk=0;
  103. }
  104. pttPressed=0;
  105. }else{//按下
  106. if(pttPressed==0 && micPttPressed==0){
  107. needSend=1;mic_spk=1;
  108. }
  109. pttPressed=1;
  110. }
  111. }else{//mic ptt
  112. if(ctl==0){//放开
  113. if(pttPressed==0){
  114. needSend=1;mic_spk=0;
  115. }
  116. micPttPressed=0;
  117. }else{//按下
  118. if(pttPressed==0 && micPttPressed==0){
  119. needSend=1;mic_spk=1;
  120. }
  121. micPttPressed=1;
  122. }
  123. }
  124. if(needSend!=0){
  125. if(mic_spk==0) msgAtSend("AT+POC=0C0000\r\n");
  126. else msgAtSend("AT+POC=0B0000\r\n");
  127. }
  128. }
  129. /*打印键信恿*/
  130. const char freeSeg[]="Free";
  131. const char pressSeg[]="Press";
  132. void showKeyMessage(unsigned short key,unsigned char status){
  133. char buf[50]="[Key_";
  134. switch(key){
  135. case MKEY_VALUE_F2: strcat(buf, "F2]");break;
  136. case MKEY_VALUE_F1: strcat(buf, "F1]");break;
  137. case MKEY_VALUE_PTT: strcat(buf, "PTT]");break;
  138. case MKEY_VALUE_MENU: strcat(buf, "MENU]");break;
  139. case MKEY_VALUE_UP: strcat(buf, "UP]");break;
  140. case MKEY_VALUE_DOWN: strcat(buf, "DOWN]");break;
  141. case MKEY_VALUE_ESC: strcat(buf, "ESC]");break;
  142. case MKEY_VALUE_PWR: strcat(buf, "PWR]");break;
  143. case MKEY_VALUE_CB_GT: strcat(buf, "CB_GT]");break;
  144. case MKEY_VALUE_CB_IP: strcat(buf, "CB_IP]");break;
  145. case MKEY_VALUE_MIC_PTT: strcat(buf, "MIC_PTT]");break;
  146. default:return;
  147. }
  148. if(status==0) strcat(buf, freeSeg);
  149. else strcat(buf, pressSeg);
  150. MSG_INFO(1,buf);
  151. }
  152. unsigned char keyInArow=0;
  153. void keyCheck(unsigned short keyStatus){
  154. static unsigned short lkey=0;
  155. static unsigned char keyCtl=0,keyCnt=0;
  156. unsigned char keyType,needSendKey=0;
  157. if(keyStatus==KS_ALL_IDLE){
  158. keyType=0;
  159. if(keyCtl==1){
  160. keyCtl=0;
  161. needSendKey=1;
  162. }
  163. }else{
  164. keyType=1;
  165. if(lkey != keyStatus) keyCtl=0;//值变匿
  166. if(keyCtl==0){
  167. lkey=keyStatus;
  168. keyCtl=1;
  169. keyCnt=0;
  170. needSendKey=1;
  171. }else if(keyInArow!=0){//是否输出持续倿
  172. if(++keyCnt>=(1000/KEY_TIMER_TICK)){//每秒产生持续倿
  173. keyCnt=0;
  174. needSendKey=1;
  175. }
  176. }
  177. }
  178. if(needSendKey){
  179. if(sutApp.enableKey!=0)//延时期间不检测按锿
  180. keySendEvent(lkey,keyType);
  181. }
  182. }
  183. void pwrDetRead(char type){
  184. static char cnt=0;
  185. if(type==0){
  186. if(++cnt>=3){
  187. MSG_INFO(1, "Power is off!");
  188. appSleepCtl(ASLEEP_PWR, 1);
  189. }
  190. }else{
  191. cnt=0;
  192. }
  193. }
  194. static void lockProcess(void){
  195. if(sutApp.keyLock==0){
  196. sutApp.keyLock=1;
  197. appSleepCtl(ASLEEP_GGROUP, 0);
  198. appSleepCtl(ASLEEP_GUSER, 0);
  199. uISetNextStatus(UIS_STANDBY);
  200. }else{
  201. sutApp.keyLock=0;
  202. sutApp.lockShow=0;
  203. }
  204. }
  205. void keyToneStart(void){
  206. if(newPara.KeySound==0) return;
  207. sutPocStatus.KeyToneStart=1;
  208. paControl(true);
  209. if(ToneThreadPtr!=NULL)threadSendEvent(ToneThreadPtr,OHPOC_EVENT_MAIN,NULL,NULL,NULL);//0702
  210. }
  211. void quickUiSwitch(int uistatus){
  212. uISetNextStatus(uistatus);
  213. getStackStruct()->FastUiChange=1;
  214. }
  215. /*进入GT模式*/
  216. static void enterGTMode(void){
  217. #ifndef ENABLE_PWM_BEEP
  218. msgAtSend("AT+TONES=1\r\n");
  219. #endif
  220. sutApp.gtMode=1;
  221. uioStatusSet(UIO_INDGT);
  222. paControl(true);//GT下常开喇叭
  223. #ifdef ENABLE_PWM_BEEP
  224. pwmBeepStart(868,50);
  225. LSAPI_OSI_ThreadSleep(100);
  226. pwmBeepStart(500,50);
  227. LSAPI_OSI_ThreadSleep(100);
  228. pwmBeepStart(868,50);
  229. #else
  230. msgAtSend("AT+TONE\r\n");
  231. LSAPI_OSI_ThreadSleep(200);
  232. msgAtSend("AT+TONE\r\n");
  233. #endif
  234. MSG_WARN(1, "Enter GT Mode");
  235. }
  236. void micPttHandler(char status){
  237. keySendEvent(MKEY_VALUE_MIC_PTT,status);
  238. }
  239. //char beepStatus=0;//只tone一次,任何键放开后,有键按下可tone
  240. void keyHandler(unsigned short key,unsigned char status){//普通按键值处琿
  241. static unsigned char gtModeCnt=0;
  242. static unsigned char lockCnt=0;
  243. if(sutApp.keyLock!=0 && MKEY_VALUE_ESC!=key){
  244. sutApp.lockShow=1;
  245. return;
  246. }
  247. showKeyMessage(key,status);
  248. //if(key!=MKEY_VALUE_MIC_PTT&&key!=MKEY_VALUE_PTT)sutPocStatus.KeyToneStart=1;
  249. if(status==0){//key free
  250. switch(key){
  251. case MKEY_VALUE_MIC_PTT:
  252. pttHandler(0,0);
  253. break;
  254. case MKEY_VALUE_PTT:
  255. pttHandler(1,0);
  256. break;
  257. case MKEY_VALUE_PWR:
  258. pwrDetRead(1);
  259. break;
  260. case MKEY_VALUE_ESC:
  261. lockCnt=0;
  262. break;
  263. case MKEY_VALUE_F2:
  264. if(sutApp.key_f2_cnt==1) quickUiSwitch(UIS_MENU_USER_SEL);
  265. sutApp.key_f2_cnt=0;
  266. break;
  267. case MKEY_VALUE_CB_GT:
  268. gtModeCnt=0;
  269. break;
  270. default:
  271. break;
  272. }
  273. keyInArow=0;
  274. appSleepCtl(ASLEEP_MKEY, 0);
  275. //beepStatus=0;
  276. sutPocStatus.KeyToneStart=0;
  277. }else{//key press
  278. if(key!=MKEY_VALUE_PTT && key!=MKEY_VALUE_CB_GT && sutPocStatus.KeyToneStart==0) keyToneStart();
  279. //beepStatus=1;
  280. backLightReset();
  281. appSleepCtl(ASLEEP_MKEY, 1);
  282. keyNum++;
  283. switch(key){
  284. case MKEY_VALUE_MIC_PTT:
  285. pttHandler(0,1);
  286. break;
  287. case MKEY_VALUE_PTT:
  288. pttHandler(1,1);
  289. break;
  290. case MKEY_VALUE_PWR:
  291. keyInArow=1;
  292. pwrDetRead(0);
  293. break;
  294. case MKEY_VALUE_ESC:
  295. keyInArow=1;
  296. // msgAtSend("AT+POC=0D00000000000500000001\r\n");
  297. if(++lockCnt==3) lockProcess();
  298. break;
  299. case MKEY_VALUE_F1:
  300. quickUiSwitch(UIS_MENU_GROUP_SEL);
  301. break;
  302. case MKEY_VALUE_F2:
  303. keyInArow=1;
  304. if(++sutApp.key_f2_cnt==3) quickUiSwitch(UIS_MENU_SYS_SIM);
  305. break;
  306. case MKEY_VALUE_CB_GT:
  307. keyInArow=1;
  308. if(++gtModeCnt==3){
  309. if(sutApp.gtMode==0){
  310. enterGTMode();
  311. }
  312. }
  313. break;
  314. case MKEY_VALUE_CB_IP:
  315. keyInArow=1;
  316. break;
  317. default:
  318. break;
  319. }
  320. }
  321. }
  322. /////////////////////////////事件发送接叿//////////////////////////
  323. void threadSendEvent(LSAPI_OSI_Thread_t *threadID, unsigned int id, unsigned int param1,unsigned int param2,unsigned int param3){
  324. LSAPI_OSI_Event_t pEventSend;
  325. pEventSend.id=id;
  326. pEventSend.param1=param1;
  327. pEventSend.param2=param2;
  328. pEventSend.param3=param3;
  329. osiEventTrySend(threadID,&pEventSend,0);
  330. }
  331. //////////////////////////////其它处理接口//////////////////////////
  332. static void adcRead(void){
  333. #define VBAT_READ_TIME 20
  334. unsigned int adcValueTmp;
  335. static unsigned int siVbat=0,laSiVbat;
  336. static unsigned char index=0;
  337. LSAPI_SYS_BattGetVol(&adcValueTmp);
  338. siVbat += adcValueTmp;
  339. if(++index>=VBAT_READ_TIME){
  340. sutApp.g_iBAT=siVbat / VBAT_READ_TIME / 10;
  341. if(laSiVbat!=sutApp.g_iBAT){
  342. //MSG_INFO(1, "bat:%d", sutApp.g_iBAT);
  343. laSiVbat=sutApp.g_iBAT;
  344. if(sutApp.g_iBAT<=MIN_PWR_LEVEL){
  345. MSG_INFO(1, "Low power ,shut");
  346. sutApp.lowPwrMsg=1;
  347. appSleepCtl(ASLEEP_PWR, 1);
  348. }
  349. }
  350. siVbat=0;
  351. index=0;
  352. }
  353. }
  354. /*处理UI操作*/
  355. static void uiProcess(unsigned int exeInterval){
  356. if(getAppObjStatus(ASLEEP_PWR) != 0) return;//关机后,不切换菜单,只显示关机页靿
  357. uiLoop(exeInterval);
  358. uiResponse(exeInterval);
  359. }
  360. /*触发关机操作*/
  361. static void pwrShutPro(void){
  362. static char shutFlag=0;
  363. if(getAppObjStatus(ASLEEP_PWR) == 0) return;
  364. CTL_LCD_BL(1);
  365. msgAtSend("AT+POC=050000\r\n");
  366. msgAtSend("AT+CFUN=0\r\n");
  367. if(shutFlag==0){
  368. //显示关机界面
  369. if(sutApp.lowPwrMsg==0) guiShowMessageBox("正在关机");
  370. else guiShowMessageBox("低压关机");
  371. shutFlag=1;
  372. LSAPI_OSI_ThreadSleep(1000);
  373. }
  374. MSG_INFO(1, "Normal PwrOff");
  375. //msgAtSend("AT+TRB=1\r\n");//normal power off 当前固件先不发模块关机指令,否则断电再上电有可能是起不来皿
  376. //LSAPI_OSI_ThreadSleep(1000);//一秒后释放电源锿防止软关机不成功
  377. CTL_LCD_BL(0);
  378. MSG_INFO(1, "Release pwr");
  379. guiFillRect(0,0,GLCD_WIDTH-1,GLCD_HEIGHT-1,guiGetBackColor());//防止下次开机能看到残留
  380. CTL_POWER_HOLD(0);
  381. msgAtSend("AT+CPOF\r\n");//软件关机模块
  382. LSAPI_OSI_ThreadSleep(100);
  383. }
  384. static void NoteCheck(int interval){
  385. int dlyMs;
  386. if(sutApp.lowPwrWarn!=0){
  387. sutApp.lowPwrCnt += interval;
  388. if(sutApp.lowPwrCnt>=WARN_TTS_INTERVAL){
  389. sutApp.lowPwrCnt=0;
  390. ttsPlay(ENCODE_USER_GBK, "C7EBB3E4B5E7");
  391. }
  392. }
  393. }
  394. void AntModeRun(void){
  395. #ifdef ENABLE_ANT_MODE
  396. guiShowMessageBox("调天线模式");
  397. for(;;){
  398. LSAPI_OSI_ThreadSleep(2000);
  399. }
  400. #endif
  401. }
  402. void pocGetBJTime(unsigned int exeInterval){
  403. static unsigned short cnt=0;
  404. if(++cnt>1000/exeInterval){
  405. RTC_Update();
  406. cnt=0;
  407. }
  408. }
  409. static void paProCtl(void);
  410. static void subTimerCtl(unsigned char sleep_or_not);
  411. void appRun(void){
  412. char cnt=0;
  413. LSAPI_OSI_Event_t event={0};
  414. //等待lcd初始化完房
  415. MSG_INFO(1, "wait lcd init");
  416. while(sutApp.guiStatus==0){LSAPI_OSI_ThreadSleep(50);}//是否检测超时?
  417. AntModeRun();
  418. localAuthNow();
  419. //等待poc启动完成
  420. MSG_INFO(1, "lcd init done, wait poc start");
  421. while(sutApp.pocInitStatus==0){
  422. msgAtSend("ATE0\r\n");
  423. LSAPI_OSI_ThreadSleep(50);
  424. }
  425. //是否检测超时?
  426. MSG_INFO(1, "app loop start");
  427. msgAtSend("AT+COPS=0,2\r\n");//运营商名称获取方式,数字
  428. splVolumeSet(newPara.spkVol*10);//更新音量
  429. //设置一下TTS语音速度
  430. msgAtSend("AT+LSHTTSPARAM=3000,106,100\r\n");//设置TTS参数
  431. //查询一下POC版本叿
  432. msgAtSend("AT+POC_VER\r\n");
  433. msgAtSend("AT+GMR\r\n");//查询模块版本
  434. msgAtSend("AT+SIMCROSS?\r\n");
  435. adcRead();//在开机播放前设置下SPK
  436. backLightReset();
  437. //检测卡是否存在
  438. while(sutApp.cardStatus==0){
  439. msgAtSend("AT+CPIN?\r\n");
  440. LSAPI_OSI_ThreadSleep(2000);
  441. if(++cnt>=5){
  442. MSG_INFO(1, "Check card timeout");
  443. cnt=0;
  444. break;
  445. }
  446. }
  447. msgAtSend("AT+POC=4500000064\r\n");
  448. msgAtSend("AT+POC=2500000064\r\n");
  449. msgAtSend("AT+POC=000000010101\r\n");
  450. //ModemSetZZDPocPara();
  451. for(;;){
  452. ledsProCtl();
  453. adcRead();
  454. uiProcess(APP_SUB_DIV_TIME);
  455. gpsProCtl(APP_SUB_DIV_TIME);
  456. pocProCtl(APP_SUB_DIV_TIME);
  457. NoteCheck(APP_SUB_DIV_TIME);
  458. pocGetBJTime(APP_SUB_DIV_TIME);
  459. HookGroupUserInfo();
  460. HookVolToutCheck();
  461. IncomingSMS();
  462. if(isSleepReady()==0) LSAPI_OSI_ThreadSleep(APP_TASK_SLEEP_TIME);
  463. else if(sutApp.gtMode==0){//正常模式下可以休眿
  464. MSG_WARN(1, "APP SLEEP");
  465. stopKeyTimer();
  466. subTimerCtl(1);//切换为休眠状态定时器
  467. sutApp.appStatus=1;
  468. redLedCtl(false);//休眠后保证灯没亮,否则有可能灯亮10ms,按理10ms后灯能灭,然后10ms时休眠了,应用就短时间内不会灭灯
  469. greenLedCtl(false);//休眠后保证灯没亮
  470. LSAPI_OSI_EventWait(LSAPI_OSI_ThreadCurrent(), &event);
  471. lcdDrv_Init(1);//深度休眠唤醒后重新初始化SPI-LCD
  472. if(sutApp.lcdDlyLightUp){
  473. sutApp.lcdDlyLightUp=0;
  474. CTL_LCD_BL(1);
  475. }
  476. sutApp.forceUiFlash=1;
  477. sutApp.appStatus=0;
  478. subTimerCtl(0);//切换为唤醒状态定时器
  479. MSG_WARN(1, "APP WAKEUP");
  480. }
  481. //检测是否关机,这里要放在唤醒后操作
  482. pwrShutPro();
  483. }
  484. }
  485. unsigned int subTimerInterval=100;//定时器定时的时间
  486. LSAPI_OSI_Timer_t *pSubtimer_t = NULL;
  487. /*
  488. 为了做低功耗,此定时器在休眠时,设置为长时间定旿
  489. 非休眠时,设置为短时间定旿
  490. sleep_or_not:0 未休眠, else 休眠
  491. */
  492. static void subTimerCtl(unsigned char sleep_or_not){
  493. if(NULL==pSubtimer_t){
  494. MSG_WARN(1, "subTimer null");
  495. return;
  496. }
  497. LSAPI_OSI_TimerStop(pSubtimer_t);
  498. //打开定时噿
  499. if(sleep_or_not==0) subTimerInterval=100;//未休眠时_00ms
  500. else subTimerInterval=5000;//休眠旿5000ms
  501. LSAPI_OSI_TimerStart(pSubtimer_t,subTimerInterval);
  502. }
  503. static void subTimeroutcallback(void *param){
  504. unsigned int *dlyTime=(unsigned int *)param;
  505. //处理灯的显示
  506. uioProctl(*dlyTime);
  507. //控制功放的关闿
  508. paProCtl();
  509. if(NULL!=pSubtimer_t) LSAPI_OSI_TimerStart(pSubtimer_t,subTimerInterval);
  510. }
  511. void subTask(void *param){
  512. LSAPI_OSI_Event_t event={0};
  513. if(NULL==pSubtimer_t) pSubtimer_t = LSAPI_OSI_TimerCreate(LSAPI_OSI_ThreadCurrent(), subTimeroutcallback, (void *)&subTimerInterval);
  514. if(NULL==pSubtimer_t) MSG_WARN(1,"sub timer init failed");
  515. else LSAPI_OSI_TimerStart(pSubtimer_t,subTimerInterval);
  516. for(;;){LSAPI_OSI_EventWait(LSAPI_OSI_ThreadCurrent(), &event);}
  517. }
  518. static void paProCtl(void){
  519. //会被定时调用
  520. if(sutPocStatus.TTS!=0) return;
  521. if(sutPocStatus.spk!=0) return;
  522. if(sutPocStatus.TONE!=0) return;
  523. if(sutPocStatus.KeyToneStart!=0) return;
  524. if(sutApp.gtMode!=0) return;
  525. paControl(false);
  526. //MSG_INFO(1,"spk off");
  527. }
  528. void tryWakeupApp(void){
  529. if(sutApp.appStatus!=0){
  530. if(mainThreadPtr!=NULL){
  531. threadSendEvent(mainThreadPtr,OHPOC_EVENT_MAIN,NULL,NULL,NULL);
  532. }
  533. }
  534. }
  535. void ttsPlay(ENCODE_USER_ENUM type, char *tts){
  536. char buf[20];
  537. MSG_INFO(1, "tts Play:%d,%s",type,tts);
  538. paControl(true);
  539. snprintf(buf, sizeof(buf), "AT+LSHTTS=%d,\"", type);
  540. msgAtSend(buf);
  541. msgAtSend(tts);
  542. msgAtSend("\"\r\n");
  543. sutPocStatus.TTS=1;
  544. }
  545. /*背光时间到,熄灭*/
  546. void backLightCb(void *param){
  547. if(sutPocStatus.firstLogin==0) return;//未登录过,不灭屏
  548. if(newPara.lcdParaList[newPara.lcdParaDefaultIndex]==0) return;//常亮
  549. CTL_LCD_BL(0);
  550. appSleepCtl(ASLEEP_LCD, 0);//可以休眠
  551. }
  552. /*点亮背光*/
  553. void backLightReset(void){
  554. unsigned short tmp;
  555. appSleepCtl(ASLEEP_LCD, 1);//不让休眠
  556. tmp=newPara.lcdParaList[newPara.lcdParaDefaultIndex];
  557. if(sutApp.appStatus==0) CTL_LCD_BL(1);//未休眠时,直接点亮
  558. else sutApp.lcdDlyLightUp=1;//休眠时不马上亮亮,会在LCD初始化完后点亮
  559. startBackLightTimer(tmp*1000);
  560. }
  561. void sysPwrLock(void){
  562. sutApp.pwrLock=1;
  563. }
  564. void sysPwrRlease(void){
  565. sutApp.pwrLock=0;
  566. }
  567. //"3132" --> 0x31,0x32
  568. void StrAsciiToHex(char *src, unsigned char *des){
  569. unsigned char temp[2],i;
  570. if(strlen(src)%2) return;
  571. while(0!=*src)
  572. {
  573. for(i=0;i<2;i++)
  574. {
  575. temp[i] = *src++;
  576. if(temp[i] >= '0' && temp[i] <= '9') temp[i] -= 0x30;
  577. else if(temp[i] >= 'A' && temp[i] <= 'F') temp[i] -= 0x37;
  578. else temp[i] -= 0x57;
  579. }
  580. temp[0] <<= 4;
  581. temp[0] &= 0xf0;
  582. *des++=temp[0]|temp[1];
  583. }
  584. *des=0;
  585. }
  586. void splVolumeSet(unsigned char level){
  587. char info[30];
  588. snprintf(info, sizeof(info), "AT+CLVL=%d\r\nAT+CRSL=%d\r\n", level,level);
  589. msgAtSend(info);
  590. }
  591. /*调节音量,刷新音量进度条*/
  592. void volAdjAction(char direction){
  593. if(direction==0){
  594. if(newPara.spkVol<MAX_SPK_VOL) newPara.spkVol++;
  595. else goto FLASH;
  596. }else{
  597. if(newPara.spkVol>0) newPara.spkVol--;
  598. else goto FLASH;
  599. }
  600. splVolumeSet(newPara.spkVol*10);
  601. MSG_INFO(1,"SPK_VOL:%d",newPara.spkVol*10);
  602. sysIniSave();
  603. //刷新进度条
  604. FLASH:
  605. volUiFlash(newPara.spkVol);
  606. }