Difference between revisions of "V4 dbrClass classes for Database Definition"

From EPICSWIKI
 
(Still under construction)
Line 29: Line 29:
=== Database Definition Files ===
=== Database Definition Files ===


* <tt>menuAlarmSevr.dbd</tt> contains:
<tt>menuAlarmSevr.dbd</tt> contains:
     menu(menuAlarmSevr) {  
     menu(menuAlarmSevr) {  
           choice("NO_ALARM")  
           choice("NO_ALARM")  
Line 37: Line 37:
     }
     }


* <tt>displayLimit.dbd</tt> contains:
<tt>displayLimit.dbd</tt> contains:
     struct(displayLimit) {
     struct(displayLimit) {
         field(low,float64)
         field(low,float64)
         field(high,float64)
         field(high,float64)
     }
     }
* <tt>exampleRecord.dbd</tt> contains:  
<tt>exampleRecord.dbd</tt> contains:  
     record(example) extends iocRecord {
     record(example) extends iocRecord {
         field(value,float64)
         field(value,float64)
         field(displayLimit,struct(displayLimit))
         field(displayLimit,struct(displayLimit))
     }
     }
* <tt>alltypesRecord.dbd</tt> contains:  
<tt>alltypesRecord.dbd</tt> contains:  
     record(allTypes) extends iocRecord {
     record(allTypes) extends iocRecord {
         field(fbool,bool)
         field(fbool,bool)
Line 69: Line 69:
<tt>menuAlarmSevr.h</tt> is generated from <tt>menuAlarmSevr.dbd</tt>  
<tt>menuAlarmSevr.h</tt> is generated from <tt>menuAlarmSevr.dbd</tt>  
     enum menuAlarmSevr {
     enum menuAlarmSevr {
             menuAlarmSevr,
             menuAlarmSevrNO_ALARM,
             menuAlarmSevr,
             menuAlarmSevrMINOR,
             menuAlarmSevr,
             menuAlarmSevrMAJOR,
             menuAlarmSevr
             menuAlarmSevrINVALID
     };
     };
<tt>displayLimit.h</tt> is generated from <tt>displayLimit.dbd</tt>  
<tt>displayLimit.h</tt> is generated from <tt>displayLimit.dbd</tt>  
Line 151: Line 151:
     dbdInt16T,dbdUInt16T,dbdInt32T,dbdUInt32T,dbdInt64T,dbdUInt64T,
     dbdInt16T,dbdUInt16T,dbdInt32T,dbdUInt32T,dbdInt64T,dbdUInt64T,
     dbdFloat32T,dbdFloat64T,
     dbdFloat32T,dbdFloat64T,
     dbdStringT,dbdMenuT,dbdEnumT,dbdLinkT,dbdDeviceT,dbdArrayT
     dbdStringT,
    dbdStructT,
    dbdMenuT,dbdEnumT,
    dbdLinkT,dbdDeviceT,
    dbdArrayT
  };
  };


Line 168: Line 172:
  class dbdRecord;
  class dbdRecord;


  /* dbdStructPtr always references a class that contains only data*/
  // dbdStructPtr always references a class generated from a struct dbd
  typedef void * dbdStructPtr;
  typedef void * dbdStructPtr;


  /* dbdInterfacePtr always references a class that contains only methods*/
  // dbdInterfacePtr always references a class that contains only methods
  typedef void *dbdInterfacePtr;
  typedef void *dbdInterfacePtr;


  class dbdInterface {
  class dbdInterface {
public:
     const char      *interfaceType;
     const char      *interfaceType;
     dbdInterfacePtr *pinterface;
     dbdInterfacePtr *pinterface;
Line 198: Line 203:
  };
  };


  class dbdStructField{
  class dbdStruct{ // for a field referencing a struct
     dbdStructDef *pdbdStructDef;
     dbdStructDef *pdbdStructDef;
     dbdStructPtr ptr;
     dbdStructPtr ptr;
Line 210: Line 215:
  };
  };


  class dbdMenuField{
  class dbdMenu{ // for a struct or record field
  public:
  public:
     dbdInt16    index;
     dbdInt16    index;
Line 216: Line 221:
  };
  };


  class dbdEnumField{
  class dbdEnum{
  public:
  public:
     dbdInt16  index;
     dbdInt16  index;
     dbdInt16  nchoices;
     dbdInt16  nchoices;
     dbdString *pchoice[];
     dbdString *pchoice[];
};
class dbdInterfaceDef {
public:
    dbdString interfaceName;
    dbdString choiceName;
    dbdString dataStructName;
    dbdInterface *pdbdInterface;
  };
  };


