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

📄 caproc.c

📁 有线电视系统前端设备复用器原代码。 用语接受卫星信号
💻 C
📖 第 1 页 / 共 4 页
字号:
			*(unsigned char *)pTmp=g_ca_config.AC_Data_List[i].SubDataConfig[0].ECM_Private_Data_Length;
			pTmp++;
			MemCopy(pTmp,g_ca_config.AC_Data_List[i].SubDataConfig[0].ECM_Private_Data,g_ca_config.AC_Data_List[i].SubDataConfig[0].ECM_Private_Data_Length);
			pTmp+=g_ca_config.AC_Data_List[i].SubDataConfig[0].ECM_Private_Data_Length;

/*			if(g_has_valid_ca1_config)*/
			{
				*(unsigned short *)pTmp=g_ca_config.AC_Data_List[i].SubDataConfig[1].ECM_PID;
				pTmp+=2;

				*(unsigned char *)pTmp=g_ca_config.AC_Data_List[i].SubDataConfig[1].AC_Data_Length;
				pTmp++;
				MemCopy(pTmp,g_ca_config.AC_Data_List[i].SubDataConfig[1].AC_Data,g_ca_config.AC_Data_List[i].SubDataConfig[1].AC_Data_Length);
				pTmp+=g_ca_config.AC_Data_List[i].SubDataConfig[1].AC_Data_Length;

				/* added 2004-02-04 */
				*(unsigned char *)pTmp=g_ca_config.AC_Data_List[i].SubDataConfig[1].ECM_Private_Data_Length;
				pTmp++;
				MemCopy(pTmp,g_ca_config.AC_Data_List[i].SubDataConfig[1].ECM_Private_Data,g_ca_config.AC_Data_List[i].SubDataConfig[1].ECM_Private_Data_Length);
				pTmp+=g_ca_config.AC_Data_List[i].SubDataConfig[1].ECM_Private_Data_Length;
			}
/*			if(g_has_valid_ca2_config)*/
			{
				*(unsigned short *)pTmp=g_ca_config.AC_Data_List[i].SubDataConfig[2].ECM_PID;
				pTmp+=2;

				*(unsigned char *)pTmp=g_ca_config.AC_Data_List[i].SubDataConfig[2].AC_Data_Length;
				pTmp++;
				MemCopy(pTmp,g_ca_config.AC_Data_List[i].SubDataConfig[2].AC_Data,g_ca_config.AC_Data_List[i].SubDataConfig[2].AC_Data_Length);
				pTmp+=g_ca_config.AC_Data_List[i].SubDataConfig[2].AC_Data_Length;

				/* added 2004-02-04 */
				*(unsigned char *)pTmp=g_ca_config.AC_Data_List[i].SubDataConfig[2].ECM_Private_Data_Length;
				pTmp++;
				MemCopy(pTmp,g_ca_config.AC_Data_List[i].SubDataConfig[2].ECM_Private_Data,g_ca_config.AC_Data_List[i].SubDataConfig[2].ECM_Private_Data_Length);
				pTmp+=g_ca_config.AC_Data_List[i].SubDataConfig[2].ECM_Private_Data_Length;
			}			
		}

		*(unsigned short *)pTmp=g_ca_config.Stream_Count;
		pTmp+=2;

		for(i=0;i<g_ca_config.Stream_Count;i++)
		{
			*(unsigned short *)pTmp=g_ca_config.Stream_Config[i].Stream_PID;
			pTmp+=2;

			*(unsigned char *)pTmp=g_ca_config.Stream_Config[i].CW_Index;
			pTmp++;

		}
	}

	NMPkt->PacketLength    +=(pTmp - (unsigned char *)&NMPkt->Data);
	Msg.Flag   =0;
	Msg.MsgType=MSG_REPLY;
	Msg.Length =NMPkt->PacketLength;
	Msg.Pdata=(unsigned char *)NMPkt;

	SendQueue(QN_TCPIPSEND,&Msg);

	return 0;
}

