itech-it8500: rephrase config get/set/list, reflect error paths

Explicitly "break the flow" when internal status gathering fails, to
reflect that an error path is taken and the config call will fail. The
conditional assignment of response data in case of success could be
slightly misleading (it was to me during review).

Eliminate a goto which kind of circumvented the optional transmission of
a request to the device. Instead test whether a command was filled in to
determine whether a command needs to get sent.
This commit is contained in:
Gerhard Sittig 2020-10-06 19:13:34 +02:00
parent f21b6983e8
commit 78b07caf11
1 changed files with 62 additions and 48 deletions

View File

@ -330,90 +330,100 @@ static int config_get(uint32_t key, GVariant **data,
break; break;
case SR_CONF_ENABLED: case SR_CONF_ENABLED:
ret = itech_it8500_get_status(sdi); ret = itech_it8500_get_status(sdi);
if (ret == SR_OK) if (ret != SR_OK)
*data = g_variant_new_boolean(devc->load_on); break;
*data = g_variant_new_boolean(devc->load_on);
break; break;
case SR_CONF_REGULATION: case SR_CONF_REGULATION:
ret = itech_it8500_get_status(sdi); ret = itech_it8500_get_status(sdi);
if (ret == SR_OK) { if (ret != SR_OK)
mode = itech_it8500_mode_to_string(devc->mode); break;
*data = g_variant_new_string(mode); mode = itech_it8500_mode_to_string(devc->mode);
} *data = g_variant_new_string(mode);
break; break;
case SR_CONF_VOLTAGE: case SR_CONF_VOLTAGE:
ret = itech_it8500_get_status(sdi); ret = itech_it8500_get_status(sdi);
if (ret == SR_OK) if (ret != SR_OK)
*data = g_variant_new_double(devc->voltage); break;
*data = g_variant_new_double(devc->voltage);
break; break;
case SR_CONF_VOLTAGE_TARGET: case SR_CONF_VOLTAGE_TARGET:
ret = itech_it8500_get_int(sdi, CMD_GET_CV_VOLTAGE, &ival); ret = itech_it8500_get_int(sdi, CMD_GET_CV_VOLTAGE, &ival);
if (ret == SR_OK) if (ret != SR_OK)
*data = g_variant_new_double((double)ival / 1000.0); break;
*data = g_variant_new_double((double)ival / 1000.0);
break; break;
case SR_CONF_CURRENT: case SR_CONF_CURRENT:
ret = itech_it8500_get_status(sdi); ret = itech_it8500_get_status(sdi);
if (ret == SR_OK) if (ret != SR_OK)
*data = g_variant_new_double(devc->current); break;
*data = g_variant_new_double(devc->current);
break; break;
case SR_CONF_CURRENT_LIMIT: case SR_CONF_CURRENT_LIMIT:
ret = itech_it8500_get_int(sdi, CMD_GET_CC_CURRENT, &ival); ret = itech_it8500_get_int(sdi, CMD_GET_CC_CURRENT, &ival);
if (ret == SR_OK) if (ret != SR_OK)
*data = g_variant_new_double((double)ival / 10000.0); break;
*data = g_variant_new_double((double)ival / 10000.0);
break; break;
case SR_CONF_POWER: case SR_CONF_POWER:
ret = itech_it8500_get_status(sdi); ret = itech_it8500_get_status(sdi);
if (ret == SR_OK) if (ret != SR_OK)
*data = g_variant_new_double(devc->power); break;
*data = g_variant_new_double(devc->power);
break; break;
case SR_CONF_POWER_TARGET: case SR_CONF_POWER_TARGET:
ret = itech_it8500_get_int(sdi, CMD_GET_CW_POWER, &ival); ret = itech_it8500_get_int(sdi, CMD_GET_CW_POWER, &ival);
if (ret == SR_OK) if (ret != SR_OK)
*data = g_variant_new_double((double)ival / 1000.0); break;
*data = g_variant_new_double((double)ival / 1000.0);
break; break;
case SR_CONF_RESISTANCE_TARGET: case SR_CONF_RESISTANCE_TARGET:
ret = itech_it8500_get_int(sdi, CMD_GET_CR_RESISTANCE, &ival); ret = itech_it8500_get_int(sdi, CMD_GET_CR_RESISTANCE, &ival);
if (ret == SR_OK) if (ret != SR_OK)
*data = g_variant_new_double((double)ival / 1000.0); break;
*data = g_variant_new_double((double)ival / 1000.0);
break; break;
case SR_CONF_OVER_VOLTAGE_PROTECTION_ENABLED: case SR_CONF_OVER_VOLTAGE_PROTECTION_ENABLED:
*data = g_variant_new_boolean(TRUE); *data = g_variant_new_boolean(TRUE);
break; break;
case SR_CONF_OVER_VOLTAGE_PROTECTION_ACTIVE: case SR_CONF_OVER_VOLTAGE_PROTECTION_ACTIVE:
ret = itech_it8500_get_status(sdi); ret = itech_it8500_get_status(sdi);
if (ret == SR_OK) { if (ret != SR_OK)
bval = devc->demand_state & DS_OV_FLAG; break;
*data = g_variant_new_boolean(bval); bval = devc->demand_state & DS_OV_FLAG;
} *data = g_variant_new_boolean(bval);
break; break;
case SR_CONF_OVER_VOLTAGE_PROTECTION_THRESHOLD: case SR_CONF_OVER_VOLTAGE_PROTECTION_THRESHOLD:
ret = itech_it8500_get_int(sdi, CMD_GET_MAX_VOLTAGE, &ival); ret = itech_it8500_get_int(sdi, CMD_GET_MAX_VOLTAGE, &ival);
if (ret == SR_OK) if (ret != SR_OK)
*data = g_variant_new_double((double)ival / 1000.0); break;
*data = g_variant_new_double((double)ival / 1000.0);
break; break;
case SR_CONF_OVER_CURRENT_PROTECTION_ENABLED: case SR_CONF_OVER_CURRENT_PROTECTION_ENABLED:
*data = g_variant_new_boolean(TRUE); *data = g_variant_new_boolean(TRUE);
break; break;
case SR_CONF_OVER_CURRENT_PROTECTION_ACTIVE: case SR_CONF_OVER_CURRENT_PROTECTION_ACTIVE:
ret = itech_it8500_get_status(sdi); ret = itech_it8500_get_status(sdi);
if (ret == SR_OK) { if (ret != SR_OK)
bval = devc->demand_state & DS_OC_FLAG; break;
*data = g_variant_new_boolean(bval); bval = devc->demand_state & DS_OC_FLAG;
} *data = g_variant_new_boolean(bval);
break; break;
case SR_CONF_OVER_CURRENT_PROTECTION_THRESHOLD: case SR_CONF_OVER_CURRENT_PROTECTION_THRESHOLD:
ret = itech_it8500_get_int(sdi, CMD_GET_MAX_CURRENT, &ival); ret = itech_it8500_get_int(sdi, CMD_GET_MAX_CURRENT, &ival);
if (ret == SR_OK) if (ret != SR_OK)
*data = g_variant_new_double((double)ival / 10000.0); break;
*data = g_variant_new_double((double)ival / 10000.0);
break; break;
case SR_CONF_OVER_TEMPERATURE_PROTECTION: case SR_CONF_OVER_TEMPERATURE_PROTECTION:
*data = g_variant_new_boolean(TRUE); *data = g_variant_new_boolean(TRUE);
break; break;
case SR_CONF_OVER_TEMPERATURE_PROTECTION_ACTIVE: case SR_CONF_OVER_TEMPERATURE_PROTECTION_ACTIVE:
ret = itech_it8500_get_status(sdi); ret = itech_it8500_get_status(sdi);
if (ret == SR_OK) { if (ret != SR_OK)
bval = devc->demand_state & DS_OT_FLAG; break;
*data = g_variant_new_boolean(bval); bval = devc->demand_state & DS_OT_FLAG;
} *data = g_variant_new_boolean(bval);
break; break;
/* Hardware doesn't support under voltage reporting. */ /* Hardware doesn't support under voltage reporting. */
case SR_CONF_UNDER_VOLTAGE_CONDITION: case SR_CONF_UNDER_VOLTAGE_CONDITION:
@ -427,6 +437,7 @@ static int config_get(uint32_t key, GVariant **data,
sr_dbg("%s: Unsupported key: %u (%s)", __func__, key, sr_dbg("%s: Unsupported key: %u (%s)", __func__, key,
kinfo ? kinfo->name : "unknown"); kinfo ? kinfo->name : "unknown");
ret = SR_ERR_NA; ret = SR_ERR_NA;
break;
} }
return ret; return ret;
@ -463,27 +474,30 @@ static int config_set(uint32_t key, GVariant *data,
case SR_CONF_LIMIT_MSEC: case SR_CONF_LIMIT_MSEC:
case SR_CONF_LIMIT_SAMPLES: case SR_CONF_LIMIT_SAMPLES:
ret = sr_sw_limits_config_set(&devc->limits, key, data); ret = sr_sw_limits_config_set(&devc->limits, key, data);
goto done; break;
case SR_CONF_SAMPLERATE: case SR_CONF_SAMPLERATE:
new_sr = g_variant_get_uint64(data); new_sr = g_variant_get_uint64(data);
if (new_sr < MIN_SAMPLE_RATE || if (new_sr < MIN_SAMPLE_RATE) {
new_sr > samplerates[devc->max_sample_rate_idx]) {
ret = SR_ERR_SAMPLERATE; ret = SR_ERR_SAMPLERATE;
goto done; break;
}
if (new_sr > samplerates[devc->max_sample_rate_idx]) {
ret = SR_ERR_SAMPLERATE;
break;
} }
devc->sample_rate = new_sr; devc->sample_rate = new_sr;
goto done; break;
case SR_CONF_ENABLED: case SR_CONF_ENABLED:
cmd->command = CMD_LOAD_ON_OFF; cmd->command = CMD_LOAD_ON_OFF;
cmd->data[0] = g_variant_get_boolean(data); cmd->data[0] = g_variant_get_boolean(data);
break; break;
case SR_CONF_REGULATION: case SR_CONF_REGULATION:
cmd->command = CMD_SET_MODE;
s = g_variant_get_string(data, NULL); s = g_variant_get_string(data, NULL);
if (itech_it8500_string_to_mode(s, &mode) != SR_OK) { if (itech_it8500_string_to_mode(s, &mode) != SR_OK) {
ret = SR_ERR_ARG; ret = SR_ERR_ARG;
goto done; break;
} }
cmd->command = CMD_SET_MODE;
cmd->data[0] = mode; cmd->data[0] = mode;
break; break;
case SR_CONF_VOLTAGE_TARGET: case SR_CONF_VOLTAGE_TARGET:
@ -516,18 +530,18 @@ static int config_set(uint32_t key, GVariant *data,
ivalue = g_variant_get_double(data) * 10000.0; ivalue = g_variant_get_double(data) * 10000.0;
WL32(&cmd->data[0], ivalue); WL32(&cmd->data[0], ivalue);
break; break;
default: default:
sr_dbg("%s: Unsupported key: %u (%s)", __func__, key, sr_dbg("%s: Unsupported key: %u (%s)", __func__, key,
kinfo ? kinfo->name : "unknown"); kinfo ? kinfo->name : "unknown");
ret = SR_ERR_NA; ret = SR_ERR_NA;
goto done; break;
} }
cmd->address = devc->address; if (ret == SR_OK && cmd->command) {
ret = itech_it8500_cmd(sdi, cmd, &response); cmd->address = devc->address;
ret = itech_it8500_cmd(sdi, cmd, &response);
}
done:
g_free(cmd); g_free(cmd);
g_free(response); g_free(response);