Line 230: Line 243:
     dbdLinkDirInOut
     dbdLinkDirInOut
  };
  };
enum dbdLinkType {
    dbdLinkTypeconstant,
    dbdLinkTypepvlink,
    dbdLinkTypecalink,
    dbdLinkTypedblink
};
  class dbdLinkDef{
  class dbdLinkDef{
  public:
  public:
    dbdString    choice;
     dbdLinkDir    dir;
     dbdLinkDir    dir;
     dbdString    configName;
     dbdString    choiceName;
    dbdString    interfaceName;
     dbdInterface *pdbdInterface;
     dbdInterface *pdbdInterface;
    dbdString    dataStructName;
  };
  };
  class dbdLinkField{
  class dbdLink{ // for a struct or record field
  public:
  public:
     dbdLinkType type;
     dbdLinkDir  dir;
     dbdLinkDef  linkDef;
     dbdString  choiceName;
     dbdString  pvname;
     dbdLinkDef  *plinkDef;
     dbdStruct  config;
     dbdStruct  dataStruct;
  };
  };


  class dbdDeviceDef {
  class dbdDeviceDef {
  public:
  public:
     dbdString   choice;
    dbdLinkDir  dir;
     dbdLinkDir  dir;
     dbdString interfaceName;
     dbdString   configName;
     dbdString choiceName;
     dbdInterface interface;
     dbdString dataStructName;
     dbdInterface *pdbdInterface;
  };
  };
  class dbdDeviceField {
 
  class dbdDevice{ // for a struct or record field
  public:
  public:
     dbdDeviceDef device;
    dbdLinkDir  dir;
     dbdStruct    config;
    dbdString    choiceName;
     dbdDeviceDef *pdeviceDef;
     dbdStruct    dataStruct;
  };
  };



Revision as of 20:26, 11 May 2005

EPICS: C++ class definitions for Database Definition

May 11 2005

UNDER CONSTRUCTION - DO NOT COMMENT

Overview

This document describes the C++ class definitions for code that implements the semantics for records created from Database Definitions. The classes can be separated into two classes:

  • dbdTypes.h - Classes that described fields in header files generated from dbd definitions. Header files are generated from the following dbd definitions:
    • record
    • struct
    • menu
  • dbdIntrospect.h - Classes intended for introspection, i.e. for code that does not include the generated header files.



Example Database Definition Files

Database Definition Files

menuAlarmSevr.dbd contains:

    menu(menuAlarmSevr) { 
         choice("NO_ALARM") 
         choice("MINOR")
         choice("MAJOR")
         choice("INVALID")
    }

displayLimit.dbd contains:

    struct(displayLimit) {
        field(low,float64)
        field(high,float64)
    }

exampleRecord.dbd contains:

    record(example) extends iocRecord {
        field(value,float64)
        field(displayLimit,struct(displayLimit))
    }

alltypesRecord.dbd contains:

    record(allTypes) extends iocRecord {
        field(fbool,bool)
        field(foctet,octet)
        field(fint16,int16)
        field(fuint16,uint16)
        field(fint32,int32)
        field(fuint32,uint32)
        field(fint64,int64)
        field(fuint64,uint64)
        field(ffloat32,float32)
        field(ffloat64,float64)
        field(fstring,string)
        field(fmenu,menu(menuName))
        field(fenum,enum)
        field(fstruct,struct(displayLimit))
        field(flink,link(dir))
        field(fdevice,device(dir,interfaceName))
    }

Generated Header Files

