From: Bert Vermeulen Date: Mon, 17 Jun 2013 13:46:14 +0000 (+0200) Subject: cem-dt-885x: Support for powering off the device X-Git-Tag: libsigrok-0.2.1~49 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=4c22355f046fefff812042ef9764199df17fb809;p=libsigrok.git cem-dt-885x: Support for powering off the device --- diff --git a/hardware/cem-dt-885x/api.c b/hardware/cem-dt-885x/api.c index fb309fe2..3b308284 100644 --- a/hardware/cem-dt-885x/api.c +++ b/hardware/cem-dt-885x/api.c @@ -32,12 +32,13 @@ static const int32_t hwcaps[] = { SR_CONF_SOUNDLEVELMETER, SR_CONF_LIMIT_SAMPLES, SR_CONF_CONTINUOUS, - SR_CONF_DATALOG, SR_CONF_SPL_WEIGHT_FREQ, SR_CONF_SPL_WEIGHT_TIME, + SR_CONF_SPL_MEASUREMENT_RANGE, + SR_CONF_DATALOG, SR_CONF_HOLD_MAX, SR_CONF_HOLD_MIN, - SR_CONF_SPL_MEASUREMENT_RANGE, + SR_CONF_POWER_OFF, }; static const char *weight_freq[] = { @@ -232,6 +233,9 @@ static int config_get(int key, GVariant **data, const struct sr_dev_inst *sdi) *data = g_variant_new_tuple(range, 2); } break; + case SR_CONF_POWER_OFF: + *data = g_variant_new_boolean(FALSE); + break; default: return SR_ERR_NA; } @@ -305,6 +309,10 @@ static int config_set(int key, GVariant *data, const struct sr_dev_inst *sdi) } } break; + case SR_CONF_POWER_OFF: + if (g_variant_get_boolean(data)) + ret = cem_dt_885x_power_off(sdi); + break; default: ret = SR_ERR_NA; } diff --git a/hardware/cem-dt-885x/protocol.c b/hardware/cem-dt-885x/protocol.c index 3ae43a70..5f2972f6 100644 --- a/hardware/cem-dt-885x/protocol.c +++ b/hardware/cem-dt-885x/protocol.c @@ -685,3 +685,36 @@ SR_PRIV int cem_dt_885x_meas_range_set(const struct sr_dev_inst *sdi, return ret; } + +SR_PRIV int cem_dt_885x_power_off(const struct sr_dev_inst *sdi) +{ + struct sr_serial_dev_inst *serial; + char c, cmd; + + serial = sdi->conn; + + /* Reopen the port in non-blocking mode, so we can properly + * detect when the device stops communicating. */ + serial_close(serial); + if (serial_open(serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK) + return SR_ERR; + + cmd = CMD_TOGGLE_POWER_OFF; + while (TRUE) { + serial_flush(serial); + if (serial_write(serial, (const void *)&cmd, 1) != 1) + return SR_ERR; + /* It never takes more than 23ms for the next token to arrive. */ + g_usleep(25 * 1000); + if (serial_read(serial, &c, 1) != 1) + /* Device is no longer responding. Good! */ + break; + } + + /* In case the user manually turns on the device again, reset + * the port back to blocking. */ + serial_close(serial); + serial_open(serial, SERIAL_RDWR); + + return SR_OK; +} diff --git a/hardware/cem-dt-885x/protocol.h b/hardware/cem-dt-885x/protocol.h index 59106086..28a7cc6a 100644 --- a/hardware/cem-dt-885x/protocol.h +++ b/hardware/cem-dt-885x/protocol.h @@ -72,6 +72,7 @@ enum { CMD_TOGGLE_WEIGHT_TIME = 0x77, CMD_TOGGLE_HOLD_MAX_MIN = 0x11, CMD_TOGGLE_MEAS_RANGE = 0x88, + CMD_TOGGLE_POWER_OFF = 0x33, }; /** Private, per-device-instance driver context. */ @@ -121,5 +122,6 @@ SR_PRIV int cem_dt_885x_meas_range_get(const struct sr_dev_inst *sdi, uint64_t *low, uint64_t *high); SR_PRIV int cem_dt_885x_meas_range_set(const struct sr_dev_inst *sdi, uint64_t low, uint64_t high); +SR_PRIV int cem_dt_885x_power_off(const struct sr_dev_inst *sdi); #endif