PocTask.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529
  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. sutPocStatus.AllGroups[index].ID=id;
  150. sutPocStatus.AllGroups[index].usernum=num;
  151. if(name[0]==0)
  152. {//当模块吐出来的名字为空时,自动添加为空格,防止显示时会死掉
  153. sutPocStatus.AllGroups[index].name[0]=' ';
  154. sutPocStatus.AllGroups[index].name[1]=0;
  155. }else
  156. StrAsciiToHex(name, sutPocStatus.AllGroups[index].name);
  157. sutPocStatus.GroupNum_Update = 1;
  158. return 1;
  159. }
  160. return 0;
  161. }
  162. int GBKTostr(char *src,char *dec,short maxlen)
  163. {
  164. char Temp[3];
  165. char *p=src;
  166. char *q=dec;
  167. int j=0;
  168. long data;
  169. Temp[2]=0;
  170. while(*p && j<(maxlen-1)){
  171. Temp[0]=*p++;
  172. Temp[1]=*p++;
  173. data=strtol(Temp,NULL,16);
  174. q[j++]=data;
  175. }
  176. return j;
  177. }
  178. /********************************************************************
  179. PocHandle
  180. 处理"+POC消息
  181. *********************************************************************/
  182. char PocHandle(char *msg)
  183. {
  184. uint8_t temp[4];
  185. SUTDS ds;
  186. SUTDL dl;
  187. char buf[102];//100
  188. char *pName;
  189. unsigned char len,type;
  190. char pGroup[POC_GROUP_NAME_LEN*2]={0};
  191. static int Table[POC_GROUP_NAME_LEN*2]={0};
  192. long l;
  193. int i;
  194. static unsigned char getNameFlag=0;
  195. static char Username[POC_USER_NAME_LEN+1];//因为播报时是先存了用户名,后面才存群组名,然后一起播报,故此值要是静态的,否则有时用户名会播报不出来
  196. char Groupname[POC_GROUP_NAME_LEN+1];
  197. #if(SPECALL_CTR==1)
  198. static char noSpeakFlag=0;
  199. #endif
  200. //=============+LSHTTS: END
  201. if(msg[1]=='L' && msg[2]=='S' && msg[3]=='H' && msg[4]=='T' && msg[9]=='E'){
  202. sutPocStatus.TTS=0;
  203. if(sutPocStatus.Speaker==0)SpeakerDisable();
  204. return 1;
  205. }
  206. //+POC:0BXXYYYY
  207. //请求PTT返回
  208. //XX:00请求成功,可以不处理,因为同时有8Bxxyy回来处理打开喇叭
  209. //XX:FF请求失败,播报特tone音,与抢麦失败一样
  210. //YYYY:操作ID,不处理
  211. if(msg[5] == '0' && msg[6] == 'B')
  212. {
  213. if(msg[7] == 'F' && msg[8] == 'F')
  214. {
  215. #if(SPECALL_CTR==1)
  216. noSpeakFlag=0;
  217. #endif
  218. SpeakerEnable();
  219. SetBeep(1000,10);
  220. }
  221. #if(SPECALL_CTR==1)
  222. else if(msg[7] == '0' && msg[8] == '0')
  223. {
  224. sutPocStatus.Mic=1;
  225. noSpeakFlag=1;
  226. SpeakerEnable();
  227. SetBeep(500,10);
  228. //SlwTrace(INF, "Speak",1);
  229. }
  230. #endif
  231. return 1;
  232. }
  233. //+POC:8bxxyy
  234. //xx--mic控制 01--打开MIC
  235. // 00--关闭MIC
  236. //yy--speaker控制
  237. // 00--关闭speaker并要产生成功的滴音
  238. // 01--对方说话,打开speaker,并产生成功的滴音
  239. // 13--抢麦失败,打开speaker,并产生失败的滴音
  240. if(msg[5]=='8' && msg[6]=='B' && msg[7]=='0')
  241. {
  242. if(msg[8]=='1')//xx == 01
  243. {
  244. enableDataSend();
  245. sutPocStatus.Mic=1;
  246. MicEnable();
  247. sutPocStatus.Speaker=0;
  248. sutPocStatus.PPTpress=1;
  249. #if(SPECALL_CTR==1)
  250. if(noSpeakFlag == 0)
  251. #endif
  252. SpeakerDisable();
  253. sutPocStatus.Logined=1;
  254. }else if(msg[8]=='0')//xx == 00
  255. {
  256. sutPocStatus.Mic=0;
  257. sutPocStatus.PPTpress=0;
  258. MicDisable();
  259. }
  260. if(msg[9]=='0' && msg[10] == '0')
  261. {//yy == 00 对方说话结束或本地讲话开始,滴音
  262. #if(SPECALL_CTR==1)
  263. if(noSpeakFlag == 1)
  264. {
  265. noSpeakFlag=0;
  266. if(sutPocStatus.Speaker) sutPocStatus.Speaker=0;
  267. return 1;
  268. }
  269. #endif
  270. sutPocStatus.Speaker=0;
  271. SpeakerEnable();
  272. SetBeep(500,10);
  273. }else if(msg[9]=='0' && msg[10] == '1')
  274. {//yy == 00 对方说话开始
  275. enableDataSend();
  276. LCDTimeOut(0); //此时如果睡眠 觉醒吧
  277. LcdOnTimeCt=0;
  278. ///////////////////
  279. sutPocStatus.Logined=1;
  280. sutPocStatus.Speaker=1;
  281. SpeakerEnable();
  282. if(newPara.KeySound!=0){
  283. SetBeep(500,10);
  284. }
  285. }else if(msg[9]=='1' && msg[10]=='3')
  286. {//yy == 13 抢麦不成功滴音
  287. #if(SPECALL_CTR==1)
  288. //防止A讲话,B按了一下PTT,后A结果,B灯还是绿的
  289. if(noSpeakFlag == 1) noSpeakFlag=0;
  290. #endif
  291. sutPocStatus.statusChaned=1;
  292. //sutPocStatus.Speaker=1;//3;//屏蔽掉后:能达到修改记录中的第6点
  293. SpeakerEnable();
  294. SetBeep(1000,10);
  295. }
  296. return 1;
  297. }
  298. //==============+POC:xxxx=============
  299. //+POC:820100000000 +POC:8201ffffffff
  300. //+POC:82 02 00002c8d 4b6dd58b3100300032000000 登陆成功,提示“测试102”
  301. //+POC:82 02 0000D590 B5E7C1BFB2E2CAD432 登陆成功 提示"电量测试2"
  302. if(msg[5]=='8' && msg[6]=='2')
  303. {
  304. buf[0] = msg[7];
  305. buf[1] = msg[8];
  306. buf[2] = 0;
  307. type = atoi(buf);
  308. switch(type)
  309. {
  310. case 0://离线 ID无效
  311. //if(sutPocStatus.Logined) HigosStartCnt(1);
  312. sutPocStatus.danHunStatus=0;//掉线,清单呼显示状态为非单呼状态
  313. sutPocStatus.Logined=0;
  314. sutGpsInfo.isGpsAuthOk=0;
  315. snprintf(buf, sizeof(buf),"[msg]");
  316. if(msg[17] == 'B' && msg[18]== '5' && msg[25] == 'C' && msg[26] == 'A')
  317. {//帐号信息错误
  318. pocTimeOutTime=5;
  319. sutPocStatus.loginResult=1;
  320. strcat(buf, "账号信息错误");
  321. }
  322. else
  323. if(msg[17] == 'C' && msg[18]== 'E' && msg[25] == 'C' && msg[26] == '2')
  324. {//无网络连接
  325. if(sutPocStatus.loginResult != 1)
  326. sutPocStatus.loginResult=2;
  327. strcat(buf, "无网络连接");
  328. }else if(msg[17] == 'C' && msg[18]== 'E' && msg[25] == 'C' && msg[26] == '1'){
  329. sutPocStatus.loginResult=5;
  330. strcat(buf, "无法连接");
  331. }else if(msg[17] == 'C' && msg[18]== '3' && msg[25] == 'B' && msg[26] == '7'){
  332. sutPocStatus.loginResult=6;
  333. strcat(buf, "没有服务");
  334. }
  335. else strcat(buf, "No login");
  336. SlwTrace(INF, buf, 1);
  337. break;
  338. case 1://登陆中 ID无效
  339. SlwTrace(INF, "login ing",1);
  340. break;
  341. case 2://登陆成功 ID为用户ID
  342. len = strlen(&msg[17])-2;
  343. if(len >= POC_USER_NAME_LEN) len = POC_USER_NAME_LEN;
  344. memcpy(Username,&msg[17],len);
  345. Username[len]=0;
  346. StrAsciiToHex(Username,sutPocStatus.LocalUser.name);
  347. msg[17]=0;
  348. sutPocStatus.LocalUser.ID=strtol(&msg[9],&pName,16);
  349. SlwTrace(INF, "login ok",1);
  350. getNameFlag=1;//登陆成功时,获取过了用户名字,后面可以播报了
  351. sutPocStatus.loginResult=3;
  352. break;
  353. case 3://注销中 ID无效
  354. SlwTrace(INF, "logout ing",1);
  355. break;
  356. }
  357. return 1;
  358. }
  359. //获取所有组列表,也就是处理+POC:80xxxs
  360. if(GetAllGroups(msg))return 1;
  361. //获取所有成员列表,也就是处理+POC:81XXX
  362. //if(GetAllUsers(msg))return 1;
  363. //+POC:86 00 000000dc a47fc47e3300 0000 进入群组,提示“群组3”(群组ID为000000dc,群组名为“群组3”即a47fc47e3300)
  364. // 86 00 0000009a d89ea48ba47fc47e0000 默认群组
  365. //+POC:86 00 00000366 0000
  366. if(msg[5]=='8' && msg[6]=='6')
  367. {//----获取本机当前群组名及群组ID
  368. //HigosStopCnt();//正常登陆了,停止计数
  369. sutPocStatus.Logined=1;
  370. pocTimeOutTime=30;
  371. if(msg[8] == '0')
  372. {//GB2312
  373. len = strlen(&msg[17])-2;
  374. if(len >= POC_GROUP_NAME_LEN) len = POC_GROUP_NAME_LEN;
  375. memcpy(Groupname,&msg[17],len);
  376. Groupname[len]=0;
  377. msg[17]=0;
  378. sutPocStatus.LocalGroup.ID=strtol(&msg[9],&pName,16);
  379. StrAsciiToHex(Groupname,sutPocStatus.LocalGroup.name);
  380. if(sutPocStatus.FirstLogined==0)
  381. {//登陆成功用户名群组名只播报一次
  382. if(getNameFlag == 0)
  383. snprintf(buf, sizeof(buf), "%s",Groupname);
  384. else
  385. {
  386. getNameFlag=0;
  387. snprintf(buf, sizeof(buf), "%s2CD2D1B5C7C2BD2C%s",Username,Groupname);
  388. }
  389. MeSpeak(ENCODE_GBK, buf,0);
  390. }else
  391. {//其它形式进入
  392. if(g_ucEnterGroupFlag==1)
  393. {
  394. g_ucEnterGroupFlag=0;
  395. snprintf(buf, sizeof(buf), "BDF8C8EB2C%s",Groupname);
  396. MeSpeak(ENCODE_GBK, buf,0);
  397. }
  398. }
  399. }
  400. sutPocStatus.danHunStatus=0;//收到这个直接设置为非单呼模式,否在会在单呼模式下如果被创建了临时群组,之后会一直显示单呼模式
  401. //if(sutUIstatus.Status == UIS_STANDBY) ShowButton(121,107,"消息");
  402. sutPocStatus.FirstLogined=1;
  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:0E00 0000 0002
  437. if(msg[5]=='0'&& msg[6]=='E')
  438. {
  439. msg[17]=0;
  440. StrAsciiToHex(&msg[13], temp);
  441. ds.Data.ucData.b1=temp[1];
  442. ds.Data.ucData.b2=temp[2];
  443. sutPocStatus.UserOnLineNum=ds.Data.usData;
  444. sutPocStatus.UserNum_Update=1;
  445. snprintf(buf, sizeof(buf), "oneLine:%d",sutPocStatus.UserOnLineNum);
  446. SlwTrace(INF, buf, 1);
  447. }
  448. //+POC:84 00 xxx //单呼提示
  449. if(msg[5]=='8' && msg[6]=='4')
  450. {
  451. MakeStrEndByNewLine(msg);
  452. MeSpeak(ENCODE_GBK , &msg[9],0);
  453. //检测是哪种单呼
  454. if(memcmp(&msg[9], "C1D9CAB1", 8)==0)
  455. {//临时呼叫xxxx 被呼成功
  456. sutPocStatus.danHunStatus=1;//进入单显示
  457. //if(sutUIstatus.Status == UIS_STANDBY) ShowButton(121,107,"挂断");
  458. }else if(memcmp(&msg[9], "CDCBB3F6", 8)==0)
  459. {//退出临时呼叫 退出单呼状态
  460. sutPocStatus.danHunStatus=0;
  461. //if(sutUIstatus.Status == UIS_STANDBY) ShowButton(121,107,"消息");
  462. }else if(memcmp(&msg[9], "BAF4BDD0B3C9B9A6", 16)==0)
  463. {//呼叫成功 主单呼
  464. sutPocStatus.danHunStatus=1;
  465. }
  466. return 1;
  467. }
  468. //+POC:21 000000 0000A5AB B8D6CCFACFC0
  469. // 关键字 保留 UID 名称
  470. if(msg[5]=='2' && msg[6]=='1'){
  471. MakeStrEndByNewLine(msg);
  472. memset(sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name,0,POC_ALL_USERS_NUM);
  473. if(msg[21]==0) sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name[0]=' ';
  474. else StrAsciiToHex(&msg[21], sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name);
  475. msg[21]=0;
  476. StrAsciiToHex(&msg[13], temp);
  477. dl.Data.ucData.b4=temp[0];
  478. dl.Data.ucData.b3=temp[1];
  479. dl.Data.ucData.b2=temp[2];
  480. dl.Data.ucData.b1=temp[3];
  481. sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].ID=dl.Data.ulData;
  482. sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].status=3;
  483. sutPocStatus.GetOneUserFlag=1;
  484. return 1;
  485. }
  486. //+POC:1000000007 0004 00000BF9 0003 D1D0B7A2B2E2CAD4D7E93030
  487. //+POC:1000000008 0004 00000BF9 0003 D1D0B7A2B2E2CAD4D7E93030
  488. // 组索引 组ID 成员数 组名字
  489. //xxxxxxxx 4字节ID
  490. //nnnnnnnn 名称
  491. if(msg[5] == '1' &&
  492. msg[7] == '0' &&
  493. (msg[14] == '7' || msg[14] == '8'))
  494. {
  495. memcpy(sutPocStatus.switchGroupID,&msg[19], 8);
  496. MakeStrEndByNewLine(&msg[31]);
  497. MeSpeak(ENCODE_GBK, &msg[31],0);
  498. return 1;
  499. }
  500. }