PocTask.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544
  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(1176,12);
  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(878,12);
  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. sutPocStatus.Mic=1;
  245. MicEnable();
  246. sutPocStatus.Speaker=0;
  247. SpeakerDisable();
  248. sutPocStatus.Logined=1;
  249. }else if(msg[8]=='0')//xx == 00
  250. {
  251. sutPocStatus.Mic=0;
  252. MicDisable();
  253. }
  254. if(msg[9]=='0' && msg[10] == '0')
  255. {//yy == 00 对方说话结束或本地讲话开始,滴音
  256. #if(SPECALL_CTR==1)
  257. if(sutProductPara.PasswordInable==1 && PasswordErro==1){
  258. return 1;
  259. }
  260. if(noSpeakFlag == 1)
  261. {
  262. noSpeakFlag=0;
  263. if(sutPocStatus.Speaker) sutPocStatus.Speaker=0;
  264. return 1;
  265. }
  266. #endif
  267. sutPocStatus.Speaker=0;
  268. SpeakerEnable();
  269. SetBeep(878,12);
  270. }else if(msg[9]=='0' && msg[10] == '1')
  271. {//yy == 00 对方说话开始
  272. if(sutProductPara.PasswordInable==1 && PasswordErro==1){
  273. return 1;
  274. }
  275. LCDTimeOut(0); //此时如果睡眠 觉醒吧
  276. sutLcdParam.OnTimeCt=0;
  277. ///////////////////
  278. sutPocStatus.Logined=1;
  279. sutPocStatus.Speaker=1;
  280. SpeakerEnable();
  281. SetBeep(878,12);
  282. }else if(msg[9]=='1' && msg[10]=='3')
  283. {//yy == 13 抢麦不成功滴音
  284. #if(SPECALL_CTR==1)
  285. //防止A讲话,B按了一下PTT,后A结果,B灯还是绿的
  286. if(noSpeakFlag == 1) noSpeakFlag=0;
  287. #endif
  288. sutPocStatus.statusChaned=1;
  289. //sutPocStatus.Speaker=1;//3;//屏蔽掉后:能达到修改记录中的第6点
  290. SpeakerEnable();
  291. SetBeep(1176,12);
  292. }
  293. return 1;
  294. }
  295. //==============+POC:xxxx=============
  296. //+POC:820100000000 +POC:8201ffffffff
  297. //+POC:82 02 00002c8d 4b6dd58b3100300032000000 登陆成功,提示“测试102”
  298. //+POC:82 02 0000D590 B5E7C1BFB2E2CAD432 登陆成功 提示"电量测试2"
  299. if(msg[5]=='8' && msg[6]=='2')
  300. {
  301. buf[0] = msg[7];
  302. buf[1] = msg[8];
  303. buf[2] = 0;
  304. type = atoi(buf);
  305. switch(type)
  306. {
  307. case 0://离线 ID无效
  308. //if(sutPocStatus.Logined) HigosStartCnt(1);
  309. sutPocStatus.danHunStatus=0;//掉线,清单呼显示状态为非单呼状态
  310. sutPocStatus.Logined=0;
  311. sutGpsInfo.isGpsAuthOk=0;
  312. snprintf(buf, sizeof(buf),"[msg]");
  313. if(msg[17] == 'B' && msg[18]== '5' && msg[25] == 'C' && msg[26] == 'A')
  314. {//帐号信息错误
  315. pocTimeOutTime=5;
  316. sutPocStatus.loginResult=1;
  317. strcat(buf, "账号信息错误");
  318. // if(sutProductPara.SwitchIpFlag==1){
  319. // if(++SwitchIpCt==3)
  320. // {
  321. // SwitchIp();
  322. // SwitchIpCt=0;
  323. // }
  324. // }
  325. }
  326. else
  327. if(msg[17] == 'C' && msg[18]== 'E' && msg[25] == 'C' && msg[26] == '2')
  328. {//无网络连接
  329. if(sutPocStatus.loginResult != 1){
  330. sutPocStatus.loginResult=2;
  331. strcat(buf, "无网络连接");
  332. }
  333. }
  334. else strcat(buf, "No login");
  335. SlwTrace(INF, buf, 1);
  336. break;
  337. case 1://登陆中 ID无效
  338. SlwTrace(INF, "login ing",1);
  339. break;
  340. case 2://登陆成功 ID为用户ID
  341. len = strlen(&msg[17])-2;
  342. if(len >= POC_USER_NAME_LEN) len = POC_USER_NAME_LEN;
  343. memcpy(Username,&msg[17],len);
  344. Username[len]=0;
  345. StrAsciiToHex(Username,sutPocStatus.LocalUser.name);
  346. msg[17]=0;
  347. sutPocStatus.LocalUser.ID=strtol(&msg[9],&pName,16);
  348. SlwTrace(INF, "login ok",1);
  349. getNameFlag=1;//登陆成功时,获取过了用户名字,后面可以播报了
  350. sutPocStatus.loginResult=3;
  351. break;
  352. case 3://注销中 ID无效
  353. SlwTrace(INF, "logout ing",1);
  354. break;
  355. }
  356. return 1;
  357. }
  358. //获取所有组列表,也就是处理+POC:80xxxs
  359. if(GetAllGroups(msg))return 1;
  360. //获取所有成员列表,也就是处理+POC:81XXX
  361. //if(GetAllUsers(msg))return 1;
  362. //+POC:86 00 000000dc a47fc47e3300 0000 进入群组,提示“群组3”(群组ID为000000dc,群组名为“群组3”即a47fc47e3300)
  363. // 86 00 0000009a d89ea48ba47fc47e0000 默认群组
  364. //+POC:86 00 00000366 0000
  365. if(msg[5]=='8' && msg[6]=='6')
  366. {//----获取本机当前群组名及群组ID
  367. //HigosStopCnt();//正常登陆了,停止计数
  368. sutPocStatus.Logined=1;
  369. pocTimeOutTime=30;
  370. if(msg[8] == '0')
  371. {//GB2312
  372. len = strlen(&msg[17])-2;
  373. if(len >= POC_GROUP_NAME_LEN) len = POC_GROUP_NAME_LEN;
  374. memcpy(Groupname,&msg[17],len);
  375. Groupname[len]=0;
  376. msg[17]=0;
  377. sutPocStatus.LocalGroup.ID=strtol(&msg[9],&pName,16);
  378. StrAsciiToHex(Groupname,sutPocStatus.LocalGroup.name);
  379. if(sutPocStatus.FirstLogined==0)
  380. {//登陆成功用户名群组名只播报一次
  381. if(getNameFlag == 0)
  382. snprintf(buf, sizeof(buf), "%s",Groupname);
  383. else
  384. {
  385. getNameFlag=0;
  386. snprintf(buf, sizeof(buf), "%s2CD2D1B5C7C2BD2C%s",Username,Groupname);
  387. }
  388. MeSpeak(ENCODE_GBK, buf,0);
  389. }else
  390. {//其它形式进入
  391. if(g_ucEnterGroupFlag==1)
  392. {
  393. g_ucEnterGroupFlag=0;
  394. snprintf(buf, sizeof(buf), "BDF8C8EB2C%s",sutPocStatus.LocalGroup.name);
  395. MeSpeak(ENCODE_GBK, buf,0);
  396. }
  397. }
  398. }
  399. sutPocStatus.danHunStatus=0;//收到这个直接设置为非单呼模式,否在会在单呼模式下如果被创建了临时群组,之后会一直显示单呼模式
  400. //if(sutPocStatus.FirstLogined==0) ModemSendAT("AT+CCLK?\r\n");
  401. sutPocStatus.FirstLogined=1;
  402. if(sutProductPara.takeNoteFlag != 1)
  403. {//认为登陆过来就开始记录,刷机后不再记录
  404. sutProductPara.takeNoteFlag = 1;
  405. SaveProductParaToFlash("START_NOTE");
  406. }
  407. return 1;
  408. }
  409. //+POC:830000002e650000 对方话语权
  410. //+POC:83000000420c330067004b6dd58b3200f7530000
  411. //+POC:8300000045544800530031003500310057004b6dd58b300033000000
  412. //+POC:83000000D592 303738
  413. if(msg[5]=='8' && msg[6]=='3' && msg[7]=='0' && msg[8]=='0')
  414. {
  415. //最新POC版本快速短按PTT放开会只发这条过来,实际是没有请麦来的
  416. //因此不做灯与喇叭,LCD背光等控制
  417. ReplaceStrWithN(&msg[17]);
  418. //如果他只发ID不发对方名,要记得修改防护
  419. i=strlen(&msg[17]);
  420. if(i>=POC_USER_NAME_LEN) i=POC_USER_NAME_LEN;
  421. else i++;//把0结束也拷过去
  422. StrAsciiToHex(&msg[17], sutPocStatus.Callname);
  423. *(msg+17) = 0;
  424. sutPocStatus.CallID = strtol(&msg[9],&pName,16);
  425. msg[17]=0;
  426. return 1;
  427. }
  428. //+POC:8301ffffffff0000 对方释放话语权
  429. if(msg[5]=='8' && msg[6]=='3' && msg[7]=='0' && msg[8]=='1'){
  430. //最新POC版本目前没有这条指令,也忽视吧
  431. // sutPocStatus.Speaker=0;
  432. // SpeakerDisable();
  433. return 1;
  434. }
  435. //+POC:91010103
  436. if(msg[5]=='9' && msg[6]=='1'){
  437. PocAddUserStatusToList(&msg[7]);
  438. return 1;
  439. }
  440. //+POC:0E00 0000 0002
  441. if(msg[5]=='0'&& msg[6]=='E'){
  442. msg[17]=0;
  443. StrAsciiToHex(&msg[13], temp);
  444. ds.Data.ucData.b1=temp[1];
  445. ds.Data.ucData.b2=temp[2];
  446. sutPocStatus.UserOnLineNum=ds.Data.usData;
  447. sutPocStatus.UserNum_Update=1;
  448. snprintf(buf, sizeof(buf), "oneLine:%d",sutPocStatus.UserOnLineNum);
  449. SlwTrace(INF, buf, 1);
  450. }
  451. //+POC:84 00 xxx //单呼提示
  452. if(msg[5]=='8' && msg[6]=='4')
  453. {
  454. MakeStrEndByNewLine(msg);
  455. MeSpeak(ENCODE_GBK , &msg[9],0);
  456. //检测是哪种单呼
  457. if(memcmp(&msg[9], "C1D9CAB1", 8)==0)
  458. {//临时呼叫xxxx 被呼成功
  459. sutPocStatus.danHunStatus=1;//进入单显示
  460. StrAsciiToHex(&msg[25], sutPocStatus.Calledname);
  461. }else if(memcmp(&msg[9], "CDCBB3F6", 8)==0)
  462. {//退出临时呼叫 退出单呼状态
  463. sutPocStatus.danHunStatus=0;
  464. }else if(memcmp(&msg[9], "BAF4BDD0B3C9B9A6", 16)==0)
  465. {//呼叫成功 主单呼
  466. sutPocStatus.danHunStatus=1;
  467. }
  468. return 1;
  469. }
  470. //+POC:21 000000 0000A5AB B8D6CCFACFC0
  471. // 关键字 保留 UID 名称
  472. if(msg[5]=='2' && msg[6]=='1'){
  473. MakeStrEndByNewLine(msg);
  474. memset(sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name,0,POC_ALL_USERS_NUM);
  475. if(msg[21]==0) sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name[0]=' ';
  476. else StrAsciiToHex(&msg[21], sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name);
  477. msg[21]=0;
  478. StrAsciiToHex(&msg[13], temp);
  479. dl.Data.ucData.b4=temp[0];
  480. dl.Data.ucData.b3=temp[1];
  481. dl.Data.ucData.b2=temp[2];
  482. dl.Data.ucData.b1=temp[3];
  483. sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].ID=dl.Data.ulData;
  484. sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].status=3;
  485. sutPocStatus.GetOneUserFlag=1;
  486. return 1;
  487. }
  488. //+POC:1000000007 0004 00000BF9 0003 D1D0B7A2B2E2CAD4D7E93030
  489. //+POC:1000000008 0004 00000BF9 0003 D1D0B7A2B2E2CAD4D7E93030
  490. // 组索引 组ID 成员数 组名字
  491. //xxxxxxxx 4字节ID
  492. //nnnnnnnn 名称
  493. if(msg[5] == '1' &&
  494. msg[7] == '0' &&
  495. (msg[14] == '7' || msg[14] == '8'))
  496. {
  497. memcpy(sutPocStatus.switchGroupID,&msg[19], 8);
  498. MakeStrEndByNewLine(&msg[31]);
  499. MeSpeak(ENCODE_GBK, &msg[31],0);
  500. return 1;
  501. }
  502. }
  503. void SwitchIp()
  504. {
  505. //循环使用IP登录
  506. sutProductPara.Ipselect=!sutProductPara.Ipselect;
  507. SaveProductParaToFlash("change IP"); //之后考虑是否要存入flash
  508. if(ModemCheckPocParam()) SlwTrace(INF,"change IP",1);
  509. }