https://github.com/j123b567/scpi-parser

Dependents:   scpi_sx127x scpi_sx127x_firstTest MLX90418_I2C_master

Committer:
dudmuck
Date:
Thu Apr 09 22:42:15 2015 +0000
Revision:
0:aad43948c45c
Child:
1:b497f235115a
SCPI library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:aad43948c45c 1 /*-
dudmuck 0:aad43948c45c 2 * Copyright (c) 2013 Jan Breuer
dudmuck 0:aad43948c45c 3 * Richard.hmm
dudmuck 0:aad43948c45c 4 * Copyright (c) 2012 Jan Breuer
dudmuck 0:aad43948c45c 5 *
dudmuck 0:aad43948c45c 6 * All Rights Reserved
dudmuck 0:aad43948c45c 7 *
dudmuck 0:aad43948c45c 8 * Redistribution and use in source and binary forms, with or without
dudmuck 0:aad43948c45c 9 * modification, are permitted provided that the following conditions are
dudmuck 0:aad43948c45c 10 * met:
dudmuck 0:aad43948c45c 11 * 1. Redistributions of source code must retain the above copyright notice,
dudmuck 0:aad43948c45c 12 * this list of conditions and the following disclaimer.
dudmuck 0:aad43948c45c 13 * 2. Redistributions in binary form must reproduce the above copyright
dudmuck 0:aad43948c45c 14 * notice, this list of conditions and the following disclaimer in the
dudmuck 0:aad43948c45c 15 * documentation and/or other materials provided with the distribution.
dudmuck 0:aad43948c45c 16 *
dudmuck 0:aad43948c45c 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
dudmuck 0:aad43948c45c 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
dudmuck 0:aad43948c45c 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
dudmuck 0:aad43948c45c 20 * DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
dudmuck 0:aad43948c45c 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
dudmuck 0:aad43948c45c 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
dudmuck 0:aad43948c45c 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
dudmuck 0:aad43948c45c 24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
dudmuck 0:aad43948c45c 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
dudmuck 0:aad43948c45c 26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
dudmuck 0:aad43948c45c 27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dudmuck 0:aad43948c45c 28 */
dudmuck 0:aad43948c45c 29
dudmuck 0:aad43948c45c 30 /**
dudmuck 0:aad43948c45c 31 * @file scpi_types.h
dudmuck 0:aad43948c45c 32 * @date Thu Nov 15 10:58:45 UTC 2012
dudmuck 0:aad43948c45c 33 *
dudmuck 0:aad43948c45c 34 * @brief SCPI data types
dudmuck 0:aad43948c45c 35 *
dudmuck 0:aad43948c45c 36 *
dudmuck 0:aad43948c45c 37 */
dudmuck 0:aad43948c45c 38
dudmuck 0:aad43948c45c 39 #ifndef SCPI_TYPES_H
dudmuck 0:aad43948c45c 40 #define SCPI_TYPES_H
dudmuck 0:aad43948c45c 41
dudmuck 0:aad43948c45c 42 #include <stddef.h>
dudmuck 0:aad43948c45c 43 #include <stdint.h>
dudmuck 0:aad43948c45c 44 #include <stdbool.h>
dudmuck 0:aad43948c45c 45
dudmuck 0:aad43948c45c 46 #ifdef __cplusplus
dudmuck 0:aad43948c45c 47 extern "C" {
dudmuck 0:aad43948c45c 48 #endif
dudmuck 0:aad43948c45c 49
dudmuck 0:aad43948c45c 50 #ifndef FALSE
dudmuck 0:aad43948c45c 51 #define FALSE 0
dudmuck 0:aad43948c45c 52 #endif
dudmuck 0:aad43948c45c 53 #ifndef TRUE
dudmuck 0:aad43948c45c 54 #define TRUE (!FALSE)
dudmuck 0:aad43948c45c 55 #endif
dudmuck 0:aad43948c45c 56
dudmuck 0:aad43948c45c 57 /* basic data types */
dudmuck 0:aad43948c45c 58 typedef bool scpi_bool_t;
dudmuck 0:aad43948c45c 59 /* typedef enum { FALSE = 0, TRUE } scpi_bool_t; */
dudmuck 0:aad43948c45c 60
dudmuck 0:aad43948c45c 61 /* IEEE 488.2 registers */
dudmuck 0:aad43948c45c 62 enum _scpi_reg_name_t {
dudmuck 0:aad43948c45c 63 SCPI_REG_STB = 0, /* Status Byte */
dudmuck 0:aad43948c45c 64 SCPI_REG_SRE, /* Service Request Enable Register */
dudmuck 0:aad43948c45c 65 SCPI_REG_ESR, /* Standard Event Status Register (ESR, SESR) */
dudmuck 0:aad43948c45c 66 SCPI_REG_ESE, /* Event Status Enable Register */
dudmuck 0:aad43948c45c 67 SCPI_REG_OPER, /* OPERation Status Register */
dudmuck 0:aad43948c45c 68 SCPI_REG_OPERE, /* OPERation Status Enable Register */
dudmuck 0:aad43948c45c 69 SCPI_REG_QUES, /* QUEStionable status register */
dudmuck 0:aad43948c45c 70 SCPI_REG_QUESE, /* QUEStionable status Enable Register */
dudmuck 0:aad43948c45c 71
dudmuck 0:aad43948c45c 72 /* last definition - number of registers */
dudmuck 0:aad43948c45c 73 SCPI_REG_COUNT
dudmuck 0:aad43948c45c 74 };
dudmuck 0:aad43948c45c 75 typedef enum _scpi_reg_name_t scpi_reg_name_t;
dudmuck 0:aad43948c45c 76
dudmuck 0:aad43948c45c 77 enum _scpi_ctrl_name_t {
dudmuck 0:aad43948c45c 78 SCPI_CTRL_SRQ = 1, /* service request */
dudmuck 0:aad43948c45c 79 SCPI_CTRL_GTL, /* Go to local */
dudmuck 0:aad43948c45c 80 SCPI_CTRL_SDC, /* Selected device clear */
dudmuck 0:aad43948c45c 81 SCPI_CTRL_PPC, /* Parallel poll configure */
dudmuck 0:aad43948c45c 82 SCPI_CTRL_GET, /* Group execute trigger */
dudmuck 0:aad43948c45c 83 SCPI_CTRL_TCT, /* Take control */
dudmuck 0:aad43948c45c 84 SCPI_CTRL_LLO, /* Device clear */
dudmuck 0:aad43948c45c 85 SCPI_CTRL_DCL, /* Local lockout */
dudmuck 0:aad43948c45c 86 SCPI_CTRL_PPU, /* Parallel poll unconfigure */
dudmuck 0:aad43948c45c 87 SCPI_CTRL_SPE, /* Serial poll enable */
dudmuck 0:aad43948c45c 88 SCPI_CTRL_SPD, /* Serial poll disable */
dudmuck 0:aad43948c45c 89 SCPI_CTRL_MLA, /* My local address */
dudmuck 0:aad43948c45c 90 SCPI_CTRL_UNL, /* Unlisten */
dudmuck 0:aad43948c45c 91 SCPI_CTRL_MTA, /* My talk address */
dudmuck 0:aad43948c45c 92 SCPI_CTRL_UNT, /* Untalk */
dudmuck 0:aad43948c45c 93 SCPI_CTRL_MSA /* My secondary address */
dudmuck 0:aad43948c45c 94 };
dudmuck 0:aad43948c45c 95 typedef enum _scpi_ctrl_name_t scpi_ctrl_name_t;
dudmuck 0:aad43948c45c 96
dudmuck 0:aad43948c45c 97 typedef uint16_t scpi_reg_val_t;
dudmuck 0:aad43948c45c 98
dudmuck 0:aad43948c45c 99 /* scpi commands */
dudmuck 0:aad43948c45c 100 enum _scpi_result_t {
dudmuck 0:aad43948c45c 101 SCPI_RES_OK = 1,
dudmuck 0:aad43948c45c 102 SCPI_RES_ERR = -1
dudmuck 0:aad43948c45c 103 };
dudmuck 0:aad43948c45c 104 typedef enum _scpi_result_t scpi_result_t;
dudmuck 0:aad43948c45c 105
dudmuck 0:aad43948c45c 106 typedef struct _scpi_command_t scpi_command_t;
dudmuck 0:aad43948c45c 107
dudmuck 0:aad43948c45c 108 struct _scpi_buffer_t {
dudmuck 0:aad43948c45c 109 size_t length;
dudmuck 0:aad43948c45c 110 size_t position;
dudmuck 0:aad43948c45c 111 char * data;
dudmuck 0:aad43948c45c 112 };
dudmuck 0:aad43948c45c 113 typedef struct _scpi_buffer_t scpi_buffer_t;
dudmuck 0:aad43948c45c 114
dudmuck 0:aad43948c45c 115 struct _scpi_const_buffer_t {
dudmuck 0:aad43948c45c 116 size_t length;
dudmuck 0:aad43948c45c 117 size_t position;
dudmuck 0:aad43948c45c 118 const char * data;
dudmuck 0:aad43948c45c 119 };
dudmuck 0:aad43948c45c 120 typedef struct _scpi_const_buffer_t scpi_const_buffer_t;
dudmuck 0:aad43948c45c 121
dudmuck 0:aad43948c45c 122 struct _scpi_param_list_t {
dudmuck 0:aad43948c45c 123 const scpi_command_t * cmd;
dudmuck 0:aad43948c45c 124 const char * parameters;
dudmuck 0:aad43948c45c 125 size_t length;
dudmuck 0:aad43948c45c 126 scpi_const_buffer_t cmd_raw;
dudmuck 0:aad43948c45c 127 };
dudmuck 0:aad43948c45c 128 #define SCPI_CMD_LIST_END {NULL, NULL, }
dudmuck 0:aad43948c45c 129 typedef struct _scpi_param_list_t scpi_param_list_t;
dudmuck 0:aad43948c45c 130
dudmuck 0:aad43948c45c 131 /* scpi interface */
dudmuck 0:aad43948c45c 132 typedef struct _scpi_t scpi_t;
dudmuck 0:aad43948c45c 133 typedef struct _scpi_interface_t scpi_interface_t;
dudmuck 0:aad43948c45c 134
dudmuck 0:aad43948c45c 135 typedef size_t(*scpi_write_t)(scpi_t * context, const char * data, size_t len);
dudmuck 0:aad43948c45c 136 typedef scpi_result_t(*scpi_write_control_t)(scpi_t * context, scpi_ctrl_name_t ctrl, scpi_reg_val_t val);
dudmuck 0:aad43948c45c 137 typedef int (*scpi_error_callback_t)(scpi_t * context, int_fast16_t error);
dudmuck 0:aad43948c45c 138
dudmuck 0:aad43948c45c 139 typedef scpi_result_t(*scpi_command_callback_t)(scpi_t *);
dudmuck 0:aad43948c45c 140
dudmuck 0:aad43948c45c 141 /* scpi error queue */
dudmuck 0:aad43948c45c 142 typedef void * scpi_error_queue_t;
dudmuck 0:aad43948c45c 143
dudmuck 0:aad43948c45c 144 /* scpi units */
dudmuck 0:aad43948c45c 145 enum _scpi_unit_t {
dudmuck 0:aad43948c45c 146 SCPI_UNIT_NONE,
dudmuck 0:aad43948c45c 147 SCPI_UNIT_VOLT,
dudmuck 0:aad43948c45c 148 SCPI_UNIT_AMPER,
dudmuck 0:aad43948c45c 149 SCPI_UNIT_OHM,
dudmuck 0:aad43948c45c 150 SCPI_UNIT_HERTZ,
dudmuck 0:aad43948c45c 151 SCPI_UNIT_CELSIUS,
dudmuck 0:aad43948c45c 152 SCPI_UNIT_SECONDS,
dudmuck 0:aad43948c45c 153 SCPI_UNIT_DISTANCE
dudmuck 0:aad43948c45c 154 };
dudmuck 0:aad43948c45c 155 typedef enum _scpi_unit_t scpi_unit_t;
dudmuck 0:aad43948c45c 156
dudmuck 0:aad43948c45c 157 struct _scpi_unit_def_t {
dudmuck 0:aad43948c45c 158 const char * name;
dudmuck 0:aad43948c45c 159 scpi_unit_t unit;
dudmuck 0:aad43948c45c 160 double mult;
dudmuck 0:aad43948c45c 161 };
dudmuck 0:aad43948c45c 162 #define SCPI_UNITS_LIST_END {NULL, SCPI_UNIT_NONE, 0}
dudmuck 0:aad43948c45c 163 typedef struct _scpi_unit_def_t scpi_unit_def_t;
dudmuck 0:aad43948c45c 164
dudmuck 0:aad43948c45c 165 enum _scpi_special_number_t {
dudmuck 0:aad43948c45c 166 SCPI_NUM_NUMBER,
dudmuck 0:aad43948c45c 167 SCPI_NUM_MIN,
dudmuck 0:aad43948c45c 168 SCPI_NUM_MAX,
dudmuck 0:aad43948c45c 169 SCPI_NUM_DEF,
dudmuck 0:aad43948c45c 170 SCPI_NUM_UP,
dudmuck 0:aad43948c45c 171 SCPI_NUM_DOWN,
dudmuck 0:aad43948c45c 172 SCPI_NUM_NAN,
dudmuck 0:aad43948c45c 173 SCPI_NUM_INF,
dudmuck 0:aad43948c45c 174 SCPI_NUM_NINF,
dudmuck 0:aad43948c45c 175 SCPI_NUM_AUTO
dudmuck 0:aad43948c45c 176 };
dudmuck 0:aad43948c45c 177 typedef enum _scpi_special_number_t scpi_special_number_t;
dudmuck 0:aad43948c45c 178
dudmuck 0:aad43948c45c 179 struct _scpi_special_number_def_t {
dudmuck 0:aad43948c45c 180 const char * name;
dudmuck 0:aad43948c45c 181 scpi_special_number_t type;
dudmuck 0:aad43948c45c 182 };
dudmuck 0:aad43948c45c 183 #define SCPI_SPECIAL_NUMBERS_LIST_END {NULL, SCPI_NUM_NUMBER}
dudmuck 0:aad43948c45c 184 typedef struct _scpi_special_number_def_t scpi_special_number_def_t;
dudmuck 0:aad43948c45c 185
dudmuck 0:aad43948c45c 186 struct _scpi_number_t {
dudmuck 0:aad43948c45c 187 double value;
dudmuck 0:aad43948c45c 188 scpi_unit_t unit;
dudmuck 0:aad43948c45c 189 scpi_special_number_t type;
dudmuck 0:aad43948c45c 190 };
dudmuck 0:aad43948c45c 191 typedef struct _scpi_number_t scpi_number_t;
dudmuck 0:aad43948c45c 192
dudmuck 0:aad43948c45c 193 struct _scpi_command_t {
dudmuck 0:aad43948c45c 194 const char * pattern;
dudmuck 0:aad43948c45c 195 scpi_command_callback_t callback;
dudmuck 0:aad43948c45c 196 };
dudmuck 0:aad43948c45c 197
dudmuck 0:aad43948c45c 198 struct _scpi_interface_t {
dudmuck 0:aad43948c45c 199 scpi_error_callback_t error;
dudmuck 0:aad43948c45c 200 scpi_write_t write;
dudmuck 0:aad43948c45c 201 scpi_write_control_t control;
dudmuck 0:aad43948c45c 202 scpi_command_callback_t flush;
dudmuck 0:aad43948c45c 203 scpi_command_callback_t reset;
dudmuck 0:aad43948c45c 204 scpi_command_callback_t test;
dudmuck 0:aad43948c45c 205 };
dudmuck 0:aad43948c45c 206
dudmuck 0:aad43948c45c 207 struct _scpi_t {
dudmuck 0:aad43948c45c 208 const scpi_command_t * cmdlist;
dudmuck 0:aad43948c45c 209 scpi_buffer_t buffer;
dudmuck 0:aad43948c45c 210 scpi_param_list_t paramlist;
dudmuck 0:aad43948c45c 211 scpi_interface_t * interface;
dudmuck 0:aad43948c45c 212 int_fast16_t output_count;
dudmuck 0:aad43948c45c 213 int_fast16_t input_count;
dudmuck 0:aad43948c45c 214 scpi_bool_t cmd_error;
dudmuck 0:aad43948c45c 215 scpi_error_queue_t error_queue;
dudmuck 0:aad43948c45c 216 scpi_reg_val_t * registers;
dudmuck 0:aad43948c45c 217 const scpi_unit_def_t * units;
dudmuck 0:aad43948c45c 218 const scpi_special_number_def_t * special_numbers;
dudmuck 0:aad43948c45c 219 void * user_context;
dudmuck 0:aad43948c45c 220 const char * idn[4];
dudmuck 0:aad43948c45c 221 };
dudmuck 0:aad43948c45c 222
dudmuck 0:aad43948c45c 223 #ifdef __cplusplus
dudmuck 0:aad43948c45c 224 }
dudmuck 0:aad43948c45c 225 #endif
dudmuck 0:aad43948c45c 226
dudmuck 0:aad43948c45c 227 #endif /* SCPI_TYPES_H */
dudmuck 0:aad43948c45c 228