menuAlarmSevr.h is generated from menuAlarmSevr.dbd

    enum menuAlarmSevr {
           menuAlarmSevrNO_ALARM,
           menuAlarmSevrMINOR,
           menuAlarmSevrMAJOR,
           menuAlarmSevrINVALID
    };

displayLimit.h is generated from displayLimit.dbd

    class displayLimit {
        dbdFloat64 low;
        dbdFloat64 high;
    };
    const dbdInt16 displayLimit_firstIndex = 1
    const dbdInt16 displayLimit_low        = 1
    const dbdInt16 displayLimit_high       = 2
    const dbdInt16 displayLimit_lastIndex =displayLimit_high

exampleRecord.h is generated from exampleRecord.dbd

    class exampleRecord {
    public:
        ...    All the fields from iocRecord.dbd
        dbdFloat64 value;
        dbdStruct  displayLimit;
    };
   
    const dbdInt16 example_firstIndex = 1001001
    const dbdInt16 example_low = 1001001;
    const dbdInt16 example_high = 1001002;
    const dbdInt16 example_lastIndex = example_high;

alltypesRecord.h is generated from alltypesRecord.dbd

    class allTypesRecord {
    public:
        ...    All the fields from iocRecord.dbd
        dbdRecord  common;
        dbdBoolean fbool;
        dbdOctet   foctet;
        dbdInt16   fint16;
        dbdUInt16  fuint16;
        dbdInt32   fint32;
        dbdUInt32  fuint32;
        dbdInt64   fint32;
        dbdUInt64  fuint32;
        dbdFloat32 ffloat32;
        dbdFloat64 ffloat64;
        dbdString  fstring;
        dbdMenu    fmenu;
        dbdEnum    fenum
        dbdStruct  fstruct;
        dbdLink    flink;
        dbdDevice  fdevice;
    };
   
    const dbdInt16 allTypes_firstIndex = 1001001
    const dbdInt16 allTypes_fbool = 1001001;
    const dbdInt16 allTypes_foctet = 1001002;
    const dbdInt16 allTypes_fint16 = 1001003;
    const dbdInt16 allTypes_fuint16 = 1001004;
    const dbdInt16 allTypes_fint32 = 1001005;
    const dbdInt16 allTypes_fuint32 = 1001006;
    const dbdInt16 allTypes_fint64 = 1001007;
    const dbdInt16 allTypes_fuint64 = 1001008;
    const dbdInt16 allTypes_ffloat32 = 1001009;
    const dbdInt16 allTypes_ffloatn64 = 10010010;
    const dbdInt16 allTypes_ffstring = 10010011;
    const dbdInt16 allTypes_fmenu = 10010012;
    const dbdInt16 allTypes_fenum = 10010013;
    const dbdInt16 allTypes_fstruct = 10010014;
    const dbdInt16 allTypes_flink = 10010015
    const dbdInt16 allTypes_fdevice = 10010016
    const dbdInt16 allTypes_lastIndex = allTypes_fdevice;

dbdTypes.h

File dbdTypes.h describes the datatypes used by V4 databases:

