?? cli_init.c
字號(hào):
/************************************************************************
Copyright 200X - 200X+1.
filename : CLI_Init.c
description : 本文件實(shí)現(xiàn)命令行模塊主要部分的初始化操作
author : Woodhead
modification : Woodhead create 2004-12-07
************************************************************************/
#include "Ros.h"
#include "ML.h"
#include "Cli_MlPriv.h"
#include "Cli_Private.inc"
#include "CLI_Intp.inc"
#include "..\include\Cli_IO.h"
#include "CLI_Telnet.inc"
#include "CLI_User.inc"
#include "Cli_Log.inc"
#include "CLI_Cmd.inc"
#include "Board_Pub.h"
#include "Config\Cli_ConfigGlbVar.h"
/*任務(wù)數(shù)據(jù)表(表項(xiàng)數(shù)目為m_ulCliMaxTermNum)*/
/*說明: 該任務(wù)數(shù)據(jù)表為靜態(tài)表,其中前兩個(gè)分別為串口任務(wù)和MML終端 */
/* 的服務(wù)器端,后四個(gè)為telnet任務(wù), 終端任務(wù)ID即取該表下標(biāo)+1 */
/* 若為從設(shè)備,則由終端1到的6分別對(duì)應(yīng)主設(shè)備的終端,終端0、7 */
/* 分別為從設(shè)備自己的串口和telnet任務(wù)接收函數(shù) */
struct TD_S *m_TDTable = G_NULL;
CT_MODE_RECORD_T *m_sModeMutex[CTM_TOTAL]; /* 模式互斥結(jié)構(gòu) */
_S8 m_szHostName[HOSTNAME_LENGTH] ; /* 主機(jī)設(shè)備名 */
TIMER_ID m_CliSecTimer; /* 命令行定時(shí)器 */
_U32 m_ulCliStat[CLI_STAT_BUTT]; /* 命令行統(tǒng)計(jì)信息 */
/* 串口波特率 */
_U32 m_ulSerialBaudrate = 0;
/* 最大終端個(gè)數(shù), 包括各種終端類型(com/telnet/web等), 表m_TDTable的大小 */
_U32 m_ulCliMaxTermNum = 0;
/* 命令行最大在線用戶個(gè)數(shù) */
_U32 m_ulCliMaxOnlineUser = 0;
/* Web網(wǎng)管終端在m_TDTable的起始索引和終止索引 */
#if ( CLI_WEB_SUPPORT == G_YES )
_U32 m_ulCliWebTermFirstIndex = G_NULL_DWORD;
_U32 m_ulCliWebTermLastIndex = G_NULL_DWORD;
#endif /* #if ( CLI_WEB_SUPPORT == G_YES ) */
#if MULTI_DEVICE_SUPPORT
_U8 m_CliIsMainDevice;
extern _U32 BOARD_IsMainDevice(_VOID);
#endif
/* 命令行模塊的多語種字符串ID的枚舉值的最大值 */
_U32 g_ul_EN_CLI_ML_PRIV_SID_BUTT = EN_CLI_ML_PRIV_SID_BUTT;
/*==================================================================*/
/* 函數(shù)名 :CLI_ProcessMsg */
/* 函數(shù)功能 :命令行通用消息處理 */
/* 輸入?yún)?shù) :PTerm_Data_S pTermStruct 任務(wù)數(shù)據(jù)指針 */
/* 輸出參數(shù) :PTerm_Data_S pTermStruct 任務(wù)數(shù)據(jù)指針 */
/* 返回值 :無 */
/* 調(diào)用函數(shù) :無 */
/* 備注 :環(huán)境變量的初始化不在該函數(shù)中進(jìn)行 */
/*==================================================================*/
_VOID CLI_ProcessMsg(ST_MSG *pMsg)
{
ST_DBG_MSG* pDbgMsg;
ST_TIMER_NOTIFY_MSG *pstNotify;
#if MULTI_DEVICE_SUPPORT
PNMS_MSG_S pNmsMsg;
PST_MSCLI_MSG pstMsCliMsg;
PTerm_Data_S pTermStruct;
#endif
if (pMsg == G_NULL || pMsg->usDstPid != PID_CLI)
{
DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\r\n!CLI:recieved error message!");
MT_ERRLOG(0);
return ;
}
DBG_Out(PID_CLI, EN_DBG_OUT_CHN_31,
"\r\n CLI_ProcessMsg:: Received msg (Code:%x)", pMsg->usMsgCode);
switch (pMsg->usSrcPid)
{
case PID_DEBUG:
if( G_NULL != g_pfn_CFG_CLI_CmdTestProc )
{
pDbgMsg = (ST_DBG_MSG *)&( pMsg->ucData[pMsg->usDataOffset] );
(_VOID)g_pfn_CFG_CLI_CmdTestProc(pDbgMsg);
}
break;
case PID_ROS_TIMER:
pstNotify = (ST_TIMER_NOTIFY_MSG*)&( pMsg->ucData[pMsg->usDataOffset]);
if (pstNotify->TimerId == m_CliSecTimer)
{
CLI_PeriodProc();
}
break;
#if MULTI_DEVICE_SUPPORT
/* 主從設(shè)備命令行之間的交互消息 */
case PID_AGENT:
// here no break
case PID_CLI:
if (pMsg->usSrcPid == PID_CLI)
{
pstMsCliMsg = (PST_MSCLI_MSG)&( pMsg->ucData[pMsg->usDataOffset]);
if (!CLI_IS_TERMID_VALIDE(pstMsCliMsg->ucTermID))
{
CLI_RECORD(CLI_STAT_RECEIVED_UNWANTED);
DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\r\n! CLI:recieved error message from other device!");
break;
}
pTermStruct = m_TDTable[pstMsCliMsg->ucTermID - 1].pTermStruct;
}
else
{
pNmsMsg = (PNMS_MSG_S)&( pMsg->ucData[pMsg->usDataOffset]);
pstMsCliMsg = (PST_MSCLI_MSG)pNmsMsg->ucData;
pTermStruct = m_TDTable[1].pTermStruct; // 網(wǎng)管分配的終端為第二個(gè)
}
switch (pMsg->usMsgCode)
{
/* 接收透?jìng)魃蠈釉O(shè)備下發(fā)的透?jìng)髅?*/
case MSG_CODE_AGENT_SEND_CMD:
case MSG_CODE_CLI_TRANSCMD:
/* 如果該終端的接收狀態(tài)不正確,直接返回 */
if (pTermStruct->iSocket != SOCKET_FOR_MML || pTermStruct->ucTermStatus != TERM_LOGED)
{
DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
"\r\n CLI: Term %d cannot process this command",pTermStruct->ulTermId);
break;
}
/* 如果命令超長(zhǎng),直接返回 */
if (EOS_StrLen((_S8 *)(pstMsCliMsg->ucData)) > CT_MAX_CMDBUF)
{
DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
"\r\n CLI: Term %d received too long Command:\r\n %s",pTermStruct->ulTermId, pTermStruct->szRecvBuf);
break;
}
/* 設(shè)置該終端的語種與上層終端一致 */
ML_SetLanguage(pTermStruct->ulTermId, pstMsCliMsg->ucLan);
/* 從消息包中接收命令串 */
EOS_StrNCpy(pTermStruct->szRecvBuf, (_S8 *)(pstMsCliMsg->ucData), TERM_IO_BUFFER);
if (pTermStruct->ulTermId == 2)
EOS_StrCat(pTermStruct->szRecvBuf, "\r\n");
pTermStruct->iRecvLen = (_S32)EOS_StrLen(pTermStruct->szRecvBuf);
/* 注意命令的執(zhí)行必須告知模式,否則無法使用現(xiàn)有命令解釋機(jī)制 */
pTermStruct->pWS->ulCurrentMode =
(_U32)(pstMsCliMsg->ucMode < CTM_TOTAL ? pstMsCliMsg->ucMode: 0);
DBG_Out(PID_CLI, CLI_DBGOUT_NOTE,
"\r\n CLI: Term %d received Command:%s",pTermStruct->ulTermId, pTermStruct->szRecvBuf);
break;
case MSG_CODE_CLI_FEEDBACK:
/* 接收反饋信息的終端狀態(tài)不正確,直接返回 */
if (pTermStruct->ucTermStatus != TERM_WAIT_RESPONSE)
{
DBG_Out(PID_CLI, CLI_DBGOUT_NOTE,
"\r\n CLI: Term %d Cannot Output the feedback info",pstMsCliMsg->ucTermID);
}
else if ((EOS_StrLen(pTermStruct->szSendBuf) + EOS_StrLen((_S8*)(pstMsCliMsg->ucData)))
< (TERM_IO_BUFFER - TERM_OUT_FOR_RESPONSE))
{
/* 復(fù)制反饋內(nèi)容到發(fā)送緩沖區(qū) */
DBG_Out(PID_CLI, CLI_DBGOUT_NOTE,
"\r\n CLI: Term %d received Output info:%s",pstMsCliMsg->ucTermID, pTermStruct->szSendBuf);
/* 注意: 應(yīng)當(dāng)保證從此處到該信息的輸出之前不調(diào)用IO_OutToTerm */
EOS_StrCat(pTermStruct->szSendBuf, (_S8*)(pstMsCliMsg->ucData));
pTermStruct->iSendLen = (_S32)EOS_StrLen(pTermStruct->szSendBuf);
}
break;
case MSG_CODE_CLI_EXECRESP:
if (pTermStruct->ucTermStatus == TERM_WAIT_RESPONSE)
{
DBG_Out(PID_CLI, CLI_DBGOUT_NOTE,
"\r\n CLI: Term %d received excute response",pstMsCliMsg->ucTermID, pTermStruct->szSendBuf);
/* 注意: 應(yīng)當(dāng)保證從此處到該信息的輸出之前不調(diào)用IO_OutToTerm */
EOS_StrCat(pTermStruct->szSendBuf, CMD_RESPONED_END);
break;
}
//else分支直接往下走
default:
CLI_RECORD(CLI_STAT_RECEIVED_UNWANTED);
DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
"\r\n CLI: No process for message:Code-%d!", pMsg->usMsgCode);
break;
}
break;
#endif
default:
CLI_RECORD(CLI_STAT_RECEIVED_UNWANTED);
DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
"\r\n CLI: No process for message from PID:%d!", pMsg->usSrcPid);
break;
}
}
#if MULTI_DEVICE_SUPPORT
/*==================================================================*/
/* 函數(shù)名 :CLI_MSMsgCreat */
/* 函數(shù)功能 :主從命令的消息構(gòu)建函數(shù) */
/* 輸入?yún)?shù) :PTerm_Data_S pTermStruct 任務(wù)數(shù)據(jù)指針 */
/* 輸出參數(shù) :PTerm_Data_S pTermStruct 任務(wù)數(shù)據(jù)指針 */
/* 返回值 :無 */
/* 調(diào)用函數(shù) :無 */
/* 備注 :環(huán)境變量的初始化不在該函數(shù)中進(jìn)行 */
/*==================================================================*/
ST_MSG* CLI_MSMsgCreat(_U32 usDeviceID, _U32 ulTermID, _U16 usMSmsgType, _S8 *szSend)
{
_U32 ulSize;
PST_MSCLI_MSG pstCliMsg;
ST_MSG *pstMsg;
if (szSend == G_NULL)
ulSize = sizeof(ST_MSCLI_MSG);
else
ulSize = sizeof(ST_MSCLI_MSG) + EOS_StrLen(szSend);
pstMsg = ROS_MsgAlloc(PUBLIC_LENS_TOTAL + ulSize, ROS_MSG_ALLOC_OPT_LEAK_CHECK );
if (pstMsg == G_NULL)
{
DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\r\n CLI(error return): CLI_MSMsgCreat:: ROS_MsgAlloc");
MT_ERRLOG(0);
return G_NULL;
}
/* 填充消息包的內(nèi)容 */
pstMsg->usSrcBid = g_usTransLocalBID;
pstMsg->usDstBid = g_usTransLocalBID;
pstMsg->usSrcPid = PID_CLI;
pstMsg->usDstPid = PID_CLI;
pstMsg->usMsgCode = usMSmsgType;
pstMsg->usDataOffset = 0;
pstMsg->usDataLens = (_U16)ulSize;
pstCliMsg = (PST_MSCLI_MSG)&( pstMsg->ucData[pstMsg->usDataOffset] );
pstCliMsg->ucLan = ML_GetLanguage(ulTermID);
/* 由于主從命令行的終端ID不是完全對(duì)應(yīng)的,因此需要作算術(shù)映射 */
if (m_CliIsMainDevice != G_TRUE && ulTermID >= 2)
ulTermID -= 2;
else if (m_CliIsMainDevice == G_TRUE)
ulTermID += 2;
pstCliMsg->ucTermID = (_U8)ulTermID;
if (szSend != G_NULL)
EOS_StrCpy((_S8 *)(pstCliMsg->ucData), szSend);
return pstMsg;
}
#endif
/*********************************************************************/
/* 函數(shù)名稱 : CLI_CfgGlbVarInit() */
/* 函數(shù)功能 : 與配置相關(guān)的模塊變量的初始化 */
/* 輸入?yún)?shù) : */
/* 輸出參數(shù) : */
/* 返回 : */
/* 上層函數(shù) : CLI_ConfigInit() */
/* 創(chuàng)建者 : */
/* 修改記錄 : */
/*********************************************************************/
_U32 CLI_CfgGlbVarInit( _VOID )
{
_U32 i, ulSize;
_U8 *pucMem;
/* 命令行最大在線用戶個(gè)數(shù)( 最前兩個(gè)分別為串口任務(wù)和MML終端的服務(wù)器端, 保留 ) */
m_ulCliMaxOnlineUser = 2 + g_ul_CFG_CLI_MAX_TELNET_CLIENT_NUM;
#if MULTI_DEVICE_SUPPORT
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -