Ejemplo n.º 1
0
static int config_set(int key, GVariant *data, const struct sr_dev_inst *sdi,
		const struct sr_channel_group *cg)
{
	int ret;
	struct dev_context *devc;
	uint64_t num_samples;
	const char *slope;
	int trigger_pos;
	double pos;

	(void)cg;
	devc = sdi->priv;

	if (sdi->status != SR_ST_ACTIVE)
		return SR_ERR_DEV_CLOSED;

	switch (key) {
	case SR_CONF_SAMPLERATE:
		// FIXME
		return mso_configure_rate(sdi, g_variant_get_uint64(data));
		ret = SR_OK;
		break;
	case SR_CONF_LIMIT_SAMPLES:
		num_samples = g_variant_get_uint64(data);
		if (num_samples != 1024) {
			sr_err("Only 1024 samples are supported.");
			ret = SR_ERR_ARG;
		} else {
			devc->limit_samples = num_samples;
			ret = SR_OK;
		}
		break;
	case SR_CONF_CAPTURE_RATIO:
		ret = SR_OK;
		break;
	case SR_CONF_TRIGGER_SLOPE:
		slope = g_variant_get_string(data, NULL);

		if (!slope || !(slope[0] == 'f' || slope[0] == 'r'))
			sr_err("Invalid trigger slope");
			ret = SR_ERR_ARG;
		} else {
Ejemplo n.º 2
0
static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
				    void *cb_data)
{
	struct sr_datafeed_packet *packet;
	struct sr_datafeed_header *header;
	struct dev_context *devc;
	int ret = SR_ERR;

	devc = sdi->priv;

	if (sdi->status != SR_ST_ACTIVE)
		return SR_ERR;

	if (mso_configure_probes(sdi) != SR_OK) {
		sr_err("Failed to configure probes.");
		return SR_ERR;
	}

	/* FIXME: No need to do full reconfigure every time */
//      ret = mso_reset_fsm(sdi);
//      if (ret != SR_OK)
//              return ret;

	/* FIXME: ACDC Mode */
	devc->ctlbase1 &= 0x7f;
//      devc->ctlbase1 |= devc->acdcmode;

	ret = mso_configure_rate(sdi, devc->cur_rate);
	if (ret != SR_OK)
		return ret;

	/* set dac offset */
	ret = mso_dac_out(sdi, devc->dac_offset);
	if (ret != SR_OK)
		return ret;

	ret = mso_configure_threshold_level(sdi);
	if (ret != SR_OK)
		return ret;

	ret = mso_configure_trigger(sdi);
	if (ret != SR_OK)
		return ret;

	/* END of config hardware part */
	ret = mso_arm(sdi);
	if (ret != SR_OK)
		return ret;

	/* Start acquisition on the device. */
	mso_check_trigger(devc->serial, &devc->trigger_state);
	ret = mso_check_trigger(devc->serial, NULL);
	if (ret != SR_OK)
		return ret;

	sr_source_add(devc->serial->fd, G_IO_IN, -1, mso_receive_data, cb_data);

	if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) {
		sr_err("Datafeed packet malloc failed.");
		return SR_ERR_MALLOC;
	}

	if (!(header = g_try_malloc(sizeof(struct sr_datafeed_header)))) {
		sr_err("Datafeed header malloc failed.");
		g_free(packet);
		return SR_ERR_MALLOC;
	}

	packet->type = SR_DF_HEADER;
	packet->payload = (unsigned char *)header;
	header->feed_version = 1;
	gettimeofday(&header->starttime, NULL);
	sr_session_send(cb_data, packet);

	g_free(header);
	g_free(packet);

	return SR_OK;
}
Ejemplo n.º 3
0
static int config_set(int id, const void *value, const struct sr_dev_inst *sdi)
{
	int ret;
	struct dev_context *devc;
	uint64_t num_samples, slope;
	int trigger_pos;
	float pos;

	devc = sdi->priv;

	if (sdi->status != SR_ST_ACTIVE)
		return SR_ERR;

	switch (id) {
	case SR_CONF_SAMPLERATE:
		// FIXME
		return mso_configure_rate(sdi, *(const uint64_t *)value);
		ret = SR_OK;
		break;
	case SR_CONF_LIMIT_SAMPLES:
		num_samples = *(uint64_t *)value;
		if (num_samples < 1024) {
			sr_err("minimum of 1024 samples required");
			ret = SR_ERR_ARG;
		} else {
			devc->limit_samples = num_samples;
			sr_dbg("setting limit_samples to %i\n",
			       num_samples);
			ret = SR_OK;
		}
		break;
	case SR_CONF_CAPTURE_RATIO:
		ret = SR_OK;
		break;
	case SR_CONF_TRIGGER_SLOPE:
		slope = *(uint64_t *)value;
		if (slope != SLOPE_NEGATIVE && slope != SLOPE_POSITIVE) {
			sr_err("Invalid trigger slope");
			ret = SR_ERR_ARG;
		} else {
			devc->trigger_slope = slope;
			ret = SR_OK;
		}
		break;
	case SR_CONF_HORIZ_TRIGGERPOS:
		pos = *(float *)value;
		if (pos < 0 || pos > 255) {
			sr_err("Trigger position (%f) should be between 0 and 255.", pos);
			ret = SR_ERR_ARG;
		} else {
			trigger_pos = (int)pos;
			devc->trigger_holdoff[0] = trigger_pos & 0xff;
			ret = SR_OK;
		}
		break;
	case SR_CONF_RLE:
		ret = SR_OK;
		break;
	default:
		ret = SR_ERR;
		break;
	}

	return ret;
}
Ejemplo n.º 4
0
static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
{
	struct dev_context *devc;
	int ret = SR_ERR;

	if (sdi->status != SR_ST_ACTIVE)
		return SR_ERR_DEV_CLOSED;

	devc = sdi->priv;

	if (mso_configure_probes(sdi) != SR_OK) {
		sr_err("Failed to configure probes.");
		return SR_ERR;
	}

	/* FIXME: No need to do full reconfigure every time */
//      ret = mso_reset_fsm(sdi);
//      if (ret != SR_OK)
//              return ret;

	/* FIXME: ACDC Mode */
	devc->ctlbase1 &= 0x7f;
//      devc->ctlbase1 |= devc->acdcmode;

	ret = mso_configure_rate(sdi, devc->cur_rate);
	if (ret != SR_OK)
		return ret;

	/* set dac offset */
	ret = mso_dac_out(sdi, devc->dac_offset);
	if (ret != SR_OK)
		return ret;

	ret = mso_configure_threshold_level(sdi);
	if (ret != SR_OK)
		return ret;

	ret = mso_configure_trigger(sdi);
	if (ret != SR_OK)
		return ret;

	/* END of config hardware part */
	ret = mso_arm(sdi);
	if (ret != SR_OK)
		return ret;

	/* Start acquisition on the device. */
	mso_check_trigger(devc->serial, &devc->trigger_state);
	ret = mso_check_trigger(devc->serial, NULL);
	if (ret != SR_OK)
		return ret;

	/* Reset trigger state. */
	devc->trigger_state = 0x00;

	/* Send header packet to the session bus. */
	std_session_send_df_header(cb_data, LOG_PREFIX);

	/* Our first probe is analog, the other 8 are of type 'logic'. */
	/* TODO. */

	sr_source_add(devc->serial->fd, G_IO_IN, -1, mso_receive_data, cb_data);

	return SR_OK;
}
Ejemplo n.º 5
0
static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi)
{
	int ret;
	struct dev_context *devc;
	uint64_t num_samples, slope;
	int trigger_pos;
	double pos;

	devc = sdi->priv;

	if (sdi->status != SR_ST_ACTIVE)
		return SR_ERR_DEV_CLOSED;

	switch (id) {
	case SR_CONF_SAMPLERATE:
		// FIXME
		return mso_configure_rate(sdi, g_variant_get_uint64(data));
		ret = SR_OK;
		break;
	case SR_CONF_LIMIT_SAMPLES:
		num_samples = g_variant_get_uint64(data);
		if (num_samples != 1024) {
			sr_err("Only 1024 samples are supported.");
			ret = SR_ERR_ARG;
		} else {
			devc->limit_samples = num_samples;
			sr_dbg("setting limit_samples to %i\n",
			       num_samples);
			ret = SR_OK;
		}
		break;
	case SR_CONF_CAPTURE_RATIO:
		ret = SR_OK;
		break;
	case SR_CONF_TRIGGER_SLOPE:
		slope = g_variant_get_uint64(data);
		if (slope != SLOPE_NEGATIVE && slope != SLOPE_POSITIVE) {
			sr_err("Invalid trigger slope");
			ret = SR_ERR_ARG;
		} else {
			devc->trigger_slope = slope;
			ret = SR_OK;
		}
		break;
	case SR_CONF_HORIZ_TRIGGERPOS:
		pos = g_variant_get_double(data);
		if (pos < 0 || pos > 255) {
			sr_err("Trigger position (%f) should be between 0 and 255.", pos);
			ret = SR_ERR_ARG;
		} else {
			trigger_pos = (int)pos;
			devc->trigger_holdoff[0] = trigger_pos & 0xff;
			ret = SR_OK;
		}
		break;
	case SR_CONF_RLE:
		ret = SR_OK;
		break;
	default:
		ret = SR_ERR_NA;
		break;
	}

	return ret;
}