app.c 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138
  1. #include "includes.h"
  2. #include "osi_api.h"
  3. #define APP_IDLE_TIME 3 //如果POC已休眿APP没有操作一定秒数后休眠
  4. int keyNum=0;
  5. APP_DEF sutApp;
  6. void plusKeyNum(void){
  7. keyNum++;
  8. }
  9. static void appDataInit(void){
  10. memset((unsigned char *)&sutApp, 0, sizeof(APP_DEF));
  11. sutApp.updateStatusBar=1;
  12. sutApp.g_iBAT=-1;
  13. sutApp.copstype=-1;
  14. sutApp.pcant=4;
  15. sutApp.enableKey=1;
  16. appSleepCtl(ASLEEP_POC, 1);
  17. appSleepCtl(ASLEEP_LCD, 1);
  18. readInfoNow();
  19. sysIniRead();
  20. #ifdef ENABLE_DEBUG
  21. takeNoteOfSerType();
  22. #endif
  23. }
  24. void dataInit(void){
  25. appDataInit();
  26. pocDataInit();
  27. gpsDataInit();
  28. uiDataInit();
  29. }
  30. static void ledsProCtl(void){
  31. if(sutApp.gtMode!=0) return;
  32. if(0==sutPocStatus.logined) uioStatusSet(UIO_INDOFFLINE);
  33. else if(sutPocStatus.spk>0)uioStatusSet(UIO_INDRX);
  34. else if(sutPocStatus.mic>0 )uioStatusSet(UIO_INDTX);
  35. else uioStatusSet(UIO_INDONLINE);
  36. }
  37. static void adcRead(unsigned int interval);
  38. char isKeyPress(void){
  39. if(keyNum) return keyNum--;
  40. else return 0;
  41. }
  42. /*APP休眠处理接口
  43. ctlType, 操作对象
  44. status,操作值,0 清除 else 设置
  45. */
  46. void appSleepCtl(ASLEEP_ENUM ctlType, char status){
  47. if(status==0) sutApp.appSleepStatus &= ~(1<<ctlType);
  48. else sutApp.appSleepStatus |= 1<<ctlType;
  49. }
  50. /*APP休眠状态接叿*/
  51. char isAppSleepReady(void){
  52. if(sutApp.appSleepStatus==0) return 1;
  53. else return 0;
  54. }
  55. /*获取指定休眠控制成员锁定的状怿
  56. 0 未锁宿否则锁定,锁定即可以休眠
  57. */
  58. char getAppObjStatus(ASLEEP_ENUM ctlType){
  59. if(sutApp.appSleepStatus & (1<<ctlType)) return 1;
  60. else return 0;
  61. }
  62. /*检测是否APP可以休眠操作*/
  63. char isSleepReady(void){
  64. static unsigned int idleCnt=0;
  65. #ifdef DISABLE_SLEEP
  66. return 0;//不休眿
  67. #endif
  68. if(isAppSleepReady()==0){
  69. idleCnt=0;
  70. return 0;
  71. }
  72. if(++idleCnt>=(APP_IDLE_TIME*1000/APP_SUB_DIV_TIME)){
  73. idleCnt=0;
  74. return 1;
  75. }else return 0;
  76. }
  77. void usbCmdHandler(const char *data,unsigned int length){
  78. static char buf[256];
  79. static int len=0;
  80. static char lach;
  81. char ch;
  82. int i;
  83. if(sutApp.authReady==0){
  84. authRecvPro(data, length);
  85. return;
  86. }
  87. for(i=0;i<length;i++){
  88. ch=data[i];
  89. if(len<sizeof(buf)-1) buf[len++]=ch;
  90. else{
  91. MSG_WARN(1, "USB Buf Over");
  92. len=0;
  93. buf[len++]=ch;
  94. }
  95. if(lach=='\r' && ch=='\n'){
  96. buf[len]=0;
  97. cmdSetting(buf);
  98. len=0;
  99. }
  100. lach=ch;
  101. }
  102. }
  103. static void pttHandler(char type, char ctl){
  104. #if 1//主PTT, 耳机PTT以及组合PTT都可以触发,即矩阵驱动时,任何一个按下如果没发请麦,则发请麦,只要有一个放开,则直接发放麦指令。因为组合按放后,放开,只有一个放开键值出来
  105. static char micPttPressed=0;
  106. static char pttPressed=0;
  107. static char maxPressed=0;
  108. if(type==0){//ptt
  109. if(ctl==0){//free
  110. pttPressed=0;
  111. }else{//press
  112. pttPressed=1;
  113. }
  114. }else if(type==1){//mic ptt
  115. if(ctl==0){//free
  116. micPttPressed=0;
  117. }else{//press
  118. micPttPressed=1;
  119. }
  120. }else if(type==2){//mic ptt
  121. if(ctl==0){//free
  122. maxPressed=0;
  123. }else{//press
  124. maxPressed=1;
  125. }
  126. }else return;
  127. if(ctl==0){//free
  128. if(pttPressed==0 || micPttPressed==0 || maxPressed==0){
  129. sutApp.pttReq=0;
  130. pttPressed=0;micPttPressed=0;maxPressed=0;
  131. msgAtSend("AT+POC=0C0000\r\n");
  132. sutPocStatus.PaDlyStart=1;
  133. paControl(true);
  134. }
  135. }else{//press
  136. if(pttPressed || micPttPressed || maxPressed){
  137. if(sutApp.pttReq==0){
  138. sutApp.pttReq=1;
  139. msgAtSend("AT+POC=0B0000\r\n");
  140. sutPocStatus.PaDlyStart=1;
  141. paControl(true);
  142. }
  143. }
  144. }
  145. #else
  146. static char micPttPressed=0;
  147. static char pttPressed=0;
  148. char needSend=0;
  149. char mic_spk;
  150. if(type==0){//ptt
  151. if(ctl==0){//放开
  152. if(micPttPressed==0){
  153. needSend=1;mic_spk=0;
  154. }
  155. pttPressed=0;
  156. }else{//按下
  157. if(pttPressed==0 && micPttPressed==0){
  158. needSend=1;mic_spk=1;
  159. }
  160. pttPressed=1;
  161. }
  162. }else if(type==1){//mic ptt
  163. if(ctl==0){//放开
  164. if(pttPressed==0){
  165. needSend=1;mic_spk=0;
  166. }
  167. micPttPressed=0;
  168. }else{//按下
  169. if(pttPressed==0 && micPttPressed==0){
  170. needSend=1;mic_spk=1;
  171. }
  172. micPttPressed=1;
  173. }
  174. }
  175. if(needSend!=0){
  176. if(mic_spk==0) msgAtSend("AT+POC=0C0000\r\n");
  177. else msgAtSend("AT+POC=0B0000\r\n");
  178. }
  179. #endif
  180. }
  181. /*打印键信恿*/
  182. const char freeSeg[]="Free";
  183. const char pressSeg[]="Press";
  184. void showKeyMessage(unsigned short key,unsigned char status){
  185. char buf[50]="[Key_";
  186. switch(key){
  187. case MKEY_VALUE_F2: strcat(buf, "F2]");break;
  188. case MKEY_VALUE_F1: strcat(buf, "F1]");break;
  189. case MKEY_VALUE_PTT: strcat(buf, "PTT]");break;
  190. case MKEY_VALUE_MENU: strcat(buf, "MENU]");break;
  191. case MKEY_VALUE_UP: strcat(buf, "UP]");break;
  192. case MKEY_VALUE_DOWN: strcat(buf, "DOWN]");break;
  193. case MKEY_VALUE_ESC: strcat(buf, "ESC]");break;
  194. case MKEY_VALUE_CB_GT: strcat(buf, "CB_GT]");break;
  195. case MKEY_VALUE_CB_IP: strcat(buf, "CB_IP]");break;
  196. case MKEY_VALUE_MIC_PTT: strcat(buf, "MIC_PTT]");break;
  197. case MKEY_VALUE_CB_PTT: strcat(buf, "MAX_PTT]");break;
  198. default: return;
  199. }
  200. if(status==0) strcat(buf, freeSeg);
  201. else strcat(buf, pressSeg);
  202. MSG_INFO(1,buf);
  203. }
  204. /*
  205. 龙尚矩阵驱动有一个问题:先按A不放,检测到A按下,再按B不放,检测到B按下,同时放开,概率只检测到B放开,A没检测到
  206. 规避方式:键值发生变化时,如果上次的键值大于等于2,直接清掉键值。
  207. */
  208. void assistantCheck(unsigned short key){
  209. unsigned int i,j,w;
  210. static unsigned short lkey=0;
  211. if(lkey==key) return;
  212. j=0;
  213. for(i=0;i<16;i++){//上次键值置位的个数
  214. if(lkey & (1<<i)) j++;
  215. }
  216. w=0;
  217. for(i=0;i<16;i++){//本次键值置位的个数
  218. if(key & (1<<i)) w++;
  219. }
  220. if(j>=2 && j>w){//上一次至少两个键按下,现在发生变化,至少一个键放开了,全键清除
  221. lkey=0;
  222. clearKeyValue();
  223. }
  224. lkey=key;
  225. }
  226. unsigned char keyInArow=0;
  227. void keyCheck(unsigned short keyStatus){
  228. static unsigned short lkey=0;
  229. static unsigned char keyCtl=0,keyCnt=0;
  230. unsigned char keyType,needSendKey=0;
  231. assistantCheck(keyStatus);
  232. if(keyStatus==KS_ALL_IDLE){
  233. keyType=0;
  234. if(keyCtl==1){
  235. keyCtl=0;
  236. needSendKey=1;
  237. }
  238. }else{
  239. keyType=1;
  240. if(lkey != keyStatus) keyCtl=0;//值变匿
  241. if(keyCtl==0){
  242. lkey=keyStatus;
  243. keyCtl=1;
  244. keyCnt=0;
  245. needSendKey=1;
  246. }else if(keyInArow!=0){//是否输出持续倿
  247. if(++keyCnt>=(1000/KEY_TIMER_TICK)){//每秒产生持续倿
  248. keyCnt=0;
  249. needSendKey=1;
  250. }
  251. }
  252. }
  253. if(needSendKey){
  254. if(sutApp.enableKey!=0)//延时期间不检测按锿
  255. keySendEvent(lkey,keyType);
  256. }
  257. }
  258. bool lcdBackLightStatus=false;
  259. void pwrDetRead(char type){
  260. static char cnt=0;
  261. if(type==0){
  262. cnt++;
  263. if(cnt==3){
  264. sutApp.waitEscReleased=1;
  265. uISetNextStatus(UIS_MENU_SHUT_PWR);
  266. }
  267. }else{
  268. sutApp.waitEscReleased=0;
  269. cnt=0;
  270. }
  271. #if 0
  272. if(sutUIstatus.Status == UIS_MENU_SHUT_PWR) return;//关机界面不处理
  273. if(type==0) return;//放开时处理
  274. //处理按顶部键切换UI
  275. uiTimeOutToStandby(1,APP_SUB_DIV_TIME);
  276. //处理按顶部键切换背光
  277. if(sutUIstatus.Status != UIS_STANDBY) return;//待机页面时才反转背光
  278. if(lcdBackLightStatus==false) backLightReset();
  279. else lcdBackLightApi(0);
  280. #endif
  281. }
  282. void lcdBackLightApi(char value){
  283. CTL_LCD_BL(value);
  284. if(value==0) lcdBackLightStatus=false;
  285. else lcdBackLightStatus=true;
  286. }
  287. static void lockProcess(void){
  288. if(sutApp.keyLock==0){
  289. sutApp.keyLock=1;
  290. appSleepCtl(ASLEEP_GGROUP, 0);
  291. appSleepCtl(ASLEEP_GUSER, 0);
  292. uISetNextStatus(UIS_STANDBY);
  293. }else{
  294. sutApp.keyLock=0;
  295. sutApp.lockShow=0;
  296. }
  297. }
  298. void keyToneStart(void){
  299. if(newPara.KeySound==0) return;
  300. sutPocStatus.beep=1;
  301. paControl(true);
  302. if(ToneThreadPtr!=NULL)threadSendEvent(ToneThreadPtr,OHPOC_EVENT_MAIN,NULL,NULL,NULL);//0702
  303. }
  304. void quickUiSwitch(int uistatus){
  305. if(true==isUiSwitchReady()) return;
  306. uISetNextStatus(uistatus);
  307. getStackStruct()->FastUiChange=1;
  308. }
  309. /*进入GT模式*/
  310. static void enterGTMode(void){
  311. sutApp.gtMode=1;
  312. uioStatusSet(UIO_INDGT);
  313. paControl(true);//GT下常开喇叭
  314. LSAPI_OSI_ThreadSleep(200);
  315. MSG_WARN(1, "Enter GT Mode");
  316. }
  317. void micPttHandler(char status){
  318. keySendEvent(MKEY_VALUE_MIC_PTT,status);
  319. }
  320. void keyHandler(unsigned short key,unsigned char status){//普通按键值处琿
  321. static unsigned char debugcnt=0;
  322. static unsigned char gtModeCnt=0;
  323. static unsigned char lockCnt=0;
  324. if(newPara.lockType!=0){
  325. if(sutApp.keyLock!=0 &&(MKEY_VALUE_MENU!=key)){
  326. sutApp.lockShow=1;
  327. return;
  328. }
  329. }else{
  330. if(sutApp.keyLock!=0 && (MKEY_VALUE_DOWN==key || MKEY_VALUE_ESC==key)){
  331. sutApp.lockShow=1;
  332. return;
  333. }
  334. }
  335. showKeyMessage(key,status);
  336. //MSG_INFO(1,"key========%d",key);
  337. if(status==0){//key free
  338. switch(key){
  339. case MKEY_VALUE_MIC_PTT:
  340. pttHandler(0,0);
  341. break;
  342. case MKEY_VALUE_PTT:
  343. pttHandler(1,0);
  344. break;
  345. case MKEY_VALUE_CB_PTT:
  346. pttHandler(2,0);
  347. break;
  348. case MKEY_VALUE_ESC:
  349. pwrDetRead(1);
  350. break;
  351. case MKEY_VALUE_F1:
  352. if(sutApp.key_f1_cnt==1 && sutUIstatus.Status!=UIS_MENU_SYS_SERVERPASS) sutApp.voluemUpdate=1;
  353. sutApp.key_f1_cnt=0;
  354. break;
  355. case MKEY_VALUE_F2:
  356. if(sutApp.key_f2_cnt==1 && sutUIstatus.Status!=UIS_MENU_SYS_SERVERPASS) sutApp.voluemUpdate=2;
  357. sutApp.key_f2_cnt=0;
  358. break;
  359. case MKEY_VALUE_CB_GT:
  360. gtModeCnt=0;
  361. break;
  362. case MKEY_VALUE_MENU:
  363. if(sutApp.keyLock != 0 && lockCnt==1)//实际无法实现锁短按一下,因为按下去键值就被使用了,不过锁键盘后,都是在待机界面,不影响
  364. sutApp.lockShow=1;
  365. lockCnt=0;
  366. break;
  367. case MKEY_VALUE_CB_IP:
  368. debugcnt=0;
  369. break;
  370. default:
  371. break;
  372. }
  373. sutApp.timeOutCnt=0;
  374. keyInArow=0;
  375. appSleepCtl(ASLEEP_MKEY, 0);
  376. }else{//key press
  377. if(key!=MKEY_VALUE_MIC_PTT &&key!=MKEY_VALUE_PTT && key!=MKEY_VALUE_CB_GT) keyToneStart();
  378. backLightReset();//其它所有键都点亮(接口里面有调阻止休眠接口)
  379. appSleepCtl(ASLEEP_MKEY, 1);
  380. keyNum++;
  381. switch(key){
  382. case MKEY_VALUE_MIC_PTT:
  383. pttHandler(0,1);
  384. break;
  385. case MKEY_VALUE_PTT:
  386. pttHandler(1,1);
  387. break;
  388. case MKEY_VALUE_CB_PTT:
  389. pttHandler(2,1);
  390. break;
  391. case MKEY_VALUE_ESC:
  392. keyInArow=1;
  393. pwrDetRead(0);
  394. break;
  395. case MKEY_VALUE_F1:
  396. keyInArow=1;
  397. sutApp.key_f1_cnt++;
  398. if(sutApp.keyLock==0){
  399. if(sutApp.key_f1_cnt==3) quickUiSwitch(UIS_MENU_GROUP_SEL);
  400. }else if(sutApp.key_f1_cnt!=1) sutApp.lockShow=1;
  401. break;
  402. case MKEY_VALUE_F2:
  403. keyInArow=1;
  404. sutApp.key_f2_cnt++;
  405. if(sutApp.keyLock==0){
  406. if(sutApp.key_f2_cnt==3) quickUiSwitch(UIS_MENU_USER_SEL);
  407. }else if(sutApp.key_f2_cnt!=1) sutApp.lockShow=1;
  408. break;
  409. case MKEY_VALUE_CB_GT:
  410. keyInArow=1;
  411. gtModeCnt++;
  412. if(sutApp.keyLock==0){
  413. if(gtModeCnt==3){
  414. if(sutApp.gtMode==0){
  415. enterGTMode();
  416. }
  417. }
  418. }else sutApp.lockShow=1;
  419. break;
  420. case MKEY_VALUE_CB_IP:
  421. keyInArow=1;
  422. if(++debugcnt==10) uISetNextStatus(UIS_DEBUG);
  423. break;
  424. case MKEY_VALUE_MENU:
  425. keyInArow=1;
  426. if(++lockCnt==3) lockProcess();
  427. break;
  428. default:
  429. break;
  430. }
  431. }
  432. }
  433. unsigned char encodeDirection=ENCODE_IDLE;
  434. unsigned char getEncodeStatus(void){
  435. unsigned char tmp=encodeDirection;
  436. if(encodeDirection!=ENCODE_IDLE) encodeDirection=ENCODE_IDLE;
  437. return tmp;
  438. }
  439. #define PROCESS_ENCODE_TIME//是否要延时连续处理旋钮键值
  440. void encodeHandler(unsigned char encode){
  441. #ifdef PROCESS_ENCODE_TIME
  442. static int64_t lastTimeMs=0;
  443. int64_t timems=LSAPI_OSI_UpTime();
  444. //添加下延时,0.5秒处理一次
  445. if(timems-lastTimeMs<100) goto ENCODE_END;
  446. lastTimeMs=timems;
  447. #endif
  448. //处理键值
  449. if(encode==ENCODE_SHUN) MSG_INFO(1, "[Encode]:shun");
  450. else if(encode==ENCODE_NI) MSG_INFO(1, "[Encode]:ni");
  451. plusKeyNum();
  452. backLightReset();
  453. tryWakeupApp();
  454. sutApp.timeOutCnt=0;
  455. // if(sutUIstatus.Status==UIS_STANDBY){
  456. // sutApp.groupKeyType=1;
  457. // quickUiSwitch(UIS_MENU_GROUP_SEL);
  458. // }else{
  459. // encodeDirection=encode;
  460. // }
  461. if(encode==ENCODE_SHUN){
  462. sutApp.voluemUpdate=1;
  463. }else if(encode==ENCODE_NI){
  464. sutApp.voluemUpdate=2;
  465. }
  466. #ifdef PROCESS_ENCODE_TIME
  467. ENCODE_END:
  468. #endif
  469. encodeReleased();
  470. }
  471. /////////////////////////////事件发送接叿//////////////////////////
  472. void threadSendEvent(LSAPI_OSI_Thread_t *threadID, unsigned int id, unsigned int param1,unsigned int param2,unsigned int param3){
  473. LSAPI_OSI_Event_t pEventSend;
  474. pEventSend.id=id;
  475. pEventSend.param1=param1;
  476. pEventSend.param2=param2;
  477. pEventSend.param3=param3;
  478. osiEventTrySend(threadID,&pEventSend,0);
  479. }
  480. //////////////////////////////其它处理接口//////////////////////////
  481. static void adcRead(unsigned int interval){
  482. static unsigned char earStatus=0xff;
  483. int32_t chargeVol;
  484. static unsigned short cnt=0,lcnt=0;
  485. static unsigned int laSiVbat;
  486. unsigned int adcValueTmp;
  487. if(++cnt<(1000/interval)) return;//1秒读一次ADC即可
  488. cnt=0;
  489. LSAPI_SYS_BattGetVol(&adcValueTmp);
  490. sutApp.g_iBAT=adcValueTmp/10;
  491. if(sutApp.g_iBAT == laSiVbat){
  492. laSiVbat=sutApp.g_iBAT;
  493. if(sutApp.g_iBAT<=MIN_PWR_LEVEL){
  494. MSG_WARN(1,"Low power:%d", lcnt++);
  495. if(lcnt>=10){
  496. MSG_INFO(1, "Low power ,shut");
  497. sutApp.lowPwrMsg=1;
  498. appSleepCtl(ASLEEP_PWR, 1);
  499. }
  500. }else lcnt=0;
  501. }
  502. //读取充电/耳机接入状态 //不知道为啥是LSAPI_Device_ADC_CHANNEL_3,而不是LSAPI_Device_ADC_CHANNEL_1
  503. chargeVol=LSAPI_Device_AdcGetChannelVolt(LSAPI_Device_ADC_CHANNEL_3, LSAPI_Device_ADC_SCALE_3V233);
  504. if(chargeVol<=2000){//�,没在充电
  505. //tmpEar=0;
  506. sutApp.chargeStatus=0;
  507. }else{//正在充电
  508. //tmpEar=1;
  509. sutApp.chargeStatus=1;
  510. }
  511. }
  512. /*处理UI操作*/
  513. static void uiProcess(unsigned int exeInterval){
  514. static int cnt=0;
  515. if(getAppObjStatus(ASLEEP_PWR) != 0) return;//关机后,不切换菜单,只显示关机
  516. uiLoop(exeInterval);
  517. uiResponse(exeInterval);
  518. }
  519. /*触发关机操作*/
  520. static void pwrShutPro(void){
  521. static char shutFlag=0;
  522. if(getAppObjStatus(ASLEEP_PWR) == 0) return;
  523. lcdBackLightApi(1);
  524. msgAtSend("AT+CFUN=0\r\n");
  525. if(shutFlag==0){
  526. //显示关机界面
  527. if(sutApp.lowPwrMsg==0) guiShowMessageBox("正在关机");
  528. else guiShowMessageBox("低压关机");
  529. shutFlag=1;
  530. LSAPI_OSI_ThreadSleep(1000);
  531. guiShowBmp(0,0,"BYEBYE.bmp");
  532. LSAPI_OSI_ThreadSleep(1000);
  533. }
  534. MSG_INFO(1, "Normal PwrOff");
  535. //msgAtSend("AT+TRB=1\r\n");//normal power off 当前固件先不发模块关机指令,否则断电再上电有可能是起不来皿
  536. //LSAPI_OSI_ThreadSleep(1000);//一秒后释放电源锿防止软关机不成功
  537. lcdBackLightApi(0);
  538. MSG_INFO(1, "Release pwr");
  539. guiFillRect(0,0,GLCD_WIDTH-1,GLCD_HEIGHT-1,guiGetBackColor());//防止下次开机能看到残留
  540. msgAtSend("AT+CPOF\r\n");//软件关机模块
  541. LSAPI_OSI_ThreadSleep(100);
  542. CTL_POWER_HOLD(false);
  543. }
  544. static void NoteCheck(int interval){
  545. int dlyMs;
  546. if(sutApp.lowPwrWarn!=0){
  547. sutApp.lowPwrCnt += interval;
  548. if(sutPocStatus.spk==0 && sutPocStatus.mic==0){//对计状态下不播放请充电
  549. if(sutApp.lowPwrCnt>=WARN_TTS_INTERVAL){
  550. sutApp.lowPwrCnt=0;
  551. ttsPlay(ENCODE_USER_GBK, "C7EBB3E4B5E7");
  552. }
  553. }
  554. }
  555. }
  556. void AntModeRun(void){
  557. #ifdef ENABLE_ANT_MODE
  558. guiShowMessageBox("调天线模式");
  559. for(;;){
  560. LSAPI_OSI_ThreadSleep(2000);
  561. }
  562. #endif
  563. }
  564. void ShouHuProcess(int interva)
  565. {
  566. static char nRet=0;
  567. static char regcnt=0;
  568. //static int LastAtt_state=0;
  569. int tmepAtt_state=0;
  570. static int cnt=0;
  571. if(sutApp.gtMode==1||sutApp.cardStatus==0)return;
  572. if(++cnt<(1000/interva)) return;
  573. cnt=0;
  574. nRet=LSAPI_NET_GetGprsAttState(&tmepAtt_state);
  575. if(nRet!=0){
  576. MSG_WARN(1,"Get REG status failed");
  577. return;
  578. }
  579. if(tmepAtt_state!=1){
  580. //if(LastAtt_state!=tmepAtt_state)MSG_WARN(1,"REG off");
  581. if(regcnt==60){
  582. MSG_WARN(1,"!!!!CFUN=0");
  583. msgAtSend("AT+CFUN=0\r\n");
  584. }else if(regcnt>=61){
  585. MSG_WARN(1,"!!!!CFUN=1");
  586. msgAtSend("AT+CFUN=1\r\n");
  587. regcnt=0;
  588. }
  589. ++regcnt;
  590. }else {
  591. regcnt=0;
  592. }
  593. }
  594. void Ear_Judge(){
  595. LSAPI_HeadSetStatus_t status;
  596. status= LSAPI_Device_HeadSetGetStatus();//0628
  597. if(status == LSAPI_HEADSET_DISCONNECT)
  598. {
  599. MSG_INFO(1,"headset_disconnect");
  600. handsetStatusOutput(1);
  601. }
  602. else if(status == LSAPI_HEADSET_CONNECT)
  603. {
  604. MSG_INFO(1," headset_connect");
  605. handsetStatusOutput(0);
  606. }
  607. else
  608. {
  609. MSG_INFO(1,"unknow state");
  610. }
  611. }
  612. //30秒 无人呼叫自动退出单呼
  613. void AutoExitDanhu(int interva)
  614. {
  615. static int cnt=0;
  616. unsigned char buf[40];
  617. if(sutPocStatus.danHuStatus==0)return;
  618. if(sutPocStatus.mic||sutPocStatus.spk){
  619. cnt=0;
  620. return;
  621. }
  622. if(++cnt<(30*1000/interva)) return;
  623. cnt=0;
  624. snprintf(buf, sizeof(buf),"AT+POC=090000%08x\r\n",sutPocStatus.LocalGroup.ID);
  625. msgAtSend(buf);
  626. }
  627. #define APP_NEED_SLEEP OSI_MAKE_TAG('S', 'E', 'L', 'P')
  628. void ls_suspend(void *ctx, osiSuspendMode_t mode)
  629. {
  630. MSG_INFO(1,"\n\r ls_suspend mode:%d\n",mode);
  631. }
  632. void ls_resume(void *ctx, osiSuspendMode_t mode, uint32_t source)
  633. {
  634. MSG_INFO(1,"\n\r ls_resume mode:%d,source:%d\n",mode,source);
  635. }
  636. osiPmSourceOps_t sleep_ops =
  637. {
  638. ls_suspend,
  639. ls_resume,
  640. NULL,
  641. NULL
  642. };
  643. static void paProCtl(void);
  644. static void subTimerCtl(unsigned char sleep_or_not);
  645. static void configureVoiceParam(void);
  646. static void Sectick(unsigned int interval){
  647. static unsigned short cnt=0,lcnt=0;
  648. if(++cnt<(3*1000/interval)) return;//1秒读一次ADC即可
  649. cnt=0;
  650. MSG_INFO(1,"charge[%d]",sutApp.chargeStatus);
  651. Ble_SendAT(Ble_IO2AT,sizeof(Ble_IO2AT));
  652. }
  653. void appRun(void){
  654. char cnt=0;
  655. LSAPI_OSI_Event_t event={0};
  656. osiPmSource_t*App_osiPmSource_t=NULL;
  657. //char playtts[]="你好呀";
  658. App_osiPmSource_t=osiPmSourceCreate(APP_NEED_SLEEP, &sleep_ops, NULL);
  659. osiPmWakeLock(App_osiPmSource_t); //拿住资源不让系统休眠
  660. //等待lcd初始化完房
  661. MSG_INFO(1, "wait lcd init");
  662. while(sutApp.guiStatus==0){LSAPI_OSI_ThreadSleep(50);}//是否检测超时?
  663. AntModeRun();
  664. localAuthNow();
  665. //等待poc启动完成
  666. MSG_INFO(1, "lcd init done, wait poc start");
  667. while(sutApp.pocInitStatus==0){
  668. //msgAtSend("AT+POC_VER\r\n");//不能发,否则有概率POC收到不正确指令导致VAT阻塞
  669. msgAtSend("ATE0\r\n");
  670. LSAPI_OSI_ThreadSleep(1000);
  671. }//是否检测超时?
  672. MSG_INFO(1, "app loop start");
  673. msgAtSend("AT+AUDCH=0,0\r\n");//此机型只使用主通道
  674. Ear_Judge();
  675. //设置一下TTS语音速度
  676. msgAtSend("AT+LSHTTSPARAM=3000,106,100\r\n");//设置TTS参数
  677. msgAtSend("ATI\r\n");//查询模块版本
  678. msgAtSend("AT+SIMCROSS?\r\n");
  679. LSAPI_OSI_ThreadSleep(1000);
  680. msgAtSend("AT+POC=2500000150\r\n"); //tone音量
  681. msgAtSend("AT+POC=4500000064\r\n"); //对讲音量
  682. #ifdef CONFIG_AUDIO_AFTER_INIT
  683. configureVoiceParam();
  684. #else
  685. for(cnt=0;cnt<5;cnt++){
  686. configureVoiceParam();
  687. LSAPI_OSI_ThreadSleep(100);
  688. sutApp.audioReconfig=2;
  689. msgAtSend("AT+CACCP=0,0,1,\"\"\r\n");//检测mic是否被mute掉了
  690. LSAPI_OSI_ThreadSleep(200);
  691. if(sutApp.audioReconfig==0) break;
  692. }
  693. #endif
  694. adcRead(APP_SUB_DIV_TIME);//在开机播放前设置下SPK
  695. splVolumeSet(newPara.spkVol*10);//更新音量
  696. backLightReset();
  697. if(newPara.ttsMessage[0]!=0){
  698. if(newPara.ttsCodeType==0){
  699. ttsPlay(ENCODE_USER_UNICODE_BE, newPara.ttsMessage);
  700. }else if(newPara.ttsCodeType==1) ttsPlay(ENCODE_USER_GBK, newPara.ttsMessage);
  701. else MSG_INFO(1, "ttsCodeType:%d not support", newPara.ttsCodeType);
  702. }else MSG_INFO(1, "tts null");
  703. //检测卡是否存在
  704. while(sutApp.cardStatus==0){
  705. msgAtSend("AT+CPIN?\r\n");
  706. LSAPI_OSI_ThreadSleep(1000);
  707. if(++cnt>=10){
  708. MSG_INFO(1, "Check card timeout");
  709. break;
  710. }
  711. }
  712. msgAtSend("AT+POC=000000010101\r\n");
  713. pwrModeSetCmd(newPara.pwrMode);//心跳间隔 ZZD_PWRMODE
  714. ModemSetZZDPocPara();
  715. osiPmWakeUnlock(App_osiPmSource_t);
  716. BLE_Open();//d 打开蓝牙
  717. for(;;){
  718. #ifdef CONFIG_AUDIO_AFTER_INIT
  719. audioParaCheck();
  720. #endif
  721. volUpdateNeed();
  722. ledsProCtl();
  723. adcRead(APP_SUB_DIV_TIME);
  724. uiProcess(APP_SUB_DIV_TIME);
  725. //gpsProCtl(APP_SUB_DIV_TIME);
  726. AutoExitDanhu(APP_SUB_DIV_TIME);
  727. ShouHuProcess(APP_SUB_DIV_TIME);
  728. pocProCtl(APP_SUB_DIV_TIME);
  729. NoteCheck(APP_SUB_DIV_TIME);
  730. Sectick(APP_SUB_DIV_TIME);
  731. //uiTimeOutToStandby(0, APP_SUB_DIV_TIME);
  732. HookGroupUserInfo();
  733. HookVolToutCheck();
  734. // gpsProCtl(APP_SUB_DIV_TIME);
  735. // GpsInternalChange(APP_SUB_DIV_TIME);
  736. //IncomingSMS();
  737. LogoutOutTimeCheck(APP_SUB_DIV_TIME);
  738. if(isSleepReady()==0) LSAPI_OSI_ThreadSleep(APP_TASK_SLEEP_TIME);
  739. else if(sutApp.gtMode==0){//正常模式下可以休眿
  740. MSG_WARN(1, "APP SLEEP");
  741. // uiTimeOutToStandby(1, APP_SUB_DIV_TIME);
  742. stopKeyTimer();
  743. subTimerCtl(1);//切换为休眠状态定时器
  744. sutApp.appStatus=1;
  745. redLedCtl(false);//休眠后保证灯没亮,否则有可能灯亮10ms,按理10ms后灯能灭,然后10ms时休眠了,应用就短时间内不会灭灯
  746. greenLedCtl(false);//休眠后保证灯没亮
  747. sutApp.updateStatusBar=1;
  748. LSAPI_OSI_EventWait(LSAPI_OSI_ThreadCurrent(), &event);
  749. LSAPI_OSI_ThreadSleep(150);//添加这个后,休眠时按键或被呼叫或本机呼叫,tone音能是完整的
  750. lcdDrv_Init(1);//深度休眠唤醒后重新初始化SPI-LCD
  751. if(sutApp.lcdDlyLightUp){
  752. sutApp.lcdDlyLightUp=0;
  753. lcdBackLightApi(1);
  754. }
  755. sutApp.forceUiFlash=1;
  756. sutApp.appStatus=0;
  757. subTimerCtl(0);//切换为唤醒状态定时器
  758. MSG_WARN(1, "APP WAKEUP");
  759. }
  760. //检测是否关机,这里要放在唤醒后操作
  761. pwrShutPro();
  762. }
  763. }
  764. unsigned int subTimerInterval=100;//定时器定时的时间
  765. LSAPI_OSI_Timer_t *pSubtimer_t = NULL;
  766. /*
  767. 为了做低功耗,此定时器在休眠时,设置为长时间定旿
  768. 非休眠时,设置为短时间定旿
  769. sleep_or_not:0 未休眠, else 休眠
  770. */
  771. static void subTimerCtl(unsigned char sleep_or_not){
  772. if(NULL==pSubtimer_t){
  773. MSG_WARN(1, "subTimer null");
  774. return;
  775. }
  776. LSAPI_OSI_TimerStop(pSubtimer_t);
  777. //打开定时噿
  778. if(sleep_or_not==0) subTimerInterval=100;//未休眠时_00ms
  779. else subTimerInterval=5000;//休眠旿5000ms
  780. LSAPI_OSI_TimerStart(pSubtimer_t,subTimerInterval);
  781. }
  782. static void subTimeroutcallback(void *param){
  783. unsigned int *dlyTime=(unsigned int *)param;
  784. //处理灯的显示
  785. uioProctl(*dlyTime);
  786. //控制功放的关闿
  787. paProCtl();
  788. if(NULL!=pSubtimer_t) LSAPI_OSI_TimerStart(pSubtimer_t,subTimerInterval);
  789. }
  790. void subTask(void *param){
  791. LSAPI_OSI_Event_t event={0};
  792. if(NULL==pSubtimer_t) pSubtimer_t = LSAPI_OSI_TimerCreate(LSAPI_OSI_ThreadCurrent(), subTimeroutcallback, (void *)&subTimerInterval);
  793. if(NULL==pSubtimer_t) MSG_WARN(1,"sub timer init failed");
  794. else LSAPI_OSI_TimerStart(pSubtimer_t,subTimerInterval);
  795. for(;;){LSAPI_OSI_EventWait(LSAPI_OSI_ThreadCurrent(), &event);}
  796. }
  797. static void paProCtl(void){
  798. //会被定时调用
  799. static char PaDlyCnt=0;
  800. if(sutPocStatus.PaDlyStart==1){
  801. if(++PaDlyCnt<30)return; //3
  802. }
  803. if(sutPocStatus.TTS!=0) return;
  804. if(sutPocStatus.spk!=0) return;
  805. if(sutPocStatus.TONE!=0) return;
  806. if(sutPocStatus.beep!=0) return;
  807. if(sutApp.gtMode!=0) return;
  808. PaDlyCnt=0;
  809. sutPocStatus.PaDlyStart=0;
  810. paControl(false);
  811. //MSG_INFO(1,"spk off");
  812. }
  813. void tryWakeupApp(void){
  814. if(sutApp.appStatus!=0){
  815. if(mainThreadPtr!=NULL){
  816. threadSendEvent(mainThreadPtr,OHPOC_EVENT_MAIN,NULL,NULL,NULL);
  817. }
  818. }
  819. }
  820. void ttsPlay(ENCODE_USER_ENUM type, char *tts){
  821. char buf[120];
  822. MSG_INFO(1, "tts Play:%d,%s",type,tts);
  823. //sutPocStatus.TTS=1;
  824. paControl(true);
  825. snprintf(buf, sizeof(buf), "AT+POC=770000%02d%s\r\n", type,tts);
  826. msgAtSend(buf);
  827. }
  828. /*背光时间到,熄灭*/
  829. void backLightCb(void *param){
  830. if(sutPocStatus.firstLogin==0) return;//未登录过,不灭屏
  831. if(newPara.lcdParaList[newPara.lcdParaDefaultIndex]==0) return;//常亮
  832. lcdBackLightApi(0);
  833. appSleepCtl(ASLEEP_LCD, 0);//可以休眠
  834. }
  835. /*点亮背光*/
  836. void backLightReset(void){
  837. unsigned short tmp;
  838. appSleepCtl(ASLEEP_LCD, 1);//不让休眠
  839. tmp=newPara.lcdParaList[newPara.lcdParaDefaultIndex];
  840. if(sutApp.appStatus==0) lcdBackLightApi(1);//未休眠时,直接点亮
  841. else sutApp.lcdDlyLightUp=1;//休眠时不马上亮亮,会在LCD初始化完后点亮
  842. startBackLightTimer(tmp*1000);
  843. }
  844. void sysPwrLock(void){
  845. sutApp.pwrLock=1;
  846. }
  847. void sysPwrRlease(void){
  848. sutApp.pwrLock=0;
  849. }
  850. //"3132" --> 0x31,0x32
  851. void StrAsciiToHex(char *src, unsigned char *des){
  852. unsigned char temp[2],i;
  853. if(strlen(src)%2) return;
  854. while(0!=*src)
  855. {
  856. for(i=0;i<2;i++)
  857. {
  858. temp[i] = *src++;
  859. if(temp[i] >= '0' && temp[i] <= '9') temp[i] -= 0x30;
  860. else if(temp[i] >= 'A' && temp[i] <= 'F') temp[i] -= 0x37;
  861. else temp[i] -= 0x57;
  862. }
  863. temp[0] <<= 4;
  864. temp[0] &= 0xf0;
  865. *des++=temp[0]|temp[1];
  866. }
  867. *des=0;
  868. }
  869. void splVolumeSet(unsigned char level){
  870. char info[30];
  871. snprintf(info, sizeof(info), "AT+CLVL=%d\r\nAT+CRSL=%d\r\n", level,level);
  872. msgAtSend(info);
  873. MSG_INFO(1,"SPK_VOL:%d",level);
  874. }
  875. const unsigned char spkGainTable[SPK_GAIN_NUM];
  876. const unsigned char spkGainTable[SPK_GAIN_NUM]={
  877. 24,32,40,48,56,64,72,80
  878. };
  879. /*调节音量,刷新音量进度条*/
  880. void volAdjAction(char direction,unsigned char UIStatus){
  881. const unsigned char spkVolTable[MAX_SPK_VOL+1]={0,5,10,20,30,40,50,60,70};//不接耳机时喇叭音
  882. unsigned char vol;
  883. if(sutApp.earLev==0){//不接耳机
  884. if(direction==0){
  885. if(newPara.spkVol<MAX_SPK_VOL) newPara.spkVol++;
  886. else goto FLASH;
  887. }else{
  888. if(newPara.spkVol>0) newPara.spkVol--;
  889. else goto FLASH;
  890. }
  891. vol=spkVolTable[newPara.spkVol];
  892. splVolumeSet(vol);
  893. }else{//接了耳机
  894. if(direction==0){
  895. if(newPara.spkGain<SPK_GAIN_NUM) newPara.spkGain++;
  896. else goto FLASH;
  897. }else{
  898. if(newPara.spkGain>0) newPara.spkGain--;
  899. else goto FLASH;
  900. }
  901. if(newPara.spkGain==0) vol=0;
  902. else vol=spkGainTable[newPara.spkGain-1];
  903. splVolumeSet(vol);
  904. vol=newPara.spkGain;
  905. }
  906. sysIniSave("adjvol");
  907. //刷新进度条
  908. FLASH:
  909. if(sutApp.earLev==0) vol=newPara.spkVol;
  910. else vol=newPara.spkGain;
  911. if(UIS_STANDBY==UIStatus)
  912. volUiFlash(vol);
  913. }
  914. void volUpdateNeed(void){
  915. if(sutApp.voluemUpdate==0) return;
  916. if(sutApp.voluemUpdate==1) volAdjAction(0, sutUIstatus.Status);
  917. else if(sutApp.voluemUpdate==2) volAdjAction(1, sutUIstatus.Status);
  918. sutApp.voluemUpdate=0;
  919. }
  920. void VolSpkUpdate(void){
  921. char cmd[30];
  922. unsigned char volLev;
  923. if(sutApp.earLev==0){//耳机拔掉后,恢复正常的SPK增益
  924. volLev=newPara.spkVol*10;
  925. }else{//耳机接入,应用特定值
  926. if(newPara.spkGain>=SPK_GAIN_NUM) volLev=SPK_GAIN_DEFAULT;
  927. else volLev=newPara.spkGain;
  928. if(volLev>0) volLev=spkGainTable[newPara.spkGain-1];
  929. }
  930. splVolumeSet(volLev);
  931. }
  932. //对都使用主音频通道设计来说,耳机模式时,需要按比例降低输入输出增益
  933. const unsigned short micGainTable[MIC_GAIN_NUM][2]={
  934. {2,6},{2,10},{3,10},{4,10},{5,10},{6,10},{6,13}
  935. };
  936. void VolMicUpdate(void){
  937. #if 1
  938. char cmd[50];
  939. unsigned char hana,lana,hadc,ladc;
  940. if(sutApp.earLev==0){//耳机拔掉,恢复正常MIC增益
  941. hana=sutApp.mic_ana>>8;
  942. lana=sutApp.mic_ana;
  943. hadc=sutApp.mic_adc>>8;
  944. ladc=sutApp.mic_adc;
  945. }else{//耳机接入
  946. hana=micGainTable[newPara.micGain][0]>>8;
  947. lana=micGainTable[newPara.micGain][0];
  948. hadc=micGainTable[newPara.micGain][1]>>8;
  949. ladc=micGainTable[newPara.micGain][1];
  950. }
  951. snprintf(cmd, sizeof(cmd), "AT+CACCP=0,0,0,\"%02x%02x%02x%02x\"\r\n",lana,hana,ladc,hadc);
  952. msgAtSend(cmd);
  953. #else
  954. unsigned char tableIndex;
  955. char cmd[50];
  956. int vol=newPara.spkVol*10;
  957. splVolumeSet(vol);
  958. if(sutApp.earLev==0){//耳机拔掉,恢复正常MIC增益
  959. tableIndex=newPara.micGain_onspk;
  960. //msgAtSend("AT+CACCP=0,0,0,\"04000a00\"\r\n");
  961. }else{//耳机接入
  962. tableIndex=newPara.micGain_onear;
  963. //msgAtSend("AT+CACCP=0,0,0,\"02000f00\"\r\n");
  964. }
  965. if(tableIndex>=MIC_GAIN_NUM){
  966. MSG_WARN(1, "Index invalid:%d", tableIndex);
  967. return;
  968. }
  969. snprintf(cmd, sizeof(cmd), "AT+CACCP=0,0,0,\"%02x00%02x00\"\r\n", micGainTable[tableIndex][0],micGainTable[tableIndex][1]);
  970. msgAtSend(cmd);
  971. #endif
  972. }
  973. //开机配置设定好的模块音频参数文件
  974. #define READ_PER_SIZE 400 //每次从Bin文件读取最多400字节来发送,AT时长度翻倍
  975. static void configureVoiceParam(void){
  976. //const char *confiFile="ZT-MINI101HGS.bin";
  977. const char *confiFile="ZT-MINI201-202HGS-20210703.bin";
  978. unsigned char sendbuf[40+2*400];//AT+CAIET=0,0,9600,400,""
  979. unsigned char *dataPtr=sendbuf+sizeof(sendbuf)-READ_PER_SIZE;
  980. char buf[3];
  981. char status=0;
  982. int fd,offset,readsize,i;
  983. LSAPI_FS_Stat_info_t pBuf;
  984. MSG_INFO(1, "config audio file'%s'",confiFile);
  985. fd=LSAPI_FS_Open(confiFile, LSAPI_FS_O_RDONLY,0x0);
  986. if(fd>0){
  987. memset(&pBuf,0,sizeof(pBuf));
  988. LSAPI_FS_Fstat(fd,&pBuf);
  989. offset=0;
  990. LSAPI_FS_Seek(fd, offset, LSAPI_FS_SEEK_SET);
  991. while(offset<pBuf.st_size){
  992. readsize=pBuf.st_size-offset;
  993. if(readsize>400) readsize=400;
  994. readsize=LSAPI_FS_Read(fd, dataPtr, readsize);
  995. if(readsize==0) break;
  996. else if(readsize<0){
  997. status=1;
  998. break;
  999. }
  1000. sprintf(sendbuf, "AT+CAIET=0,0,%d,%d,\"", offset, readsize);
  1001. for(i=0;i<readsize;i++){
  1002. sprintf(buf, "%02x", dataPtr[i]);
  1003. strcat(sendbuf, buf);
  1004. }
  1005. strcat(sendbuf,"\"\r\n");
  1006. msgAtSend(sendbuf);
  1007. offset += readsize;
  1008. LSAPI_OSI_ThreadSleep(10);
  1009. }
  1010. LSAPI_FS_Close(fd);
  1011. if(status==0) MSG_INFO(1, "config audio file succ:%d",offset);
  1012. else MSG_ERR(1, "config audio failed %d",status);
  1013. }else MSG_ERR(1, "'%s' open failed",confiFile);
  1014. if(status==0){//配置成功后,回读一下默认的Mic,这个值在不接耳机时是固定值
  1015. LSAPI_OSI_ThreadSleep(50);
  1016. msgAtSend("AT+CACCP=0,0,1,\"\"\r\n");
  1017. LSAPI_OSI_ThreadSleep(50);
  1018. }else{
  1019. //如果配置失败了,直接使用默认值
  1020. sutApp.mic_ana=4;
  1021. sutApp.mic_adc=4;//12;
  1022. }
  1023. VolMicUpdate();
  1024. }
  1025. //+CACCP:
  1026. //+CACCP: "04000C00" ana=0x0004 adc=0x000c
  1027. void proCaccpMsg(char *msg){
  1028. char tmp[10],*pName;
  1029. char i=0,j=0;
  1030. if(msg[0]=='"'){
  1031. memcpy(tmp+j, msg+7,2);j += 2;
  1032. memcpy(tmp+j, msg+5,2);j += 2;
  1033. memcpy(tmp+j, msg+3,2);j += 2;
  1034. memcpy(tmp+j, msg+1,2);j += 2;
  1035. tmp[j]=0;//000C0004
  1036. sutApp.mic_ana=strtol(tmp+4, &pName,16);
  1037. tmp[4]=0;
  1038. sutApp.mic_adc=strtol(tmp, &pName,16);
  1039. }
  1040. }
  1041. void audioParaCheck(void){
  1042. if(sutApp.audioReconfig==0) return;
  1043. sutApp.audioReconfig=0;
  1044. configureVoiceParam();
  1045. }