⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecm.c.bak

📁 有线电视系统前端设备复用器原代码。 用语接受卫星信号
💻 BAK
📖 第 1 页 / 共 5 页
字号:
		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 + -