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

📄 cmdproc.c

📁 有线电视系统前端设备复用器原代码。 用语接受卫星信号
💻 C
📖 第 1 页 / 共 3 页
字号:
	Msg.Length =0;
	Msg.MsgType=0;
	Msg.Pdata  =NULL;
	
	if(SYSTEM_NOT_READY!=SystemState)
	{
		if(UserChannelChanged)
			CfgUserChannel((Cmd_Set_User_Channel *)&Cmd->CmdSetUserChannel);  

		/*
		if(NeedNewPAT)
		{
			Msg.Flag=1;
			SendQueue(QN_HARDWARE,Msg);
		}
		*/
	}

	return 0;
}


unsigned long UpdateProgram(Packet *ThePacket)
{

	int                    i;
	volatile unsigned long PrgLen;
	volatile unsigned char *PrgBase;
	unsigned long DataHead[12]={0x48495355,0x4E204456,0x53494F4E,0x204D554C,0x5449504C,0x45584552,0x204E4F56,0x41333030,0x30204A4F,0x484E4E59,0x204C494E,0x47202020};
	unsigned long BinOK=1;

	PrgLen=ThePacket->PacketLength - ThePacket->PacketHeadLength;

	PrgBase =(unsigned char *)&ThePacket->Data;

	for(i=0;i<12;i++)
	{
		if(*(unsigned long *)((unsigned long *)PrgBase + i)!=DataHead[i])
		{
			BinOK=0;
			break;
		}
	}
	
	if(BinOK)
	{
		RunLed(1);
		UserDataLed(1);

		SST39VF040_Program(PrgBase,PrgLen);

		RunLed(0);
		UserDataLed(0);

		return 0;
	}
	else
		return 1;
}

void LoadOriginalPMT(void)
{
	LoadPSI();
}

/*上报数据库到网管*/
void UploadDatabase(Packet *CmdPacket)
{
	MESSAGE                 Msg;
	Packet                  *ThePacket;

	int                     volatile i;

	/*========================================================*/
	/*分配空间                                                */
	/*========================================================*/
	ThePacket=(Packet *)MemAlloc(RNG1ID,"UploadDatabase",sizeof(Packet) - 4 + FLASH_DATABASE_SIZE);
	if(ThePacket == NULL)
		return;
	/*========================================================*/
	/*填充命令头                                              */
	/*========================================================*/
	ThePacket->Command=CmdPacket->Command;
	ThePacket->DeviceIdt=CmdPacket->DeviceIdt;
	ThePacket->DeviceType=CmdPacket->DeviceType;

	ThePacket->PacketIdt=CmdPacket->PacketIdt;

	ThePacket->PacketHeadLength=sizeof(Packet) - 4;
	ThePacket->PacketLength=sizeof(Packet) - 4 + FLASH_DATABASE_SIZE;
	ThePacket->PacketType=CmdPacket->PacketType;
	ThePacket->PacketVersion=CmdPacket->PacketVersion;

	ThePacket->Result =0;

	/*========================================================*/
	/*读取数据库                                              */
	/*========================================================*/
	for(i=0;i<FLASH_DATABASE_SIZE;i++)
	{
		*(unsigned char *)((unsigned char *)ThePacket + sizeof(Packet) - 4 + i)=*(unsigned char *)(FLASH_BASE_ADDR + i);
		if((i%0x4000)==0)
			Feed();
	}
	/*========================================================*/
	/*上报给网管                                              */
	/*========================================================*/
	Msg.Flag   =0;
	Msg.MsgType=MSG_REPLY;
	Msg.Length =ThePacket->PacketLength;
	Msg.Pdata  =(unsigned char *)ThePacket;

	SendQueue(QN_TCPIPSEND,&Msg);
}

