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"));
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());
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");
650 pv->
put(upper_ctrl_limit);
651 bitSet->set(pv->getFieldOffset());
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");
703 pvDouble->
put(lower_disp_limit);
704 bitSet->set(pvDouble->getFieldOffset());
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");
766 convert->fromDouble(pv,upper_alarm_limit);
767 bitSet->set(pv->getFieldOffset());
772 convert->fromDouble(pv,upper_warning_limit);
773 bitSet->set(pv->getFieldOffset());
778 convert->fromDouble(pv,lower_warning_limit);
779 bitSet->set(pv->getFieldOffset());
784 convert->fromDouble(pv,lower_alarm_limit);
785 bitSet->set(pv->getFieldOffset());
void resize(size_t i)
Grow or shrink array.
PVScalar is the base class for each scalar field.
std::tr1::shared_ptr< PVInt > PVIntPtr
A holder for a contiguous piece of memory.
std::tr1::shared_ptr< PVLong > PVLongPtr
std::tr1::shared_ptr< PVStringArray > PVStringArrayPtr
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.
epicsUInt32 secPastEpoch
seconds since 0000 Jan 1, 1990
double upper_warning_limit
double lower_warning_limit
#define dbr_value_ptr(PDBR, DBR_TYPE)
PVString is special case, since it implements SerializableArray.
template class for all extensions of PVArray.
Base class for a scalarArray.
std::tr1::shared_ptr< PVScalar > PVScalarPtr
epicsOldString dbr_string_t
Data interface for a structure,.
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< Convert > ConvertPtr
epicsShareExtern const int64 posixEpochAtEpicsEpoch
std::tr1::shared_ptr< PVScalarArray > PVScalarArrayPtr
LIBCOM_API const char * epicsAlarmConditionStrings[ALARM_NSTATUS]
How to convert an alarm condition/status into a string.
std::tr1::shared_ptr< PVDouble > PVDoublePtr
epicsUInt32 nsec
nanoseconds within second