18#ifdef __AMU_USE_SCPI__
28#define SCPI_Param_amu_pid_t(c, v, b) SCPI_ParamArrayFloat(c, v, 3, &o_count, SCPI_FORMAT_ASCII, b)
29#define SCPI_Result_amu_pid_t(c, v) SCPI_ResultArrayFloat(c, (float *)&(v), 3, SCPI_FORMAT_ASCII)
31#define SCPI_Param_amu_coeff_t(c, v, b) SCPI_ParamArrayFloat(c, v, 4, &o_count, SCPI_FORMAT_ASCII, b)
32#define SCPI_Result_amu_coeff_t(c, v) SCPI_ResultArrayFloat(c, (float *)&(v), 4, SCPI_FORMAT_ASCII)
34#define SCPI_Param_amu_notes_t(c, v, b) SCPI_ParamCopyText(c, v, AMU_NOTES_SIZE, &o_count, b)
35#define SCPI_Result_amu_notes_t(c, v) SCPI_ResultText(c, (char *)v)
37#define SCPI_Param_ss_angle_t(c, v, b) SCPI_ParamArrayFloat(c, v, 6, &o_count, SCPI_FORMAT_ASCII, b)
38#define SCPI_Result_ss_angle_t(c, v) SCPI_ResultArrayFloat(c, (float *)&(v), 6, SCPI_FORMAT_ASCII)
40#define SCPI_Param_press_data_t(c, v, b) SCPI_ParamArrayFloat(c, v, 4, &o_count, SCPI_FORMAT_ASCII, b)
41#define SCPI_Result_press_data_t(c, v) SCPI_ResultArrayFloat(c, (float *)&(v), 4, SCPI_FORMAT_ASCII)
43#define SCPI_Param_amu_int_volt_t(c, v, b) SCPI_ParamArrayFloat(c, v, 4, &o_count, SCPI_FORMAT_ASCII, b)
44#define SCPI_Result_amu_int_volt_t(c, v) SCPI_ResultArrayFloat(c, (float *)&(v), 4, SCPI_FORMAT_ASCII)
46#define SCPI_Param_amu_meas_t(c, v, b) SCPI_ParamArrayFloat(c, v, 2, &o_count, SCPI_FORMAT_ASCII, b)
47#define SCPI_Result_amu_meas_t(c, v) SCPI_ResultArrayFloat(c, (float *)&(v), 2, SCPI_FORMAT_ASCII)
52#define SCPI_CMD_RW(TYPE) \
53scpi_result_t scpi_cmd_rw_##TYPE(scpi_t *context) { \
55 int32_t channel = -1; \
57 memset((void *)scpi_amu_dev->transfer_reg, 0, sizeof(TYPE)); \
59 SCPI_CommandNumbers(context, &channel, 1, -1); \
61 scpi_amu_dev->transfer_reg[0] = channel; \
63 if(!context->query) { \
65 if( !SCPI_Param_##TYPE(context, (void *)&scpi_amu_dev->transfer_reg[1], TRUE)) return SCPI_RES_ERR; \
69 if( !SCPI_Param_##TYPE(context, (void *)scpi_amu_dev->transfer_reg, TRUE)) return SCPI_RES_ERR; \
75 _scpi_get_channelList(context); \
77 for(uint8_t *device = scpi_channel_list; *device != AMU_DEVICE_END_LIST; device++) { \
78 if(context->query) { \
79 if( SCPI_CmdTag(context) >= CMD_I2C_USB ) \
80 _amu_route_command(*device, (SCPI_CmdTag(context) | CMD_READ), sizeof(TYPE), true); \
82 _amu_route_command(*device, SCPI_CmdTag(context), sizeof(TYPE), true); \
84 TYPE *data = (TYPE *)scpi_amu_dev->transfer_reg; \
85 SCPI_Result_##TYPE(context, *data); \
88 _amu_route_command(*device, SCPI_CmdTag(context), sizeof(TYPE), false); \
108#define SCPI_CMD_EXEC_QRY(TYPE) \
109scpi_result_t scpi_cmd_exec_qry_##TYPE(scpi_t *context) { \
111 int32_t channel = -1; \
113 memset((void *)scpi_amu_dev->transfer_reg, 0, sizeof(TYPE)); \
115 SCPI_CommandNumbers(context, &channel, 1, -1); \
117 scpi_amu_dev->transfer_reg[0] = channel; \
119 _scpi_get_channelList(context); \
121 for(uint8_t *device = scpi_channel_list; *device != AMU_DEVICE_END_LIST; device++) { \
122 if(context->query) { \
123 if( SCPI_CmdTag(context) >= CMD_I2C_USB ) \
124 _amu_route_command(*device, (SCPI_CmdTag(context) | CMD_READ), sizeof(TYPE), true); \
126 _amu_route_command(*device, SCPI_CmdTag(context), sizeof(TYPE), true); \
128 TYPE *data = (TYPE *)scpi_amu_dev->transfer_reg; \
129 SCPI_Result_##TYPE(context, *data); \
133 _amu_route_command(*device, SCPI_CmdTag(context), 0, false); \
135 _amu_route_command(*device, SCPI_CmdTag(context), 1, false); \
139 return SCPI_RES_OK; \
151 int32_t* commandNumber = (int32_t*)
scpi_amu_dev->transfer_reg;
158 if (*commandNumber == -1)
233 uint32_t sweepSettingsUint32_t[8];
234 uint8_t* sweepSettings = (uint8_t*)
scpi_amu_dev->transfer_reg;
245 for (uint8_t i = 0; i < 8; i++) {
246 sweepSettings[i] = (uint8_t)sweepSettingsUint32_t[i];
285 int32_t channel = -1;
299 if (!context->query) {
313 if (strstr(context->param_list.cmd_raw.data,
"RAW"))
326 uint16_t* activeChannels = (uint16_t*)
scpi_amu_dev->transfer_reg;
327 uint8_t numChannels = 0;
333 for (uint16_t i = 0; i < 16; i++) {
334 if (*activeChannels & (1 << i))
340 if (numChannels > 0) {
364 if (!context->query) {
372 if (context->query) {
418 int32_t* commandNumber = (int32_t*)
scpi_amu_dev->transfer_reg;
439static size_t SCPI_Write(scpi_t* context,
const char* data,
size_t len) {
450#if defined(HAVE_SNPRINTF)
451 snprintf(buffer,
sizeof(buffer),
"**SRQ: 0x%X", val);
452 context->interface->write(context, buffer,
sizeof(buffer));
454 context->interface->write(context,
"**SRQ: 0x", 10);
455 context->interface->write(context, itoa(val, buffer, 16),
sizeof(buffer));
461#if defined(HAVE_SNPRINTF)
462 snprintf(buffer,
sizeof(buffer),
"**CTRL: 0x%X: 0x%X", ctrl, val);
463 context->interface->write(context, buffer,
sizeof(buffer));
465 context->interface->write(context,
"**CTRL: 0x", 11);
466 context->interface->write(context, itoa(ctrl, buffer, 16),
sizeof(buffer));
467 context->interface->write(context,
": 0x", 5);
468 context->interface->write(context, itoa(val, buffer, 16),
sizeof(buffer));
494#ifdef __AMU_USE_SCPI__
497#ifdef SCPI_USE_PROGMEM
498 #define SCPI_COMMAND(P, C, T) static const char C ## _ ## T ## _pattern[] PROGMEM = P;
500 #define SCPI_COMMAND(P, C, T) static const char C ## _ ## T ## _pattern[] = P;
505#ifdef __AMU_LOW_MEMORY__
514#define SCPI_COMMAND(P, C, T) {C ## _ ## T ## _pattern, C, T},
515#ifdef __AMU_SCPI_USE_PROGMEM__
516 static const scpi_command_t scpi_def_commands[] PROGMEM = {
518 static const scpi_command_t scpi_def_commands[] = {
521#ifdef __AMU_LOW_MEMORY__
545#ifdef __AMU_USE_SCPI__
561#ifdef __AMU_USE_SCPI__
567#ifdef __AMU_USE_SCPI__
573#ifdef __AMU_USE_SCPI__
582#ifdef __AMU_SCPI_USE_PROGMEM__
586 PGM_P pattern = (PGM_P)pgm_read_word(&(
scpi_context.def_cmdlist[0].pattern));
590 for (i = 1; (pattern = (PGM_P)pgm_read_word(&(
scpi_context.def_cmdlist[i].pattern))) != 0; i++) {
596 PGM_P pattern = (PGM_P)pgm_read_word(&(
scpi_context.aux_cmdlist[0].pattern));
600 for (i = 1; (pattern = (PGM_P)pgm_read_word(&(
scpi_context.aux_cmdlist[i].pattern))) != 0; i++) {
610 char message[] =
"SCPI Commands:\n";
626 for (i = 0; (cmd_pattern = (
char*)
scpi_context.def_cmdlist[i].pattern) != 0; i++) {
633 for (i = 0; (cmd_pattern = (
char*)
scpi_context.aux_cmdlist[i].pattern) != 0; i++) {
650 uint8_t scpi_list_iterator = 0;
661 size_t param_idx = 0;
662 int8_t direction = 1;
663 int32_t address_start = 0;
664 int32_t address_end = 0;
669 if ((dimensions != 1) | (address_start > 63)) {
676 if (address_end > 63) {
681 for ((address_start > address_end) ? (direction = -1) : (direction = 1); address_start != address_end; address_start += direction)
uint8_t amu_get_device_address(uint8_t deviceNum)
Device addresses are used for TODO.
int8_t amu_get_num_devices()
uint8_t _amu_route_command(uint8_t deviceNum, CMD_t cmd, size_t transferLen, bool query)
TODO.
#define AMU_SERIALNUM_STR_LEN
#define AMU_FIRMWARE_STR_LEN
#define AMU_MAX_CONNECTED_DEVICES
static float transfer_read_float(void)
@ AMU_REG_SYSTEM_ADC_ACTIVE_CHANNELS
@ AMU_REG_DATA_PTR_VOLTAGE
@ AMU_REG_DATA_PTR_PRESSURE
@ AMU_REG_DATA_PTR_SWEEP_CONFIG
@ AMU_REG_DATA_PTR_SS_YAW
@ AMU_REG_DATA_PTR_CURRENT
@ AMU_REG_DATA_PTR_TIMESTAMP
@ AMU_REG_DATA_PTR_SWEEP_META
@ AMU_REG_DATA_PTR_SS_PITCH
@ AMU_REG_DATA_PTR_SUNSENSOR
@ AMU_REG_SWEEP_CONFIG_NUM_POINTS
@ AMU_REG_DUT_SERIAL_NUMBER
@ AMU_REG_DUT_MANUFACTURER
#define IVSWEEP_MAX_POINTS
#define AMU_TRANSFER_REG_SIZE
#define AMU_DEVICE_END_LIST
#define SCPI_MAX_CMD_PATTERN_SIZE
scpi_expr_result_t SCPI_ExprChannelListEntry(scpi_t *context, scpi_parameter_t *param, int index, scpi_bool_t *isRange, int32_t *valuesFrom, int32_t *valuesTo, size_t length, size_t *dimensions)
@ CMD_DUT_MANUFACTURER
Sets or queries DUT manufacturer name.
@ CMD_DUT_MODEL
Sets or queries DUT model/part number.
@ CMD_DUT_TECHNOLOGY
Sets or queries DUT semiconductor technology.
@ CMD_DUT_SERIAL_NUMBER
Sets or queries DUT serial number.
@ CMD_DUT_NOTES
Sets or queries DUT documentation notes.
@ CMD_SYSTEM_FIRMWARE
Returns firmware version string.
@ CMD_SYSTEM_SERIAL_NUM
Returns unique device serial number.
scpi_bool_t SCPI_ParamFloat(scpi_t *context, void *value, scpi_bool_t mandatory)
uint16_t SCPI_CmdTag(scpi_t *context)
scpi_bool_t SCPI_CommandNumbers(scpi_t *context, int32_t *numbers, size_t len, int32_t default_value)
scpi_bool_t SCPI_ParamArrayFloat(scpi_t *context, float *data, size_t i_count, size_t *o_count, scpi_array_format_t format, scpi_bool_t mandatory)
scpi_bool_t SCPI_Parameter(scpi_t *context, scpi_parameter_t *parameter, scpi_bool_t mandatory)
scpi_bool_t SCPI_ParamArrayUInt32(scpi_t *context, uint32_t *data, size_t i_count, size_t *o_count, scpi_array_format_t format, scpi_bool_t mandatory)
size_t SCPI_ResultText(scpi_t *context, const char *data)
size_t SCPI_ResultUInt32Base(scpi_t *context, uint32_t val, int8_t base)
size_t SCPI_ResultArrayUInt8(scpi_t *context, const uint8_t *array, size_t count, scpi_array_format_t format)
scpi_bool_t SCPI_Input(scpi_t *context, const char *data, int len)
scpi_bool_t SCPI_ParamUInt32(scpi_t *context, void *value, scpi_bool_t mandatory)
size_t SCPI_ResultArrayUInt32(scpi_t *context, const uint32_t *array, size_t count, scpi_array_format_t format)
size_t SCPI_ResultArrayFloat(scpi_t *context, const float *array, size_t count, scpi_array_format_t format)
size_t SCPI_ResultFloat(scpi_t *context, float val)
scpi_bool_t SCPI_ParamCopyText(scpi_t *context, char *buffer, size_t buffer_len, size_t *copy_len, scpi_bool_t mandatory)
void SCPI_Init(scpi_t *context, const scpi_command_t *def_cmds, scpi_interface_t *interface, const scpi_unit_def_t *units, const char *idn1, const char *idn2, const char *idn3, const char *idn4, char *input_buffer, size_t input_buffer_length, scpi_error_t *error_queue_data, int16_t error_queue_size)
#define SCPI_ResultUInt8(c, v)
#define SCPI_ResultInt8(c, v)
static scpi_interface_t scpi_interface
scpi_result_t _scpi_write_config_ptr(scpi_t *context)
scpi_result_t scpi_cmd_execute(scpi_t *context)
scpi_result_t _scpi_cmd_measure_channel(scpi_t *context)
static scpi_error_t scpi_error_queue_data[16]
static scpi_result_t SCPI_Write_Control(scpi_t *context, scpi_ctrl_name_t ctrl, scpi_reg_val_t val)
static uint8_t scpi_channel_list[16+1]
scpi_result_t _scpi_cmd_measure_tsensors(scpi_t *context)
scpi_result_t _scpi_cmd_led(scpi_t *context)
scpi_result_t _scpi_write_meta_ptr(scpi_t *context)
scpi_result_t _scpi_cmd_query_str(scpi_t *context)
scpi_result_t _scpi_cmd_measure_active_ch(scpi_t *context)
scpi_result_t _scpi_cmd_twi_scan(scpi_t *context)
scpi_result_t _scpi_read_ptr(scpi_t *context)
#define SCPI_CMD_RW(TYPE)
static scpi_result_t SCPI_Reset(scpi_t *context)
int16_t _scpi_get_channelList(scpi_t *context)
static char scpi_input_buffer[1024]
static size_t SCPI_Write(scpi_t *context, const char *data, size_t len)
static scpi_result_t SCPI_Flush(scpi_t *context)
#define SCPI_CMD_EXEC_QRY(TYPE)
static scpi_t scpi_context
static volatile amu_device_t * scpi_amu_dev
scpi_result_t _scpi_write_sweep_ptr(scpi_t *context)
SCPI library include file.
void amu_scpi_init(volatile amu_device_t *dev, const char *idn1, const char *idn2, const char *idn3, const char *idn4)
void amu_scpi_update(const char incomingByte)
void amu_scpi_add_aux_commands(const scpi_command_t *aux_cmd_list)
#define AMULIBC_SCPI_INPUT_BUFFER_LENGTH
#define __AMU_EXTENDED_CMD_LIST__
void amu_scpi_update_buffer(const char *buffer, size_t len)
#define __AMU_DEFAULT_CMD_LIST__
void amu_scpi_list_commands(void)
#define AMULIBC_SCPI_ERROR_QUEUE_SIZE
#define SCPI_CMD_LIST_END
enum _scpi_result_t scpi_result_t
enum _scpi_ctrl_name_t scpi_ctrl_name_t
scpi_token_t scpi_parameter_t
const scpi_unit_def_t scpi_units_def[]