📄 caproc.c
字号:
*(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 + -