12 #include <epicsMath.h> 14 #define epicsExportSharedSymbols 23 namespace epics {
namespace pvaClient {
26 UnionConstPtr
const & u,
29 PVStructurePtr
const & pvRequest)
35 PvaClientNTMultiData::PvaClientNTMultiData(
36 UnionConstPtr
const & u,
39 PVStructurePtr
const & pvRequest)
40 : pvaClientMultiChannel(pvaClientMultiChannel),
41 pvaClientChannelArray(pvaClientChannelArray),
42 nchannel(pvaClientChannelArray.size()),
47 if(PvaClient::getDebug()) cout<<
"PvaClientNTMultiData::PvaClientNTMultiData()\n";
48 changeFlags = shared_vector<epics::pvData::boolean>(nchannel);
49 topPVStructure.resize(nchannel);
51 unionValue.resize(nchannel);
52 PVDataCreatePtr pvDataCreate = getPVDataCreate();
53 for(
size_t i=0; i< nchannel; ++i) {
54 topPVStructure[i] = PVStructurePtr();
55 unionValue[i] = pvDataCreate->createPVUnion(u);
57 NTMultiChannelBuilderPtr builder = NTMultiChannel::createBuilder();
58 builder->value(u)->addIsConnected();
59 if(pvRequest->getSubField(
"field.alarm"))
63 builder->addSeverity();
65 builder->addMessage();
66 severity.resize(nchannel);
67 status.resize(nchannel);
68 message.resize(nchannel);
71 if(pvRequest->getSubField(
"field.timeStamp")) {
73 builder->addTimeStamp();
74 builder->addSecondsPastEpoch();
75 builder->addNanoseconds();
76 builder->addUserTag();
77 secondsPastEpoch.resize(nchannel);
78 nanoseconds.resize(nchannel);
79 userTag.resize(nchannel);
81 ntMultiChannelStructure = builder->createStructure();
85 PvaClientNTMultiData::~PvaClientNTMultiData()
87 if(PvaClient::getDebug()) cout<<
"PvaClientNTMultiData::~PvaClientNTMultiData()\n";
90 void PvaClientNTMultiData::setPVStructure(
91 PVStructurePtr
const &pvStructure,
size_t index)
93 topPVStructure[index] = pvStructure;
96 shared_vector<epics::pvData::boolean> PvaClientNTMultiData::getChannelChangeFlags()
101 size_t PvaClientNTMultiData::getNumber()
108 void PvaClientNTMultiData::startDeltaTime()
110 for(
size_t i=0; i<nchannel; ++i)
112 topPVStructure[i] = PVStructurePtr();
115 alarm.setSeverity(noAlarm);
116 alarm.setStatus(noStatus);
117 alarm.setMessage(
"");
118 severity[i] = invalidAlarm;
119 status[i] = undefinedStatus;
120 message[i] =
"not connected";
124 timeStamp.getCurrent();
125 secondsPastEpoch[i] = 0;
133 void PvaClientNTMultiData::endDeltaTime(
bool valueOnly)
135 for(
size_t i=0; i<nchannel; ++i)
137 PVStructurePtr pvst = topPVStructure[i];
138 changeFlags[i] =
false;
139 if(pvst&&unionValue[i]) {
140 changeFlags[i] =
true;
142 PVFieldPtr pvValue = pvst->getSubField(
"value");
144 unionValue[i]->set(pvst->getSubField(
"value"));
147 unionValue[i]->set(pvst);
151 PVIntPtr pvSeverity = pvst->getSubField<PVInt>(
"alarm.severity");
152 PVIntPtr pvStatus = pvst->getSubField<PVInt>(
"alarm.status");
153 PVStringPtr pvMessage = pvst->getSubField<PVString>(
"alarm.message");
154 if(pvSeverity&&pvStatus&&pvMessage) {
155 severity[i] = pvSeverity->get();
156 status[i] = pvStatus->get();
157 message[i] = pvMessage->get();
159 severity[i] = undefinedAlarm;
160 status[i] = undefinedStatus;
161 message[i] =
"no alarm field";
166 PVLongPtr pvEpoch = pvst->getSubField<PVLong>(
"timeStamp.secondsPastEpoch");
167 PVIntPtr pvNano = pvst->getSubField<PVInt>(
"timeStamp.nanoseconds");
168 PVIntPtr pvTag = pvst->getSubField<PVInt>(
"timeStamp.userTag");
169 if(pvEpoch&&pvNano&&pvTag) {
170 secondsPastEpoch[i] = pvEpoch->get();
171 nanoseconds[i] = pvNano->get();
172 userTag[i] = pvTag->get();
179 TimeStamp PvaClientNTMultiData::getTimeStamp()
181 pvTimeStamp.get(timeStamp);
185 NTMultiChannelPtr PvaClientNTMultiData::getNTMultiChannel()
187 PVStructurePtr pvStructure = getPVDataCreate()->createPVStructure(ntMultiChannelStructure);
188 NTMultiChannelPtr ntMultiChannel = NTMultiChannel::wrap(pvStructure);
189 ntMultiChannel->getChannelName()->replace(pvaClientMultiChannel->getChannelNames());
190 shared_vector<PVUnionPtr> val(nchannel);
191 for(
size_t i=0; i<nchannel; ++i) val[i] = unionValue[i];
192 ntMultiChannel->getValue()->replace(freeze(val));
193 shared_vector<epics::pvData::boolean> connected = pvaClientMultiChannel->getIsConnected();
194 shared_vector<epics::pvData::boolean> isConnected(nchannel);
195 for(
size_t i=0; i<nchannel; ++i) isConnected[i] = connected[i];
196 ntMultiChannel->getIsConnected()->replace(freeze(isConnected));
199 shared_vector<int32> sev(nchannel);
200 for(
size_t i=0; i<nchannel; ++i) sev[i] = severity[i];
201 ntMultiChannel->getSeverity()->replace(freeze(sev));
202 shared_vector<int32> sta(nchannel);
203 for(
size_t i=0; i<nchannel; ++i) sta[i] = status[i];
204 ntMultiChannel->getStatus()->replace(freeze(sta));
205 shared_vector<string> mes(nchannel);
206 for(
size_t i=0; i<nchannel; ++i) mes[i] = message[i];
207 ntMultiChannel->getMessage()->replace(freeze(mes));
211 shared_vector<int64> sec(nchannel);
212 for(
size_t i=0; i<nchannel; ++i) sec[i] = secondsPastEpoch[i];
213 ntMultiChannel->getSecondsPastEpoch()->replace(freeze(sec));
214 shared_vector<int32> nano(nchannel);
215 for(
size_t i=0; i<nchannel; ++i) nano[i] = nanoseconds[i];
216 ntMultiChannel->getNanoseconds()->replace(freeze(nano));
217 shared_vector<int32> tag(nchannel);
218 for(
size_t i=0; i<nchannel; ++i) tag[i] = userTag[i];
219 ntMultiChannel->getUserTag()->replace(freeze(tag));
221 return ntMultiChannel;
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
std::tr1::shared_ptr< PvaClientNTMultiData > PvaClientNTMultiDataPtr
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
Provides NTMultiChannel data for both PvaClientNTMultiGet and PvaClientNTMultiMonitor.