8 #include <epicsVersion.h> 21 #define epicsExportSharedSymbols 26 using std::ostringstream;
33 #define CA_PRIORITY 50 43 dbdToPv->activate(caChannel,pvRequest);
47 DbdToPv::DbdToPv(
IOType ioType)
54 valueRequested(
false),
55 alarmRequested(
false),
56 timeStampRequested(
false),
57 displayRequested(
false),
58 controlRequested(
false),
59 valueAlarmRequested(
false),
61 charArrayIsString(
false),
67 caTimeStamp.secPastEpoch = 0;
99 throw std::runtime_error(
"getDbr: illegal scalarType");
139 void DbdToPv::activate(
143 chid channelID = caChannel->getChannelID();
145 caValueType = (channelType==
DBR_ENUM ?
DBR_ENUM : getDbrType(dbr2ST[channelType]));
147 string mess(caChannel->getChannelName());
148 mess +=
" DbdToPv::activate pvRequest is null";
149 throw std::runtime_error(mess);
152 if(pvRequest->getPVFields().size()==0) {
153 fieldPVStructure = pvRequest;
155 fieldPVStructure = pvRequest->getSubField<
PVStructure>(
"field");
157 if(!fieldPVStructure) {
159 mess << caChannel->getChannelName()
160 <<
" DbdToPv::activate illegal pvRequest " << pvRequest;
161 throw std::runtime_error(mess.str());
163 if(fieldPVStructure->getPVFields().size()==0)
165 valueRequested =
true;
166 alarmRequested =
true;
167 timeStampRequested =
true;
168 displayRequested =
true;
169 controlRequested =
true;
170 valueAlarmRequested =
true;
172 if(fieldPVStructure->getSubField(
"value")) valueRequested =
true;
173 if(fieldPVStructure->getSubField(
"alarm")) alarmRequested =
true;
174 if(fieldPVStructure->getSubField(
"timeStamp")) timeStampRequested =
true;
175 if(fieldPVStructure->getSubField(
"display")) displayRequested =
true;
176 if(fieldPVStructure->getSubField(
"control")) controlRequested =
true;
177 if(fieldPVStructure->getSubField(
"valueAlarm")) valueAlarmRequested =
true;
183 alarmRequested =
false;
184 timeStampRequested =
false;
185 displayRequested =
false;
186 controlRequested =
false;
187 valueAlarmRequested =
false;
194 displayRequested =
false;
195 controlRequested =
false;
196 valueAlarmRequested =
false;
198 if(alarmRequested && timeStampRequested) {
199 properties +=
"alarm,timeStamp";
200 }
else if(timeStampRequested) {
201 properties +=
"timeStamp";
202 }
else if(alarmRequested) {
203 properties +=
"alarm";
206 structure = standardField->enumerated(properties);
214 std::string
value(pvValue->get());
215 if(
value.find(
"DBF_UCHAR")!=std::string::npos) {
221 }
else if(
value.find(
"DBF_USHORT")!=std::string::npos) {
227 }
else if(
value.find(
"DBF_ULONG")!=std::string::npos) {
233 }
else if(
value.find(
"DBF_INT64")!=std::string::npos) {
238 }
else if(
value.find(
"DBF_UINT64")!=std::string::npos) {
247 displayRequested =
false;
248 controlRequested =
false;
249 valueAlarmRequested =
false;
252 if(maxElements!=1) isArray =
true;
255 controlRequested =
false;
256 valueAlarmRequested =
false;
257 if(channelType==
DBR_CHAR && fieldPVStructure)
261 std::string
value(pvValue->get());
262 if(
value.find(
"pvString")!=std::string::npos) {
263 charArrayIsString =
true;
270 if(controlRequested || displayRequested || valueAlarmRequested) timeStampRequested =
false;
275 if(isArray && !charArrayIsString) {
276 fieldBuilder->addArray(
"value",st);
278 fieldBuilder->add(
"value",st);
281 if(alarmRequested) fieldBuilder->add(
"alarm",standardField->alarm());
282 if(timeStampRequested) fieldBuilder->add(
"timeStamp",standardField->timeStamp());
283 if(displayRequested) fieldBuilder->add(
"display",standardField->display());
284 if(controlRequested) fieldBuilder->add(
"control",standardField->control());
285 if(valueAlarmRequested) {
290 fieldBuilder->add(
"valueAlarm",standardField->byteAlarm());
break;
293 fieldBuilder->add(
"valueAlarm",standardField->shortAlarm());
break;
296 fieldBuilder->add(
"valueAlarm",standardField->intAlarm());
break;
298 fieldBuilder->add(
"valueAlarm",standardField->floatAlarm());
break;
302 fieldBuilder->add(
"valueAlarm",standardField->doubleAlarm());
break;
304 throw std::runtime_error(
"DbDToPv::activate: bad type");
307 structure = fieldBuilder->createStructure();
308 caRequestType = caValueType;
309 if(displayRequested || controlRequested || valueAlarmRequested)
312 }
else if(timeStampRequested || alarmRequested) {
322 if(caRequestType<0) {
323 throw std::runtime_error(
"DbDToPv::getRequestType: bad type");
325 return caRequestType;
328 Structure::const_shared_pointer DbdToPv::getStructure()
344 string message(
"DbdToPv::getChoicesDone ca_message ");
346 throw std::runtime_error(message);
349 size_t num = dbr_enum_p->
no_str;
350 choices.reserve(num);
351 for(
size_t i=0;
i<num; ++
i) choices.push_back(
string(&dbr_enum_p->
strs[
i][0]));
352 choicesEvent.signal();
360 caChannel->attachContext();
361 chid channelID = caChannel->getChannelID();
364 channelID, enumChoicesHandler,
this);
369 string mess(caChannel->getChannelName());
370 mess +=
" DbdToPv::activate getting enum cnoices ";
372 throw std::runtime_error(mess);
382 template<
typename dbrT,
typename pvT>
386 value->put(static_cast<const dbrT*>(dbr)[0]);
389 template<
typename dbrT,
typename pvT>
393 typename pvT::svector temp(value->reuse());
396 static_cast<const dbrT*>(dbr),
397 static_cast<const dbrT*>(dbr) + count,
399 value->replace(freeze(temp));
402 template<
typename dbrT>
403 void get_DBRControl(
const void * dbr,
double *upper_ctrl_limit,
double *lower_ctrl_limit)
405 *upper_ctrl_limit =
static_cast<const dbrT*
>(dbr)->upper_ctrl_limit;
406 *lower_ctrl_limit =
static_cast<const dbrT*
>(dbr)->lower_ctrl_limit;
409 template<
typename dbrT>
411 const void * dbr,
double *upper_disp_limit,
double *lower_disp_limit,
string *units)
413 *upper_disp_limit =
static_cast<const dbrT*
>(dbr)->upper_disp_limit;
414 *lower_disp_limit =
static_cast<const dbrT*
>(dbr)->lower_disp_limit;
415 *units =
static_cast<const dbrT*
>(dbr)->units;
418 template<
typename dbrT>
421 double *upper_alarm_limit,
double *upper_warning_limit,
422 double *lower_warning_limit,
double *lower_alarm_limit)
424 *upper_alarm_limit =
static_cast<const dbrT*
>(dbr)->upper_alarm_limit;
425 *upper_warning_limit =
static_cast<const dbrT*
>(dbr)->upper_warning_limit;
426 *lower_warning_limit =
static_cast<const dbrT*
>(dbr)->lower_warning_limit;
427 *lower_alarm_limit =
static_cast<const dbrT*
>(dbr)->lower_alarm_limit;
432 BitSet::shared_pointer
const & bitSet,
444 long count = args.
count;
446 switch(caValueType) {
453 std::copy(dbrval, dbrval + count, arr.begin());
454 pvValue->replace(freeze(arr));
458 if(charArrayIsString)
460 const char * pchar =
static_cast<const char *
>(value);
461 std::string
str(pchar);
468 copy_DBRScalarArray<dbr_char_t,PVUByteArray>(value,count,pvValue);
471 copy_DBRScalarArray<dbr_char_t,PVByteArray>(value,count,pvValue);
476 copy_DBRScalarArray<dbr_short_t,PVUShortArray>(value,count,pvValue);
479 copy_DBRScalarArray<dbr_short_t,PVShortArray>(value,count,pvValue);
484 copy_DBRScalarArray<dbr_long_t,PVUIntArray>(value,count,pvValue);
487 copy_DBRScalarArray<dbr_long_t,PVIntArray>(value,count,pvValue);
490 copy_DBRScalarArray<dbr_float_t,PVFloatArray>(value,count,pvValue);
495 copy_DBRScalarArray<dbr_double_t,PVLongArray>(value,count,pvValue);
500 copy_DBRScalarArray<dbr_double_t,PVULongArray>(value,count,pvValue);
503 copy_DBRScalarArray<dbr_double_t,PVDoubleArray>(value,count,pvValue);
512 switch(caValueType) {
516 PVIntPtr value = pvStructure->getSubField<
PVInt>(
"value.index");
520 if(pvChoices->getLength()==0)
523 size_t n = choices.size();
524 pvChoices->setLength(n);
525 convert->fromStringArray(pvChoices,0,n,choices,0);
526 bitSet->set(pvStructure->getSubField(
"value")->getFieldOffset());
528 bitSet->set(value->getFieldOffset());
532 case DBR_STRING: copy_DBRScalar<dbr_string_t,PVString>(value,pvValue);
break;
536 copy_DBRScalar<dbr_char_t,PVUByte>(value,pvValue);
539 copy_DBRScalar<dbr_char_t,PVByte>(value,pvValue);
break;
543 copy_DBRScalar<dbr_short_t,PVUShort>(value,pvValue);
546 copy_DBRScalar<dbr_short_t,PVShort>(value,pvValue);
break;
550 copy_DBRScalar<dbr_long_t,PVUInt>(value,pvValue);
553 copy_DBRScalar<dbr_long_t,PVInt>(value,pvValue);
break;
554 case DBR_FLOAT: copy_DBRScalar<dbr_float_t,PVFloat>(value,pvValue);
break;
558 copy_DBRScalar<dbr_double_t,PVLong>(value,pvValue);
563 copy_DBRScalar<dbr_double_t,PVULong>(value,pvValue);
566 copy_DBRScalar<dbr_double_t,PVDouble>(value,pvValue);
break;
574 bitSet->set(pvStructure->getSubField(
"value")->getFieldOffset());
582 bool statusChanged =
false;
583 bool severityChanged =
false;
585 PVIntPtr pvSeverity(pvAlarm->getSubField<
PVInt>(
"severity"));
586 if(caAlarm.severity!=severity) {
587 caAlarm.severity = severity;
588 pvSeverity->put(severity);
589 severityChanged =
true;
593 if(caAlarm.status!=status) {
595 pvStatus->put(convertDBstatus(status));
596 string message(
"UNKNOWN STATUS");
598 pvMessage->put(message);
599 statusChanged =
true;
601 if(statusChanged&&severityChanged) {
602 bitSet->set(pvAlarm->getFieldOffset());
603 }
else if(severityChanged) {
604 bitSet->set(pvSeverity->getFieldOffset());
605 }
else if(statusChanged) {
606 bitSet->set(pvStatus->getFieldOffset());
607 bitSet->set(pvMessage->getFieldOffset());
610 if(timeStampRequested) {
617 PVLongPtr pvSeconds(pvTimeStamp->getSubField<
PVLong>(
"secondsPastEpoch"));
619 bitSet->set(pvSeconds->getFieldOffset());
621 if(caTimeStamp.nsec!=stamp.
nsec) {
622 caTimeStamp.nsec = stamp.
nsec;
623 PVIntPtr pvNano(pvTimeStamp->getSubField<
PVInt>(
"nanoseconds"));
624 pvNano->put(stamp.
nsec);
625 bitSet->set(pvNano->getFieldOffset());
630 double upper_ctrl_limit = 0.0;
631 double lower_ctrl_limit = 0.0;
632 switch(caRequestType) {
634 get_DBRControl<dbr_ctrl_char>(args.
dbr,&upper_ctrl_limit,&lower_ctrl_limit);
break;
636 get_DBRControl<dbr_ctrl_short>(args.
dbr,&upper_ctrl_limit,&lower_ctrl_limit);
break;
638 get_DBRControl<dbr_ctrl_long>(args.
dbr,&upper_ctrl_limit,&lower_ctrl_limit);
break;
640 get_DBRControl<dbr_ctrl_float>(args.
dbr,&upper_ctrl_limit,&lower_ctrl_limit);
break;
642 get_DBRControl<dbr_ctrl_double>(args.
dbr,&upper_ctrl_limit,&lower_ctrl_limit);
break;
644 throw std::runtime_error(
"DbdToPv::getFromDBD logic error");
647 if(caControl.upper_ctrl_limit!=upper_ctrl_limit) {
648 caControl.upper_ctrl_limit = upper_ctrl_limit;
650 pv->
put(upper_ctrl_limit);
651 bitSet->set(pv->getFieldOffset());
653 if(caControl.lower_ctrl_limit!=lower_ctrl_limit) {
654 caControl.lower_ctrl_limit = lower_ctrl_limit;
656 pv->
put(lower_ctrl_limit);
657 bitSet->set(pv->getFieldOffset());
664 double upper_disp_limit = 0.0;
665 double lower_disp_limit = 0.0;
666 switch(caRequestType) {
668 get_DBRDisplay<dbr_ctrl_char>(args.
dbr,&upper_disp_limit,&lower_disp_limit,&units);
669 format =
"I4";
break;
671 get_DBRDisplay<dbr_ctrl_short>(args.
dbr,&upper_disp_limit,&lower_disp_limit,&units);
672 format =
"I6";
break;
674 get_DBRDisplay<dbr_ctrl_long>(args.
dbr,&upper_disp_limit,&lower_disp_limit,&units);
675 format =
"I12";
break;
677 get_DBRDisplay<dbr_ctrl_float>(args.
dbr,&upper_disp_limit,&lower_disp_limit,&units);
682 s <<
"F" << prec + 6 <<
"." <<
prec;
687 get_DBRDisplay<dbr_ctrl_double>(args.
dbr,&upper_disp_limit,&lower_disp_limit,&units);
692 s <<
"F" << prec + 6 <<
"." <<
prec;
697 throw std::runtime_error(
"DbdToPv::getFromDBD logic error");
700 if(caDisplay.lower_disp_limit!=lower_disp_limit) {
701 caDisplay.lower_disp_limit = lower_disp_limit;
703 pvDouble->
put(lower_disp_limit);
704 bitSet->set(pvDouble->getFieldOffset());
706 if(caDisplay.upper_disp_limit!=upper_disp_limit) {
707 caDisplay.upper_disp_limit = upper_disp_limit;
709 pvDouble->
put(upper_disp_limit);
710 bitSet->set(pvDouble->getFieldOffset());
712 if(caDisplay.units!=units) {
713 caDisplay.units = units;
715 pvString->
put(units);
716 bitSet->set(pvString->getFieldOffset());
718 if(caDisplay.format!=format) {
719 caDisplay.format = format;
722 pvString->
put(format);
723 bitSet->set(pvString->getFieldOffset());
727 if(valueAlarmRequested) {
728 double upper_alarm_limit = 0.0;
729 double upper_warning_limit = 0.0;
730 double lower_warning_limit = 0.0;
731 double lower_alarm_limit = 0.0;
732 switch(caRequestType) {
734 get_DBRValueAlarm<dbr_ctrl_char>(args.
dbr,
735 &upper_alarm_limit,&upper_warning_limit,
736 &lower_warning_limit,&lower_alarm_limit);
739 get_DBRValueAlarm<dbr_ctrl_short>(args.
dbr,
740 &upper_alarm_limit,&upper_warning_limit,
741 &lower_warning_limit,&lower_alarm_limit);
744 get_DBRValueAlarm<dbr_ctrl_long>(args.
dbr,
745 &upper_alarm_limit,&upper_warning_limit,
746 &lower_warning_limit,&lower_alarm_limit);
749 get_DBRValueAlarm<dbr_ctrl_float>(args.
dbr,
750 &upper_alarm_limit,&upper_warning_limit,
751 &lower_warning_limit,&lower_alarm_limit);
754 get_DBRValueAlarm<dbr_ctrl_double>(args.
dbr,
755 &upper_alarm_limit,&upper_warning_limit,
756 &lower_warning_limit,&lower_alarm_limit);
759 throw std::runtime_error(
"DbdToPv::getFromDBD logic error");
763 if(caValueAlarm.upper_alarm_limit!=upper_alarm_limit) {
764 caValueAlarm.upper_alarm_limit = upper_alarm_limit;
766 convert->fromDouble(pv,upper_alarm_limit);
767 bitSet->set(pv->getFieldOffset());
769 if(caValueAlarm.upper_warning_limit!=upper_warning_limit) {
770 caValueAlarm.upper_warning_limit = upper_warning_limit;
772 convert->fromDouble(pv,upper_warning_limit);
773 bitSet->set(pv->getFieldOffset());
775 if(caValueAlarm.lower_warning_limit!=lower_warning_limit) {
776 caValueAlarm.lower_warning_limit = lower_warning_limit;
778 convert->fromDouble(pv,lower_warning_limit);
779 bitSet->set(pv->getFieldOffset());
781 if(caValueAlarm.lower_alarm_limit!=lower_alarm_limit) {
782 caValueAlarm.lower_alarm_limit = lower_alarm_limit;
784 convert->fromDouble(pv,lower_alarm_limit);
785 bitSet->set(pv->getFieldOffset());
798 template<
typename dbrT,
typename pvT>
799 const void *
put_DBRScalar(dbrT *val,PVScalar::shared_pointer
const & pvScalar)
806 template<
typename dbrT,
typename pvT>
810 *count = value->getLength();
811 return value->view().data();
822 chid channelID = caChannel->getChannelID();
823 const void *pValue =
NULL;
824 unsigned long count = 1;
825 char *ca_stringBuffer(0);
833 switch(caValueType) {
839 if(count>maxElements) count = maxElements;
841 ca_stringBuffer =
new char[nbytes];
842 memset(ca_stringBuffer, 0, nbytes);
843 pValue = ca_stringBuffer;
845 char *pnext = ca_stringBuffer;
846 for(
size_t i=0;
i<count; ++
i) {
847 string value = stringArray[
i];
848 size_t len = value.length();
849 if (len >= MAX_STRING_SIZE) len = MAX_STRING_SIZE - 1;
850 memcpy(pnext, value.c_str(), len);
856 if(charArrayIsString)
859 const char * pchar = pvValue->get().c_str();
861 count = pvValue->get().length();
866 pValue = put_DBRScalarArray<dbr_char_t,PVUByteArray>(&count,pvValue);
869 pValue = put_DBRScalarArray<dbr_char_t,PVByteArray>(&count,pvValue);
874 pValue = put_DBRScalarArray<dbr_short_t,PVUShortArray>(&count,pvValue);
877 pValue = put_DBRScalarArray<dbr_short_t,PVShortArray>(&count,pvValue);
882 pValue = put_DBRScalarArray<dbr_long_t,PVUIntArray>(&count,pvValue);
885 pValue = put_DBRScalarArray<dbr_long_t,PVIntArray>(&count,pvValue);
888 pValue = put_DBRScalarArray<dbr_float_t,PVFloatArray>(&count,pvValue);
896 pvDoubleArray->putFrom(sv);
897 const double * pdouble = pvDoubleArray->view().data();
898 count = pvValue->getLength();
907 pvDoubleArray->putFrom(sv);
908 const double * pdouble = pvDoubleArray->view().data();
909 count = pvValue->getLength();
913 pValue = put_DBRScalarArray<dbr_double_t,PVDoubleArray>(&count,pvValue);
922 switch(caValueType) {
925 dbr_enum_t indexvalue = pvStructure->getSubField<
PVInt>(
"value.index")->
get();
926 pValue = &indexvalue;
929 case DBR_STRING: pValue = pvStructure->getSubField<
PVString>(
"value")->
get().c_str();
break;
933 pValue = put_DBRScalar<dbr_char_t,PVUByte>(&bvalue,pvValue);
936 pValue = put_DBRScalar<dbr_char_t,PVByte>(&bvalue,pvValue);
break;
940 pValue = put_DBRScalar<dbr_short_t,PVUShort>(&svalue,pvValue);
943 pValue = put_DBRScalar<dbr_short_t,PVShort>(&svalue,pvValue);
break;
947 pValue = put_DBRScalar<dbr_long_t,PVUInt>(&lvalue,pvValue);
950 pValue = put_DBRScalar<dbr_long_t,PVInt>(&lvalue,pvValue);
break;
951 case DBR_FLOAT: pValue = put_DBRScalar<dbr_float_t,PVFloat>(&fvalue,pvValue);
break;
955 pValue = put_DBRScalar<dbr_double_t,PVLong>(&dvalue,pvValue);
960 pValue = put_DBRScalar<dbr_double_t,PVULong>(&dvalue,pvValue);
963 pValue = put_DBRScalar<dbr_double_t,PVDouble>(&dvalue,pvValue);
break;
972 caChannel->attachContext();
976 result =
ca_array_put(caValueType,count,channelID,pValue);
983 if(ca_stringBuffer!=
NULL)
delete[] ca_stringBuffer;
const void * put_DBRScalarArray(unsigned long *count, PVScalarArray::shared_pointer const &pvArray)
void resize(size_t i)
Grow or shrink array.
LIBCA_API int epicsStdCall ca_array_get_callback(chtype type, unsigned long count, chid chanId, caEventCallBackFunc *pFunc, void *pArg)
PVScalar is the base class for each scalar field.
std::tr1::shared_ptr< PVInt > PVIntPtr
A holder for a contiguous piece of memory.
void get_DBRDisplay(const void *dbr, double *upper_disp_limit, double *lower_disp_limit, string *units)
LIBCA_API int epicsStdCall ca_array_put_callback(chtype type, unsigned long count, chid chanId, const void *pValue, caEventCallBackFunc *pFunc, void *pArg)
LIBCA_API unsigned long epicsStdCall ca_element_count(chid chan)
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
TODO only here because of the Lockable.
#define dbf_type_to_DBR(type)
std::tr1::shared_ptr< PVLong > PVLongPtr
LIBCA_API short epicsStdCall ca_field_type(chid chan)
std::tr1::shared_ptr< PVStringArray > PVStringArrayPtr
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
void copy(PVValueArray< T > &pvFrom, size_t fromOffset, size_t fromStride, PVValueArray< T > &pvTo, size_t toOffset, size_t toStride, size_t count)
Copy a subarray from one scalar array to another.
std::tr1::shared_ptr< CAChannel > CAChannelPtr
std::tr1::shared_ptr< StandardField > StandardFieldPtr
epicsUInt32 secPastEpoch
seconds since 0000 Jan 1, 1990
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
#define READ_ACCESS_ALARM
#define dbr_value_ptr(PDBR, DBR_TYPE)
PVString is special case, since it implements SerializableArray.
FORCE_INLINE const StandardFieldPtr & getStandardField()
void get_DBRValueAlarm(const void *dbr, double *upper_alarm_limit, double *upper_warning_limit, double *lower_warning_limit, double *lower_alarm_limit)
LIBCA_API int epicsStdCall ca_array_put(chtype type, unsigned long count, chid chanId, const void *pValue)
template class for all extensions of PVArray.
int epicsStdCall ca_flush_io()
#define NO_ALARM
The NO_ALARM value can be used as both a severity and a status.
Deprecated, use alarm.h instead.
DbdToPv converts between DBD data and pvData.
Base class for a scalarArray.
std::tr1::shared_ptr< PVScalar > PVScalarPtr
epicsFloat64 dbr_double_t
std::tr1::shared_ptr< PVULongArray > PVULongArrayPtr
epicsOldString dbr_string_t
Data interface for a structure,.
std::tr1::shared_ptr< PVLongArray > PVLongArrayPtr
static const PVDataCreatePtr & getPVDataCreate()
void( caCallbackFunc)(struct event_handler_args)
void put(typename storage_t::arg_type v)
std::tr1::shared_ptr< PVStructure > PVStructurePtr
std::tr1::shared_ptr< PVString > PVStringPtr
const char *epicsStdCall ca_message(long ca_status)
Class that holds the data for each possible scalar type.
EPICS time stamp, for use from C code.
std::tr1::shared_ptr< FieldCreate > FieldCreatePtr
std::tr1::shared_ptr< DbdToPv > DbdToPvPtr
std::tr1::shared_ptr< Convert > ConvertPtr
virtual size_t getLength() const OVERRIDE FINAL
epicsShareExtern const int64 posixEpochAtEpicsEpoch
const void * put_DBRScalar(dbrT *val, PVScalar::shared_pointer const &pvScalar)
std::tr1::shared_ptr< PVScalarArray > PVScalarArrayPtr
void copy_DBRScalar(const void *dbr, PVScalar::shared_pointer const &pvScalar)
LIBCOM_API const char * epicsAlarmConditionStrings[ALARM_NSTATUS]
How to convert an alarm condition/status into a string.
#define WRITE_ACCESS_ALARM
std::tr1::shared_ptr< PVDoubleArray > PVDoubleArrayPtr
static const FieldCreatePtr & getFieldCreate()
void get_DBRControl(const void *dbr, double *upper_ctrl_limit, double *lower_ctrl_limit)
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
std::tr1::shared_ptr< PVDouble > PVDoublePtr
void copy_DBRScalarArray(const void *dbr, unsigned count, PVScalarArray::shared_pointer const &pvArray)
#define dbf_type_to_DBR_CTRL(type)
void getChoicesDone(struct event_handler_args &args)
epicsUInt32 nsec
nanoseconds within second
char strs[MAX_ENUM_STATES][MAX_ENUM_STRING_SIZE]
#define dbf_type_to_DBR_TIME(type)