PocTask.c 14 KB

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