manson-hcs-3xxx: Use maximum voltage and current read from device.

This commit is contained in:
Matthias Heidbrink 2014-06-26 17:56:54 +02:00 committed by Bert Vermeulen
parent a9cf203593
commit 5437a0adae
2 changed files with 31 additions and 9 deletions

View File

@ -91,7 +91,7 @@ static GSList *scan(GSList *options)
GSList *devices, *l; GSList *devices, *l;
const char *conn, *serialcomm; const char *conn, *serialcomm;
struct sr_serial_dev_inst *serial; struct sr_serial_dev_inst *serial;
char reply[50], **tokens; char reply[50], **tokens, *dummy;
drvc = di->priv; drvc = di->priv;
drvc->instances = NULL; drvc->instances = NULL;
@ -171,13 +171,24 @@ static GSList *scan(GSList *options)
sdi->priv = devc; sdi->priv = devc;
/* Get current device status. */ /* Get current voltage, current, status. */
if ((hcs_send_cmd(serial, "GETD\r") < 0) || if ((hcs_send_cmd(serial, "GETD\r") < 0) ||
(hcs_read_reply(serial, 2, reply, sizeof(reply)) < 0)) (hcs_read_reply(serial, 2, reply, sizeof(reply)) < 0))
return NULL; goto exit_err;
tokens = g_strsplit((const gchar *)&reply, "\r", 2); tokens = g_strsplit((const gchar *)&reply, "\r", 2);
if (hcs_parse_volt_curr_mode(sdi, tokens) < 0) if (hcs_parse_volt_curr_mode(sdi, tokens) < 0)
goto exit_err; goto exit_err;
g_strfreev(tokens);
/* Get max. voltage and current. */
if ((hcs_send_cmd(serial, "GMAX\r") < 0) ||
(hcs_read_reply(serial, 2, reply, sizeof(reply)) < 0))
goto exit_err;
tokens = g_strsplit((const gchar *)&reply, "\r", 2);
devc->current_max_device = g_strtod(&tokens[0][3], &dummy) * devc->model->current[2];
tokens[0][3] = '\0';
devc->voltage_max_device = g_strtod(tokens[0], &dummy) * devc->model->voltage[2];
g_strfreev(tokens);
drvc->instances = g_slist_append(drvc->instances, sdi); drvc->instances = g_slist_append(drvc->instances, sdi);
devices = g_slist_append(devices, sdi); devices = g_slist_append(devices, sdi);
@ -273,7 +284,7 @@ static int config_set(int key, GVariant *data, const struct sr_dev_inst *sdi,
break; break;
case SR_CONF_OUTPUT_CURRENT_MAX: case SR_CONF_OUTPUT_CURRENT_MAX:
dval = g_variant_get_double(data); dval = g_variant_get_double(data);
if (dval < devc->model->current[0] || dval > devc->model->current[1]) if (dval < devc->model->current[0] || dval > devc->current_max_device)
return SR_ERR_ARG; return SR_ERR_ARG;
if ((hcs_send_cmd(sdi->conn, "CURR%03.0f\r", if ((hcs_send_cmd(sdi->conn, "CURR%03.0f\r",
@ -293,7 +304,7 @@ static int config_set(int key, GVariant *data, const struct sr_dev_inst *sdi,
break; break;
case SR_CONF_OUTPUT_VOLTAGE_MAX: case SR_CONF_OUTPUT_VOLTAGE_MAX:
dval = g_variant_get_double(data); dval = g_variant_get_double(data);
if (dval < devc->model->voltage[0] || dval > devc->model->voltage[1]) if (dval < devc->model->voltage[0] || dval > devc->voltage_max_device)
return SR_ERR_ARG; return SR_ERR_ARG;
if ((hcs_send_cmd(sdi->conn, "VOLT%03.0f\r", if ((hcs_send_cmd(sdi->conn, "VOLT%03.0f\r",
@ -315,6 +326,7 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
struct dev_context *devc; struct dev_context *devc;
GVariant *gvar; GVariant *gvar;
GVariantBuilder gvb; GVariantBuilder gvb;
double dval;
int idx; int idx;
(void)cg; (void)cg;
@ -336,7 +348,11 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY); g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
/* Min, max, step. */ /* Min, max, step. */
for (idx = 0; idx < 3; idx++) { for (idx = 0; idx < 3; idx++) {
gvar = g_variant_new_double(devc->model->current[idx]); if (idx == 1)
dval = devc->current_max_device;
else
dval = devc->model->current[idx];
gvar = g_variant_new_double(dval);
g_variant_builder_add_value(&gvb, gvar); g_variant_builder_add_value(&gvb, gvar);
} }
*data = g_variant_builder_end(&gvb); *data = g_variant_builder_end(&gvb);
@ -345,7 +361,11 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY); g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
/* Min, max, step. */ /* Min, max, step. */
for (idx = 0; idx < 3; idx++) { for (idx = 0; idx < 3; idx++) {
gvar = g_variant_new_double(devc->model->voltage[idx]); if (idx == 1)
dval = devc->voltage_max_device;
else
dval = devc->model->voltage[idx];
gvar = g_variant_new_double(dval);
g_variant_builder_add_value(&gvb, gvar); g_variant_builder_add_value(&gvb, gvar);
} }
*data = g_variant_builder_end(&gvb); *data = g_variant_builder_end(&gvb);

View File

@ -78,9 +78,11 @@ struct dev_context {
void *cb_data; void *cb_data;
float current; /**< Last current value [A] read from device. */ float current; /**< Last current value [A] read from device. */
float current_max; /**< Output current set */ float current_max; /**< Output current set. */
float current_max_device;/**< Device-provided maximum output current. */
float voltage; /**< Last voltage value [V] read from device. */ float voltage; /**< Last voltage value [V] read from device. */
float voltage_max; /**< Output voltage set */ float voltage_max; /**< Output voltage set. */
float voltage_max_device;/**< Device-provided maximum output voltage. */
gboolean cc_mode; /**< Device is in constant current mode (otherwise constant voltage). */ gboolean cc_mode; /**< Device is in constant current mode (otherwise constant voltage). */
gboolean output_enabled; /**< Is the output enabled? */ gboolean output_enabled; /**< Is the output enabled? */