/********************************************************************************** * File Name: Poc.c * Function Describe:device for Poc * Relate Module: * Explain: the modem must be using ZTE MC8332 * Writer: ShiLiangWen * Date: 2015.7.10 ***********************************************************************************/ #define THIS_FILE_ID 15 /***********************************************************************************/ #include "includes.h" SUT_POC_STATUS sutPocStatus; OS_TID idPocTask=0; U64 stkPocTask[POC_TASK_STK_SIZE]; unsigned char g_GroupNameLen=0; int g_iModemVer=0; int g_iPocVer=0; /********************************************************************* *添加组内成员状态列表 Data[]="0x0x0x..." x='1' **********************************************************************/ void PocAddUserStatusToList(char *Data) { char buf[50]; int i=0; int j=0; char s; unsigned short index=0; for(i=0;i'3')break; j++; s=Data[j]; if(s<'0' || s>'3')break; if(s=='3'){ //sutPocStatus.UserOnLineList[index++]=j/2; index++; } j++; } sutPocStatus.UserOnLineNum=index; sprintf(buf,"[OLUser=%d]",index); SlwTrace(DEBUG,buf,1); } /*************************************************************/ int GBKTostr(char *src,char *dec,short maxlen) { char Temp[3]; char *p=src; char *q=dec; int relen=0; long data; Temp[2]=0; while(*p && relen<(maxlen-1)){ Temp[0]=*p++; Temp[1]=*p++; data=strtol(Temp,NULL,16); q[relen++]=data; } return relen; } /******************************************************************** PocHandle 处理"+POC消息 *********************************************************************/ char PocHandle(char *msg) { char buf[100]; char *pName; static unsigned char getNameFlag=0; unsigned char len,type; #if(SPECALL_CTR==1) static char noSpeakFlag=0; #endif //=============+LSHTTS: END if(msg[1]=='L' && msg[2]=='S' && msg[3]=='H' && msg[4]=='T' && msg[9]=='E'){ sutPocStatus.TTS=0; if(sutPocStatus.Speaker==0)SpeakerDisable(); return 1; } //+POC:0BXXYYYY //请求PTT返回 //XX:00请求成功,可以不处理,因为同时有8Bxxyy回来处理打开喇叭 //XX:FF请求失败,播报特tone音,与抢麦失败一样 //YYYY:操作ID,不处理 if(msg[5] == '0' && msg[6] == 'B') { if(msg[7] == 'F' && msg[8] == 'F') { // snprintf(buf,sizeof(buf),"1=%d 2=%d 3=%d................",sutPocStatus.PPPedCt,sutPocStatus.FirstLogined,sutPocStatus.PPPed); // SlwTrace(INF,buf,1); if(sutPocStatus.PPPedCt>3 && sutPocStatus.report1Lock==0 && sutPocStatus.FirstLogined==0 && sutPocStatus.PPPed==0) { //SlwTrace(INF,"BFFFFFFFFFFFFFF",1); MeSpeak(ENCODE_GBK, "CEDECDF8C2E7C1ACBDD3", 0); return 0; } // else if( sutPocStatus.FirstLogined==0 && sutPocStatus.PPPed==1){ // MeSpeak(ENCODE_GBK, "CEDEB7A8C1ACBDD3", 0); // return 0; // } #if(SPECALL_CTR==1) noSpeakFlag=0; #endif SpeakerEnable(); SetBeep(1176,12); } #if(SPECALL_CTR==1) else if(msg[7] == '0' && msg[8] == '0') { sutPocStatus.Mic=1; noSpeakFlag=1; SpeakerEnable(); SetBeep(878,12); //SlwTrace(INF, "Speak",1); } #endif return 1; } //+POC:8bxxyy //xx--mic控制 01--打开MIC // 00--关闭MIC //yy--speaker控制 // 00--关闭speaker并要产生成功的滴音 // 01--对方说话,打开speaker,并产生成功的滴音 // 13--抢麦失败,打开speaker,并产生失败的滴音 if(msg[5]=='8' && msg[6]=='B' && msg[7]=='0') { if(msg[8]=='1')//xx == 01 { sutPocStatus.Mic=1; MicEnable(); sutPocStatus.Speaker=0; SpeakerDisable(); sutPocStatus.Logined=1; }else if(msg[8]=='0')//xx == 00 { sutPocStatus.Mic=0; MicDisable(); } if(msg[9]=='0' && msg[10] == '0') {//yy == 00 对方说话结束或本地讲话开始,滴音 #if(SPECALL_CTR==1) if(noSpeakFlag == 1) { noSpeakFlag=0; if(sutPocStatus.Speaker)sutPocStatus.Speaker=0; return 1; } #endif sutPocStatus.Speaker=0; SpeakerEnable(); SetBeep(878,12); }else if(msg[9]=='0' && msg[10] == '1') {//yy == 00 对方说话开始 sutPocStatus.Logined=1; sutPocStatus.Speaker=1; SpeakerEnable(); SetBeep(878,12); }else if(msg[9]=='1' && msg[10]=='3') {//yy == 13 抢麦不成功滴音 #if(SPECALL_CTR==1) //防止A讲话,B按了一下PTT,后A结果,B灯还是绿的 if(noSpeakFlag == 1) noSpeakFlag=0; #endif sutPocStatus.Speaker=1;//3; SpeakerEnable(); SetBeep(1176,12); } return 1; } //==============+POC:xxxx============= //+POC:820100000000 +POC:8201ffffffff //+POC:82 02 00002c8d 4b6dd58b3100300032000000 登陆成功,提示“测试102” //+POC:82 02 0000D590 B5E7C1BFB2E2CAD432 登陆成功 提示"电量测试2" if(msg[5]=='8' && msg[6]=='2') { buf[0] = msg[7]; buf[1] = msg[8]; buf[2] = 0; type = atoi(buf); switch(type) { case 0://离线 ID无效 if(sutPocStatus.Logined) HigosStartCnt(1); sutPocStatus.Logined=0; sutGpsInfo.isGpsAuthOk=0; sprintf(buf,"[msg]"); if(msg[17] == 'B' && msg[18]== '5' && msg[25] == 'C' && msg[26] == 'A') {//帐号信息错误 pocTimeOutTime=5; if(sutPocStatus.FirstLogined==0 && CSQ_flag==0) {//从来没登陆过,来一次播报一次 MeSpeak(ENCODE_GBK, "D5CABAC5D0C5CFA2B4EDCEF3", 0); sutPocStatus.report1Lock=1; }else { if(sutPocStatus.reportTimeCnt1 >= 60) { sutPocStatus.reportTimeCnt1=0; //MeSpeak(ENCODE_GBK, "D5CABAC5D0C5CFA2B4EDCEF3", 0); sutPocStatus.report1Lock=1; } } strcat(buf, "Login failed"); } else if(msg[17] == 'C' && msg[18]== 'E' && msg[25] == 'C' && msg[26] == '2' ) {//无网络连接 if(sutPocStatus.FirstLogined==0) {//从来没登陆过,来一次播报一次 //sutGpsStatus.PPPStatus if(sutPocStatus.report1Lock==0 && CSQ_flag==0){ if(sutPocStatus.PPPed==0) {MeSpeak(ENCODE_GBK, "CEDECDF8C2E7C1ACBDD3", 0);} else if(sutPocStatus.PPPed==1){ MeSpeak(ENCODE_GBK, "CEDEB7A8C1ACBDD3", 0); } } }else { if(sutPocStatus.reportTimeCnt2 >= 60 && sutPocStatus.report1Lock==0) { sutPocStatus.reportTimeCnt2=0; //MeSpeak(ENCODE_GBK, "CEDECDF8C2E7C1ACBDD3", 0); } } strcat(buf, "No network"); } else strcat(buf, "No login"); SlwTrace(INF, buf, 1); break; case 1://登陆中 ID无效 SlwTrace(INF, "login ing",1); break; case 2://登陆成功 ID为用户ID len = strlen(&msg[17])-2; if(len >= POC_USER_NAME_LEN) len = POC_USER_NAME_LEN; strncpy(sutPocStatus.UserName,&msg[17],len); if(len < POC_USER_NAME_LEN) sutPocStatus.UserName[len]=0; msg[17]=0; strncpy(sutPocStatus.UserId,&msg[9],POC_USER_ID_LEN); SlwTrace(INF, "login ok",1); getNameFlag=1;//登陆成功时,获取过了用户名字,后面可以播报了 break; case 3://注销中 ID无效 SlwTrace(INF, "logout ing",1); break; } return 1; } //+POC:86 00 000000dc a47fc47e3300 0000 进入群组,提示“群组3”(群组ID为000000dc,群组名为“群组3”即a47fc47e3300) // 86 00 0000009a d89ea48ba47fc47e0000 默认群组 //+POC:86 00 00000BFC D1D0B7A2B2E2CAD4D7E93033 if(msg[5]=='8' && msg[6]=='6') { HigosStopCnt();//正常登陆了,停止计数 sutPocStatus.Logined=1; pocTimeOutTime=30; if(msg[8] == '0') {//GB2312 len = strlen(&msg[17])-2; if(len >= POC_GROUP_NAME_LEN) len = POC_GROUP_NAME_LEN; strncpy(sutPocStatus.GroupName,&msg[17],len); if(len < POC_GROUP_NAME_LEN) sutPocStatus.GroupName[len]=0; msg[17]=0; strncpy(sutPocStatus.GroupId,&msg[9],POC_GROUP_ID_LEN); if(sutPocStatus.FirstLogined==0) {//登陆成功用户名群组名只播报一次 if(getNameFlag == 0) sprintf(buf, "%s",sutPocStatus.GroupName); else { getNameFlag=0; sprintf(buf, "%s2CD2D1B5C7C2BD2C%s",sutPocStatus.UserName,sutPocStatus.GroupName); } MeSpeak(ENCODE_GBK, buf,0); }else {//其它形式进入 if(g_ucEnterGroupFlag==1) { g_ucEnterGroupFlag=0; sprintf(buf, "BDF8C8EB2C%s",sutPocStatus.GroupName); MeSpeak(ENCODE_GBK, buf,0); }else { //V13011版本去除 临时拉群组嘟音 //嘟嘟嘟 // SpeakerEnable(); // SetBeep(300,10); // os_dly_wait(110); // SpeakerEnable(); // SetBeep(300,10); // os_dly_wait(110); // SpeakerEnable(); // SetBeep(300,10); // os_dly_wait(110); printf("SetBeep..............\r\n"); } } } sutPocStatus.FirstLogined=1; return 1; } //+POC:830000002e650000 对方话语权 if(msg[5]=='8' && msg[6]=='3' && msg[7]=='0' && msg[8]=='0'){ //最新POC版本快速短按PTT放开会只发这条过来,实际是没有请麦来的,因此目前忽视 // sutPocStatus.Speaker=1; // SpeakerEnable(); return 1; } //+POC:8301ffffffff0000 对方释放话语权 if(msg[5]=='8' && msg[6]=='3' && msg[7]=='0' && msg[8]=='1'){ //最新POC版本目前没有这条指令,也忽视吧 // sutPocStatus.Speaker=0; // SpeakerDisable(); return 1; } //+POC:91010103 if(msg[5]=='9' && msg[6]=='1'){ PocAddUserStatusToList(&msg[7]); return 1; } //+POC:0E00 0000 0003 //+POC:0e00 0000 0009 if(msg[5]=='0' && msg[6]=='e') { return 1; } //+POC:84 00 xxx //单呼提示 //+POC:84 00 BAF4BDD0B3C9B9A6 if(msg[5]=='8' && msg[6]=='4'){ MakeStrEndByNewLine(msg); MeSpeak(ENCODE_GBK , &msg[9],0); return 1; } //+POC:21 000000 00002f25 2875376233000000 //+POC:21 000000 0000D590 B5E7C1BFB2E2CAD432 // 关键字 保留 UID 名称 if(msg[5]=='2' && msg[6]=='1'){ MakeStrEndByNewLine(msg); MeSpeak(ENCODE_GBK , &msg[21],0); msg[21]=0; strncpy(sutPocStatus.UserIdTemp,&msg[13],POC_USER_ID_LEN); return 1; } //+POC:1000000007 0004 00000BF9 0003 D1D0B7A2B2E2CAD4D7E93030 //+POC:1000000008 0004 00000BF9 0003 D1D0B7A2B2E2CAD4D7E93030 // 组索引 组ID 成员数 组名字 //xxxxxxxx 4字节ID //nnnnnnnn 名称 if(msg[5] == '1' && msg[7] == '0' && (msg[14] == '7' || msg[14] == '8')) { memset(sutPocStatus.GroupIdTemp, 0, POC_GROUP_ID_LEN); memcpy(sutPocStatus.GroupIdTemp, &msg[19], POC_GROUP_ID_LEN); MakeStrEndByNewLine(msg); MeSpeak(ENCODE_GBK, &msg[31],0); return 1; } return 0; }