消除冗余,提升效率

2018-07-18  本文已影响0人  ww4u
static scpi_command_t _scpi_cmds[]=
{
    COM_ITEMs(),

    CMD_ITEM( "*IDN?", _scpi_idn ),

    CMD_ITEM( "SYSTEM:MODE:SWITCH", _scpi_system_mode_switch ),
    CMD_ITEM( "SYSTEM:MODE:READ?", _scpi_system_mode_switch_q ),

    CMD_ITEM( "SCRIPT:RUN", _scpi_script_run ),
    CMD_ITEM( "SCRIPT:RUN:CYCLE", _scpi_script_run_cycle ),
    CMD_ITEM( "SCRIPT:RUN:CYCLE?", _scpi_script_run_cycle_q ),
    CMD_ITEM( "SCRIPT:RUN:CURRCYCLE?", _scpi_script_run_currcycle_q ),
    ...
static scpi_result_t _scpi_system_mode_switch( scpi_t * context )

问题来了,桩函数中需要

  1. 提取命令关键字
  2. 提取命令参数,而且参数有不同的格式
    怎样简化这个过程:

简化命令关键字

  1. 命令关键字可以依据函数地址从命令表中搜索
static char * cbToKeyw( scpi_t * context, _scpi_cb pfCb )
{
    scpi_command_t *pCmdList;

    Q_ASSERT( NULL != context );
    Q_ASSERT( NULL != pfCb );

    pCmdList = (scpi_command_t*)context->cmdlist;

    do
    {
        if ( pCmdList->callback == pfCb )
        { return (char*)pCmdList->pattern; }

        if ( pCmdList->pattern == NULL || pCmdList->callback == NULL )
        { return NULL; }

        pCmdList++;

    }while( 1 );

    return NULL;
}

但是在桩函数中需要“重复”函数名称以得到其地址

cbToKeyw( context, _scpi_system_mode_switch )
  1. 从当前运行环境中提取完整的输入内容,这样就不再需要函数地址了
context->input_count
context->buffer.position
context->buffer.length
context->buffer.data;

简化桩函数的书写

int ret = _OBJ->write( (byte*)context->buffer.data,\
                            context->buffer.position );\
                            if ( ret != 0 )\
                            { scpi_ret( SCPI_RES_ERR ); }\
                            else\
                            { return SCPI_RES_OK; }
int retLen;\
                            byte *pBuf;\
                            pBuf = _OBJ->recv( retLen );\
                            if ( retLen > 0 )\
                            {\
                                SCPI_ResultText( context, (char*)pBuf);\
                                return SCPI_RES_OK;\
                            }\
                            else\
                            { return SCPI_RES_ERR; }
static scpi_result_t _scpi_system_mode_switch( scpi_t * context )
{
    DEF_LOCAL_VAR();
    transfer_write();
}

static scpi_result_t _scpi_system_mode_switch_q( scpi_t * context )
{
    DEF_LOCAL_VAR();

    transfer_write();

    transfer_recv();
}

#define make_w_api( api ) static scpi_result_t api( scpi_t * context )\
{\
    DEF_LOCAL_VAR();\
\
    transfer_write();\
\
}

#define make_r_api( api ) static scpi_result_t api( scpi_t * context )\
{\
    DEF_LOCAL_VAR();\
\
    transfer_write();\
\
    transfer_recv();\
}
make_w_api( _scpi_system_mode_switch )
make_r_api( _scpi_system_mode_switch_q )

make_w_api( _scpi_script_run )
make_w_api( _scpi_script_run_cycle )
make_r_api( _scpi_script_run_cycle_q )
make_r_api( _scpi_script_run_currcycle_q )

上一篇下一篇

猜你喜欢

热点阅读