This commit is contained in:
2024-03-04 11:22:34 +01:00
parent e092ed9dea
commit 21c010d0be
12 changed files with 433 additions and 184 deletions

View File

@@ -1,4 +1,4 @@
7/*************************************************************************\
/*************************************************************************\
* Copyright (c) 2024 PSI
* ecmc is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
@@ -14,15 +14,41 @@
// Needed to get headers in ecmc right...
#define ECMC_IS_PLUGIN
#define ECMC_PLUGIN_ASYN_PREFIX "plugin.daq"
#define ECMC_PLUGIN_ASYN_ENABLE "enable"
#define ECMC_PLUGIN_ASYN_RAWDATA "rawdata"
#include <sstream>
#include "ecmcDAQDataArray.h"
#include "ecmcPluginClient.h"
ecmcDAQDataArray::ecmcDAQDataArray(size_t nelm){
channelCounter_ = 0;
dataElementCount_= 0;
totalElementCount_ = 0;
ecmcDAQDataArray::ecmcDAQDataArray(const char* name, const char* portName)
: asynPortDriver(portName,
1, /* maxAddr */
asynInt32Mask | asynFloat64Mask | asynFloat32ArrayMask |
asynFloat64ArrayMask | asynEnumMask | asynDrvUserMask |
asynOctetMask | asynInt8ArrayMask | asynInt16ArrayMask |
asynInt32ArrayMask | asynUInt32DigitalMask, /* Interface mask */
asynInt32Mask | asynFloat64Mask | asynFloat32ArrayMask |
asynFloat64ArrayMask | asynEnumMask | asynDrvUserMask |
asynOctetMask | asynInt8ArrayMask | asynInt16ArrayMask |
asynInt32ArrayMask | asynUInt32DigitalMask, /* Interrupt mask */
ASYN_CANBLOCK , /*NOT ASYN_MULTI_DEVICE*/
1, /* Autoconnect */
0, /* Default priority */
0) /* Default stack size */
{
channelCounter_ = 0;
dataElementCount_ = 0;
totalElementCount_ = 0;
firstDataElementIndex_ = 0;
asynEnableId_ = 1;
asynRawDataId_ = -1;
enablePlugin_ = -1;
dataSourcesLinked_ = 0;
name_ = name;
}
ecmcDAQDataArray::~ecmcDAQDataArray() {
@@ -30,17 +56,17 @@ ecmcDAQDataArray::~ecmcDAQDataArray() {
}
void ecmcDAQDataArray::addChannel(int type) {
dataChannels_.push_back(new ecmcDAQDataChannel(type);
dataChannels_.push_back(new ecmcDAQDataChannel(type));
channelCounter_++;
}
void ecmcDAQDataArray::addDataItemToChannel(char* name, int format) {
void ecmcDAQDataArray::addDataItemToChannel(const char* name, int format) {
// Always add to last added channel
dataChannels_.back().addDataItem(name, format);
dataChannels_.back()->addDataItem(name, format);
}
void ecmcDAQDataArray::connectToDataSources() {
if( dataSourceLinked_ ) {
if( dataSourcesLinked_ ) {
return;
}
@@ -50,7 +76,7 @@ void ecmcDAQDataArray::connectToDataSources() {
if(!(*pDataCh)) {
throw std::runtime_error( "Channel empty..");
}
(*pDataCh)->connectToSources();
(*pDataCh)->connectToDataSources();
dataElementCount_ = dataElementCount_ + (*pDataCh)->getDataElementCount();
}
@@ -59,7 +85,7 @@ void ecmcDAQDataArray::connectToDataSources() {
// Now we we can finally allocate teh buffer (ecmc is still not in realtime, enterRT)
buffer_ = new double [totalElementCount_];
memset(buffer_,0,sizeof(buffer_))
memset(buffer_,0,totalElementCount_*sizeof(double));
// Build header
buildArrayHeader();
@@ -67,7 +93,7 @@ void ecmcDAQDataArray::connectToDataSources() {
// Register asyn parameters
initAsyn();
dataSourceLinked_ = 1;
dataSourcesLinked_ = 1;
}
/* Prepare header first in array, 4 elements per channel:
@@ -90,7 +116,7 @@ void ecmcDAQDataArray::buildArrayHeader(){
size_t dataStartOffset = channelCounter_* 4 + 1;
firstDataElementIndex_ = dataStartOffset;
if( nelm_ < dataStartOffset) {
if( totalElementCount_ < dataStartOffset) {
throw std::runtime_error( "Array to small, header will not fit (array size must be bigger than total data size plus 4*data_channel_count+1)..");
}
@@ -120,13 +146,59 @@ void ecmcDAQDataArray::buildArrayHeader(){
}
}
void ecmcDAQDataArray::setEnable(int enable) {
enablePlugin_ = enable;
}
void ecmcDAQDataArray::execute() {
if(!enablePlugin_) {
return;
}
size_t index = firstDataElementIndex_ ;
for(std::vector<ecmcDAQDataChannel*>::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);
}
}
updateAsyn();
}
void ecmcDAQDataArray::updateAsyn() {
doCallbacksFloat64Array(buffer_, totalElementCount_, asynRawDataId_,0);
setIntegerParam(asynEnableId_, enablePlugin_);
// Update integers
callParamCallbacks();
}
void ecmcDAQDataArray::initAsyn() {
// Add enable "plugin.daq.enable"
std::string paramName =ECMC_PLUGIN_ASYN_PREFIX ".";
paramName += name_;
paramName += ".";
paramName += ECMC_PLUGIN_ASYN_ENABLE;
if( createParam(0, paramName.c_str(), asynParamInt32, &asynEnableId_) != asynSuccess ) {
throw std::runtime_error("Failed create asyn parameter enable");
}
setIntegerParam(asynEnableId_, enablePlugin_);
// Add rawdata "plugin.fft%d.rawdata"
paramName =ECMC_PLUGIN_ASYN_PREFIX ".";
paramName += name_;
paramName += ".";
paramName += ECMC_PLUGIN_ASYN_RAWDATA;
if( createParam(0, paramName.c_str(), asynParamFloat64Array, &asynRawDataId_ ) != asynSuccess ) {
throw std::runtime_error("Failed create asyn parameter rawdata");
}
doCallbacksFloat64Array(buffer_, totalElementCount_, asynRawDataId_,0);
// Update integers
callParamCallbacks();
return;
}