diff options
Diffstat (limited to 'libarmep')
-rw-r--r-- | libarmep/aepd-interface.h | 2 | ||||
-rw-r--r-- | libarmep/libarmep.h | 3 | ||||
-rw-r--r-- | libarmep/sample.c | 39 |
3 files changed, 39 insertions, 5 deletions
diff --git a/libarmep/aepd-interface.h b/libarmep/aepd-interface.h index cf1f34c..3c0d1f0 100644 --- a/libarmep/aepd-interface.h +++ b/libarmep/aepd-interface.h @@ -67,6 +67,8 @@ struct aepd_interface { int chans; /* number of active acquisition channels above */ int vchans; /* virtual channels (summing supplies) appear after probed physical channels in the arrays */ int finished; /* are we going down? */ + + int auto_zero; }; /* diff --git a/libarmep/libarmep.h b/libarmep/libarmep.h index 10ca101..c3d8084 100644 --- a/libarmep/libarmep.h +++ b/libarmep/libarmep.h @@ -54,7 +54,7 @@ #define ADC_COUNT_CURRENT_CLIP_LIMIT 1640 #define REJECT_AUTOZERO_VOLTAGE 1.0 -#define IGNORE_AUTOZERO_VOLTAGE 0.1 +#define IGNORE_AUTOZERO_VOLTAGE 0.2 #define AEP_INVALID_COVER 100 @@ -267,6 +267,7 @@ struct aep_context { int exit_after_capture; int poll_timeout_ms; double do_average; + int done_az_channels; /* shared memory output buffer + metadata */ diff --git a/libarmep/sample.c b/libarmep/sample.c index f44e61b..d11550c 100644 --- a/libarmep/sample.c +++ b/libarmep/sample.c @@ -85,6 +85,21 @@ int process_sample(struct aep *aep, int ch_index) vo1 = ch->voffset[1]; } + aepd_interface = aep->aep_context->aepd_interface; + if (aepd_interface && aepd_interface->auto_zero) { + fprintf(stderr, "setting inline autozero\n"); + aepd_interface->auto_zero = 0; + aep->aep_context->auto_zero = 2; + + aep->aep_context->no_correction = 1; + aep->aep_context->mv_min = 0; + aep->aep_context->mw_min = 0; + aep->aep_context->average_len = 5000; + aep->aep_context->ms_capture = aep->aep_context->average_len / 10; + aep->aep_context->decimate = aep->aep_context->average_len; + aep->aep_context->done_az_channels = 0; + } + if (ch->pretrig_ring) { ch->pretrig_ring[ch->head].v = aep->voltage; ch->pretrig_ring[ch->head].i = aep->current; @@ -242,8 +257,6 @@ unripe: ch->decimation_counter = 0; if (aep->aep_context->auto_zero) { - fprintf(stderr, "Autozero for %s done \n", - ch->channel_name); if (v1 > IGNORE_AUTOZERO_VOLTAGE || v1 < -IGNORE_AUTOZERO_VOLTAGE) fprintf(stderr, " Voltage Autozero skipped as %fV " "unfeasibly high\n", v1); @@ -254,10 +267,28 @@ unripe: ch->voffset[1] = -avg_mean_us(&ch->avg_mean_current) / ADC_COUNTS_PER_VOLT_CH2; ch->vnoise[1] = ch->max[1] - ch->min[1]; + ch->samples = 0; + + fprintf(stderr, "Autozero for %s done (voltage %f) \n", ch->channel_name, ch->voffset[0]); + if (configure(aep->aep_context, aep, aep->dev_filepath, aep->aep_context->config_filepath, ch) < 0) fprintf(stderr, "Failed to write autozero info to config\n"); - goto done; + aep->aep_context->done_az_channels++; + fprintf(stderr, "done %d autozero channels of %d\n", aep->aep_context->done_az_channels, aep->aep_context->count_channel_names); + if (aep->aep_context->done_az_channels == aep->aep_context->count_channel_names) { + + if (aep->aep_context->auto_zero == 2) { /* as part of larger collection */ + aep->aep_context->auto_zero = 0; + aep->aep_context->no_correction = 0; + aep->aep_context->mv_min = 0; + aep->aep_context->mw_min = 0; + aep->aep_context->average_len = 1; + aep->aep_context->ms_capture = 0; + aep->aep_context->decimate = 1; + } else + goto done; + } } /* not everyone else may be ready, save the data first in per-channel sync ring buffers */ @@ -339,7 +370,7 @@ unripe: done: - if (aep->aep_context->ms_capture && (ch->samples / 10 - aep->aep_context->ms_holdoff) > aep->aep_context->ms_capture) { + if (aep->aep_context->auto_zero != 2 && aep->aep_context->ms_capture && (ch->samples / 10 - aep->aep_context->ms_holdoff) > aep->aep_context->ms_capture) { fprintf(stderr, "%s: %dms capture complete ", ch->channel_name, aep->aep_context->ms_capture); ch->ignore = 1; |