PocTask.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  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. unsigned char g_GroupNameLen=0;
  16. int g_iModemVer=0;
  17. int g_iPocVer=0;
  18. /*********************************************************************
  19. *添加组内成员状态列表
  20. Data[]="0x0x0x..."
  21. x='1'
  22. **********************************************************************/
  23. void PocAddUserStatusToList(char *Data)
  24. {
  25. char buf[50];
  26. int i=0;
  27. int j=0;
  28. char s;
  29. unsigned short index=0;
  30. for(i=0;i<POC_USER_ONLINE_LIST_LEN;i++){
  31. s=Data[j];
  32. if(s<'0' || s>'3')break;
  33. j++;
  34. s=Data[j];
  35. if(s<'0' || s>'3')break;
  36. if(s=='3'){
  37. //sutPocStatus.UserOnLineList[index++]=j/2;
  38. index++;
  39. }
  40. j++;
  41. }
  42. sutPocStatus.UserOnLineNum=index;
  43. sprintf(buf,"[OLUser=%d]",index);
  44. SlwTrace(DEBUG,buf,1);
  45. }
  46. /*************************************************************/
  47. int GBKTostr(char *src,char *dec,short maxlen)
  48. {
  49. char Temp[3];
  50. char *p=src;
  51. char *q=dec;
  52. int relen=0;
  53. long data;
  54. Temp[2]=0;
  55. while(*p && relen<(maxlen-1)){
  56. Temp[0]=*p++;
  57. Temp[1]=*p++;
  58. data=strtol(Temp,NULL,16);
  59. q[relen++]=data;
  60. }
  61. return relen;
  62. }
  63. /********************************************************************
  64. PocHandle
  65. 处理"+POC消息
  66. *********************************************************************/
  67. char PocHandle(char *msg)
  68. {
  69. char buf[100];
  70. char *pName;
  71. static unsigned char getNameFlag=0;
  72. unsigned char len,type;
  73. #if(SPECALL_CTR==1)
  74. static char noSpeakFlag=0;
  75. #endif
  76. //=============+LSHTTS: END
  77. if(msg[1]=='L' && msg[2]=='S' && msg[3]=='H' && msg[4]=='T' && msg[9]=='E'){
  78. sutPocStatus.TTS=0;
  79. if(sutPocStatus.Speaker==0)SpeakerDisable();
  80. return 1;
  81. }
  82. //+POC:0BXXYYYY
  83. //请求PTT返回
  84. //XX:00请求成功,可以不处理,因为同时有8Bxxyy回来处理打开喇叭
  85. //XX:FF请求失败,播报特tone音,与抢麦失败一样
  86. //YYYY:操作ID,不处理
  87. if(msg[5] == '0' && msg[6] == 'B')
  88. {
  89. if(msg[7] == 'F' && msg[8] == 'F')
  90. {
  91. // snprintf(buf,sizeof(buf),"1=%d 2=%d 3=%d................",sutPocStatus.PPPedCt,sutPocStatus.FirstLogined,sutPocStatus.PPPed);
  92. // SlwTrace(INF,buf,1);
  93. if(sutPocStatus.PPPedCt>3 && sutPocStatus.report1Lock==0 && sutPocStatus.FirstLogined==0 && sutPocStatus.PPPed==0)
  94. {
  95. //SlwTrace(INF,"BFFFFFFFFFFFFFF",1);
  96. MeSpeak(ENCODE_GBK, "CEDECDF8C2E7C1ACBDD3", 0);
  97. return 0;
  98. }
  99. // else if( sutPocStatus.FirstLogined==0 && sutPocStatus.PPPed==1){
  100. // MeSpeak(ENCODE_GBK, "CEDEB7A8C1ACBDD3", 0);
  101. // return 0;
  102. // }
  103. #if(SPECALL_CTR==1)
  104. noSpeakFlag=0;
  105. #endif
  106. SpeakerEnable();
  107. SetBeep(1176,12);
  108. }
  109. #if(SPECALL_CTR==1)
  110. else if(msg[7] == '0' && msg[8] == '0')
  111. {
  112. sutPocStatus.Mic=1;
  113. noSpeakFlag=1;
  114. SpeakerEnable();
  115. SetBeep(878,12);
  116. //SlwTrace(INF, "Speak",1);
  117. }
  118. #endif
  119. return 1;
  120. }
  121. //+POC:8bxxyy
  122. //xx--mic控制 01--打开MIC
  123. // 00--关闭MIC
  124. //yy--speaker控制
  125. // 00--关闭speaker并要产生成功的滴音
  126. // 01--对方说话,打开speaker,并产生成功的滴音
  127. // 13--抢麦失败,打开speaker,并产生失败的滴音
  128. if(msg[5]=='8' && msg[6]=='B' && msg[7]=='0')
  129. {
  130. if(msg[8]=='1')//xx == 01
  131. {
  132. sutPocStatus.Mic=1;
  133. MicEnable();
  134. sutPocStatus.Speaker=0;
  135. SpeakerDisable();
  136. sutPocStatus.Logined=1;
  137. }else if(msg[8]=='0')//xx == 00
  138. {
  139. sutPocStatus.Mic=0;
  140. MicDisable();
  141. }
  142. if(msg[9]=='0' && msg[10] == '0')
  143. {//yy == 00 对方说话结束或本地讲话开始,滴音
  144. #if(SPECALL_CTR==1)
  145. if(noSpeakFlag == 1)
  146. {
  147. noSpeakFlag=0;
  148. if(sutPocStatus.Speaker)sutPocStatus.Speaker=0;
  149. return 1;
  150. }
  151. #endif
  152. sutPocStatus.Speaker=0;
  153. SpeakerEnable();
  154. SetBeep(878,12);
  155. }else if(msg[9]=='0' && msg[10] == '1')
  156. {//yy == 00 对方说话开始
  157. sutPocStatus.Logined=1;
  158. sutPocStatus.Speaker=1;
  159. SpeakerEnable();
  160. SetBeep(878,12);
  161. }else if(msg[9]=='1' && msg[10]=='3')
  162. {//yy == 13 抢麦不成功滴音
  163. #if(SPECALL_CTR==1)
  164. //防止A讲话,B按了一下PTT,后A结果,B灯还是绿的
  165. if(noSpeakFlag == 1) noSpeakFlag=0;
  166. #endif
  167. sutPocStatus.Speaker=1;//3;
  168. SpeakerEnable();
  169. SetBeep(1176,12);
  170. }
  171. return 1;
  172. }
  173. //==============+POC:xxxx=============
  174. //+POC:820100000000 +POC:8201ffffffff
  175. //+POC:82 02 00002c8d 4b6dd58b3100300032000000 登陆成功,提示“测试102”
  176. //+POC:82 02 0000D590 B5E7C1BFB2E2CAD432 登陆成功 提示"电量测试2"
  177. if(msg[5]=='8' && msg[6]=='2')
  178. {
  179. buf[0] = msg[7];
  180. buf[1] = msg[8];
  181. buf[2] = 0;
  182. type = atoi(buf);
  183. switch(type)
  184. {
  185. case 0://离线 ID无效
  186. if(sutPocStatus.Logined) HigosStartCnt(1);
  187. sutPocStatus.Logined=0;
  188. sutGpsInfo.isGpsAuthOk=0;
  189. sprintf(buf,"[msg]");
  190. if(msg[17] == 'B' && msg[18]== '5' && msg[25] == 'C' && msg[26] == 'A')
  191. {//帐号信息错误
  192. pocTimeOutTime=5;
  193. if(sutPocStatus.FirstLogined==0 && CSQ_flag==0)
  194. {//从来没登陆过,来一次播报一次
  195. MeSpeak(ENCODE_GBK, "D5CABAC5D0C5CFA2B4EDCEF3", 0);
  196. sutPocStatus.report1Lock=1;
  197. }else
  198. {
  199. if(sutPocStatus.reportTimeCnt1 >= 60)
  200. {
  201. sutPocStatus.reportTimeCnt1=0;
  202. //MeSpeak(ENCODE_GBK, "D5CABAC5D0C5CFA2B4EDCEF3", 0);
  203. sutPocStatus.report1Lock=1;
  204. }
  205. }
  206. strcat(buf, "Login failed");
  207. }
  208. else
  209. if(msg[17] == 'C' && msg[18]== 'E' && msg[25] == 'C' && msg[26] == '2' )
  210. {//无网络连接
  211. if(sutPocStatus.FirstLogined==0)
  212. {//从来没登陆过,来一次播报一次
  213. //sutGpsStatus.PPPStatus
  214. if(sutPocStatus.report1Lock==0 && CSQ_flag==0){
  215. if(sutPocStatus.PPPed==0) {MeSpeak(ENCODE_GBK, "CEDECDF8C2E7C1ACBDD3", 0);}
  216. else if(sutPocStatus.PPPed==1){
  217. MeSpeak(ENCODE_GBK, "CEDEB7A8C1ACBDD3", 0);
  218. }
  219. }
  220. }else
  221. {
  222. if(sutPocStatus.reportTimeCnt2 >= 60 && sutPocStatus.report1Lock==0)
  223. {
  224. sutPocStatus.reportTimeCnt2=0;
  225. //MeSpeak(ENCODE_GBK, "CEDECDF8C2E7C1ACBDD3", 0);
  226. }
  227. }
  228. strcat(buf, "No network");
  229. }
  230. else strcat(buf, "No login");
  231. SlwTrace(INF, buf, 1);
  232. break;
  233. case 1://登陆中 ID无效
  234. SlwTrace(INF, "login ing",1);
  235. break;
  236. case 2://登陆成功 ID为用户ID
  237. len = strlen(&msg[17])-2;
  238. if(len >= POC_USER_NAME_LEN) len = POC_USER_NAME_LEN;
  239. strncpy(sutPocStatus.UserName,&msg[17],len);
  240. if(len < POC_USER_NAME_LEN) sutPocStatus.UserName[len]=0;
  241. msg[17]=0;
  242. strncpy(sutPocStatus.UserId,&msg[9],POC_USER_ID_LEN);
  243. SlwTrace(INF, "login ok",1);
  244. getNameFlag=1;//登陆成功时,获取过了用户名字,后面可以播报了
  245. break;
  246. case 3://注销中 ID无效
  247. SlwTrace(INF, "logout ing",1);
  248. break;
  249. }
  250. return 1;
  251. }
  252. //+POC:86 00 000000dc a47fc47e3300 0000 进入群组,提示“群组3”(群组ID为000000dc,群组名为“群组3”即a47fc47e3300)
  253. // 86 00 0000009a d89ea48ba47fc47e0000 默认群组
  254. //+POC:86 00 00000BFC D1D0B7A2B2E2CAD4D7E93033
  255. if(msg[5]=='8' && msg[6]=='6')
  256. {
  257. HigosStopCnt();//正常登陆了,停止计数
  258. sutPocStatus.Logined=1;
  259. pocTimeOutTime=30;
  260. if(msg[8] == '0')
  261. {//GB2312
  262. len = strlen(&msg[17])-2;
  263. if(len >= POC_GROUP_NAME_LEN) len = POC_GROUP_NAME_LEN;
  264. strncpy(sutPocStatus.GroupName,&msg[17],len);
  265. if(len < POC_GROUP_NAME_LEN) sutPocStatus.GroupName[len]=0;
  266. msg[17]=0;
  267. strncpy(sutPocStatus.GroupId,&msg[9],POC_GROUP_ID_LEN);
  268. if(sutPocStatus.FirstLogined==0)
  269. {//登陆成功用户名群组名只播报一次
  270. if(getNameFlag == 0)
  271. sprintf(buf, "%s",sutPocStatus.GroupName);
  272. else
  273. {
  274. getNameFlag=0;
  275. sprintf(buf, "%s2CD2D1B5C7C2BD2C%s",sutPocStatus.UserName,sutPocStatus.GroupName);
  276. }
  277. MeSpeak(ENCODE_GBK, buf,0);
  278. }else
  279. {//其它形式进入
  280. if(g_ucEnterGroupFlag==1)
  281. {
  282. g_ucEnterGroupFlag=0;
  283. sprintf(buf, "BDF8C8EB2C%s",sutPocStatus.GroupName);
  284. MeSpeak(ENCODE_GBK, buf,0);
  285. }else {
  286. //V13011版本去除 临时拉群组嘟音
  287. //嘟嘟嘟
  288. // SpeakerEnable();
  289. // SetBeep(300,10);
  290. // os_dly_wait(110);
  291. // SpeakerEnable();
  292. // SetBeep(300,10);
  293. // os_dly_wait(110);
  294. // SpeakerEnable();
  295. // SetBeep(300,10);
  296. // os_dly_wait(110);
  297. printf("SetBeep..............\r\n");
  298. }
  299. }
  300. }
  301. sutPocStatus.FirstLogined=1;
  302. return 1;
  303. }
  304. //+POC:830000002e650000 对方话语权
  305. if(msg[5]=='8' && msg[6]=='3' && msg[7]=='0' && msg[8]=='0'){
  306. //最新POC版本快速短按PTT放开会只发这条过来,实际是没有请麦来的,因此目前忽视
  307. // sutPocStatus.Speaker=1;
  308. // SpeakerEnable();
  309. return 1;
  310. }
  311. //+POC:8301ffffffff0000 对方释放话语权
  312. if(msg[5]=='8' && msg[6]=='3' && msg[7]=='0' && msg[8]=='1'){
  313. //最新POC版本目前没有这条指令,也忽视吧
  314. // sutPocStatus.Speaker=0;
  315. // SpeakerDisable();
  316. return 1;
  317. }
  318. //+POC:91010103
  319. if(msg[5]=='9' && msg[6]=='1'){
  320. PocAddUserStatusToList(&msg[7]);
  321. return 1;
  322. }
  323. //+POC:0E00 0000 0003
  324. //+POC:0e00 0000 0009
  325. if(msg[5]=='0' && msg[6]=='e')
  326. {
  327. return 1;
  328. }
  329. //+POC:84 00 xxx //单呼提示
  330. //+POC:84 00 BAF4BDD0B3C9B9A6
  331. if(msg[5]=='8' && msg[6]=='4'){
  332. MakeStrEndByNewLine(msg);
  333. MeSpeak(ENCODE_GBK , &msg[9],0);
  334. return 1;
  335. }
  336. //+POC:21 000000 00002f25 2875376233000000
  337. //+POC:21 000000 0000D590 B5E7C1BFB2E2CAD432
  338. // 关键字 保留 UID 名称
  339. if(msg[5]=='2' && msg[6]=='1'){
  340. MakeStrEndByNewLine(msg);
  341. MeSpeak(ENCODE_GBK , &msg[21],0);
  342. msg[21]=0;
  343. strncpy(sutPocStatus.UserIdTemp,&msg[13],POC_USER_ID_LEN);
  344. return 1;
  345. }
  346. //+POC:1000000007 0004 00000BF9 0003 D1D0B7A2B2E2CAD4D7E93030
  347. //+POC:1000000008 0004 00000BF9 0003 D1D0B7A2B2E2CAD4D7E93030
  348. // 组索引 组ID 成员数 组名字
  349. //xxxxxxxx 4字节ID
  350. //nnnnnnnn 名称
  351. if(msg[5] == '1' &&
  352. msg[7] == '0' &&
  353. (msg[14] == '7' || msg[14] == '8'))
  354. {
  355. memset(sutPocStatus.GroupIdTemp, 0, POC_GROUP_ID_LEN);
  356. memcpy(sutPocStatus.GroupIdTemp, &msg[19], POC_GROUP_ID_LEN);
  357. MakeStrEndByNewLine(msg);
  358. MeSpeak(ENCODE_GBK, &msg[31],0);
  359. return 1;
  360. }
  361. return 0;
  362. }