hameg-hmo: Add SR_CONF_TRIGGER_PATTERN support.
Introduce support for the Pattern Trigger functionality, sometimes also called Logic Trigger.
This commit is contained in:
parent
c8ecfa6ea4
commit
4fa4db2c79
|
@ -770,6 +770,9 @@ enum sr_configkey {
|
||||||
/** The device supports setting trigger slope. */
|
/** The device supports setting trigger slope. */
|
||||||
SR_CONF_TRIGGER_SLOPE,
|
SR_CONF_TRIGGER_SLOPE,
|
||||||
|
|
||||||
|
/** The device supports setting a pattern for the logic trigger. */
|
||||||
|
SR_CONF_TRIGGER_PATTERN,
|
||||||
|
|
||||||
/** The device supports averaging. */
|
/** The device supports averaging. */
|
||||||
SR_CONF_AVERAGING,
|
SR_CONF_AVERAGING,
|
||||||
|
|
||||||
|
|
|
@ -200,6 +200,9 @@ static int config_get(uint32_t key, GVariant **data,
|
||||||
case SR_CONF_TRIGGER_SLOPE:
|
case SR_CONF_TRIGGER_SLOPE:
|
||||||
*data = g_variant_new_string((*model->trigger_slopes)[state->trigger_slope]);
|
*data = g_variant_new_string((*model->trigger_slopes)[state->trigger_slope]);
|
||||||
break;
|
break;
|
||||||
|
case SR_CONF_TRIGGER_PATTERN:
|
||||||
|
*data = g_variant_new_string(state->trigger_pattern);
|
||||||
|
break;
|
||||||
case SR_CONF_HORIZ_TRIGGERPOS:
|
case SR_CONF_HORIZ_TRIGGERPOS:
|
||||||
*data = g_variant_new_double(state->horiz_triggerpos);
|
*data = g_variant_new_double(state->horiz_triggerpos);
|
||||||
break;
|
break;
|
||||||
|
@ -250,7 +253,7 @@ static int config_set(uint32_t key, GVariant *data,
|
||||||
const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
|
const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
|
||||||
{
|
{
|
||||||
int ret, cg_type, idx, j;
|
int ret, cg_type, idx, j;
|
||||||
char command[MAX_COMMAND_SIZE], float_str[30];
|
char command[MAX_COMMAND_SIZE], float_str[30], *tmp_str;
|
||||||
struct dev_context *devc;
|
struct dev_context *devc;
|
||||||
const struct scope_config *model;
|
const struct scope_config *model;
|
||||||
struct scope_state *state;
|
struct scope_state *state;
|
||||||
|
@ -341,6 +344,21 @@ static int config_set(uint32_t key, GVariant *data,
|
||||||
(*model->trigger_slopes)[idx]);
|
(*model->trigger_slopes)[idx]);
|
||||||
ret = sr_scpi_send(sdi->conn, command);
|
ret = sr_scpi_send(sdi->conn, command);
|
||||||
break;
|
break;
|
||||||
|
case SR_CONF_TRIGGER_PATTERN:
|
||||||
|
tmp_str = (char *)g_variant_get_string(data, 0);
|
||||||
|
idx = strlen(tmp_str);
|
||||||
|
if (idx == 0 || idx > model->analog_channels + model->digital_channels)
|
||||||
|
return SR_ERR_ARG;
|
||||||
|
g_snprintf(command, sizeof(command),
|
||||||
|
(*model->scpi_dialect)[SCPI_CMD_SET_TRIGGER_PATTERN],
|
||||||
|
tmp_str);
|
||||||
|
if (sr_scpi_send(sdi->conn, command) != SR_OK ||
|
||||||
|
sr_scpi_get_opc(sdi->conn) != SR_OK)
|
||||||
|
return SR_ERR;
|
||||||
|
g_free(state->trigger_pattern);
|
||||||
|
state->trigger_pattern = g_strdup(tmp_str);
|
||||||
|
ret = SR_OK;
|
||||||
|
break;
|
||||||
case SR_CONF_COUPLING:
|
case SR_CONF_COUPLING:
|
||||||
if (!cg)
|
if (!cg)
|
||||||
return SR_ERR_CHANNEL_GROUP;
|
return SR_ERR_CHANNEL_GROUP;
|
||||||
|
|
|
@ -46,6 +46,12 @@ static const char *hameg_scpi_dialect[] = {
|
||||||
[SCPI_CMD_SET_DIG_POD_STATE] = ":POD%d:STAT %d",
|
[SCPI_CMD_SET_DIG_POD_STATE] = ":POD%d:STAT %d",
|
||||||
[SCPI_CMD_GET_TRIGGER_SLOPE] = ":TRIG:A:EDGE:SLOP?",
|
[SCPI_CMD_GET_TRIGGER_SLOPE] = ":TRIG:A:EDGE:SLOP?",
|
||||||
[SCPI_CMD_SET_TRIGGER_SLOPE] = ":TRIG:A:TYPE EDGE;:TRIG:A:EDGE:SLOP %s",
|
[SCPI_CMD_SET_TRIGGER_SLOPE] = ":TRIG:A:TYPE EDGE;:TRIG:A:EDGE:SLOP %s",
|
||||||
|
[SCPI_CMD_GET_TRIGGER_PATTERN] = ":TRIG:A:PATT:SOUR?",
|
||||||
|
[SCPI_CMD_SET_TRIGGER_PATTERN] = ":TRIG:A:TYPE LOGIC;" \
|
||||||
|
":TRIG:A:PATT:FUNC AND;" \
|
||||||
|
":TRIG:A:PATT:COND TRUE;" \
|
||||||
|
":TRIG:A:PATT:MODE OFF;" \
|
||||||
|
":TRIG:A:PATT:SOUR \"%s\"",
|
||||||
[SCPI_CMD_GET_TRIGGER_SOURCE] = ":TRIG:A:SOUR?",
|
[SCPI_CMD_GET_TRIGGER_SOURCE] = ":TRIG:A:SOUR?",
|
||||||
[SCPI_CMD_SET_TRIGGER_SOURCE] = ":TRIG:A:SOUR %s",
|
[SCPI_CMD_SET_TRIGGER_SOURCE] = ":TRIG:A:SOUR %s",
|
||||||
[SCPI_CMD_GET_DIG_CHAN_STATE] = ":LOG%d:STAT?",
|
[SCPI_CMD_GET_DIG_CHAN_STATE] = ":LOG%d:STAT?",
|
||||||
|
@ -72,6 +78,7 @@ static const uint32_t devopts[] = {
|
||||||
SR_CONF_HORIZ_TRIGGERPOS | SR_CONF_GET | SR_CONF_SET,
|
SR_CONF_HORIZ_TRIGGERPOS | SR_CONF_GET | SR_CONF_SET,
|
||||||
SR_CONF_TRIGGER_SOURCE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
|
SR_CONF_TRIGGER_SOURCE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
|
||||||
SR_CONF_TRIGGER_SLOPE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
|
SR_CONF_TRIGGER_SLOPE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
|
||||||
|
SR_CONF_TRIGGER_PATTERN | SR_CONF_GET | SR_CONF_SET,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const uint32_t devopts_cg_analog[] = {
|
static const uint32_t devopts_cg_analog[] = {
|
||||||
|
@ -415,10 +422,15 @@ static void scope_state_dump(const struct scope_config *config,
|
||||||
sr_info("Current samplerate: %s", tmp);
|
sr_info("Current samplerate: %s", tmp);
|
||||||
g_free(tmp);
|
g_free(tmp);
|
||||||
|
|
||||||
sr_info("Current trigger: %s (source), %s (slope) %.2f (offset)",
|
if (!strcmp("PATT", (*config->trigger_sources)[state->trigger_source]))
|
||||||
(*config->trigger_sources)[state->trigger_source],
|
sr_info("Current trigger: %s (pattern), %.2f (offset)",
|
||||||
(*config->trigger_slopes)[state->trigger_slope],
|
state->trigger_pattern,
|
||||||
state->horiz_triggerpos);
|
state->horiz_triggerpos);
|
||||||
|
else // Edge (slope) trigger
|
||||||
|
sr_info("Current trigger: %s (source), %s (slope) %.2f (offset)",
|
||||||
|
(*config->trigger_sources)[state->trigger_source],
|
||||||
|
(*config->trigger_slopes)[state->trigger_slope],
|
||||||
|
state->horiz_triggerpos);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int scope_state_get_array_option(struct sr_scpi_dev_inst *scpi,
|
static int scope_state_get_array_option(struct sr_scpi_dev_inst *scpi,
|
||||||
|
@ -773,6 +785,11 @@ SR_PRIV int hmo_scope_state_get(struct sr_dev_inst *sdi)
|
||||||
&state->trigger_slope) != SR_OK)
|
&state->trigger_slope) != SR_OK)
|
||||||
return SR_ERR;
|
return SR_ERR;
|
||||||
|
|
||||||
|
if (sr_scpi_get_string(sdi->conn,
|
||||||
|
(*config->scpi_dialect)[SCPI_CMD_GET_TRIGGER_PATTERN],
|
||||||
|
&state->trigger_pattern) != SR_OK)
|
||||||
|
return SR_ERR;
|
||||||
|
|
||||||
if (hmo_update_sample_rate(sdi) != SR_OK)
|
if (hmo_update_sample_rate(sdi) != SR_OK)
|
||||||
return SR_ERR;
|
return SR_ERR;
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#define LOG_PREFIX "hameg-hmo"
|
#define LOG_PREFIX "hameg-hmo"
|
||||||
|
|
||||||
#define MAX_INSTRUMENT_VERSIONS 10
|
#define MAX_INSTRUMENT_VERSIONS 10
|
||||||
#define MAX_COMMAND_SIZE 48
|
#define MAX_COMMAND_SIZE 128
|
||||||
#define MAX_ANALOG_CHANNEL_COUNT 4
|
#define MAX_ANALOG_CHANNEL_COUNT 4
|
||||||
#define MAX_DIGITAL_CHANNEL_COUNT 16
|
#define MAX_DIGITAL_CHANNEL_COUNT 16
|
||||||
#define MAX_DIGITAL_GROUP_COUNT 2
|
#define MAX_DIGITAL_GROUP_COUNT 2
|
||||||
|
@ -103,6 +103,8 @@ struct scope_state {
|
||||||
|
|
||||||
int trigger_source;
|
int trigger_source;
|
||||||
int trigger_slope;
|
int trigger_slope;
|
||||||
|
char *trigger_pattern;
|
||||||
|
|
||||||
uint64_t sample_rate;
|
uint64_t sample_rate;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,8 @@ static struct sr_key_info sr_key_info_config[] = {
|
||||||
"Run length encoding", NULL},
|
"Run length encoding", NULL},
|
||||||
{SR_CONF_TRIGGER_SLOPE, SR_T_STRING, "triggerslope",
|
{SR_CONF_TRIGGER_SLOPE, SR_T_STRING, "triggerslope",
|
||||||
"Trigger slope", NULL},
|
"Trigger slope", NULL},
|
||||||
|
{SR_CONF_TRIGGER_PATTERN, SR_T_STRING, "triggerpattern",
|
||||||
|
"Trigger pattern", NULL},
|
||||||
{SR_CONF_AVERAGING, SR_T_BOOL, "averaging",
|
{SR_CONF_AVERAGING, SR_T_BOOL, "averaging",
|
||||||
"Averaging", NULL},
|
"Averaging", NULL},
|
||||||
{SR_CONF_AVG_SAMPLES, SR_T_UINT64, "avg_samples",
|
{SR_CONF_AVG_SAMPLES, SR_T_UINT64, "avg_samples",
|
||||||
|
|
|
@ -39,6 +39,8 @@ enum {
|
||||||
SCPI_CMD_SET_VERTICAL_DIV,
|
SCPI_CMD_SET_VERTICAL_DIV,
|
||||||
SCPI_CMD_GET_TRIGGER_SLOPE,
|
SCPI_CMD_GET_TRIGGER_SLOPE,
|
||||||
SCPI_CMD_SET_TRIGGER_SLOPE,
|
SCPI_CMD_SET_TRIGGER_SLOPE,
|
||||||
|
SCPI_CMD_GET_TRIGGER_PATTERN,
|
||||||
|
SCPI_CMD_SET_TRIGGER_PATTERN,
|
||||||
SCPI_CMD_GET_TRIGGER_SOURCE,
|
SCPI_CMD_GET_TRIGGER_SOURCE,
|
||||||
SCPI_CMD_SET_TRIGGER_SOURCE,
|
SCPI_CMD_SET_TRIGGER_SOURCE,
|
||||||
SCPI_CMD_GET_COUPLING,
|
SCPI_CMD_GET_COUPLING,
|
||||||
|
|
Loading…
Reference in New Issue