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_;