parent
1cec87973c
commit
35732d948e
@ -0,0 +1,321 @@ |
|||||||
|
#include <stdint.h> |
||||||
|
#include <stdbool.h> |
||||||
|
#include <stdio.h> |
||||||
|
#include <stdlib.h> |
||||||
|
|
||||||
|
#include "scpi_builtins.h" |
||||||
|
#include "scpi_parser.h" |
||||||
|
#include "scpi_errors.h" |
||||||
|
#include "scpi_regs.h" |
||||||
|
|
||||||
|
// response buffer
|
||||||
|
static char sbuf[256]; |
||||||
|
|
||||||
|
|
||||||
|
// ---------------- BUILTIN SCPI COMMANDS ------------------
|
||||||
|
|
||||||
|
static void builtin_CLS(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// clear the registers
|
||||||
|
SCPI_REG_SESR.u8 = 0; |
||||||
|
SCPI_REG_OPER.u16 = 0; |
||||||
|
SCPI_REG_QUES.u16 = 0; |
||||||
|
scpi_clear_errors(); |
||||||
|
|
||||||
|
if (scpi_user_CLS) { |
||||||
|
scpi_user_CLS(); |
||||||
|
} |
||||||
|
|
||||||
|
scpi_status_update(); // flags
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_RST(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
if (scpi_user_RST) { |
||||||
|
scpi_user_RST(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_TSTq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
if (scpi_user_TSTq) { |
||||||
|
scpi_user_TSTq(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_IDNq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
scpi_send_string(scpi_device_identifier()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_ESE(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
SCPI_REG_SESR_EN.u8 = (uint8_t) args[0].INT; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_ESEq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
sprintf(sbuf, "%d", SCPI_REG_SESR_EN.u8); |
||||||
|
scpi_send_string(sbuf); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_ESRq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
sprintf(sbuf, "%d", SCPI_REG_SESR.u8); |
||||||
|
scpi_send_string(sbuf); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_OPC(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// implementation for instruments with no overlapping commands.
|
||||||
|
// Can be overridden in the user commands.
|
||||||
|
SCPI_REG_SESR.OPC = 1; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_OPCq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// implementation for instruments with no overlapping commands.
|
||||||
|
// Can be overridden in the user commands.
|
||||||
|
// (would be): sprintf(sbuf, "%d", SCPI_REG_SESR.OPC);
|
||||||
|
|
||||||
|
scpi_send_string("1"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_SRE(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
SCPI_REG_SRE.u8 = (uint8_t) args[0].INT; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_SREq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
sprintf(sbuf, "%d", SCPI_REG_SRE.u8); |
||||||
|
scpi_send_string(sbuf); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_STBq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
sprintf(sbuf, "%d", SCPI_REG_STB.u8); |
||||||
|
scpi_send_string(sbuf); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_WAI(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// no-op
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_SYST_ERRq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_SYST_VERSq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
scpi_send_string(scpi_device_version()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_STAT_OPER_EVENq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_STAT_OPER_CONDq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_STAT_OPER_ENAB(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_STAT_OPER_ENABq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_STAT_QUES_EVENq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_STAT_QUES_CONDq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_STAT_QUES_ENAB(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static void builtin_STAT_QUES_ENABq(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
|
||||||
|
static void builtin_STAT_PRES(const SCPI_argval_t *args) |
||||||
|
{ |
||||||
|
// TODO
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
const SCPI_command_t scpi_commands_builtin[] = { |
||||||
|
// ---- COMMON COMMANDS ----
|
||||||
|
{ |
||||||
|
.levels = {"*CLS"}, |
||||||
|
.callback = builtin_CLS |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"*ESE"}, |
||||||
|
.params = {SCPI_DT_INT}, |
||||||
|
.callback = builtin_ESE |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"*ESE?"}, |
||||||
|
.callback = builtin_ESEq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"*ESR?"}, |
||||||
|
.callback = builtin_ESRq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"*IDN?"}, |
||||||
|
.callback = builtin_IDNq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"*OPC"}, |
||||||
|
.callback = builtin_OPC |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"*OPCq"}, |
||||||
|
.callback = builtin_OPCq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"*RST"}, |
||||||
|
.callback = builtin_RST |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"*SRE"}, |
||||||
|
.params = {SCPI_DT_INT}, |
||||||
|
.callback = builtin_SRE |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"*SRE?"}, |
||||||
|
.callback = builtin_SREq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"*STB?"}, |
||||||
|
.callback = builtin_STBq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"*WAI"}, |
||||||
|
.callback = builtin_WAI |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"*TST?"}, |
||||||
|
.callback = builtin_TSTq |
||||||
|
}, |
||||||
|
|
||||||
|
// ---- REQUIRED SUBSYSTEM COMMANDS ----
|
||||||
|
|
||||||
|
// SYSTem
|
||||||
|
{ |
||||||
|
.levels = {"SYSTem", "ERRor?"}, |
||||||
|
.callback = builtin_SYST_ERRq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"SYSTem", "ERRor", "NEXT?"}, |
||||||
|
.callback = builtin_SYST_ERRq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"SYSTem", "VERSion?"}, |
||||||
|
.callback = builtin_SYST_VERSq |
||||||
|
}, |
||||||
|
// STATus:OPERation
|
||||||
|
{ |
||||||
|
.levels = {"STATus", "OPERation?"}, |
||||||
|
.callback = builtin_STAT_OPER_EVENq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"STATus", "OPERation", "EVENt?"}, |
||||||
|
.callback = builtin_STAT_OPER_EVENq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"STATus", "OPERation", "CONDition?"}, |
||||||
|
.callback = builtin_STAT_OPER_CONDq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"STATus", "OPERation", "ENABle"}, |
||||||
|
.params = {SCPI_DT_BOOL}, |
||||||
|
.callback = builtin_STAT_OPER_ENAB |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"STATus", "OPERation", "ENABle?"}, |
||||||
|
.callback = builtin_STAT_OPER_ENABq |
||||||
|
}, |
||||||
|
// STATus:QUEStionable
|
||||||
|
{ |
||||||
|
.levels = {"STATus", "QUEStionable?"}, |
||||||
|
.callback = builtin_STAT_QUES_EVENq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"STATus", "QUEStionable", "EVENt?"}, |
||||||
|
.callback = builtin_STAT_QUES_EVENq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"STATus", "QUEStionable", "CONDition?"}, |
||||||
|
.callback = builtin_STAT_QUES_CONDq |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"STATus", "QUEStionable", "ENABle"}, |
||||||
|
.params = {SCPI_DT_BOOL}, |
||||||
|
.callback = builtin_STAT_QUES_ENAB |
||||||
|
}, |
||||||
|
{ |
||||||
|
.levels = {"STATus", "QUEStionable", "ENABle?"}, |
||||||
|
.callback = builtin_STAT_QUES_ENABq |
||||||
|
}, |
||||||
|
// STATus:PRESet
|
||||||
|
{ |
||||||
|
.levels = {"STATus", "PRESet"}, |
||||||
|
.callback = builtin_STAT_PRES |
||||||
|
}, |
||||||
|
|
||||||
|
{0} // end marker
|
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,26 @@ |
|||||||
|
#pragma once |
||||||
|
#include <stdint.h> |
||||||
|
#include <stdbool.h> |
||||||
|
|
||||||
|
#include "scpi_parser.h" |
||||||
|
#include "scpi_errors.h" |
||||||
|
#include "scpi_regs.h" |
||||||
|
|
||||||
|
|
||||||
|
/** *CLS command callback - clear non-SCPI device state */ |
||||||
|
extern __attribute__((weak)) void scpi_user_CLS(void); |
||||||
|
|
||||||
|
/** *RST command callback - reset non-SCPI device state */ |
||||||
|
extern __attribute__((weak)) void scpi_user_RST(void); |
||||||
|
|
||||||
|
/** *TST? command callback - perform self test and send response back. */ |
||||||
|
extern __attribute__((weak)) void scpi_user_TSTq(void); |
||||||
|
|
||||||
|
/** Get device *IDN? string. */ |
||||||
|
extern const char *scpi_device_identifier(void); |
||||||
|
|
||||||
|
/** Get device version string. */ |
||||||
|
extern const char *scpi_device_version(void); |
||||||
|
|
||||||
|
// Provides:
|
||||||
|
// const SCPI_command_t scpi_commands_builtin[];
|
Loading…
Reference in new issue