* This file is part of the libsigrok project.
*
* Copyright (C) 2015 Hannu Vuolasaho <vuokkosetae@gmail.com>
+ * Copyright (C) 2018 Frank Stettner <frank-stettner@gmx.net>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
/* Sometimes the KA3005P has an extra 0x01 after the ID. */
{KORAD_KA3005P_0X01, "Korad", "KA3005P",
"KORADKA3005PV2.0\x01", 1, {0, 31, 0.01}, {0, 5, 0.001}},
+ /* Sometimes the KA3005P has an extra 0xBC after the ID. */
+ {KORAD_KA3005P_0XBC, "Korad", "KA3005P",
+ "KORADKA3005PV2.0\xBC", 1, {0, 31, 0.01}, {0, 5, 0.001}},
+ {KORAD_KD3005P, "Korad", "KD3005P",
+ "KORAD KD3005P V2.0", 1, {0, 31, 0.01}, {0, 5, 0.001}},
+ {KORAD_KD3005P_V20_NOSP, "Korad", "KD3005P",
+ "KORADKD3005PV2.0", 1, {0, 31, 0.01}, {0, 5, 0.001}},
+ {RND_320K30PV, "RND", "KA3005P",
+ "RND 320-KA3005P V2.0", 1, {0, 31, 0.01}, {0, 5, 0.001}},
+ {TENMA_72_2540_V20, "Tenma", "72-2540",
+ "TENMA72-2540V2.0", 1, {0, 31, 0.01}, {0, 5, 0.001}},
+ {TENMA_72_2540_V21, "Tenma", "72-2540",
+ "TENMA 72-2540 V2.1", 1, {0, 31, 0.01}, {0, 5, 0.001}},
+ {TENMA_72_2535_V21, "Tenma", "72-2535",
+ "TENMA 72-2535 V2.1", 1, {0, 31, 0.01}, {0, 3, 0.001}},
+ {STAMOS_SLS31_V20, "Stamos Soldering", "S-LS-31",
+ "S-LS-31 V2.0", 1, {0, 31, 0.01}, {0, 5.1, 0.001}},
ALL_ZERO
};
sr_dbg("Received: %d, %s", i, reply);
model_id = -1;
for (i = 0; models[i].id; i++) {
- if (!strcmp(models[i].id, reply))
+ if (!g_strcmp0(models[i].id, reply))
model_id = i;
}
if (model_id < 0) {
sdi->inst_type = SR_INST_SERIAL;
sdi->conn = serial;
- sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "CH1");
+ sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "V");
+ sr_channel_new(sdi, 1, SR_CHANNEL_ANALOG, TRUE, "I");
devc = g_malloc0(sizeof(struct dev_context));
sr_sw_limits_init(&devc->limits);
+ g_mutex_init(&devc->rw_mutex);
devc->model = &models[model_id];
- devc->reply[5] = 0;
devc->req_sent_at = 0;
sdi->priv = devc;
case SR_CONF_LIMIT_MSEC:
return sr_sw_limits_config_get(&devc->limits, key, data);
case SR_CONF_VOLTAGE:
+ korad_kaxxxxp_get_value(sdi->conn, KAXXXXP_VOLTAGE, devc);
*data = g_variant_new_double(devc->voltage);
break;
case SR_CONF_VOLTAGE_TARGET:
+ korad_kaxxxxp_get_value(sdi->conn, KAXXXXP_VOLTAGE_MAX, devc);
*data = g_variant_new_double(devc->voltage_max);
break;
case SR_CONF_CURRENT:
+ korad_kaxxxxp_get_value(sdi->conn, KAXXXXP_CURRENT, devc);
*data = g_variant_new_double(devc->current);
break;
case SR_CONF_CURRENT_LIMIT:
+ korad_kaxxxxp_get_value(sdi->conn, KAXXXXP_CURRENT_MAX, devc);
*data = g_variant_new_double(devc->current_max);
break;
case SR_CONF_ENABLED:
+ korad_kaxxxxp_get_value(sdi->conn, KAXXXXP_OUTPUT, devc);
*data = g_variant_new_boolean(devc->output_enabled);
break;
case SR_CONF_REGULATION:
/* Dual channel not supported. */
+ korad_kaxxxxp_get_value(sdi->conn, KAXXXXP_STATUS, devc);
*data = g_variant_new_string((devc->cc_mode[0]) ? "CC" : "CV");
break;
case SR_CONF_OVER_CURRENT_PROTECTION_ENABLED:
+ korad_kaxxxxp_get_value(sdi->conn, KAXXXXP_OCP, devc);
*data = g_variant_new_boolean(devc->ocp_enabled);
break;
case SR_CONF_OVER_VOLTAGE_PROTECTION_ENABLED:
+ korad_kaxxxxp_get_value(sdi->conn, KAXXXXP_OVP, devc);
*data = g_variant_new_boolean(devc->ovp_enabled);
break;
default:
if (dval < devc->model->voltage[0] || dval > devc->model->voltage[1])
return SR_ERR_ARG;
devc->voltage_max = dval;
- devc->target = KAXXXXP_VOLTAGE_MAX;
- if (korad_kaxxxxp_set_value(sdi->conn, devc) < 0)
+ if (korad_kaxxxxp_set_value(sdi->conn, KAXXXXP_VOLTAGE_MAX, devc) < 0)
return SR_ERR;
break;
case SR_CONF_CURRENT_LIMIT:
if (dval < devc->model->current[0] || dval > devc->model->current[1])
return SR_ERR_ARG;
devc->current_max = dval;
- devc->target = KAXXXXP_CURRENT_MAX;
- if (korad_kaxxxxp_set_value(sdi->conn, devc) < 0)
+ if (korad_kaxxxxp_set_value(sdi->conn, KAXXXXP_CURRENT_MAX, devc) < 0)
return SR_ERR;
break;
case SR_CONF_ENABLED:
bval = g_variant_get_boolean(data);
/* Set always so it is possible turn off with sigrok-cli. */
devc->output_enabled = bval;
- devc->target = KAXXXXP_OUTPUT;
- if (korad_kaxxxxp_set_value(sdi->conn, devc) < 0)
+ if (korad_kaxxxxp_set_value(sdi->conn, KAXXXXP_OUTPUT, devc) < 0)
return SR_ERR;
break;
case SR_CONF_OVER_CURRENT_PROTECTION_ENABLED:
bval = g_variant_get_boolean(data);
devc->ocp_enabled = bval;
- devc->target = KAXXXXP_OCP;
- if (korad_kaxxxxp_set_value(sdi->conn, devc) < 0)
+ if (korad_kaxxxxp_set_value(sdi->conn, KAXXXXP_OCP, devc) < 0)
return SR_ERR;
break;
case SR_CONF_OVER_VOLTAGE_PROTECTION_ENABLED:
bval = g_variant_get_boolean(data);
devc->ovp_enabled = bval;
- devc->target = KAXXXXP_OVP;
- if (korad_kaxxxxp_set_value(sdi->conn, devc) < 0)
+ if (korad_kaxxxxp_set_value(sdi->conn, KAXXXXP_OVP, devc) < 0)
return SR_ERR;
break;
default:
case SR_CONF_DEVICE_OPTIONS:
return STD_CONFIG_LIST(key, data, sdi, cg, scanopts, drvopts, devopts);
case SR_CONF_VOLTAGE_TARGET:
+ if (!devc || !devc->model)
+ return SR_ERR_ARG;
*data = std_gvar_min_max_step_array(devc->model->voltage);
break;
case SR_CONF_CURRENT_LIMIT:
+ if (!devc || !devc->model)
+ return SR_ERR_ARG;
*data = std_gvar_min_max_step_array(devc->model->current);
break;
default:
return SR_OK;
}
+static int dev_close(struct sr_dev_inst *sdi)
+{
+ struct dev_context *devc;
+
+ devc = (sdi) ? sdi->priv : NULL;
+ if (devc)
+ g_mutex_clear(&devc->rw_mutex);
+
+ return std_serial_dev_close(sdi);
+}
+
static int dev_acquisition_start(const struct sr_dev_inst *sdi)
{
struct dev_context *devc;
sr_sw_limits_acquisition_start(&devc->limits);
std_session_send_df_header(sdi);
- devc->reply_pending = FALSE;
devc->req_sent_at = 0;
serial = sdi->conn;
serial_source_add(sdi->session, serial, G_IO_IN,
.config_set = config_set,
.config_list = config_list,
.dev_open = std_serial_dev_open,
- .dev_close = std_serial_dev_close,
+ .dev_close = dev_close,
.dev_acquisition_start = dev_acquisition_start,
.dev_acquisition_stop = std_serial_dev_acquisition_stop,
.context = NULL,