Jan Breuer
2013-10-03 94ccbeebf69d856effb7ba0dc2dd7e4b13ba3a06
Add support for Boolean program data
4个文件已修改
2个文件已添加
84 ■■■■■ 已修改文件
Makefile 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/Makefile 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/common/scpi-def.c 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/inc/scpi/parser.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/src/parser.c 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/test/test_lexer_parser.c 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Makefile
New file
@@ -0,0 +1,7 @@
all:
    $(MAKE) -C libscpi
    $(MAKE) -C examples
clean:
    $(MAKE) clean -C libscpi
    $(MAKE) clean -C examples
examples/Makefile
New file
@@ -0,0 +1,15 @@
all:
    $(MAKE) -C test-interactive
    $(MAKE) -C test-parser
    $(MAKE) -C test-tcp
    $(MAKE) -C test-tcp-srq
clean:
    $(MAKE) clean -C test-interactive
    $(MAKE) clean -C test-parser
    $(MAKE) clean -C test-tcp
    $(MAKE) clean -C test-tcp-srq
examples/common/scpi-def.c
@@ -89,6 +89,21 @@
    return SCPI_RES_OK;
}
scpi_result_t SCPI_TestBool(scpi_t * context) {
    scpi_parameter_t param1;
    fprintf(stderr, "TEST:BOOL\r\n"); // debug command name
    // read first parameter if present
    if (!SCPI_Parameter(context, &param1, true)) {
        return SCPI_RES_ERR;
    }
    fprintf(stderr, "\tP1=%d\r\n", SCPI_ParamGetBoolVal(context, &param1));
    return SCPI_RES_OK;
}
static const scpi_command_t scpi_commands[] = {
    /* IEEE Mandated Commands (SCPI std V1999.0 4.1.1) */
    { .pattern = "*CLS", .callback = SCPI_CoreCls,},
@@ -137,6 +152,8 @@
    
    {.pattern = "SYSTem:COMMunication:TCPIP:CONTROL?", .callback = SCPI_SystemCommTcpipControlQ,},
    {.pattern = "TEST:BOOL", .callback = SCPI_TestBool,},
    SCPI_CMD_LIST_END
};
libscpi/inc/scpi/parser.h
@@ -56,12 +56,14 @@
    size_t SCPI_ResultDouble(scpi_t * context, double val);
    size_t SCPI_ResultText(scpi_t * context, const char * data);
    size_t SCPI_ResultArbitraryBlock(scpi_t * context, const char * data, size_t len);
    size_t SCPI_ResultBool(scpi_t * context, bool_t val);
    int32_t SCPI_ParamGetIntVal(scpi_t * context, scpi_parameter_t * parameter);
    double SCPI_ParamGetDoubleVal(scpi_t * context, scpi_parameter_t * parameter);
    void SCPI_ParamGetTextVal(scpi_t * context, scpi_parameter_t * parameter, const char ** data, int32_t * len);
#define SCPI_ParamGetCharactersVal SCPI_ParamGetTextVal
#define SCPI_ParamGetArbitraryBlockVal SCPI_ParamGetTextVal
    bool_t SCPI_ParamGetBoolVal(scpi_t * context, scpi_parameter_t * parameter);
    bool_t SCPI_Parameter(scpi_t * context, scpi_parameter_t * parameter, bool_t mandatory);
libscpi/src/parser.c
@@ -342,6 +342,17 @@
    return result;
}
/**
 * Write boolean value to the result
 * @param context
 * @param val
 * @return
 */
size_t SCPI_ResultBool(scpi_t * context, bool_t val) {
    return SCPI_ResultIntBase(context, val ? 1 : 0, 10);
}
/* parsing parameters */
bool_t SCPI_Parameter(scpi_t * context, scpi_parameter_t * parameter, bool_t mandatory) {
@@ -450,6 +461,26 @@
    *len = parameter->data.len;
}
/* SCPI-99 7.3 Boolean Program Data */
bool_t SCPI_ParamGetBoolVal(scpi_t * context, scpi_parameter_t * parameter) {
    switch (parameter->type) {
        case TokDecimalNumericProgramData:
            return parameter->number.value ? 1 : 0;
        case TokProgramMnemonic:
            if (compareStr("ON", 2, parameter->data.ptr, parameter->data.len)) {
                return TRUE;
            } else if (compareStr("OFF", 3, parameter->data.ptr, parameter->data.len)) {
                return FALSE;
            } else {
                SCPI_ErrorPush(context, SCPI_ERROR_INVALID_PARAMETER);
                return FALSE;
            }
        default:
            SCPI_ErrorPush(context, SCPI_ERROR_INVALID_PARAMETER);
            return FALSE;
    }
}
int SCPI_ParseProgramData(lex_state_t * state, token_t * token) {
    token_t tmp;
    int result = 0;
libscpi/test/test_lexer_parser.c
@@ -265,6 +265,17 @@
    TEST_DETECT("[\r\n", 0, 1, TokInvalid, 0, 0, PmutNone);
}
void testBoolParameter(void) {
    TEST_TOKEN(" 1", SCPI_ParseProgramData, 1, 1, TokDecimalNumericProgramData);
    TEST_TOKEN(" 0", SCPI_ParseProgramData, 1, 1, TokDecimalNumericProgramData);
    TEST_TOKEN(" ON", SCPI_ParseProgramData, 1, 2, TokProgramMnemonic);
    TEST_TOKEN("OFF ", SCPI_ParseProgramData, 0, 3, TokProgramMnemonic);
    // TODO: finish bool test
}
// TODO: SCPI_Parameter test
int main() {
    CU_pSuite pSuite = NULL;
@@ -292,6 +303,7 @@
            || (NULL == CU_add_test(pSuite, "ProgramData", testProgramData))
            || (NULL == CU_add_test(pSuite, "AllProgramData", testAllProgramData))
            || (NULL == CU_add_test(pSuite, "DetectProgramMessageUnit", testDetectProgramMessageUnit))
            || (NULL == CU_add_test(pSuite, "BoolParameter", testBoolParameter))
            ) {
        CU_cleanup_registry();
        return CU_get_error();