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 + -
显示快捷键?