/*初始化流列表*/
void BuildStreamList(void)
{
	int i,j;
	int index;
	int exist;
	int k;
	
	g_ecmg_stream_status_list[0].streamcount=0;
	g_ecmg_stream_status_list[1].streamcount=0;
	g_ecmg_stream_status_list[2].streamcount=0;

	if(g_has_valid_ca_config)
	{
		for(i=0;i<g_ca_config.Stream_Count;i++)
		{
			exist=0;
			for(j=0;j<g_ecmg_stream_status_list[0].streamcount;j++)
			{
				if(g_ecmg_stream_status_list[0].streamlist[j].ECM_stream_ID==g_ca_config.Stream_Config[i].CW_Index)
				{
					exist=1;
					break;
				}
			}
		
			if(!exist)
			{
				index=g_ecmg_stream_status_list[0].streamcount;
				g_ecmg_stream_status_list[0].streamlist[index].continue_counter=0;
				g_ecmg_stream_status_list[0].streamlist[index].ECM_channel_ID  =g_ca_config.Para_Config[0].ECM_channel_id;
				g_ecmg_stream_status_list[0].streamlist[index].ECM_stream_ID   =g_ca_config.Stream_Config[i].CW_Index;
				g_ecmg_stream_status_list[0].streamlist[index].pid  =g_ca_config.AC_Data_List[g_ca_config.Stream_Config[i].CW_Index].SubDataConfig[0].ECM_PID;
				g_ecmg_stream_status_list[0].streamcount++;
			}
		
		}
	}

	if(g_has_valid_ca1_config)
	{
		for(i=0;i<g_ca_config.Stream_Count;i++)
		{
			exist=0;
			for(j=0;j<g_ecmg_stream_status_list[1].streamcount;j++)
			{
				if(g_ecmg_stream_status_list[1].streamlist[j].ECM_stream_ID==g_ca_config.Stream_Config[i].CW_Index)
				{
					exist=1;
					break;
				}
			}
	
			if(!exist)
			{
				index=g_ecmg_stream_status_list[1].streamcount;
				g_ecmg_stream_status_list[1].streamlist[index].continue_counter=0;
				g_ecmg_stream_status_list[1].streamlist[index].ECM_channel_ID  =g_ca_config.Para_Config[1].ECM_channel_id;
				g_ecmg_stream_status_list[1].streamlist[index].ECM_stream_ID   =g_ca_config.Stream_Config[i].CW_Index;
				g_ecmg_stream_status_list[1].streamlist[index].pid  =g_ca_config.AC_Data_List[g_ca_config.Stream_Config[i].CW_Index].SubDataConfig[1].ECM_PID;
				g_ecmg_stream_status_list[1].streamcount++;
			}
		}
	}

	if(g_has_valid_ca2_config)
	{
		for(i=0;i<g_ca_config.Stream_Count;i++)
		{
			exist=0;
			for(j=0;j<g_ecmg_stream_status_list[2].streamcount;j++)
			{
				if(g_ecmg_stream_status_list[2].streamlist[j].ECM_stream_ID==g_ca_config.Stream_Config[i].CW_Index)
				{
					exist=1;
					break;
				}
			}
		
			if(!exist)
			{
				index=g_ecmg_stream_status_list[2].streamcount;
				g_ecmg_stream_status_list[2].streamlist[index].continue_counter=0;
				g_ecmg_stream_status_list[2].streamlist[index].ECM_channel_ID  =g_ca_config.Para_Config[2].ECM_channel_id;
				g_ecmg_stream_status_list[2].streamlist[index].ECM_stream_ID   =g_ca_config.Stream_Config[i].CW_Index;
				g_ecmg_stream_status_list[2].streamlist[index].pid  =g_ca_config.AC_Data_List[g_ca_config.Stream_Config[i].CW_Index].SubDataConfig[2].ECM_PID;
				g_ecmg_stream_status_list[2].streamcount++;
			}		
		}
	}		
}

