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

📄 cli_init.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 3 页
字号:
        /* 本函数在系统初始化的时候调用, 此处一定要保证已经正确的区分了主从设备 */
        m_CliIsMainDevice = (_U8)BOARD_IsMainDevice();
        if (m_CliIsMainDevice != G_TRUE)
        {
            m_ulCliMaxOnlineUser += 2;  //增加两个自用处理终端
        }
    }
    #endif

    /* Web网管终端在m_TDTable的起始索引 */
    #if ( CLI_WEB_SUPPORT == G_YES )
    m_ulCliWebTermFirstIndex    = m_ulCliMaxOnlineUser;
    m_ulCliWebTermLastIndex     = m_ulCliWebTermFirstIndex + g_ul_CFG_CLI_MAX_WEB_CLIENT_NUM - 1;
    #endif /* #if ( CLI_WEB_SUPPORT == G_YES ) */

    /* 最大终端任务个数, 加上WEB终端的个数 */
    m_ulCliMaxTermNum  = m_ulCliMaxOnlineUser + g_ul_CFG_CLI_MAX_WEB_CLIENT_NUM;

    /* 申请任务数据表的内存 */
    ulSize = sizeof(struct TD_S) * m_ulCliMaxTermNum;
    m_TDTable = ROS_MemStaticAlloc( ulSize );
    if( G_NULL == m_TDTable )
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }
    else
    {
        EOS_MemZero( (_VOID *)m_TDTable, ulSize );
    }

    /* 申请 模式互斥结构的内存 */
    ulSize = sizeof(CT_MODE_RECORD_T) * CTM_TOTAL * m_ulCliMaxOnlineUser;
    pucMem = ROS_MemStaticAlloc( ulSize );
    if( G_NULL == pucMem )
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }
    else
    {
        EOS_MemZero( (_VOID *)pucMem, ulSize );
    }

    ulSize = sizeof(CT_MODE_RECORD_T) * m_ulCliMaxOnlineUser;
    for( i = 0; i < CTM_TOTAL; i ++ )
    {
        m_sModeMutex[i] = (CT_MODE_RECORD_T *)( pucMem + i * ulSize );
    }

    return G_SUCCESS;

}


/*==================================================================*/
/*      函数名      :CLI_InitializeTaskData                         */
/*      函数功能    :初始化任务数据                                 */
/*      输入参数    :PTerm_Data_S pTermStruct  任务数据指针         */
/*      输出参数    :PTerm_Data_S pTermStruct  任务数据指针         */
/*      返回值      :无                                             */
/*      调用函数    :无                                             */
/*      备注        :环境变量的初始化不在该函数中进行               */
/*==================================================================*/
_VOID CLI_TaskDataInit( PTerm_Data_S pTermStruct )
{
    _U32         ulTmp;

    if ( pTermStruct == G_NULL )
    {
        return;
    }
    /* 初始化任务数据   */
    pTermStruct->ucTermStatus = TERM_SLEEPING;
    pTermStruct->szRecvBuf[0]    = '\0' ;
    pTermStruct->iRecvLen        = 0 ;
    pTermStruct->szSendBuf[0]    = '\0' ;
    pTermStruct->iSendLen        = 0 ;
    for ( ulTmp = 0 ; ulTmp < HISTORY_SIZE ; ulTmp ++ )
        pTermStruct->szHistory[ulTmp][0] = '\0' ;
    pTermStruct->iHistoryPos     = 0 ;
    pTermStruct->szEditBuf[0]    = '\0' ;
    pTermStruct->iCurrentPos     = 0 ;
    pTermStruct->iPromptLen      = 1 ;
    pTermStruct->szCommandBuf[0] = '\0' ;
    pTermStruct->szInputCmd[0] = '\0';
    pTermStruct->iEditStatus     = COMMAND_INPUT;
    pTermStruct->iMaxLen         = CT_MAX_CMDBUF;
    pTermStruct->ulDispLineCount = 0;
    EOS_StrCpy (pTermStruct->szCurUserName, UNLOGON_USER_NAME );
    pTermStruct->ucUserLevel     = 0 ;
    pTermStruct->ucScroll        = SCROLL_MANUAL;
    pTermStruct->ucTimeOutFlag   = TIMEOUT_ON;
    pTermStruct->ulTimeLeft      = DEADLINE_LONG;
    pTermStruct->ucHelpMode      = 0 ;
    pTermStruct->ulRecurCmd      = 0 ;
    pTermStruct->ucChannel       = INBAND;
    pTermStruct->ulCommandExecOk = COMMAND_UNFINISHED ;
    pTermStruct->ucAlarmLevel    = 1;  // Permit output
    pTermStruct->ucInputStatus   = 0;


    /* 初始化telnet 任务数据参数  */
    pTermStruct->TelnetParam.TTState    = TSDATA ;
    pTermStruct->TelnetParam.SubState   = SS_START ;
    pTermStruct->TelnetParam.Synching   = 0 ;
    pTermStruct->TelnetParam.DoEcho     = 1 ;
    EOS_StrCpy ( pTermStruct->TelnetParam.TermType, "" ) ;
    EOS_StrCpy ( pTermStruct->TelnetParam.FirstTermType, "" ) ;
    pTermStruct->ulClientIP             = 0;
    pTermStruct->TelnetParam.SendBinary = 0 ;
    pTermStruct->TelnetParam.RecvBinary = 0 ;
    pTermStruct->TelnetParam.Noga       = 1 ;
    pTermStruct->iSocket = SOCKET_NOT_INITIAL;

    return ;
}

