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:
Guido Trentalancia 2018-11-16 18:47:55 +01:00 committed by Uwe Hermann
parent c8ecfa6ea4
commit 4fa4db2c79
6 changed files with 50 additions and 6 deletions

View File

@ -770,6 +770,9 @@ enum sr_configkey {
/** The device supports setting trigger slope. */
SR_CONF_TRIGGER_SLOPE,
/** The device supports setting a pattern for the logic trigger. */
SR_CONF_TRIGGER_PATTERN,
/** The device supports averaging. */
SR_CONF_AVERAGING,

View File

@ -200,6 +200,9 @@ static int config_get(uint32_t key, GVariant **data,
case SR_CONF_TRIGGER_SLOPE:
*data = g_variant_new_string((*model->trigger_slopes)[state->trigger_slope]);
break;
case SR_CONF_TRIGGER_PATTERN:
*data = g_variant_new_string(state->trigger_pattern);
break;
case SR_CONF_HORIZ_TRIGGERPOS:
*data = g_variant_new_double(state->horiz_triggerpos);
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)
{
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;
const struct scope_config *model;
struct scope_state *state;
@ -341,6 +344,21 @@ static int config_set(uint32_t key, GVariant *data,
(*model->trigger_slopes)[idx]);
ret = sr_scpi_send(sdi->conn, command);
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:
if (!cg)
return SR_ERR_CHANNEL_GROUP;

View File

@ -46,6 +46,12 @@ static const char *hameg_scpi_dialect[] = {
[SCPI_CMD_SET_DIG_POD_STATE] = ":POD%d:STAT %d",
[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_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_SET_TRIGGER_SOURCE] = ":TRIG:A:SOUR %s",
[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_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_PATTERN | SR_CONF_GET | SR_CONF_SET,
};
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);
g_free(tmp);
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);
if (!strcmp("PATT", (*config->trigger_sources)[state->trigger_source]))
sr_info("Current trigger: %s (pattern), %.2f (offset)",
state->trigger_pattern,
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,
@ -773,6 +785,11 @@ SR_PRIV int hmo_scope_state_get(struct sr_dev_inst *sdi)
&state->trigger_slope) != SR_OK)
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)
return SR_ERR;

View File

@ -29,7 +29,7 @@
#define LOG_PREFIX "hameg-hmo"
#define MAX_INSTRUMENT_VERSIONS 10
#define MAX_COMMAND_SIZE 48
#define MAX_COMMAND_SIZE 128
#define MAX_ANALOG_CHANNEL_COUNT 4
#define MAX_DIGITAL_CHANNEL_COUNT 16
#define MAX_DIGITAL_GROUP_COUNT 2
@ -103,6 +103,8 @@ struct scope_state {
int trigger_source;
int trigger_slope;
char *trigger_pattern;
uint64_t sample_rate;
};

View File

@ -83,6 +83,8 @@ static struct sr_key_info sr_key_info_config[] = {
"Run length encoding", NULL},
{SR_CONF_TRIGGER_SLOPE, SR_T_STRING, "triggerslope",
"Trigger slope", NULL},
{SR_CONF_TRIGGER_PATTERN, SR_T_STRING, "triggerpattern",
"Trigger pattern", NULL},
{SR_CONF_AVERAGING, SR_T_BOOL, "averaging",
"Averaging", NULL},
{SR_CONF_AVG_SAMPLES, SR_T_UINT64, "avg_samples",

View File

@ -39,6 +39,8 @@ enum {
SCPI_CMD_SET_VERTICAL_DIV,
SCPI_CMD_GET_TRIGGER_SLOPE,
SCPI_CMD_SET_TRIGGER_SLOPE,
SCPI_CMD_GET_TRIGGER_PATTERN,
SCPI_CMD_SET_TRIGGER_PATTERN,
SCPI_CMD_GET_TRIGGER_SOURCE,
SCPI_CMD_SET_TRIGGER_SOURCE,
SCPI_CMD_GET_COUPLING,