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

Dependents:   scpi_sx127x scpi_sx127x_firstTest MLX90418_I2C_master

Committer:
dudmuck
Date:
Fri Aug 07 21:54:11 2015 +0000
Revision:
1:b497f235115a
Parent:
0:aad43948c45c
update from github commit 6e5e3e0e3fc450eaf53feee059824ad85c4f270d

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 1:b497f235115a 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 1:b497f235115a 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 1:b497f235115a 33 *
dudmuck 0:aad43948c45c 34 * @brief SCPI data types
dudmuck 1:b497f235115a 35 *
dudmuck 1:b497f235115a 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 1:b497f235115a 44 #include "scpi/config.h"
dudmuck 1:b497f235115a 45
dudmuck 1:b497f235115a 46 #if HAVE_STDBOOL
dudmuck 0:aad43948c45c 47 #include <stdbool.h>
dudmuck 1:b497f235115a 48 #endif
dudmuck 0:aad43948c45c 49
dudmuck 0:aad43948c45c 50 #ifdef __cplusplus
dudmuck 0:aad43948c45c 51 extern "C" {
dudmuck 0:aad43948c45c 52 #endif
dudmuck 0:aad43948c45c 53
dudmuck 1:b497f235115a 54 #if !HAVE_STDBOOL
dudmuck 1:b497f235115a 55 typedef unsigned char bool;
dudmuck 1:b497f235115a 56 #endif
dudmuck 1:b497f235115a 57
dudmuck 0:aad43948c45c 58 #ifndef FALSE
dudmuck 0:aad43948c45c 59 #define FALSE 0
dudmuck 0:aad43948c45c 60 #endif
dudmuck 0:aad43948c45c 61 #ifndef TRUE
dudmuck 0:aad43948c45c 62 #define TRUE (!FALSE)
dudmuck 0:aad43948c45c 63 #endif
dudmuck 0:aad43948c45c 64
dudmuck 0:aad43948c45c 65 /* basic data types */
dudmuck 0:aad43948c45c 66 typedef bool scpi_bool_t;
dudmuck 0:aad43948c45c 67 /* typedef enum { FALSE = 0, TRUE } scpi_bool_t; */
dudmuck 0:aad43948c45c 68
dudmuck 0:aad43948c45c 69 /* IEEE 488.2 registers */
dudmuck 0:aad43948c45c 70 enum _scpi_reg_name_t {
dudmuck 0:aad43948c45c 71 SCPI_REG_STB = 0, /* Status Byte */
dudmuck 1:b497f235115a 72 SCPI_REG_SRE, /* Service Request Enable Register */
dudmuck 1:b497f235115a 73 SCPI_REG_ESR, /* Standard Event Status Register (ESR, SESR) */
dudmuck 1:b497f235115a 74 SCPI_REG_ESE, /* Event Status Enable Register */
dudmuck 1:b497f235115a 75 SCPI_REG_OPER, /* OPERation Status Register */
dudmuck 1:b497f235115a 76 SCPI_REG_OPERE, /* OPERation Status Enable Register */
dudmuck 1:b497f235115a 77 SCPI_REG_QUES, /* QUEStionable status register */
dudmuck 1:b497f235115a 78 SCPI_REG_QUESE, /* QUEStionable status Enable Register */
dudmuck 0:aad43948c45c 79
dudmuck 0:aad43948c45c 80 /* last definition - number of registers */
dudmuck 0:aad43948c45c 81 SCPI_REG_COUNT
dudmuck 0:aad43948c45c 82 };
dudmuck 0:aad43948c45c 83 typedef enum _scpi_reg_name_t scpi_reg_name_t;
dudmuck 0:aad43948c45c 84
dudmuck 0:aad43948c45c 85 enum _scpi_ctrl_name_t {
dudmuck 0:aad43948c45c 86 SCPI_CTRL_SRQ = 1, /* service request */
dudmuck 1:b497f235115a 87 SCPI_CTRL_GTL, /* Go to local */
dudmuck 1:b497f235115a 88 SCPI_CTRL_SDC, /* Selected device clear */
dudmuck 1:b497f235115a 89 SCPI_CTRL_PPC, /* Parallel poll configure */
dudmuck 1:b497f235115a 90 SCPI_CTRL_GET, /* Group execute trigger */
dudmuck 1:b497f235115a 91 SCPI_CTRL_TCT, /* Take control */
dudmuck 1:b497f235115a 92 SCPI_CTRL_LLO, /* Device clear */
dudmuck 1:b497f235115a 93 SCPI_CTRL_DCL, /* Local lockout */
dudmuck 1:b497f235115a 94 SCPI_CTRL_PPU, /* Parallel poll unconfigure */
dudmuck 1:b497f235115a 95 SCPI_CTRL_SPE, /* Serial poll enable */
dudmuck 1:b497f235115a 96 SCPI_CTRL_SPD, /* Serial poll disable */
dudmuck 1:b497f235115a 97 SCPI_CTRL_MLA, /* My local address */
dudmuck 1:b497f235115a 98 SCPI_CTRL_UNL, /* Unlisten */
dudmuck 1:b497f235115a 99 SCPI_CTRL_MTA, /* My talk address */
dudmuck 1:b497f235115a 100 SCPI_CTRL_UNT, /* Untalk */
dudmuck 1:b497f235115a 101 SCPI_CTRL_MSA /* My secondary address */
dudmuck 0:aad43948c45c 102 };
dudmuck 0:aad43948c45c 103 typedef enum _scpi_ctrl_name_t scpi_ctrl_name_t;
dudmuck 0:aad43948c45c 104
dudmuck 0:aad43948c45c 105 typedef uint16_t scpi_reg_val_t;
dudmuck 0:aad43948c45c 106
dudmuck 0:aad43948c45c 107 /* scpi commands */
dudmuck 0:aad43948c45c 108 enum _scpi_result_t {
dudmuck 0:aad43948c45c 109 SCPI_RES_OK = 1,
dudmuck 0:aad43948c45c 110 SCPI_RES_ERR = -1
dudmuck 0:aad43948c45c 111 };
dudmuck 0:aad43948c45c 112 typedef enum _scpi_result_t scpi_result_t;
dudmuck 0:aad43948c45c 113
dudmuck 0:aad43948c45c 114 typedef struct _scpi_command_t scpi_command_t;
dudmuck 0:aad43948c45c 115
dudmuck 1:b497f235115a 116 #define SCPI_CMD_LIST_END {NULL, NULL, 0}
dudmuck 1:b497f235115a 117
dudmuck 1:b497f235115a 118 /* scpi interface */
dudmuck 1:b497f235115a 119 typedef struct _scpi_t scpi_t;
dudmuck 1:b497f235115a 120 typedef struct _scpi_interface_t scpi_interface_t;
dudmuck 1:b497f235115a 121
dudmuck 0:aad43948c45c 122 struct _scpi_buffer_t {
dudmuck 0:aad43948c45c 123 size_t length;
dudmuck 0:aad43948c45c 124 size_t position;
dudmuck 0:aad43948c45c 125 char * data;
dudmuck 0:aad43948c45c 126 };
dudmuck 0:aad43948c45c 127 typedef struct _scpi_buffer_t scpi_buffer_t;
dudmuck 1:b497f235115a 128
dudmuck 0:aad43948c45c 129 struct _scpi_const_buffer_t {
dudmuck 0:aad43948c45c 130 size_t length;
dudmuck 0:aad43948c45c 131 size_t position;
dudmuck 0:aad43948c45c 132 const char * data;
dudmuck 0:aad43948c45c 133 };
dudmuck 1:b497f235115a 134 typedef struct _scpi_const_buffer_t scpi_const_buffer_t;
dudmuck 0:aad43948c45c 135
dudmuck 0:aad43948c45c 136 typedef size_t(*scpi_write_t)(scpi_t * context, const char * data, size_t len);
dudmuck 0:aad43948c45c 137 typedef scpi_result_t(*scpi_write_control_t)(scpi_t * context, scpi_ctrl_name_t ctrl, scpi_reg_val_t val);
dudmuck 0:aad43948c45c 138 typedef int (*scpi_error_callback_t)(scpi_t * context, int_fast16_t error);
dudmuck 0:aad43948c45c 139
dudmuck 1:b497f235115a 140 /* scpi lexer */
dudmuck 1:b497f235115a 141 enum _scpi_token_type_t {
dudmuck 1:b497f235115a 142 SCPI_TOKEN_COMMA,
dudmuck 1:b497f235115a 143 SCPI_TOKEN_SEMICOLON,
dudmuck 1:b497f235115a 144 SCPI_TOKEN_QUESTION,
dudmuck 1:b497f235115a 145 SCPI_TOKEN_NL,
dudmuck 1:b497f235115a 146 SCPI_TOKEN_HEXNUM,
dudmuck 1:b497f235115a 147 SCPI_TOKEN_OCTNUM,
dudmuck 1:b497f235115a 148 SCPI_TOKEN_BINNUM,
dudmuck 1:b497f235115a 149 SCPI_TOKEN_PROGRAM_MNEMONIC,
dudmuck 1:b497f235115a 150 SCPI_TOKEN_DECIMAL_NUMERIC_PROGRAM_DATA,
dudmuck 1:b497f235115a 151 SCPI_TOKEN_DECIMAL_NUMERIC_PROGRAM_DATA_WITH_SUFFIX,
dudmuck 1:b497f235115a 152 SCPI_TOKEN_SUFFIX_PROGRAM_DATA,
dudmuck 1:b497f235115a 153 SCPI_TOKEN_ARBITRARY_BLOCK_PROGRAM_DATA,
dudmuck 1:b497f235115a 154 SCPI_TOKEN_SINGLE_QUOTE_PROGRAM_DATA,
dudmuck 1:b497f235115a 155 SCPI_TOKEN_DOUBLE_QUOTE_PROGRAM_DATA,
dudmuck 1:b497f235115a 156 SCPI_TOKEN_PROGRAM_EXPRESSION,
dudmuck 1:b497f235115a 157 SCPI_TOKEN_COMPOUND_PROGRAM_HEADER,
dudmuck 1:b497f235115a 158 SCPI_TOKEN_INCOMPLETE_COMPOUND_PROGRAM_HEADER,
dudmuck 1:b497f235115a 159 SCPI_TOKEN_COMMON_PROGRAM_HEADER,
dudmuck 1:b497f235115a 160 SCPI_TOKEN_INCOMPLETE_COMMON_PROGRAM_HEADER,
dudmuck 1:b497f235115a 161 SCPI_TOKEN_COMPOUND_QUERY_PROGRAM_HEADER,
dudmuck 1:b497f235115a 162 SCPI_TOKEN_COMMON_QUERY_PROGRAM_HEADER,
dudmuck 1:b497f235115a 163 SCPI_TOKEN_WS,
dudmuck 1:b497f235115a 164 SCPI_TOKEN_ALL_PROGRAM_DATA,
dudmuck 1:b497f235115a 165 SCPI_TOKEN_INVALID,
dudmuck 1:b497f235115a 166 SCPI_TOKEN_UNKNOWN,
dudmuck 1:b497f235115a 167 };
dudmuck 1:b497f235115a 168 typedef enum _scpi_token_type_t scpi_token_type_t;
dudmuck 1:b497f235115a 169
dudmuck 1:b497f235115a 170 struct _scpi_token_t {
dudmuck 1:b497f235115a 171 scpi_token_type_t type;
dudmuck 1:b497f235115a 172 char * ptr;
dudmuck 1:b497f235115a 173 int len;
dudmuck 1:b497f235115a 174 };
dudmuck 1:b497f235115a 175 typedef struct _scpi_token_t scpi_token_t;
dudmuck 1:b497f235115a 176
dudmuck 1:b497f235115a 177 struct _lex_state_t {
dudmuck 1:b497f235115a 178 char * buffer;
dudmuck 1:b497f235115a 179 char * pos;
dudmuck 1:b497f235115a 180 int len;
dudmuck 1:b497f235115a 181 };
dudmuck 1:b497f235115a 182 typedef struct _lex_state_t lex_state_t;
dudmuck 1:b497f235115a 183
dudmuck 1:b497f235115a 184 /* scpi parser */
dudmuck 1:b497f235115a 185 enum _message_termination_t {
dudmuck 1:b497f235115a 186 SCPI_MESSAGE_TERMINATION_NONE,
dudmuck 1:b497f235115a 187 SCPI_MESSAGE_TERMINATION_NL,
dudmuck 1:b497f235115a 188 SCPI_MESSAGE_TERMINATION_SEMICOLON,
dudmuck 1:b497f235115a 189 };
dudmuck 1:b497f235115a 190 typedef enum _message_termination_t message_termination_t;
dudmuck 1:b497f235115a 191
dudmuck 1:b497f235115a 192 struct _scpi_parser_state_t {
dudmuck 1:b497f235115a 193 scpi_token_t programHeader;
dudmuck 1:b497f235115a 194 scpi_token_t programData;
dudmuck 1:b497f235115a 195 int numberOfParameters;
dudmuck 1:b497f235115a 196 message_termination_t termination;
dudmuck 1:b497f235115a 197 };
dudmuck 1:b497f235115a 198 typedef struct _scpi_parser_state_t scpi_parser_state_t;
dudmuck 1:b497f235115a 199
dudmuck 0:aad43948c45c 200 typedef scpi_result_t(*scpi_command_callback_t)(scpi_t *);
dudmuck 0:aad43948c45c 201
dudmuck 0:aad43948c45c 202 /* scpi error queue */
dudmuck 0:aad43948c45c 203 typedef void * scpi_error_queue_t;
dudmuck 0:aad43948c45c 204
dudmuck 0:aad43948c45c 205 /* scpi units */
dudmuck 0:aad43948c45c 206 enum _scpi_unit_t {
dudmuck 0:aad43948c45c 207 SCPI_UNIT_NONE,
dudmuck 0:aad43948c45c 208 SCPI_UNIT_VOLT,
dudmuck 0:aad43948c45c 209 SCPI_UNIT_AMPER,
dudmuck 0:aad43948c45c 210 SCPI_UNIT_OHM,
dudmuck 0:aad43948c45c 211 SCPI_UNIT_HERTZ,
dudmuck 0:aad43948c45c 212 SCPI_UNIT_CELSIUS,
dudmuck 0:aad43948c45c 213 SCPI_UNIT_SECONDS,
dudmuck 0:aad43948c45c 214 SCPI_UNIT_DISTANCE
dudmuck 0:aad43948c45c 215 };
dudmuck 0:aad43948c45c 216 typedef enum _scpi_unit_t scpi_unit_t;
dudmuck 0:aad43948c45c 217
dudmuck 0:aad43948c45c 218 struct _scpi_unit_def_t {
dudmuck 0:aad43948c45c 219 const char * name;
dudmuck 0:aad43948c45c 220 scpi_unit_t unit;
dudmuck 0:aad43948c45c 221 double mult;
dudmuck 0:aad43948c45c 222 };
dudmuck 1:b497f235115a 223 #define SCPI_UNITS_LIST_END {NULL, SCPI_UNIT_NONE, 0}
dudmuck 0:aad43948c45c 224 typedef struct _scpi_unit_def_t scpi_unit_def_t;
dudmuck 0:aad43948c45c 225
dudmuck 0:aad43948c45c 226 enum _scpi_special_number_t {
dudmuck 0:aad43948c45c 227 SCPI_NUM_NUMBER,
dudmuck 0:aad43948c45c 228 SCPI_NUM_MIN,
dudmuck 0:aad43948c45c 229 SCPI_NUM_MAX,
dudmuck 0:aad43948c45c 230 SCPI_NUM_DEF,
dudmuck 0:aad43948c45c 231 SCPI_NUM_UP,
dudmuck 0:aad43948c45c 232 SCPI_NUM_DOWN,
dudmuck 0:aad43948c45c 233 SCPI_NUM_NAN,
dudmuck 0:aad43948c45c 234 SCPI_NUM_INF,
dudmuck 0:aad43948c45c 235 SCPI_NUM_NINF,
dudmuck 0:aad43948c45c 236 SCPI_NUM_AUTO
dudmuck 0:aad43948c45c 237 };
dudmuck 0:aad43948c45c 238 typedef enum _scpi_special_number_t scpi_special_number_t;
dudmuck 0:aad43948c45c 239
dudmuck 1:b497f235115a 240 struct _scpi_choice_def_t {
dudmuck 0:aad43948c45c 241 const char * name;
dudmuck 1:b497f235115a 242 int32_t tag;
dudmuck 0:aad43948c45c 243 };
dudmuck 1:b497f235115a 244 #define SCPI_CHOICE_LIST_END {NULL, -1}
dudmuck 1:b497f235115a 245 typedef struct _scpi_choice_def_t scpi_choice_def_t;
dudmuck 1:b497f235115a 246
dudmuck 1:b497f235115a 247 struct _scpi_param_list_t {
dudmuck 1:b497f235115a 248 const scpi_command_t * cmd;
dudmuck 1:b497f235115a 249 lex_state_t lex_state;
dudmuck 1:b497f235115a 250 scpi_const_buffer_t cmd_raw;
dudmuck 1:b497f235115a 251 };
dudmuck 1:b497f235115a 252 typedef struct _scpi_param_list_t scpi_param_list_t;
dudmuck 0:aad43948c45c 253
dudmuck 1:b497f235115a 254 struct _scpi_number_parameter_t {
dudmuck 1:b497f235115a 255 scpi_bool_t special;
dudmuck 1:b497f235115a 256 union {
dudmuck 1:b497f235115a 257 double value;
dudmuck 1:b497f235115a 258 int32_t tag;
dudmuck 1:b497f235115a 259 };
dudmuck 0:aad43948c45c 260 scpi_unit_t unit;
dudmuck 1:b497f235115a 261 int8_t base;
dudmuck 0:aad43948c45c 262 };
dudmuck 1:b497f235115a 263 typedef struct _scpi_number_parameter_t scpi_number_t;
dudmuck 1:b497f235115a 264
dudmuck 1:b497f235115a 265 struct _scpi_data_parameter_t {
dudmuck 1:b497f235115a 266 const char * ptr;
dudmuck 1:b497f235115a 267 int32_t len;
dudmuck 1:b497f235115a 268 };
dudmuck 1:b497f235115a 269 typedef struct _scpi_data_parameter_t scpi_data_parameter_t;
dudmuck 1:b497f235115a 270
dudmuck 1:b497f235115a 271 typedef scpi_token_t scpi_parameter_t;
dudmuck 0:aad43948c45c 272
dudmuck 0:aad43948c45c 273 struct _scpi_command_t {
dudmuck 0:aad43948c45c 274 const char * pattern;
dudmuck 0:aad43948c45c 275 scpi_command_callback_t callback;
dudmuck 1:b497f235115a 276 int32_t tag;
dudmuck 0:aad43948c45c 277 };
dudmuck 0:aad43948c45c 278
dudmuck 0:aad43948c45c 279 struct _scpi_interface_t {
dudmuck 0:aad43948c45c 280 scpi_error_callback_t error;
dudmuck 0:aad43948c45c 281 scpi_write_t write;
dudmuck 0:aad43948c45c 282 scpi_write_control_t control;
dudmuck 0:aad43948c45c 283 scpi_command_callback_t flush;
dudmuck 0:aad43948c45c 284 scpi_command_callback_t reset;
dudmuck 0:aad43948c45c 285 };
dudmuck 0:aad43948c45c 286
dudmuck 0:aad43948c45c 287 struct _scpi_t {
dudmuck 0:aad43948c45c 288 const scpi_command_t * cmdlist;
dudmuck 0:aad43948c45c 289 scpi_buffer_t buffer;
dudmuck 1:b497f235115a 290 scpi_param_list_t param_list;
dudmuck 0:aad43948c45c 291 scpi_interface_t * interface;
dudmuck 0:aad43948c45c 292 int_fast16_t output_count;
dudmuck 0:aad43948c45c 293 int_fast16_t input_count;
dudmuck 0:aad43948c45c 294 scpi_bool_t cmd_error;
dudmuck 0:aad43948c45c 295 scpi_error_queue_t error_queue;
dudmuck 0:aad43948c45c 296 scpi_reg_val_t * registers;
dudmuck 0:aad43948c45c 297 const scpi_unit_def_t * units;
dudmuck 0:aad43948c45c 298 void * user_context;
dudmuck 1:b497f235115a 299 scpi_parser_state_t parser_state;
dudmuck 0:aad43948c45c 300 const char * idn[4];
dudmuck 0:aad43948c45c 301 };
dudmuck 0:aad43948c45c 302
dudmuck 0:aad43948c45c 303 #ifdef __cplusplus
dudmuck 0:aad43948c45c 304 }
dudmuck 0:aad43948c45c 305 #endif
dudmuck 0:aad43948c45c 306
dudmuck 0:aad43948c45c 307 #endif /* SCPI_TYPES_H */