44#include <unordered_map>
46typedef std::unordered_multimap<std::string, long> Mymap;
47typedef std::unordered_multimap<std::string, long>::iterator MymapIterator;
54 allocPVA(pva, PVs, 0);
57void allocPVA(
PVA_OVERALL *pva,
long PVs,
long repeats) {
63 for (j = 0; j < pva->numPVs; j++) {
65 pva->pvaData[j].getData[0].values = NULL;
66 pva->pvaData[j].getData[0].stringValues = NULL;
69 for (j = 0; j < pva->numPVs; j++) {
71 for (i = 0; i < repeats; i++) {
72 pva->pvaData[j].getData[i].values = NULL;
73 pva->pvaData[j].getData[i].stringValues = NULL;
77 for (j = 0; j < pva->numPVs; j++) {
80 pva->pvaData[j].putData[0].values = NULL;
81 pva->pvaData[j].putData[0].stringValues = NULL;
82 pva->pvaData[j].monitorData[0].values = NULL;
83 pva->pvaData[j].monitorData[0].stringValues = NULL;
85 for (j = 0; j < pva->numPVs; j++) {
86 pva->pvaData[j].numGetElements = 0;
87 pva->pvaData[j].numPutElements = 0;
88 pva->pvaData[j].numMonitorElements = 0;
89 pva->pvaData[j].numGetReadings = 0;
90 pva->pvaData[j].numMonitorReadings = 0;
91 pva->pvaData[j].numeric =
false;
92 pva->pvaData[j].nonnumeric =
false;
93 pva->pvaData[j].pvEnumeratedStructure =
false;
94 pva->pvaData[j].haveGetPtr =
false;
95 pva->pvaData[j].havePutPtr =
false;
96 pva->pvaData[j].haveMonitorPtr =
false;
97 pva->pvaData[j].units = NULL;
98 pva->pvaData[j].alarmSeverity = 0;
99 pva->pvaData[j].L1Ptr = j;
100 pva->pvaData[j].L2Ptr = j;
101 pva->pvaData[j].skip =
false;
103 pva->numNotConnected = PVs;
104 pva->limitGetReadings =
false;
105 pva->useStateChangeCallbacks =
false;
106 pva->useGetCallbacks =
false;
107 pva->useMonitorCallbacks =
false;
108 pva->usePutCallbacks =
false;
109 pva->includeAlarmSeverity =
false;
111 pva->numMultiChannels = 1;
112 pva->pvaClientMultiChannelPtr.resize(pva->numMultiChannels);
114 pva->pvaClientGetPtr.resize(pva->numPVs);
115 pva->pvaClientPutPtr.resize(pva->numPVs);
116 pva->pvaClientMonitorPtr.resize(pva->numPVs);
122 reallocPVA(pva, PVs, 0);
125void reallocPVA(
PVA_OVERALL *pva,
long PVs,
long repeats) {
127 pva->prevNumPVs = pva->numPVs;
130 pva->pvaChannelNames.resize(pva->numPVs);
131 pva->pvaProvider.resize(pva->numPVs);
134 for (j = pva->prevNumPVs; j < pva->numPVs; j++) {
136 pva->pvaData[j].getData[0].values = NULL;
137 pva->pvaData[j].getData[0].stringValues = NULL;
140 for (j = pva->prevNumPVs; j < pva->numPVs; j++) {
142 for (i = 0; i < repeats; i++) {
143 pva->pvaData[j].getData[i].values = NULL;
144 pva->pvaData[j].getData[i].stringValues = NULL;
148 for (j = pva->prevNumPVs; j < pva->numPVs; j++) {
151 pva->pvaData[j].putData[0].values = NULL;
152 pva->pvaData[j].putData[0].stringValues = NULL;
153 pva->pvaData[j].monitorData[0].values = NULL;
154 pva->pvaData[j].monitorData[0].stringValues = NULL;
156 for (j = pva->prevNumPVs; j < pva->numPVs; j++) {
157 pva->pvaData[j].numGetElements = 0;
158 pva->pvaData[j].numPutElements = 0;
159 pva->pvaData[j].numMonitorElements = 0;
160 pva->pvaData[j].numGetReadings = 0;
161 pva->pvaData[j].numMonitorReadings = 0;
162 pva->pvaData[j].numeric =
false;
163 pva->pvaData[j].nonnumeric =
false;
164 pva->pvaData[j].pvEnumeratedStructure =
false;
165 pva->pvaData[j].haveGetPtr =
false;
166 pva->pvaData[j].havePutPtr =
false;
167 pva->pvaData[j].haveMonitorPtr =
false;
168 pva->pvaData[j].units = NULL;
169 pva->pvaData[j].alarmSeverity = 0;
170 pva->pvaData[j].L1Ptr = j;
171 pva->pvaData[j].L2Ptr = j;
172 pva->pvaData[j].skip =
false;
174 pva->numNotConnected += pva->numPVs - pva->prevNumPVs;
176 pva->numMultiChannels++;
177 pva->pvaClientMultiChannelPtr.resize(pva->numMultiChannels);
179 pva->pvaClientGetPtr.resize(pva->numPVs);
180 pva->pvaClientPutPtr.resize(pva->numPVs);
181 pva->pvaClientMonitorPtr.resize(pva->numPVs);
195 for (i = 0; i < pva->numPVs; i++) {
197 for (j = 0; j < pva->pvaData[i].numGetReadings; j++) {
198 if (pva->pvaData[i].getData[j].values) {
199 free(pva->pvaData[i].getData[j].values);
201 if (pva->pvaData[i].getData[j].stringValues) {
202 for (k = 0; k < pva->pvaData[i].numGetElements; k++) {
203 if (pva->pvaData[i].getData[j].stringValues[k])
204 free(pva->pvaData[i].getData[j].stringValues[k]);
206 free(pva->pvaData[i].getData[j].stringValues);
210 if (pva->pvaData[i].monitorData[0].values) {
211 free(pva->pvaData[i].monitorData[0].values);
213 if (pva->pvaData[i].monitorData[0].stringValues) {
214 for (k = 0; k < pva->pvaData[i].numMonitorElements; k++) {
215 if (pva->pvaData[i].monitorData[0].stringValues[k])
216 free(pva->pvaData[i].monitorData[0].stringValues[k]);
218 free(pva->pvaData[i].monitorData[0].stringValues);
221 if (pva->pvaData[i].putData[0].values) {
222 free(pva->pvaData[i].putData[0].values);
224 if (pva->pvaData[i].putData[0].stringValues) {
226 free(pva->pvaData[i].putData[0].stringValues);
229 if (pva->pvaData[i].haveGetPtr ==
false) {
230 pva->pvaClientGetPtr[i].reset();
232 if (pva->pvaData[i].havePutPtr ==
false) {
233 pva->pvaClientPutPtr[i].reset();
235 if (pva->pvaData[i].haveMonitorPtr ==
false) {
236 pva->pvaClientMonitorPtr[i].reset();
239 free(pva->pvaData[i].getData);
240 free(pva->pvaData[i].putData);
241 free(pva->pvaData[i].monitorData);
242 if (pva->pvaData[i].units) {
243 free(pva->pvaData[i].units);
259 for (i = 0; i < pva->numPVs; i++) {
260 if (pva->pvaData[i].skip ==
true) {
263 for (j = 0; j < pva->pvaData[i].numGetReadings; j++) {
264 if (pva->limitGetReadings ==
false) {
265 if (pva->pvaData[i].getData[j].values) {
266 free(pva->pvaData[i].getData[j].values);
267 pva->pvaData[i].getData[j].values = NULL;
270 if (pva->pvaData[i].getData[j].stringValues) {
271 for (k = 0; k < pva->pvaData[i].numGetElements; k++) {
272 if (pva->pvaData[i].getData[j].stringValues[k]) {
273 free(pva->pvaData[i].getData[j].stringValues[k]);
274 pva->pvaData[i].getData[j].stringValues[k] = NULL;
277 if (pva->limitGetReadings ==
false) {
278 free(pva->pvaData[i].getData[j].stringValues);
279 pva->pvaData[i].getData[j].stringValues = NULL;
283 if (pva->limitGetReadings ==
false) {
284 pva->pvaData[i].numGetReadings = 0;
298 for (i = 0; i < pva->numPVs; i++) {
299 if (pva->pvaData[i].skip ==
true) {
302 if (pva->pvaData[i].monitorData[0].values) {
303 free(pva->pvaData[i].monitorData[0].values);
304 pva->pvaData[i].monitorData[0].values = NULL;
306 if (pva->pvaData[i].monitorData[0].stringValues) {
307 for (k = 0; k < pva->pvaData[i].numMonitorElements; k++) {
308 if (pva->pvaData[i].monitorData[0].stringValues[k])
309 free(pva->pvaData[i].monitorData[0].stringValues[k]);
311 free(pva->pvaData[i].monitorData[0].stringValues);
312 pva->pvaData[i].monitorData[0].stringValues = NULL;
314 pva->pvaData[i].numMonitorReadings = 0;
322void ConnectPVA(
PVA_OVERALL *pva,
double pendIOTime) {
323 long i, j, n, num = 0, numInternalPVs;
325 epics::pvData::shared_vector<std::string> namesTmp(pva->numPVs);
326 epics::pvData::shared_vector<std::string> subnames(pva->numPVs);
327 epics::pvData::Status status;
328 epics::pvaClient::PvaClientChannelArray pvaClientChannelArray;
329 epics::pvData::shared_vector<epics::pvData::boolean> connected(pva->numPVs);
334 for (j = 0; j < pva->numPVs; j++) {
335 if (pva->pvaProvider[j].compare(
"pva") == 0) {
336 pos = pva->pvaChannelNames[j].find(
'.');
337 if (pos == std::string::npos) {
338 namesTmp[j] = pva->pvaChannelNames[j];
341 namesTmp[j] = pva->pvaChannelNames[j].substr(0, pos);
342 subnames[j] = pva->pvaChannelNames[j].substr(pos + 1);
345 namesTmp[j] = pva->pvaChannelNames[j];
348 mIter = m.find(namesTmp[j]);
349 if (mIter == m.end()) {
350 m.insert(Mymap::value_type(namesTmp[j], j));
351 pva->pvaData[j].L1Ptr = j;
352 pva->pvaData[j].L2Ptr = i;
355 pva->pvaData[j].L1Ptr = mIter->second;
356 pva->pvaData[j].L2Ptr = pva->pvaData[pva->pvaData[j].L1Ptr].L2Ptr;
360 if (pva->numMultiChannels == 1) {
361 pva->numInternalPVs = numInternalPVs = i;
362 epics::pvData::shared_vector<std::string> names(pva->numInternalPVs);
363 epics::pvData::shared_vector<std::string> provider(pva->numInternalPVs);
364 epics::pvData::shared_vector<const std::string> constProvider;
366 for (j = 0; j < pva->numPVs; j++) {
367 names[pva->pvaData[j].L2Ptr] = namesTmp[j];
368 provider[pva->pvaData[j].L2Ptr] = pva->pvaProvider[j];
370 pva->pvaChannelNamesTop = freeze(names);
371 pva->pvaChannelNamesSub = freeze(subnames);
372 constProvider = freeze(provider);
374 pva->pvaClientPtr = epics::pvaClient::PvaClient::get(
"pva ca");
376 pva->pvaClientMultiChannelPtr[0] = epics::pvaClient::PvaClientMultiChannel::create(pva->pvaClientPtr, pva->pvaChannelNamesTop,
"pva", numInternalPVs, constProvider);
377 status = pva->pvaClientMultiChannelPtr[0]->connect(pendIOTime);
379 pva->isInternalConnected = pva->pvaClientMultiChannelPtr[0]->getIsConnected();
381 pvaClientChannelArray = pva->pvaClientMultiChannelPtr[0]->getPvaClientChannelArray();
384 pva->prevNumInternalPVs = pva->numInternalPVs;
385 pva->numInternalPVs = i;
386 numInternalPVs = pva->numInternalPVs - pva->prevNumInternalPVs;
387 epics::pvData::shared_vector<std::string> names(pva->numInternalPVs);
388 epics::pvData::shared_vector<std::string> newnames(numInternalPVs);
389 epics::pvData::shared_vector<std::string> provider(numInternalPVs);
390 epics::pvData::shared_vector<const std::string> constNames;
392 epics::pvData::shared_vector<const std::string> constProvider;
394 for (j = 0; j < pva->numPVs; j++) {
395 names[pva->pvaData[j].L2Ptr] = namesTmp[j];
396 if (pva->pvaData[j].L2Ptr >= pva->prevNumInternalPVs) {
397 newnames[pva->pvaData[j].L2Ptr - pva->prevNumInternalPVs] = namesTmp[j];
398 provider[pva->pvaData[j].L2Ptr - pva->prevNumInternalPVs] = pva->pvaProvider[j];
401 pva->pvaChannelNamesTop = freeze(names);
402 pva->pvaChannelNamesSub = freeze(subnames);
403 constNames = freeze(newnames);
404 constProvider = freeze(provider);
406 pva->pvaClientMultiChannelPtr[pva->numMultiChannels - 1] = epics::pvaClient::PvaClientMultiChannel::create(pva->pvaClientPtr, constNames,
"pva", numInternalPVs, constProvider);
407 status = pva->pvaClientMultiChannelPtr[pva->numMultiChannels - 1]->connect(pendIOTime);
409 pva->isInternalConnected = pva->pvaClientMultiChannelPtr[0]->getIsConnected();
410 for (j = 1; j < pva->numMultiChannels; j++) {
411 epics::pvData::shared_vector<epics::pvData::boolean> isConnected;
412 isConnected = pva->pvaClientMultiChannelPtr[j]->getIsConnected();
413 std::copy(isConnected.begin(), isConnected.end(), std::back_inserter(pva->isInternalConnected));
415 pvaClientChannelArray = pva->pvaClientMultiChannelPtr[pva->numMultiChannels - 1]->getPvaClientChannelArray();
418 for (j = 0; j < pva->numPVs; j++) {
419 connected[j] = pva->isInternalConnected[pva->pvaData[j].L2Ptr];
420 if (connected[j] ==
false) {
424 pva->isConnected = connected;
425 pva->numNotConnected = num;
426 for (j = 0; j < numInternalPVs; j++) {
427 if (pva->useStateChangeCallbacks) {
428 pvaClientChannelArray[j]->setStateChangeRequester((epics::pvaClient::PvaClientChannelStateChangeRequesterPtr)pva->stateChangeReqPtr);
441 result = GetPVAValues(pvaArray, 1);
446long GetPVAValuesOld(
PVA_OVERALL **pva,
long count) {
448 epics::pvData::Status status;
449 epics::pvaClient::PvaClientChannelArray pvaClientChannelArray;
451 for (n = 0; n < count; n++) {
452 if (pva[n] != NULL) {
453 pva[n]->isInternalConnected = pva[n]->pvaClientMultiChannelPtr[0]->getIsConnected();
454 pvaClientChannelArray = pva[n]->pvaClientMultiChannelPtr[0]->getPvaClientChannelArray();
455 for (i = 1; i < pva[n]->numMultiChannels; i++) {
456 epics::pvData::shared_vector<epics::pvData::boolean> isConnected;
457 epics::pvaClient::PvaClientChannelArray pvaClientChannelArrayAdd;
458 isConnected = pva[n]->pvaClientMultiChannelPtr[i]->getIsConnected();
459 std::copy(isConnected.begin(), isConnected.end(), std::back_inserter(pva[n]->isInternalConnected));
460 pvaClientChannelArrayAdd = pva[n]->pvaClientMultiChannelPtr[i]->getPvaClientChannelArray();
461 std::copy(pvaClientChannelArrayAdd.begin(), pvaClientChannelArrayAdd.end(), std::back_inserter(pvaClientChannelArray));
463 for (i = 0; i < pva[n]->numPVs; i++) {
464 if (pva[n]->pvaData[i].skip ==
true) {
467 pva[n]->isConnected[i] = pva[n]->isInternalConnected[pva[n]->pvaData[i].L2Ptr];
468 if (pva[n]->isConnected[i]) {
469 if (pva[n]->pvaData[i].haveGetPtr ==
false) {
470 pva[n]->pvaClientGetPtr[i] = pvaClientChannelArray[pva[n]->pvaData[i].L2Ptr]->createGet(pva[n]->pvaChannelNamesSub[i]);
471 pva[n]->pvaData[i].haveGetPtr =
true;
472 if (pva[n]->useGetCallbacks) {
473 pva[n]->pvaClientGetPtr[i]->setRequester((epics::pvaClient::PvaClientGetRequesterPtr)pva[n]->getReqPtr);
477 pva[n]->pvaClientGetPtr[i]->issueGet();
478 }
catch (std::exception &e) {
480 pva[n]->isConnected[i] =
false;
488 pva[n]->numNotConnected = num;
492 for (n = 0; n < count; n++) {
493 if ((pva[n] != NULL) && (pva[n]->useGetCallbacks ==
false)) {
494 for (i = 0; i < pva[n]->numPVs; i++) {
495 if (pva[n]->pvaData[i].skip ==
true) {
498 if (pva[n]->isConnected[i]) {
499 status = pva[n]->pvaClientGetPtr[i]->waitGet();
500 if (!status.isSuccess()) {
501 fprintf(stderr,
"error: %s did not respond to the \"get\" request\n", pva[n]->pvaChannelNames[i].c_str());
502 pva[n]->isConnected[i] =
false;
503 pva[n]->numNotConnected++;
510 for (n = 0; n < count; n++) {
511 if ((pva[n] != NULL) && (pva[n]->useGetCallbacks ==
false)) {
512 if (ExtractPVAValues(pva[n]) == 1) {
520std::string convertToProperRequestFormat(
const std::vector<std::string>& input) {
521 std::map<std::string, std::set<std::string>> prefixMap;
524 for (
const auto& str : input) {
525 size_t pos = str.find(
'.');
526 if (pos != std::string::npos) {
527 std::string prefix = str.substr(0, pos);
528 std::string suffix = str.substr(pos + 1);
529 prefixMap[prefix].insert(suffix);
536 std::ostringstream result;
539 for (
const auto& pair : prefixMap) {
544 result << pair.first;
545 if (!pair.second.empty()) {
547 bool firstSuffix =
true;
548 for (
const auto& suffix : pair.second) {
563 long i, ii, num = 0, n;
564 epics::pvData::Status status;
565 epics::pvaClient::PvaClientChannelArray pvaClientChannelArray;
566 std::ostringstream pvaFields;
568 for (n = 0; n < count; n++) {
569 if (pva[n] != NULL) {
570 std::vector<bool> isInternalGetIssued(pva[n]->numInternalPVs,
false);
571 std::vector<long> InternalGetIndex(pva[n]->numInternalPVs, 0);
572 pva[n]->isInternalConnected = pva[n]->pvaClientMultiChannelPtr[0]->getIsConnected();
573 pvaClientChannelArray = pva[n]->pvaClientMultiChannelPtr[0]->getPvaClientChannelArray();
574 for (i = 1; i < pva[n]->numMultiChannels; i++) {
575 epics::pvData::shared_vector<epics::pvData::boolean> isConnected;
576 epics::pvaClient::PvaClientChannelArray pvaClientChannelArrayAdd;
577 isConnected = pva[n]->pvaClientMultiChannelPtr[i]->getIsConnected();
578 std::copy(isConnected.begin(), isConnected.end(), std::back_inserter(pva[n]->isInternalConnected));
579 pvaClientChannelArrayAdd = pva[n]->pvaClientMultiChannelPtr[i]->getPvaClientChannelArray();
580 std::copy(pvaClientChannelArrayAdd.begin(), pvaClientChannelArrayAdd.end(), std::back_inserter(pvaClientChannelArray));
582 for (i = 0; i < pva[n]->numPVs; i++) {
583 if (pva[n]->pvaData[i].skip ==
true) {
586 pva[n]->isConnected[i] = pva[n]->isInternalConnected[pva[n]->pvaData[i].L2Ptr];
587 if (pva[n]->isConnected[i]) {
588 if (pva[n]->pvaProvider[i].compare(
"pva") != 0) {
590 if (pva[n]->pvaData[i].haveGetPtr ==
false) {
591 pva[n]->pvaClientGetPtr[i] = pvaClientChannelArray[pva[n]->pvaData[i].L2Ptr]->createGet(pva[n]->pvaChannelNamesSub[i]);
592 pva[n]->pvaData[i].haveGetPtr =
true;
593 if (pva[n]->useGetCallbacks) {
594 pva[n]->pvaClientGetPtr[i]->setRequester((epics::pvaClient::PvaClientGetRequesterPtr)pva[n]->getReqPtr);
599 if (pva[n]->pvaData[i].haveGetPtr ==
false) {
600 if (isInternalGetIssued[pva[n]->pvaData[i].L2Ptr] ==
false) {
601 std::vector<std::string> stringArray;
602 stringArray.push_back(pva[n]->pvaChannelNamesSub[i]);
603 for (ii = i+1; ii < pva[n]->numPVs; ii++) {
604 if (pva[n]->pvaData[ii].skip ==
true) {
607 if (pva[n]->pvaData[i].L2Ptr ==pva[n]->pvaData[ii].L2Ptr) {
608 stringArray.push_back(pva[n]->pvaChannelNamesSub[ii]);
611 std::string fieldNames = convertToProperRequestFormat(stringArray);
612 pva[n]->pvaClientGetPtr[i] = pvaClientChannelArray[pva[n]->pvaData[i].L2Ptr]->createGet(fieldNames);
613 isInternalGetIssued[pva[n]->pvaData[i].L2Ptr] =
true;
614 InternalGetIndex[pva[n]->pvaData[i].L2Ptr] = i;
615 pva[n]->pvaData[i].haveGetPtr =
true;
616 if (pva[n]->useGetCallbacks) {
618 pva[n]->pvaClientGetPtr[i]->setRequester((epics::pvaClient::PvaClientGetRequesterPtr)pva[n]->getReqPtr);
622 pva[n]->pvaClientGetPtr[i] = pva[n]->pvaClientGetPtr[InternalGetIndex[pva[n]->pvaData[i].L2Ptr]];
627 isInternalGetIssued[pva[n]->pvaData[i].L2Ptr] =
true;
628 InternalGetIndex[pva[n]->pvaData[i].L2Ptr] = i;
632 if (pva[n]->pvaData[i].haveGetPtr) {
634 pva[n]->pvaClientGetPtr[i]->issueGet();
635 }
catch (std::exception &e) {
637 pva[n]->isConnected[i] =
false;
645 pva[n]->numNotConnected = num;
648 for (n = 0; n < count; n++) {
649 if ((pva[n] != NULL) && (pva[n]->useGetCallbacks ==
false)) {
650 for (i = 0; i < pva[n]->numPVs; i++) {
651 if (pva[n]->pvaData[i].skip ==
true) {
654 if (pva[n]->isConnected[i] && pva[n]->pvaData[i].haveGetPtr) {
655 status = pva[n]->pvaClientGetPtr[i]->waitGet();
656 if (!status.isSuccess()) {
657 fprintf(stderr,
"error: %s did not respond to the \"get\" request\n", pva[n]->pvaChannelNames[i].c_str());
658 pva[n]->isConnected[i] =
false;
659 pva[n]->numNotConnected++;
666 for (n = 0; n < count; n++) {
667 if ((pva[n] != NULL) && (pva[n]->useGetCallbacks ==
false)) {
668 if (ExtractPVAValues(pva[n]) == 1) {
676long ExtractScalarValue(
PVA_OVERALL *pva,
long index, epics::pvData::PVFieldPtr PVFieldPtr,
bool monitorMode) {
677 epics::pvData::ScalarConstPtr scalarConstPtr;
678 epics::pvData::PVScalarPtr pvScalarPtr;
680 scalarConstPtr = std::tr1::static_pointer_cast<const epics::pvData::Scalar>(PVFieldPtr->getField());
681 pvScalarPtr = std::tr1::static_pointer_cast<epics::pvData::PVScalar>(PVFieldPtr);
685 if (pva->pvaData[index].numMonitorReadings == 0) {
686 pva->pvaData[index].fieldType = scalarConstPtr->getType();
687 pva->pvaData[index].scalarType = scalarConstPtr->getScalarType();
688 pva->pvaData[index].numMonitorElements = 1;
690 if (pva->pvaData[index].nonnumeric) {
691 if (pva->pvaData[index].monitorData[0].stringValues[0])
692 free(pva->pvaData[index].monitorData[0].stringValues[0]);
696 i = pva->pvaData[index].numGetReadings;
697 if (pva->pvaData[index].numGetReadings == 0) {
698 pva->pvaData[index].fieldType = scalarConstPtr->getType();
699 pva->pvaData[index].scalarType = scalarConstPtr->getScalarType();
700 pva->pvaData[index].numGetElements = 1;
701 }
else if (pva->limitGetReadings) {
705 switch (pva->pvaData[index].scalarType) {
706 case epics::pvData::pvDouble:
707 case epics::pvData::pvFloat:
708 case epics::pvData::pvLong:
709 case epics::pvData::pvULong:
710 case epics::pvData::pvInt:
711 case epics::pvData::pvUInt:
712 case epics::pvData::pvShort:
713 case epics::pvData::pvUShort:
714 case epics::pvData::pvByte:
715 case epics::pvData::pvUByte: {
717 if (pva->pvaData[index].monitorData[0].values == NULL) {
718 pva->pvaData[index].monitorData[0].values = (
double *)malloc(
sizeof(
double));
719 pva->pvaData[index].numeric =
true;
721 pva->pvaData[index].monitorData[0].values[0] = pvScalarPtr->getAs<
double>();
723 if (pva->pvaData[index].getData[i].values == NULL) {
724 pva->pvaData[index].getData[i].values = (
double *)malloc(
sizeof(
double));
725 pva->pvaData[index].numeric =
true;
727 pva->pvaData[index].getData[i].values[0] = pvScalarPtr->getAs<
double>();
731 case epics::pvData::pvString:
732 case epics::pvData::pvBoolean: {
733 std::string s = pvScalarPtr->getAs<std::string>();
735 if (pva->pvaData[index].monitorData[0].stringValues == NULL) {
736 pva->pvaData[index].monitorData[0].stringValues = (
char **)malloc(
sizeof(
char *) * 1);
738 pva->pvaData[index].monitorData[0].stringValues[0] = (
char *)malloc(
sizeof(
char) * (s.length() + 1));
739 strcpy(pva->pvaData[index].monitorData[0].stringValues[0], s.c_str());
740 if (pva->pvaData[index].numMonitorReadings == 0) {
741 pva->pvaData[index].nonnumeric =
true;
744 if (pva->pvaData[index].getData[i].stringValues == NULL) {
745 pva->pvaData[index].getData[i].stringValues = (
char **)malloc(
sizeof(
char *) * 1);
747 pva->pvaData[index].getData[i].stringValues[0] = (
char *)malloc(
sizeof(
char) * (s.length() + 1));
748 strcpy(pva->pvaData[index].getData[i].stringValues[0], s.c_str());
749 if (pva->pvaData[index].numGetReadings == 0) {
750 pva->pvaData[index].nonnumeric =
true;
756 std::cerr <<
"ERROR: Need code to handle scalar type " << pva->pvaData[index].scalarType << std::endl;
761 pva->pvaData[index].numMonitorReadings = 1;
763 if (pva->limitGetReadings) {
764 pva->pvaData[index].numGetReadings = 1;
766 pva->pvaData[index].numGetReadings++;
772long ExtractNTScalarValue(
PVA_OVERALL *pva,
long index, epics::pvData::PVStructurePtr pvStructurePtr,
bool monitorMode) {
774 epics::pvData::PVFieldPtrArray PVFieldPtrArray;
775 std::string fieldName;
776 PVFieldPtrArray = pvStructurePtr->getPVFields();
777 fieldCount = pvStructurePtr->getStructure()->getNumberFields();
778 for (j = 0; j < fieldCount; j++) {
779 fieldName = PVFieldPtrArray[j]->getFieldName();
780 if (fieldName ==
"value") {
781 if (ExtractScalarValue(pva, index, PVFieldPtrArray[j], monitorMode)) {
787 std::cerr <<
"ERROR: Value field is missing." << std::endl;
791long ExtractScalarArrayValue(
PVA_OVERALL *pva,
long index, epics::pvData::PVFieldPtr PVFieldPtr,
bool monitorMode) {
792 epics::pvData::ScalarArrayConstPtr scalarArrayConstPtr;
793 epics::pvData::PVScalarArrayPtr pvScalarArrayPtr;
795 scalarArrayConstPtr = std::tr1::static_pointer_cast<const epics::pvData::ScalarArray>(PVFieldPtr->getField());
796 pvScalarArrayPtr = std::tr1::static_pointer_cast<epics::pvData::PVScalarArray>(PVFieldPtr);
800 if (pva->pvaData[index].numMonitorReadings == 0) {
801 pva->pvaData[index].fieldType = scalarArrayConstPtr->getType();
802 pva->pvaData[index].scalarType = scalarArrayConstPtr->getElementType();
803 pva->pvaData[index].numMonitorElements = pvScalarArrayPtr->getLength();
805 if (pva->pvaData[index].nonnumeric) {
806 for (
long k = 0; k < pva->pvaData[index].numMonitorElements; k++) {
807 if (pva->pvaData[index].monitorData[0].stringValues[k])
808 free(pva->pvaData[index].monitorData[0].stringValues[k]);
813 i = pva->pvaData[index].numGetReadings;
814 if (pva->pvaData[index].numGetReadings == 0) {
815 pva->pvaData[index].fieldType = scalarArrayConstPtr->getType();
816 pva->pvaData[index].scalarType = scalarArrayConstPtr->getElementType();
817 pva->pvaData[index].numGetElements = pvScalarArrayPtr->getLength();
818 }
else if (pva->limitGetReadings) {
822 switch (pva->pvaData[index].scalarType) {
823 case epics::pvData::pvDouble:
824 case epics::pvData::pvFloat:
825 case epics::pvData::pvLong:
826 case epics::pvData::pvULong:
827 case epics::pvData::pvInt:
828 case epics::pvData::pvUInt:
829 case epics::pvData::pvShort:
830 case epics::pvData::pvUShort: {
831 epics::pvData::PVDoubleArray::const_svector dataVector;
832 pvScalarArrayPtr->PVScalarArray::getAs<
double>(dataVector);
834 if (pva->pvaData[index].monitorData[0].values == NULL) {
835 pva->pvaData[index].monitorData[0].values = (
double *)malloc(
sizeof(
double) * pva->pvaData[index].numMonitorElements);
836 pva->pvaData[index].numeric =
true;
838 std::copy(dataVector.begin(), dataVector.begin() + pva->pvaData[index].numMonitorElements, pva->pvaData[index].monitorData[0].values);
840 if (pva->pvaData[index].getData[i].values == NULL) {
841 pva->pvaData[index].getData[i].values = (
double *)malloc(
sizeof(
double) * pva->pvaData[index].numGetElements);
842 pva->pvaData[index].numeric =
true;
844 std::copy(dataVector.begin(), dataVector.begin() + pva->pvaData[index].numGetElements, pva->pvaData[index].getData[i].values);
848 case epics::pvData::pvByte:
849 case epics::pvData::pvUByte: {
851 epics::pvData::PVDoubleArray::const_svector dataVector;
853 pvScalarArrayPtr->PVScalarArray::getAs<
double>(dataVector);
854 nLength = dataVector.size();
859 if (pva->pvaData[index].monitorData[0].values == NULL) {
860 pva->pvaData[index].monitorData[0].values = (
double *)malloc(
sizeof(
double) * nLength);
861 pva->pvaData[index].numeric =
true;
863 std::copy(dataVector.begin(), dataVector.end(), pva->pvaData[index].monitorData[0].values);
864 for (
long k = dataVector.size(); k < 256; k++) {
865 pva->pvaData[index].monitorData[0].values[k] = 0;
868 if (pva->pvaData[index].getData[i].values == NULL) {
869 pva->pvaData[index].getData[i].values = (
double *)malloc(
sizeof(
double) * nLength);
870 pva->pvaData[index].numeric =
true;
872 std::copy(dataVector.begin(), dataVector.end(), pva->pvaData[index].getData[i].values);
873 for (
long k = dataVector.size(); k < 256; k++) {
874 pva->pvaData[index].getData[i].values[k] = 0;
877 if (pvScalarArrayPtr->isCapacityMutable() && (pvScalarArrayPtr->getCapacity() <= 256)) {
878 pvScalarArrayPtr->setCapacity(256);
879 pvScalarArrayPtr->setLength(256);
881 pva->pvaData[index].numMonitorElements = 256;
883 pva->pvaData[index].numGetElements = 256;
888 case epics::pvData::pvString:
889 case epics::pvData::pvBoolean: {
890 epics::pvData::PVStringArray::const_svector dataVector;
891 pvScalarArrayPtr->PVScalarArray::getAs<std::string>(dataVector);
893 if (pva->pvaData[index].monitorData[0].stringValues == NULL) {
894 pva->pvaData[index].monitorData[0].stringValues = (
char **)malloc(
sizeof(
char *) * pva->pvaData[index].numMonitorElements);
895 pva->pvaData[index].nonnumeric =
true;
897 for (
long k = 0; k < pva->pvaData[index].numMonitorElements; k++) {
898 pva->pvaData[index].monitorData[0].stringValues[k] = (
char *)malloc(
sizeof(
char) * (dataVector[k].length() + 1));
899 strcpy(pva->pvaData[index].monitorData[0].stringValues[k], dataVector[k].c_str());
902 if (pva->pvaData[index].getData[i].stringValues == NULL) {
903 pva->pvaData[index].getData[i].stringValues = (
char **)malloc(
sizeof(
char *) * pva->pvaData[index].numGetElements);
904 pva->pvaData[index].nonnumeric =
true;
906 for (
long k = 0; k < pva->pvaData[index].numGetElements; k++) {
907 pva->pvaData[index].getData[i].stringValues[k] = (
char *)malloc(
sizeof(
char) * (dataVector[k].length() + 1));
908 strcpy(pva->pvaData[index].getData[i].stringValues[k], dataVector[k].c_str());
914 std::cerr <<
"ERROR: Need code to handle scalar array type " << pva->pvaData[index].scalarType << std::endl;
919 pva->pvaData[index].numMonitorReadings = 1;
921 if (pva->limitGetReadings) {
922 pva->pvaData[index].numGetReadings = 1;
924 pva->pvaData[index].numGetReadings++;
930long ExtractNTScalarArrayValue(
PVA_OVERALL *pva,
long index, epics::pvData::PVStructurePtr pvStructurePtr,
bool monitorMode) {
932 epics::pvData::PVFieldPtrArray PVFieldPtrArray;
933 std::string fieldName;
934 PVFieldPtrArray = pvStructurePtr->getPVFields();
935 fieldCount = pvStructurePtr->getStructure()->getNumberFields();
936 for (j = 0; j < fieldCount; j++) {
937 fieldName = PVFieldPtrArray[j]->getFieldName();
938 if (fieldName ==
"value") {
939 if (ExtractScalarArrayValue(pva, index, PVFieldPtrArray[j], monitorMode)) {
945 std::cerr <<
"ERROR: Value field is missing." << std::endl;
949long ExtractNTEnumValue(
PVA_OVERALL *pva,
long index, epics::pvData::PVStructurePtr pvStructurePtr,
bool monitorMode) {
950 long i, j, fieldCount;
951 epics::pvData::PVFieldPtrArray PVFieldPtrArray;
952 std::string fieldName;
953 PVFieldPtrArray = pvStructurePtr->getPVFields();
954 fieldCount = pvStructurePtr->getStructure()->getNumberFields();
955 for (j = 0; j < fieldCount; j++) {
956 fieldName = PVFieldPtrArray[j]->getFieldName();
957 if (fieldName ==
"value") {
958 epics::pvData::PVStructurePtr pvStructurePtr;
959 epics::pvData::PVEnumerated pvEnumerated;
961 pvStructurePtr = std::tr1::static_pointer_cast<epics::pvData::PVStructure>(PVFieldPtrArray[j]);
962 pvEnumerated.attach(pvStructurePtr);
964 if (pva->pvaData[index].numMonitorReadings == 0) {
965 pva->pvaData[index].fieldType = pvStructurePtr->getField()->getType();
966 pva->pvaData[index].pvEnumeratedStructure =
true;
967 pva->pvaData[index].numMonitorElements = 1;
968 pva->pvaData[index].numeric =
true;
969 pva->pvaData[index].nonnumeric =
true;
970 pva->pvaData[index].scalarType = epics::pvData::pvString;
971 pva->pvaData[index].monitorData[0].values = (
double *)malloc(
sizeof(
double));
972 pva->pvaData[index].monitorData[0].stringValues = (
char **)malloc(
sizeof(
char *) * 1);
974 if (pva->pvaData[index].monitorData[0].stringValues[0])
975 free(pva->pvaData[index].monitorData[0].stringValues[0]);
977 pva->pvaData[index].monitorData[0].values[0] = pvEnumerated.getIndex();
978 s = pvEnumerated.getChoice();
979 pva->pvaData[index].monitorData[0].stringValues[0] = (
char *)malloc(
sizeof(
char) * (s.length() + 1));
980 strcpy(pva->pvaData[index].monitorData[0].stringValues[0], s.c_str());
981 pva->pvaData[index].numMonitorReadings = 1;
983 i = pva->pvaData[index].numGetReadings;
984 if (pva->pvaData[index].numGetReadings == 0) {
985 pva->pvaData[index].fieldType = pvStructurePtr->getField()->getType();
986 pva->pvaData[index].pvEnumeratedStructure =
true;
987 pva->pvaData[index].numGetElements = 1;
988 pva->pvaData[index].numeric =
true;
989 pva->pvaData[index].nonnumeric =
true;
990 pva->pvaData[index].scalarType = epics::pvData::pvString;
991 }
else if (pva->limitGetReadings) {
994 if (pva->pvaData[index].getData[i].values == NULL) {
995 pva->pvaData[index].getData[i].values = (
double *)malloc(
sizeof(
double));
997 if (pva->pvaData[index].getData[i].stringValues == NULL) {
998 pva->pvaData[index].getData[i].stringValues = (
char **)malloc(
sizeof(
char *) * 1);
1000 pva->pvaData[index].getData[i].values[0] = pvEnumerated.getIndex();
1001 s = pvEnumerated.getChoice();
1002 pva->pvaData[index].getData[i].stringValues[0] = (
char *)malloc(
sizeof(
char) * (s.length() + 1));
1003 strcpy(pva->pvaData[index].getData[i].stringValues[0], s.c_str());
1004 if (pva->limitGetReadings) {
1005 pva->pvaData[index].numGetReadings = 1;
1007 pva->pvaData[index].numGetReadings++;
1010 pvEnumerated.detach();
1014 std::cerr <<
"ERROR: Value field is missing." << std::endl;
1018long ExtractStructureValue(
PVA_OVERALL *pva,
long index, epics::pvData::PVFieldPtr PVFieldPtr,
bool monitorMode) {
1020 epics::pvData::PVFieldPtrArray PVFieldPtrArray;
1021 std::string fieldName;
1022 epics::pvData::PVStructurePtr pvStructurePtr;
1023 epics::pvData::PVFieldPtr pvFieldPtr;
1024 std::string afterDot;
1025 pvStructurePtr = std::tr1::static_pointer_cast<epics::pvData::PVStructure>(PVFieldPtr);
1027 fieldCount = pvStructurePtr->getStructure()->getNumberFields();
1028 PVFieldPtrArray = pvStructurePtr->getPVFields();
1029 if (fieldCount > 1) {
1030 size_t pos = pva->pvaChannelNames[index].find(
'.');
1031 if (pos != std::string::npos) {
1032 afterDot = pva->pvaChannelNames[index].substr(pos + 1);
1033 pos = afterDot.find(
'.');
1034 if (pos != std::string::npos) {
1035 afterDot = afterDot.substr(pos + 1);
1037 pva->pvaClientGetPtr[index]->getData()->getPVStructure()->dumpValue(std::cerr);
1038 fprintf(stderr,
"Error: sub-field is not specific enough\n");
1042 pva->pvaClientGetPtr[index]->getData()->getPVStructure()->dumpValue(std::cerr);
1043 fprintf(stderr,
"Error: sub-field is not specific enough\n");
1046 pvFieldPtr = pvStructurePtr->getSubField(afterDot);
1047 if (pvFieldPtr == NULL) {
1048 fprintf(stderr,
"Error: sub-field does not exist for %s\n", pva->pvaChannelNames[index].c_str());
1051 switch (pvStructurePtr->getSubField(afterDot)->getField()->getType()) {
1052 case epics::pvData::scalar: {
1053 if (ExtractScalarValue(pva, index, pvStructurePtr->getSubField(afterDot), monitorMode)) {
1058 case epics::pvData::scalarArray: {
1059 if (ExtractScalarArrayValue(pva, index, pvStructurePtr->getSubField(afterDot), monitorMode)) {
1064 case epics::pvData::structure: {
1065 if (ExtractStructureValue(pva, index, pvStructurePtr->getSubField(afterDot), monitorMode)) {
1071 std::cerr <<
"ERROR: Need code to handle " << pvStructurePtr->getSubField(afterDot)->getField()->getType() << std::endl;
1077 fieldName = PVFieldPtrArray[0]->getFieldName();
1078 switch (PVFieldPtrArray[0]->getField()->getType()) {
1079 case epics::pvData::scalar: {
1080 if (ExtractScalarValue(pva, index, PVFieldPtrArray[0], monitorMode)) {
1086 case epics::pvData::scalarArray: {
1087 if (ExtractScalarArrayValue(pva, index, PVFieldPtrArray[0], monitorMode)) {
1093 case epics::pvData::structure: {
1094 if (ExtractStructureValue(pva, index, PVFieldPtrArray[0], monitorMode)) {
1101 std::cerr <<
"ERROR: Need code to handle " << PVFieldPtrArray[0]->getField()->getType() << std::endl;
1105 std::cerr <<
"ERROR: Value field is missing." << std::endl;
1112 bool monitorMode =
false;
1113 epics::pvData::PVStructurePtr pvStructurePtr;
1114 for (i = 0; i < pva->numPVs; i++) {
1115 if (pva->pvaData[i].skip ==
true) {
1118 if (pva->isConnected[i]) {
1119 pvStructurePtr = pva->pvaClientGetPtr[i]->getData()->getPVStructure();
1120 id = pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getStructure()->getID();
1121 if (
id ==
"epics:nt/NTScalar:1.0") {
1122 if (ExtractNTScalarValue(pva, i, pvStructurePtr, monitorMode)) {
1125 }
else if (
id ==
"epics:nt/NTScalarArray:1.0") {
1126 if (ExtractNTScalarArrayValue(pva, i, pvStructurePtr, monitorMode)) {
1129 }
else if (
id ==
"epics:nt/NTEnum:1.0") {
1130 if (ExtractNTEnumValue(pva, i, pvStructurePtr, monitorMode)) {
1133 }
else if (
id ==
"structure") {
1134 epics::pvData::PVFieldPtrArray PVFieldPtrArray;
1136 PVFieldPtrArray = pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getPVFields();
1137 fieldCount = pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getStructure()->getNumberFields();
1138 if (fieldCount > 1) {
1139 if (PVFieldPtrArray[0]->getFieldName() !=
"value") {
1140 pva->pvaClientGetPtr[i]->getData()->getPVStructure()->dumpValue(std::cerr);
1141 fprintf(stderr,
"Error: sub-field is not specific enough\n");
1145 if (fieldCount == 0) {
1146 fprintf(stderr,
"Error: sub-field does not exist for %s\n", pva->pvaChannelNames[i].c_str());
1149 switch (PVFieldPtrArray[0]->getField()->getType()) {
1150 case epics::pvData::scalar: {
1151 if (ExtractScalarValue(pva, i, PVFieldPtrArray[0], monitorMode)) {
1156 case epics::pvData::scalarArray: {
1157 if (ExtractScalarArrayValue(pva, i, PVFieldPtrArray[0], monitorMode)) {
1162 case epics::pvData::structure: {
1163 if (ExtractStructureValue(pva, i, PVFieldPtrArray[0], monitorMode)) {
1169 std::cerr <<
"ERROR: Need code to handle " << PVFieldPtrArray[0]->getField()->getType() << std::endl;
1173 if (pva->includeAlarmSeverity && (fieldCount > 1)) {
1174 for (j = 0; j < fieldCount; j++) {
1175 if (PVFieldPtrArray[j]->getFieldName() ==
"alarm") {
1176 if (PVFieldPtrArray[j]->getField()->getType() == epics::pvData::structure) {
1177 epics::pvData::PVStructurePtr alarmStructurePtr;
1178 epics::pvData::PVFieldPtrArray AlarmFieldPtrArray;
1179 long alarmFieldCount;
1181 alarmStructurePtr = std::tr1::static_pointer_cast<epics::pvData::PVStructure>(PVFieldPtrArray[j]);
1182 alarmFieldCount = alarmStructurePtr->getStructure()->getNumberFields();
1183 AlarmFieldPtrArray = alarmStructurePtr->getPVFields();
1184 if (alarmFieldCount > 0) {
1185 if (AlarmFieldPtrArray[0]->getFieldName() ==
"severity") {
1186 epics::pvData::PVScalarPtr pvScalarPtr;
1187 pvScalarPtr = std::tr1::static_pointer_cast<epics::pvData::PVScalar>(AlarmFieldPtrArray[0]);
1188 pva->pvaData[i].alarmSeverity = pvScalarPtr->getAs<
int>();
1190 pva->pvaClientGetPtr[i]->getData()->getPVStructure()->dumpValue(std::cerr);
1191 fprintf(stderr,
"Error: alarm->severity field is not where it was expected to be\n");
1202 pva->pvaClientGetPtr[i]->getData()->getPVStructure()->dumpValue(std::cerr);
1204 std::cerr <<
"Error: unrecognized structure ID (" <<
id <<
")" << std::endl;
1215 bool monitorMode =
false;
1216 epics::pvData::PVStructurePtr pvStructurePtr;
1217 epics::pvData::PVFieldPtr pvFieldPtr;
1218 std::string afterDot;
1220 for (i = 0; i < pva->numPVs; i++) {
1221 if (pva->pvaData[i].skip ==
true) {
1224 if (pva->isConnected[i]) {
1225 pvStructurePtr = pva->pvaClientGetPtr[i]->getData()->getPVStructure();
1226 id = pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getStructure()->getID();
1227 if (
id ==
"epics:nt/NTScalar:1.0") {
1228 if (ExtractNTScalarValue(pva, i, pvStructurePtr, monitorMode)) {
1231 }
else if (
id ==
"epics:nt/NTScalarArray:1.0") {
1232 if (ExtractNTScalarArrayValue(pva, i, pvStructurePtr, monitorMode)) {
1235 }
else if (
id ==
"epics:nt/NTEnum:1.0") {
1236 if (ExtractNTEnumValue(pva, i, pvStructurePtr, monitorMode)) {
1239 }
else if (
id ==
"structure") {
1240 epics::pvData::PVFieldPtrArray PVFieldPtrArray;
1242 PVFieldPtrArray = pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getPVFields();
1243 fieldCount = pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getStructure()->getNumberFields();
1244 if (fieldCount == 0) {
1245 fprintf(stderr,
"Error: sub-field does not exist for %s\n", pva->pvaChannelNames[i].c_str());
1248 if (fieldCount > 1) {
1249 if (PVFieldPtrArray[0]->getFieldName() !=
"value") {
1250 size_t pos = pva->pvaChannelNames[i].find(
'.');
1251 if (pos != std::string::npos) {
1252 afterDot = pva->pvaChannelNames[i].substr(pos + 1);
1254 pva->pvaClientGetPtr[i]->getData()->getPVStructure()->dumpValue(std::cerr);
1255 fprintf(stderr,
"Error: sub-field is not specific enough\n");
1258 pvFieldPtr = pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getSubField(afterDot);
1259 if (pvFieldPtr == NULL) {
1260 fprintf(stderr,
"Error: sub-field does not exist for %s\n", pva->pvaChannelNames[i].c_str());
1263 switch (pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getSubField(afterDot)->getField()->getType()) {
1264 case epics::pvData::scalar: {
1265 if (ExtractScalarValue(pva, i, pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getSubField(afterDot), monitorMode)) {
1270 case epics::pvData::scalarArray: {
1271 if (ExtractScalarArrayValue(pva, i, pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getSubField(afterDot), monitorMode)) {
1276 case epics::pvData::structure: {
1277 if (ExtractStructureValue(pva, i, pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getSubField(afterDot), monitorMode)) {
1283 std::cerr <<
"ERROR: Need code to handle " << pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getSubField(afterDot)->getField()->getType() << std::endl;
1290 switch (PVFieldPtrArray[0]->getField()->getType()) {
1291 case epics::pvData::scalar: {
1292 if (ExtractScalarValue(pva, i, PVFieldPtrArray[0], monitorMode)) {
1297 case epics::pvData::scalarArray: {
1298 if (ExtractScalarArrayValue(pva, i, PVFieldPtrArray[0], monitorMode)) {
1303 case epics::pvData::structure: {
1304 if (ExtractStructureValue(pva, i, PVFieldPtrArray[0], monitorMode)) {
1310 std::cerr <<
"ERROR: Need code to handle " << PVFieldPtrArray[0]->getField()->getType() << std::endl;
1314 if (pva->includeAlarmSeverity && (fieldCount > 1)) {
1315 for (j = 0; j < fieldCount; j++) {
1316 if (PVFieldPtrArray[j]->getFieldName() ==
"alarm") {
1317 if (PVFieldPtrArray[j]->getField()->getType() == epics::pvData::structure) {
1318 epics::pvData::PVStructurePtr alarmStructurePtr;
1319 epics::pvData::PVFieldPtrArray AlarmFieldPtrArray;
1320 long alarmFieldCount;
1322 alarmStructurePtr = std::tr1::static_pointer_cast<epics::pvData::PVStructure>(PVFieldPtrArray[j]);
1323 alarmFieldCount = alarmStructurePtr->getStructure()->getNumberFields();
1324 AlarmFieldPtrArray = alarmStructurePtr->getPVFields();
1325 if (alarmFieldCount > 0) {
1326 if (AlarmFieldPtrArray[0]->getFieldName() ==
"severity") {
1327 epics::pvData::PVScalarPtr pvScalarPtr;
1328 pvScalarPtr = std::tr1::static_pointer_cast<epics::pvData::PVScalar>(AlarmFieldPtrArray[0]);
1329 pva->pvaData[i].alarmSeverity = pvScalarPtr->getAs<
int>();
1331 pva->pvaClientGetPtr[i]->getData()->getPVStructure()->dumpValue(std::cerr);
1332 fprintf(stderr,
"Error: alarm->severity field is not where it was expected to be\n");
1343 pva->pvaClientGetPtr[i]->getData()->getPVStructure()->dumpValue(std::cerr);
1345 std::cerr <<
"Error: unrecognized structure ID (" <<
id <<
")" << std::endl;
1353long count_chars(
char *
string,
char c) {
1362long PutScalarValue(
PVA_OVERALL *pva,
long index, epics::pvData::PVFieldPtr PVFieldPtr) {
1363 epics::pvData::PVScalarPtr pvScalarPtr;
1364 pvScalarPtr = std::tr1::static_pointer_cast<epics::pvData::PVScalar>(PVFieldPtr);
1366 if (pva->pvaData[index].numeric) {
1367 pvScalarPtr->putFrom<
double>(pva->pvaData[index].putData[0].values[0]);
1369 pvScalarPtr->putFrom<std::string>(pva->pvaData[index].putData[0].stringValues[0]);
1371 }
catch (std::exception &e) {
1372 std::cerr <<
"Error: " << e.what() <<
"\n";
1378long PutNTScalarValue(
PVA_OVERALL *pva,
long index) {
1380 epics::pvData::PVFieldPtrArray PVFieldPtrArray;
1381 std::string fieldName;
1382 PVFieldPtrArray = pva->pvaClientPutPtr[index]->getData()->getPVStructure()->getPVFields();
1383 fieldCount = pva->pvaClientPutPtr[index]->getData()->getPVStructure()->getStructure()->getNumberFields();
1384 for (j = 0; j < fieldCount; j++) {
1385 fieldName = PVFieldPtrArray[j]->getFieldName();
1386 if (fieldName ==
"value") {
1387 if (PutScalarValue(pva, index, PVFieldPtrArray[j])) {
1393 std::cerr <<
"ERROR: Value field is missing." << std::endl;
1397long PutScalarArrayValue(
PVA_OVERALL *pva,
long index, epics::pvData::PVFieldPtr PVFieldPtr) {
1399 epics::pvData::PVScalarArrayPtr pvScalarArrayPtr;
1400 pvScalarArrayPtr = std::tr1::static_pointer_cast<epics::pvData::PVScalarArray>(PVFieldPtr);
1402 if (pva->pvaData[index].numeric) {
1403 epics::pvData::shared_vector<double> values(pva->pvaData[index].numPutElements);
1404 for (n = 0; n < pva->pvaData[index].numPutElements; n++) {
1405 values[n] = pva->pvaData[index].putData[0].values[n];
1407 pvScalarArrayPtr->setLength(pva->pvaData[index].numPutElements);
1408 pvScalarArrayPtr->putFrom(freeze(values));
1410 epics::pvData::shared_vector<std::string> values(pva->pvaData[index].numPutElements);
1411 for (n = 0; n < pva->pvaData[index].numPutElements; n++) {
1412 values[n] = pva->pvaData[index].putData[0].stringValues[n];
1414 pvScalarArrayPtr->setLength(pva->pvaData[index].numPutElements);
1415 pvScalarArrayPtr->putFrom(freeze(values));
1417 }
catch (std::exception &e) {
1418 std::cerr <<
"Error: " << e.what() <<
"\n";
1424long PutNTScalarArrayValue(
PVA_OVERALL *pva,
long index) {
1426 epics::pvData::PVFieldPtrArray PVFieldPtrArray;
1427 std::string fieldName;
1428 PVFieldPtrArray = pva->pvaClientPutPtr[index]->getData()->getPVStructure()->getPVFields();
1429 fieldCount = pva->pvaClientPutPtr[index]->getData()->getPVStructure()->getStructure()->getNumberFields();
1430 for (j = 0; j < fieldCount; j++) {
1431 fieldName = PVFieldPtrArray[j]->getFieldName();
1432 if (fieldName ==
"value") {
1433 if (PutScalarArrayValue(pva, index, PVFieldPtrArray[j])) {
1439 std::cerr <<
"ERROR: Value field is missing." << std::endl;
1443long PutNTEnumValue(
PVA_OVERALL *pva,
long index) {
1445 epics::pvData::PVFieldPtrArray PVFieldPtrArray;
1446 std::string fieldName;
1447 PVFieldPtrArray = pva->pvaClientPutPtr[index]->getData()->getPVStructure()->getPVFields();
1448 fieldCount = pva->pvaClientPutPtr[index]->getData()->getPVStructure()->getStructure()->getNumberFields();
1449 for (j = 0; j < fieldCount; j++) {
1450 fieldName = PVFieldPtrArray[j]->getFieldName();
1451 if (fieldName ==
"value") {
1452 epics::pvData::PVStructurePtr pvStructurePtr;
1453 epics::pvData::PVEnumerated pvEnumerated;
1455 pvStructurePtr = std::tr1::static_pointer_cast<epics::pvData::PVStructure>(PVFieldPtrArray[j]);
1456 result = pvEnumerated.attach(pvStructurePtr);
1459 int enumindex, numChoices;
1460 epics::pvData::PVStringArray::const_svector choices;
1461 numChoices = pvEnumerated.getNumberChoices();
1463 if (pva->pvaData[index].putData[0].stringValues != NULL) {
1465 choices = pvEnumerated.getChoices();
1466 for (
size_t i = 0; i < choices.size(); i++) {
1467 if (pva->pvaData[index].putData[0].stringValues[0] == choices[i]) {
1471 if (enumindex == -1) {
1472 if (sscanf(pva->pvaData[index].putData[0].stringValues[0],
"%d", &enumindex) != 1) {
1473 fprintf(stderr,
"error: value (%s) for %s is not a valid option.\n", pva->pvaData[index].putData[0].stringValues[0], pva->pvaChannelNames[index].c_str());
1476 if ((enumindex < 0) || (enumindex >= numChoices)) {
1477 fprintf(stderr,
"error: value (%s) for %s is out of range.\n", pva->pvaData[index].putData[0].stringValues[0], pva->pvaChannelNames[index].c_str());
1482 enumindex = pva->pvaData[index].putData[0].values[0];
1483 if ((enumindex < 0) || (enumindex >= numChoices)) {
1484 fprintf(stderr,
"error: value (%s) for %s is out of range.\n", pva->pvaData[index].putData[0].stringValues[0], pva->pvaChannelNames[index].c_str());
1488 pvEnumerated.setIndex(enumindex);
1489 pvEnumerated.setIndex(enumindex);
1490 pvEnumerated.detach();
1491 }
catch (std::exception &e) {
1492 std::cerr <<
"Error: " << e.what() <<
"\n";
1497 std::cerr <<
"Error: Need code to handle a non-enumerated structure" << std::endl;
1502 std::cerr <<
"ERROR: Value field is missing." << std::endl;
1506long PutStructureValue(
PVA_OVERALL *pva,
long index, epics::pvData::PVFieldPtr PVFieldPtr) {
1508 epics::pvData::PVFieldPtrArray PVFieldPtrArray;
1509 std::string fieldName;
1510 epics::pvData::PVStructurePtr pvStructurePtr;
1511 pvStructurePtr = std::tr1::static_pointer_cast<epics::pvData::PVStructure>(PVFieldPtr);
1513 fieldCount = pvStructurePtr->getStructure()->getNumberFields();
1514 PVFieldPtrArray = pvStructurePtr->getPVFields();
1515 if (fieldCount > 1) {
1516 pvStructurePtr->dumpValue(std::cerr);
1517 fprintf(stderr,
"Error: sub-field is not specific enough\n");
1520 fieldName = PVFieldPtrArray[0]->getFieldName();
1521 switch (PVFieldPtrArray[0]->getField()->getType()) {
1522 case epics::pvData::scalar: {
1523 if (PutScalarValue(pva, index, PVFieldPtrArray[0])) {
1529 case epics::pvData::scalarArray: {
1530 if (PutScalarArrayValue(pva, index, PVFieldPtrArray[0])) {
1536 case epics::pvData::structure: {
1537 if (PutStructureValue(pva, index, PVFieldPtrArray[0])) {
1544 std::cerr <<
"ERROR: Need code to handle " << PVFieldPtrArray[0]->getField()->getType() << std::endl;
1548 std::cerr <<
"ERROR: Value field is missing." << std::endl;
1552long PrepPut(
PVA_OVERALL *pva,
long index,
double value) {
1553 pva->pvaData[index].numPutElements = 1;
1554 if (pva->pvaData[index].numeric) {
1555 if (pva->pvaData[index].putData[0].values == NULL) {
1556 pva->pvaData[index].putData[0].values = (
double *)malloc(
sizeof(
double));
1558 pva->pvaData[index].putData[0].values[0] = value;
1561 if (pva->pvaData[index].putData[0].stringValues == NULL) {
1562 pva->pvaData[index].putData[0].stringValues = (
char **)malloc(
sizeof(
char *));
1567 sprintf(buffer,
"%lf", value);
1568 pva->pvaData[index].putData[0].stringValues[0] = (
char *)malloc(
sizeof(
char) * (strlen(buffer) + 1));
1569 strcpy(pva->pvaData[index].putData[0].stringValues[0], buffer);
1574long PrepPut(
PVA_OVERALL *pva,
long index,
double *value,
long length) {
1577 if (pva->pvaData[index].numPutElements > 0) {
1578 if (pva->pvaData[index].numeric && (pva->pvaData[index].pvEnumeratedStructure ==
false)) {
1579 if (pva->pvaData[index].numPutElements != length) {
1580 if (pva->pvaData[index].putData[0].values) {
1581 free(pva->pvaData[index].putData[0].values);
1582 pva->pvaData[index].putData[0].values = NULL;
1586 if (pva->pvaData[index].putData[0].stringValues) {
1587 for (i = 0; i < pva->pvaData[index].numPutElements; i++) {
1588 if (pva->pvaData[index].putData[0].stringValues[i]) {
1589 free(pva->pvaData[index].putData[0].stringValues[i]);
1592 if (pva->pvaData[index].numPutElements != length) {
1593 free(pva->pvaData[index].putData[0].stringValues);
1594 pva->pvaData[index].putData[0].stringValues = NULL;
1600 pva->pvaData[index].numPutElements = length;
1601 if (pva->pvaData[index].numeric) {
1602 if (pva->pvaData[index].putData[0].values == NULL) {
1603 pva->pvaData[index].putData[0].values = (
double *)malloc(
sizeof(
double) * length);
1605 for (i = 0; i < length; i++) {
1606 pva->pvaData[index].putData[0].values[i] = value[i];
1610 if (pva->pvaData[index].putData[0].stringValues == NULL) {
1611 pva->pvaData[index].putData[0].stringValues = (
char **)malloc(
sizeof(
char *) * length);
1613 for (i = 0; i < length; i++) {
1614 sprintf(buffer,
"%lf", value[i]);
1615 pva->pvaData[index].putData[0].stringValues[i] = (
char *)malloc(
sizeof(
char) * (strlen(buffer) + 1));
1616 strcpy(pva->pvaData[index].putData[0].stringValues[i], buffer);
1622long PrepPut(
PVA_OVERALL *pva,
long index, int64_t value) {
1623 pva->pvaData[index].numPutElements = 1;
1624 if (pva->pvaData[index].numeric) {
1625 if (pva->pvaData[index].putData[0].values == NULL) {
1626 pva->pvaData[index].putData[0].values = (
double *)malloc(
sizeof(
double));
1628 pva->pvaData[index].putData[0].values[0] = (double)value;
1631 if (pva->pvaData[index].putData[0].stringValues == NULL) {
1632 pva->pvaData[index].putData[0].stringValues = (
char **)malloc(
sizeof(
char *));
1637 sprintf(buffer,
"%ld", value);
1638 pva->pvaData[index].putData[0].stringValues[0] = (
char *)malloc(
sizeof(
char) * (strlen(buffer) + 1));
1639 strcpy(pva->pvaData[index].putData[0].stringValues[0], buffer);
1644long PrepPut(
PVA_OVERALL *pva,
long index, int64_t *value,
long length) {
1647 if (pva->pvaData[index].numPutElements > 0) {
1648 if (pva->pvaData[index].numeric && (pva->pvaData[index].pvEnumeratedStructure ==
false)) {
1649 if (pva->pvaData[index].numPutElements != length) {
1650 if (pva->pvaData[index].putData[0].values) {
1651 free(pva->pvaData[index].putData[0].values);
1652 pva->pvaData[index].putData[0].values = NULL;
1656 if (pva->pvaData[index].putData[0].stringValues) {
1657 for (i = 0; i < pva->pvaData[index].numPutElements; i++) {
1658 if (pva->pvaData[index].putData[0].stringValues[i]) {
1659 free(pva->pvaData[index].putData[0].stringValues[i]);
1662 if (pva->pvaData[index].numPutElements != length) {
1663 free(pva->pvaData[index].putData[0].stringValues);
1664 pva->pvaData[index].putData[0].stringValues = NULL;
1670 pva->pvaData[index].numPutElements = length;
1671 if (pva->pvaData[index].numeric) {
1672 if (pva->pvaData[index].putData[0].values == NULL) {
1673 pva->pvaData[index].putData[0].values = (
double *)malloc(
sizeof(
double) * length);
1675 for (i = 0; i < length; i++) {
1676 pva->pvaData[index].putData[0].values[i] = (double)value[i];
1680 if (pva->pvaData[index].putData[0].stringValues == NULL) {
1681 pva->pvaData[index].putData[0].stringValues = (
char **)malloc(
sizeof(
char *) * length);
1683 for (i = 0; i < length; i++) {
1684 sprintf(buffer,
"%ld", value[i]);
1685 pva->pvaData[index].putData[0].stringValues[i] = (
char *)malloc(
sizeof(
char) * (strlen(buffer) + 1));
1686 strcpy(pva->pvaData[index].putData[0].stringValues[i], buffer);
1692long PrepPut(
PVA_OVERALL *pva,
long index,
char *value) {
1693 pva->pvaData[index].numPutElements = 1;
1694 if (pva->pvaData[index].numeric && (pva->pvaData[index].pvEnumeratedStructure ==
false)) {
1695 if (pva->pvaData[index].putData[0].values == NULL) {
1696 pva->pvaData[index].putData[0].values = (
double *)malloc(
sizeof(
double));
1698 if (sscanf(value,
"%le", &(pva->pvaData[index].putData[0].values[0])) != 1) {
1699 fprintf(stderr,
"error: value (%s) for %s is not numerical\n", value, pva->pvaChannelNames[index].c_str());
1703 if (pva->pvaData[index].putData[0].stringValues == NULL) {
1704 pva->pvaData[index].putData[0].stringValues = (
char **)malloc(
sizeof(
char *));
1709 pva->pvaData[index].putData[0].stringValues[0] = (
char *)malloc(
sizeof(
char) * (strlen(value) + 1));
1710 strcpy(pva->pvaData[index].putData[0].stringValues[0], value);
1715long PrepPut(
PVA_OVERALL *pva,
long index,
char **value,
long length) {
1718 if (pva->pvaData[index].numPutElements > 0) {
1719 if (pva->pvaData[index].numeric && (pva->pvaData[index].pvEnumeratedStructure ==
false)) {
1720 if (pva->pvaData[index].numPutElements != length) {
1721 if (pva->pvaData[index].putData[0].values) {
1722 free(pva->pvaData[index].putData[0].values);
1723 pva->pvaData[index].putData[0].values = NULL;
1727 if (pva->pvaData[index].putData[0].stringValues) {
1728 for (i = 0; i < pva->pvaData[index].numPutElements; i++) {
1729 if (pva->pvaData[index].putData[0].stringValues[i]) {
1730 free(pva->pvaData[index].putData[0].stringValues[i]);
1733 if (pva->pvaData[index].numPutElements != length) {
1734 free(pva->pvaData[index].putData[0].stringValues);
1735 pva->pvaData[index].putData[0].stringValues = NULL;
1741 pva->pvaData[index].numPutElements = length;
1742 if (pva->pvaData[index].numeric && (pva->pvaData[index].pvEnumeratedStructure ==
false)) {
1743 if (pva->pvaData[index].putData[0].values == NULL) {
1744 pva->pvaData[index].putData[0].values = (
double *)malloc(
sizeof(
double) * length);
1746 for (i = 0; i < length; i++) {
1747 if (sscanf(value[i],
"%le", &(pva->pvaData[index].putData[0].values[i])) != 1) {
1748 fprintf(stderr,
"error: value (%s) for %s is not numerical\n", value[i], pva->pvaChannelNames[index].c_str());
1753 if (pva->pvaData[index].putData[0].stringValues == NULL) {
1754 pva->pvaData[index].putData[0].stringValues = (
char **)malloc(
sizeof(
char *) * length);
1756 for (i = 0; i < length; i++) {
1757 pva->pvaData[index].putData[0].stringValues[i] = (
char *)malloc(
sizeof(
char) * (strlen(value[i]) + 1));
1758 strcpy(pva->pvaData[index].putData[0].stringValues[i], value[i]);
1770 epics::pvData::Status status;
1771 epics::pvaClient::PvaClientChannelArray pvaClientChannelArray;
1773 pva->isInternalConnected = pva->pvaClientMultiChannelPtr[0]->getIsConnected();
1774 pvaClientChannelArray = pva->pvaClientMultiChannelPtr[0]->getPvaClientChannelArray();
1775 for (i = 1; i < pva->numMultiChannels; i++) {
1776 epics::pvData::shared_vector<epics::pvData::boolean> isConnected;
1777 epics::pvaClient::PvaClientChannelArray pvaClientChannelArrayAdd;
1778 isConnected = pva->pvaClientMultiChannelPtr[i]->getIsConnected();
1779 std::copy(isConnected.begin(), isConnected.end(), std::back_inserter(pva->isInternalConnected));
1780 pvaClientChannelArrayAdd = pva->pvaClientMultiChannelPtr[i]->getPvaClientChannelArray();
1781 std::copy(pvaClientChannelArrayAdd.begin(), pvaClientChannelArrayAdd.end(), std::back_inserter(pvaClientChannelArray));
1783 for (i = 0; i < pva->numPVs; i++) {
1784 if (pva->pvaData[i].skip ==
true) {
1787 pva->isConnected[i] = pva->isInternalConnected[pva->pvaData[i].L2Ptr];
1788 if (pva->isConnected[i] ==
false) {
1789 if (pva->pvaData[i].numPutElements > 0) {
1790 fprintf(stderr,
"Error: Can't put value to %s. Not connected.\n", pva->pvaChannelNames[i].c_str());
1794 }
else if ((pva->pvaData[i].numPutElements > 0) && (pva->pvaData[i].havePutPtr ==
false)) {
1795 pva->pvaClientPutPtr[i] = pvaClientChannelArray[pva->pvaData[i].L2Ptr]->createPut(pva->pvaChannelNamesSub[i]);
1796 pva->pvaData[i].havePutPtr =
true;
1797 if (pva->useGetCallbacks) {
1798 pva->pvaClientPutPtr[i]->setRequester((epics::pvaClient::PvaClientPutRequesterPtr)pva->putReqPtr);
1802 pva->numNotConnected = num;
1804 for (i = 0; i < pva->numPVs; i++) {
1805 if (pva->pvaData[i].skip ==
true) {
1808 if (pva->pvaData[i].numPutElements > 0) {
1810 pva->pvaClientPutPtr[i]->getData()->getPVStructure()->dumpValue(std::cerr);
1813 id = pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getStructure()->getID();
1814 if (
id ==
"epics:nt/NTScalar:1.0") {
1815 if (PutNTScalarValue(pva, i)) {
1818 }
else if (
id ==
"epics:nt/NTScalarArray:1.0") {
1819 if (PutNTScalarArrayValue(pva, i)) {
1822 }
else if (
id ==
"epics:nt/NTEnum:1.0") {
1823 if (PutNTEnumValue(pva, i)) {
1826 }
else if (
id ==
"structure") {
1827 epics::pvData::PVFieldPtrArray PVFieldPtrArray;
1829 PVFieldPtrArray = pva->pvaClientPutPtr[i]->getData()->getPVStructure()->getPVFields();
1830 fieldCount = pva->pvaClientPutPtr[i]->getData()->getPVStructure()->getStructure()->getNumberFields();
1831 if (fieldCount > 1) {
1832 if (PVFieldPtrArray[0]->getFieldName() !=
"value") {
1833 pva->pvaClientPutPtr[i]->getData()->getPVStructure()->dumpValue(std::cerr);
1834 fprintf(stderr,
"Error: sub-field is not specific enough\n");
1838 if (fieldCount == 0) {
1839 fprintf(stderr,
"Error: sub-field does not exist for %s\n", pva->pvaChannelNames[i].c_str());
1842 switch (PVFieldPtrArray[0]->getField()->getType()) {
1843 case epics::pvData::scalar: {
1844 if (PutScalarValue(pva, i, PVFieldPtrArray[0])) {
1849 case epics::pvData::scalarArray: {
1850 if (PutScalarArrayValue(pva, i, PVFieldPtrArray[0])) {
1855 case epics::pvData::structure: {
1856 if (PutStructureValue(pva, i, PVFieldPtrArray[0])) {
1862 std::cerr <<
"ERROR: Need code to handle " << PVFieldPtrArray[0]->getField()->getType() << std::endl;
1867 std::cerr <<
"Error: unrecognized structure ID (" <<
id <<
")" << std::endl;
1873 for (i = 0; i < pva->numPVs; i++) {
1874 if (pva->pvaData[i].skip ==
true) {
1877 if (pva->pvaData[i].numPutElements > 0) {
1878 pva->pvaClientPutPtr[i]->issuePut();
1882 if (pva->useGetCallbacks ==
false) {
1883 for (i = 0; i < pva->numPVs; i++) {
1884 if (pva->pvaData[i].skip ==
true) {
1887 if (pva->pvaData[i].numPutElements > 0) {
1888 status = pva->pvaClientPutPtr[i]->waitPut();
1889 if (!status.isSuccess()) {
1890 fprintf(stderr,
"error: %s did not respond to the \"put\" request\n", pva->pvaChannelNames[i].c_str());
1896 for (i = 0; i < pva->numPVs; i++) {
1897 if (pva->pvaData[i].skip ==
true) {
1900 if (pva->pvaData[i].numPutElements > 0) {
1901 if (pva->pvaData[i].putData[0].stringValues != NULL) {
1902 for (j = 0; j < pva->pvaData[i].numPutElements; j++) {
1903 free(pva->pvaData[i].putData[0].stringValues[j]);
1906 pva->pvaData[i].numPutElements = 0;
1918 epics::pvData::Status status;
1919 epics::pvaClient::PvaClientChannelArray pvaClientChannelArray;
1925 pva->isInternalConnected = pva->pvaClientMultiChannelPtr[0]->getIsConnected();
1926 pvaClientChannelArray = pva->pvaClientMultiChannelPtr[0]->getPvaClientChannelArray();
1927 for (i = 1; i < pva->numMultiChannels; i++) {
1928 epics::pvData::shared_vector<epics::pvData::boolean> isConnected;
1929 epics::pvaClient::PvaClientChannelArray pvaClientChannelArrayAdd;
1930 isConnected = pva->pvaClientMultiChannelPtr[i]->getIsConnected();
1931 std::copy(isConnected.begin(), isConnected.end(), std::back_inserter(pva->isInternalConnected));
1932 pvaClientChannelArrayAdd = pva->pvaClientMultiChannelPtr[i]->getPvaClientChannelArray();
1933 std::copy(pvaClientChannelArrayAdd.begin(), pvaClientChannelArrayAdd.end(), std::back_inserter(pvaClientChannelArray));
1935 for (i = 0; i < pva->numPVs; i++) {
1936 if (pva->pvaData[i].skip ==
true) {
1939 pva->isConnected[i] = pva->isInternalConnected[pva->pvaData[i].L2Ptr];
1940 if (pva->isConnected[i]) {
1941 if (pva->pvaData[i].haveMonitorPtr ==
false) {
1942 pva->pvaClientMonitorPtr[i] = pvaClientChannelArray[pva->pvaData[i].L2Ptr]->createMonitor(pva->pvaChannelNamesSub[i]);
1943 pva->pvaData[i].haveMonitorPtr =
true;
1944 if (pva->useMonitorCallbacks) {
1945 pva->pvaClientMonitorPtr[i]->setRequester((epics::pvaClient::PvaClientMonitorRequesterPtr)pva->monitorReqPtr);
1947 pva->pvaClientMonitorPtr[i]->issueConnect();
1948 status = pva->pvaClientMonitorPtr[i]->waitConnect();
1949 if (!status.isSuccess()) {
1950 fprintf(stderr,
"error: %s did not respond to the \"waitConnect\" request\n", pva->pvaChannelNames[i].c_str());
1953 pva->pvaClientMonitorPtr[i]->start();
1959 pva->numNotConnected = num;
1963void PausePVAMonitoring(
PVA_OVERALL **pva,
long count) {
1965 for (i = 0; i < count; i++) {
1966 PausePVAMonitoring(pva[i]);
1975 for (i = 0; i < pva->numPVs; i++) {
1976 if (pva->pvaData[i].skip ==
true) {
1979 if (pva->isConnected[i]) {
1980 pva->pvaClientMonitorPtr[i]->stop();
1985void ResumePVAMonitoring(
PVA_OVERALL **pva,
long count) {
1987 for (i = 0; i < count; i++) {
1988 ResumePVAMonitoring(pva[i]);
1997 for (i = 0; i < pva->numPVs; i++) {
1998 if (pva->pvaData[i].skip ==
true) {
2001 if (pva->isConnected[i]) {
2002 pva->pvaClientMonitorPtr[i]->start();
2016 result = PollMonitoredPVA(pvaArray, 1);
2023long PollMonitoredPVA(
PVA_OVERALL **pva,
long count) {
2024 long result = 0, i, n;
2026 bool monitorMode =
true, connectionChange =
false;
2027 epics::pvData::PVStructurePtr pvStructurePtr;
2029 for (n = 0; n < count; n++) {
2030 if (pva[n] != NULL) {
2032 for (i = 0; i < pva[n]->numMultiChannels; i++) {
2033 if (pva[n]->pvaClientMultiChannelPtr[i]->connectionChange()) {
2034 connectionChange =
true;
2037 if (connectionChange) {
2038 if (MonitorPVAValues(pva[n]) != 0) {
2041 connectionChange =
false;
2044 for (
long i = 0; i < pva[n]->numPVs; i++) {
2045 if (pva[n]->pvaData[i].skip ==
true) {
2048 if (pva[n]->isConnected[i]) {
2049 if (pva[n]->pvaClientMonitorPtr[i]->poll()) {
2051 pvStructurePtr = pva[n]->pvaClientMonitorPtr[i]->getData()->getPVStructure();
2052 id = pvStructurePtr->getStructure()->getID();
2053 if (
id ==
"epics:nt/NTScalar:1.0") {
2054 if (ExtractNTScalarValue(pva[n], i, pvStructurePtr, monitorMode)) {
2057 }
else if (
id ==
"epics:nt/NTScalarArray:1.0") {
2058 if (ExtractNTScalarArrayValue(pva[n], i, pvStructurePtr, monitorMode)) {
2061 }
else if (
id ==
"epics:nt/NTEnum:1.0") {
2062 if (ExtractNTEnumValue(pva[n], i, pvStructurePtr, monitorMode)) {
2065 }
else if (
id ==
"structure") {
2066 epics::pvData::PVFieldPtrArray PVFieldPtrArray;
2068 PVFieldPtrArray = pvStructurePtr->getPVFields();
2069 fieldCount = pvStructurePtr->getStructure()->getNumberFields();
2070 if (fieldCount > 1) {
2071 if (PVFieldPtrArray[0]->getFieldName() !=
"value") {
2072 pvStructurePtr->dumpValue(std::cerr);
2073 fprintf(stderr,
"Error: sub-field is not specific enough\n");
2077 switch (PVFieldPtrArray[0]->getField()->getType()) {
2078 case epics::pvData::scalar: {
2079 if (ExtractScalarValue(pva[n], i, PVFieldPtrArray[0], monitorMode)) {
2084 case epics::pvData::scalarArray: {
2085 if (ExtractScalarArrayValue(pva[n], i, PVFieldPtrArray[0], monitorMode)) {
2090 case epics::pvData::structure: {
2091 if (ExtractStructureValue(pva[n], i, PVFieldPtrArray[0], monitorMode)) {
2097 std::cerr <<
"ERROR: Need code to handle " << PVFieldPtrArray[0]->getField()->getType() << std::endl;
2102 pva[n]->pvaClientMonitorPtr[i]->releaseEvent();
2115long WaitEventMonitoredPVA(
PVA_OVERALL *pva,
long index,
double secondsToWait) {
2118 bool monitorMode =
true;
2119 epics::pvData::PVStructurePtr pvStructurePtr;
2120 for (
long i = index; i <= index; i++) {
2121 if (pva->isConnected[i]) {
2122 if (pva->pvaClientMonitorPtr[i]->waitEvent(secondsToWait)) {
2123 pvStructurePtr = pva->pvaClientMonitorPtr[i]->getData()->getPVStructure();
2124 id = pvStructurePtr->getStructure()->getID();
2125 if (
id ==
"epics:nt/NTScalar:1.0") {
2126 if (ExtractNTScalarValue(pva, i, pvStructurePtr, monitorMode)) {
2129 }
else if (
id ==
"epics:nt/NTScalarArray:1.0") {
2130 if (ExtractNTScalarArrayValue(pva, i, pvStructurePtr, monitorMode)) {
2133 }
else if (
id ==
"epics:nt/NTEnum:1.0") {
2134 if (ExtractNTEnumValue(pva, i, pvStructurePtr, monitorMode)) {
2137 }
else if (
id ==
"structure") {
2138 epics::pvData::PVFieldPtrArray PVFieldPtrArray;
2140 PVFieldPtrArray = pvStructurePtr->getPVFields();
2141 fieldCount = pvStructurePtr->getStructure()->getNumberFields();
2142 if (fieldCount > 1) {
2143 if (PVFieldPtrArray[0]->getFieldName() !=
"value") {
2144 pvStructurePtr->dumpValue(std::cerr);
2145 fprintf(stderr,
"Error: sub-field is not specific enough\n");
2149 switch (PVFieldPtrArray[0]->getField()->getType()) {
2150 case epics::pvData::scalar: {
2151 if (ExtractScalarValue(pva, i, PVFieldPtrArray[0], monitorMode)) {
2156 case epics::pvData::scalarArray: {
2157 if (ExtractScalarArrayValue(pva, i, PVFieldPtrArray[0], monitorMode)) {
2162 case epics::pvData::structure: {
2163 if (ExtractStructureValue(pva, i, PVFieldPtrArray[0], monitorMode)) {
2169 std::cerr <<
"ERROR: Need code to handle " << PVFieldPtrArray[0]->getField()->getType() << std::endl;
2174 pva->pvaClientMonitorPtr[i]->releaseEvent();
2183 long i, j, n, fieldCount, fieldCount2;
2184 epics::pvData::PVStructurePtr pvStructurePtr;
2185 epics::pvData::PVFieldPtrArray PVFieldPtrArray, PVFieldPtrArray2;
2186 epics::pvData::PVScalarPtr pvScalarPtr;
2188 for (i = 0; i < pva->numPVs; i++) {
2189 if (pva->pvaData[i].skip ==
true) {
2192 pva->pvaData[i].units = NULL;
2193 if (pva->isConnected[i]) {
2194 PVFieldPtrArray = pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getPVFields();
2195 fieldCount = pva->pvaClientGetPtr[i]->getData()->getPVStructure()->getStructure()->getNumberFields();
2196 for (j = 0; j < fieldCount; j++) {
2197 if (PVFieldPtrArray[j]->getFieldName() ==
"display") {
2198 pvStructurePtr = std::tr1::static_pointer_cast<epics::pvData::PVStructure>(PVFieldPtrArray[j]);
2199 PVFieldPtrArray2 = pvStructurePtr->getPVFields();
2200 fieldCount2 = pvStructurePtr->getStructure()->getNumberFields();
2201 for (n = 0; n < fieldCount2; n++) {
2202 if (PVFieldPtrArray2[n]->getFieldName() ==
"units") {
2203 pvScalarPtr = std::tr1::static_pointer_cast<epics::pvData::PVScalar>(PVFieldPtrArray2[n]);
2204 s = pvScalarPtr->getAs<std::string>();
2205 pva->pvaData[i].units = (
char *)malloc(
sizeof(
char) * (s.length() + 1));
2206 strcpy(pva->pvaData[i].units, s.c_str());
2218std::string GetProviderName(
PVA_OVERALL *pva,
long index) {
2219 if (pva->isConnected[index] ==
false)
2221 return pva->pvaClientMultiChannelPtr[0]->getPvaClientChannelArray()[pva->pvaData[index].L2Ptr]->getChannel()->getProvider()->getProviderName();
2223std::string GetRemoteAddress(
PVA_OVERALL *pva,
long index) {
2224 if (pva->isConnected[index] ==
false)
2226 return pva->pvaClientMultiChannelPtr[0]->getPvaClientChannelArray()[pva->pvaData[index].L2Ptr]->getChannel()->getRemoteAddress();
2228bool HaveReadAccess(
PVA_OVERALL *pva,
long index) {
2229 epics::pvData::PVStructurePtr pvStructurePtr;
2233 if (pva->isConnected[index]) {
2234 pvStructurePtr = pva->pvaClientGetPtr[index]->getData()->getPVStructure();
2235 fieldCount = pvStructurePtr->getStructure()->getNumberFields();
2236 if (fieldCount > 0) {
2237 value = pva->pvaClientMultiChannelPtr[0]->getPvaClientChannelArray()[pva->pvaData[index].L2Ptr]->getChannel()->getAccessRights(pvStructurePtr->getPVFields()[0]);
2238 if ((value == 1) || (value == 2))
2260bool HaveWriteAccess(
PVA_OVERALL *pva,
long index) {
2261 epics::pvData::PVStructurePtr pvStructurePtr;
2265 if (pva->isConnected[index]) {
2266 pvStructurePtr = pva->pvaClientGetPtr[index]->getData()->getPVStructure();
2267 fieldCount = pvStructurePtr->getStructure()->getNumberFields();
2268 if (fieldCount > 0) {
2269 value = pva->pvaClientMultiChannelPtr[0]->getPvaClientChannelArray()[pva->pvaData[index].L2Ptr]->getChannel()->getAccessRights(pvStructurePtr->getPVFields()[0]);
2293std::string GetAlarmSeverity(
PVA_OVERALL *pva,
long index) {
2294 if (pva->isConnected[index] ==
false)
2296 if (pva->pvaData[index].alarmSeverity == 1) {
2298 }
else if (pva->pvaData[index].alarmSeverity > 1) {
2304std::string GetStructureID(
PVA_OVERALL *pva,
long index) {
2305 if (pva->isConnected[index] ==
false)
2307 return pva->pvaClientGetPtr[index]->getData()->getPVStructure()->getStructure()->getID();
2309std::string GetFieldType(
PVA_OVERALL *pva,
long index) {
2311 epics::pvData::PVStructurePtr pvStructurePtr;
2313 if (pva->isConnected[index] ==
false)
2315 pvStructurePtr = pva->pvaClientGetPtr[index]->getData()->getPVStructure();
2316 fieldCount = pvStructurePtr->getStructure()->getNumberFields();
2317 id = pvStructurePtr->getStructure()->getID();
2318 if (
id ==
"epics:nt/NTEnum:1.0") {
2319 return "ENUM structure";
2320 }
else if (
id ==
"structure") {
2321 if (fieldCount > 1) {
2322 if (pvStructurePtr->getPVFields()[0]->getFieldName() !=
"value") {
2323 pvStructurePtr->dumpValue(std::cerr);
2324 fprintf(stderr,
"Error: sub-field is not specific enough\n");
2327 }
else if (fieldCount == 0) {
2328 fprintf(stderr,
"Error: sub-field does not exist for %s\n", pva->pvaChannelNames[index].c_str());
2331 return epics::pvData::TypeFunc::name(pvStructurePtr->getPVFields()[0]->getField()->getType());
2333 std::cerr <<
"ERROR: Need code to handle " <<
id << std::endl;
2337bool IsEnumFieldType(
PVA_OVERALL *pva,
long index) {
2338 if (pva->isConnected[index] ==
false)
2340 if (pva->pvaClientGetPtr[index]->getData()->getPVStructure()->getStructure()->getID() ==
"epics:nt/NTEnum:1.0")
2345uint32_t GetElementCount(
PVA_OVERALL *pva,
long index) {
2347 epics::pvData::PVStructurePtr pvStructurePtr;
2349 if (pva->isConnected[index] ==
false)
2351 pvStructurePtr = pva->pvaClientGetPtr[index]->getData()->getPVStructure();
2352 fieldCount = pvStructurePtr->getStructure()->getNumberFields();
2353 id = pvStructurePtr->getStructure()->getID();
2354 if (
id ==
"epics:nt/NTEnum:1.0") {
2356 }
else if (
id ==
"structure") {
2357 if (fieldCount > 1) {
2358 if (pvStructurePtr->getPVFields()[0]->getFieldName() !=
"value") {
2359 pvStructurePtr->dumpValue(std::cerr);
2360 fprintf(stderr,
"Error: sub-field is not specific enough\n");
2363 }
else if (fieldCount == 0) {
2364 fprintf(stderr,
"Error: sub-field does not exist for %s\n", pva->pvaChannelNames[index].c_str());
2367 switch (pvStructurePtr->getPVFields()[0]->getField()->getType()) {
2368 case epics::pvData::scalar: {
2371 case epics::pvData::scalarArray: {
2372 return std::tr1::static_pointer_cast<const epics::pvData::PVScalarArray>(pvStructurePtr->getPVFields()[0])->getLength();
2375 std::cerr <<
"ERROR: Need code to handle " << pvStructurePtr->getPVFields()[0]->getField()->getType() << std::endl;
2380 std::cerr <<
"ERROR: Need code to handle " <<
id << std::endl;
2384std::string GetNativeDataType(
PVA_OVERALL *pva,
long index) {
2386 epics::pvData::PVStructurePtr pvStructurePtr;
2388 if (pva->isConnected[index] ==
false)
2390 pvStructurePtr = pva->pvaClientGetPtr[index]->getData()->getPVStructure();
2391 fieldCount = pvStructurePtr->getStructure()->getNumberFields();
2392 id = pvStructurePtr->getStructure()->getID();
2393 if (
id ==
"epics:nt/NTEnum:1.0") {
2395 }
else if (
id ==
"structure") {
2396 if (fieldCount > 1) {
2397 if (pvStructurePtr->getPVFields()[0]->getFieldName() !=
"value") {
2398 pvStructurePtr->dumpValue(std::cerr);
2399 fprintf(stderr,
"Error: sub-field is not specific enough\n");
2402 }
else if (fieldCount == 0) {
2403 fprintf(stderr,
"Error: sub-field does not exist for %s\n", pva->pvaChannelNames[index].c_str());
2406 switch (pvStructurePtr->getPVFields()[0]->getField()->getType()) {
2407 case epics::pvData::scalar: {
2408 return epics::pvData::ScalarTypeFunc::name(std::tr1::static_pointer_cast<const epics::pvData::Scalar>(pvStructurePtr->getPVFields()[0]->getField())->getScalarType());
2410 case epics::pvData::scalarArray: {
2411 return epics::pvData::ScalarTypeFunc::name(std::tr1::static_pointer_cast<const epics::pvData::ScalarArray>(pvStructurePtr->getPVFields()[0]->getField())->getElementType());
2414 std::cerr <<
"ERROR: Need code to handle " << pvStructurePtr->getPVFields()[0]->getField()->getType() << std::endl;
2419 std::cerr <<
"ERROR: Need code to handle " <<
id << std::endl;
2423std::string GetUnits(
PVA_OVERALL *pva,
long index) {
2424 if (pva->pvaData[index].units)
2425 return pva->pvaData[index].units;
2429uint32_t GetEnumChoices(
PVA_OVERALL *pva,
long index,
char ***enumChoices) {
2432 epics::pvData::PVStructurePtr pvStructurePtr;
2433 size_t fieldCount, n, m;
2434 if (pva->isConnected[index] ==
false)
2436 pvStructurePtr = pva->pvaClientGetPtr[index]->getData()->getPVStructure();
2437 fieldCount = pvStructurePtr->getStructure()->getNumberFields();
2438 id = pvStructurePtr->getStructure()->getID();
2439 if (
id ==
"epics:nt/NTEnum:1.0") {
2440 epics::pvData::PVStringArray::const_svector choices;
2441 for (n = 0; n < fieldCount; n++) {
2442 if (pvStructurePtr->getPVFields()[n]->getFieldName() ==
"value") {
2443 epics::pvData::PVEnumerated pvEnumerated;
2444 pvEnumerated.attach(std::tr1::static_pointer_cast<epics::pvData::PVStructure>(pvStructurePtr->getPVFields()[n]));
2445 choices = pvEnumerated.getChoices();
2446 count = choices.size();
2447 *enumChoices = (
char**)malloc(
sizeof(
char*) * count);
2448 for (m = 0; m < choices.size(); m++) {
2450 val =
"{" + choices[m] +
"}";
2451 (*enumChoices)[m] = (
char *)malloc(
sizeof(
char) * strlen(val.c_str()) + 1);
2452 strcpy((*enumChoices)[m], val.c_str());
Functions for managing and interacting with Process Variable Array (PVA) structures.