PocTask.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. /**********************************************************************************
  2. * File Name: Poc.c
  3. * Function Describe:device for Poc
  4. * Relate Module:
  5. * Explain: the modem must be using ZTE MC8332
  6. * Writer: ShiLiangWen
  7. * Date: 2015.7.10
  8. ***********************************************************************************/
  9. #define THIS_FILE_ID 15
  10. /***********************************************************************************/
  11. #include "includes.h"
  12. SUT_POC_STATUS sutPocStatus;
  13. OS_TID idPocTask=0;
  14. //U64 stkPocTask[POC_TASK_STK_SIZE];
  15. char g_cGroupName[POC_GROUP_NAME_LEN];
  16. unsigned long g_ulGroupID;
  17. unsigned char g_ucSelect=0;
  18. int g_iModemVer=0;
  19. int g_iPocVer=0;
  20. /*********************************************************************
  21. *添加组内成员状态列表
  22. Data[]="0x0x0x..."
  23. x='1'
  24. **********************************************************************/
  25. void PocAddUserStatusToList(char *Data)
  26. {
  27. // char buf[50];//50
  28. // int i=0;
  29. // int j=0;
  30. // char s;
  31. // unsigned short index=0;
  32. // for(i=0;i<POC_USER_ONLINE_LIST_LEN;i++){
  33. // s=Data[j];
  34. // if(s<'0' || s>'3')break;
  35. // j++;
  36. // s=Data[j];
  37. // if(s<'0' || s>'3')break;
  38. // if(s=='3'){
  39. // //sutPocStatus.UserOnLineList[index++]=j/2;
  40. // index++;
  41. // }
  42. // j++;
  43. // }
  44. // sutPocStatus.UserOnLineNum=index;
  45. // sprintf(buf,"[OnLineUserNum=%d]",index);
  46. // SlwTrace(DEBUG,buf,1);
  47. }
  48. /*******************************************************************
  49. *在str里找到/r或/n 并将其修改为/0
  50. 比如: "1234/r" -> "1234"
  51. 比如: "1234/n" -> "1234"
  52. 比如: "1234/r/n" -> "1234"
  53. msgbuf[130];
  54. msgbuf[129]=0;
  55. ********************************************************************/
  56. void ReplaceStrWithN(char *str)
  57. {
  58. char d;
  59. char *p=str;
  60. while(0!=(d=*p)){
  61. if(d=='\r' || d=='\n'){
  62. *p='\0';
  63. break;
  64. }
  65. p++;
  66. }
  67. }
  68. int GetAllUsers(char *msg)
  69. {
  70. unsigned short num;
  71. char name[POC_USER_NAME_LEN*2+1];
  72. unsigned long id;
  73. unsigned short index;
  74. char *pTemp;
  75. char status;//状态
  76. unsigned char len;
  77. //+POC:8101000000000000A5F647726F757031
  78. //+POC:0e 00 0000 0004
  79. if(msg[5]=='8' && msg[6]=='1'){
  80. //+POC:81 01 0000 0000 0000A5F6 47726F757031
  81. // 81 状态 操作ID 成员索引 成员ID 成员名字
  82. //用户名GB2312
  83. len = strlen(&msg[25])-2;
  84. if(len >= POC_USER_NAME_LEN*2) len = POC_USER_NAME_LEN*2;
  85. memcpy(name, &msg[25], len);
  86. name[len]=0;
  87. //成员ID
  88. msg[25]=0;
  89. id=strtol(&msg[17],&pTemp,16);
  90. //组索引
  91. msg[17]=0;
  92. index=strtol(&msg[13],&pTemp,16);
  93. //索引必须非0 且不能超出所能接收的限制,否则不处理
  94. //if(index==0 || index>=POC_ALL_USERS_NUM) return 1;
  95. if(index>=(POC_ALL_USERS_NUM-1)) return 1;
  96. //状态
  97. //成员个数统计
  98. // if(index==1){
  99. // sutPocStatus.UsersNum=1;
  100. // }else{
  101. // sutPocStatus.UsersNum++;
  102. // }
  103. //index-=1;
  104. //添加
  105. sutPocStatus.AllUsers[index].ID=id;
  106. sutPocStatus.AllUsers[index].status=2;
  107. // if(msg[8]=='3'){//在此群组中(在线)。
  108. // sutPocStatus.AllUsers[index].status=2;
  109. // }else if(msg[8]=='2'){//在线(不在此群组中)
  110. // sutPocStatus.AllUsers[index].status=1;
  111. // }else{//离线
  112. // sutPocStatus.AllUsers[index].status=0;
  113. // }
  114. StrAsciiToHex(name, sutPocStatus.AllUsers[index].name);
  115. //StrUnicodeToAnsi((uint8_t *)sutPocStatus.AllUsers[index].name,POC_USER_NAME_LEN,name);
  116. return 1;
  117. }
  118. //+POC:0E00 0000 0002
  119. if(msg[5]=='0'&& msg[6]=='E' && msg[7]=='0' && msg[8]=='0'){
  120. msg[17]=0;
  121. sutPocStatus.UserOnLineNum=strtol(&msg[13],&pTemp,16);
  122. if(sutPocStatus.UserOnLineNum>POC_ALL_USERS_NUM)sutPocStatus.UserOnLineNum=POC_ALL_USERS_NUM;
  123. sutPocStatus.UserNum_Update=1;
  124. }
  125. return 0;
  126. }
  127. int GetAllGroups(char *msg)
  128. {
  129. unsigned short num;
  130. char name[POC_GROUP_NAME_LEN*2+1];
  131. unsigned long id;
  132. unsigned short index;
  133. char *pTemp;
  134. unsigned char len;
  135. //+POC:8000000000010000009a0059d89ea48ba47fc47e0000 第1个群组名为默认群组
  136. //+POC:800000000002000001040024f16d33579e528b4e04590000 第2个群组名为深圳办事处
  137. if(msg[5]=='8' && msg[6]=='0'){
  138. //+POC:80 00 AE4A 0001 00000BF9 0009 D1D0B7A2B2E2CAD4D7E93030
  139. //+POC:80 00 0000 0001 0000009a 0059 d89ea48ba47fc47e 0000
  140. // 80 组标示 操作ID 组索引 组ID 组内成员个数 组名 结束符
  141. //群组名unicode
  142. len = strlen(&msg[29])-2;
  143. if(len >= POC_GROUP_NAME_LEN*2) len = POC_GROUP_NAME_LEN*2;
  144. memcpy(name, &msg[29], len);
  145. name[len]=0;
  146. //组内成员个数
  147. msg[29]=0;
  148. num=strtol(&msg[25],&pTemp,16);
  149. //组ID
  150. msg[25]=0;
  151. id=strtol(&msg[17],&pTemp,16);
  152. //组索引
  153. msg[17]=0;
  154. index=strtol(&msg[13],&pTemp,16);
  155. //索引必须非0 且不能超出所能接收的限制,否则不处理
  156. //4G模块POC组索引是从0000开始的
  157. if(index>POC_ALL_GROUPS_NUM)return 1;
  158. //组个数统计
  159. if(index==0){
  160. sutPocStatus.GroupsNum=1;
  161. }else{
  162. sutPocStatus.GroupsNum++;
  163. }
  164. //index-=1;
  165. //添加
  166. sutPocStatus.AllGroups[index].ID=id;
  167. sutPocStatus.AllGroups[index].usernum=num;
  168. // memset(sutPocStatus.AllGroups[index].name,0,POC_GROUP_NAME_LEN);
  169. StrAsciiToHex(name, sutPocStatus.AllGroups[index].name);
  170. sutPocStatus.GroupNum_Update = 1;
  171. return 1;
  172. }
  173. return 0;
  174. }
  175. int GBKTostr(char *src,char *dec,short maxlen)
  176. {
  177. char Temp[3];
  178. char *p=src;
  179. char *q=dec;
  180. int j=0;
  181. long data;
  182. Temp[2]=0;
  183. while(*p && j<(maxlen-1)){
  184. Temp[0]=*p++;
  185. Temp[1]=*p++;
  186. data=strtol(Temp,NULL,16);
  187. q[j++]=data;
  188. }
  189. return j;
  190. }
  191. /********************************************************************
  192. PocHandle
  193. 处理"+POC消息
  194. *********************************************************************/
  195. char PocHandle(char *msg)
  196. {
  197. uint8_t temp[4];
  198. SUTDS ds;
  199. SUTDL dl;
  200. char buf[102];//100
  201. char *pName;
  202. unsigned char len,type;
  203. char pGroup[POC_GROUP_NAME_LEN*2]={0};
  204. static int Table[POC_GROUP_NAME_LEN*2]={0};
  205. long l;
  206. int i;
  207. static unsigned char getNameFlag=0;
  208. char Username[POC_USER_NAME_LEN+1];
  209. char Groupname[POC_GROUP_NAME_LEN+1];
  210. #if(SPECALL_CTR==1)
  211. static char noSpeakFlag=0;
  212. #endif
  213. //=============+LSHTTS: END
  214. if(msg[1]=='L' && msg[2]=='S' && msg[3]=='H' && msg[4]=='T' && msg[9]=='E'){
  215. sutPocStatus.TTS=0;
  216. if(sutPocStatus.Speaker==0)SpeakerDisable();
  217. return 1;
  218. }
  219. //+POC:0BXXYYYY
  220. //请求PTT返回
  221. //XX:00请求成功,可以不处理,因为同时有8Bxxyy回来处理打开喇叭
  222. //XX:FF请求失败,播报特tone音,与抢麦失败一样
  223. //YYYY:操作ID,不处理
  224. if(msg[5] == '0' && msg[6] == 'B')
  225. {
  226. if(msg[7] == 'F' && msg[8] == 'F')
  227. {
  228. #if(SPECALL_CTR==1)
  229. noSpeakFlag=0;
  230. #endif
  231. SpeakerEnable();
  232. SetBeep(1176,12);
  233. }
  234. #if(SPECALL_CTR==1)
  235. else if(msg[7] == '0' && msg[8] == '0')
  236. {
  237. sutPocStatus.Mic=1;
  238. noSpeakFlag=1;
  239. SpeakerEnable();
  240. SetBeep(878,12);
  241. //SlwTrace(INF, "Speak",1);
  242. }
  243. #endif
  244. return 1;
  245. }
  246. //+POC:8bxxyy
  247. //xx--mic控制 01--打开MIC
  248. // 00--关闭MIC
  249. //yy--speaker控制
  250. // 00--关闭speaker并要产生成功的滴音
  251. // 01--对方说话,打开speaker,并产生成功的滴音
  252. // 13--抢麦失败,打开speaker,并产生失败的滴音
  253. if(msg[5]=='8' && msg[6]=='B' && msg[7]=='0')
  254. {
  255. if(msg[8]=='1')//xx == 01
  256. {
  257. sutPocStatus.Mic=1;
  258. MicEnable();
  259. sutPocStatus.Speaker=0;
  260. SpeakerDisable();
  261. sutPocStatus.Logined=1;
  262. }else if(msg[8]=='0')//xx == 00
  263. {
  264. sutPocStatus.Mic=0;
  265. MicDisable();
  266. }
  267. if(msg[9]=='0' && msg[10] == '0')
  268. {//yy == 00 对方说话结束或本地讲话开始,滴音
  269. #if(SPECALL_CTR==1)
  270. if(noSpeakFlag == 1)
  271. {
  272. noSpeakFlag=0;
  273. if(sutPocStatus.Speaker) sutPocStatus.Speaker=0;
  274. return 1;
  275. }
  276. #endif
  277. sutPocStatus.Speaker=0;
  278. SpeakerEnable();
  279. SetBeep(878,12);
  280. }else if(msg[9]=='0' && msg[10] == '1')
  281. {//yy == 00 对方说话开始
  282. LCDTimeOut(0); //此时如果睡眠 觉醒吧
  283. sutLcdParam.OnTimeCt=0;
  284. ///////////////////
  285. sutPocStatus.Logined=1;
  286. sutPocStatus.Speaker=1;
  287. SpeakerEnable();
  288. SetBeep(878,12);
  289. }else if(msg[9]=='1' && msg[10]=='3')
  290. {//yy == 13 抢麦不成功滴音
  291. #if(SPECALL_CTR==1)
  292. //防止A讲话,B按了一下PTT,后A结果,B灯还是绿的
  293. if(noSpeakFlag == 1) noSpeakFlag=0;
  294. #endif
  295. sutPocStatus.Speaker=1;//3;
  296. SpeakerEnable();
  297. SetBeep(1176,12);
  298. }
  299. return 1;
  300. }
  301. //==============+POC:xxxx=============
  302. //+POC:820100000000 +POC:8201ffffffff
  303. //+POC:82 02 00002c8d 4b6dd58b3100300032000000 登陆成功,提示“测试102”
  304. //+POC:82 02 0000D590 B5E7C1BFB2E2CAD432 登陆成功 提示"电量测试2"
  305. if(msg[5]=='8' && msg[6]=='2')
  306. {
  307. buf[0] = msg[7];
  308. buf[1] = msg[8];
  309. buf[2] = 0;
  310. type = atoi(buf);
  311. switch(type)
  312. {
  313. case 0://离线 ID无效
  314. if(sutPocStatus.Logined) HigosStartCnt(1);
  315. sutPocStatus.Logined=0;
  316. sutGpsInfo.isGpsAuthOk=0;
  317. sprintf(buf,"[msg]");
  318. if(msg[17] == 'B' && msg[18]== '5' && msg[25] == 'C' && msg[26] == 'A')
  319. {//帐号信息错误
  320. if(sutPocStatus.FirstLogined==0)
  321. {//从来没登陆过,来一次播报一次
  322. MeSpeak(ENCODE_GBK, "D5CABAC5D0C5CFA2B4EDCEF3", 0);
  323. sutPocStatus.report1Lock=1;
  324. }else
  325. {
  326. if(sutPocStatus.reportTimeCnt1 >= 60)
  327. {
  328. sutPocStatus.reportTimeCnt1=0;
  329. MeSpeak(ENCODE_GBK, "D5CABAC5D0C5CFA2B4EDCEF3", 0);
  330. sutPocStatus.report1Lock=1;
  331. }
  332. }
  333. strcat(buf, "Login failed");
  334. }
  335. else
  336. if(msg[17] == 'C' && msg[18]== 'E' && msg[25] == 'C' && msg[26] == '2')
  337. {//无网络连接
  338. if(sutPocStatus.FirstLogined==0)
  339. {//从来没登陆过,来一次播报一次
  340. if(sutPocStatus.report1Lock==0)
  341. MeSpeak(ENCODE_GBK, "CEDECDF8C2E7C1ACBDD3", 0);
  342. }else
  343. {
  344. if(sutPocStatus.reportTimeCnt2 >= 60 && sutPocStatus.report1Lock==0)
  345. {
  346. sutPocStatus.reportTimeCnt2=0;
  347. MeSpeak(ENCODE_GBK, "CEDECDF8C2E7C1ACBDD3", 0);
  348. }
  349. }
  350. strcat(buf, "No network");
  351. }
  352. else strcat(buf, "No login");
  353. SlwTrace(INF, buf, 1);
  354. break;
  355. case 1://登陆中 ID无效
  356. SlwTrace(INF, "login ing",1);
  357. break;
  358. case 2://登陆成功 ID为用户ID
  359. len = strlen(&msg[17])-2;
  360. if(len >= POC_USER_NAME_LEN) len = POC_USER_NAME_LEN;
  361. memcpy(Username,&msg[17],len);
  362. Username[len]=0;
  363. StrAsciiToHex(Username,sutPocStatus.LocalUser.name);
  364. msg[17]=0;
  365. sutPocStatus.LocalUser.ID=strtol(&msg[9],&pName,16);
  366. SlwTrace(INF, "login ok",1);
  367. getNameFlag=1;//登陆成功时,获取过了用户名字,后面可以播报了
  368. break;
  369. case 3://注销中 ID无效
  370. SlwTrace(INF, "logout ing",1);
  371. break;
  372. }
  373. return 1;
  374. }
  375. //获取所有组列表,也就是处理+POC:80xxx
  376. if(GetAllGroups(msg))return 1;
  377. //获取所有成员列表,也就是处理+POC:81XXX
  378. //if(GetAllUsers(msg))return 1;
  379. //+POC:86 00 000000dc a47fc47e3300 0000 进入群组,提示“群组3”(群组ID为000000dc,群组名为“群组3”即a47fc47e3300)
  380. // 86 00 0000009a d89ea48ba47fc47e0000 默认群组
  381. //+POC:86 00 00000366 0000
  382. if(msg[5]=='8' && msg[6]=='6')
  383. {//----获取本机当前群组名及群组ID
  384. HigosStopCnt();//正常登陆了,停止计数
  385. sutPocStatus.Logined=1;
  386. if(msg[8] == '0')
  387. {//GB2312
  388. len = strlen(&msg[17])-2;
  389. if(len >= POC_GROUP_NAME_LEN) len = POC_GROUP_NAME_LEN;
  390. memcpy(Groupname,&msg[17],len);
  391. Groupname[len]=0;
  392. msg[17]=0;
  393. sutPocStatus.LocalGroup.ID=strtol(&msg[9],&pName,16);
  394. StrAsciiToHex(Groupname,sutPocStatus.LocalGroup.name);
  395. if(sutPocStatus.FirstLogined==0)
  396. {//登陆成功用户名群组名只播报一次
  397. if(getNameFlag == 0)
  398. sprintf(buf, "%s",Groupname);
  399. else
  400. {
  401. getNameFlag=0;
  402. sprintf(buf, "%s2CD2D1B5C7C2BD2C%s",Username,Groupname);
  403. }
  404. MeSpeak(ENCODE_GBK, buf,0);
  405. }else
  406. {//其它形式进入
  407. if(g_ucEnterGroupFlag==1)
  408. {
  409. g_ucEnterGroupFlag=0;
  410. sprintf(buf, "BDF8C8EB2C%s",sutPocStatus.LocalGroup.name);
  411. MeSpeak(ENCODE_GBK, buf,0);
  412. }
  413. }
  414. }
  415. if(sutPocStatus.FirstLogined==0) ModemSendAT("AT+CCLK?\r\n");
  416. sutPocStatus.FirstLogined=1;
  417. if(sutProductPara.takeNoteFlag != 1)
  418. {//认为登陆过来就开始记录,刷机后不再记录
  419. sutProductPara.takeNoteFlag = 1;
  420. SaveProductParaToFlash("START_NOTE");
  421. }
  422. return 1;
  423. }
  424. //+POC:830000002e650000 对方话语权
  425. //+POC:83000000420c330067004b6dd58b3200f7530000
  426. //+POC:8300000045544800530031003500310057004b6dd58b300033000000
  427. //+POC:83000000D592 303738
  428. if(msg[5]=='8' && msg[6]=='3' && msg[7]=='0' && msg[8]=='0')
  429. {
  430. //最新POC版本快速短按PTT放开会只发这条过来,实际是没有请麦来的
  431. //因此不做灯与喇叭,LCD背光等控制
  432. ReplaceStrWithN(&msg[17]);
  433. //如果他只发ID不发对方名,要记得修改防护
  434. i=strlen(&msg[17]);
  435. if(i>=POC_USER_NAME_LEN) i=POC_USER_NAME_LEN;
  436. else i++;//把0结束也拷过去
  437. StrAsciiToHex(&msg[17], sutPocStatus.Callname);
  438. *(msg+17) = 0;
  439. sutPocStatus.CallID = strtol(&msg[9],&pName,16);
  440. msg[17]=0;
  441. return 1;
  442. }
  443. //+POC:8301ffffffff0000 对方释放话语权
  444. if(msg[5]=='8' && msg[6]=='3' && msg[7]=='0' && msg[8]=='1'){
  445. //最新POC版本目前没有这条指令,也忽视吧
  446. // sutPocStatus.Speaker=0;
  447. // SpeakerDisable();
  448. return 1;
  449. }
  450. //+POC:91010103
  451. if(msg[5]=='9' && msg[6]=='1'){
  452. PocAddUserStatusToList(&msg[7]);
  453. return 1;
  454. }
  455. //+POC:0E00 0000 0002
  456. if(msg[5]=='0'&& msg[6]=='E'){
  457. msg[17]=0;
  458. StrAsciiToHex(&msg[13], temp);
  459. ds.Data.ucData.b1=temp[1];
  460. ds.Data.ucData.b2=temp[2];
  461. sutPocStatus.UserOnLineNum=ds.Data.usData;
  462. sutPocStatus.UserNum_Update=1;
  463. sprintf(buf, "oneLine:%d",sutPocStatus.UserOnLineNum);
  464. SlwTrace(INF, buf, 1);
  465. }
  466. //+POC:84 00 xxx //单呼提示
  467. if(msg[5]=='8' && msg[6]=='4')
  468. {
  469. MakeStrEndByNewLine(msg);
  470. MeSpeak(ENCODE_GBK , &msg[9],0);
  471. return 1;
  472. }
  473. //+POC:21 000000 0000A5AB B8D6CCFACFC0
  474. // 关键字 保留 UID 名称
  475. if(msg[5]=='2' && msg[6]=='1'){
  476. MakeStrEndByNewLine(msg);
  477. memset(sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name,0,POC_ALL_USERS_NUM);
  478. StrAsciiToHex(&msg[21], sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name);
  479. msg[21]=0;
  480. StrAsciiToHex(&msg[13], temp);
  481. dl.Data.ucData.b4=temp[0];
  482. dl.Data.ucData.b3=temp[1];
  483. dl.Data.ucData.b2=temp[2];
  484. dl.Data.ucData.b1=temp[3];
  485. sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].ID=dl.Data.ulData;
  486. sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].status=3;
  487. sutPocStatus.GetOneUserFlag=1;
  488. return 1;
  489. }
  490. //+POC:1000000007 0004 00000BF9 0003 D1D0B7A2B2E2CAD4D7E93030
  491. //+POC:1000000008 0004 00000BF9 0003 D1D0B7A2B2E2CAD4D7E93030
  492. // 组索引 组ID 成员数 组名字
  493. //xxxxxxxx 4字节ID
  494. //nnnnnnnn 名称
  495. if(msg[5] == '1' &&
  496. msg[7] == '0' &&
  497. (msg[14] == '7' || msg[14] == '8'))
  498. {
  499. memcpy(sutPocStatus.switchGroupID,&msg[19], 8);
  500. MakeStrEndByNewLine(&msg[31]);
  501. MeSpeak(ENCODE_GBK, &msg[31],0);
  502. return 1;
  503. }
  504. }