From: Hannu Vuolasaho Date: Wed, 21 Oct 2015 16:04:37 +0000 (+0300) Subject: Support for regulation status and fix for mysterious M X-Git-Tag: libsigrok-0.4.0~151 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=b16d975a5c879b817583512b944b57198b71644e;p=libsigrok.git Support for regulation status and fix for mysterious M Added support for SR_CONF_REGULATION which returns value for CH1 Also VELLEMAN LABPS3005D (only device currently supported) sends single 'M' character in beginning of return value, which is specially discarded. --- diff --git a/src/hardware/korad-kdxxxxp/api.c b/src/hardware/korad-kdxxxxp/api.c index 107bdc40..4a6c8179 100644 --- a/src/hardware/korad-kdxxxxp/api.c +++ b/src/hardware/korad-kdxxxxp/api.c @@ -43,6 +43,7 @@ static const uint32_t devopts[] = { SR_CONF_CURRENT | SR_CONF_GET, SR_CONF_CURRENT_LIMIT | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, SR_CONF_ENABLED | SR_CONF_GET | SR_CONF_SET, + SR_CONF_REGULATION | SR_CONF_GET, }; static const struct korad_kdxxxxp_model models[] = { @@ -217,6 +218,13 @@ static int config_get(uint32_t key, GVariant **data, case SR_CONF_ENABLED: *data = g_variant_new_boolean(devc->output_enabled); break; + case SR_CONF_REGULATION: + /* Dual channel not supported. */ + if (devc->cc_mode[0]) + *data = g_variant_new_string("CC"); + else + *data = g_variant_new_string("CV"); + break; default: return SR_ERR_NA; } diff --git a/src/hardware/korad-kdxxxxp/protocol.c b/src/hardware/korad-kdxxxxp/protocol.c index cd266e2f..eb528103 100644 --- a/src/hardware/korad-kdxxxxp/protocol.c +++ b/src/hardware/korad-kdxxxxp/protocol.c @@ -202,7 +202,7 @@ SR_PRIV int korad_kdxxxxp_get_reply(struct sr_serial_dev_inst *serial, struct dev_context *devc) { double value; - int count, ret; + int count, ret, i; float *target; char status_byte; @@ -241,6 +241,16 @@ SR_PRIV int korad_kdxxxxp_get_reply(struct sr_serial_dev_inst *serial, devc->reply[count] = 0; if (target) { + /* Handle the strange 'M' */ + if (devc->reply[0] == 'M') { + for (i = 1; i < count; ++i) { + devc->reply[i - 1] = devc->reply[i]; + } + /* Get the last character */ + if (( i = korad_kdxxxxp_read_chars(serial, 1, + &(devc->reply[count]))) < 0) + return i; + } value = g_ascii_strtod(devc->reply, NULL); *target = (float)value; sr_dbg("value: %f",value);