+ break;
+ default:
+ return sr_sw_limits_config_get(&devc->limits, key, data);
+ }
+ if (!gvtype)
+ return SR_ERR_NA;
+
+ channel_group_cmd = 0;
+ channel_group_name = NULL;
+ if (cg) {
+ channel_group_cmd = SCPI_CMD_SELECT_CHANNEL;
+ channel_group_name = g_strdup(cg->name);
+ }
+
+ is_hmp_sqii = FALSE;
+ is_hmp_sqii |= cmd == SCPI_CMD_GET_OUTPUT_REGULATION;
+ is_hmp_sqii |= cmd == SCPI_CMD_GET_OVER_TEMPERATURE_PROTECTION_ACTIVE;
+ is_hmp_sqii &= devc->device->dialect == SCPI_DIALECT_HMP;
+ if (is_hmp_sqii) {
+ if (!cg) {
+ /* STAT:QUES:INST:ISUMx query requires channel spec. */
+ sr_err("Need a channel group for regulation or OTP-active query.");
+ return SR_ERR_NA;
+ }
+ ret = sr_scpi_cmd_resp(sdi, devc->device->commands,
+ 0, NULL, data, gvtype, cmd, channel_group_name);
+ } else {
+ ret = sr_scpi_cmd_resp(sdi, devc->device->commands,
+ channel_group_cmd, channel_group_name, data, gvtype, cmd);
+ }
+ g_free(channel_group_name);
+
+ /*
+ * Handle special cases
+ */
+
+ if (cmd == SCPI_CMD_GET_OUTPUT_REGULATION) {
+ if (devc->device->dialect == SCPI_DIALECT_PHILIPS) {
+ /*
+ * The Philips PM2800 series returns VOLT/CURR. We always return
+ * a GVariant string in the Rigol notation (CV/CC/UR).
+ */
+ s = g_variant_get_string(*data, NULL);
+ if (!g_strcmp0(s, "VOLT")) {
+ g_variant_unref(*data);
+ *data = g_variant_new_string("CV");
+ } else if (!g_strcmp0(s, "CURR")) {
+ g_variant_unref(*data);
+ *data = g_variant_new_string("CC");
+ }
+ }
+ if (devc->device->dialect == SCPI_DIALECT_HP_COMP) {
+ /* Evaluate Status Register from a HP 66xx in COMP mode. */
+ s = g_variant_get_string(*data, NULL);
+ sr_atoi(s, ®);
+ g_variant_unref(*data);
+ if (reg & (1 << 0))
+ *data = g_variant_new_string("CV");
+ else if (reg & (1 << 1))
+ *data = g_variant_new_string("CC");
+ else if (reg & (1 << 2))
+ *data = g_variant_new_string("UR");
+ else if (reg & (1 << 9))
+ *data = g_variant_new_string("CC-");
+ else
+ *data = g_variant_new_string("");
+ }
+ if (devc->device->dialect == SCPI_DIALECT_HP_66XXB) {
+ /* Evaluate Operational Status Register from a HP 66xxB. */
+ s = g_variant_get_string(*data, NULL);
+ sr_atoi(s, ®);
+ g_variant_unref(*data);
+ if (reg & (1 << 8))
+ *data = g_variant_new_string("CV");
+ else if (reg & (1 << 10))
+ *data = g_variant_new_string("CC");
+ else if (reg & (1 << 11))
+ *data = g_variant_new_string("CC-");
+ else
+ *data = g_variant_new_string("UR");
+ }
+ if (devc->device->dialect == SCPI_DIALECT_HMP) {
+ /* Evaluate Condition Status Register from a HMP series device. */
+ s = g_variant_get_string(*data, NULL);
+ sr_atoi(s, ®);
+ g_variant_unref(*data);
+ if (reg & (1 << 0))
+ *data = g_variant_new_string("CC");
+ else if (reg & (1 << 1))
+ *data = g_variant_new_string("CV");
+ else
+ *data = g_variant_new_string("UR");
+ }
+
+ s = g_variant_get_string(*data, NULL);
+ if (g_strcmp0(s, "CV") && g_strcmp0(s, "CC") && g_strcmp0(s, "CC-") &&
+ g_strcmp0(s, "UR") && g_strcmp0(s, "")) {
+
+ sr_err("Unknown response to SCPI_CMD_GET_OUTPUT_REGULATION: %s", s);
+ ret = SR_ERR_DATA;
+ }
+ }
+
+ if (cmd == SCPI_CMD_GET_OVER_VOLTAGE_PROTECTION_ACTIVE) {
+ if (devc->device->dialect == SCPI_DIALECT_HP_COMP) {
+ /* Evaluate Status Register from a HP 66xx in COMP mode. */
+ s = g_variant_get_string(*data, NULL);
+ sr_atoi(s, ®);
+ g_variant_unref(*data);
+ *data = g_variant_new_boolean(reg & (1 << 3));
+ }
+ if (devc->device->dialect == SCPI_DIALECT_HP_66XXB) {
+ /* Evaluate Questionable Status Register bit 0 from a HP 66xxB. */
+ s = g_variant_get_string(*data, NULL);
+ sr_atoi(s, ®);
+ g_variant_unref(*data);
+ *data = g_variant_new_boolean(reg & (1 << 0));
+ }
+ }
+
+ if (cmd == SCPI_CMD_GET_OVER_CURRENT_PROTECTION_ACTIVE) {
+ if (devc->device->dialect == SCPI_DIALECT_HP_COMP) {
+ /* Evaluate Status Register from a HP 66xx in COMP mode. */
+ s = g_variant_get_string(*data, NULL);
+ sr_atoi(s, ®);
+ g_variant_unref(*data);
+ *data = g_variant_new_boolean(reg & (1 << 6));
+ }
+ if (devc->device->dialect == SCPI_DIALECT_HP_66XXB) {
+ /* Evaluate Questionable Status Register bit 1 from a HP 66xxB. */
+ s = g_variant_get_string(*data, NULL);
+ sr_atoi(s, ®);
+ g_variant_unref(*data);
+ *data = g_variant_new_boolean(reg & (1 << 1));
+ }
+ }
+
+ if (cmd == SCPI_CMD_GET_OVER_TEMPERATURE_PROTECTION_ACTIVE) {
+ if (devc->device->dialect == SCPI_DIALECT_HP_COMP) {
+ /* Evaluate Status Register from a HP 66xx in COMP mode. */
+ s = g_variant_get_string(*data, NULL);
+ sr_atoi(s, ®);
+ g_variant_unref(*data);
+ *data = g_variant_new_boolean(reg & (1 << 4));
+ }
+ if (devc->device->dialect == SCPI_DIALECT_HP_66XXB ||
+ devc->device->dialect == SCPI_DIALECT_HMP) {
+ /* Evaluate Questionable Status Register bit 4 from a HP 66xxB. */
+ s = g_variant_get_string(*data, NULL);
+ sr_atoi(s, ®);
+ g_variant_unref(*data);
+ *data = g_variant_new_boolean(reg & (1 << 4));
+ }