/* TBD dbdNdimArrayT*/
enum dbdType {
    dbdUnknownT,dbdBooleanT,dbdOctetT,
    dbdInt16T,dbdUInt16T,dbdInt32T,dbdUInt32T,dbdInt64T,dbdUInt64T,
    dbdFloat32T,dbdFloat64T,
    dbdStringT,
    dbdStructT,
    dbdMenuT,dbdEnumT,
    dbdLinkT,dbdDeviceT,
    dbdArrayT
};
/* some of the following may require OSD definitions*/
typedef bool               dbdBoolean;
typedef char               dbdOctet;
typedef short              dbdInt16;
typedef unsigned short     dbdUInt16;
typedef int                dbdInt32;
typedef unsigned int       dbdUInt32;
typedef long long          dbdInt64;
typedef unsigned long long dbdUInt64;
typedef float              dbdFloat32;
typedef double             dbdFloat64;
class dbdRecord;
// dbdStructPtr always references a class generated from a struct dbd
typedef void * dbdStructPtr;
// dbdInterfacePtr always references a class that contains only methods
typedef void *dbdInterfacePtr;
class dbdInterface {
public:
    const char      *interfaceType;
    dbdInterfacePtr *pinterface;
};
/*dbdString holds UTF-8 characters*/
class dbdString {
public:
    dbdInt32  capacity;  /*capacity in bytes*/
    dbdOctet  *pstorage;
};
class dbdStructMember {
    dbdString name;
    dbdType   type;
};
class dbdStructDef{
    dbdString       name;
    dbdInt16        nmembers;
    dbdStructMember *pmember[];
    dbdInterface    interface;
};
class dbdStruct{ // for a field referencing a struct
    dbdStructDef *pdbdStructDef;
    dbdStructPtr ptr;
};
class dbdMenuDef{
public:
    dbdString name;
    dbdInt16  nchoices;
    dbdString *pchoice[];
};
class dbdMenu{ // for a struct or record field
public:
    dbdInt16    index;
    dbdMenuDef  *pdbdMenuDef[];
};
class dbdEnum{
public:
    dbdInt16  index;
    dbdInt16  nchoices;
    dbdString *pchoice[];
};
class dbdInterfaceDef {
public:
    dbdString interfaceName;
    dbdString choiceName;
    dbdString dataStructName;
    dbdInterface *pdbdInterface;
};
enum dbdLinkDir {
    dbdLinkDirNone,
    dbdLinkDirForward,
    dbdLinkDirIn,
    dbdLinkDirOut,
    dbdLinkDirInOut
};
class dbdLinkDef{
public:
    dbdLinkDir    dir;
    dbdString     choiceName;
    dbdInterface *pdbdInterface;
    dbdString     dataStructName;
};
class dbdLink{ // for a struct or record field
public:
    dbdLinkDir  dir;
    dbdString   choiceName;
    dbdLinkDef  *plinkDef;
    dbdStruct   dataStruct;
};
class dbdDeviceDef {
public:
    dbdLinkDir  dir;
    dbdString interfaceName;
    dbdString choiceName;
    dbdString dataStructName;
    dbdInterface *pdbdInterface;
};
class dbdDevice{ // for a struct or record field
public:
    dbdLinkDir   dir;
    dbdString    choiceName;
    dbdDeviceDef *pdeviceDef;
    dbdStruct    dataStruct;
};
template< class ARR_T > class dbdArray {
public:
    dbdInt32  capacity;  /*capacity in number of elements*/
    dbdInt32  size;      /*current number of elements*/
    dbdType   type;
    ARR_T     *pstorage;
};
/*  The following array types are supported by dbdCore
 *  dbdArray<void>;
 *  dbdArray<dbdOctet>;
 *  dbdArray<dbdInt16>;
 *  dbdArray<dbdUInt16>;
 *  dbdArray<dbdInt32>;
 *  dbdArray<dbdUInt32>;
 *  dbdArray<dbdInt64>;
 *  dbdArray<dbdUInt64>;
 *  dbdArray<dbdFloat32>;
 *  dbdArray<dbdFloat64>;
 *  dbdArray<dbdString>;
 *  dbdArray<dbdLinkField>;
**/
/* every struct and every record support module implements the following*/
class dbdStructMetaSupport {
    virtual dbdStructPtr create() = 0;
    virtual dbdBoolean initialize(dbdString *errorMessage, dbdStructPtr ptr) = 0;
    virtual dbdBoolean finalize(dbdString *errorMessage, dbdStructPtr ptr) = 0;
    virtual void destroy(dbdStructPtr ptr) = 0;
    virtual void *indexToAddr(dbdString *errorMessage,
            dbdStructPtr ptr, dbdInt16 index) = 0;
    // ???? is anything else needed
};
/* record support implements the following*/
class dbdRecordSupport {
    virtual void special(dbdRecord *pdbdRecord,
            dbdBoolean  after,
            dbdInt16 nlevels, // number of elements in fieldIndex
            dbdInt16 fieldIndex[] // array of field indices
            ) = 0;
};