V4 Design: dbdClass

From EPICSWIKI
Revision as of 12:34, 12 May 2005 by MartyKraimer (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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;
};