📄 ge_maincommand.c
字号:
/**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-
* GE_MainCommand.c - Ethernet 1000M code. .
*
* Copyright 2001-12 by GDT, Inc
*
* modification history
* --------------------
* 2001-12-14,yxy created.
*
* command include:
*
* MONITOR_MSG
* SYS_INITCOMMAND
* SYS_SHUTDOWN
* RESET_COMMAND
* SYS_MGMT_REQ
* SYS_EVENT_REPORT
* CONFIG_IPADDR
* BDCOM_LINK_DOWN
*
*/
#include <msgQLib.h>
#include <errno.h>
#include <assert.h>
#include <string.h>
#include <taskLib.h>
#include "GE_Global.h"
#include "GE_GlobalP.h"
#include "GE_MainCommand.h"
#include "SBSL_MemManage.h"
#include "SBSL_Monitor.h"
#include "bdcom_860.h"
#include "GE_Utility.h"
unsigned int GE_CMD_DEBUG=0;
MSG_Q_ID GE_MainCommandMsgQId;
ULONG IPAddr[32];
extern SEM_ID semLink;
extern unsigned int BDCOM_FLAG;
/********************************************************************************************
* MainCommandInit: initlize the MainCommand
*/
STATUS GE_MainCommandInit(void)
{
if(SBSL_TaskFlagGet(GE_MAINCMD_TASK_CODE)!= SBSL_TASK_UNREGISTER)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"The MainCommandTask has register!\n");
return ERROR;
}
GE_MainCommandMsgQId = msgQCreate(MAX_MSG_NUM,sizeof(TASK_MSG),MSG_Q_FIFO);
if(GE_MainCommandMsgQId==NULL)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM," GE_MainCommandInit:creating MainCommandMsgQ failed!\n");
return ERROR;
}
if(SBSL_TaskRegister( GE_MAINCMD_TASK_CODE,
GE_MainCommandMsgQId,
GE_MainCommandReInit,
GE_MainCommandDel)==ERROR)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM," GE_MainCommandInit:register failed!\n");
return ERROR;
}
if( taskSpawn( TASK_NAME[GE_MAINCMD_TASK_CODE],
GE_MAINCOMMAND_TASK_PRI,
0,
2048,
(FUNCPTR)GE_MainCommand,
0,0,0,0,0,0,0,0,0,0)== ERROR)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM," GE_MainCommandInit:creaating Task failed!\n");
return ERROR;
}
return OK;
}
/********************************************************************************************
* MainCommand_DEL: DEL the MainCommandTask
*/
STATUS GE_MainCommandDel(void)
{
if (SBSL_TaskFlagGet(GE_MAINCMD_TASK_CODE)!= SBSL_TASK_STARTED)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommandDel:task not start!\n");
return ERROR;
}
if(taskDelete (SBSL_TaskIdGet(GE_MAINCMD_TASK_CODE))==ERROR )
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommandDel:Delete GE_MainCommandTask failed!\n");
return ERROR;
}
if (SBSL_TaskMemClear(GE_MAINCMD_TASK_CODE) == ERROR)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_EventStatisticDel:mem clear failed!\n");
}/*continue run and may cause mem block lost*/
if (SBSL_TaskStop(GE_MAINCMD_TASK_CODE) == ERROR)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_EventStatisticDel:stop task failed!\n!");
}
return OK;
}
/********************************************************************************************
* MainCommand_reinit: reinit the MainCommandTask
*/
STATUS GE_MainCommandReInit(void)
{
if(SBSL_TaskFlagGet(GE_MAINCMD_TASK_CODE)==SBSL_TASK_STARTED)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommandReInit:task has started!\n");
return ERROR;
}
if(taskSpawn(TASK_NAME[GE_MAINCMD_TASK_CODE],
GE_MAINCOMMAND_TASK_PRI,
0,
2048,
(FUNCPTR)GE_MainCommand,
0,0,0,0,0,0,0,0,0,0)==ERROR)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommandReInit:Creating task failed!\n");
return ERROR;
}
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommandReInit:Creating task succeed!\n");
return OK;
}
/*******************************************************************************************
* MainCommand: Implement MainCommandTask
*/
STATUS GE_MainCommand()
{
TASK_MSG CommandMsg;
unsigned char config_ip_result,result;
unsigned short state;
char exPort,interface;
char index,n;
unsigned char port,subType,unit;
MSG_STRUCTURE *ackMsg;
while(BOARD_STATE != BOARD_STATE_NORMAL)
{
taskDelay(30);
}
if(SBSL_TaskStart(GE_MAINCMD_TASK_CODE,taskIdSelf())==ERROR)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommand: task start FAILED!\n");
return ERROR;
}
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_Maincommand task is running.....\n");
for(;;)
{
if(SBSL_TaskMsgIdGet(GE_MAINCMD_TASK_CODE)==NULL)
{
return ERROR;
}
if(msgQReceive( GE_MainCommandMsgQId,
(char*)&CommandMsg,
sizeof(TASK_MSG),
WAIT_FOREVER)==ERROR)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommand:can not receive any message !\n");
return ERROR;
}
switch(CommandMsg.type)
{
case MONITOR_MSG:
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommand:Receive MONITOR_MSG!\n");
CommandMsg.taskCode=GE_MAINCMD_TASK_CODE;
CommandMsg.type=MONITOR_MSG_ACK;
CommandMsg.length=0;
memset(CommandMsg.msgBuf,0,128);
if(msgQSend( SBSL_TaskMsgIdGet(MONITOR_TASK_CODE),
(char*)&CommandMsg,
MSG_LENGTH,
NO_WAIT,
MSG_PRI_NORMAL)==ERROR)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommand:send MONITOR_MSG_ACK failed!\n");
break;
}
else
{
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommand:send MONITOR_MSG_ACK succeed!\n");
}
break;
case CONFIG_THISIP_MSG:
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommand:tMainCommand received FWD_CONFIG_IPADDR!\n");
n=CommandMsg.msgBuf[0];
exPort=CommandMsg.msgBuf[1];
interface=CommandMsg.msgBuf[2];
index=CommandMsg.msgBuf[3];
if(n==32)
{
if(FWD_Get_Ipaddr(&IPAddr[0],32,0,0)!=OK)
{
config_ip_result=1;
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommand:config 32 ip failed!\n");
break;
}
else
{
config_ip_result=0;
write_infpga_ip(32,0);
};
}
if(n==1)
{
if(FWD_Get_Ipaddr(&IPAddr[index],n,exPort,interface)!=OK)
{
config_ip_result=1;
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommand:update ip failed!\n");
}
else
{
config_ip_result=0;
write_infpga_ip(1,index);
}
}
CommandMsg.taskCode = GE_MAINCMD_TASK_CODE;
CommandMsg.type = CONFIG_IPADDRESS_MSG_ACK ;
CommandMsg.length = 4;
memset(&CommandMsg.msgBuf[4], 0, 124);
CommandMsg.msgBuf[0]=n;
CommandMsg.msgBuf[1]=config_ip_result;
CommandMsg.msgBuf[2]=exPort;
CommandMsg.msgBuf[3]=interface;
if (msgQSend( SBSL_TaskMsgIdGet(MANAGE_TASK_CODE),
(char *)&CommandMsg,
140,
NO_WAIT,
MSG_PRI_URGENT) == ERROR)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommand:MainCommand send to failed!\n");
break;
}
else
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommand: send _MSG_ACK to sucess!\n");
break;
case SYS_SHUTDOWN:
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommand: received SYS_SHUTDOWN from BDCOM!\n");
if(GE_SuspendAll()!=OK)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommand:suspend all task failed!\n");
break;
}
break;
case SYS_INITCOMMAND:
port = GE_swiport;
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommand:receive SYS_INITCOMMAND from BDCOM!\n");
result=SYS_OK;
if(FWD_ResumeAll()==ERROR)
{
result=SYS_FAIL;
}
if(GE_ResumeAll()==ERROR)
{
result=SYS_FAIL;
break;
}
ackMsg = (MSG_STRUCTURE*)malloc(SYS_BDCOM_HEAD_SIZE+10);
if(ackMsg== NULL)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommand:memory allocation failed!\n");
break;
}
else
{
memset(ackMsg->blank, 0,SYS_BDCOM_HEAD_SIZE);
ackMsg->type = SYS_INITCOMMAND_R;
ackMsg->length = 2;
ackMsg->data[0] = port;
ackMsg->data[1] = result;
if (BDCOM_UpReceive ( BDCOM_STREAM,
NO_WAIT,
MSG_PRI_NORMAL,
SYS_BDCOM_HEAD_SIZE + 10,
(UCHAR *) ackMsg,
SYS_BDCOM_HEAD_SIZE,
10 ) == ERROR)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommand: send SYS_INITCOMMAND_R to BDCOM failed!\n");
free((void*)ackMsg);
break;
}
else
{
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommand: send SYS_INITCOMMAND_R to BDCOM succeed!\n");
}
}
break;
case RESET_COMMAND:
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommand:Receive RESET_COMMAND!\n");
resetHardware();
break;
case SYS_EVENT_REPORT:
/*
if(GenMsg->data[1]==MAIN)
{
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommand: sys work mode changed:MAIN!\n");
}
if(GenMsg->data[1]==BACKUP)
{
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommand: sys work mode changed:BACKUP!\n");
}
*/
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommand: MAIN--BACKUP changed!\n");
break;
case BDCOM_LINK_DOWN:
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommand:tMainCommand received BDCOM_LINK_DOWN!\n");
if(GE_SuspendAll()==ERROR)
{
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommand:SuspendAllTask failed!\n");
break;
}
if (semTake(semLink, WAIT_FOREVER) == ERROR)
{
taskLock();
BDCOM_FLAG=0;
taskUnlock();
if(GE_CMD_DEBUG)
GE_printf(GE_ALARM,"GE_MainCommand:Taking semLink failed, EXIT!\n");
break;
}
else
{
taskLock();
BDCOM_FLAG=1;
taskUnlock();
if(GE_CMD_DEBUG)
GE_printf(GE_EVENT,"GE_MainCommand:Link BDCOM succeed ,BDCOM_LINK_UP!\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -