Asynparam rate is actual eleemnt sample rate and not ecmc samplerate (can differ if oversampling)

This commit is contained in:
Anders Sandström
2020-11-10 14:22:20 +01:00
parent b163fcab98
commit 47f5ce247c
2 changed files with 17 additions and 9 deletions

View File

@@ -121,7 +121,8 @@ ecmcFFT::ecmcFFT(int fftIndex, // index of this object (if several is cr
asynSRateId_ = -1; // Sample rate Hz
ecmcSampleRateHz_ = getEcmcSampleRate();
cfgFFTSampleRateHz_ = ecmcSampleRateHz_;
cfgEcmcSampleRateHz_ = ecmcSampleRateHz_;
cfgDataSampleRateHz_ = ecmcSampleRateHz_;
// Config defaults
cfgDbgMode_ = 0;
@@ -140,17 +141,17 @@ ecmcFFT::ecmcFFT(int fftIndex, // index of this object (if several is cr
}
// Check valid sample rate
if(cfgFFTSampleRateHz_ <= 0) {
if(cfgEcmcSampleRateHz_ <= 0) {
throw std::out_of_range("FFT Invalid sample rate");
}
if(cfgFFTSampleRateHz_ > ecmcSampleRateHz_) {
if(cfgEcmcSampleRateHz_ > ecmcSampleRateHz_) {
printf("Warning FFT sample rate faster than ecmc rate. FFT rate will be set to ecmc rate.\n");
cfgFFTSampleRateHz_ = ecmcSampleRateHz_;
cfgEcmcSampleRateHz_ = ecmcSampleRateHz_;
}
// Se if any data update cycles should be ignored
// example ecmc 1000Hz, fft 100Hz then ignore 9 cycles (could be strange if not multiples)
ignoreCycles_ = ecmcSampleRateHz_ / cfgFFTSampleRateHz_ -1;
ignoreCycles_ = ecmcSampleRateHz_ / cfgEcmcSampleRateHz_ -1;
// set scale factor
scale_ = 1.0 / ((double)cfgNfft_); // sqrt((double)cfgNfft_);
@@ -275,7 +276,7 @@ void ecmcFFT::parseConfigStr(char *configStr) {
// ECMC_PLUGIN_RATE_OPTION_CMD rate in HZ
else if (!strncmp(pThisOption, ECMC_PLUGIN_RATE_OPTION_CMD, strlen(ECMC_PLUGIN_RATE_OPTION_CMD))) {
pThisOption += strlen(ECMC_PLUGIN_RATE_OPTION_CMD);
cfgFFTSampleRateHz_ = atof(pThisOption);
cfgEcmcSampleRateHz_ = atof(pThisOption);
}
// ECMC_PLUGIN_SCALE_OPTION_CMD rate in HZ
@@ -320,6 +321,12 @@ void ecmcFFT::connectToDataSource() {
if( !dataTypeSupported(dataItem_->getEcmcDataType()) ) {
throw std::invalid_argument( "Data type not supported." );
}
// Add oversampling
cfgDataSampleRateHz_ = cfgDataSampleRateHz_ * dataItem_->getEcmcDataSize()/dataItem_->getEcmcDataElementSize();
setDoubleParam(asynSRateId_, cfgDataSampleRateHz_);
callParamCallbacks();
dataSourceLinked_ = 1;
updateStatus(IDLE);
}
@@ -818,7 +825,7 @@ void ecmcFFT::initAsyn() {
if( createParam(0, paramName.c_str(), asynParamFloat64, &asynSRateId_ ) != asynSuccess ) {
throw std::runtime_error("Failed create asyn parameter trigg");
}
setDoubleParam(asynSRateId_, cfgFFTSampleRateHz_);
setDoubleParam(asynSRateId_, cfgDataSampleRateHz_);
// Update integers
callParamCallbacks();
@@ -995,7 +1002,7 @@ asynStatus ecmcFFT::readInt8Array(asynUser *pasynUser, epicsInt8 *value,
asynStatus ecmcFFT::readFloat64(asynUser *pasynUser, epicsFloat64 *value) {
int function = pasynUser->reason;
if( function == asynSRateId_ ) {
*value = cfgFFTSampleRateHz_;
*value = cfgDataSampleRateHz_;
return asynSuccess;
}

View File

@@ -102,8 +102,9 @@ class ecmcFFT : public asynPortDriver {
size_t cfgNfft_; // Config: Data set size
int cfgEnable_; // Config: Enable data acq./calc.
FFT_MODE cfgMode_; // Config: Mode continous or triggered.
double cfgFFTSampleRateHz_; // Config: Sample rate (defaukts to ecmc rate)
double cfgEcmcSampleRateHz_; // Config: Sample rate (defaults to ecmc rate)
double cfgScale_;
double cfgDataSampleRateHz_; // Config: Sample for data
// Asyn
int asynEnableId_; // Enable/disable acq./calcs