From 7426436519f27a3f9d47fcf3d074f365116ea532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Mon, 4 Mar 2024 12:12:28 +0100 Subject: [PATCH 1/5] add dbd --- GNUmakefile | 2 +- src/ecmcDAQPlg.dbd | 1 + startup.cmd | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 src/ecmcDAQPlg.dbd diff --git a/GNUmakefile b/GNUmakefile index 91b7719..0172317 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -26,6 +26,6 @@ SOURCES += $(SRC_DIR)/ecmcDAQDataArray.cpp SOURCES += $(SRC_DIR)/ecmcDAQDataChannel.cpp SOURCES += $(SRC_DIR)/ecmcDAQWrap.cpp SOURCES += $(SRC_DIR)/ecmcPluginDAQ.c - +DBDS += $(SRC_DIR)/ecmcDAQPlg.dbd TEMPLATES += $(wildcard $(DB_DIR)/*.template) SCRIPTS += ./startup.cmd \ No newline at end of file diff --git a/src/ecmcDAQPlg.dbd b/src/ecmcDAQPlg.dbd new file mode 100644 index 0000000..9e0dd79 --- /dev/null +++ b/src/ecmcDAQPlg.dbd @@ -0,0 +1 @@ +registrar("ecmcDAQPlgRegister") diff --git a/startup.cmd b/startup.cmd index 0f91626..b781124 100644 --- a/startup.cmd +++ b/startup.cmd @@ -17,4 +17,4 @@ #- Load plugin: epicsEnvSet(ECMC_PLUGIN_FILNAME,"$(ecmc_plugin_daq_DIR)/lib/${EPICS_HOST_ARCH=linux-x86_64}/libecmc_plugin_daq.so") epicsEnvSet(ECMC_PLUGIN_CONFIG,"DBG_PRINT=1;") -ecmcConfigOrDie "Cfg.LoadPlugin(${PLUGIN_ID}${ECMC_PLUGIN_FILNAME},${ECMC_PLUGIN_CONFIG=""},1)" +ecmcConfigOrDie "Cfg.LoadPlugin(${PLUGIN_ID},${ECMC_PLUGIN_FILNAME},${ECMC_PLUGIN_CONFIG=""})" From 3366414ff8efdf4d2c16aecb49a3caa36ecccd18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Mon, 4 Mar 2024 12:25:45 +0100 Subject: [PATCH 2/5] Runs but hangs... --- src/ecmcDAQChannelItem.h | 4 +++- src/ecmcDAQDataChannel.cpp | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ecmcDAQChannelItem.h b/src/ecmcDAQChannelItem.h index 568c9ed..768dcb9 100644 --- a/src/ecmcDAQChannelItem.h +++ b/src/ecmcDAQChannelItem.h @@ -123,7 +123,9 @@ class ecmcDAQChannelItem { if(first) { dataIndexToReturn_ = 0; } - + dataIndexToReturn_++; + return 0.0; + if(dataIndexToReturn_ >= dataElementCount_) { printf("ERROR: Try to read outside data buffer for data item %s\n", name_.c_str()); return -1; diff --git a/src/ecmcDAQDataChannel.cpp b/src/ecmcDAQDataChannel.cpp index a2fb011..cc328e9 100644 --- a/src/ecmcDAQDataChannel.cpp +++ b/src/ecmcDAQDataChannel.cpp @@ -67,13 +67,13 @@ double ecmcDAQDataChannel::getData(int first){ first = false; } - if(dataItems_[currItemIndex_]->empty()) { + if(dataItems_[currItemIndex_]->empty() && currItemIndex_+1=itemCounter_) { + if(currItemIndex_ >= itemCounter_) { printf("No more data here!!!\n"); return 0; //throw std::runtime_error( "Item index out of range"); From 760c2d786b142faca60444aad8ed6b0db99a984d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Mon, 4 Mar 2024 13:58:13 +0100 Subject: [PATCH 3/5] WIP --- src/ecmcDAQChannelItem.h | 9 ++++----- src/ecmcDAQDataArray.cpp | 8 ++++---- src/ecmcDAQDataChannel.cpp | 5 +++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/ecmcDAQChannelItem.h b/src/ecmcDAQChannelItem.h index 768dcb9..8ae4bdd 100644 --- a/src/ecmcDAQChannelItem.h +++ b/src/ecmcDAQChannelItem.h @@ -60,6 +60,7 @@ class ecmcDAQChannelItem { float32Ptr_ = NULL; float64Ptr_ = NULL; dataType_ = ECMC_EC_NONE; + printf("ecmcDAQChannelItem: Created new item %s, format %d\n",name,(int)format); } ~ecmcDAQChannelItem() { @@ -123,14 +124,12 @@ class ecmcDAQChannelItem { if(first) { dataIndexToReturn_ = 0; } - dataIndexToReturn_++; - return 0.0; - + if(dataIndexToReturn_ >= dataElementCount_) { printf("ERROR: Try to read outside data buffer for data item %s\n", name_.c_str()); return -1; } - + printf("DATATYPE = %d\n",(int) dataType_); switch (dataType_) { case ECMC_EC_B1: uint8Ptr_ = (uint8_t *)&dataItemInfo_->data[dataIndexToReturn_ * bytesPerElement_]; @@ -215,7 +214,6 @@ class ecmcDAQChannelItem { break; } dataIndexToReturn_++; - return formatData(data,time); } @@ -240,6 +238,7 @@ class ecmcDAQChannelItem { ; break; } + printf("DATA = %lf\n",data); return data; } diff --git a/src/ecmcDAQDataArray.cpp b/src/ecmcDAQDataArray.cpp index e63c980..da483ea 100644 --- a/src/ecmcDAQDataArray.cpp +++ b/src/ecmcDAQDataArray.cpp @@ -158,10 +158,10 @@ void ecmcDAQDataArray::execute() { size_t index = firstDataElementIndex_ ; for(std::vector::iterator pDataCh = dataChannels_.begin(); pDataCh != dataChannels_.end(); ++pDataCh) { //always atleast one data item in a channel. Set "first" bit in call to getData() - buffer_[index]=(*pDataCh)->getData(1); - index++; - while(!(*pDataCh)->empty()) { - buffer_[index]=(*pDataCh)->getData(0); + int first = 1; + for(int i = 0 ; i < (*pDataCh)->getDataElementCount(); i++) { + buffer_[index]=(*pDataCh)->getData(first); + first = 0; } } updateAsyn(); diff --git a/src/ecmcDAQDataChannel.cpp b/src/ecmcDAQDataChannel.cpp index cc328e9..0e73cbc 100644 --- a/src/ecmcDAQDataChannel.cpp +++ b/src/ecmcDAQDataChannel.cpp @@ -48,7 +48,7 @@ void ecmcDAQDataChannel::connectToDataSources() { (*pDataItem)->connectToSource(); dataElementCount_ = dataElementCount_ + (*pDataItem)->getDataElementCount(); } - + printf("ecmcDAQDataChannel::connectToDataSources()::dataElementCount_=%d\n",dataElementCount_); dataSourcesLinked_ = 1; } @@ -67,7 +67,7 @@ double ecmcDAQDataChannel::getData(int first){ first = false; } - if(dataItems_[currItemIndex_]->empty() && currItemIndex_+1empty() && currItemIndex_+1 < itemCounter_) { // get first index of next dataItem first = true; currItemIndex_++; @@ -84,5 +84,6 @@ double ecmcDAQDataChannel::getData(int first){ } bool ecmcDAQDataChannel::empty(){ + return 1; return dataElementCount_>=returnedDataCounter_; } From 9b1987eaf0804d234f745f7e913e8adac06f0c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Mon, 4 Mar 2024 17:13:23 +0100 Subject: [PATCH 4/5] Fetching data works.. --- src/ecmcDAQChannelItem.h | 31 +++++++++---------------------- src/ecmcDAQDataArray.cpp | 7 +++---- src/ecmcDAQDataChannel.cpp | 30 ++++++++++++++++++------------ 3 files changed, 30 insertions(+), 38 deletions(-) diff --git a/src/ecmcDAQChannelItem.h b/src/ecmcDAQChannelItem.h index 8ae4bdd..44943f5 100644 --- a/src/ecmcDAQChannelItem.h +++ b/src/ecmcDAQChannelItem.h @@ -99,37 +99,25 @@ class ecmcDAQChannelItem { } } - - /*struct ecmcDataItemInfo { - char *name; - uint8_t *data; - size_t dataSize; - size_t dataElementSize; - size_t dataBitCount; - ecmcEcDataType dataType; - ecmcDataDir dataDirection; - double dataUpdateRateMs; - int dataPointerValid; - };*/ + void resetIndex(int reset) { + if(reset) { + dataIndexToReturn_ = 0; + } + } /* Return data: - * if "first" is set to true the first data point will be returned. - * if "first" is set to false the the next data point will be returned. * looping with false will return new data for each call untill theres no more data * before call, check if data is available with notEmpty() */ - double getData(int first) { + double getData() { double data = 0; uint64_t time = 0; - if(first) { - dataIndexToReturn_ = 0; - } if(dataIndexToReturn_ >= dataElementCount_) { - printf("ERROR: Try to read outside data buffer for data item %s\n", name_.c_str()); + printf("ecmcDAQChannelItem::ERROR: Try to read outside data buffer for data item %s (elements %zu)\n", name_.c_str(),dataElementCount_); return -1; } - printf("DATATYPE = %d\n",(int) dataType_); + switch (dataType_) { case ECMC_EC_B1: uint8Ptr_ = (uint8_t *)&dataItemInfo_->data[dataIndexToReturn_ * bytesPerElement_]; @@ -218,7 +206,6 @@ class ecmcDAQChannelItem { return formatData(data,time); } - double formatData(double data, uint64_t time){ // Time format only works for integer values, otherwise a 0 will be returned switch(format_) { @@ -238,7 +225,7 @@ class ecmcDAQChannelItem { ; break; } - printf("DATA = %lf\n",data); + printf("DATA %s = %lf\n",cstrName_, data); return data; } diff --git a/src/ecmcDAQDataArray.cpp b/src/ecmcDAQDataArray.cpp index da483ea..01ee7ee 100644 --- a/src/ecmcDAQDataArray.cpp +++ b/src/ecmcDAQDataArray.cpp @@ -154,12 +154,11 @@ void ecmcDAQDataArray::execute() { if(!enablePlugin_) { return; } - + int first = 1; size_t index = firstDataElementIndex_ ; for(std::vector::iterator pDataCh = dataChannels_.begin(); pDataCh != dataChannels_.end(); ++pDataCh) { - //always atleast one data item in a channel. Set "first" bit in call to getData() - int first = 1; - for(int i = 0 ; i < (*pDataCh)->getDataElementCount(); i++) { + first = 1; + for(size_t i = 0 ; i < (*pDataCh)->getDataElementCount(); i++) { buffer_[index]=(*pDataCh)->getData(first); first = 0; } diff --git a/src/ecmcDAQDataChannel.cpp b/src/ecmcDAQDataChannel.cpp index 0e73cbc..4fdf9c6 100644 --- a/src/ecmcDAQDataChannel.cpp +++ b/src/ecmcDAQDataChannel.cpp @@ -48,7 +48,7 @@ void ecmcDAQDataChannel::connectToDataSources() { (*pDataItem)->connectToSource(); dataElementCount_ = dataElementCount_ + (*pDataItem)->getDataElementCount(); } - printf("ecmcDAQDataChannel::connectToDataSources()::dataElementCount_=%d\n",dataElementCount_); + printf("ecmcDAQDataChannel::connectToDataSources()::dataElementCount_=%zu\n",dataElementCount_); dataSourcesLinked_ = 1; } @@ -63,27 +63,33 @@ double ecmcDAQDataChannel::getType() { double ecmcDAQDataChannel::getData(int first){ if(first) { currItemIndex_ = 0; - } else { - first = false; + returnedDataCounter_= 0;; } - if(dataItems_[currItemIndex_]->empty() && currItemIndex_+1 < itemCounter_) { - // get first index of next dataItem - first = true; - currItemIndex_++; + // Get data from the first index + dataItems_[currItemIndex_]->resetIndex(first); + + if(dataItems_[currItemIndex_]->empty()){ + if(currItemIndex_ < itemCounter_ - 1) { + first = true; + currItemIndex_++; + dataItems_[currItemIndex_]->resetIndex(first); + } else { + printf("ecmcDAQDataChannel::ERROR: No more data item in list but array still requires data (items %zu)\n",itemCounter_); + return -1; + } } if(currItemIndex_ >= itemCounter_) { - printf("No more data here!!!\n"); + printf("ecmcDAQDataChannel::ERROR: item counter out of range (items %zu)\n",itemCounter_); return 0; //throw std::runtime_error( "Item index out of range"); } returnedDataCounter_++; - return dataItems_[currItemIndex_]->getData(first); + return dataItems_[currItemIndex_]->getData(); } -bool ecmcDAQDataChannel::empty(){ - return 1; - return dataElementCount_>=returnedDataCounter_; +bool ecmcDAQDataChannel::empty(){ + return returnedDataCounter_>=dataElementCount_; } From 1659ce17ee63d1945d77f3df0fec4105e1a4d9f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Sandstr=C3=B6m?= Date: Mon, 4 Mar 2024 17:14:58 +0100 Subject: [PATCH 5/5] Add printout --- src/ecmcDAQChannelItem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ecmcDAQChannelItem.h b/src/ecmcDAQChannelItem.h index 44943f5..12ea3e5 100644 --- a/src/ecmcDAQChannelItem.h +++ b/src/ecmcDAQChannelItem.h @@ -225,7 +225,7 @@ class ecmcDAQChannelItem { ; break; } - printf("DATA %s = %lf\n",cstrName_, data); + //printf("DATA %s = %lf\n",cstrName_, data); return data; }