Buffer fills up..

This commit is contained in:
Anders Sandström
2020-04-02 20:57:30 +02:00
parent e99a9326e7
commit 346ab064cd
3 changed files with 88 additions and 14 deletions

View File

@@ -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;
}

View File

@@ -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_ */

View File

@@ -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, ...) \
{ \