_U32 CLI_ResetEnviroment(CT_WS_P pWS)
{
    _U32 i;

    CLI_ASSURE_OR_FAIL( G_NULL != pWS);

    pWS->szCmdString[0] = 0;
    pWS->ulLevel = CT_AL_QUERY;
    pWS->ulCurrentMode = ROOT_MODE;
    pWS->cmdStack.ucTop = 0;
    for(i = 0; i < CT_MAX_STACK; i++)
    {
        pWS->cmdStack.szCommand[i][0] = 0;
        pWS->cmdStack.ulMode[i] = NULL_MODE;
    }
    for(i = 0; i < CT_MAX_PARAMCOUNT; i++)
    {
        pWS->indexTable[i] = 0;
        pWS->buffer[i][0]  = 0;
        pWS->NameBuf[i][0] = 0;
    }
    pWS->ulParamIndex = 0;
    pWS->ulValidParams = 0;
    pWS->ulSmart = SMART_ON;
    pWS->ulStatus = 0;
    pWS->ulExpectEle = 0;         //此信息只在交互下的第一个参数输入时提供保存当前
                                  //待输入参数的指针,其它时候一律清为零

    return G_SUCCESS;

} /* End of function CT_ResetEnviroment() */

/*==================================================================*/
/*      函数名      :CLI_TDTableInit                                */
/*      函数功能    :初始化任务数据表                               */
/*      输入参数    :无                                             */
/*      输出参数    :无                                             */
/*      返回值      :无                                             */
/*      调用函数    :无                                             */
/*      被调函数    :                                               */
/*==================================================================*/
_U32 CLI_TDTableInit(_VOID)
{
    _U32     ulTDNum;
    _S8      szSemName[32];

    for (ulTDNum = 0 ; ulTDNum < m_ulCliMaxTermNum; ulTDNum++)
    {
        m_TDTable[ulTDNum].lTaskid    = CLI_PID_NULL;

        if (G_NULL == (m_TDTable[ulTDNum].pTermStruct
                       = ROS_MemStaticAlloc(sizeof(struct Term_Data_S))))
        {
            DBG_Out(PID_CLI, MT_DBGOUT_ERR,
                    "\r\n CLI_TDTableInit:: DATA MemAlloc Failed!");
            MT_ERRLOG(0);
            return G_FAILURE;
        }

        /* 命令行终端的特殊处理 */
        if (ulTDNum < m_ulCliMaxOnlineUser)
        {
            if (G_NULL == (m_TDTable[ulTDNum].pTermStruct->pWS
                               = ROS_MemStaticAlloc(sizeof(CT_WORK_STAT_T))))
            {
                DBG_Out(PID_CLI, MT_DBGOUT_ERR,
                        "\r\n CLI_TDTableInit:: WS MemAlloc Failed!");
                MT_ERRLOG(0);
                return G_FAILURE;
            }

            m_TDTable[ulTDNum].pTermStruct->pWS->ulTermId = ulTDNum + 1;
            CLI_ResetEnviroment(m_TDTable[ulTDNum].pTermStruct->pWS);

            EOS_Sprintf(szSemName, "CLI_TermSem%d", ulTDNum + 1);
            if (G_SUCCESS != EOS_SemCreate(szSemName, 1, EOS_SM_FIFO, &(m_TDTable[ulTDNum].pTermStruct->ulSemID)))
            {
                MT_ERRLOG(0);
                DBG_Out(PID_CLI, CLI_DBGOUT_ERR, "\r\n SemID of Term %d Creat Failed!", ulTDNum + 1);
            }

        }
        else
        {
            m_TDTable[ulTDNum].pTermStruct->pWS = G_NULL;
        }

        m_TDTable[ulTDNum].pTermStruct->ulTermId = ulTDNum + 1;

        CLI_TaskDataInit(m_TDTable[ulTDNum].pTermStruct);

    }

    return G_SUCCESS;

}

/*==================================================================*/
/*      函数名      :CLI_GetTaskDataByPid                           */
/*      函数功能    :获取当前任务的任务数据                         */
/*      输入参数    :_U32 ulPid  进程号                             */
/*                                                                  */
/*      输出参数    :无                                             */
/*      返回值      :PTerm_Data_S 任务数据指针                      */
/*      调用函数    :CLI_GetTaskData ( )                            */
/*      被调函数    :                                               */
/*==================================================================*/
PTerm_Data_S CLI_GetTaskDataByPid (_U32 ulPid)
{
    _U32 ulTDIndex;

    if (ulPid == CLI_PID_NULL)
    {
        MT_ERRLOG(0);
        return G_NULL;
    }

    for (ulTDIndex = 0; ulTDIndex < m_ulCliMaxTermNum; ulTDIndex++)
    {
        if (m_TDTable[ulTDIndex].lTaskid == ulPid)
            return m_TDTable[ulTDIndex].pTermStruct;
    }

    CLI_RECORD(CLI_STAT_GETTASK_DATA);
    return G_NULL;
}

/*==================================================================*/
/*      函数名      :CLI_GetTaskDataByName                          */
/*      函数功能    :获取当前任务的任务数据                         */
/*      输入参数    :szUsername  当前任务对应的用户名               */
/*      输出参数    :无                                             */
/*      返回值      :PTerm_Data_S 任务数据指针                      */
/*      调用函数    :CLI_GetTaskData ( )                            */
/*      被调函数    :                                               */
/*==================================================================*/
PTerm_Data_S CLI_GetTaskDataByName (_S8 *szUsername)
{
    _U32 ulTDIndex;

    CLI_ASSURE_OR_NULL(szUsername != G_NULL && szUsername[0] != G_NULL);

    for (ulTDIndex = 0; ulTDIndex < m_ulCliMaxTermNum; ulTDIndex++)
    {
        if (!strcmp(m_TDTable[ulTDIndex].pTermStruct->szCurUserName, szUsername))
            return m_TDTable[ulTDIndex].pTermStruct;
    }
    return G_NULL;
}


/*==================================================================*/
/*      函数名      :CLI_GetCurrentTaskData                         */
/*      函数功能    :获取当前任务的任务数据                         */
/*      输入参数    :_U32 ulPid  进程号                             */
/*                                                                  */
/*      输出参数    :无                                             */
/*      返回值      :PTerm_Data_S 任务数据指针                      */
/*      调用函数    :CLI_GetTaskData ( )                            */
/*      被调函数    :                                               */
/*==================================================================*/
PTerm_Data_S CLI_GetCurrentTaskData ( _VOID )
{
    _U32 ulPid ;

    /*--------------------------------------------------------------*/
    /* 取得当前任务的ID号                                           */
    /*--------------------------------------------------------------*/
    if ((EOS_TaskGetSelfID(&ulPid)) == G_SUCCESS)
    {
        return CLI_GetTaskDataByPid(ulPid);
    }

    CLI_RECORD(CLI_STAT_GETTASK_DATA);
    return G_NULL ;

⌨️ 快捷键说明

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