#define CMD_VERSION "version\r\n"
#define CMD_MONITOR "monitor 200\r\n"
+#define CMD_MONITOR_STOP "monitor 0\r\n"
static const uint32_t scanopts[] = {
SR_CONF_CONN,
static const uint32_t devopts_cg[] = {
SR_CONF_ENABLED | SR_CONF_SET,
- SR_CONF_REGULATION | SR_CONF_GET,
+ SR_CONF_REGULATION | SR_CONF_GET | SR_CONF_LIST,
SR_CONF_VOLTAGE | SR_CONF_GET,
SR_CONF_CURRENT | SR_CONF_GET,
SR_CONF_CURRENT_LIMIT | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
SR_CONF_OVER_TEMPERATURE_PROTECTION_ACTIVE | SR_CONF_GET,
SR_CONF_UNDER_VOLTAGE_CONDITION | SR_CONF_GET,
SR_CONF_UNDER_VOLTAGE_CONDITION_ACTIVE | SR_CONF_GET,
+ SR_CONF_UNDER_VOLTAGE_CONDITION_THRESHOLD | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
+};
+
+static const char *regulation[] = {
+ /* CC mode only. */
+ "CC",
};
static GSList *scan(struct sr_dev_driver *di, GSList *options)
serial_flush(serial);
+ /*
+ * First stop potentially running monitoring and wait for 50ms before
+ * next command can be sent.
+ */
+ if (serial_write_blocking(serial, CMD_MONITOR_STOP,
+ strlen(CMD_MONITOR_STOP), serial_timeout(serial,
+ strlen(CMD_MONITOR_STOP))) < (int)strlen(CMD_MONITOR_STOP)) {
+ sr_dbg("Unable to write while probing for hardware.");
+ serial_close(serial);
+ return NULL;
+ }
+ g_usleep(50 * 1000);
+
if (serial_write_blocking(serial, CMD_VERSION,
strlen(CMD_VERSION), serial_timeout(serial,
strlen(CMD_VERSION))) < (int)strlen(CMD_VERSION)) {
case SR_CONF_DEVICE_OPTIONS:
*data = std_gvar_array_u32(ARRAY_AND_SIZE(devopts_cg));
break;
+ case SR_CONF_REGULATION:
+ *data = std_gvar_array_str(ARRAY_AND_SIZE(regulation));
+ break;
case SR_CONF_CURRENT_LIMIT:
*data = std_gvar_min_max_step(0.0, 6.0, 0.001);
break;
+ case SR_CONF_UNDER_VOLTAGE_CONDITION_THRESHOLD:
+ *data = std_gvar_min_max_step(0.0, 60.0, 0.001);
+ break;
default:
return SR_ERR_NA;
}
*data = g_variant_new_boolean(devc->otp_active);
break;
case SR_CONF_UNDER_VOLTAGE_CONDITION:
- *data = g_variant_new_boolean(TRUE); /* Always on. */
+ if (reloadpro_get_under_voltage_threshold(sdi, &fvalue) == SR_OK) {
+ if (fvalue == .0)
+ *data = g_variant_new_boolean(FALSE);
+ else
+ *data = g_variant_new_boolean(TRUE);
+ }
break;
case SR_CONF_UNDER_VOLTAGE_CONDITION_ACTIVE:
*data = g_variant_new_boolean(devc->uvc_active);
break;
+ case SR_CONF_UNDER_VOLTAGE_CONDITION_THRESHOLD:
+ if (reloadpro_get_under_voltage_threshold(sdi, &fvalue) == SR_OK)
+ *data = g_variant_new_double(fvalue);
+ break;
default:
return SR_ERR_NA;
}
const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
{
struct dev_context *devc;
- int ret;
(void)cg;
devc = sdi->priv;
- ret = SR_OK;
switch (key) {
case SR_CONF_LIMIT_SAMPLES:
case SR_CONF_LIMIT_MSEC:
return sr_sw_limits_config_set(&devc->limits, key, data);
case SR_CONF_ENABLED:
- ret = reloadpro_set_on_off(sdi, g_variant_get_boolean(data));
- break;
+ return reloadpro_set_on_off(sdi, g_variant_get_boolean(data));
case SR_CONF_CURRENT_LIMIT:
- ret = reloadpro_set_current_limit(sdi,
+ return reloadpro_set_current_limit(sdi, g_variant_get_double(data));
+ case SR_CONF_UNDER_VOLTAGE_CONDITION_THRESHOLD:
+ return reloadpro_set_under_voltage_threshold(sdi,
g_variant_get_double(data));
- break;
default:
- ret = SR_ERR_NA;
+ return SR_ERR_NA;
+ }
+
+ return SR_OK;
+}
+
+static int dev_close(struct sr_dev_inst *sdi)
+{
+ if (serial_write_blocking(sdi->conn, CMD_MONITOR_STOP,
+ strlen(CMD_MONITOR_STOP), serial_timeout(sdi->conn,
+ strlen(CMD_MONITOR_STOP))) < (int)strlen(CMD_MONITOR_STOP)) {
+ sr_dbg("Unable to stop monitoring.");
}
- return ret;
+ return std_serial_dev_close(sdi);
}
static int dev_acquisition_start(const struct sr_dev_inst *sdi)
struct sr_serial_dev_inst *serial;
devc = sdi->priv;
+ devc->acquisition_running = TRUE;
+
serial = sdi->conn;
/* Send the 'monitor <ms>' command (doesn't have a reply). */
return SR_OK;
}
+static int dev_acquisition_stop(struct sr_dev_inst *sdi)
+{
+ struct dev_context *devc;
+
+ devc = sdi->priv;
+ devc->acquisition_running = FALSE;
+
+ return std_serial_dev_acquisition_stop(sdi);
+}
+
static struct sr_dev_driver arachnid_labs_re_load_pro_driver_info = {
.name = "arachnid-labs-re-load-pro",
.longname = "Arachnid Labs Re:load Pro",
.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,
+ .dev_acquisition_stop = dev_acquisition_stop,
.context = NULL,
};
SR_REGISTER_DEV_DRIVER(arachnid_labs_re_load_pro_driver_info);