poc.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927
  1. #include "includes.h"
  2. POC_DEF sutPocStatus;
  3. void pocDataInit(void){
  4. memset((unsigned char *)&sutPocStatus, 0, sizeof(POC_DEF));
  5. }
  6. /*鎺у埗鏌ヨ�POC璁剧疆鐘舵€?
  7. dly:鎺ュ彛琚�皟鐢ㄧ殑棰戠巼锛屽崟浣峬s*/
  8. void pocProCtl(int dly)
  9. {
  10. static unsigned short cnt=0;
  11. static unsigned char excnt=4;
  12. //static unsigned char change=0;
  13. if(sutApp.gtMode!=0) return;//GT妯″紡鍚庝笉鍐嶆煡璇?
  14. if(++cnt<(5*1000/dly)) return;
  15. cnt=0;
  16. if(getAppObjStatus(ASLEEP_LCD)==0) return;
  17. msgToModem("AT+COPS?\r\n");
  18. msgToModem("AT+CTEC?\r\n");//鏌ヨ�褰撳墠缃戠粶鍒跺紡
  19. msgToModem("AT+CSQ\r\n");//鏌ヨ�淇″彿寮哄害
  20. msgAtSend("AT+POC=280000\r\n");
  21. // #ifdef USE_GWSD_POC
  22. // if(sutApp.pocParaDone==0) msgAtSend("AT+POC=020000\r\n");
  23. // //if(++excnt>6)
  24. // #endif
  25. }
  26. static void pocStartMsg(void);
  27. static void pro80Msg(char *msg);
  28. static void pro81Msg(char *msg);
  29. static void pro82Msg(char *msg);
  30. static void pro83Msg(char *msg);
  31. static void pro84Msg(char *msg);
  32. static void pro86Msg(char *msg);
  33. static void pro3dMsg(char *msg);
  34. static void pro3eMsg(char *msg);
  35. static void pro0eMsg(char *msg);
  36. static void pro1eMsg(char *msg);
  37. static void pro1dMsg(char *msg);
  38. static void pocGetVer(char *msg);
  39. static void pocGetPpp(char *msg);
  40. static void proGauthMsg(char *msg);
  41. static void proNoteMsg(char *msg);
  42. static void proNetMode(char *msg);
  43. static void proSimMode(char *msg);
  44. static void proPwrMode(char *msg);
  45. static void proFotaMsg(char *msg);
  46. static void proGmrMsg(char *msg);
  47. static void proSmsMsg(char *msg);
  48. static void proAlarmMsg(void);
  49. static void proPendMsg(void);
  50. static void proToneMsg(char *msg);
  51. static void proGPIPMsg(char *msg);
  52. static void proGGIPMsg(char *msg);
  53. static void proCsqMsg(char *msg);
  54. static void proMicSpk(int mic, int spk);
  55. static void proCopsMsg(char *msg);
  56. static void proHeadSet(char *msg);
  57. static void ProGetMicLV(char *msg);
  58. static void pro0dMsg(char *msg);
  59. static void proMic(int mic);
  60. static void proSpk(int spk);
  61. static void pro28Msg(char *msg);
  62. void cmdsProcess(char *msg, int len){//宸插幓鎺夊洖杞︽崲琛?
  63. int i,j;
  64. char buf[10];
  65. //if(sutApp.pocInitStatus==0) sutApp.pocInitStatus=1;
  66. if(sutApp.gtMode==0){
  67. appSleepCtl(ASLEEP_POC, 1);
  68. tryWakeupApp();
  69. MSG_INFO(1,"POC:%s",msg);
  70. if(msgCmp(msg, "PocSleep")){//POC浼戠湢浜?
  71. appSleepCtl(ASLEEP_POC, 0);
  72. }else if(msgCmp(msg, "+POC:WAKEUP")){//POC鍞ら啋浜?
  73. }else if(msgCmp(msg, "+POC:8B")){
  74. buf[0]=msg[9];buf[1]=msg[10];buf[2]=0;
  75. proSpk(atoi(buf));
  76. }else if(msgCmp(msg, "+POC:0B")){//+POC:0B000000
  77. buf[0]=msg[7];buf[1]=msg[8];buf[2]=0;
  78. proMic(atoi(buf));
  79. }else if(msgCmp(msg, "+POC:0C00")){
  80. proMic(3);//录音结束
  81. }else if(msgCmp(msg, "+LSHTTS: END")){
  82. sutPocStatus.TTS=0;
  83. }else if(msgCmp(msg, "+HTTS: START")){
  84. paControl(true);
  85. sutPocStatus.TTS=1;
  86. }
  87. else if(msgCmp(msg, "PTT_") || msgCmp(msg, "GW_")) pocGetVer(msg);
  88. else if(msgCmp(msg, "+POC:02000000")){
  89. setPocPara(msg+13,len-13);
  90. sutApp.startPoc=1;
  91. }else if(msgCmp(msg, "+POC:81")) pro81Msg(msg+7);
  92. else if(msgCmp(msg, "+POC:82")) pro82Msg(msg+7);
  93. else if(msgCmp(msg, "+POC:3D")) pro3dMsg(msg+7);
  94. else if(msgCmp(msg, "+POC:3E")) pro3eMsg(msg+7);
  95. else if(msgCmp(msg, "+POC:80")) pro80Msg(msg+7);
  96. else if(msgCmp(msg, "+POC:1E")) pro1eMsg(msg+7);
  97. else if(msgCmp(msg, "+POC:86")) pro86Msg(msg+7);
  98. else if(msgCmp(msg, "+POC:83")) pro83Msg(msg+7);
  99. else if(msgCmp(msg, "+POC:84")) pro84Msg(msg+7);
  100. else if(msgCmp(msg, "+POC:0E")) pro0eMsg(msg+7);
  101. else if(msgCmp(msg, "+POC:1D")) pro1dMsg(msg+7);
  102. else if(msgCmp(msg, "+POC:0D")) pro0dMsg(msg+7);
  103. else if(msgCmp(msg, "+POC:28")) pro28Msg(msg);
  104. else if(msgCmp(msg, "+POC:7F000000")) proVoiceMode(msg+13);
  105. else if(msgCmp(msg, "+CCID: ")) proCCIDMsg(msg+7);
  106. else if(msgCmp(msg, "$GNRMC"))process_gps_data(msg+7,len-7);
  107. else if(msgCmp(msg, "+CTEC:")) proNetMode(msg+7);
  108. else if(msgCmp(msg, "+CSQ: ")) proCsqMsg(msg+6);
  109. else if(msgCmp(msg, "+COPS:")) proCopsMsg(msg);
  110. else if(msgCmp(msg, "+CPIN: READY")) sutApp.cardStatus=1;
  111. else if(msgCmp(msg, "+SIMCROSS"))proSimMode(msg+10);
  112. else if(msgCmp(msg, "SV")) strcpy(sutApp.modemVer, msg);
  113. else if(msgCmp(msg,"+CACCP:"))ProGetMicLV(msg);
  114. else MSG_INFO(1, "skip:%d,%s", len,msg);
  115. }
  116. }
  117. //+POC:28000000 07e2061511391904
  118. //表示 2018 年(07E2) 6 月(06) 21 日(15) 17 点(11) 57 分(39) 25 秒(19)星期四(04)
  119. static void pro28Msg(char *msg){
  120. msg[27]=0;
  121. poc_clock.sec=htoi(msg+25);
  122. msg[25]=0;
  123. poc_clock.min=htoi(msg+23);
  124. msg[23]=0;
  125. poc_clock.hour=htoi(msg+21);
  126. msg[21]=0;
  127. poc_clock.day=htoi(msg+19);
  128. msg[19]=0;
  129. poc_clock.month=htoi(msg+17);
  130. msg[17]=0;
  131. poc_clock.year=htoi(msg+13);
  132. MSG_INFO(1,"%d:%d:%d",poc_clock.year,poc_clock.month,poc_clock.day);
  133. }
  134. static void proSpk( int spk){
  135. if(spk==0){//播放结束
  136. keyToneStart(1);
  137. sutPocStatus.spk=0;
  138. }else if(spk==1){//播放开始
  139. paControl(true);
  140. keyToneStart(2);
  141. sutPocStatus.spk=1;
  142. //sutPocStatus.preSpk=1;
  143. }
  144. }
  145. static void proMic(int mic){
  146. if(mic==3){
  147. keyToneStart(1);
  148. sutPocStatus.mic=0;
  149. }else if(mic==1 || mic==2){//录音结束,2是禁止
  150. LSAPI_OSI_ThreadSleep(100);
  151. sutPocStatus.PttFail=1;
  152. keyToneStart(1);
  153. sutPocStatus.mic=0;
  154. }else if(mic==0){//录音开始
  155. //keyToneStart();
  156. sutPocStatus.mic=1;
  157. }
  158. }
  159. /*
  160. +CCID: 898604851920C0133569
  161. msg=898604851920C0133569
  162. */
  163. void proCCIDMsg(char *msg){
  164. sutApp.cardStatus=1;
  165. msg[6]=0;
  166. sutApp.copstype=atoi(msg+4);
  167. }
  168. //澶勭悊POC妯″潡淇℃伅
  169. void pocCmdHandler(unsigned char *msg, int len){
  170. //鏈夋秷鎭�繘鏉ワ紝濡傛灉涓嶆槸+POC:SLEEP锛孭OC閮藉敜閱掍簡
  171. static char tmp[1024],ch;//300
  172. static int k=0;
  173. unsigned int j;
  174. if(sutApp.authReady==0) return;
  175. if(sutApp.gtMode !=0 && sutApp.gtTMode != 0){
  176. //MSG_INFO(1,"stop USBsend");
  177. usbOutPut(msg, len);//TM TRACE
  178. return;
  179. }
  180. for(j=0;j<len;j++){//杩囨护
  181. if(k>=sizeof(tmp)) k=0;
  182. tmp[k++]=msg[j];
  183. if(ch=='\r' && msg[j]=='\n'){
  184. if(k!=2){
  185. //澶勭悊
  186. k -=2;tmp[k]=0;//鍘绘帀鍥炶溅鎹㈣�
  187. MakeStringToUpperCap(tmp, k);
  188. cmdsProcess(tmp,k);
  189. }
  190. k=0;
  191. }
  192. ch=msg[j];
  193. }
  194. }
  195. static void proMicSpk(int mic, int spk){
  196. if(mic==0 && spk==0){//0000
  197. if(newPara.KeySound!=0) pttBeepStart(false);
  198. sutPocStatus.spk=0;
  199. sutPocStatus.mic=0;
  200. sutPocStatus.TONE=0;
  201. }else if(mic==1 && spk==0){//0100
  202. if(newPara.KeySound!=0) pttBeepStart(false);
  203. sutPocStatus.mic=1;
  204. }else if(mic==0 && spk==1){//0001
  205. if(newPara.KeySound!=0) paControl(true);//pttBeepStart(false);
  206. else paControl(true);//鍏抽棴鎻愮ず闊虫椂锛屼篃瑕佹墦寮€鍠囧彮
  207. sutPocStatus.spk=1;
  208. sutPocStatus.mic=0;
  209. }else if(mic==0 && spk==13){//0013
  210. if(newPara.KeySound!=0) beepStart(TONE_SPECIAL);
  211. }else if(mic==0 && spk==2){
  212. paControl(true);
  213. sutPocStatus.TONE=1;
  214. }
  215. }
  216. static void micPro(int mic){
  217. switch(mic){
  218. case 0://鍏抽棴mic
  219. sutPocStatus.mic=0;
  220. break;
  221. case 1://鎵撳紑mic
  222. if(newPara.KeySound!=0) beepStart(TONE_NORMAL);
  223. sutPocStatus.mic=1;
  224. //sutPocStatus.spk=0;
  225. break;
  226. }
  227. }
  228. static void spkPro(int spk){
  229. switch(spk){
  230. case 0://tone闊冲悗鍏抽棴spk
  231. if(newPara.KeySound!=0) beepStart(TONE_NORMAL);
  232. sutPocStatus.spk=0;
  233. break;
  234. case 1://tone闊冲悗淇濇寔spk鎵撳紑
  235. if(newPara.KeySound!=0) beepStart(TONE_NORMAL);
  236. paControl(true);
  237. sutPocStatus.spk=1;
  238. sutPocStatus.mic=0;
  239. break;
  240. case 2://鎾�斁TTS
  241. paControl(true);
  242. sutPocStatus.TTS=1;
  243. break;
  244. case 13://鎶㈤害澶辫触锛屽彲浠�one鐗规畩闊?
  245. if(newPara.KeySound!=0) beepStart(TONE_SPECIAL);
  246. break;
  247. }
  248. }
  249. /*POC宸插惎鍔ㄦ垚鍔?*/
  250. static void pocStartMsg(void){
  251. sutApp.pocInitStatus=1;
  252. }
  253. /*褰撳墠璐﹀彿鎵€灞炵兢缁勫垪琛ㄤ俊鎭?涓€娆℃€ц幏鍙栨墍鏈?
  254. 涓嶅悓搴旂敤閲囩敤涓嶅悓闇€姹傛寚浠?
  255. 浠庝笉鍦ㄧ嚎鍒扮櫥褰曚細涓诲姩涓婃姤涓€娆″垪琛?
  256. 鍙慉T+POC=0D0000涔熶細涓婃姤涓€娆″垪琛?
  257. msg:000000,iiii(缁勫垪琛ㄧ储寮?,dddddddd(缁処D),nnnn(缁勬垚鍛樻暟),mmmmmm(缁勫悕绉?*/
  258. static void pro80Msg(char *msg){
  259. int index,len,i;
  260. char buf[5],*pName;
  261. //先获取组索引
  262. memcpy(buf, msg+6, 4);
  263. buf[4]=0;index=strtol(buf, &pName,16);
  264. if(index<1 || index>POC_ALL_GROUPS_NUM) return;//索引从1开始
  265. index -= 1;
  266. //获取组名称
  267. len=strlen(msg+22);
  268. LwEndingToBiEndingStr(msg+22,len);
  269. unicodeToGbk(msg+22, sutPocStatus.AllGroups[index].name, &len);
  270. sutPocStatus.AllGroups[index].name[len]=0;
  271. //获取成员数
  272. msg[22]=0;
  273. sutPocStatus.AllGroups[index].usernum=strtol(&msg[18], &pName,16);
  274. //获取组ID
  275. msg[18]=0;
  276. sutPocStatus.AllGroups[index].ID=strtol(&msg[10], &pName, 16);
  277. }
  278. /*鎵€鍦ㄧ粍鎴愬憳淇℃伅鍒楄〃
  279. 鍙慉T+POC=0E0000xxxxxxxx鏌ヨ�
  280. msg:010000,iiii(鎴愬憳鍒楄〃绱㈠紩),dddddddd(鎴愬憳ID),mmmmmmmm(鎴愬憳鍚嶇О)*/
  281. static void pro81Msg(char *msg){
  282. int index,len,status;
  283. char buf[5],*pName;
  284. //获取成员状态
  285. buf[0]=msg[0];buf[1]=msg[1];buf[2]=0;
  286. status=atoi(buf);
  287. if(status<=1 || status >4) return;
  288. //先获取成员索引值
  289. memcpy(buf, msg+6, 4);buf[4]=0;
  290. index=strtol(buf, &pName, 16);
  291. if(index<=0 || index>POC_ALL_USERS_NUM) return;
  292. index --;
  293. sutPocStatus.AllUsers[index].status=status;
  294. //获取成员名字
  295. len=strlen(msg+18);
  296. LwEndingToBiEndingStr(msg+18,len);
  297. unicodeToGbk(msg+18, sutPocStatus.AllUsers[index].name, &len);
  298. sutPocStatus.AllUsers[index].name[len]=0;
  299. //获取成员ID
  300. msg[18]=0;
  301. sutPocStatus.AllUsers[index].ID=strtol(msg+10, &pName, 16);
  302. }
  303. /*鐧诲綍鐘舵€佷俊鎭?
  304. msg:ss(00鏈�櫥褰?02宸茬櫥褰?,dddddddd(鎴愬憳id),mmmmmmmm(鐘舵€佷俊鎭�唴瀹?
  305. 00 CEDECDF8C2E7C1ACBDD3 琛ㄧず涓嶅湪绾匡紝杈撳嚭淇℃伅涓?鏃犵綉缁滆繛鎺?鎷ㄥ彿娌?鎴愬姛)
  306. 00 CEDEB7A8C1ACBDD3 琛ㄧず涓嶅湪绾匡紝杈撳嚭淇℃伅涓?鏃犳硶杩炴帴(IP 涓嶅�鎴栧畾 鍚戝崱)
  307. 00 C3BBD3D0B7FECEF1 琛ㄧず涓嶅湪绾匡紝杈撳嚭淇℃伅涓?娌℃湁鏈嶅姟(娌℃敞鍐?
  308. 00 B5C7C2BDCAA7B0DC 琛ㄧず涓嶅湪绾匡紝杈撳嚭淇℃伅涓?鐧婚檰澶辫触(璐﹀彿閿欒�)
  309. 00 0D5CBBAC5D0C5CFA2B4EDCEF3 璐﹀彿淇℃伅閿欒�
  310. 02 0001A750 B2E2CAD431BAC5(娴嬭瘯 1 鍙?,*/
  311. static void pro82Msg(char *msg){
  312. char buf[3],*pName;
  313. int type,len;
  314. char Username[POC_GROUP_USER_NAME_LEN*2];
  315. buf[0]=msg[0];buf[1]=msg[1];buf[2]=0;
  316. type=atoi(buf);
  317. switch(type){
  318. case 0:
  319. sutPocStatus.logined=0;
  320. if(0==memcmp(msg+10, "CEDECDF8C2E7C1ACBDD3",20)) sutPocStatus.PocLineOffReason=1;
  321. else if(0==memcmp(msg+10, "CEDEB7A8C1ACBDD3",16)) sutPocStatus.PocLineOffReason=2;
  322. else if(0==memcmp(msg+10, "C3BBD3D0B7FECEF1",16)) sutPocStatus.PocLineOffReason=3;
  323. else if(0==memcmp(msg+10, "B5C7C2BDCAA7B0DC",16)) sutPocStatus.PocLineOffReason=4;
  324. break;
  325. case 2:
  326. sutPocStatus.TTS=1;
  327. paControl(true);
  328. sutPocStatus.PocLineOffReason=0;
  329. len=strlen(msg+10);
  330. if(len>POC_GROUP_USER_NAME_LEN) len=POC_GROUP_USER_NAME_LEN;
  331. memcpy(Username, msg+10,len);
  332. Username[len]=0;
  333. LwEndingToBiEndingStr(Username,len);
  334. unicodeToGbk(Username, sutPocStatus.LocalUser.name, &len);
  335. sutPocStatus.LocalUser.name[len]=0;
  336. msg[10]=0;
  337. sutPocStatus.LocalUser.ID=strtol(&msg[2], &pName, 16);
  338. MSG_INFO(1, "Login ok");
  339. sutPocStatus.loginResult=3;
  340. break;
  341. }
  342. }
  343. /*鏈変汉璇磋瘽
  344. msg:00,dddddddd(鎴愬憳id),nnnnnnnn(鎴愬憳鍚嶇О)*/
  345. static void pro83Msg(char *msg){
  346. int len;
  347. char callerName[POC_GROUP_USER_NAME_LEN*2];
  348. backLightReset();//鏀跺埌鏈変汉璇磋瘽
  349. // if(msg[0]=='0'&&msg[1]=='0'){
  350. // if(newPara.KeySound!=0) keyToneStart();
  351. // }
  352. len=strlen(msg+10);
  353. if(len>POC_GROUP_USER_NAME_LEN) len=POC_GROUP_USER_NAME_LEN;
  354. memcpy(callerName, msg+10,len);
  355. callerName[len]=0;
  356. if(0!=memcmp(callerName, sutPocStatus.CallName,len)){
  357. LwEndingToBiEndingStr(callerName,len);
  358. unicodeToGbk(callerName, sutPocStatus.CallName, &len);
  359. sutPocStatus.CallName[len]=0;
  360. }
  361. }
  362. /*鍗曞懠鍝嶅簲淇℃伅
  363. msg:00,mmmmmmmmmm(鍗曞懠缁撴灉淇℃伅)
  364. BAF4BDD0B3C9B9A6 琛ㄧず 鍛煎彨鎴愬姛
  365. BAF4BDD0CAA7B0DC 琛ㄧず 鍛煎彨澶辫触
  366. CDCBB3F6C1D9CAB1BAF4BDD0 琛ㄧず 閫€鍑轰复鏃跺懠鍙?
  367. C1D9CAB1BAF4BDD031BAC5BBFA 琛ㄧず 涓存椂鍛煎彨 1 鍙锋満*/
  368. static void pro84Msg(char *msg){
  369. char ttsinfo[40];
  370. char tempbuf[80];
  371. char len;
  372. len=strlen(msg+2);
  373. memcpy(tempbuf, msg+2,len);
  374. if(0==memcmp(msg+2, "7C54EB5310629F52", 16)) sutPocStatus.danHuStatus=1; //主呼成功
  375. else if(0==memcmp(msg+2, "344EF6657C54EB53", 16)) sutPocStatus.danHuStatus=1; //被呼成功
  376. else if(0==memcmp(msg+2, "0090FA51", 8)) sutPocStatus.danHuStatus=0;//退出临时呼叫
  377. LwEndingToBiEndingStr(tempbuf,len);
  378. unicodeToGbk(tempbuf,ttsinfo, &len);
  379. ttsPlay(ENCODE_USER_ASCII, ttsinfo);
  380. }
  381. /*鍒囨崲缇ょ粍瀹屾垚鎸囦护(琛ㄧず宸茬櫥褰?
  382. msg:00,dddddddd(缁刬d),nnnnnnnn(缁勫悕绉?*/
  383. static void pro86Msg(char *msg){
  384. char buf[POC_GROUP_USER_NAME_LEN*4+40],*pName;
  385. int len,i;
  386. char GroupName[POC_GROUP_USER_NAME_LEN*2];
  387. char tmp[POC_GROUP_USER_NAME_LEN*2+20];
  388. char needTTs=0;
  389. // sutPocStatus.TTS=1;
  390. // paControl(true);
  391. sutPocStatus.logined=1;
  392. len=strlen(msg+10);
  393. if(len>POC_GROUP_USER_NAME_LEN*2) len=POC_GROUP_USER_NAME_LEN*2;
  394. memcpy(GroupName, msg+10,len);
  395. GroupName[len]=0;
  396. LwEndingToBiEndingStr(GroupName,len);
  397. unicodeToGbk(GroupName, sutPocStatus.LocalGroup.name, &len);
  398. sutPocStatus.LocalGroup.name[len]=0;
  399. msg[10]=0;
  400. sutPocStatus.LocalGroup.ID=strtol(msg+2, &pName,16);
  401. if(sutPocStatus.firstLogin==0){
  402. snprintf(tmp, sizeof(tmp), "%s,已登陆,%s", sutPocStatus.LocalUser.name,sutPocStatus.LocalGroup.name);
  403. backLightReset();//第一次登录时,保持屏亮起来
  404. needTTs=1;
  405. }else{
  406. snprintf(tmp, sizeof(tmp), "进入,%s",sutPocStatus.LocalGroup.name);
  407. if(sutApp.groupTTSEnable!=0){
  408. needTTs=1;
  409. sutApp.groupTTSEnable=0;
  410. }
  411. }
  412. if(needTTs!=0){
  413. memset(buf, 0, sizeof(buf));
  414. for(i=0;i<strlen(tmp);i++){
  415. snprintf(GroupName, sizeof(GroupName), "%02x", tmp[i]);
  416. strcat(buf, GroupName);
  417. }
  418. ttsPlay(ENCODE_USER_GBK, buf);
  419. }
  420. sutPocStatus.danHuStatus=0;
  421. sutPocStatus.firstLogin=1;
  422. }
  423. /*鏌ヨ�鎵€灞炵兢缁勬€绘暟鐨勫搷搴?
  424. 鍙慉T+POC=3D0000鑾峰緱
  425. msg:000000,nnnn(鎵€灞炲�灏戜釜缇ょ粍)*/
  426. static void pro3dMsg(char *msg){
  427. char *pName;
  428. sutPocStatus.ListCurOnlineNum=strtol(&msg[6],&pName,16);
  429. sutPocStatus.ListUpdate=1;
  430. MSG_INFO(1, "groupNum:%d", sutPocStatus.ListCurOnlineNum);
  431. }
  432. /*鏌ヨ�鎵€灞炲湪绾挎垚鍛樻€绘暟鐨勫搷搴?
  433. 鍙慉T+POC=3E0000鑾峰緱
  434. msg:000000,nnnn(鎵€灞炲�灏戜釜鍦ㄧ嚎鎴愬憳)*/
  435. static void pro3eMsg(char *msg){
  436. char *pName;
  437. sutPocStatus.ListCurOnlineNum=strtol(&msg[6],&pName,16);
  438. sutPocStatus.ListUpdate=1;
  439. MSG_INFO(1, "userNum:%d", sutPocStatus.ListCurOnlineNum);
  440. }
  441. /*鏌ヨ�鎵€鍦ㄧ粍鎴愬憳淇℃伅鏃惰繑鍥烇紝寰楀埌鍦ㄧ嚎鎴愬憳鎬绘暟
  442. msg:000000,nnnn(鍦ㄧ嚎鎴愬憳鎬绘暟)*/
  443. static void pro0eMsg(char *msg){
  444. char *pName;
  445. //获取在线成员总数
  446. sutPocStatus.ListCurOnlineNum=strtol(msg+6, &pName, 16);
  447. MSG_INFO(1, "total user num:%d", sutPocStatus.ListCurOnlineNum);
  448. sutPocStatus.ListDetailValid=1;
  449. }
  450. /*瀹氶噺鏌ヨ�鎵€鍦ㄧ兢缁勪腑鐨勫湪绾挎垚鍛樹俊鎭�搷搴?
  451. 鍙慉T+POC=1E0000xxxxx鑾峰緱
  452. msg:010000,iiii(鎴愬憳鍒楄〃绱㈠紩),dddddddd(鎴愬憳ID),mmmmmmmm(鎴愬憳鍚嶇О)*/
  453. static void pro1eMsg(char *msg){
  454. char name[POC_GROUP_USER_NAME_LEN*2+1];
  455. int len;
  456. unsigned long id;
  457. char *pTemp;
  458. if(!uiAssist.status)return 1;
  459. len = strlen(&msg[18]);
  460. if(len >= POC_GROUP_USER_NAME_LEN*2) len = POC_GROUP_USER_NAME_LEN*2;
  461. memcpy(name, &msg[18], len);
  462. name[len]=0;
  463. msg[18]=0;
  464. id=strtol(&msg[10],&pTemp,16);
  465. sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].ID=id;
  466. if(name[0]==0){
  467. sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].name[0]=' ';
  468. sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].name[1]=0;
  469. }else{
  470. LwEndingToBiEndingStr(name,len);
  471. unicodeToGbk(name, sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].name, &len);
  472. sutPocStatus.AllUsers[sutPocStatus.ListFillIndex].name[len]=0;
  473. }
  474. sutPocStatus.ListFillIndex++;
  475. if(sutPocStatus.ListFillIndex==sutPocStatus.ExceptionReadNum){
  476. sutPocStatus.ListGetOneFlag=1;
  477. sutPocStatus.ListDetailValid=1;
  478. }
  479. }
  480. /*瀹氭椂鏌ヨ�鎵€灞炵粍淇℃伅
  481. 鍙慉T+POC=1D0000xxxxx鑾峰緱
  482. msg:000000,iiii(缁勫垪琛ㄧ储寮?,dddddddd(缁処D),nnnn(鎴愬憳涓�暟),mmmmmmmmm(鍚嶇О)*/
  483. static void pro1dMsg(char *msg){
  484. unsigned short num;
  485. char name[POC_GROUP_USER_NAME_LEN*2+1];
  486. unsigned long id;
  487. unsigned short index;
  488. char *pTemp;
  489. int len;
  490. if(!uiAssist.status)return ;
  491. len = strlen(&msg[22]);//已去掉回车换行
  492. if(len >= POC_GROUP_USER_NAME_LEN*2) len = POC_GROUP_USER_NAME_LEN*2;
  493. memcpy(name, &msg[22], len);
  494. name[len]=0;
  495. msg[22]=0;
  496. num=strtol(&msg[18],&pTemp,16);
  497. msg[18]=0;
  498. id=strtol(&msg[10],&pTemp,16);
  499. sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].ID=id;
  500. sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].usernum=num;
  501. if(name[0]==0){
  502. sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].name[0]=' ';
  503. sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].name[1]=0;
  504. }else
  505. LwEndingToBiEndingStr(name,len);
  506. unicodeToGbk(name, sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].name, &len);
  507. sutPocStatus.AllGroups[sutPocStatus.ListFillIndex].name[len]=0;
  508. sutPocStatus.ListFillIndex++;
  509. if(sutPocStatus.ListFillIndex==sutPocStatus.ExceptionReadNum){
  510. sutPocStatus.ListGetOneFlag=1;
  511. sutPocStatus.ListDetailValid=1;
  512. }
  513. }
  514. static void pro0dMsg(char *msg){
  515. char *pName;
  516. //获取群组总数
  517. sutPocStatus.ListCurOnlineNum=strtol(msg+6, &pName, 16);
  518. MSG_INFO(1, "total group num:%d", sutPocStatus.ListCurOnlineNum);
  519. sutPocStatus.ListDetailValid=1;
  520. }
  521. /*
  522. +POC_VER:01027
  523. msg=01027
  524. */
  525. static void pocGetVer(char *msg){
  526. int i;
  527. sutApp.pocInitStatus=1;
  528. for(i=0;i<strlen(msg);i++){
  529. if(msg[i]==' '){
  530. msg[i]=0;
  531. snprintf(sutApp.pocVersion, sizeof(sutApp.pocVersion), "%s",msg);
  532. return;
  533. }
  534. }
  535. }
  536. static void pocGetPpp(char *msg){
  537. if(msg[0]=='1') sutApp.pocPpp=1;
  538. else sutApp.pocPpp=0;
  539. }
  540. /*
  541. +GAUTH:AD86EBCCECC4
  542. msg=AD86EBCCECC4+鍥炶溅
  543. */
  544. static void proGauthMsg(char *msg){
  545. unsigned char newAuthTable[10]={0x50,0x28,0xaf,0x6d,0x08,0x9c,0x1b,0xe4,0x23,0x77};
  546. unsigned char randBuf[100];
  547. char buf[3];
  548. int len,i,j;
  549. len=0;
  550. for(i=0;i<strlen(msg);i++){
  551. if(msg[i]=='\r' || msg[i]=='\n' || msg[i]=='\0') goto MSG_DONE;
  552. randBuf[len++]=msg[i];
  553. }
  554. MSG_DONE:
  555. //鑾峰彇涓插苟杞�崲鎴?6杩涘埗鍔犲瘑涓?
  556. if(len%2 || 0!=restoreDataFormatByHex(randBuf,len)){
  557. MSG_WARN(1, "auth get error");
  558. return;
  559. }
  560. len /= 2;//寰楀埌鍔犲瘑淇℃伅:闀垮害涓簂en鐨剅andBuf
  561. extCodeBuffer(randBuf, len,newAuthTable, sizeof(newAuthTable));
  562. snprintf(randBuf, sizeof(randBuf), "AT+SAUTH=");
  563. //灏嗛暱搴︿负i鐨則mp鍐呭瓨浠ュ崄鍏�繘鍒朵覆鎵撳寘鍙戦€?
  564. for(j=0;j<sizeof(newAuthTable);j++){
  565. snprintf(buf, sizeof(buf),"%02x",newAuthTable[j]);
  566. strcat(randBuf, buf);
  567. }
  568. strcat(randBuf, "\r\n");
  569. msgAtSend(randBuf);
  570. MSG_INFO(0, randBuf);
  571. }
  572. /*
  573. +NOTE:0,1
  574. msg=0,1+鍥炶溅
  575. */
  576. static void proNoteMsg(char *msg){
  577. MSG_INFO(1,"authAck:%s",msg);
  578. }
  579. /*
  580. +CTEC: 0,0
  581. msg=0,0
  582. */
  583. static void proNetMode(char *msg){
  584. unsigned char netModeValue;
  585. char cmd[30];
  586. if(msg[0]<'0' || msg[0]>'9') return;
  587. netModeValue=atoi(msg);
  588. ctecCurrentSet=netModeValue;
  589. if(ctecCurrentSet != newPara.netMode){
  590. snprintf(cmd, sizeof(cmd),"AT+CTEC=%d,%d\r\n", ctecCurrentSet, newPara.netMode);
  591. msgAtSend(cmd);
  592. }
  593. }
  594. /*
  595. +COPS: 0,2,"46000",7
  596. msg=+COPS: 0,2,"46000",7
  597. */
  598. static void proCopsMsg(char *msg){
  599. int i,j=0,codeType;
  600. char w=0;
  601. unsigned char netModeValue;
  602. MSG_INFO(1,"enter PORCOPS");
  603. for(i=0;i<strlen(msg);i++){
  604. if(msg[i]==','){
  605. if(++j==3){
  606. codeType=msg[i+1]-0x30;
  607. if(codeType==7) codeType=4;
  608. if(netshowvalue!=codeType) netshowvalue=codeType;
  609. return;
  610. }
  611. }else if(msg[i]=='"'){
  612. if(++w==1){
  613. codeType=atoi(msg+i+1);
  614. if(codeType>0 && codeType != sutApp.copstype) sutApp.copstype=codeType;
  615. }
  616. }
  617. }
  618. }
  619. /*
  620. +SIMCROSS:0
  621. msg=0/1
  622. */
  623. static void proSimMode(char *msg){
  624. unsigned char tmpSim;
  625. tmpSim=msg[0]-0x30;
  626. if(tmpSim!=0 && tmpSim!=1) return;
  627. if(tmpSim==1)sutApp.simSel=0;
  628. else if(tmpSim==0)sutApp.simSel=1;
  629. }
  630. /*
  631. +UDP:0,5,30
  632. msg=0,5,30
  633. */
  634. static void proPwrMode(char *msg){
  635. int seg1,seg2;
  636. short i;
  637. char buf[15];
  638. for(i=2;i<strlen(msg);i++){
  639. if(msg[i]==','){
  640. seg1=atoi(msg+2);
  641. seg2=atoi(msg+i+1);
  642. pwrModeAckHandler(seg1,seg2);
  643. }
  644. }
  645. }
  646. /*
  647. +FOTA:1,0
  648. +FOTA:1,XXX
  649. +FOTA:0
  650. +FOTA:1
  651. +FOTA:2
  652. msg=1,xxxx
  653. */
  654. static void proFotaMsg(char *msg){
  655. if(msg[1]==','){
  656. if(msg[2]=='0' && msg[3]==0){
  657. fotaStepSet(6);
  658. }else{
  659. strcpy(sutApp.fotaVersion, msg+2);
  660. fotaStepSet(9);
  661. }
  662. }else if(msg[1]==0){
  663. if(msg[0]=='0'){
  664. fotaStepSet(7);
  665. }else if(msg[0]=='1') showLoading();
  666. else if(msg[0]=='2'){
  667. fotaStepSet(8);
  668. }
  669. }
  670. }
  671. /*
  672. SV63302_T02
  673. msg=SV63302_T02
  674. */
  675. static void proGmrMsg(char *msg){
  676. snprintf(sutApp.modemVer, sizeof(sutApp.modemVer), "%s", msg);
  677. }
  678. /*
  679. +SMS:1,B2E2CAD4313233
  680. msg=1,B2E2CAD4313233
  681. */
  682. static void proSmsMsg(char *msg){
  683. unsigned char smsType=msg[0]-0x30;
  684. unsigned len=strlen(msg+2);
  685. if(len%2 || 0!=restoreDataFormatByHex(msg+2,len)){
  686. MSG_WARN(1, "sms data error");
  687. return;
  688. }
  689. len /= 2;
  690. sutMess.codeType=smsType;
  691. sutSms.smsUpdate=1;
  692. memcpy(sutMess.GBKMess1+4, msg+2, len);
  693. }
  694. /*鏈嶅姟鍣ㄦ姤涓嬪彂鎶ヨ�TTS锛孭OC宸叉挱鎶ワ紝鏈�俊鎭�彧鎻愮ず*/
  695. static void proAlarmMsg(void){
  696. }
  697. static void proPendMsg(void){
  698. MSG_INFO(1, "active auth now");
  699. msgAtSend("AT+GAUTH\r\n");//鐢ㄤ簬鎺堟潈妫€娴?
  700. }
  701. static void proToneMsg(char *msg){
  702. #ifndef ENABLE_PWM_BEEP
  703. if(msg[0]=='1'){
  704. sutPocStatus.TONE=1;
  705. paControl(true);
  706. }else if(msg[0]=='0'){
  707. sutPocStatus.TONE=0;
  708. }
  709. #endif
  710. }
  711. /*
  712. +GPIP:183.131.13.10
  713. msg=183.131.13.10
  714. */
  715. static void proGPIPMsg(char *msg){
  716. if(strlen(msg)<7) return;
  717. if(strcmp(showPIP, msg)==0) return;
  718. snprintf(showPIP, sizeof(showPIP), "%s",msg);
  719. MSG_INFO(1, "updatePIP:%s", showPIP);
  720. }
  721. /*
  722. +GGIP:183.131.13.6
  723. msg=183.131.13.6
  724. */
  725. static void proGGIPMsg(char *msg){
  726. if(strlen(msg)<7) return;
  727. if(strcmp(showGIP, msg)==0) return;
  728. snprintf(showGIP, sizeof(showGIP), "%s",msg);
  729. MSG_INFO(1, "updateGIP:%s", showGIP);
  730. }
  731. /*
  732. +CSQ: 14,99
  733. msg=14,99
  734. */
  735. static void proCsqMsg(char *msg){
  736. int csq=atoi(msg);
  737. if(csq != sutApp.g_iCSQ) sutApp.g_iCSQ=csq;
  738. }
  739. /*
  740. +HEADSET:1
  741. msg=1
  742. */
  743. static void proHeadSet(char *msg){
  744. switch(msg[0]){
  745. case '0'://HEADSET CONNECT
  746. sutApp.earLev=1;
  747. msgAtSend("AT+AUDCH=1,3\r\n");
  748. sutApp.pcant=2;
  749. break;//HEADSET DISCONNECTED
  750. case '1':
  751. sutApp.earLev=0;
  752. msgAtSend("AT+AUDCH=0,0\r\n");
  753. sutApp.pcant=4;
  754. break;//HEADSET BTN PRESS
  755. case '2':
  756. micPttHandler(1);
  757. break;//HEADSET BTN RELEASED
  758. case '3':
  759. micPttHandler(0);
  760. break;
  761. }
  762. }
  763. static void ProGetATIMsg(char *msg){strcpy(sutApp.modemVer, msg);}
  764. static void ProGetMicLV(char *msg){
  765. char buf[30];
  766. char NeedSet=0;
  767. msg[11]=0;
  768. msg[15]=0;
  769. if(newPara.VolMicLvCu!=htoi(&msg[9]))NeedSet=1;
  770. if(newPara.VolMicLvXi!=htoi(&msg[13]))NeedSet=1;
  771. if(NeedSet==0){
  772. sutApp.Get_MicLv=1;
  773. return;
  774. }
  775. snprintf(buf, sizeof(buf),"AT+CACCP=0,0,0,\"%02x00%02x00\"\r\n",newPara.VolMicLvCu,newPara.VolMicLvXi);
  776. msgAtSend(buf);
  777. MSG_INFO(0,buf);
  778. }
  779. #ifdef USE_GWSD_POC
  780. char *ohpocGetICCID(void){
  781. return NULL;
  782. }
  783. char *ohpocGetIMEI(void){
  784. static char imei[16]={0};
  785. if(imei[0]==0){
  786. if(LSAPI_SIM_GetIMEI(imei)==0){
  787. return imei;
  788. }
  789. }
  790. return NULL;
  791. }
  792. //void ohpocGetClock(MY_CLOCK *myclock){
  793. //
  794. // //current_zone_time(myclock);
  795. //
  796. //}
  797. #endif
  798. unsigned long htoi(char s[])
  799. {
  800. int i = 0;
  801. unsigned long long n = 0;
  802. if (s[0] == '0' && (s[1]=='x' || s[1]=='X')) i = 2;
  803. else i = 0;
  804. for (; (s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z') || (s[i] >='A' && s[i] <= 'Z');++i){
  805. if (tolower(s[i]) > '9') n = 16 * n + (10 + tolower(s[i]) - 'a');
  806. else n = 16 * n + (tolower(s[i]) - '0');
  807. }
  808. return n;
  809. }
  810. void voiceModeSet(unsigned char voiceSel){
  811. if(voiceSel==0) msgAtSend("AT+POC=7E000000\r\n");
  812. else if(voiceSel==1) msgAtSend("AT+POC=7E000001\r\n");
  813. }
  814. void voiceModeQuery(void){
  815. msgAtSend("AT+POC=7F0000\r\n");
  816. }
  817. /*
  818. +POC:7f00000001
  819. msg=01
  820. */
  821. void proVoiceMode(char *msg){
  822. char buf[3];
  823. buf[0]=msg[0];buf[1]=msg[1];buf[2]=0;
  824. int mode=atol(buf);
  825. if((mode==0 || mode==1)&&mode != newPara.voiceSel){
  826. newPara.voiceSel=mode;
  827. sysIniSave();
  828. }
  829. }