j123b567 / scpi-parser

Open Source SCPI device library
BSD 2-Clause "Simplified" License
447 stars 191 forks source link

[Feature request] Add support to handle numerical values in choice list #155

Open u77345 opened 8 months ago

u77345 commented 8 months ago

An example SCPI command:

CONFigure:VOLTage:DC {0.2|2|20|AUTO}

when implemented using the current interface it creates a complex code, getting a SCPI_Parameter first, then implementing two cases based on whether the parameter type is SCPI_TOKEN_PROGRAM_MNEMONIC for SCPI_ParamToChoice or SCPI_ParamToFloat. Additional validation code to match ranges also necessary.

However, a much simpler hack is possible:

const scpi_choice_def_t scpi_range[] = {
    {"0.2",       1}, 
    {"2",         2}, 
    {"20",        3}, 
    {"AUTO",      0}, 
    SCPI_CHOICE_LIST_END
};

    bool res = SCPI_Parameter(context, &param, true);
    if (res) {
        param.type = SCPI_TOKEN_PROGRAM_MNEMONIC;
        res = SCPI_ParamToChoice(context, &param, scpi_range, &range);
        if (!res) {
            return SCPI_RES_ERR;
        }        
    } else {
        return SCPI_RES_ERR;
    }

The ask is to be able to express choices as numerics without forcibly overwriting the parameter type.