ecm.c
来自「有线电视系统前端设备复用器原代码。 用语接受卫星信号」· C语言 代码 · 共 1,979 行 · 第 1/5 页
C
1,979 行
Display("ecmg: Send channel setup message time out!\r\n",errno);
break;
}
Display("ecmg: send channel setup message ok!\r\n");
haserr=ECMG_NOERROR;
/*获得当前时间*/
tm_get(&olddate,&oldtime,&oldtick);
while(1)
{
/*接收通道状态应答*/
rc=ecmgRecv(g_socket_ecmg,ECMG2SCS_CHANNEL_STATUS,0,0);
if(rc<0) /* socket error */
{
haserr=ECMG_SOCKETERROR;
break;
}
else if(rc==1) /* got the waiting message */
break;
tm_get(&date,&time,&tick);
/*两次比较是否超时*/
if(dif_second(date,time,olddate,oldtime)*10 > g_ca_config.Para_Config[0].Network_Delay)
{
haserr=ECMG_TIMEOUTERROR;
break;
}
my_Delay(50);
}
if(haserr==ECMG_SOCKETERROR)
{
Display("ecmg: Receive channel status message socket error! \r\n");
close(g_socket_ecmg);
g_ecmg_connected[0]=0;
break;
}
else if(haserr==ECMG_TIMEOUTERROR)
{
close(g_socket_ecmg);
g_ecmg_connected[0]=0;
Display("ecmg: Receive channel status message out of time!\r\n");
break;
}
Display("ecmg: recevie channel status message ok!\r\n");
/*----------------------------------------------------------------------------------*/
/* setup all the stream */
/*----------------------------------------------------------------------------------*/
haserr=ECMG_NOERROR;
g_ecmg_waitcommand[0]=ECMG2SCS_STREAM_STATUS;
for(i=0;i<g_ecmg_stream_status_list[0].streamcount;i++)
{/*根据列表信息建立多个流,最大为32*/
/*发送建立流请求*/
rc=ecmgSend(g_socket_ecmg,ECMG2SCS_STREAM_SET_UP,i,0);
if(rc<0)
{
haserr=ECMG_SOCKETERROR;
break;
}
else if(rc==0)
{
haserr=ECMG_TIMEOUTERROR;
break;
}
my_Delay(50);
}
if(haserr==ECMG_SOCKETERROR)
{
Display("ecmg: Send stream setup message socket error!\r\n");
close(g_socket_ecmg);
g_ecmg_connected[0]=0;
break;
}
else if(haserr==ECMG_TIMEOUTERROR)
{
/*延时,将所有流关闭*/
ecmg_close_all(g_socket_ecmg,1);
close(g_socket_ecmg);
g_ecmg_connected[0]=0;
Display("ecmg: Send stream setup message out of time!\r\n");
break;
}
Display("ecmg: Send stream setup message ok!\r\n");
/*----------------------------------------------------------------------------------*/
/* wait for all the stream status message */
/*----------------------------------------------------------------------------------*/
haserr=ECMG_NOERROR;
tm_get(&olddate,&oldtime,&oldtick);
while(1)
{
/*接收流状态应答*/
rc=ecmgRecv(g_socket_ecmg,ECMG2SCS_STREAM_STATUS,0,0);
if(rc<0) /* socket error */
{
haserr=ECMG_SOCKETERROR;
break;
}
else if(rc==1) /* got the waiting message */
break;
tm_get(&date,&time,&tick);
if(dif_second(date,time,olddate,oldtime)*10 > g_ca_config.Para_Config[0].Network_Delay)
{
haserr=ECMG_TIMEOUTERROR;
break;
}
my_Delay(50);
}
if(haserr==ECMG_SOCKETERROR)
{
Display("ecmg: Receive stream status message socket error! \r\n");
close(g_socket_ecmg);
g_ecmg_connected[0]=0;
break;
}
else if(haserr==ECMG_TIMEOUTERROR)
{
ecmg_close_all(g_socket_ecmg,1);
close(g_socket_ecmg);
g_ecmg_connected[0]=0;
Display("ecmg: Receive stream status message out of time! \r\n");
break;
}
Display("ecmg: Receive stream status message ok!\r\n");
/* if(g_IsResetStatue)
g_wanted_cp_number[0]=g_current_cp_number+1;
else
g_wanted_cp_number[0] = g_CurrentSaveCpNum;
*/
g_ecm_data[0].ecmsendflag=0;
g_ecmg_waitcommand[0]=0;
/* ca_CW_int_Handle(); */
tm_get(&lastdate,&lasttime,&lasttic); /* time for reset nib,by donald*/
for(;;)
{
if(ReceiveQueue("QONE",Q_WAIT,KC_TICKS2SEC,Msg)==ERR_TIMEOUT)
{
waitTime+=1;
if((bSendChannelTest==0)&&(waitTime>20))
{
waitTime=0;
rc=ecmgSend(g_socket_ecmg,ECMG2SCS_CHANNEL_TEST,0,0);
if(rc<=0)
{
ca_Clear_simucrypt_map();
close(g_socket_ecmg);
g_ecmg_connected[0]=0;
break;
}
bSendChannelTest=1;
}
if(bSendChannelTest==1)
{
rc=ecmgRecv(g_socket_ecmg,ECMG2SCS_CHANNEL_STATUS,0,0);
if(rc<0) /* socket error */
{
ca_Clear_simucrypt_map();
bSendChannelTest=0;
close(g_socket_ecmg);
g_ecmg_connected[0]=0;
break;
}
else if(rc==1) /* got the waiting message */
{
waitTime=0;
bSendChannelTest=0;
continue;
}
else if(waitTime>6)
{
ca_Clear_simucrypt_map();
bSendChannelTest=0;
close(g_socket_ecmg);
g_ecmg_connected[0]=0;
break;
}
}
else
{
ecmgRecv(g_socket_ecmg,ECMG2SCS_CHANNEL_STATUS,0,0);
}
continue;
}
waitTime=0;
bSendChannelTest=0;
if(g_ecmg_connected[0]==0)
{
break;
}
if(Msg[0] == 2)
{/*请求断开连接*/
ca_Clear_simucrypt_map();
close(g_socket_ecmg);
g_socket_ecmg = 0;
break;
}
haserr=ECMG_NOERROR;
g_ecmg_waitcommand[0]=ECMG2SCS_ECM_RESPONSE;
for(i=0;i<g_ecmg_stream_status_list[0].streamcount;i++)
{
/*发送CW信息*/
rc=ecmgSend(g_socket_ecmg,ECMG2SCS_CW_PROVISION,i,0);
if(rc<0)
{
haserr=ECMG_SOCKETERROR;
break;
}
else if(rc==0)
{
haserr=ECMG_TIMEOUTERROR;
break;
}
my_Delay(50);
}
if(haserr==ECMG_SOCKETERROR)
{
Display("ecmg: Send CW provision message socket error!\r\n");
close(g_socket_ecmg);
ca_Clear_simucrypt_map();
g_ecmg_connected[0]=0;
break;
}
else if(haserr==ECMG_TIMEOUTERROR)
{
ecmg_close_all(g_socket_ecmg,1);
close(g_socket_ecmg);
ca_Clear_simucrypt_map();
g_ecmg_connected[0]=0;
Display("ecmg: Send CW provision message out of time!\r\n");
break;
}
haserr=ECMG_NOERROR;
tm_get(&olddate,&oldtime,&oldtick);
for(i=0;i<g_ecmg_stream_status_list[0].streamcount;i++)
{
/*等待接收ECM应答*/
rc=ecmgRecv(g_socket_ecmg,ECMG2SCS_ECM_RESPONSE,0,0);
if(rc<0) /* socket error */
{
haserr=ECMG_SOCKETERROR;
break;
}
/*如尚未收到应答,则计时,确认是否超时*/
tm_get(&date,&time,&tick);
usTempTime = dif_second(date,time,olddate,oldtime)*10;
if(usTempTime > g_ca_config.Para_Config[0].Network_Delay)
{/*超时后重新建立连接*/
Display("time out:%d,Set:%d",usTempTime,g_ca_config.Para_Config[0].Network_Delay);
haserr=ECMG_TIMEOUTERROR;
close(g_socket_ecmg);
g_socket_ecmg=0;
g_ecmg_connected[0]=0;
ca_Clear_simucrypt_map();
break;
}
my_Delay(50);
}
/*如果为超时,只能跳这里,由此判断可再跳出
一个循环,进行重新连接*/
if(haserr!=ECMG_NOERROR)
{
break;
}
/* caSendLog(LOGTYPE_NORMAL,"ecmg: Got all the ecm, used ticks=%d.",dif_tick(date,time,tick,olddate,oldtime,oldtick));*/
Display("ecmg: Got all the ecm response.\r\n");
/*---------------------------------------------------------------------*/
/* inform ecm send task to send new ecm */
/*---------------------------------------------------------------------*/
g_ecm_data[0].pqflag = !g_ecm_data[0].pqflag;
/* g_wanted_cp_number[0]++;
if(g_wanted_cp_number[0] >= 255)
g_wanted_cp_number[0] = 0;*/
g_ecmg_waitcommand[0]=0;
g_ecm_data[0].ecmsendflag=1;
}
if(haserr==ECMG_SOCKETERROR)
{
Display("ecmg: Receive ecm response message socket error! \r\n");
close(g_socket_ecmg);
g_ecmg_connected[0]=0;
ca_Clear_simucrypt_map();
break;
}
else if(haserr==ECMG_TIMEOUTERROR)
{
ecmg_close_all(g_socket_ecmg,1);
close(g_socket_ecmg);
g_ecmg_connected[0]=0;
ca_Clear_simucrypt_map();
Display("ecmg: Receive ecm response message out of time! \r\n");
break;
}
tm_get(&curdate,&curtime,&curtic);
if(dif_second(curdate,curtime,lastdate,lasttime) >= ( 60*120)) /*check reset time,or resert nib,by donald*/
{
Config_Nib();
lastdate=curdate;
lasttime=curtime;
lasttic=curtic;
}
}
}
}
void tk_ecmgMgr1(void)
{
static int g_socket_ecmg1=0;
struct sockaddr_in ECMGAddr;
unsigned long RcvBufLen;
int i,rc;
int haserr;
unsigned long Msg[4];
unsigned long date,time,tick,olddate,oldtime,oldtick;
unsigned long waitTime=0;
unsigned long bSendChannelTest=0;
g_ecm_data[1].pqflag=1;
if(g_socket_ecmg1)
close(g_socket_ecmg1);
for(;;)
{
my_Delay(1000);
g_ecmg_connected[1]=0;
g_ecmg_waitcommand[1] = 1;
/*创建套接口*/
g_socket_ecmg1 = socket(AF_INET, SOCK_STREAM, TCP);
if(g_socket_ecmg1 == -1)
{
Display("ecmg: Create socket failed! error code=0x%x.\r\n",errno);
close(0);
my_Delay(500);/*by xu*/
continue;
}
Display("ecmg: socket create ok!\r\n");
g_ecmg_use_masterslave[1]=0;
ECMGAddr.sin_family = AF_INET;
ECMGAddr.sin_port = htons(g_ca_config.Para_Config[1].ECMG_Master_Port);
ECMGAddr.sin_addr.s_addr = htonl(g_ca_config.Para_Config[1].ECMG_Master_IP);
for(i=0;i<8;i++)
ECMGAddr.sin_zero[i] = 0;
/*连接主ECMG*/
RcvBufLen = 16*1024;
setsockopt(g_socket_ecmg1,SOL_SOCKET,SO_RCVBUF,(char *)&RcvBufLen,4);
if(connect(g_socket_ecmg1,(struct sockaddr *)&ECMGAddr,sizeof(struct sockaddr_in)))
{/*连接不成功,尝试与从ECMG连接*/
Display("ecmg1: connect master ecmg server failed! error code=0x%x.\r\n",errno);
close(g_socket_ecmg1);
my_Delay(100);/*by xu*/
/*创建套接口*/
g_socket_ecmg1 = socket(AF_INET, SOCK_STREAM, TCP);
if(g_socket_ecmg1 == -1)
{
Display("ecmg1: Create socket failed! error code=0x%x.\r\n",errno);
close(0);
my_Delay(100);/*by xu*/
continue;
}
Display("ecmg1: socket create ok!\r\n");
ECMGAddr.sin_family = AF_INET;
ECMGAddr.sin_port = htons(g_ca_config.Para_Config[1].ECMG_Slave_Port);
ECMGAddr.sin_addr.s_addr = htonl(g_ca_config.Para_Config[1].ECMG_Slave_IP);
for(i=0;i<8;i++)
ECMGAddr.sin_zero[i] = 0;
/*连接从ECMG*/
setsockopt(g_socket_ecmg1,SOL_SOCKET,SO_RCVBUF,(char *)&RcvBufLen,4);
if(connect(g_socket_ecmg1,(struct sockaddr *)&ECMGAddr,sizeof(struct sockaddr_in)))
{/*不成功,重新尝试*/
Display("ecmg1: connect slave ecmg server failed! error code=0x%x.\r\n",errno);
close(g_socket_ecmg1);
my_Delay(100);/*by xu*/
continue;
}
else
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?