📄 ecm.c.bak
字号:
ecmgSend(socket,ECMG2SCS_STREAM_CLOSE_REQUEST,i,ucCACount);
ecmgSend(socket,ECMG2SCS_CHANNEL_CLOSE,0,ucCACount);
*/
return 0;
}
/*接收ECMG信息*/
int ecmgRecv(int socket,unsigned short waitcmd,unsigned long para,unsigned long int waitTime,unsigned char ucCACount)
{
int rc;
unsigned short cmd;
volatile short msglen,orgmsglen;
volatile CA_MESSAGE_HEAD *pHead;
volatile CA_MESSAGE_ITEM_HEAD *pItemHead;
short index;
unsigned short channelid,streamid,cpnumber;
unsigned char actm;
int i;
volatile int cmdlength;
char *pbuf;
char EcmgRecvBuf[CA_MAX_BUFFER_LENGTH];
/* 每次接收阻塞不超过10ms */
rc = ca_recv(socket,EcmgRecvBuf,sizeof(CA_MESSAGE_HEAD), waitTime);
if(rc<=0)
return rc;
if(rc>0 && rc<sizeof(CA_MESSAGE_HEAD))
return 0;
cmdlength = rc;
pbuf = EcmgRecvBuf;
cmd=ca_get_message_type(pbuf);
orgmsglen=msglen=ca_get_message_length(pbuf);
if(msglen > CA_MAX_BUFFER_LENGTH)
return 0;
rc = ca_recv(socket,EcmgRecvBuf,msglen,200*1000);
if(rc >0)
{
if(rc < msglen)
return 0;
pItemHead=(CA_MESSAGE_ITEM_HEAD *)(EcmgRecvBuf);
switch(cmd)
{
/*收到通道测试信息*/
case ECMG2SCS_CHANNEL_TEST:
{
while(msglen>0)
{
switch(pItemHead->parameter_type)
{
case ECMG2SCS_ECM_channel_ID:
channelid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
default:
break;
}
msglen-=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);
}
/*Display("ecmg: Got a channel test message,channelid=%d.",channelid);*/
/*发送通道状态应答*/
ecmgSendChannelStatus(socket,ucCACount);
break;
}
/*流测试信息*/
case ECMG2SCS_STREAM_TEST:
{
while(msglen>0)
{
switch(pItemHead->parameter_type)
{
case ECMG2SCS_ECM_stream_ID:
streamid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
default:
break;
}
msglen-=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);
}
/*Display("ecmg: Got a stream test message,steamid=%d.",streamid);*/
/*发送流状态作为应答*/
ecmgSendStreamStatus(socket,streamid,ucCACount);
break;
}
/*接收到ECMG通道状态信息*/
case ECMG2SCS_CHANNEL_STATUS:
{
while(msglen>0)
{
switch(pItemHead->parameter_type)
{
case ECMG2SCS_ECM_channel_ID:
g_ecmg_channel_status[ucCACount].ECM_channel_ID=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_section_TSpkt_flag:
g_ecmg_channel_status[ucCACount].section_TSpkt_flag=*(unsigned char *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_delay_start:
g_ecmg_channel_status[ucCACount].delay_start=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_delay_stop:
g_ecmg_channel_status[ucCACount].delay_stop=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_transition_delay_start:
g_ecmg_channel_status[ucCACount].transition_delay_start=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_transition_delay_stop:
g_ecmg_channel_status[ucCACount].transition_delay_stop=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_ECM_rep_period:
g_ecmg_channel_status[ucCACount].ECM_rep_period=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_max_streams:
g_ecmg_channel_status[ucCACount].max_streams=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_min_CP_duration:
g_ecmg_channel_status[ucCACount].min_cp_duration=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_lead_CW:
g_ecmg_channel_status[ucCACount].lead_CW=*(unsigned char *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_CW_per_msg:
g_ecmg_channel_status[ucCACount].CW_per_msg=*(unsigned char *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_max_comp_time:
g_ecmg_channel_status[ucCACount].max_comp_time=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
default:
break;
}
msglen-=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);
}
g_ecmg_channel_status[ucCACount].waitresponse=0;
/*Display("ecmg: Got a channel status message,channelid=%d,Lead_CW=%d,CW_Per_Msg=%d,section_TSpkt_flag=%d.",g_ecmg_channel_status.ECM_channel_ID,g_ecmg_channel_status.lead_CW,g_ecmg_channel_status.CW_per_msg,g_ecmg_channel_status.section_TSpkt_flag);*/
break;
}
/*接收到ECMG流状态信息*/
case ECMG2SCS_STREAM_STATUS:
{
while(msglen>0)
{
switch(pItemHead->parameter_type)
{
case ECMG2SCS_ECM_channel_ID:
channelid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_ECM_stream_ID:
streamid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_access_criteria_transfer_mode:
actm=*(unsigned char *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
}
msglen-=sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);
}
for(i=0;i<g_ecmg_stream_status_list[ucCACount].streamcount;i++)
{
if(g_ecmg_stream_status_list[ucCACount].streamlist[i].ECM_stream_ID==streamid)
{
g_ecmg_stream_status_list[ucCACount].streamlist[i].access_criteria_transfer_mode=actm;
g_ecmg_stream_status_list[ucCACount].streamlist[i].waitresponse=0;
break;
}
}
/*Display("ecmg: Got a stream status message,streamid=%d.",streamid);*/
break;
}
/*接收到ECM应答*/
case ECMG2SCS_ECM_RESPONSE:
{
while(msglen>0)
{
switch(pItemHead->parameter_type)
{
case ECMG2SCS_ECM_channel_ID:
channelid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_ECM_stream_ID:
streamid=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_CP_number:
cpnumber=*(unsigned short *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD));
break;
case ECMG2SCS_ECM_datagram:
g_ecm_index=streamid;
if(g_ecm_data[ucCACount].pqflag)
{
g_ecm_data[ucCACount].pqEcmList[g_ecm_index].ECM_channel_ID=channelid;
g_ecm_data[ucCACount].pqEcmList[g_ecm_index].ECM_stream_ID =streamid;
g_ecm_data[ucCACount].pqEcmList[g_ecm_index].CP_number =cpnumber;
g_ecm_data[ucCACount].pqEcmList[g_ecm_index].ECM_Length=pItemHead->parameter_length;
MemCopy(g_ecm_data[ucCACount].pqEcmList[g_ecm_index].ECM_Data,(unsigned char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD),pItemHead->parameter_length);
}
else
{
g_ecm_data[ucCACount].ppEcmList[g_ecm_index].ECM_channel_ID=channelid;
g_ecm_data[ucCACount].ppEcmList[g_ecm_index].ECM_stream_ID =streamid;
g_ecm_data[ucCACount].ppEcmList[g_ecm_index].CP_number =cpnumber;
g_ecm_data[ucCACount].ppEcmList[g_ecm_index].ECM_Length=pItemHead->parameter_length;
MemCopy(g_ecm_data[ucCACount].ppEcmList[g_ecm_index].ECM_Data,(unsigned char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD),pItemHead->parameter_length);
}
break;
}
msglen -= sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length;
pItemHead=(CA_MESSAGE_ITEM_HEAD *)((char *)pItemHead + sizeof(CA_MESSAGE_ITEM_HEAD) + pItemHead->parameter_length);
}
for(i=0;i<g_ecmg_stream_status_list[ucCACount].streamcount;i++)
{
if(g_ecmg_stream_status_list[ucCACount].streamlist[i].ECM_stream_ID==streamid)
{/*应答已到,清除等待标志*/
g_ecmg_stream_status_list[ucCACount].streamlist[i].waitresponse=0;
break;
}
}
/* Display1("ecmg: Got an ecm response message, stremid=%d.",streamid);*/
break;
}
}
}
else
return rc; /* socket error or time out */
/*--------------------------------------------------------------------------------*/
/* check if we got the wait command */
/*--------------------------------------------------------------------------------*/
switch(waitcmd)
{
case ECMG2SCS_CHANNEL_STATUS:
if(g_ecmg_channel_status[ucCACount].waitresponse==0)
return 1;
else
return 0;
break;
case ECMG2SCS_STREAM_STATUS:
case ECMG2SCS_ECM_RESPONSE:
/*此处用于确认是否有ECM应答,当应答已到,返回零*/
for(i=0;i<g_ecmg_stream_status_list[ucCACount].streamcount;i++)
{
if(g_ecmg_stream_status_list[ucCACount].streamlist[i].waitresponse==1)
return 0;
}
return 1;
break;
}
return 0;
}
void tk_CWInt(void)
{
unsigned char Msg[4];
while(1)
{
ReceiveQueue("CWINT",Q_WAIT,0,Msg);
/*重新复位cp_number*/
g_current_cp_number=0;
/*停留在等待状态*/
/* g_ecmg_waitcommand[0]=1;
g_ecmg_waitcommand[1]=1;
g_ecmg_waitcommand[2]=1; */
g_first_CW = 0;
PssSetIntHandler(V_SIU_IRQ3, (void*)ca_CW_int_Handle, (void *)0, 0);
ca_set_timer_interval(g_ca_config.Para_Config[0].CP_Duration*10);
S_SiMaskRegister |=0x02000000;
S_IntEdgeLvlMaskReg |=0x02000000;
}
}
/*此任务用于连接ECMG*/
void tk_ecmgMgr(void)
{
static int g_socket_ecmg=0;
struct sockaddr_in ECMGAddr;
unsigned long RcvBufLen;
int i,rc;
int haserr;
unsigned short usTempTime;
unsigned long IsKeepAlvie;
unsigned long KeepAliveCnt;
unsigned long KeepAliveIdleTime;
unsigned long KeepAliveTime;
unsigned long MSL;
unsigned long Msg[4];
unsigned long date,time,tick,olddate,oldtime,oldtick;
unsigned long waitTime=0;
unsigned long bSendChannelTest=0;
/*重启后应该把原先的连接先断掉*/
if(g_socket_ecmg)
close(g_socket_ecmg);
g_ecm_data[0].pqflag=1;
while(1)
{
tm_wkafter(1000); /*delay 10s*/
waitTime=0;
g_ecmg_connected[0]=0;
g_ecmg_waitcommand[0] = 1;
/*创建套接口*/
g_socket_ecmg = socket(AF_INET, SOCK_STREAM, TCP);
if(g_socket_ecmg == -1)
{
close(0);
tm_wkafter(100);/*by xu*/
continue;
}
g_ecmg_use_masterslave[0]=0;
ECMGAddr.sin_family = AF_INET;
ECMGAddr.sin_port = htons(g_ca_config.Para_Config[0].ECMG_Master_Port);
ECMGAddr.sin_addr.s_addr = htonl(g_ca_config.Para_Config[0].ECMG_Master_IP);
for(i=0;i<8;i++)
ECMGAddr.sin_zero[i] = 0;
/*连接主ECMG*/
RcvBufLen = 16*1024;
setsockopt(g_socket_ecmg,SOL_SOCKET,SO_RCVBUF,(char *)&RcvBufLen,4);
if(connect(g_socket_ecmg,(struct sockaddr *)&ECMGAddr,sizeof(struct sockaddr_in)))
{/*连接不成功,尝试与从ECMG连接*/
close(g_socket_ecmg);
tm_wkafter(100);/*by xu*/
/*创建套接口*/
g_socket_ecmg = socket(AF_INET, SOCK_STREAM, TCP);
if(g_socket_ecmg == -1)
{
close(0);
tm_wkafter(100);/*by xu*/
continue;
}
ECMGAddr.sin_family = AF_INET;
ECMGAddr.sin_port = htons(g_ca_config.Para_Config[0].ECMG_Slave_Port);
ECMGAddr.sin_addr.s_addr = htonl(g_ca_config.Para_Config[0].ECMG_Slave_IP);
for(i=0;i<8;i++)
ECMGAddr.sin_zero[i] = 0;
/*连接从ECMG*/
setsockopt(g_socket_ecmg,SOL_SOCKET,SO_RCVBUF,(char *)&RcvBufLen,4);
if(connect(g_socket_ecmg,(struct sockaddr *)&ECMGAddr,sizeof(struct sockaddr_in)))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -