/********************************************************************************** * 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]; char g_cGroupName[POC_GROUP_NAME_LEN]; unsigned long g_ulGroupID; unsigned char g_ucSelect=0; int g_iModemVer=0; int g_iPocVer=0; /********************************************************************* *添加组内成员状态列表 Data[]="0x0x0x..." x='1' **********************************************************************/ void PocAddUserStatusToList(char *Data) { // char buf[50];//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,"[OnLineUserNum=%d]",index); // SlwTrace(DEBUG,buf,1); } /******************************************************************* *在str里找到/r或/n 并将其修改为/0 比如: "1234/r" -> "1234" 比如: "1234/n" -> "1234" 比如: "1234/r/n" -> "1234" msgbuf[130]; msgbuf[129]=0; ********************************************************************/ void ReplaceStrWithN(char *str) { char d; char *p=str; while(0!=(d=*p)){ if(d=='\r' || d=='\n'){ *p='\0'; break; } p++; } } int GetAllUsers(char *msg) { unsigned short num; char name[POC_USER_NAME_LEN*2+1]; unsigned long id; unsigned short index; char *pTemp; char status;//状态 unsigned char len; //+POC:8101000000000000A5F647726F757031 //+POC:0e 00 0000 0004 if(msg[5]=='8' && msg[6]=='1'){ //+POC:81 01 0000 0000 0000A5F6 47726F757031 // 81 状态 操作ID 成员索引 成员ID 成员名字 //用户名GB2312 len = strlen(&msg[25])-2; if(len >= POC_USER_NAME_LEN*2) len = POC_USER_NAME_LEN*2; memcpy(name, &msg[25], len); name[len]=0; //成员ID msg[25]=0; id=strtol(&msg[17],&pTemp,16); //组索引 msg[17]=0; index=strtol(&msg[13],&pTemp,16); //索引必须非0 且不能超出所能接收的限制,否则不处理 //if(index==0 || index>=POC_ALL_USERS_NUM) return 1; if(index>=(POC_ALL_USERS_NUM-1)) return 1; sutPocStatus.AllUsers[index].ID=id; sutPocStatus.AllUsers[index].status=2; StrAsciiToHex(name, sutPocStatus.AllUsers[index].name); return 1; } //+POC:0E00 0000 0002 if(msg[5]=='0'&& msg[6]=='E' && msg[7]=='0' && msg[8]=='0'){ msg[17]=0; sutPocStatus.UserOnLineNum=strtol(&msg[13],&pTemp,16); if(sutPocStatus.UserOnLineNum>POC_ALL_USERS_NUM)sutPocStatus.UserOnLineNum=POC_ALL_USERS_NUM; sutPocStatus.UserNum_Update=1; } return 0; } int GetAllGroups(char *msg) { unsigned short num; char name[POC_GROUP_NAME_LEN*2+1]; unsigned long id; unsigned short index; char *pTemp; unsigned char len; //+POC:8000000000010000009a0059d89ea48ba47fc47e0000 第1个群组名为默认群组 //+POC:800000000002000001040024f16d33579e528b4e04590000 第2个群组名为深圳办事处 if(msg[5]=='8' && msg[6]=='0'){ //+POC:80 00 AE4A 0001 00000BF9 0009 D1D0B7A2B2E2CAD4D7E93030 //+POC:80 00 0000 0001 0000009a 0059 d89ea48ba47fc47e 0000 // 80 组标示 操作ID 组索引 组ID 组内成员个数 组名 结束符 //群组名unicode len = strlen(&msg[29])-2; if(len >= POC_GROUP_NAME_LEN*2) len = POC_GROUP_NAME_LEN*2; memcpy(name, &msg[29], len); name[len]=0; //组内成员个数 msg[29]=0; num=strtol(&msg[25],&pTemp,16); //组ID msg[25]=0; id=strtol(&msg[17],&pTemp,16); //组索引 msg[17]=0; index=strtol(&msg[13],&pTemp,16); //索引必须非0 且不能超出所能接收的限制,否则不处理 //4G模块POC组索引是从0000开始的 if(index>POC_ALL_GROUPS_NUM)return 1; //组个数统计 if(index==0){ sutPocStatus.GroupsNum=1; }else{ sutPocStatus.GroupsNum++; } //index-=1; //添加 sutPocStatus.AllGroups[index].ID=id; sutPocStatus.AllGroups[index].usernum=num; if(name[0]==0) {//当模块吐出来的名字为空时,自动添加为空格,防止显示时会死掉 sutPocStatus.AllGroups[index].name[0]=' '; sutPocStatus.AllGroups[index].name[1]=0; }else StrAsciiToHex(name, sutPocStatus.AllGroups[index].name); sutPocStatus.GroupNum_Update = 1; return 1; } return 0; } int GBKTostr(char *src,char *dec,short maxlen) { char Temp[3]; char *p=src; char *q=dec; int j=0; long data; Temp[2]=0; while(*p && j<(maxlen-1)){ Temp[0]=*p++; Temp[1]=*p++; data=strtol(Temp,NULL,16); q[j++]=data; } return j; } /******************************************************************** PocHandle 处理"+POC消息 *********************************************************************/ char PocHandle(char *msg) { uint8_t temp[4]; SUTDS ds; SUTDL dl; char buf[102];//100 char *pName; unsigned char len,type; char pGroup[POC_GROUP_NAME_LEN*2]={0}; static int Table[POC_GROUP_NAME_LEN*2]={0}; long l; int i; static unsigned char getNameFlag=0; static char Username[POC_USER_NAME_LEN+1];//因为播报时是先存了用户名,后面才存群组名,然后一起播报,故此值要是静态的,否则有时用户名会播报不出来 char Groupname[POC_GROUP_NAME_LEN+1]; #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') { #if(SPECALL_CTR==1) noSpeakFlag=0; #endif SpeakerEnable(); SetBeep(1000,10); } #if(SPECALL_CTR==1) else if(msg[7] == '0' && msg[8] == '0') { sutPocStatus.Mic=1; noSpeakFlag=1; SpeakerEnable(); SetBeep(500,10); //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 { enableDataSend(); sutPocStatus.Mic=1; MicEnable(); sutPocStatus.Speaker=0; sutPocStatus.PPTpress=1; #if(SPECALL_CTR==1) if(noSpeakFlag == 0) #endif SpeakerDisable(); sutPocStatus.Logined=1; }else if(msg[8]=='0')//xx == 00 { sutPocStatus.Mic=0; sutPocStatus.PPTpress=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(500,10); }else if(msg[9]=='0' && msg[10] == '1') {//yy == 00 对方说话开始 enableDataSend(); LCDTimeOut(0); //此时如果睡眠 觉醒吧 LcdOnTimeCt=0; /////////////////// sutPocStatus.Logined=1; sutPocStatus.Speaker=1; SpeakerEnable(); if(newPara.KeySound!=0){ SetBeep(500,10); } }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.statusChaned=1; //sutPocStatus.Speaker=1;//3;//屏蔽掉后:能达到修改记录中的第6点 SpeakerEnable(); SetBeep(1000,10); } 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.danHunStatus=0;//掉线,清单呼显示状态为非单呼状态 sutPocStatus.Logined=0; sutGpsInfo.isGpsAuthOk=0; snprintf(buf, sizeof(buf),"[msg]"); if(msg[17] == 'B' && msg[18]== '5' && msg[25] == 'C' && msg[26] == 'A') {//帐号信息错误 pocTimeOutTime=5; sutPocStatus.loginResult=1; strcat(buf, "账号信息错误"); } else if(msg[17] == 'C' && msg[18]== 'E' && msg[25] == 'C' && msg[26] == '2') {//无网络连接 if(sutPocStatus.loginResult != 1) sutPocStatus.loginResult=2; strcat(buf, "无网络连接"); }else if(msg[17] == 'C' && msg[18]== 'E' && msg[25] == 'C' && msg[26] == '1'){ sutPocStatus.loginResult=5; strcat(buf, "无法连接"); }else if(msg[17] == 'C' && msg[18]== '3' && msg[25] == 'B' && msg[26] == '7'){ sutPocStatus.loginResult=6; strcat(buf, "没有服务"); } 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; memcpy(Username,&msg[17],len); Username[len]=0; StrAsciiToHex(Username,sutPocStatus.LocalUser.name); msg[17]=0; sutPocStatus.LocalUser.ID=strtol(&msg[9],&pName,16); SlwTrace(INF, "login ok",1); getNameFlag=1;//登陆成功时,获取过了用户名字,后面可以播报了 sutPocStatus.loginResult=3; break; case 3://注销中 ID无效 SlwTrace(INF, "logout ing",1); break; } return 1; } //获取所有组列表,也就是处理+POC:80xxxs if(GetAllGroups(msg))return 1; //获取所有成员列表,也就是处理+POC:81XXX //if(GetAllUsers(msg))return 1; //+POC:86 00 000000dc a47fc47e3300 0000 进入群组,提示“群组3”(群组ID为000000dc,群组名为“群组3”即a47fc47e3300) // 86 00 0000009a d89ea48ba47fc47e0000 默认群组 //+POC:86 00 00000366 0000 if(msg[5]=='8' && msg[6]=='6') {//----获取本机当前群组名及群组ID //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; memcpy(Groupname,&msg[17],len); Groupname[len]=0; msg[17]=0; sutPocStatus.LocalGroup.ID=strtol(&msg[9],&pName,16); StrAsciiToHex(Groupname,sutPocStatus.LocalGroup.name); if(sutPocStatus.FirstLogined==0) {//登陆成功用户名群组名只播报一次 if(getNameFlag == 0) snprintf(buf, sizeof(buf), "%s",Groupname); else { getNameFlag=0; snprintf(buf, sizeof(buf), "%s2CD2D1B5C7C2BD2C%s",Username,Groupname); } MeSpeak(ENCODE_GBK, buf,0); }else {//其它形式进入 if(g_ucEnterGroupFlag==1) { g_ucEnterGroupFlag=0; snprintf(buf, sizeof(buf), "BDF8C8EB2C%s",Groupname); MeSpeak(ENCODE_GBK, buf,0); } } } sutPocStatus.danHunStatus=0;//收到这个直接设置为非单呼模式,否在会在单呼模式下如果被创建了临时群组,之后会一直显示单呼模式 //if(sutUIstatus.Status == UIS_STANDBY) ShowButton(121,107,"消息"); sutPocStatus.FirstLogined=1; return 1; } //+POC:830000002e650000 对方话语权 //+POC:83000000420c330067004b6dd58b3200f7530000 //+POC:8300000045544800530031003500310057004b6dd58b300033000000 //+POC:83000000D592 303738 if(msg[5]=='8' && msg[6]=='3' && msg[7]=='0' && msg[8]=='0') { //最新POC版本快速短按PTT放开会只发这条过来,实际是没有请麦来的 //因此不做灯与喇叭,LCD背光等控制 ReplaceStrWithN(&msg[17]); //如果他只发ID不发对方名,要记得修改防护 i=strlen(&msg[17]); if(i>=POC_USER_NAME_LEN) i=POC_USER_NAME_LEN; else i++;//把0结束也拷过去 StrAsciiToHex(&msg[17], sutPocStatus.Callname); *(msg+17) = 0; sutPocStatus.CallID = strtol(&msg[9],&pName,16); msg[17]=0; 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 0002 if(msg[5]=='0'&& msg[6]=='E') { msg[17]=0; StrAsciiToHex(&msg[13], temp); ds.Data.ucData.b1=temp[1]; ds.Data.ucData.b2=temp[2]; sutPocStatus.UserOnLineNum=ds.Data.usData; sutPocStatus.UserNum_Update=1; snprintf(buf, sizeof(buf), "oneLine:%d",sutPocStatus.UserOnLineNum); SlwTrace(INF, buf, 1); } //+POC:84 00 xxx //单呼提示 if(msg[5]=='8' && msg[6]=='4') { MakeStrEndByNewLine(msg); MeSpeak(ENCODE_GBK , &msg[9],0); //检测是哪种单呼 if(memcmp(&msg[9], "C1D9CAB1", 8)==0) {//临时呼叫xxxx 被呼成功 sutPocStatus.danHunStatus=1;//进入单显示 //if(sutUIstatus.Status == UIS_STANDBY) ShowButton(121,107,"挂断"); }else if(memcmp(&msg[9], "CDCBB3F6", 8)==0) {//退出临时呼叫 退出单呼状态 sutPocStatus.danHunStatus=0; //if(sutUIstatus.Status == UIS_STANDBY) ShowButton(121,107,"消息"); }else if(memcmp(&msg[9], "BAF4BDD0B3C9B9A6", 16)==0) {//呼叫成功 主单呼 sutPocStatus.danHunStatus=1; } return 1; } //+POC:21 000000 0000A5AB B8D6CCFACFC0 // 关键字 保留 UID 名称 if(msg[5]=='2' && msg[6]=='1'){ MakeStrEndByNewLine(msg); memset(sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name,0,POC_ALL_USERS_NUM); if(msg[21]==0) sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name[0]=' '; else StrAsciiToHex(&msg[21], sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].name); msg[21]=0; StrAsciiToHex(&msg[13], temp); dl.Data.ucData.b4=temp[0]; dl.Data.ucData.b3=temp[1]; dl.Data.ucData.b2=temp[2]; dl.Data.ucData.b1=temp[3]; sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].ID=dl.Data.ulData; sutPocStatus.AllUsers[sutPocStatus.FillUserIndex].status=3; sutPocStatus.GetOneUserFlag=1; 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')) { memcpy(sutPocStatus.switchGroupID,&msg[19], 8); MakeStrEndByNewLine(&msg[31]); MeSpeak(ENCODE_GBK, &msg[31],0); return 1; } }