📄 cmdproc.c
字号:
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 + -