#pragma once #include #include #define MAX_CMD_LEN 12 #define MAX_STRING_LEN 12 #define MAX_LEVEL_COUNT 4 #define MAX_PARAM_COUNT 4 #define ERR_QUEUE_LEN 4 #define MAX_ERROR_LEN 100 /** Argument data types */ typedef enum { SCPI_DT_NONE = 0, SCPI_DT_FLOAT, // float with support for scientific notation SCPI_DT_INT, // integer (may be signed) SCPI_DT_BOOL, // 0, 1, ON, OFF SCPI_DT_STRING, // quoted string, max 12 chars; no escapes. SCPI_DT_BLOB, // binary block, callback: uint32_t holding number of bytes } SCPI_datatype_t; /** Arguemnt value (union) */ typedef union { float FLOAT; int32_t INT; bool BOOL; char STRING[MAX_STRING_LEN]; uint32_t BLOB; } SCPI_argval_t; /** SCPI command preset */ typedef struct { const uint8_t level_cnt; // number of used command levels (colons + 1) const char levels[MAX_LEVEL_COUNT][MAX_CMD_LEN]; // up to 4 parts const uint8_t param_cnt; // parameter count const SCPI_datatype_t params[MAX_PARAM_COUNT]; // parameter types (0 for unused) // called when the command is completed. BLOB arg must be last in the argument list, // and only the first part is collected. void (*callback)(const SCPI_argval_t * args); } SCPI_command_t; extern const uint16_t scpi_cmd_lang_len; // number of commands extern const SCPI_command_t scpi_cmd_lang[]; // --------------- functions -------------------- void scpi_handle_byte(const uint8_t b);