12 #include <epicsMath.h> 14 #define epicsExportSharedSymbols 23 namespace epics {
namespace pvaClient {
35 PvaClientNTMultiData::PvaClientNTMultiData(
40 : pvaClientMultiChannel(pvaClientMultiChannel),
41 pvaClientChannelArray(pvaClientChannelArray),
42 nchannel(pvaClientChannelArray.
size()),
46 if(PvaClient::getDebug()) cout<<
"PvaClientNTMultiData::PvaClientNTMultiData()\n";
47 topPVStructure.
resize(nchannel);
48 unionValue.resize(nchannel);
50 for(
size_t i=0;
i< nchannel; ++
i) {
52 unionValue[
i] = pvDataCreate->createPVUnion(u);
55 builder->value(u)->addIsConnected();
56 if(pvRequest->getSubField(
"field.alarm"))
60 builder->addSeverity();
62 builder->addMessage();
63 severity.resize(nchannel);
65 message.resize(nchannel);
68 if(pvRequest->getSubField(
"field.timeStamp")) {
70 builder->addTimeStamp();
71 builder->addSecondsPastEpoch();
72 builder->addNanoseconds();
73 builder->addUserTag();
74 secondsPastEpoch.resize(nchannel);
75 nanoseconds.resize(nchannel);
76 userTag.resize(nchannel);
78 ntMultiChannelStructure = builder->createStructure();
82 PvaClientNTMultiData::~PvaClientNTMultiData()
84 if(PvaClient::getDebug()) cout<<
"PvaClientNTMultiData::~PvaClientNTMultiData()\n";
87 void PvaClientNTMultiData::setPVStructure(
90 topPVStructure[index] = pvStructure;
94 size_t PvaClientNTMultiData::getNumber()
99 void PvaClientNTMultiData::startDeltaTime()
101 for(
size_t i=0;
i<nchannel; ++
i)
108 alarm.setMessage(
"");
111 message[
i] =
"not connected";
115 timeStamp.getCurrent();
116 secondsPastEpoch[
i] = 0;
124 void PvaClientNTMultiData::endDeltaTime(
bool valueOnly)
126 for(
size_t i=0;
i<nchannel; ++
i)
131 }
else if(unionValue[
i]) {
133 PVFieldPtr pvValue = pvst->getSubField(
"value");
135 unionValue[
i]->set(pvst->getSubField(
"value"));
140 unionValue[
i]->set(pvst);
144 PVIntPtr pvSeverity = pvst->getSubField<
PVInt>(
"alarm.severity");
145 PVIntPtr pvStatus = pvst->getSubField<
PVInt>(
"alarm.status");
147 if(pvSeverity&&pvStatus&&pvMessage) {
148 severity[
i] = pvSeverity->
get();
150 message[
i] = pvMessage->get();
154 message[
i] =
"no alarm field";
159 PVLongPtr pvEpoch = pvst->getSubField<
PVLong>(
"timeStamp.secondsPastEpoch");
160 PVIntPtr pvNano = pvst->getSubField<
PVInt>(
"timeStamp.nanoseconds");
161 PVIntPtr pvTag = pvst->getSubField<
PVInt>(
"timeStamp.userTag");
162 if(pvEpoch&&pvNano&&pvTag) {
163 secondsPastEpoch[
i] = pvEpoch->
get();
164 nanoseconds[
i] = pvNano->get();
165 userTag[
i] = pvTag->get();
174 pvTimeStamp.get(timeStamp);
182 ntMultiChannel->getChannelName()->replace(pvaClientMultiChannel->getChannelNames());
184 for(
size_t i=0;
i<nchannel; ++
i) val[
i] = unionValue[
i];
185 ntMultiChannel->getValue()->replace(freeze(val));
188 for(
size_t i=0;
i<nchannel; ++
i) isConnected[
i] = connected[
i];
189 ntMultiChannel->getIsConnected()->replace(freeze(isConnected));
193 for(
size_t i=0;
i<nchannel; ++
i) sev[
i] = severity[
i];
194 ntMultiChannel->getSeverity()->replace(freeze(sev));
196 for(
size_t i=0;
i<nchannel; ++
i) sta[
i] =
status[
i];
197 ntMultiChannel->getStatus()->replace(freeze(sta));
199 for(
size_t i=0;
i<nchannel; ++
i) mes[
i] = message[
i];
200 ntMultiChannel->getMessage()->replace(freeze(mes));
205 for(
size_t i=0;
i<nchannel; ++
i) sec[
i] = secondsPastEpoch[
i];
206 ntMultiChannel->getSecondsPastEpoch()->replace(freeze(sec));
208 for(
size_t i=0;
i<nchannel; ++
i) nano[
i] = nanoseconds[
i];
209 ntMultiChannel->getNanoseconds()->replace(freeze(nano));
211 for(
size_t i=0;
i<nchannel; ++
i) tag[
i] = userTag[
i];
212 ntMultiChannel->getUserTag()->replace(freeze(tag));
214 return ntMultiChannel;
void resize(size_t i)
Grow or shrink array.
std::tr1::shared_ptr< PVInt > PVIntPtr
TODO only here because of the Lockable.
std::tr1::shared_ptr< PVLong > PVLongPtr
storage_t::arg_type get() const
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
std::tr1::shared_ptr< PvaClientNTMultiData > PvaClientNTMultiDataPtr
PVString is special case, since it implements SerializableArray.
std::tr1::shared_ptr< PVUnion > PVUnionPtr
std::tr1::shared_ptr< const Union > UnionConstPtr
size_t size() const
Number of elements visible through this vector.
std::tr1::shared_ptr< PVStructure > PVStructurePtr
std::tr1::shared_ptr< PVString > PVStringPtr
Class that holds the data for each possible scalar type.
std::tr1::shared_ptr< PVField > PVFieldPtr
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
std::tr1::shared_ptr< NTMultiChannel > NTMultiChannelPtr
std::tr1::shared_ptr< detail::NTMultiChannelBuilder > NTMultiChannelBuilderPtr
Provides NTMultiChannel data for both PvaClientNTMultiGet and PvaClientNTMultiMonitor.
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Methods for manipulating timeStamp.