SR_PRIV int korad_kaxxxxp_set_value(struct sr_serial_dev_inst *serial,
int target, struct dev_context *devc)
{
- char msg[21];
+ char *msg;
const char *cmd;
float value;
int ret;
g_mutex_lock(&devc->rw_mutex);
give_device_time_to_process(devc);
- msg[20] = 0;
switch (target) {
case KAXXXXP_CURRENT:
case KAXXXXP_VOLTAGE:
sr_err("Can't set measurable parameter %d.", target);
g_mutex_unlock(&devc->rw_mutex);
return SR_ERR;
- case KAXXXXP_CURRENT_MAX:
+ case KAXXXXP_CURRENT_LIMIT:
cmd = "ISET1:%05.3f";
- value = devc->current_max;
+ value = devc->set_current_limit;
break;
- case KAXXXXP_VOLTAGE_MAX:
+ case KAXXXXP_VOLTAGE_TARGET:
cmd = "VSET1:%05.2f";
- value = devc->voltage_max;
+ value = devc->set_voltage_target;
break;
case KAXXXXP_OUTPUT:
cmd = "OUT%01.0f";
- value = (devc->output_enabled) ? 1 : 0;
+ value = (devc->set_output_enabled) ? 1 : 0;
+ /* Set value back to recognize changes */
+ devc->output_enabled = devc->set_output_enabled;
break;
case KAXXXXP_BEEP:
cmd = "BEEP%01.0f";
- value = (devc->beep_enabled) ? 1 : 0;
+ value = (devc->set_beep_enabled) ? 1 : 0;
break;
case KAXXXXP_OCP:
cmd = "OCP%01.0f";
- value = (devc->ocp_enabled) ? 1 : 0;
+ value = (devc->set_ocp_enabled) ? 1 : 0;
+ /* Set value back to recognize changes */
+ devc->ocp_enabled = devc->set_ocp_enabled;
break;
case KAXXXXP_OVP:
cmd = "OVP%01.0f";
- value = (devc->ovp_enabled) ? 1 : 0;
+ value = (devc->set_ovp_enabled) ? 1 : 0;
+ /* Set value back to recognize changes */
+ devc->ovp_enabled = devc->set_ovp_enabled;
break;
case KAXXXXP_SAVE:
cmd = "SAV%01.0f";
return SR_ERR;
}
+ msg = g_malloc0(20 + 1);
if (cmd)
- snprintf(msg, 20, cmd, value);
+ sr_snprintf_ascii(msg, 20, cmd, value);
ret = korad_kaxxxxp_send_cmd(serial, msg);
devc->req_sent_at = g_get_monotonic_time();
+ g_free(msg);
g_mutex_unlock(&devc->rw_mutex);
ret = korad_kaxxxxp_send_cmd(serial, "IOUT1?");
value = &(devc->current);
break;
- case KAXXXXP_CURRENT_MAX:
+ case KAXXXXP_CURRENT_LIMIT:
/* Read set current from device. */
ret = korad_kaxxxxp_send_cmd(serial, "ISET1?");
- value = &(devc->current_max);
+ value = &(devc->current_limit);
break;
case KAXXXXP_VOLTAGE:
/* Read voltage from device. */
ret = korad_kaxxxxp_send_cmd(serial, "VOUT1?");
value = &(devc->voltage);
break;
- case KAXXXXP_VOLTAGE_MAX:
+ case KAXXXXP_VOLTAGE_TARGET:
/* Read set voltage from device. */
ret = korad_kaxxxxp_send_cmd(serial, "VSET1?");
- value = &(devc->voltage_max);
+ value = &(devc->voltage_target);
break;
case KAXXXXP_STATUS:
case KAXXXXP_OUTPUT:
sr_spew("Status: CH1: constant %s CH2: constant %s. "
"Tracking would be %s. Device is "
"%s and %s. Buttons are %s. Output is %s "
- "and extra byte is %s.",
+ "and extra bit is %s.",
(status_byte & (1 << 0)) ? "voltage" : "current",
(status_byte & (1 << 1)) ? "voltage" : "current",
(status_byte & (1 << 2)) ? "parallel" : "series",
}
/* Read the sixth byte from ISET? BUG workaround. */
- if (target == KAXXXXP_CURRENT_MAX)
+ if (target == KAXXXXP_CURRENT_LIMIT)
serial_read_blocking(serial, &status_byte, 1, 10);
g_mutex_unlock(&devc->rw_mutex);
GSList *l;
(void)fd;
+ (void)revents;
if (!(sdi = cb_data))
return TRUE;
serial = sdi->conn;
- if (revents == G_IO_IN) {
- /* Get the value. */
- korad_kaxxxxp_get_value(serial, devc->acquisition_target, devc);
-
- /* Note: digits/spec_digits will be overridden later. */
- sr_analog_init(&analog, &encoding, &meaning, &spec, 0);
-
- /* Send the value forward. */
- packet.type = SR_DF_ANALOG;
- packet.payload = &analog;
- analog.num_samples = 1;
- l = g_slist_copy(sdi->channels);
- if (devc->acquisition_target == KAXXXXP_CURRENT) {
- l = g_slist_remove_link(l, g_slist_nth(l, 0));
- analog.meaning->channels = l;
- analog.meaning->mq = SR_MQ_CURRENT;
- analog.meaning->unit = SR_UNIT_AMPERE;
- analog.meaning->mqflags = 0;
- analog.encoding->digits = 3;
- analog.spec->spec_digits = 3;
- analog.data = &devc->current;
- sr_session_send(sdi, &packet);
- }
- else if (devc->acquisition_target == KAXXXXP_VOLTAGE) {
- l = g_slist_remove_link(l, g_slist_nth(l, 1));
- analog.meaning->channels = l;
- analog.meaning->mq = SR_MQ_VOLTAGE;
- analog.meaning->unit = SR_UNIT_VOLT;
- analog.meaning->mqflags = SR_MQFLAG_DC;
- analog.encoding->digits = 2;
- analog.spec->spec_digits = 2;
- analog.data = &devc->voltage;
- sr_session_send(sdi, &packet);
- sr_sw_limits_update_samples_read(&devc->limits, 1);
- }
- next_measurement(devc);
+ /* Get the value. */
+ korad_kaxxxxp_get_value(serial, devc->acquisition_target, devc);
+
+ /* Note: digits/spec_digits will be overridden later. */
+ sr_analog_init(&analog, &encoding, &meaning, &spec, 0);
+
+ /* Send the value forward. */
+ packet.type = SR_DF_ANALOG;
+ packet.payload = &analog;
+ analog.num_samples = 1;
+ l = g_slist_copy(sdi->channels);
+ if (devc->acquisition_target == KAXXXXP_CURRENT) {
+ l = g_slist_remove_link(l, g_slist_nth(l, 0));
+ analog.meaning->channels = l;
+ analog.meaning->mq = SR_MQ_CURRENT;
+ analog.meaning->unit = SR_UNIT_AMPERE;
+ analog.meaning->mqflags = SR_MQFLAG_DC;
+ analog.encoding->digits = 3;
+ analog.spec->spec_digits = 3;
+ analog.data = &devc->current;
+ sr_session_send(sdi, &packet);
+ } else if (devc->acquisition_target == KAXXXXP_VOLTAGE) {
+ l = g_slist_remove_link(l, g_slist_nth(l, 1));
+ analog.meaning->channels = l;
+ analog.meaning->mq = SR_MQ_VOLTAGE;
+ analog.meaning->unit = SR_UNIT_VOLT;
+ analog.meaning->mqflags = SR_MQFLAG_DC;
+ analog.encoding->digits = 2;
+ analog.spec->spec_digits = 2;
+ analog.data = &devc->voltage;
+ sr_session_send(sdi, &packet);
+ sr_sw_limits_update_samples_read(&devc->limits, 1);
}
+ next_measurement(devc);
if (sr_sw_limits_check(&devc->limits))
sr_dev_acquisition_stop(sdi);