parent
							
								
									15f5d1387f
								
							
						
					
					
						commit
						3bef041547
					
				@ -0,0 +1,64 @@ | 
				
			||||
#include <stdio.h> | 
				
			||||
#include <stdlib.h> | 
				
			||||
#include "scpi_parser.h" | 
				
			||||
 | 
				
			||||
void cmd_aIDNq_cb(const SCPI_argval_t *args); | 
				
			||||
void cmd_APPL_SIN_cb(const SCPI_argval_t *args); | 
				
			||||
void cmd_APPL_TRI_cb(const SCPI_argval_t *args); | 
				
			||||
void cmd_FREQ_cb(const SCPI_argval_t *args); | 
				
			||||
 | 
				
			||||
 | 
				
			||||
const SCPI_command_t scpi_cmd_lang[] = { | 
				
			||||
	{ | 
				
			||||
		.level_cnt = 1, .levels = {"*IDN?"}, | 
				
			||||
		.param_cnt = 0, .params = {}, | 
				
			||||
		.callback = cmd_aIDNq_cb | 
				
			||||
	}, | 
				
			||||
	{ | 
				
			||||
		.level_cnt = 2, .levels = {"APPLy", "SINe"}, | 
				
			||||
		.param_cnt = 3, .params = {SCPI_DT_INT, SCPI_DT_FLOAT, SCPI_DT_FLOAT}, | 
				
			||||
		.callback = cmd_APPL_SIN_cb | 
				
			||||
	}, | 
				
			||||
	{ | 
				
			||||
		.level_cnt = 2, .levels = {"APPLy", "TRIangle"}, | 
				
			||||
		.param_cnt = 3, .params = {SCPI_DT_INT, SCPI_DT_FLOAT, SCPI_DT_FLOAT}, | 
				
			||||
		.callback = cmd_APPL_TRI_cb | 
				
			||||
	}, | 
				
			||||
	{ | 
				
			||||
		.level_cnt = 1, .levels = {"FREQuency"}, | 
				
			||||
		.param_cnt = 1, .params = {SCPI_DT_INT}, | 
				
			||||
		.callback = cmd_FREQ_cb | 
				
			||||
	}, | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void cmd_aIDNq_cb(const SCPI_argval_t *args) | 
				
			||||
{ | 
				
			||||
	printf("cb  *IDN?\n"); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void cmd_APPL_SIN_cb(const SCPI_argval_t *args) | 
				
			||||
{ | 
				
			||||
	printf("cb  APPLy:SINe\n"); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void cmd_APPL_TRI_cb(const SCPI_argval_t *args) | 
				
			||||
{ | 
				
			||||
	printf("cb  APPLy:TRIangle\n"); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void cmd_FREQ_cb(const SCPI_argval_t *args) | 
				
			||||
{ | 
				
			||||
	printf("cb  FREQuency\n"); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
int main(int argc, const char**argv) | 
				
			||||
{ | 
				
			||||
	const char *inp = argv[1]; | 
				
			||||
	printf("cmd lang len = %d\n", (int) sizeof(scpi_cmd_lang)/sizeof(SCPI_command_t)); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,48 @@ | 
				
			||||
#pragma once | 
				
			||||
#include <stdint.h> | 
				
			||||
#include <stdbool.h> | 
				
			||||
 | 
				
			||||
#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 SCPI_command_t scpi_cmd_lang[]; | 
				
			||||
					Loading…
					
					
				
		Reference in new issue