Buffer fills up..
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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_ */
|
||||
|
||||
@@ -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, ...) \
|
||||
{ \
|
||||
|
||||
Reference in New Issue
Block a user