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 {
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; }
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; }
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; }
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; }