This is Unofficial EPICS BASE Doxygen Site
ScalarBuilder Struct Reference

#include "pvif.h"

+ Inheritance diagram for ScalarBuilder:
+ Collaboration diagram for ScalarBuilder:

Public Member Functions

virtual ~ScalarBuilder ()
 
virtual epics::pvData::FieldConstPtr dtype (dbChannel *channel) OVERRIDE FINAL
 
virtual PVIFattach (dbChannel *channel, const epics::pvData::PVStructurePtr &root, const FieldName &fld) OVERRIDE FINAL
 
- Public Member Functions inherited from PVIFBuilder
virtual ~PVIFBuilder ()
 
virtual epics::pvData::FieldBuilderPtr dtype (epics::pvData::FieldBuilderPtr &builder, const std::string &fld, dbChannel *channel)
 

Additional Inherited Members

- Static Public Member Functions inherited from PVIFBuilder
static PVIFBuildercreate (const std::string &name)
 
- Protected Member Functions inherited from PVIFBuilder
 PVIFBuilder ()
 

Detailed Description

Definition at line 405 of file pvif.h.

Constructor & Destructor Documentation

virtual ScalarBuilder::~ScalarBuilder ( )
inlinevirtual

Definition at line 407 of file pvif.h.

407 {}

Member Function Documentation

PVIF * ScalarBuilder::attach ( dbChannel *  channel,
const epics::pvData::PVStructurePtr root,
const FieldName fld 
)
virtual

Implements PVIFBuilder.

Definition at line 822 of file pvif.cpp.

823 {
824  if(!channel)
825  throw std::runtime_error("+type:\"scalar\" requires +channel:");
826  pvd::PVField *enclosing = 0;
827  pvd::PVFieldPtr fld(fldname.lookup(root, &enclosing));
828 
829  const short dbr = dbChannelFinalFieldType(channel);
830  const long maxelem = dbChannelFinalElements(channel);
831 
832  if(maxelem==1) {
833  switch(dbr) {
834  case DBR_CHAR:
835  case DBR_UCHAR:
836  case DBR_SHORT:
837  case DBR_USHORT:
838  case DBR_LONG:
839  case DBR_ULONG:
840 #ifdef USE_INT64
841  case DBR_INT64:
842  case DBR_UINT64:
843 #endif
844  return new PVIFScalarNumeric<pvScalar, metaDOUBLE>(channel, fld, enclosing);
845  case DBR_FLOAT:
846  case DBR_DOUBLE:
847  return new PVIFScalarNumeric<pvScalar, metaDOUBLE>(channel, fld, enclosing);
848  case DBR_ENUM:
849  return new PVIFScalarNumeric<pvScalar, metaENUM>(channel, fld, enclosing);
850  case DBR_STRING:
851  return new PVIFScalarNumeric<pvScalar, metaSTRING>(channel, fld, enclosing);
852  }
853  } else {
854  switch(dbr) {
855  case DBR_CHAR:
856  case DBR_UCHAR:
857  case DBR_SHORT:
858  case DBR_ENUM:
859  case DBR_USHORT:
860  case DBR_LONG:
861  case DBR_ULONG:
862  case DBR_STRING:
863  case DBR_FLOAT:
864 #ifdef USE_INT64
865  case DBR_INT64:
866  case DBR_UINT64:
867 #endif
868  case DBR_DOUBLE:
869  return new PVIFScalarNumeric<pvArray, metaDOUBLE>(channel, fld, enclosing);
870  }
871  }
872 
873  throw std::invalid_argument("Channel has invalid/unsupported DBR type");
874 }
#define DBR_CHAR
Definition: db_access.h:74
#define DBR_STRING
Definition: db_access.h:69
const void * dbr
Definition: cadef.h:89
#define DBR_USHORT
Definition: dbFldTypes.h:80
#define DBR_FLOAT
Definition: db_access.h:72
#define DBR_INT64
Definition: dbFldTypes.h:83
PVField is the base class for each PVData field.
Definition: pvData.h:152
#define DBR_UINT64
Definition: dbFldTypes.h:84
#define DBR_UCHAR
Definition: dbFldTypes.h:78
#define DBR_DOUBLE
Definition: db_access.h:76
#define DBR_SHORT
Definition: db_access.h:71
#define DBR_ENUM
Definition: db_access.h:73
#define DBR_LONG
Definition: db_access.h:75
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
#define DBR_ULONG
Definition: dbFldTypes.h:82
epics::pvData::FieldConstPtr ScalarBuilder::dtype ( dbChannel *  channel)
virtual

Implements PVIFBuilder.

Definition at line 767 of file pvif.cpp.

768 {
769  short dbr = dbChannelFinalFieldType(channel);
770  const long maxelem = dbChannelFinalElements(channel);
771  const pvd::ScalarType pvt = DBR2PVD(dbr);
772 
773  if(INVALID_DB_REQ(dbr))
774  throw std::invalid_argument("DBF code out of range");
775 
776  if(maxelem!=1 && dbr==DBR_ENUM)
777  dbr = DBF_SHORT;
778 
779  pvd::FieldBuilderPtr builder(pvd::getFieldCreate()->createFieldBuilder());
781 
782  if(dbr==DBR_ENUM)
783  builder = builder->setId("epics:nt/NTEnum:1.0")
784  ->addNestedStructure("value")
785  ->setId("enum_t")
786  ->add("index", pvd::pvInt)
787  ->addArray("choices", pvd::pvString)
788  ->endNested();
789  else if(maxelem==1)
790  builder = builder->setId("epics:nt/NTScalar:1.0")
791  ->add("value", pvt);
792  else
793  builder = builder->setId("epics:nt/NTScalarArray:1.0")
794  ->addArray("value", pvt);
795 
796  builder = builder->add("alarm", standard->alarm())
797  ->add("timeStamp", standard->timeStamp());
798 
799  if(dbr!=DBR_ENUM) {
800  builder = builder->addNestedStructure("display")
801  ->add("limitLow", pvd::pvDouble)
802  ->add("limitHigh", pvd::pvDouble)
803  ->add("description", pvd::pvString)
804  ->add("units", pvd::pvString)
805  ->add("precision", pvd::pvInt)
806  ->addNestedStructure("form")
807  ->setId("enum_t")
808  ->add("index", pvd::pvInt)
809  ->addArray("choices", pvd::pvString)
810  ->endNested()
811  ->endNested()
812  ->add("control", standard->control());
813 
814  if(dbr!=DBR_STRING)
815  builder = builder->add("valueAlarm", standard->doubleAlarm());
816  }
817 
818  return builder->createStructure();
819 }
#define DBR_STRING
Definition: db_access.h:69
const void * dbr
Definition: cadef.h:89
#define INVALID_DB_REQ(x)
Definition: db_access.h:115
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
std::tr1::shared_ptr< StandardField > StandardFieldPtr
Definition: standardField.h:22
FORCE_INLINE const StandardFieldPtr & getStandardField()
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
#define DBR_ENUM
Definition: db_access.h:73

The documentation for this struct was generated from the following files: