From 346ab064cd7013903a1a16ec717e05e7bd5a2a9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Thu, 2 Apr 2020 20:57:30 +0200 Subject: [PATCH] Buffer fills up.. --- .../ecmcPlugin_FFTApp/src/ecmcFFT.cpp | 73 +++++++++++++++++-- .../ecmcPlugin_FFTApp/src/ecmcFFT.h | 18 ++++- .../ecmcPlugin_FFTApp/src/ecmcFFTWrap.h | 11 +-- 3 files changed, 88 insertions(+), 14 deletions(-) diff --git a/ecmcPlugin_FFT-loc/ecmcPlugin_FFTApp/src/ecmcFFT.cpp b/ecmcPlugin_FFT-loc/ecmcPlugin_FFTApp/src/ecmcFFT.cpp index 62108e5..e42402b 100644 --- a/ecmcPlugin_FFT-loc/ecmcPlugin_FFTApp/src/ecmcFFT.cpp +++ b/ecmcPlugin_FFT-loc/ecmcPlugin_FFTApp/src/ecmcFFT.cpp @@ -14,22 +14,81 @@ // Needed to get headers in ecmc right... #define ECMC_IS_PLUGIN +#define ECMC_PLUGIN_ERROR_FFT_BASE 100 +#define ECMC_PLUGIN_ERROR_FFT_ALLOC_FAIL 101 + #include "ecmcFFT.h" +static int printMissingObjError = 1; + // data callback -void dataUpdatedCallback(uint8_t* data, size_t size, ecmcEcDataType dt, void* obj) { - printf("Data updates\n"); +void f_dataUpdatedCallback(uint8_t* data, size_t size, ecmcEcDataType dt, void* obj) { + if(!obj) { + if(printMissingObjError){ + printf("%s/%s:%d: Error: Callback object NULL.. Data will not be added to buffer.\n", + __FILE__, __FUNCTION__, __LINE__); + printMissingObjError = 0; + return; + } + } + ecmcFFT * fftObj = (ecmcFFT*)obj; + + // Fill object buffer with data + fftObj->dataUpdatedCallback(data,size,dt); } -ecmcFFT::ecmcFFT(ecmcDataItem* dataItem, ecmcAsynPortDriver* asynPort) { - dataItem_ = dataItem; - asynPort_ = asynPort; +ecmcFFT::ecmcFFT(ecmcDataItem* dataItem, ecmcAsynPortDriver* asynPort, size_t nfft) { + bufferSizeBytes_ = 0; + bytesInBuffer_ = 0; + dataItem_ = dataItem; + asynPort_ = asynPort; + nfft_ = nfft; + dataBuffer_ = NULL; + + // Allocate buffer + bufferSizeBytes_ = nfft_ * dataItem_->getEcmcDataElementSize(); + dataBuffer_ = new uint8_t[bufferSizeBytes_]; + + if(!dataBuffer_) { + printf("%s/%s:%d: Error: Failed allocate dataBuffer of size %d (0x%x).\n", + __FILE__, __FUNCTION__, __LINE__, bufferSizeBytes_, ECMC_PLUGIN_ERROR_FFT_ALLOC_FAIL); + } + clearBuffer(); } ecmcFFT::~ecmcFFT() { - + if(dataBuffer_) { + delete[] dataBuffer_; + } } int ecmcFFT::ConnectToDataSource() { - return dataItem_->regDataUpdatedCallback(dataUpdatedCallback, this); + //Register data callback + return dataItem_->regDataUpdatedCallback(f_dataUpdatedCallback, this); +} + +void ecmcFFT::dataUpdatedCallback(uint8_t* data, + size_t size, + ecmcEcDataType dt) { + // No buffer or full + if(!dataBuffer_) { + return; + } + + if(bytesInBuffer_ == bufferSizeBytes_) { + printf("Buffer full (%d bytes appended).\n",bytesInBuffer_); + } + + // Start to fill buffer + size_t bytesToCp = size; + if(bytesToCp > bufferSizeBytes_ - bytesInBuffer_) { + bytesToCp = bufferSizeBytes_ - bytesInBuffer_; + } + memcpy(&dataBuffer_[bytesInBuffer_],data,bytesToCp); + bytesInBuffer_+=bytesToCp; +} + +void ecmcFFT::clearBuffer() { + memset(dataBuffer_,0,bufferSizeBytes_); + bytesInBuffer_ = 0; } diff --git a/ecmcPlugin_FFT-loc/ecmcPlugin_FFTApp/src/ecmcFFT.h b/ecmcPlugin_FFT-loc/ecmcPlugin_FFTApp/src/ecmcFFT.h index 13e6e87..6bcba15 100644 --- a/ecmcPlugin_FFT-loc/ecmcPlugin_FFTApp/src/ecmcFFT.h +++ b/ecmcPlugin_FFT-loc/ecmcPlugin_FFTApp/src/ecmcFFT.h @@ -12,20 +12,34 @@ #ifndef ECMC_FFT_H_ #define ECMC_FFT_H_ +#define ECMC_PLUGIN_DEFAULT_NFFT 8192 + #include "ecmcDataItem.h" #include "ecmcAsynPortDriver.h" +#include "inttypes.h" class ecmcFFT { public: - ecmcFFT(ecmcDataItem *dataItem, ecmcAsynPortDriver* asynPort); + ecmcFFT(ecmcDataItem *dataItem, + ecmcAsynPortDriver* asynPort, + size_t nfft = ECMC_PLUGIN_DEFAULT_NFFT); + ~ecmcFFT(); //Register callback int ConnectToDataSource(); - + // Add data to buffer + void dataUpdatedCallback(uint8_t* data, + size_t size, + ecmcEcDataType dt); private: + void clearBuffer(); ecmcDataItem *dataItem_; ecmcAsynPortDriver *asynPort_; + uint8_t* dataBuffer_; + size_t nfft_; + size_t bufferSizeBytes_; + size_t bytesInBuffer_; }; #endif /* ECMC_FFT_H_ */ diff --git a/ecmcPlugin_FFT-loc/ecmcPlugin_FFTApp/src/ecmcFFTWrap.h b/ecmcPlugin_FFT-loc/ecmcPlugin_FFTApp/src/ecmcFFTWrap.h index 6a2a80e..f95fb84 100644 --- a/ecmcPlugin_FFT-loc/ecmcPlugin_FFTApp/src/ecmcFFTWrap.h +++ b/ecmcPlugin_FFT-loc/ecmcPlugin_FFTApp/src/ecmcFFTWrap.h @@ -17,11 +17,12 @@ extern "C" { # endif // ifdef __cplusplus //Error codes -#define ECMC_PLUGIN_ERROR_CONFIG_STR_PARSE_FAIL 1 -#define ECMC_PLUGIN_ERROR_NO_SOURCE 2 -#define ECMC_PLUGIN_ERROR_DATA_SOURCE_NULL 3 -#define ECMC_PLUGIN_ERROR_ASYNPORT_NULL 4 -#define ECMC_PLUGIN_ERROR_FFT_NULL 5 +#define ECMC_PLUGIN_ERROR_WRAP_BASE 10 +#define ECMC_PLUGIN_ERROR_CONFIG_STR_PARSE_FAIL (ECMC_PLUGIN_ERROR_WRAP_BASE + 1) +#define ECMC_PLUGIN_ERROR_NO_SOURCE (ECMC_PLUGIN_ERROR_WRAP_BASE + 2) +#define ECMC_PLUGIN_ERROR_DATA_SOURCE_NULL (ECMC_PLUGIN_ERROR_WRAP_BASE + 3) +#define ECMC_PLUGIN_ERROR_ASYNPORT_NULL (ECMC_PLUGIN_ERROR_WRAP_BASE + 4) +#define ECMC_PLUGIN_ERROR_FFT_NULL (ECMC_PLUGIN_ERROR_WRAP_BASE + 5) #define PRINT_IF_DBG_MODE(fmt, ...) \ { \