SCPI parser and status register model implementation (device side) written in C
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
scpi_parser/main.c

96 lines
2.2 KiB

#include <stdio.h>
#include <string.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);
void cmd_DISP_TEXT_cb(const SCPI_argval_t *args);
const SCPI_command_t scpi_cmd_lang[] = {
{
.levels = {"*IDN?"},
.params = {},
.callback = cmd_aIDNq_cb
},
{
.levels = {"APPLy", "SINe"},
.params = {SCPI_DT_INT, SCPI_DT_FLOAT, SCPI_DT_FLOAT},
.callback = cmd_APPL_SIN_cb
},
{
.levels = {"APPLy", "TRIangle"},
.params = {SCPI_DT_INT, SCPI_DT_FLOAT, SCPI_DT_FLOAT},
.callback = cmd_APPL_TRI_cb
},
{
.levels = {"FREQuency"},
.params = {SCPI_DT_INT},
.callback = cmd_FREQ_cb
},
{
.levels = {"DISPlay", "TEXT"},
.params = {SCPI_DT_STRING, SCPI_DT_BOOL},
.callback = cmd_DISP_TEXT_cb
},
{0} // mark end
};
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 %d\n", args[0].INT);
}
void cmd_DISP_TEXT_cb(const SCPI_argval_t *args)
{
printf("cb DISPlay:TEXT %s, %d\n", args[0].STRING, args[1].BOOL);
}
int main()
{
// const char *inp = "*IDN?\n";
// const char *inp = "FREQ 50\n";
const char *inp = "DISPlay:TEXT 'banana', OFF\nFUBAR moo fuck\r\nFREQ 50\r\n";
for (int i = 0; i < strlen(inp); i++) {
scpi_handle_byte(inp[i]);
}
// printf("%d\n", char_equals_ci('a','A'));
// printf("%d\n", char_equals_ci('z','z'));
// printf("%d\n", char_equals_ci('z','Z'));
// printf("%d\n", char_equals_ci('M','M'));
// printf("%d\n", char_equals_ci('M','q'));
// printf("%d\n", char_equals_ci('*','*'));
// printf("%d\n", char_equals_ci('a',' '));
// printf("%d\n", level_str_matches("A","A"));
// printf("%d\n", level_str_matches("AbCdE","ABCDE"));
// printf("%d\n", level_str_matches("*IDN?","*IDN?"));
// printf("%d\n", level_str_matches("*IDN?","*IDN"));
// printf("%d\n", level_str_matches("MEAS","MEASure"));
//printf("%d\n", level_str_matches("*FBAZ?","*FxyzBAZ?"));
}