From fd31b8957e08f1c79c18c79d2df39cd6854e2022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Tue, 24 Nov 2020 11:06:38 +0100 Subject: [PATCH] Add current buffer index as asynparam. --- .../Db/ecmcPluginFFT.template | 10 +++++- .../ecmc_plugin_fftApp/src/ecmcFFT.cpp | 32 +++++++++++++------ .../ecmc_plugin_fftApp/src/ecmcFFT.h | 1 + 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/ecmc_plugin_fft/ecmc_plugin_fftApp/Db/ecmcPluginFFT.template b/ecmc_plugin_fft/ecmc_plugin_fftApp/Db/ecmcPluginFFT.template index 5ff7d94..7fb76ac 100644 --- a/ecmc_plugin_fft/ecmc_plugin_fftApp/Db/ecmcPluginFFT.template +++ b/ecmc_plugin_fft/ecmc_plugin_fftApp/Db/ecmcPluginFFT.template @@ -124,4 +124,12 @@ record(ai,"$(P)Plugin-FFT${INDEX}-SampleRate-Act"){ field(TSE, "0") } - +# Actual buffer index +record(longin,"$(P)Plugin-FFT${INDEX}-BuffIdAct"){ + field(DESC, "Current buffer index") + field(PINI, "1") + field(DTYP, "asynInt32") + field(INP, "@asyn(PLUGIN.FFT${INDEX},$(ADDR=0),$(TIMEOUT=1000))plugin.fft${INDEX}.buffid") + field(SCAN, "I/O Intr") + field(TSE, "0") +} diff --git a/ecmc_plugin_fft/ecmc_plugin_fftApp/src/ecmcFFT.cpp b/ecmc_plugin_fft/ecmc_plugin_fftApp/src/ecmcFFT.cpp index 5ac635e..f615aba 100644 --- a/ecmc_plugin_fft/ecmc_plugin_fftApp/src/ecmcFFT.cpp +++ b/ecmc_plugin_fft/ecmc_plugin_fftApp/src/ecmcFFT.cpp @@ -26,6 +26,7 @@ #define ECMC_PLUGIN_ASYN_FFT_X_FREQS "fftxaxis" #define ECMC_PLUGIN_ASYN_NFFT "nfft" #define ECMC_PLUGIN_ASYN_RATE "samplerate" +#define ECMC_PLUGIN_ASYN_BUFF_ID "buffid" #include @@ -119,6 +120,7 @@ ecmcFFT::ecmcFFT(int fftIndex, // index of this object (if several is cr asynFFTXAxisId_ = -1; // FFT X-axis frequencies asynNfftId_ = -1; // Nfft asynSRateId_ = -1; // Sample rate Hz + asynElementsInBuffer_= -1; ecmcSampleRateHz_ = getEcmcSampleRate(); cfgEcmcSampleRateHz_ = ecmcSampleRateHz_; @@ -764,7 +766,7 @@ void ecmcFFT::initAsyn() { } doCallbacksFloat64Array(fftBufferResultAmp_, cfgNfft_/2+1, asynFFTAmpId_,0); - // Add fft mode "plugin.fft%d.mode" + // Add fft "plugin.fft%d.mode" paramName = ECMC_PLUGIN_ASYN_PREFIX + to_string(objectId_) + "." + ECMC_PLUGIN_ASYN_FFT_MODE; @@ -773,7 +775,7 @@ void ecmcFFT::initAsyn() { } setIntegerParam(asynFFTModeId_, (epicsInt32)cfgMode_); - // Add fft mode "plugin.fft%d.status" + // Add fft "plugin.fft%d.status" paramName = ECMC_PLUGIN_ASYN_PREFIX + to_string(objectId_) + "." + ECMC_PLUGIN_ASYN_FFT_STAT; @@ -782,7 +784,7 @@ void ecmcFFT::initAsyn() { } setIntegerParam(asynFFTStatId_, (epicsInt32)status_); - // Add fft mode "plugin.fft%d.source" + // Add fft "plugin.fft%d.source" paramName = ECMC_PLUGIN_ASYN_PREFIX + to_string(objectId_) + "." + ECMC_PLUGIN_ASYN_FFT_SOURCE; @@ -791,7 +793,7 @@ void ecmcFFT::initAsyn() { } doCallbacksInt8Array(cfgDataSourceStr_, strlen(cfgDataSourceStr_), asynSourceId_,0); - // Add fft mode "plugin.fft%d.trigg" + // Add fft "plugin.fft%d.trigg" paramName = ECMC_PLUGIN_ASYN_PREFIX + to_string(objectId_) + "." + ECMC_PLUGIN_ASYN_FFT_TRIGG; @@ -800,7 +802,7 @@ void ecmcFFT::initAsyn() { } setIntegerParam(asynTriggId_, (epicsInt32)triggOnce_); - // Add fft mode "plugin.fft%d.fftxaxis" + // Add fft "plugin.fft%d.fftxaxis" paramName = ECMC_PLUGIN_ASYN_PREFIX + to_string(objectId_) + "." + ECMC_PLUGIN_ASYN_FFT_X_FREQS; @@ -809,24 +811,33 @@ void ecmcFFT::initAsyn() { } doCallbacksFloat64Array(fftBufferXAxis_,cfgNfft_ / 2 + 1, asynFFTXAxisId_,0); - // Add fft mode "plugin.fft%d.nfft" + // Add fft "plugin.fft%d.nfft" paramName = ECMC_PLUGIN_ASYN_PREFIX + to_string(objectId_) + "." + ECMC_PLUGIN_ASYN_NFFT; if( createParam(0, paramName.c_str(), asynParamInt32, &asynNfftId_ ) != asynSuccess ) { - throw std::runtime_error("Failed create asyn parameter trigg"); + throw std::runtime_error("Failed create asyn parameter nfft"); } setIntegerParam(asynNfftId_, (epicsInt32)cfgNfft_); - // Add fft mode "plugin.fft%d.rate" + // Add fft "plugin.fft%d.rate" paramName = ECMC_PLUGIN_ASYN_PREFIX + to_string(objectId_) + "." + ECMC_PLUGIN_ASYN_RATE; if( createParam(0, paramName.c_str(), asynParamFloat64, &asynSRateId_ ) != asynSuccess ) { - throw std::runtime_error("Failed create asyn parameter trigg"); + throw std::runtime_error("Failed create asyn parameter rate"); } setDoubleParam(asynSRateId_, cfgDataSampleRateHz_); + // Add fft "plugin.fft%d.buffid" + paramName = ECMC_PLUGIN_ASYN_PREFIX + to_string(objectId_) + + "." + ECMC_PLUGIN_ASYN_BUFF_ID; + + if( createParam(0, paramName.c_str(), asynParamInt32, &asynElementsInBuffer_ ) != asynSuccess ) { + throw std::runtime_error("Failed create asyn parameter trigg"); + } + setIntegerParam(asynElementsInBuffer_, (epicsInt32)elementsInBuffer_); + // Update integers callParamCallbacks(); } @@ -861,6 +872,9 @@ FFT_STATUS ecmcFFT::getStatusFFT() { void ecmcFFT::updateStatus(FFT_STATUS status) { status_ = status; setIntegerParam(asynFFTStatId_,(epicsInt32) status); + + setIntegerParam(asynElementsInBuffer_, (epicsInt32)elementsInBuffer_); + callParamCallbacks(); } diff --git a/ecmc_plugin_fft/ecmc_plugin_fftApp/src/ecmcFFT.h b/ecmc_plugin_fft/ecmc_plugin_fftApp/src/ecmcFFT.h index 0f66352..a555ed9 100644 --- a/ecmc_plugin_fft/ecmc_plugin_fftApp/src/ecmcFFT.h +++ b/ecmc_plugin_fft/ecmc_plugin_fftApp/src/ecmcFFT.h @@ -118,6 +118,7 @@ class ecmcFFT : public asynPortDriver { int asynFFTXAxisId_; // FFT X-axis frequencies int asynNfftId_; // NFFT int asynSRateId_; // Sample rate + int asynElementsInBuffer_; // Current buffer index // Thread related epicsEvent doCalcEvent_;