ecm.c

来自「有线电视系统前端设备复用器原代码。 用语接受卫星信号」· C语言 代码 · 共 1,979 行 · 第 1/5 页

C
1,979
字号

	/* 每次接收阻塞不超过200ms */
	rc = ca_recv(socket,EcmgRecvBuf,sizeof(CA_MESSAGE_HEAD),200*1000);
	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  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;

	for(;;)
	{
	       my_Delay(1000);
		g_ecmg_connected[0]=0;
		g_ecmg_waitcommand[0] = 1;
		/*创建套接口*/
		g_socket_ecmg = socket(AF_INET, SOCK_STREAM, TCP);
		if(g_socket_ecmg == -1) 
		{
			Display("ecmg: Create socket failed! error code=0x%x.\r\n",errno);
			close(0);
			my_Delay(100);/*by xu*/
			continue;
		}
		Display("ecmg: socket create ok!\r\n");

		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连接*/
			Display("ecmg: connect master ecmg server failed! error code=0x%x.\r\n",errno);
			close(g_socket_ecmg);
			my_Delay(100);/*by xu*/

			/*创建套接口*/
			g_socket_ecmg = socket(AF_INET, SOCK_STREAM, TCP);
			if(g_socket_ecmg == -1) 
			{
				Display("ecmg: Create socket failed! error code=0x%x.\r\n",errno);
				close(0);
				my_Delay(100);/*by xu*/			 
				continue;                     
			}
			Display("ecmg: socket create ok!\r\n");

			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)))
			{/*不成功,重新尝试*/
				Display("ecmg: connect slave ecmg server failed! error code=0x%x.\r\n",errno);
				close(g_socket_ecmg);
				my_Delay(100);/*by xu*/	
				continue;         /*return for(;;)*/
			}
			else
			{
				g_ecmg_use_masterslave[0]=2;
				Display("ecmg: Connect slave ecmg server OK!\r\n");
			}
		}	
		else
		{
			g_ecmg_use_masterslave[0]=1;
			Display("ecmg: Connect master ecmg server OK!");
		}

		g_ecmg_connected[0]=1;
		/*----------------------------------------------------------------------------------*/
		/*connect OK                                                                        */
		/*----------------------------------------------------------------------------------*/
		for(;;)
		{
			tm_set(0,0,0);
			
			g_ecmg_waitcommand[0]=ECMG2SCS_CHANNEL_STATUS;

			/*发送通道建立请求*/
			rc=ecmgSend(g_socket_ecmg,ECMG2SCS_CHANNEL_SET_UP,0,0);
			if(rc<0)
			{
				Display("ecmg: Send channel setup message socket error!\r\n");
				close(g_socket_ecmg);
				g_ecmg_connected[0]=0;
				break;
			}
			else if(rc==0)
			{
				close(g_socket_ecmg);
				g_ecmg_connected[0]=0;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?