unsigned long RefreshDatabase(Packet *CmdPacket)
{

	int                    i;
	volatile unsigned long PrgLen;
	volatile unsigned char *PrgBase;	
	
	PrgLen=CmdPacket->PacketLength - CmdPacket->PacketHeadLength;
	PrgBase =(unsigned char *)&CmdPacket->Data;

	if(PrgLen==FLASH_DATABASE_SIZE)
	{	
		SST39VF512_Program(PrgBase,PrgLen);
		return 0;
	}
	else
		return 1;
}

/*设置面板密码*/
void SetPanelPassword(Packet *ThePacket)
{
	Cmd_Set_Panel_Password *Cmd;
	int                    From=ThePacket->PacketType;
	int                    i;

	Cmd=(Cmd_Set_Panel_Password *)&(ThePacket->Data);

	/*记录新的密码*/
	for(i=0;i<6;i++)
		SystemData.PanelPassword[i]=1;/*Cmd->Password[i];*/

	SaveSystemData();

	/*同步当前设置:网管和控制面板*/
	SynCurrentConfig(ThePacket,From);
}

/*判断网管发送的命令类型,进行相应处理流程*/
void Cmd_Proc(Packet *ThePacket)
{
	unsigned long  cmd;
	unsigned long  rc;
	unsigned char  PrgItems;
	unsigned long  Items;
	int            i;
	SET_EIT_ITEM   *Set_EIT_Item;

	OldIP=SystemData.EthernetPara.IP;

	/*获得命令类型*/
	cmd=ThePacket->Command;

	switch(cmd)
	{
		case COMMAND_CONFIG_MULTIPLEXER:
			Display("Command config multiplexer received.\n");
			/*网络接口及用户通道设置*/
			Config_Multiplexer((Cmd_Config_Multiplexer *)&ThePacket->Data);

			/*应答成功*/
			SendReply(ThePacket,SUCCESS);

			break;
		case COMMAND_SET_IP:
			Display("Command Set IP address received.\n");

			/*IP地址设置*/
			rc=SetIP(ThePacket->PacketType,(Cmd_Set_IP *)&ThePacket->Data);
			if(rc)
				SendReply(ThePacket,FAILED);
			else
				SendReply(ThePacket,SUCCESS);
			/*---------------------------------------------------------------------------*/
			/* 需要重新启动程序,让修改后的IP地址生效                                     */
			/*---------------------------------------------------------------------------*/
			my_Delay(500);

			/*挂起喂狗任务,使系统复位*/
			SystemReset(); 

			break;
	case COMMAND_SET_PANEL_PASSWORD:
			Display("Command Set panel password received.\n");
			/*设置新的密码*/
			SetPanelPassword(ThePacket);

			SendReply(ThePacket,SUCCESS);
			break;
	case COMMAND_SET_ALARM_TEMP:
			Display("Command Set temp Alarm threshotl received.\n");

			rc=SetTempAlarm((Cmd_Set_Temp_Alarm *)&ThePacket->Data);

			if(rc)
				SendReply(ThePacket,FAILED);
			else
				SendReply(ThePacket,SUCCESS);

			break;

	case COMMAND_SET_SELECT_MUL:
		Display(" command set select multiplex received.\n");

		/*复用设置*/
		if(Config_Select_Mul(ThePacket))
			SendReply(ThePacket,FAILED);
		else
			SendReply(ThePacket,SUCCESS);

		my_Delay(100);/*by xu*/

		break;
	case COMMAND_SET_NIT:
			Display(" command set NIT received.\n");
			Items=(ThePacket->PacketLength-ThePacket->PacketHeadLength - 8) / 188;

			/*设置NIT表*/
			rc=Proc_NIT((unsigned char *)&(ThePacket->Data),Items);

			break;
	case COMMAND_SET_EIT:
			Display(" command set EIT received.\n");

			PrgItems=*(unsigned char *)&(ThePacket->Data);

			Set_EIT_Item=(SET_EIT_ITEM *)((unsigned char *)&(ThePacket->Data) + 1);

			EIT_Item_List.ItemCount=0;

			for(i=0;i<PrgItems;i++)
			{
				EIT_Item_List.Item[i].PortNo                 =8 - Set_EIT_Item->PortNo;
				EIT_Item_List.Item[i].OldPrgNo               =Set_EIT_Item->OldPrgNo;
				EIT_Item_List.Item[i].Schedule_Flag          =Set_EIT_Item->Schedule_Flag;
				EIT_Item_List.Item[i].Present_Following_Flag =Set_EIT_Item->Present_Following_Flag;

				EIT_Item_List.ItemCount++;
				Set_EIT_Item++;
			}

			Items=(ThePacket->PacketLength-ThePacket->PacketHeadLength - PrgItems*5 -1 ) / 188;

			rc=Proc_EIT((unsigned char *)&(ThePacket->Data) + PrgItems*5 + 1,Items);

			break;
	case COMMAND_SET_TDT:
			Display(" command set TDT received.\n");
			Items=(ThePacket->PacketLength-ThePacket->PacketHeadLength) / 188;

			rc=Proc_TDT((unsigned char *)&(ThePacket->Data),Items);

			break;
	case COMMAND_MDF_SDT:
			Display(" command modify program description received.\n");

			/*修改SDT表*/
			Mdf_SDT(ThePacket);

			SendReply(ThePacket,SUCCESS);

			break;
/*=================================================*/
/* add for EPG function 2002-09-16                 */
/*=================================================*/
	case COMMAND_SET_EXT_SI:
		{
			Display(" command set external SI received.\n");

			SetExtSI((unsigned char *)&(ThePacket->Data));

			SendReply(ThePacket,SUCCESS);

			break;

		}
	case COMMAND_SET_INT_SI:
			Display(" command set internal SI received.\n");

			SetIntSI((unsigned char *)&(ThePacket->Data));

			SendReply(ThePacket,SUCCESS);

			break;
/*=================================================*/
/* add for EPG function 2002-09-16                 */
/*=================================================*/
	case COMMAND_QUERY_TEMP:
			Display("Command Querry current temperature received.\n");

			ReportCurrentTemp(ThePacket);
			break;
	case COMMAND_QUERY_CURRENT_CONFIG:
			Display("Command Query current configuration received.\n");
			/*查询当前配置*/
			ReportCurrentConfig(ThePacket);

			break;
	case COMMAND_SEARCH_PROGRAM:
			Display("Search Program command received.\n");

			/*指示搜索节目*/
			Search_Program(ThePacket);

			break;
	case COMMAND_UPDATE_PROGRAM:
			Display("Command update program received.\n");

			rc=UpdateProgram(ThePacket);

			if(rc)
				SendReply(ThePacket,FAILED);
			else
				SendReply(ThePacket,SUCCESS);

			my_Delay(500);

			SystemReset();

			break;
	case COMMAND_REPORT_CONFIG_REPLY:
			PanelOK=TRUE;
			break;
	case COMMAND_UPLOAD_DATABASE:
			Display("Upload database command received!\n");
			/*上传数据库*/
			UploadDatabase(ThePacket);
			break;
	case COMMAND_DOWNLOAD_DATABASE:
			Display("Update database command received!\n");

			/*下载数据库到FLASH*/
			rc=RefreshDatabase(ThePacket);

			if(rc)
				SendReply(ThePacket,FAILED);
			else
				SendReply(ThePacket,SUCCESS);

			my_Delay(500);/*by xu*/

			SystemResetWithoutSave();

			break;
	case COMMAND_RESET_CONFIGURATION: /* 恢复出厂设置 */
			Display("Reset configuration command received!\n");
			SendReply(ThePacket,SUCCESS);
			/*擦除保存在flash中的标志*/
			SST39VF512_Chip_Erase();

			/*获取初始配置信息*/
			InitDefCfg();
			MemCopy((char *)&SystemData,(char *)&DefSystemData,sizeof(System_Data));
			SaveSystemData();

			my_Delay(500);/*by xu*/
			/*挂起喂狗任务等待复位*/
			SystemResetWithoutSave();

			break;
		/*-----------------------------------------------*/
		/* added for ca support 2003-03-06               */
		/*-----------------------------------------------*/
	case COMMAND_SET_CA_CONFIG:
			Display("set ca config command received!\n");
			SendReply(ThePacket,SUCCESS);
			/*网管下发加扰设置指令*/
			ProcCAConfig(ThePacket);
			break;
	case COMMAND_QUERY_CA_CONFIG:
			Display("query ca config command received!\n");
			/*请求上报加扰配置*/
			ReportCAConfig(ThePacket);
			break;
		/*-------------------------------------------*/
		/* added for set pid filter 2003-08-08           */
		/*-------------------------------------------*/
	case COMMAND_QUERY_PID_FILTER_CONFIG:
			Display("query pid filter setting command received!\n");
			OnRcvQueryPIDFilterCmd(ThePacket);
			break;
	case COMMAND_SET_PID_FILTER_CONFIG:
			rc=OnRcvSetPIDFilterCmd(ThePacket);
			if(rc)
				SendReply(ThePacket,FAILED);
			else
				SendReply(ThePacket,SUCCESS);

			break;
	default:
			Display("Function Cmd_Proc(): unrecognized command from console received, command=%d\n",cmd);
			break;
	}

	MemFree(ThePacket);
}

