X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Frdtech-dps%2Fapi.c;h=fad31d629434ef5ae99f166305fd6ba1e7a5e5ec;hb=cb828f1b3e00ccd0ad23d7cb98dca4d0d4749b07;hp=ccea656eb6dde7e0cfb213050690ee0786524712;hpb=7c0891b0b82049b4cc3c0dd70b8483d037dab36f;p=libsigrok.git diff --git a/src/hardware/rdtech-dps/api.c b/src/hardware/rdtech-dps/api.c index ccea656e..fad31d62 100644 --- a/src/hardware/rdtech-dps/api.c +++ b/src/hardware/rdtech-dps/api.c @@ -19,6 +19,7 @@ */ #include +#include #include "protocol.h" static const uint32_t scanopts[] = { @@ -49,12 +50,12 @@ static const uint32_t devopts[] = { /* Model ID, model name, max current, max voltage, max power */ static const struct rdtech_dps_model supported_models[] = { - { 3005, "DPS3005", 3, 50, 160 }, - { 5005, "DPS5005", 5, 50, 250 }, - { 5205, "DPH5005", 5, 50, 250 }, - { 5015, "DPS5015", 15, 50, 750 }, - { 5020, "DPS5020", 20, 50, 1000 }, - { 8005, "DPS8005", 5, 80, 408 }, + { 3005, "DPS3005", 5, 30, 160, 3, 2 }, + { 5005, "DPS5005", 5, 50, 250, 3, 2 }, + { 5205, "DPH5005", 5, 50, 250, 3, 2 }, + { 5015, "DPS5015", 15, 50, 750, 2, 2 }, + { 5020, "DPS5020", 20, 50, 1000, 2, 2 }, + { 8005, "DPS8005", 5, 80, 408, 3, 2 }, }; static struct sr_dev_driver rdtech_dps_driver_info; @@ -96,6 +97,8 @@ static struct sr_dev_inst *probe_device(struct sr_modbus_dev_inst *modbus) devc = g_malloc0(sizeof(struct dev_context)); sr_sw_limits_init(&devc->limits); devc->model = model; + devc->current_multiplier = pow(10.0, model->current_digits); + devc->voltage_multiplier = pow(10.0, model->voltage_digits); sdi->priv = devc; @@ -188,19 +191,19 @@ static int config_get(uint32_t key, GVariant **data, break; case SR_CONF_VOLTAGE: if ((ret = rdtech_dps_get_reg(sdi, REG_UOUT, &ivalue)) == SR_OK) - *data = g_variant_new_double((float)ivalue / 100.0f); + *data = g_variant_new_double((float)ivalue / devc->voltage_multiplier); break; case SR_CONF_VOLTAGE_TARGET: if ((ret = rdtech_dps_get_reg(sdi, REG_USET, &ivalue)) == SR_OK) - *data = g_variant_new_double((float)ivalue / 100.0f); + *data = g_variant_new_double((float)ivalue / devc->voltage_multiplier); break; case SR_CONF_CURRENT: if ((ret = rdtech_dps_get_reg(sdi, REG_IOUT, &ivalue)) == SR_OK) - *data = g_variant_new_double((float)ivalue / 100.0f); + *data = g_variant_new_double((float)ivalue / devc->current_multiplier); break; case SR_CONF_CURRENT_LIMIT: if ((ret = rdtech_dps_get_reg(sdi, REG_ISET, &ivalue)) == SR_OK) - *data = g_variant_new_double((float)ivalue / 1000.0f); + *data = g_variant_new_double((float)ivalue / devc->current_multiplier); break; case SR_CONF_OVER_VOLTAGE_PROTECTION_ENABLED: *data = g_variant_new_boolean(TRUE); @@ -211,7 +214,7 @@ static int config_get(uint32_t key, GVariant **data, break; case SR_CONF_OVER_VOLTAGE_PROTECTION_THRESHOLD: if ((ret = rdtech_dps_get_reg(sdi, PRE_OVPSET, &ivalue)) == SR_OK) - *data = g_variant_new_double((float)ivalue / 100.0f); + *data = g_variant_new_double((float)ivalue / devc->voltage_multiplier); break; case SR_CONF_OVER_CURRENT_PROTECTION_ENABLED: *data = g_variant_new_boolean(TRUE); @@ -222,7 +225,7 @@ static int config_get(uint32_t key, GVariant **data, break; case SR_CONF_OVER_CURRENT_PROTECTION_THRESHOLD: if ((ret = rdtech_dps_get_reg(sdi, PRE_OCPSET, &ivalue)) == SR_OK) - *data = g_variant_new_double((float)ivalue / 1000.0f); + *data = g_variant_new_double((float)ivalue / devc->current_multiplier); break; default: return SR_ERR_NA; @@ -247,13 +250,17 @@ static int config_set(uint32_t key, GVariant *data, case SR_CONF_ENABLED: return rdtech_dps_set_reg(sdi, REG_ENABLE, g_variant_get_boolean(data)); case SR_CONF_VOLTAGE_TARGET: - return rdtech_dps_set_reg(sdi, REG_USET, g_variant_get_double(data) * 100); + return rdtech_dps_set_reg(sdi, REG_USET, + g_variant_get_double(data) * devc->voltage_multiplier); case SR_CONF_CURRENT_LIMIT: - return rdtech_dps_set_reg(sdi, REG_ISET, g_variant_get_double(data) * 1000); + return rdtech_dps_set_reg(sdi, REG_ISET, + g_variant_get_double(data) * devc->current_multiplier); case SR_CONF_OVER_VOLTAGE_PROTECTION_THRESHOLD: - return rdtech_dps_set_reg(sdi, PRE_OVPSET, g_variant_get_double(data) * 100); + return rdtech_dps_set_reg(sdi, PRE_OVPSET, + g_variant_get_double(data) * devc->voltage_multiplier); case SR_CONF_OVER_CURRENT_PROTECTION_THRESHOLD: - return rdtech_dps_set_reg(sdi, PRE_OCPSET, g_variant_get_double(data) * 1000); + return rdtech_dps_set_reg(sdi, PRE_OCPSET, + g_variant_get_double(data) * devc->current_multiplier); default: return SR_ERR_NA; } @@ -273,10 +280,12 @@ static int config_list(uint32_t key, GVariant **data, case SR_CONF_DEVICE_OPTIONS: return STD_CONFIG_LIST(key, data, sdi, cg, scanopts, drvopts, devopts); case SR_CONF_VOLTAGE_TARGET: - *data = std_gvar_min_max_step(0.0, devc->model->max_voltage, 0.001); + *data = std_gvar_min_max_step(0.0, devc->model->max_voltage, + 1 / devc->voltage_multiplier); break; case SR_CONF_CURRENT_LIMIT: - *data = std_gvar_min_max_step(0.0, devc->model->max_current, 0.0001); + *data = std_gvar_min_max_step(0.0, devc->model->max_current, + 1 / devc->current_multiplier); break; default: return SR_ERR_NA; @@ -289,11 +298,23 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) { struct dev_context *devc; struct sr_modbus_dev_inst *modbus; + uint16_t registers[3]; int ret; modbus = sdi->conn; devc = sdi->priv; + /* Prefill actual states */ + g_mutex_lock(&devc->rw_mutex); + ret = rdtech_dps_read_holding_registers(modbus, REG_PROTECT, 3, registers); + g_mutex_unlock(&devc->rw_mutex); + if (ret != SR_OK) + return ret; + devc->actual_ovp_state = RB16(registers + 0) == STATE_OVP; + devc->actual_ocp_state = RB16(registers + 0) == STATE_OCP; + devc->actual_regulation_state = RB16(registers + 1); + devc->actual_output_state = RB16(registers + 2); + if ((ret = sr_modbus_source_add(sdi->session, modbus, G_IO_IN, 10, rdtech_dps_receive_data, (void *)sdi)) != SR_OK) return ret;