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