nancy.liao
2025-04-18 a3fdd3589c713678eafe20840a7334de6bed038b
libscpi/inc/scpi/types.h
@@ -1,30 +1,29 @@
/*-
 * Copyright (c) 2013 Jan Breuer
 *                    Richard.hmm
 * Copyright (c) 2012 Jan Breuer
 * BSD 2-Clause License
 *
 * All Rights Reserved
 * Copyright (c) 2012-2018, Jan Breuer, Richard.hmm
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * modification, are permitted provided that the following conditions are met:
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * * Redistributions of source code must retain the above copyright notice, this
 *   list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/**
@@ -41,8 +40,7 @@
#include <stddef.h>
#include <stdint.h>
#include "scpi/config.h"
#include <scpi/config.h>
#if HAVE_STDBOOL
#include <stdbool.h>
#endif
@@ -74,11 +72,23 @@
        SCPI_REG_ESE, /* Event Status Enable Register */
        SCPI_REG_OPER, /* OPERation Status Register */
        SCPI_REG_OPERE, /* OPERation Status Enable Register */
        SCPI_REG_OPERC, /* OPERation Status Condition Register */
        SCPI_REG_QUES, /* QUEStionable status register */
        SCPI_REG_QUESE, /* QUEStionable status Enable Register */
        SCPI_REG_QUESC, /* QUEStionable status Condition Register */
        /* last definition - number of registers */
        SCPI_REG_COUNT
#if USE_CUSTOM_REGISTERS
#ifndef USER_REGISTERS
#error "No user registers defined"
#else
        USER_REGISTERS
#endif
#endif
        /* number of registers */
        SCPI_REG_COUNT,
        /* last definition - a value for no register */
        SCPI_REG_NONE
    };
    typedef enum _scpi_reg_name_t scpi_reg_name_t;
@@ -104,6 +114,53 @@
    typedef uint16_t scpi_reg_val_t;
    enum _scpi_reg_class_t {
        SCPI_REG_CLASS_STB = 0,
        SCPI_REG_CLASS_SRE,
        SCPI_REG_CLASS_EVEN,
        SCPI_REG_CLASS_ENAB,
        SCPI_REG_CLASS_COND,
        SCPI_REG_CLASS_NTR,
        SCPI_REG_CLASS_PTR,
    };
    typedef enum _scpi_reg_class_t scpi_reg_class_t;
    enum _scpi_reg_group_t {
        SCPI_REG_GROUP_STB = 0,
        SCPI_REG_GROUP_ESR,
        SCPI_REG_GROUP_OPER,
        SCPI_REG_GROUP_QUES,
#if USE_CUSTOM_REGISTERS
#ifndef USER_REGISTER_GROUPS
#error "No user register groups defined"
#else
        USER_REGISTER_GROUPS
#endif
#endif
        /* last definition - number of register groups */
        SCPI_REG_GROUP_COUNT
    };
    typedef enum _scpi_reg_group_t scpi_reg_group_t;
    struct _scpi_reg_info_t {
        scpi_reg_class_t type;
        scpi_reg_group_t group;
    };
    typedef struct _scpi_reg_info_t scpi_reg_info_t;
    struct _scpi_reg_group_info_t {
        scpi_reg_name_t event;
        scpi_reg_name_t enable;
        scpi_reg_name_t condition;
        scpi_reg_name_t ptfilt;
        scpi_reg_name_t ntfilt;
        scpi_reg_name_t parent_reg;
        scpi_reg_val_t parent_bit;
    };
    typedef struct _scpi_reg_group_info_t scpi_reg_group_info_t;
    /* scpi commands */
    enum _scpi_result_t {
        SCPI_RES_OK = 1,
@@ -113,7 +170,12 @@
    typedef struct _scpi_command_t scpi_command_t;
#define SCPI_CMD_LIST_END       {NULL, NULL, 0}
#if USE_COMMAND_TAGS
   #define SCPI_CMD_LIST_END       {NULL, NULL, 0}
#else
   #define SCPI_CMD_LIST_END       {NULL, NULL}
#endif
    /* scpi interface */
    typedef struct _scpi_t scpi_t;
@@ -276,7 +338,7 @@
        SCPI_UNIT_BAR,
        SCPI_UNIT_DECIBEL,
        SCPI_UNIT_UNITLESS,
        SCPI_UNIT_FAGRENHEIT,
        SCPI_UNIT_FAHRENHEIT,
        SCPI_UNIT_KELVIN,
        SCPI_UNIT_DAY,
        SCPI_UNIT_YEAR,
@@ -328,7 +390,7 @@
        union {
            double value;
            int32_t tag;
        };
        } content;
        scpi_unit_t unit;
        int8_t base;
    };
@@ -359,23 +421,42 @@
    };
    struct _scpi_t {
        //命令表的指针
        const scpi_command_t * cmdlist;
        //输入的数据
        scpi_buffer_t buffer;
        //解析命令的参数列表
        scpi_param_list_t param_list;
        //SCPI的外部接口,刷新 重置 写入 报错
        scpi_interface_t * interface;
        //输出数据的个数
        int_fast16_t output_count;
        //输入数据的个数 用于检验参数是否合法
        int_fast16_t input_count;
        //是否为第一个输出项
        scpi_bool_t first_output;
        //命令是否出错
        scpi_bool_t cmd_error;
        //错误信息队列
        scpi_fifo_t error_queue;
#if USE_DEVICE_DEPENDENT_ERROR_INFORMATION && !USE_MEMORY_ALLOCATION_FREE
        //详细错误信息
        scpi_error_info_heap_t error_info_heap;
#endif
        //SCPI寄存器
        scpi_reg_val_t registers[SCPI_REG_COUNT];
        //单位表的指针
        const scpi_unit_def_t * units;
        void * user_context;
        //解析器的状态
        scpi_parser_state_t parser_state;
        //*IDN?查询的响应字段
        const char * idn[4];
        size_t arbitrary_reminding;
        //剩余待传输的字节
        size_t arbitrary_remaining;
        //output为自增字段,保存返回结果,提供给程序响应内部输出
        char outPut[1024];
    };
    enum _scpi_array_format_t {