added NTMultiChannel

This commit is contained in:
Marty Kraimer
2014-08-21 07:59:46 -04:00
parent fdeda9dc97
commit 7f521bdc3c
6 changed files with 457 additions and 82 deletions
+2
View File
@@ -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
+152
View File
@@ -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);
}
}}
+99
View File
@@ -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 */