/*下发加扰设置*/
int ProcCAConfig(Packet *ThePacket)
{
	int           i,j;
	unsigned char *pTmp;
	unsigned long Msg[4];
	unsigned char *pt1,*pt2;

	unsigned char ucCACount =0;
	int   PackLen=0;
	unsigned char Tmp;

	/*----------------------------------------------------------------------*/
	/* backup the old ca config                                             */
	/*----------------------------------------------------------------------*/

#if 1
	CA_CONFIG *pold_g_ca_config;

	pold_g_ca_config=(CA_CONFIG *)MemAlloc(RNG2ID,"ProcCAConfig",sizeof(CA_CONFIG));
	if(pold_g_ca_config==NULL)
		return -1;

	/*备份旧的加扰设置*/
	MemCopy((char *)pold_g_ca_config,(char *)&g_ca_config,sizeof(CA_CONFIG));
#endif

	/*获得新的加扰设置数据*/
	pTmp=(unsigned char *)&ThePacket->Data;

	ucCACount = *pTmp;
	pTmp++;

	g_has_valid_ca_config = 0;
	g_has_valid_ca1_config = 0;
	g_has_valid_ca2_config = 0;
/*	if(!(ucCACount & 0x07))
		return -1;
*/

	bJudgeConfig = 1;

	if(ucCACount & 0x01)
	{
		g_has_valid_ca_config = 1;
	}
	if(ucCACount & 0x02)
	{
		g_has_valid_ca1_config = 1;
	} 
	if(ucCACount & 0x04)
	{
		g_has_valid_ca2_config = 1;
	}

	/*if(g_has_valid_ca_config) */
	{
		MemCopy((unsigned char *)&g_ca_config.Para_Config[0],pTmp,sizeof(CA_PARA_CONFIG));
		pTmp+=sizeof(CA_PARA_CONFIG);
	}
	
	/*if(g_has_valid_ca1_config) */
	{
		MemCopy((unsigned char *)&g_ca_config.Para_Config[1],pTmp,sizeof(CA_PARA_CONFIG));
		pTmp+=sizeof(CA_PARA_CONFIG);
	}
	/*if(g_has_valid_ca2_config) */
	{
		MemCopy((unsigned char *)&g_ca_config.Para_Config[2],pTmp,sizeof(CA_PARA_CONFIG));
		pTmp+=sizeof(CA_PARA_CONFIG);
	}
	
	g_ca_config.AC_Data_Count=*(unsigned char *)pTmp;
	pTmp++;

	for(i=0;i<g_ca_config.AC_Data_Count;i++)
	{
		g_ca_config.AC_Data_List[i].AC_Index=*(unsigned char *)pTmp;
		pTmp++;

		g_ca_config.AC_Data_List[i].AC_Data_Name_Length=*(unsigned char *)pTmp;
		pTmp++;
		MemCopy(g_ca_config.AC_Data_List[i].AC_Data_Name,pTmp,g_ca_config.AC_Data_List[i].AC_Data_Name_Length);
		pTmp+=g_ca_config.AC_Data_List[i].AC_Data_Name_Length;

/*		if(g_has_valid_ca_config)  */
		{
			g_ca_config.AC_Data_List[i].SubDataConfig[0].ECM_PID=*(unsigned short *)pTmp;
			pTmp+=2;

			g_ca_config.AC_Data_List[i].SubDataConfig[0].AC_Data_Length=*(unsigned char *)pTmp;
			pTmp++;
			MemCopy(g_ca_config.AC_Data_List[i].SubDataConfig[0].AC_Data,pTmp,g_ca_config.AC_Data_List[i].SubDataConfig[0].AC_Data_Length);
			pTmp+=g_ca_config.AC_Data_List[i].SubDataConfig[0].AC_Data_Length;

			/*added 2004-02-10 */
			g_ca_config.AC_Data_List[i].SubDataConfig[0].ECM_Private_Data_Length=*(unsigned char *)pTmp;
			pTmp++;
			MemCopy(g_ca_config.AC_Data_List[i].SubDataConfig[0].ECM_Private_Data,pTmp,g_ca_config.AC_Data_List[i].SubDataConfig[0].ECM_Private_Data_Length);
			pTmp+=g_ca_config.AC_Data_List[i].SubDataConfig[0].ECM_Private_Data_Length;
		}

/*		if(g_has_valid_ca1_config) */
		{
			g_ca_config.AC_Data_List[i].SubDataConfig[1].ECM_PID=*(unsigned short *)pTmp;
			pTmp+=2;

			g_ca_config.AC_Data_List[i].SubDataConfig[1].AC_Data_Length=*(unsigned char *)pTmp;
			pTmp++;
			MemCopy(g_ca_config.AC_Data_List[i].SubDataConfig[1].AC_Data,pTmp,g_ca_config.AC_Data_List[i].SubDataConfig[1].AC_Data_Length);
			pTmp+=g_ca_config.AC_Data_List[i].SubDataConfig[1].AC_Data_Length;

			/*added 2004-02-10 */
			g_ca_config.AC_Data_List[i].SubDataConfig[1].ECM_Private_Data_Length=*(unsigned char *)pTmp;
			pTmp++;
			MemCopy(g_ca_config.AC_Data_List[i].SubDataConfig[1].ECM_Private_Data,pTmp,g_ca_config.AC_Data_List[i].SubDataConfig[1].ECM_Private_Data_Length);
			pTmp+=g_ca_config.AC_Data_List[i].SubDataConfig[1].ECM_Private_Data_Length;	
		}

/*		if(g_has_valid_ca2_config) */
		{
			g_ca_config.AC_Data_List[i].SubDataConfig[2].ECM_PID=*(unsigned short *)pTmp;
			pTmp+=2;

			g_ca_config.AC_Data_List[i].SubDataConfig[2].AC_Data_Length=*(unsigned char *)pTmp;
			pTmp++;
			MemCopy(g_ca_config.AC_Data_List[i].SubDataConfig[2].AC_Data,pTmp,g_ca_config.AC_Data_List[i].SubDataConfig[2].AC_Data_Length);
			pTmp+=g_ca_config.AC_Data_List[i].SubDataConfig[2].AC_Data_Length;

			/*added 2004-02-10 */
			g_ca_config.AC_Data_List[i].SubDataConfig[2].ECM_Private_Data_Length=*(unsigned char *)pTmp;
			pTmp++;
			MemCopy(g_ca_config.AC_Data_List[i].SubDataConfig[2].ECM_Private_Data,pTmp,g_ca_config.AC_Data_List[i].SubDataConfig[2].ECM_Private_Data_Length);
			pTmp+=g_ca_config.AC_Data_List[i].SubDataConfig[2].ECM_Private_Data_Length;	
		}
	}

	g_ca_config.Stream_Count=*(unsigned short *)pTmp;
	pTmp+=2;
	for(i=0;i<g_ca_config.Stream_Count;i++)
	{
		g_ca_config.Stream_Config[i].Stream_PID=*(unsigned short *)pTmp;
		pTmp+=2;

		g_ca_config.Stream_Config[i].CW_Index=*(unsigned char *)pTmp;
		pTmp++;

		/*-----------------------------------------------------------------------*/
		/* added by johnnyling 2004-02-17                                        */
		/*-----------------------------------------------------------------------*/
		/*
		for(j=0;j<g_ca_config.AC_Data_Count;j++)
		{
			if(g_ca_config.Stream_Config[i].CW_Index==g_ca_config.AC_Data_List[j].AC_Index)
			{
				g_ca_config.Stream_Config[i].CW_Index=j;
				break;
			}
		}
		*/
	}

	/*------------------------------------------------------------------*/
	/* save ca config data to flash                                     */
	/*------------------------------------------------------------------*/
	/*保存设置信息*/
	SaveCAConfig();
	/*------------------------------------------------------------------*/
	/* inform tk_caStart to apply new ca configuration                  */
	/* Msg[0]=1,restart ecmg task                                       */
	/* Msg[1]=1,restart emmg task                                       */
	/*------------------------------------------------------------------*/
	Msg[1]=0;

#if 0 /*by xu*/	
	if((pold_g_ca_config->Para_Config[0].EMMG_Port!=g_ca_config.Para_Config[0].EMMG_Port)
		|| (pold_g_ca_config->Para_Config[1].EMMG_Port!=g_ca_config.Para_Config[1].EMMG_Port)
		|| (pold_g_ca_config->Para_Config[2].EMMG_Port!=g_ca_config.Para_Config[2].EMMG_Port))
	{
		/*端口改变,要求重启EMMG任务*/
		Msg[1]=1;
	}
#endif

   if(pold_g_ca_config->Para_Config[0].EMMG_Port!=g_ca_config.Para_Config[0].EMMG_Port)
	{
		/*端口改变,要求重启EMMG任务*/
		Msg[1]|=1;
	}
    if(pold_g_ca_config->Para_Config[1].EMMG_Port!=g_ca_config.Para_Config[1].EMMG_Port)
	{
		/*端口改变,要求重启EMMG1任务*/
		Msg[1]|=2;
	}
   if(pold_g_ca_config->Para_Config[2].EMMG_Port!=g_ca_config.Para_Config[2].EMMG_Port)
	{
		/*端口改变,要求重启EMMG2任务*/
		Msg[1]|=4;
	}

	Msg[0]=0;
	pold_g_ca_config->Para_Config[0].EMM_Pid      =g_ca_config.Para_Config[0].EMM_Pid;
	pold_g_ca_config->Para_Config[0].EMMG_Protocal=g_ca_config.Para_Config[0].EMMG_Protocal;
	pold_g_ca_config->Para_Config[0].EMMG_Port    =g_ca_config.Para_Config[0].EMMG_Port;
	pold_g_ca_config->Para_Config[1].EMM_Pid = g_ca_config.Para_Config[1].EMM_Pid;
	pold_g_ca_config->Para_Config[1].EMMG_Protocal = g_ca_config.Para_Config[1].EMMG_Protocal;
	pold_g_ca_config->Para_Config[1].EMMG_Port = g_ca_config.Para_Config[1].EMMG_Port;
	pold_g_ca_config->Para_Config[2].EMM_Pid = g_ca_config.Para_Config[2].EMM_Pid;
	pold_g_ca_config->Para_Config[2].EMMG_Protocal = g_ca_config.Para_Config[2].EMMG_Protocal;
	pold_g_ca_config->Para_Config[2].EMMG_Port = g_ca_config.Para_Config[2].EMMG_Port;
		
	pt1=(unsigned char *)pold_g_ca_config;
	pt2=(unsigned char *)&g_ca_config;
	for(i=0;i<sizeof(CA_CONFIG) - 4;i++)
	{
		if(*(pt1+i)!=*(pt2+i))
		{
			ca_stop_service();
			/*置1为要求重启ECMG任务*/
			Msg[0]=1;
			break;
		}
	}
	SendQueue("CAST",Msg);

/*	MemFree(pold_g_ca_config);*/

	return 0;
}

