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[] = {
*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;
}
}
}
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;
}
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;
+}
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. */
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