/*上报复位状态消息*/
void ReportResetState(void)
{
	MESSAGE                 Msg;
	Packet                  *ThePacket;
	Cmd_Report_Reset_Status Cmd;

	Reset_State     *presetstate;

	/*-----------------------------------------------------------------*/
	/* 获取系统各部件的复位状态                                        */
	/*-----------------------------------------------------------------*/
	presetstate=(Reset_State *)MemAlloc(RNG0ID,"ReportResetState",sizeof(Reset_State));	

	if(presetstate!=NULL)
	{
		/*获取复位状态*/
		GetResetState(presetstate);

		Cmd.MPC860_State=presetstate->MPC860_State;
		Cmd.FPGA_State  =presetstate->FPGA_State;
		Cmd.C54_State   =presetstate->C54_State;
		Cmd.Panel_State =presetstate->Panel_State;

		/*释放分配的空间*/
		MemFree(presetstate);

		ThePacket=(Packet *)MemAlloc(RNG1ID,"ReportResetState ",sizeof(Packet) - 4 + sizeof(Cmd_Report_Reset_Status));

		if(ThePacket!=NULL)
		{
			ThePacket->PacketType      =0;
			ThePacket->Command         =COMMAND_REPORT_RESET_STATUS;
			ThePacket->DeviceType      =DEVICE_TYPE_MULTIPLEXER;
			ThePacket->DeviceIdt       =SystemData.EthernetPara.IP;
			ThePacket->PacketIdt       =0;

			ThePacket->PacketHeadLength=sizeof(Packet) - 4;
			ThePacket->PacketLength    =sizeof(Packet) - 4 + sizeof(Cmd_Report_Reset_Status);

			MemCopy((unsigned char *)&ThePacket->Data,(unsigned char *)&Cmd,sizeof(Cmd_Report_Reset_Status));

			Msg.Flag   =0x00;
			Msg.MsgType=MSG_SELFUP;
			Msg.Length =ThePacket->PacketLength;
			Msg.Pdata  =(unsigned char *)ThePacket;

			Display("command report reset state send out.\n");

			/*发送消息请求发送复位状态*/
			SendQueue(QN_TCPIPSEND,&Msg);
		}
	}
}

void TK_CmdProc(void)
{
	unsigned long rc;
	MESSAGE       Msg;

	for(;;)
	{
		rc=ReceiveQueue(QN_CMDPROC,Q_WAIT,0,&Msg);

		if(!rc)
		{
			if(Msg.Pdata == NULL)
				continue;
			Cmd_Proc((Packet *)Msg.Pdata);
		}

	}
}

⌨️ 快捷键说明

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