/*CA主控任务*/
void tk_caStart(void)
{
	int i;
	int rc;
	unsigned long Msg[4];
	unsigned long ECMMsg[4];

	static unsigned long int waitTime;
	static unsigned long int bSetCA=0;
	static unsigned long int bClearCA=0;

	my_Delay(5000);
	
	g_tid_ecmg=0;

	g_tid_emmg=0;
	g_tid_ecmg1 =0;
	g_tid_ecmg2 = 0;


	q_create("QONE",1024,Q_LOCAL|Q_FIFO|Q_NOLIMIT,&g_qid_ecmg);
	q_create("QSEC",1024,Q_LOCAL|Q_FIFO|Q_NOLIMIT,&g_qid_ecmg1);
	q_create("QTHI",1024,Q_LOCAL|Q_FIFO|Q_NOLIMIT,&g_qid_ecmg2);

	q_create("CWINT",1024,Q_LOCAL | Q_FIFO | Q_NOLIMIT | Q_PRIBUF,&g_CW_Qint);


	/*读取CA配置信息*/
	rc=LoadCaConfig();

	mu_create("CODER_EMM_SND",MU_FIFO,0,&ulMultEMM);
/*	g_IsResetStatue = 1;*/
	
	if(rc==0)
	{
		/*------------------------------------------------------------------*/
		/* build stream list for ecmg task                                  */
		/*------------------------------------------------------------------*/
		/*初始化流列表*/
		BuildStreamList();
		
		/*------------------------------------------------------------------*/
		/* update CAT section with emm pid                                  */
		/*------------------------------------------------------------------*/
		/*在CAT表中加入EMM信息*/
		UpdateCATSectionWithEMM();

		/*------------------------------------------------------------------*/
		/* update PMT with ecm pid                                          */
		/*------------------------------------------------------------------*/
		/*在PMT表中加入ECM信息*/
		update_si_with_ca();	

		
		if(g_ecmg_stream_status_list[0].streamcount)
		{
			rc = t_create("FIRECM", ECMG_PRI, 4096, 4096,T_LOCAL, &g_tid_ecmg);   
			if(rc) 
			{
				Display(" Task %s create error ! ","ECMG");
				t_suspend(0L);
			}

			/*启动任务用于连接ECMG*/
			rc = t_start(g_tid_ecmg, T_ISR|T_NOPREEMPT|T_SUPV, tk_ecmgMgr, 0);
			if(rc)
			{
				Display(" Task %s start error !", "ECMG");
				t_suspend(0L);
			}
		}

		 /*创建ECMG任务,20050726fupoxing*/
		if(g_ecmg_stream_status_list[1].streamcount)
		{
			rc = t_create("SECECM", ECMG_PRI, 4096, 4096,T_LOCAL, &g_tid_ecmg1);   
			if(rc) 
			{
				Display(" Task %s create error ! ","ECMG1");
				t_suspend(0L);
			}

			/*启动任务用于连接ECMG*/
			rc = t_start(g_tid_ecmg1, T_ISR|T_NOPREEMPT|T_SUPV, tk_ecmgMgr1, 0);
			if(rc)
			{
				Display(" Task %s start error !", "ECMG1");

⌨️ 快捷键说明

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