Hello Soeren,

thanks for your message!

I decided to submit the proposed changes using a github pull request only 
later, when the number of pending patches started growing up.

At that point I was not sure whether to keep notifying the mailing list or not, 
because, as far as I know, github notifies only the maintainers and *not all 
the rest of developers*!

However, now that I know what is the preferred way of dealing with this issue, 
I will stop posting patches in this set to the mailing list!

For your reference, here are the two pending github pull requests:

https://github.com/sigrokproject/libsigrok/pull/17

https://github.com/sigrokproject/sigrok-cli/pull/1

Best regards,

Guido Trentalancia

Il 20 novembre 2018 08:54:14 CET, Soeren Apel <soe...@apelpie.net> ha scritto:
>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