added NTMultiChannel
This commit is contained in:
@@ -9,10 +9,12 @@ INC += nt.h
|
||||
INC += ntfield.h
|
||||
INC += ntnameValue.h
|
||||
INC += nttable.h
|
||||
INC += ntmultiChannel.h
|
||||
|
||||
LIBSRCS += ntfield.cpp
|
||||
LIBSRCS += ntnameValue.cpp
|
||||
LIBSRCS += nttable.cpp
|
||||
LIBSRCS += ntmultiChannel.cpp
|
||||
|
||||
LIBRARY=nt
|
||||
|
||||
|
||||
@@ -0,0 +1,152 @@
|
||||
/* ntmultiChannel.cpp */
|
||||
/**
|
||||
* Copyright - See the COPYRIGHT that is included with this distribution.
|
||||
* EPICS pvDataCPP is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
*/
|
||||
|
||||
#include <pv/ntmultiChannel.h>
|
||||
|
||||
namespace epics { namespace nt {
|
||||
|
||||
using namespace epics::pvData;
|
||||
using std::tr1::static_pointer_cast;
|
||||
using std::string;
|
||||
using std::cout;
|
||||
using std::endl;
|
||||
|
||||
static FieldCreatePtr fieldCreate = getFieldCreate();
|
||||
static PVDataCreatePtr pvDataCreate = getPVDataCreate();
|
||||
|
||||
bool NTMultiChannel::isNTMultiChannel(PVStructurePtr const & pvStructure)
|
||||
{
|
||||
PVUnionArrayPtr pvValue = pvStructure->getSubField<PVUnionArray>("value");
|
||||
if(!pvValue) return false;
|
||||
PVStringArrayPtr pvChannelName =
|
||||
pvStructure->getSubField<PVStringArray>("channelName");
|
||||
return true;
|
||||
}
|
||||
|
||||
NTMultiChannelPtr NTMultiChannel::create(
|
||||
std::vector<std::string> const & optionNames)
|
||||
{
|
||||
return NTMultiChannel::create(optionNames,fieldCreate->createVariantUnion());
|
||||
}
|
||||
|
||||
NTMultiChannelPtr NTMultiChannel::create(
|
||||
std::vector<std::string> const & optionNames,
|
||||
epics::pvData::UnionConstPtr const & unionPtr)
|
||||
{
|
||||
shared_vector<const std::string> channelNames;
|
||||
return NTMultiChannel::create(optionNames,unionPtr,channelNames);
|
||||
}
|
||||
|
||||
NTMultiChannelPtr NTMultiChannel::create(
|
||||
std::vector<std::string> const & optionNames,
|
||||
UnionConstPtr const & unionPtr,
|
||||
shared_vector<const std::string> channelNames)
|
||||
{
|
||||
StandardFieldPtr standardField = getStandardField();
|
||||
size_t nfields = 2;
|
||||
bool hasAlarm = false;
|
||||
bool hasTimeStamp = false;
|
||||
bool hasSeverity = false;
|
||||
bool hasStatus = false;
|
||||
bool hasMessage = false;
|
||||
bool hasSecondsPastEpoch = false;
|
||||
bool hasNanoseconds = false;
|
||||
bool hasDescriptor = false;
|
||||
for(size_t i=0; i<optionNames.size(); ++i) {
|
||||
string name = optionNames[i];
|
||||
if(name.compare("alarm")==0) {hasAlarm = true; ++nfields;}
|
||||
if(name.compare("timeStamp")==0) {hasTimeStamp = true; ++nfields;}
|
||||
if(name.compare("severity")==0) {hasSeverity = true; ++nfields;}
|
||||
if(name.compare("status")==0) {hasStatus = true; ++nfields;}
|
||||
if(name.compare("message")==0) {hasMessage = true; ++nfields;}
|
||||
if(name.compare("secondsPastEpoch")==0) {hasSecondsPastEpoch = true; ++nfields;}
|
||||
if(name.compare("nanoseconds`")==0) {hasNanoseconds = true; ++nfields;}
|
||||
if(name.compare("descriptor")==0) {hasDescriptor = true; ++nfields;}
|
||||
}
|
||||
FieldConstPtrArray fields(nfields);
|
||||
StringArray names(nfields);
|
||||
size_t ind = 0;
|
||||
names[ind] = "value";
|
||||
fields[ind++] = fieldCreate->createUnionArray(unionPtr);
|
||||
names[ind] = "channelName";
|
||||
fields[ind++] = fieldCreate->createScalarArray(pvString);
|
||||
if(hasTimeStamp) {
|
||||
names[ind] = "timeStamp";
|
||||
fields[ind++] = standardField->timeStamp();
|
||||
}
|
||||
if(hasAlarm) {
|
||||
names[ind] = "alarm";
|
||||
fields[ind++] = standardField->alarm();
|
||||
}
|
||||
if(hasDescriptor) {
|
||||
names[ind] = "descriptor";
|
||||
fields[ind++] = fieldCreate->createScalar(pvString);
|
||||
}
|
||||
if(hasSeverity) {
|
||||
names[ind] = "severity";
|
||||
fields[ind++] = fieldCreate->createScalarArray(pvInt);
|
||||
}
|
||||
if(hasStatus) {
|
||||
names[ind] = "status";
|
||||
fields[ind++] = fieldCreate->createScalarArray(pvInt);
|
||||
}
|
||||
if(hasMessage) {
|
||||
names[ind] = "message";
|
||||
fields[ind++] = fieldCreate->createScalarArray(pvString);
|
||||
}
|
||||
if(hasSecondsPastEpoch) {
|
||||
names[ind] = "secondsPastEpoch";
|
||||
fields[ind++] = fieldCreate->createScalarArray(pvLong);
|
||||
}
|
||||
if(hasNanoseconds) {
|
||||
names[ind] = "nanoseconds";
|
||||
fields[ind++] = fieldCreate->createScalarArray(pvInt);
|
||||
}
|
||||
StructureConstPtr st = fieldCreate->createStructure(names,fields);
|
||||
PVStructurePtr pvStructure = pvDataCreate->createPVStructure(st);
|
||||
if(channelNames.size()>0) {
|
||||
PVStringArrayPtr pvName = pvStructure->getSubField<PVStringArray>("channelName");
|
||||
pvName->replace(channelNames);
|
||||
}
|
||||
return NTMultiChannelPtr(new NTMultiChannel(pvStructure));
|
||||
}
|
||||
|
||||
NTMultiChannelPtr NTMultiChannel::clone(PVStructurePtr const & pv)
|
||||
{
|
||||
PVStructurePtr pvStructure = getPVDataCreate()->createPVStructure(pv);
|
||||
return NTMultiChannelPtr(new NTMultiChannel(pvStructure));
|
||||
}
|
||||
|
||||
NTMultiChannel::NTMultiChannel(PVStructurePtr const & pvStructure)
|
||||
: pvNTMultiChannel(pvStructure),
|
||||
pvTimeStamp(pvStructure->getSubField<PVStructure>("timeStamp")),
|
||||
pvAlarm(pvStructure->getSubField<PVStructure>("alarm")),
|
||||
pvValue(pvStructure->getSubField<PVUnionArray>("value")),
|
||||
pvChannelName(pvStructure->getSubField<PVStringArray>("channelName")),
|
||||
pvSeverity(pvStructure->getSubField<PVIntArray>("severity")),
|
||||
pvStatus(pvStructure->getSubField<PVIntArray>("status")),
|
||||
pvMessage(pvStructure->getSubField<PVStringArray>("message")),
|
||||
pvSecondsPastEpoch(pvStructure->getSubField<PVLongArray>("secondsPastEpoch")),
|
||||
pvNanoseconds(pvStructure->getSubField<PVIntArray>("nanoseconds")),
|
||||
pvDescriptor(pvStructure->getSubField<PVString>("descriptor"))
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void NTMultiChannel::attachTimeStamp(PVTimeStamp &pv)
|
||||
{
|
||||
if(!pvTimeStamp) return;
|
||||
pv.attach(pvTimeStamp);
|
||||
}
|
||||
|
||||
void NTMultiChannel::attachAlarm(PVAlarm &pv)
|
||||
{
|
||||
if(!pvAlarm) return;
|
||||
pv.attach(pvAlarm);
|
||||
}
|
||||
|
||||
}}
|
||||
@@ -0,0 +1,99 @@
|
||||
/* ntmultiChannel.h */
|
||||
/**
|
||||
* Copyright - See the COPYRIGHT that is included with this distribution.
|
||||
* EPICS pvDataCPP is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
*/
|
||||
#ifndef NTMULTICHANNEL_H
|
||||
#define NTMULTICHANNEL_H
|
||||
|
||||
#include <pv/ntfield.h>
|
||||
|
||||
namespace epics { namespace nt {
|
||||
|
||||
/**
|
||||
* Convenience Class for NTMultiChannel
|
||||
* @author mrk
|
||||
*
|
||||
*/
|
||||
|
||||
class NTMultiChannel;
|
||||
typedef std::tr1::shared_ptr<NTMultiChannel> NTMultiChannelPtr;
|
||||
|
||||
class NTMultiChannel
|
||||
{
|
||||
public:
|
||||
POINTER_DEFINITIONS(NTMultiChannel);
|
||||
/**
|
||||
* Is the pvStructure an NTMultiChannel.
|
||||
* @param pvStructure The pvStructure to test.
|
||||
* @return (false,true) if (is not, is) an NTMultiChannel.
|
||||
*/
|
||||
static bool isNTMultiChannel(
|
||||
epics::pvData::PVStructurePtr const &pvStructure);
|
||||
static NTMultiChannelPtr create(
|
||||
std::vector<std::string> const & optionNames);
|
||||
static NTMultiChannelPtr create(
|
||||
std::vector<std::string> const & optionNames,
|
||||
epics::pvData::UnionConstPtr const & unionPtr);
|
||||
static NTMultiChannelPtr create(
|
||||
std::vector<std::string> const & optionNames,
|
||||
epics::pvData::UnionConstPtr const & unionPtr,
|
||||
epics::pvData::shared_vector<const std::string> channelNames);
|
||||
static NTMultiChannelPtr clone(epics::pvData::PVStructurePtr const &);
|
||||
/**
|
||||
* Destructor
|
||||
*/
|
||||
~NTMultiChannel() {}
|
||||
/**
|
||||
* Attach a pvTimeStamp.
|
||||
* @param pvTimeStamp The pvTimeStamp that will be attached.
|
||||
* Does nothing if no timeStamp
|
||||
*/
|
||||
void attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp);
|
||||
/**
|
||||
* Attach a pvAlarm.
|
||||
* @param pvAlarm The pvAlarm that will be attached.
|
||||
* Does nothing if no alarm
|
||||
*/
|
||||
void attachAlarm(epics::pvData::PVAlarm &pvAlarm);
|
||||
/**
|
||||
* Get the pvStructure.
|
||||
* @return PVStructurePtr.
|
||||
*/
|
||||
epics::pvData::PVStructurePtr getPVStructure(){return pvNTMultiChannel;}
|
||||
/**
|
||||
* Get the timeStamp.
|
||||
* @return PVStructurePtr which may be null.
|
||||
*/
|
||||
epics::pvData::PVStructurePtr getTimeStamp(){return pvTimeStamp;}
|
||||
/**
|
||||
* Get the alarm.
|
||||
* @return PVStructurePtr which may be null.
|
||||
*/
|
||||
epics::pvData::PVStructurePtr getAlarm() {return pvAlarm;}
|
||||
epics::pvData::PVUnionArrayPtr getValue() {return pvValue;}
|
||||
epics::pvData::PVStringArrayPtr getChannelName() { return pvChannelName;};
|
||||
epics::pvData::PVIntArrayPtr getSeverity() {return pvSeverity;}
|
||||
epics::pvData::PVIntArrayPtr getStatus() {return pvStatus;}
|
||||
epics::pvData::PVStringArrayPtr getMessage() {return pvMessage;}
|
||||
epics::pvData::PVLongArrayPtr getSecondsPastEpoch() {return pvSecondsPastEpoch;}
|
||||
epics::pvData::PVIntArrayPtr getNanoseconds() {return pvNanoseconds;}
|
||||
epics::pvData::PVStringPtr getDescriptor() {return pvDescriptor;}
|
||||
private:
|
||||
NTMultiChannel(epics::pvData::PVStructurePtr const & pvStructure);
|
||||
epics::pvData::PVStructurePtr pvNTMultiChannel;
|
||||
epics::pvData::PVStructurePtr pvTimeStamp;
|
||||
epics::pvData::PVStructurePtr pvAlarm;
|
||||
epics::pvData::PVUnionArrayPtr pvValue;
|
||||
epics::pvData::PVStringArrayPtr pvChannelName;
|
||||
epics::pvData::PVIntArrayPtr pvSeverity;
|
||||
epics::pvData::PVIntArrayPtr pvStatus;
|
||||
epics::pvData::PVStringArrayPtr pvMessage;
|
||||
epics::pvData::PVLongArrayPtr pvSecondsPastEpoch;
|
||||
epics::pvData::PVIntArrayPtr pvNanoseconds;
|
||||
epics::pvData::PVStringPtr pvDescriptor;
|
||||
};
|
||||
|
||||
}}
|
||||
#endif /* NTMULTICHANNEL_H */
|
||||
Reference in New Issue
Block a user