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:
parent
f21b6983e8
commit
78b07caf11
|
@ -330,49 +330,57 @@ 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)
|
||||||
|
break;
|
||||||
*data = g_variant_new_boolean(devc->load_on);
|
*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)
|
||||||
|
break;
|
||||||
mode = itech_it8500_mode_to_string(devc->mode);
|
mode = itech_it8500_mode_to_string(devc->mode);
|
||||||
*data = g_variant_new_string(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)
|
||||||
|
break;
|
||||||
*data = g_variant_new_double(devc->voltage);
|
*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)
|
||||||
|
break;
|
||||||
*data = g_variant_new_double((double)ival / 1000.0);
|
*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)
|
||||||
|
break;
|
||||||
*data = g_variant_new_double(devc->current);
|
*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)
|
||||||
|
break;
|
||||||
*data = g_variant_new_double((double)ival / 10000.0);
|
*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)
|
||||||
|
break;
|
||||||
*data = g_variant_new_double(devc->power);
|
*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)
|
||||||
|
break;
|
||||||
*data = g_variant_new_double((double)ival / 1000.0);
|
*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)
|
||||||
|
break;
|
||||||
*data = g_variant_new_double((double)ival / 1000.0);
|
*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:
|
||||||
|
@ -380,14 +388,15 @@ static int config_get(uint32_t key, GVariant **data,
|
||||||
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)
|
||||||
|
break;
|
||||||
bval = devc->demand_state & DS_OV_FLAG;
|
bval = devc->demand_state & DS_OV_FLAG;
|
||||||
*data = g_variant_new_boolean(bval);
|
*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)
|
||||||
|
break;
|
||||||
*data = g_variant_new_double((double)ival / 1000.0);
|
*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:
|
||||||
|
@ -395,14 +404,15 @@ static int config_get(uint32_t key, GVariant **data,
|
||||||
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)
|
||||||
|
break;
|
||||||
bval = devc->demand_state & DS_OC_FLAG;
|
bval = devc->demand_state & DS_OC_FLAG;
|
||||||
*data = g_variant_new_boolean(bval);
|
*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)
|
||||||
|
break;
|
||||||
*data = g_variant_new_double((double)ival / 10000.0);
|
*data = g_variant_new_double((double)ival / 10000.0);
|
||||||
break;
|
break;
|
||||||
case SR_CONF_OVER_TEMPERATURE_PROTECTION:
|
case SR_CONF_OVER_TEMPERATURE_PROTECTION:
|
||||||
|
@ -410,10 +420,10 @@ static int config_get(uint32_t key, GVariant **data,
|
||||||
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)
|
||||||
|
break;
|
||||||
bval = devc->demand_state & DS_OT_FLAG;
|
bval = devc->demand_state & DS_OT_FLAG;
|
||||||
*data = g_variant_new_boolean(bval);
|
*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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ret == SR_OK && cmd->command) {
|
||||||
cmd->address = devc->address;
|
cmd->address = devc->address;
|
||||||
ret = itech_it8500_cmd(sdi, cmd, &response);
|
ret = itech_it8500_cmd(sdi, cmd, &response);
|
||||||
|
}
|
||||||
|
|
||||||
done:
|
|
||||||
g_free(cmd);
|
g_free(cmd);
|
||||||
g_free(response);
|
g_free(response);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue