Hello Guido,

While I appreciate the work you do, you're also creating a
lot of unnecessary mail traffic on the ML that is hard to
handle. There is no need to immediately announce every single
change you made - it's customary for contributors to continue
working on their local branches and then submit several
commits at once when they consider one of their branches to
be merge-ready.

Also, you may not be aware that we receive notifications when
you push something to your github pull request, so there's no
need to also write a mail to the mailing list.

Thanks!

Regards,
 -Soeren

On Mon, 2018-11-19 at 23:39 +0100, Guido Trentalancia wrote:
> Introduce the support in the "rohde-schwarz-hameg" driver for
> the RTB2000 and RTM3000 mixed-signal oscilloscope series.
> 
> According to the latest available version of the manual, they
> both use a slightly different dialect than currently supported
> models, in particular when it comes to the POD (logic channel
> groups) handling.
> 
> I do not have any of the above models available for testing
> therefore I do not know whether or not they also understand
> the existing dialect. In doubt, the new official dialect is
> implemented by this patch.
> 
> Signed-off-by: Guido Trentalancia <gu...@trentalancia.com>
> ---
>  src/hardware/rohde-schwarz-hameg/api.c      |   71 +++++-
>  src/hardware/rohde-schwarz-hameg/protocol.c |  287
> ++++++++++++++++++++++++++--
>  src/hardware/rohde-schwarz-hameg/protocol.h |    1 
>  3 files changed, 332 insertions(+), 27 deletions(-)
> 
> diff -pru libsigrok-git-orig/src/hardware/rohde-schwarz-hameg/api.c
> libsigrok-git-add-rs-rtb2000-and-rtm3000/src/hardware/rohde-schwarz-
> hameg/api.c
> --- libsigrok-git-orig/src/hardware/rohde-schwarz-hameg/api.c 
> 2018-11-18 16:27:57.362464415 +0100
> +++ libsigrok-git-add-rs-rtb2000-and-rtm3000/src/hardware/rohde-
> schwarz-hameg/api.c   2018-11-19 22:44:53.344517555 +0100
> @@ -150,7 +150,7 @@ static int check_channel_group(struct de
>  static int config_get(uint32_t key, GVariant **data,
>       const struct sr_dev_inst *sdi, const struct sr_channel_group
> *cg)
>  {
> -     int cg_type, idx;
> +     int cg_type, idx, i;
>       struct dev_context *devc;
>       const struct scope_config *model;
>       struct scope_state *state;
> @@ -238,8 +238,18 @@ static int config_get(uint32_t key, GVar
>                       return SR_ERR_ARG;
>               if ((idx = std_cg_idx(cg, devc->digital_groups,
> model->digital_pods)) < 0)
>                       return SR_ERR_ARG;
> -             if (strcmp("USER2", (*model->logic_threshold)[state-
> >digital_pods[idx].threshold]))
> -                     return SR_ERR_NA;
> +             /* Check if the oscilloscope is currently in custom
> threshold mode. */
> +             for (i = 0; i < model->num_logic_threshold; i++) {
> +                     if (!strcmp("USER2", (*model-
> >logic_threshold)[i]))
> +                             if (strcmp("USER2", (*model-
> >logic_threshold)[state->digital_pods[idx].threshold]))
> +                                     return SR_ERR_NA;
> +                     if (!strcmp("USER", (*model-
> >logic_threshold)[i]))
> +                             if (strcmp("USER", (*model-
> >logic_threshold)[state->digital_pods[idx].threshold]))
> +                                     return SR_ERR_NA;
> +                     if (!strcmp("MAN", (*model-
> >logic_threshold)[i]))
> +                             if (strcmp("MAN", (*model-
> >logic_threshold)[state->digital_pods[idx].threshold]))
> +                                     return SR_ERR_NA;
> +             }
>               *data = g_variant_new_double(state-
> >digital_pods[idx].user_threshold);
>               break;
>       default:
> @@ -252,8 +262,9 @@ static int config_get(uint32_t key, GVar
>  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], *tmp_str;
> +     int ret, cg_type, idx, i, j;
> +     char command[MAX_COMMAND_SIZE], command2[MAX_COMMAND_SIZE];
> +     char float_str[30], *tmp_str;
>       struct dev_context *devc;
>       const struct scope_config *model;
>       struct scope_state *state;
> @@ -398,9 +409,14 @@ static int config_set(uint32_t key, GVar
>                       return SR_ERR_ARG;
>               if ((j = std_cg_idx(cg, devc->digital_groups, model-
> >digital_pods)) < 0)
>                       return SR_ERR_ARG;
> +                /* Check if the threshold command is based on the
> POD or digital channel index. */
> +             if (model->logic_threshold_for_pod)
> +                     i = j + 1;
> +             else
> +                     i = j * 8;
>               g_snprintf(command, sizeof(command),
>                          (*model-
> >scpi_dialect)[SCPI_CMD_SET_DIG_POD_THRESHOLD],
> -                        j + 1, (*model->logic_threshold)[idx]);
> +                        i, (*model->logic_threshold)[idx]);
>               if (sr_scpi_send(sdi->conn, command) != SR_OK ||
>                   sr_scpi_get_opc(sdi->conn) != SR_OK)
>                       return SR_ERR;
> @@ -420,16 +436,45 @@ static int config_set(uint32_t key, GVar
>               if (tmp_d < -2.0 || tmp_d > 8.0)
>                       return SR_ERR;
>               g_ascii_formatd(float_str, sizeof(float_str), "%E",
> tmp_d);
> -             g_snprintf(command, sizeof(command),
> -                        (*model-
> >scpi_dialect)[SCPI_CMD_SET_DIG_POD_USER_THRESHOLD],
> -                        j + 1, 2, float_str); // USER2 for custom
> logic_threshold setting
> +             /* Check if the threshold command is based on the
> POD or digital channel index. */
> +             if (model->logic_threshold_for_pod)
> +                     idx = j + 1;
> +             else
> +                     idx = j * 8;
> +             /* Try to support different dialects exhaustively.
> */
> +             for (i = 0; i < model->num_logic_threshold; i++) {
> +                     if (!strcmp("USER2", (*model-
> >logic_threshold)[i])) {
> +                             g_snprintf(command, sizeof(command),
> +                                        (*model-
> >scpi_dialect)[SCPI_CMD_SET_DIG_POD_USER_THRESHOLD],
> +                                        idx, 2, float_str); /*
> USER2 */
> +                             g_snprintf(command2,
> sizeof(command2),
> +                                        (*model-
> >scpi_dialect)[SCPI_CMD_SET_DIG_POD_THRESHOLD],
> +                                        idx, "USER2");
> +                             break;
> +                     }
> +                     if (!strcmp("USER", (*model-
> >logic_threshold)[i])) {
> +                             g_snprintf(command, sizeof(command),
> +                                        (*model-
> >scpi_dialect)[SCPI_CMD_SET_DIG_POD_USER_THRESHOLD],
> +                                        idx, float_str);
> +                             g_snprintf(command2,
> sizeof(command2),
> +                                        (*model-
> >scpi_dialect)[SCPI_CMD_SET_DIG_POD_THRESHOLD],
> +                                        idx, "USER");
> +                             break;
> +                     }
> +                     if (!strcmp("MAN", (*model-
> >logic_threshold)[i])) {
> +                             g_snprintf(command, sizeof(command),
> +                                        (*model-
> >scpi_dialect)[SCPI_CMD_SET_DIG_POD_USER_THRESHOLD],
> +                                        idx, float_str);
> +                             g_snprintf(command2,
> sizeof(command2),
> +                                        (*model-
> >scpi_dialect)[SCPI_CMD_SET_DIG_POD_THRESHOLD],
> +                                        idx, "MAN");
> +                             break;
> +                     }
> +             }
>               if (sr_scpi_send(sdi->conn, command) != SR_OK ||
>                   sr_scpi_get_opc(sdi->conn) != SR_OK)
>                       return SR_ERR;
> -             g_snprintf(command, sizeof(command),
> -                        (*model-
> >scpi_dialect)[SCPI_CMD_SET_DIG_POD_THRESHOLD],
> -                        j + 1, "USER2");
> -             if (sr_scpi_send(sdi->conn, command) != SR_OK ||
> +             if (sr_scpi_send(sdi->conn, command2) != SR_OK ||
>                   sr_scpi_get_opc(sdi->conn) != SR_OK)
>                       return SR_ERR;
>               state->digital_pods[j].user_threshold = tmp_d;
> diff -pru libsigrok-git-orig/src/hardware/rohde-schwarz-
> hameg/protocol.c libsigrok-git-add-rs-rtb2000-and-
> rtm3000/src/hardware/rohde-schwarz-hameg/protocol.c
> --- libsigrok-git-orig/src/hardware/rohde-schwarz-hameg/protocol.c    
> 2018-11-19 17:53:35.611823283 +0100
> +++ libsigrok-git-add-rs-rtb2000-and-rtm3000/src/hardware/rohde-
> schwarz-hameg/protocol.c      2018-11-19 22:48:03.252638409 +0100
> @@ -67,6 +67,43 @@ static const char *rohde_schwarz_scpi_di
>       [SCPI_CMD_SET_DIG_POD_USER_THRESHOLD] = ":POD%d:THR:UDL%d
> %s",
>  };
>  
> +static const char *rohde_schwarz_log_not_pod_scpi_dialect[] = {
> +     [SCPI_CMD_GET_DIG_DATA]               = ":FORM
> UINT,8;:LOG%d:DATA?",
> +     [SCPI_CMD_GET_TIMEBASE]               = ":TIM:SCAL?",
> +     [SCPI_CMD_SET_TIMEBASE]               = ":TIM:SCAL
> %s",
> +     [SCPI_CMD_GET_COUPLING]               =
> ":CHAN%d:COUP?",
> +     [SCPI_CMD_SET_COUPLING]               = ":CHAN%d:COUP
> %s",
> +     [SCPI_CMD_GET_SAMPLE_RATE]            = ":ACQ:SRAT?",
> +     [SCPI_CMD_GET_ANALOG_DATA]            = ":FORM:BORD %s;" \
> +                                             ":FORM
> REAL,32;:CHAN%d:DATA?",
> +     [SCPI_CMD_GET_VERTICAL_DIV]           = ":CHAN%d:SCAL?",
> +     [SCPI_CMD_SET_VERTICAL_DIV]           = ":CHAN%d:SCAL
> %s",
> +     [SCPI_CMD_GET_DIG_POD_STATE]          = ":LOG%d:STAT?",
> +     [SCPI_CMD_SET_DIG_POD_STATE]          = ":LOG%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?",
> +     [SCPI_CMD_SET_DIG_CHAN_STATE]         = ":LOG%d:STAT
> %d",
> +     [SCPI_CMD_GET_VERTICAL_OFFSET]        =
> ":CHAN%d:POS?",       /* Might not be supported on RTB200x... */
> +     [SCPI_CMD_GET_HORIZ_TRIGGERPOS]       = ":TIM:POS?",
> +     [SCPI_CMD_SET_HORIZ_TRIGGERPOS]       = ":TIM:POS
> %s",
> +     [SCPI_CMD_GET_ANALOG_CHAN_STATE]      = ":CHAN%d:STAT?",
> +     [SCPI_CMD_SET_ANALOG_CHAN_STATE]      = ":CHAN%d:STAT %d",
> +     [SCPI_CMD_GET_PROBE_UNIT]             =
> ":PROB%d:SET:ATT:UNIT?",
> +     [SCPI_CMD_GET_DIG_POD_THRESHOLD]      = ":DIG%d:TECH?",
> +     [SCPI_CMD_SET_DIG_POD_THRESHOLD]      = ":DIG%d:TECH %s",
> +     [SCPI_CMD_GET_DIG_POD_USER_THRESHOLD] = ":DIG%d:THR?",
> +     [SCPI_CMD_SET_DIG_POD_USER_THRESHOLD] = ":DIG%d:THR %s",
> +};
> +
>  static const uint32_t devopts[] = {
>       SR_CONF_OSCILLOSCOPE,
>       SR_CONF_LIMIT_SAMPLES | SR_CONF_SET,
> @@ -99,6 +136,19 @@ static const char *coupling_options[] =
>       "GND",
>  };
>  
> +static const char *coupling_options_rtb200x[] = {
> +     "ACL", // AC with 1 MOhm termination
> +     "DCL", // DC with 1 MOhm termination
> +     "GND",
> +};
> +
> +static const char *coupling_options_rtm300x[] = {
> +     "ACL", // AC with 1 MOhm termination
> +     "DC",  // DC with 50 Ohm termination
> +     "DCL", // DC with 1 MOhm termination
> +     "GND",
> +};
> +
>  static const char *scope_trigger_slopes[] = {
>       "POS",
>       "NEG",
> @@ -114,6 +164,13 @@ static const char *logic_threshold[] = {
>       "USER2", // overwritten by logic_threshold_custom, use USER1
> for permanent setting
>  };
>  
> +static const char *logic_threshold_rtb200x_rtm300x[] = {
> +     "TTL",
> +     "ECL",
> +     "CMOS",
> +     "MAN", // overwritten by logic_threshold_custom
> +};
> +
>  /* RTC1002, HMO Compact2 and HMO1002/HMO1202 */
>  static const char *an2_dig8_trigger_sources[] = {
>       "CH1", "CH2",
> @@ -129,6 +186,14 @@ static const char *an2_dig16_trigger_sou
>       "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15",
>  };
>  
> +/* RTB2002 and RTM3002 */
> +static const char *an2_dig16_sbus_trigger_sources[] = {
> +     "CH1", "CH2",
> +     "LINE", "EXT", "PATT", "SBUS1", "SBUS2",
> +     "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
> +     "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15",
> +};
> +
>  /* HMO Compact4 */
>  static const char *an4_dig8_trigger_sources[] = {
>       "CH1", "CH2", "CH3", "CH4",
> @@ -144,6 +209,14 @@ static const char *an4_dig16_trigger_sou
>       "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15",
>  };
>  
> +/* RTB2004 and RTM3004 */
> +static const char *an4_dig16_sbus_trigger_sources[] = {
> +     "CH1", "CH2", "CH3", "CH4",
> +     "LINE", "EXT", "PATT", "SBUS1", "SBUS2",
> +     "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
> +     "D8", "D9", "D10", "D11", "D12", "D13", "D14", "D15",
> +};
> +
>  static const uint64_t timebases[][2] = {
>       /* nanoseconds */
>       { 2, 1000000000 },
> @@ -237,6 +310,7 @@ static const struct scope_config scope_m
>  
>               .logic_threshold = &logic_threshold,
>               .num_logic_threshold = ARRAY_SIZE(logic_threshold),
> +             .logic_threshold_for_pod = TRUE,
>  
>               .trigger_sources = &an2_dig8_trigger_sources,
>               .num_trigger_sources =
> ARRAY_SIZE(an2_dig8_trigger_sources),
> @@ -279,6 +353,7 @@ static const struct scope_config scope_m
>  
>               .logic_threshold = &logic_threshold,
>               .num_logic_threshold = ARRAY_SIZE(logic_threshold),
> +             .logic_threshold_for_pod = TRUE,
>  
>               .trigger_sources = &an2_dig16_trigger_sources,
>               .num_trigger_sources =
> ARRAY_SIZE(an2_dig16_trigger_sources),
> @@ -320,6 +395,7 @@ static const struct scope_config scope_m
>  
>               .logic_threshold = &logic_threshold,
>               .num_logic_threshold = ARRAY_SIZE(logic_threshold),
> +             .logic_threshold_for_pod = TRUE,
>  
>               .trigger_sources = &an4_dig8_trigger_sources,
>               .num_trigger_sources =
> ARRAY_SIZE(an4_dig8_trigger_sources),
> @@ -361,6 +437,7 @@ static const struct scope_config scope_m
>  
>               .logic_threshold = &logic_threshold,
>               .num_logic_threshold = ARRAY_SIZE(logic_threshold),
> +             .logic_threshold_for_pod = TRUE,
>  
>               .trigger_sources = &an4_dig16_trigger_sources,
>               .num_trigger_sources =
> ARRAY_SIZE(an4_dig16_trigger_sources),
> @@ -379,6 +456,174 @@ static const struct scope_config scope_m
>  
>               .scpi_dialect = &rohde_schwarz_scpi_dialect,
>       },
> +     {
> +             .name = {"RTB2002", NULL},
> +             .analog_channels = 2,
> +             .digital_channels = 16,
> +             .digital_pods = 2,
> +
> +             .analog_names = &scope_analog_channel_names,
> +             .digital_names = &scope_digital_channel_names,
> +
> +             .devopts = &devopts,
> +             .num_devopts = ARRAY_SIZE(devopts),
> +
> +             .devopts_cg_analog = &devopts_cg_analog,
> +             .num_devopts_cg_analog =
> ARRAY_SIZE(devopts_cg_analog),
> +
> +             .devopts_cg_digital = &devopts_cg_digital,
> +             .num_devopts_cg_digital =
> ARRAY_SIZE(devopts_cg_digital),
> +
> +             .coupling_options = &coupling_options_rtb200x,
> +             .num_coupling_options =
> ARRAY_SIZE(coupling_options_rtb200x),
> +
> +             .logic_threshold = &logic_threshold_rtb200x_rtm300x,
> +             .num_logic_threshold =
> ARRAY_SIZE(logic_threshold_rtb200x_rtm300x),
> +             .logic_threshold_for_pod = FALSE,
> +
> +             .trigger_sources = &an2_dig16_sbus_trigger_sources,
> +             .num_trigger_sources =
> ARRAY_SIZE(an2_dig16_sbus_trigger_sources),
> +
> +             .trigger_slopes = &scope_trigger_slopes,
> +             .num_trigger_slopes =
> ARRAY_SIZE(scope_trigger_slopes),
> +
> +             .timebases = &timebases,
> +             .num_timebases = ARRAY_SIZE(timebases),
> +
> +             .vdivs = &vdivs,
> +             .num_vdivs = ARRAY_SIZE(vdivs),
> +
> +             .num_xdivs = 12,
> +             .num_ydivs = 8,
> +
> +             .scpi_dialect =
> &rohde_schwarz_log_not_pod_scpi_dialect,
> +     },
> +     {
> +             .name = {"RTB2004", NULL},
> +             .analog_channels = 4,
> +             .digital_channels = 16,
> +             .digital_pods = 2,
> +
> +             .analog_names = &scope_analog_channel_names,
> +             .digital_names = &scope_digital_channel_names,
> +
> +             .devopts = &devopts,
> +             .num_devopts = ARRAY_SIZE(devopts),
> +
> +             .devopts_cg_analog = &devopts_cg_analog,
> +             .num_devopts_cg_analog =
> ARRAY_SIZE(devopts_cg_analog),
> +
> +             .devopts_cg_digital = &devopts_cg_digital,
> +             .num_devopts_cg_digital =
> ARRAY_SIZE(devopts_cg_digital),
> +
> +             .coupling_options = &coupling_options_rtb200x,
> +             .num_coupling_options =
> ARRAY_SIZE(coupling_options_rtb200x),
> +
> +             .logic_threshold = &logic_threshold_rtb200x_rtm300x,
> +             .num_logic_threshold =
> ARRAY_SIZE(logic_threshold_rtb200x_rtm300x),
> +             .logic_threshold_for_pod = FALSE,
> +
> +             .trigger_sources = &an4_dig16_sbus_trigger_sources,
> +             .num_trigger_sources =
> ARRAY_SIZE(an4_dig16_sbus_trigger_sources),
> +
> +             .trigger_slopes = &scope_trigger_slopes,
> +             .num_trigger_slopes =
> ARRAY_SIZE(scope_trigger_slopes),
> +
> +             .timebases = &timebases,
> +             .num_timebases = ARRAY_SIZE(timebases),
> +
> +             .vdivs = &vdivs,
> +             .num_vdivs = ARRAY_SIZE(vdivs),
> +
> +             .num_xdivs = 12,
> +             .num_ydivs = 8,
> +
> +             .scpi_dialect =
> &rohde_schwarz_log_not_pod_scpi_dialect,
> +     },
> +     {
> +             .name = {"RTM3002", NULL},
> +             .analog_channels = 2,
> +             .digital_channels = 16,
> +             .digital_pods = 2,
> +
> +             .analog_names = &scope_analog_channel_names,
> +             .digital_names = &scope_digital_channel_names,
> +
> +             .devopts = &devopts,
> +             .num_devopts = ARRAY_SIZE(devopts),
> +
> +             .devopts_cg_analog = &devopts_cg_analog,
> +             .num_devopts_cg_analog =
> ARRAY_SIZE(devopts_cg_analog),
> +
> +             .devopts_cg_digital = &devopts_cg_digital,
> +             .num_devopts_cg_digital =
> ARRAY_SIZE(devopts_cg_digital),
> +
> +             .coupling_options = &coupling_options_rtm300x,
> +             .num_coupling_options =
> ARRAY_SIZE(coupling_options_rtm300x),
> +
> +             .logic_threshold = &logic_threshold_rtb200x_rtm300x,
> +             .num_logic_threshold =
> ARRAY_SIZE(logic_threshold_rtb200x_rtm300x),
> +             .logic_threshold_for_pod = FALSE,
> +
> +             .trigger_sources = &an2_dig16_sbus_trigger_sources,
> +             .num_trigger_sources =
> ARRAY_SIZE(an2_dig16_sbus_trigger_sources),
> +
> +             .trigger_slopes = &scope_trigger_slopes,
> +             .num_trigger_slopes =
> ARRAY_SIZE(scope_trigger_slopes),
> +
> +             .timebases = &timebases,
> +             .num_timebases = ARRAY_SIZE(timebases),
> +
> +             .vdivs = &vdivs,
> +             .num_vdivs = ARRAY_SIZE(vdivs),
> +
> +             .num_xdivs = 12,
> +             .num_ydivs = 8,
> +
> +             .scpi_dialect =
> &rohde_schwarz_log_not_pod_scpi_dialect,
> +     },
> +     {
> +             .name = {"RTM3004", NULL},
> +             .analog_channels = 4,
> +             .digital_channels = 16,
> +             .digital_pods = 2,
> +
> +             .analog_names = &scope_analog_channel_names,
> +             .digital_names = &scope_digital_channel_names,
> +
> +             .devopts = &devopts,
> +             .num_devopts = ARRAY_SIZE(devopts),
> +
> +             .devopts_cg_analog = &devopts_cg_analog,
> +             .num_devopts_cg_analog =
> ARRAY_SIZE(devopts_cg_analog),
> +
> +             .devopts_cg_digital = &devopts_cg_digital,
> +             .num_devopts_cg_digital =
> ARRAY_SIZE(devopts_cg_digital),
> +
> +             .coupling_options = &coupling_options_rtm300x,
> +             .num_coupling_options =
> ARRAY_SIZE(coupling_options_rtm300x),
> +
> +             .logic_threshold = &logic_threshold_rtb200x_rtm300x,
> +             .num_logic_threshold =
> ARRAY_SIZE(logic_threshold_rtb200x_rtm300x),
> +             .logic_threshold_for_pod = FALSE,
> +
> +             .trigger_sources = &an4_dig16_sbus_trigger_sources,
> +             .num_trigger_sources =
> ARRAY_SIZE(an4_dig16_sbus_trigger_sources),
> +
> +             .trigger_slopes = &scope_trigger_slopes,
> +             .num_trigger_slopes =
> ARRAY_SIZE(scope_trigger_slopes),
> +
> +             .timebases = &timebases,
> +             .num_timebases = ARRAY_SIZE(timebases),
> +
> +             .vdivs = &vdivs,
> +             .num_vdivs = ARRAY_SIZE(vdivs),
> +
> +             .num_xdivs = 12,
> +             .num_ydivs = 8,
> +
> +             .scpi_dialect =
> &rohde_schwarz_log_not_pod_scpi_dialect,
> +     },
>  };
>  
>  static void scope_state_dump(const struct scope_config *config,
> @@ -402,14 +647,15 @@ static void scope_state_dump(const struc
>       }
>  
>       for (i = 0; i < config->digital_pods; i++) {
> -             if (strncmp("USER", (*config-
> >logic_threshold)[state->digital_pods[i].threshold], 4))
> -                     sr_info("State of digital POD %d -> %s : %s
> (threshold)", i + 1,
> -                             state->digital_pods[i].state ? "On"
> : "Off",
> -                             (*config->logic_threshold)[state-
> >digital_pods[i].threshold]);
> -             else // user-defined or custom logic threshold
> +             if (!strncmp("USER", (*config-
> >logic_threshold)[state->digital_pods[i].threshold], 4) ||
> +                 !strcmp("MAN", (*config->logic_threshold)[state-
> >digital_pods[i].threshold]))
>                       sr_info("State of digital POD %d -> %s : %E
> (threshold)", i + 1,
>                               state->digital_pods[i].state ? "On"
> : "Off",
>                               state-
> >digital_pods[i].user_threshold);
> +             else
> +                     sr_info("State of digital POD %d -> %s : %s
> (threshold)", i + 1,
> +                             state->digital_pods[i].state ? "On"
> : "Off",
> +                             (*config->logic_threshold)[state-
> >digital_pods[i].threshold]);
>       }
>  
>       tmp = sr_period_string((*config->timebases)[state-
> >timebase][0],
> @@ -575,7 +821,7 @@ static int digital_channel_state_get(str
>                                    const struct scope_config
> *config,
>                                    struct scope_state *state)
>  {
> -     unsigned int i;
> +     unsigned int i, idx;
>       int result = SR_ERR;
>       static char *logic_threshold_short[] = {};
>       char command[MAX_COMMAND_SIZE];
> @@ -596,7 +842,8 @@ static int digital_channel_state_get(str
>                       ch->enabled = state->digital_channels[i];
>       }
>  
> -     /* According to the SCPI standard, the response to the
> command
> +     /* According to the SCPI standard, on models that support
> multiple
> +      * user-defined logic threshold settings the response to the
> command
>        * SCPI_CMD_GET_DIG_POD_THRESHOLD might return "USER"
> instead of
>        * "USER1".
>        *
> @@ -620,9 +867,15 @@ static int digital_channel_state_get(str
>                                    &state->digital_pods[i].state)
> != SR_OK)
>                       goto exit;
>  
> +             /* Check if the threshold command is based on the
> POD or digital channel index. */
> +             if (config->logic_threshold_for_pod)
> +                     idx = i + 1;
> +             else
> +                     idx = i * 8;
> +
>               g_snprintf(command, sizeof(command),
>                          (*config-
> >scpi_dialect)[SCPI_CMD_GET_DIG_POD_THRESHOLD],
> -                        i + 1);
> +                        idx);
>  
>               /* Check for both standard and shortened responses.
> */
>               if (scope_state_get_array_option(scpi, command,
> config->logic_threshold,
> @@ -633,18 +886,24 @@ static int digital_channel_state_get(str
>                                                        &state-
> >digital_pods[i].threshold) != SR_OK)
>                               goto exit;
>  
> +             /* If used-defined or custom threshold is active,
> get the level. */
>               if (!strcmp("USER1", (*config-
> >logic_threshold)[state->digital_pods[i].threshold]))
>                       g_snprintf(command, sizeof(command),
>                                  (*config-
> >scpi_dialect)[SCPI_CMD_GET_DIG_POD_USER_THRESHOLD],
> -                                i + 1, 1); // USER1 logic
> threshold setting
> -
> -             if (!strcmp("USER2", (*config-
> >logic_threshold)[state->digital_pods[i].threshold]))
> +                                idx, 1); /* USER1 logic threshold
> setting. */
> +             else if (!strcmp("USER2", (*config-
> >logic_threshold)[state->digital_pods[i].threshold]))
>                       g_snprintf(command, sizeof(command),
>                                  (*config-
> >scpi_dialect)[SCPI_CMD_GET_DIG_POD_USER_THRESHOLD],
> -                                i + 1, 2); // USER2 for custom
> logic_threshold setting
> -
> +                                idx, 2); /* USER2 for custom
> logic_threshold setting. */
> +             else if (!strcmp("USER", (*config-
> >logic_threshold)[state->digital_pods[i].threshold]) ||
> +                      !strcmp("MAN", (*config-
> >logic_threshold)[state->digital_pods[i].threshold]))
> +                     g_snprintf(command, sizeof(command),
> +                                (*config-
> >scpi_dialect)[SCPI_CMD_GET_DIG_POD_USER_THRESHOLD],
> +                                idx); /* USER or MAN for custom
> logic_threshold setting. */
>               if (!strcmp("USER1", (*config-
> >logic_threshold)[state->digital_pods[i].threshold]) ||
> -                 !strcmp("USER2", (*config-
> >logic_threshold)[state->digital_pods[i].threshold]))
> +                 !strcmp("USER2", (*config-
> >logic_threshold)[state->digital_pods[i].threshold]) ||
> +                 !strcmp("USER", (*config-
> >logic_threshold)[state->digital_pods[i].threshold]) ||
> +                 !strcmp("MAN", (*config->logic_threshold)[state-
> >digital_pods[i].threshold]))
>                       if (sr_scpi_get_float(scpi, command,
>                           &state->digital_pods[i].user_threshold)
> != SR_OK)
>                               goto exit;
> diff -pru libsigrok-git-orig/src/hardware/rohde-schwarz-
> hameg/protocol.h libsigrok-git-add-rs-rtb2000-and-
> rtm3000/src/hardware/rohde-schwarz-hameg/protocol.h
> --- libsigrok-git-orig/src/hardware/rohde-schwarz-hameg/protocol.h    
> 2018-11-18 16:27:57.364464415 +0100
> +++ libsigrok-git-add-rs-rtb2000-and-rtm3000/src/hardware/rohde-
> schwarz-hameg/protocol.h      2018-11-19 19:03:07.665157868 +0100
> @@ -57,6 +57,7 @@ struct scope_config {
>  
>       const char *(*logic_threshold)[];
>       const uint8_t num_logic_threshold;
> +     const gboolean logic_threshold_for_pod;
>  
>       const char *(*trigger_sources)[];
>       const uint8_t num_trigger_sources;
> 
> 
> _______________________________________________
> sigrok-devel mailing list
> sigrok-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sigrok-devel


_______________________________________________
sigrok-devel mailing list
sigrok-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sigrok-devel

Reply via email to