builds
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user